1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ゼロから作るDeep LearningをJuliaで実装してみる (5)MNIST手書き数字認識 その①画像表示

Last updated at Posted at 2021-11-10

:red_car: この記事の目的

本記事は、Deep Learningの入門書「ゼロから作るDeep Learning」を参考に、Juliaを用いて同書の内容を実装してみる、という試みです。

※これはあくまで筆者の一つの試みと提案で、必ずしも内容が正解ではありませんのでご了承お願い致します。
また、より良いアドバイスや協力のご提案などありましたら、お気軽にお声がけ頂けますと幸いです。

:red_car: 今回取り組むこと

本記事は、参考書の3.6.1章にあたります。
MNIST手書き数字認識は、今回その①画像表示と次回その②推論の2回に分けて実行します。

今回はMNIST画像データセットから画像データを読み出し、実際に画像としてデータをプロット、その画像から数字が認識できることを確認してみたいと思います。

:red_car: MNIST手書き数字画像データの入手

拙著ながら、本記事筆者によるMNIST手書き数字画像データをJuliaで簡単に取得するモジュールを公開しています。

:paperclip: Julia言語によるMNISTデータ取得 load_mnist.jl
http://load-mnist-jl.org
スクリーンショット 2021-11-10 10.14.01.png
上記のモジュール「load_mmist.jl」をインクルードし、load_mnist()関数を呼び出すことで、MNIST手書き数字画像データをJulia上でMatrix型配列で取得することができます。
詳細については、上記サイトの説明を読んで頂ければと思います。

具体的には、load_mnist()関数を以下のように実行することで、60,000件の訓練データ(x_train)、60,000件の訓練データ正解ラベル(t_train)、10,000件のテストデータ(x_test)、10,000件のテストデータ正解ラベル(t_test)が得られます。

5_load_mnist_1
# load_mnist.jlをインクルード
include("load_mnist.jl")

# load_mnist()関数を実行
x_train, t_train, x_test, t_test = load_mnist(normalize=true, flatten=true, one_hot_label=false)

以下、上記の実行結果です。
スクリーンショット 2021-11-10 11.02.28.png

:red_car: 手書き数字画像データを表示する

では、取得した手書き数字画像データを表示してみます。
例として、取得した訓練データ(x_train)の最初(一番目)のデータを画像として表示してみます。

画像データの配列の内容を確認する

取得した訓練データは配列の形になっています。
x_trainの実態はMatrix型で、行数60,000、列数784の二次元配列です。
一行が画像一つのデータで、画像データが60,000個分つまり60,000行分あることになります。

最初の一行目のデータの内容を確認してみます。
スクリーンショット 2021-11-10 14.23.48.png
横方向(列方向)に小数値の要素が784個並んでいます。
この784個のデータは手書き数字画像(28ピクセルx28ピクセル)一つ分のデータに相当します。

数値の並びの意味はこちらのサイトで説明していますので、ご参照頂ければ幸いです。

:paperclip: MNISTデータファイルの内容を理解する~機械学習エンジニアなら知っておいて欲しいこと
https://qiita.com/ttabata/items/fecf02a5e1af4e1d9b69

画像データを表示する

上記で確認した784個の要素を持つ画像データを実際に画像に変換して表示してみます。
ここでは、JuliaImagesのGrayメソッドを使用し、グレースケール値の配列から白黒マス画像を生成する機能を使用して、画像の内容を見てみます。

ソースコードは以下になります。

5_load_mnist_1
# 初期設定
import Pkg;
Pkg.add("Colors")                                     # S01
using Colors
using LinearAlgebra                                   # S02
include("load_mnist.jl")                              # S03

# 画像を描写する関数
function img_show(img)

    img_reshaped = transpose(reshape(img, 28, 28))    # S04 
    # Gray関数で画像を描画
    draw_img = Gray.(img_reshaped)                    # S05
    
end

# MNIST画像データの取得
x_train, t_train, x_test, t_test = load_mnist(normalize=true, flatten=true, one_hot_label=false)

# 画像の一枚目の情報を取得
img = x_train[1, :]
# 一枚目の正解データの数字を取得
println("正解データの数字", t_train[1])                 # S06

# 画像描写を実行
img_show(img)

以下、ソースの解説です。

[S01]
 Grayメソッドを使用する際に必要なColorsパッケージをインストールします。
[S02]
 LinearAlgebraパッケージを使用する宣言をします。
 このパッケージはtranspose()関数を使用するためのものです。
[S03]
 MNISTデータを取得するためにload_mnist.jlをインクルードします。
[S04]
 imgデータを縦28x横28個の二次元配列に変換した後、transpose()関数で行と列を入れ替えます。入れ替える理由は、column-wise型とrow-wise型の変換です。
 imgデータは画像一つ分の784個のグレースケール値が一次元ベクトル状に並べられた配列です。
[S05]
 Grayメソッドを使用してグレースケール値を元にプロットを行います。
 与える引数は2次元配列となります。
[S06]
 正解ラベルデータの一つ目を表示しています。

動作の結果、以下のような画像が得られました。
002.png
今回はJuliaを使ってMNIST手書き数字画像データを取り扱う方法を学びました。
次は、MNIST手書き数字認識その②推論を行ってみたいと思います。

:red_car: もくじ

(1)論理回路
(2)活性化関数
(3)3層ニューラルネットワークの実装
(4)ソフトマックス関数
(5)MNIST手書き数字認識 その①画像表示
(5)MNIST手書き数字認識 その②推論

:red_car: 関連情報

:paperclip: Julia早引きノート[01]変数・定数の使い方
https://qiita.com/ttabata/items/a1ada2c0cba03672e105

:paperclip: Julia - 公式ページ
https://julialang.org/

:paperclip: Julia - 日本語公式ドキュメント
https://julia-doc-ja.readthedocs.io/ja/latest/index.html

:paperclip: 初めてのJuliaとインストール (Windows & Linux)
https://qiita.com/ttlabo/items/b05bb43d06239f968035

:red_car: 出典

■参考書
「ゼロから作るDeep Learning ~ Pythonで学ぶディープラーニングの理論と実装」
 斎藤康毅 著/オライリー・ジャパン
image.png

:red_car: ご意見など

ご意見、間違い訂正などございましたらお寄せ下さい。

1
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?