学習経過 |
はじめに
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 件のコメント:
コメントを投稿