初心者のためのAI人工知能テクノロジーブログ

AI人工知能テクノロジー

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

投稿日:

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-6635f9a93216f911995291/]
[crayon-6635f9a932176738101121/]
kerasとmatplotlib.pyploをインポートしています。 また、matplotlib.pyploには別名としてpltとつけています。

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

Fashion MNISTのダウンロード

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

訓練セットのサイズ計算

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

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

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

訓練用データの確認

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

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

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

特徴量の正規化

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

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

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

モデルの構築

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

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

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

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

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

[crayon-6635f9a932198243658630/]

plot_historyを呼び出し精度と損失の履歴をプロットをしています。5エポックくらいから過学習が始まっているように見えます。
[crayon-6635f9a93219b183521577/]
[crayon-6635f9a93219d519191811/]
先ほど教師あり学習を実行させたモデルで、実際のテストセットを試してみます。正解率は0.8934となっています。

混同行列の表示

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

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

[crayon-6635f9a9321a4859743597/]

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

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

  • B!