2017年6月27日火曜日

少数のデータで強力な分類能力を有するモデルを作成してみる。 その2-a (Building powerful image classification models using very little data. Part2-a)

学習経過

はじめに

VGG16のCNNを利容して、特徴量を作成し、新規に全結合層を定義して、分類を行う方法を試してみた。その時課題とし、参考にした2つのWEBページのプログラムの記載が異なっており、どちらが正しいか、判断できなかった。
その後、試行錯誤により、どちらが正しいか判別したので、それを記載する。

また、途中経過の精度と誤差を保持する手段がわかり、matplotlib で描画させてみたので、それも記載しておく。

見つかった課題

プログラムにより、特徴量を作成するジェネレータで指定するデータ量を、

1 バッチサイズ(16)で割る
 bottleneck_features_train = model.predict_generator(generator, nb_train_samples // batch_size)

2 学習用データサイズそのままを指定している
 bottleneck_features_train = model.predict_generator(generator, nb_train_samples)

とあり、どちらが正しいか判断つかなかった。

bottleneck_features_train の配列のサイズを表示されて見ると
1 が 2000個で 2 が 32000個だった。

それゆえ1の バッチサイズで割るほうが正しいと判断し、1のコードで再度計算を行った。

記録

1エポック終了ごとに、学習データ、検証データそれぞれの、精度と誤差の値を記録するには、
model.fit関数の戻り値をすればよい。

history = model.fit(....

また、上記データでグラフを描画するには、以下のようなコードを使用する。

  print(history.history.keys())

  plt.plot(history.history['acc'])
  plt.plot(history.history['val_acc'])
  plt.title('model accuracy')
  plt.ylabel('accuracy')
  plt.xlabel('epoch')
  plt.legend(['train', 'test'], loc='upper left')
  plt.show()

  plt.plot(history.history['loss'])
  plt.plot(history.history['val_loss'])
  plt.title('model loss')
  plt.ylabel('loss')
  plt.xlabel('epoch')
  plt.legend(['train', 'test'], loc='upper left')
  plt.show()

このプログラムの実行結果は、最初に掲載したグラフとなるが、今回明らかに過学習していることが分かる。

drop outの数を増やしてみたが結果は、ほとんど代わらなかった。

過学習の対策は、今後の課題とする。

以上

0 件のコメント:

コメントを投稿