Kerasを使用してFashion MNISTの教師あり学習を試してみる
人工知能や機械学習のサンプルデータとして利用されるMNIST。MNISTは0~9の手書き数字の画像60,000枚の訓練セットと、テストセットの10,000枚を集めた画像データセットです。非常に扱いやすいため機械学習や深層学習の入門のデータセットとして使用されます。
しかし、毎回毎回MNISTを使用しても飽きてしまうのでないでしょうか?
そこで、今回は手書き数字ではなく、衣類の画像を分類するFashin_MNISTを試してみます。
Fashion MNISTはMNISTと同様に60,000枚の訓練セットと10,000枚のテストセットです。各サンプルは 28×28 グレースケール画像で、10クラスラベルと関連付けされており、この点もMNISTと同様です。
ただし、手書き数字のMNISTと異なり、シャツやバックなどファッション系のラベルとなります。
Fashion MNISTのラベルクラス
Fashion MNISTのラベルクラスは次のようになっています。
0 T-シャツ/トップ (T-shirt/top)
1 ズボン (Trouser)
2 プルオーバー (Pullover)
3 ドレス (Dress)
4 コート (Coat)
5 サンダル (Sandal)
6 シャツ (Shirt)
7 スニーカー (Sneaker)
8 バッグ (Bag)
9 アンクルブーツ (Ankle boot)
ソースコード
Kerasと必要なライブラリのインポート
[crayon-673f0848ac07f058762543/]
[crayon-673f0848ac087478544509/]
kerasとmatplotlib.pyploをインポートしています。 また、matplotlib.pyploには別名としてpltとつけています。
kerasのバージョンは2.2.4となっています
Fashion MNISTのダウンロード
[crayon-673f0848ac08a444437601/]
[crayon-673f0848ac08c021870588/]
Fashion MNISTのデータセットをダウンロードしています。初回はダウンロードに時間がかかりますが、2回目以降はすでにダウンロードされているのでSKIPされます。
x_train・・・60,000枚の訓練セット
y_train・・・訓練セットのラベルクラス
x_test・・・10,000枚のテストセット
y_test・・・テストセットのラベルクラス
訓練セットのサイズ計算
[crayon-673f0848ac08f953799435/]
[crayon-673f0848ac091458285437/]
訓練セットのサイズを計算しています。60000と出力されていることから訓練セットが60,000枚あることが分かります。また、1枚当たり28×28のサイズになっています。
テストセットのサイズ計算
[crayon-673f0848ac093921260258/]
[crayon-673f0848ac095130904447/]
同様にテストセットのサイズを計算しています。10000と出力されていることからテストセットが10,000枚あることが分かります。また、1枚当たり28×28のサイズになっています。
訓練用データの確認
[crayon-673f0848ac097327750230/]
実際のデータがどのようになっているかを確認しています。そのままだと数字の羅列になってしまうので、plt.imshowを用いてビジュアル的に見れるようにしています。訓練セットの先頭から25枚表示させています。
訓練セットのラベルクラスの確認
[crayon-673f0848ac099062595972/]
[crayon-673f0848ac09c028810518/]
先ほど表示させた訓練セットのラベルクラスを確認してみます。
9,0,0・・・8,4となっておりアンクルブーツ,T-シャツ,T-シャツ・・・バッグ,コートとなっています。
特徴量の正規化
[crayon-673f0848ac09e992409294/]
特徴量の正規化を行っています。28×28 グレースケール画像で0~255の濃淡であらわされているので、特徴量データとして扱いやすい0~1の範囲に変換しています。訓練セットとテストセットの両方に対して行っています。
精度と損失の履歴をプロットする関数の定義
[crayon-673f0848ac0a0127930836/]
精度と損失の履歴をプロットする関数を定義します。後ほどplot_historyを起動することでグラフが表示されます。
モデルの構築
[crayon-673f0848ac0a2796631538/]
モデルの構築を行っています。
1行目:レイヤーの線形スタックであるSequentialモデルを適用します
2行目:中間層が512個、入力層が28*28個のニューロンを指定します
3行目:中間層の活性化関数にReLU関数を適用します
4行目:過学習の防止のために0.2の割合でドロップアウトを適用します。
4行目:出力層を10個にします
5行目:出力層の活性化関数にsoftmax関数を適用します
6行目:compileでモデルを構築します。
今回は損失関数にsparse_categorical_crossentropy、オプティマイザーにRMSpropを適用しています。
モデルの実行(教師あり学習)
[crayon-673f0848ac0a4584369464/]
[crayon-673f0848ac0a6341640108/]
バッチサイズ数:128,エポック数:50で教師あり学習の実行を行います。またfitメソッドには validation_dataを指定しています。
精度と損失の履歴をプロット表示
[crayon-673f0848ac0a9126570285/]
plot_historyを呼び出し精度と損失の履歴をプロットをしています。5エポックくらいから過学習が始まっているように見えます。
[crayon-673f0848ac0ab374382491/]
[crayon-673f0848ac0ad343436267/]
先ほど教師あり学習を実行させたモデルで、実際のテストセットを試してみます。正解率は0.8934となっています。
混同行列の表示
[crayon-673f0848ac0af036136496/]
[crayon-673f0848ac0b1535211322/]
混同行列を表示させてみます。このままでも見れますが、もう少しビジュアル的に分かりやすいようにヒートマップで確認してみます。
混同行列の表示(ヒートマップ)
[crayon-673f0848ac0b4399924099/]
ヒートマップにするだけで見やすくなりました。
これをみると以下の特徴があります。(100件以上間違ったデータを抽出)
正解のデータ:0 間違いのデータ:6 127件
正解のデータ:2 間違いのデータ:6 100件
正解のデータ:4 間違いのデータ:6 123件
T-シャツ(0)やプルオーバー(2)、コート(4) をシャツ(6)と間違えています。姿、形が似ているので間違えが多くなるのも分かります。
以上で、今回実施したFashion MNISTの試験は終了です。まだまだ正解率が89%なので改善の余地が大いにありそうです。
普段はMNISTを利用して機械学習やディープラーニングを試している人も、気分転換にFashion MNISTを試してみてはいかがでしょうか?
参考サイト
以下のサイトを参考にさせて頂きました。
TensorFlowでFashion-MNISTを試してみた
【python】混同行列(Confusion matrix)をヒートマップにして描画
TensorFlow : Keras : 最初のニューラルネットワークを訓練する: 基本分類 (翻訳/解説)