CNNを用いた分類を行っているのですが、トレーニングデータよりもテストデータのほうが精度が高くトレーニングデータの学習の進み方があまりよくありません。
これは、学習回数の問題とトレーニングデータの数の問題なのでしょうか。
以下が結果のグラフになります。
図1 accuracyの精度グラフ
図2 lossの精度グラフ
図3 ドロップアウト0のaccuracyの精度グラフ
図4 ドロップアウト0のlossの精度グラフ
図5 ドロップアウト0.25で250で学習率1/10, 375でさらに1/10のaccuracy
図5 ドロップアウト0.25で250で学習率1/10, 375でさらに1/10のloss
実現したいこと
・トレーニングデータの精度を良くしたい
発生している問題・エラーメッセージ
トレーニングデータよりテストデータの方が精度が高く、トレーニングデータの学習の進みが遅い。
該当のソースコード(層の部分)
python
1from tensorflow.python.keras.models import Sequential 2model = Sequential() 3 4from tensorflow.python.keras.layers import Conv2D 5model.add( #畳み込み 6 Conv2D( 7 filters=8, #出力 8 input_shape=(50,50,3), 9 kernel_size=(3,3), #フィルタサイズ 10 strides=(1,1), 11 padding='valid', 12 activation='relu' 13 ) 14) 15 16from tensorflow.python.keras.layers import MaxPooling2D 17from tensorflow.python.keras.layers import Dropout 18 19model.add(MaxPooling2D(pool_size=(2,2))) #マックスプーリング # 20 21#追加畳み込み 22model.add( 23 Conv2D( 24 filters =16, 25 kernel_size = (3,3), 26 strides = (1,1), 27 padding = 'valid', 28 activation = 'relu' 29 )) 30 31model.add(MaxPooling2D(pool_size=(2,2))) 32 33#追加畳み込み 34model.add( 35 Conv2D( 36 filters = 32, 37 kernel_size = (3,3), 38 strides = (1,1), 39 padding = 'valid', 40 activation = 'relu' 41 )) 42 43model.add(MaxPooling2D(pool_size=(2,2))) 44 45#追加畳み込み 46model.add( 47 Conv2D( 48 filters = 64, 49 kernel_size = (3,3), 50 strides = (1,1), 51 padding = 'valid', 52 activation = 'relu' 53 )) 54 55model.add(MaxPooling2D(pool_size=(2,2))) 56 57from tensorflow.python.keras.layers import Flatten 58model.add(Flatten()) #2次元配列に 59 60from tensorflow.python.keras.layers import Dense 61 62model.add(Dense(units=192 63 ,activation='relu')) #全結合 64 65model.add(Dropout(0.5)) 66model.add(Dense(units=3,activation='softmax',name="f3")) #全結合 67 68# 追加の学習率減衰 69def step_decay(epoch): 70 x = 0.001 71 if epoch >= 250: x = 0.0001 72 if epoch >= 375: x = 0.00001 73 return x 74lr_decay = LearningRateScheduler(step_decay) 75 76 77model.compile( 78 optimizer=Adam(), #自動で学習率が設定される 79 loss='categorical_crossentropy', #多分類のときにしていできる交差エントロピー 80 metrics=['accuracy'] 81) #全結合 82 83history_model = model.fit_generator( 84 x_train_generator, 85 epochs = 10, 86 validation_data = val_test_generator, 87 validation_steps = None, 88 shuffle = True, 89 callbacks=[lr_decay] 90 )
データの詳細
トレーニングデータには三種類の画像が入っており、それぞれ7256, 8356, 4720合計すると20332程のデータ数があります。
対してテストデータには、それぞれ716,2089,550の計3335程のデータ数があります
補足情報(FW/ツールのバージョンなど)
windows10(64bit)
anacondaを使用
python 3.8.13
TensorFlow 2.3
Spyder 5.3.1を利用
回答1件