この記事の目的
本記事は、Deep Learningの入門書「ゼロから作るDeep Learning」を参考に、Juliaを用いて同書の内容を実装してみる、という試みです。
※これはあくまで筆者の一つの試みと提案で、必ずしも内容が正解ではありませんのでご了承お願い致します。
また、より良いアドバイスや協力のご提案などありましたら、お気軽にお声がけ頂けますと幸いです。
今回取り組むこと
本記事は、参考書の3.6.1章にあたります。
MNIST手書き数字認識は、今回その①画像表示と次回その②推論の2回に分けて実行します。
今回はMNIST画像データセットから画像データを読み出し、実際に画像としてデータをプロット、その画像から数字が認識できることを確認してみたいと思います。
MNIST手書き数字画像データの入手
拙著ながら、本記事筆者によるMNIST手書き数字画像データをJuliaで簡単に取得するモジュールを公開しています。
Julia言語によるMNISTデータ取得 load_mnist.jl
http://load-mnist-jl.org
上記のモジュール「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)が得られます。
# 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)
手書き数字画像データを表示する
では、取得した手書き数字画像データを表示してみます。
例として、取得した訓練データ(x_train)の最初(一番目)のデータを画像として表示してみます。
画像データの配列の内容を確認する
取得した訓練データは配列の形になっています。
x_trainの実態はMatrix型で、行数60,000、列数784の二次元配列です。
一行が画像一つのデータで、画像データが60,000個分つまり60,000行分あることになります。
最初の一行目のデータの内容を確認してみます。
横方向(列方向)に小数値の要素が784個並んでいます。
この784個のデータは手書き数字画像(28ピクセルx28ピクセル)一つ分のデータに相当します。
数値の並びの意味はこちらのサイトで説明していますので、ご参照頂ければ幸いです。
MNISTデータファイルの内容を理解する~機械学習エンジニアなら知っておいて欲しいこと
https://qiita.com/ttabata/items/fecf02a5e1af4e1d9b69
画像データを表示する
上記で確認した784個の要素を持つ画像データを実際に画像に変換して表示してみます。
ここでは、JuliaImagesのGrayメソッドを使用し、グレースケール値の配列から白黒マス画像を生成する機能を使用して、画像の内容を見てみます。
ソースコードは以下になります。
# 初期設定
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]
正解ラベルデータの一つ目を表示しています。
動作の結果、以下のような画像が得られました。
今回はJuliaを使ってMNIST手書き数字画像データを取り扱う方法を学びました。
次は、MNIST手書き数字認識その②推論を行ってみたいと思います。
もくじ
(1)論理回路
(2)活性化関数
(3)3層ニューラルネットワークの実装
(4)ソフトマックス関数
(5)MNIST手書き数字認識 その①画像表示
(5)MNIST手書き数字認識 その②推論
関連情報
Julia早引きノート[01]変数・定数の使い方
https://qiita.com/ttabata/items/a1ada2c0cba03672e105
Julia - 公式ページ
https://julialang.org/
Julia - 日本語公式ドキュメント
https://julia-doc-ja.readthedocs.io/ja/latest/index.html
初めてのJuliaとインストール (Windows & Linux)
https://qiita.com/ttlabo/items/b05bb43d06239f968035
出典
■参考書
「ゼロから作るDeep Learning ~ Pythonで学ぶディープラーニングの理論と実装」
斎藤康毅 著/オライリー・ジャパン
ご意見など
ご意見、間違い訂正などございましたらお寄せ下さい。