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

## :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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/90e421c1-001a-b8b6-fb82-fa0b066d3227.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)が得られます。


```ruby: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/fe830368-9814-ca81-ef85-22afdb7b0613.png)

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

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

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

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

最初の一行目のデータの内容を確認してみます。
![スクリーンショット 2021-11-10 14.23.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/7f439f86-6cbf-4fe4-59ef-0e55d6b0c08f.png)
横方向(列方向)に小数値の要素が784個並んでいます。
この784個のデータは手書き数字画像(28ピクセルx28ピクセル)一つ分のデータに相当します。

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

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


#### 画像データを表示する

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

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

```ruby: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メソッドを使用してグレースケール値を元にプロットを行います。
　与える引数は２次元配列となります。
[S06]
　正解ラベルデータの一つ目を表示しています。

動作の結果、以下のような画像が得られました。
![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/a2341f3d-5870-5538-6cf8-7c12168e6f83.png)
今回はJuliaを使ってMNIST手書き数字画像データを取り扱う方法を学びました。
次は、MNIST手書き数字認識その②推論を行ってみたいと思います。


## :red_car: もくじ

[(1)論理回路](https://qiita.com/ttabata/items/f9253d5ef94ca3807f42)
[(2)活性化関数](https://qiita.com/ttabata/items/7d4b8d92e38df47cffbb)
[(3)3層ニューラルネットワークの実装](https://qiita.com/ttabata/items/4f50ec32c0276d21d966)
[(4)ソフトマックス関数](https://qiita.com/ttabata/items/21329897119f81a141e9)
[(5)MNIST手書き数字認識 その①画像表示](https://qiita.com/ttabata/items/6f7025f48fa52d465c81)
[(5)MNIST手書き数字認識 その②推論](https://qiita.com/ttabata/items/0781e1aacb11d9148053)

## :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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/4a558c91-5e9c-9d6f-3673-d44fbb583103.png)

## :red_car: ご意見など

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