前回の記事「TensorFlowで画像分類など学習してみる(環境構築編)」の続きになります。
前回は環境構築編を書きましたが、今回から画像分類について複数回に分けて書いてみます。
MNISTの手書き文字の画像を利用して分類について書いていきます。MNISTのデータは世界中で利用されており、機械学習・ニューラルネットワークの一歩として多数のドキュメントが存在します。(手書き文字の画像を扱うのはプログラミングでいうところのHello world的なものです)
参考:MNISTはこちらになります。
第1弾は、データの読み込み・データの確認までを書いていきます。
前提/環境
前提となる環境とバージョンは下記となります。
・Anaconda3
・Python3.7.7
・pip 20.0
・TensorFlow 2.0.0
この記事ではJupyter Notebookでプログラムを進めていきます。コードの部分をJupyter Notebookにコピー&ペーストし実行することで同様の結果が得られると思います。注:バージョンが異なったり、他ツール(Google Colaboratoryなど)では検証していませんので動作しないケースがあります。
##順伝播型ニューラルネットワークを作る
MNISTの手書き文字セットを順伝播型ニューラルネットワークによって分類するということを目標にして
Tensorflowと機械学習に触れて理解していきたいと思います。
###順伝播型ニューラルネットワーク(feedforward neural network)とは
ニューロンが層のように並び隣接する層の間でのみ結合するネットワークです。入力されたデータは
順方向にのみ伝播していきます。
・データが逆に伝播することはない
・隣接するニューロンへのみデータが伝播する。
・各層のニューロンは隣接する前方のすべてのニューロンからデータを受け取る
・同一層のニューロンからはデータを受け取ることはない
というものです。
##順伝播型ニューラルネットワークのTensorFlow・Kerasを使った実装
入力層・中間層・出力層がそれぞれ1つである3層のニューラルネットワークを構築します。まずはデータのロードから進めていきます。
###実装その1 MNISTデータのインポート
import tensorflow as tf
from tensorflow.keras.datasets import mnist
#ヘルパーのライブラリ読み込み。画像を表示する場合に利用します。
import numpy as np
import matplotlib.pyplot as plt
(x_train, y_train), (x_test, y_test) = mnist.load_data() # データロード
TensorFrowではMNISTのデータを扱うモジュールがあり簡単にロードすることができます。
MNISTの手書き文字データセットは0~9の数字が手書きで書かれた画像とラベルのデータです。画像はそれぞれ28×28ピクセルの大きさで、各ピクセルは灰色の度合いを表す0~255の値で表現されています(白は255、0が黒を表します)。ラベルのデータは整数で表現されています。
読み込んだデータは、x_train,y_train,x_test,y_testとして扱うことができます。
x_train, y_train は学習用データ、x_test,y_testは評価用データとなります。
###実装その2 データを観察する
データの内容を見ましょう。
データサイエンスにおいてはデータの傾向や内容を事前にみておくことが重要です。必ず見ることにしましょう。
print('x_train.shape:', x_train.shape)
print('x_test.shape:', x_test.shape)
print('y_train.shape:', y_train.shape)
print('y_test.shape:', y_test.shape)
結果
x_train.shape: (60000, 28, 28)
x_test.shape: (10000, 28, 28)
y_train.shape: (60000,)
y_test.shape: (10000,)
MNISTのデータは70000枚分のデータですが、60000枚分が学習用、1万枚分が評価用のデータとなります。この後モデルを作り、学習していきますが、すべてのデータを学習に利用するのではなく、一部データを評価用として利用します。
x_train ・・・60000枚の画像データ(28×28)
x_test・・・10000枚の画像データ(28×28)
y_train・・・60000枚分のラベルデータ
y_test・・・10000枚分のラベルデータ
実際にデータの画像がどのようなものであるか確認します。
plt.figure()
plt.imshow(x_train[0])
plt.colorbar()
plt.grid(False)
plt.show()
上記のような画像が表示されればOKです。
もう一つラベルデータの内容も確認しましょう。
print(y_test)
結果
[7 2 1 ... 4 5 6]
上記のようなデータ構造になっています。
##まとめ
MNISTのデータに利用は簡単にできます。データをロードして内容を見るということで、この後のプログラムなどが理解しやすくなると思います。
### 2020年7月9日修正
ソースコードないで修正しました。tensorflow.python.keras.datasets とimportを記載していましたが、tensorflow.keras.datasetsへと修正しています。動作に問題はありませんができるだけ現状で行われる記載に修正しました。