AIプログラミング

Kerasを使用してFashion MNISTの教師あり学習を試してみる

投稿日:

Kerasを使用してFashion MNISTの教師あり学習を試してみる

人工知能や機械学習のサンプルデータとして利用されるMNIST。MNISTは0~9の手書き数字の画像60,000枚の訓練セットと、テストセットの10,000枚を集めた画像データセットです。非常に扱いやすいため機械学習や深層学習の入門のデータセットとして使用されます。

しかし、毎回毎回MNISTを使用しても飽きてしまうのでないでしょうか?

そこで、今回は手書き数字ではなく、衣類の画像を分類するFashin_MNISTを試してみます。

fashion-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と必要なライブラリのインポート

kerasとmatplotlib.pyploをインポートしています。 また、matplotlib.pyploには別名としてpltとつけています。

kerasのバージョンは2.2.4となっています

Fashion MNISTのダウンロード

Fashion MNISTのデータセットをダウンロードしています。初回はダウンロードに時間がかかりますが、2回目以降はすでにダウンロードされているのでSKIPされます。
x_train・・・60,000枚の訓練セット
y_train・・・訓練セットのラベルクラス
x_test・・・10,000枚のテストセット
y_test・・・テストセットのラベルクラス

訓練セットのサイズ計算

訓練セットのサイズを計算しています。60000と出力されていることから訓練セットが60,000枚あることが分かります。また、1枚当たり28×28のサイズになっています。

テストセットのサイズ計算

同様にテストセットのサイズを計算しています。10000と出力されていることからテストセットが10,000枚あることが分かります。また、1枚当たり28×28のサイズになっています。

訓練用データの確認

実際のデータがどのようになっているかを確認しています。そのままだと数字の羅列になってしまうので、plt.imshowを用いてビジュアル的に見れるようにしています。訓練セットの先頭から25枚表示させています。

訓練用データの確認

訓練セットのラベルクラスの確認

先ほど表示させた訓練セットのラベルクラスを確認してみます。
9,0,0・・・8,4となっておりアンクルブーツ,T-シャツ,T-シャツ・・・バッグ,コートとなっています。

特徴量の正規化

特徴量の正規化を行っています。28×28 グレースケール画像で0~255の濃淡であらわされているので、特徴量データとして扱いやすい0~1の範囲に変換しています。訓練セットとテストセットの両方に対して行っています。

精度と損失の履歴をプロットする関数の定義

精度と損失の履歴をプロットする関数を定義します。後ほどplot_historyを起動することでグラフが表示されます。

モデルの構築

モデルの構築を行っています。
1行目:レイヤーの線形スタックであるSequentialモデルを適用します
2行目:中間層が512個、入力層が28*28個のニューロンを指定します
3行目:中間層の活性化関数にReLU関数を適用します
4行目:過学習の防止のために0.2の割合でドロップアウトを適用します。
4行目:出力層を10個にします
5行目:出力層の活性化関数にsoftmax関数を適用します
6行目:compileでモデルを構築します。

今回は損失関数にsparse_categorical_crossentropy、オプティマイザーにRMSpropを適用しています。

モデルの実行(教師あり学習)

バッチサイズ数:128,エポック数:50で教師あり学習の実行を行います。またfitメソッドには validation_dataを指定しています。

精度と損失の履歴をプロット表示

精度のプロット

損失のプロット

plot_historyを呼び出し精度と損失の履歴をプロットをしています。5エポックくらいから過学習が始まっているように見えます。

先ほど教師あり学習を実行させたモデルで、実際のテストセットを試してみます。正解率は0.8934となっています。

混同行列の表示

混同行列を表示させてみます。このままでも見れますが、もう少しビジュアル的に分かりやすいようにヒートマップで確認してみます。

混同行列の表示(ヒートマップ)

ヒートマップ

ヒートマップにするだけで見やすくなりました。

これをみると以下の特徴があります。(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 : 最初のニューラルネットワークを訓練する: 基本分類 (翻訳/解説)

-AIプログラミング
-, , , ,

Copyright© AI人工知能テクノロジー , 2019 All Rights Reserved.