2017-07-14 46 views
1

ケラスとテンソルフローを使用して画像のバイナリ分類(それぞれ15kサンプル)のCNNをトレーニングします。妥当性確認の精度が向上している間、訓練の損失が増加する

これは私のモデルである:

#input layer : first conv layer 
model = Sequential() 
model.add(Conv2D(filters=32, 
       kernel_size=(5,5), 
       input_shape=(256,256,3), 
       padding='same', 
       kernel_regularizer=regularizers.l2(0.0001))) 
model.add(BatchNormalization()) 
model.add(Activation('relu')) 
model.add(MaxPooling2D(pool_size=(2,2))) 
model.add(Dropout(0.1)) 

# second conv layer 
model.add(Conv2D(filters=64, 
       kernel_size=(5,5), 
       padding='same', 
       kernel_regularizer=regularizers.l2(0.0001))) 
model.add(BatchNormalization()) 
model.add(Activation('relu')) 
model.add(MaxPooling2D(pool_size=(2,2))) 
model.add(Dropout(0.2)) 
# third layer 
model.add(Conv2D(filters=128, 
       kernel_size=(5,5), 
       padding='same', 
       kernel_regularizer=regularizers.l2(0.0001))) 
model.add(BatchNormalization()) 
model.add(Activation('relu')) 
model.add(MaxPooling2D(pool_size=(2,2))) 
model.add(Dropout(0.3)) 
# fourth layer : FC layer 
model.add(Flatten()) 
model.add(Dense(128,kernel_regularizer=regularizers.l2(0.0001))) 
model.add(BatchNormalization()) 
model.add(Activation('relu')) 
model.add(Dropout(0.5)) 
# prediction layer 
model.add(Dense(2,activation='softmax',name='prediction',kernel_regularizer=regularizers.l2(0.0001))) 

私はオプティマイザとして(kerasのマニュアルのデフォルト値に設定)アダムを使用しています。 モデルのトレーニングを始めたとき、それは奇妙な動作をし始めました。

エポック180分の14の 191S - 損失:0.7426 - ACC:0.7976 - val_loss:0.7306 - val_acc:0.7739

エポック180分の15の 191S - 損失:0.7442 - ACC:0.8034 - val_loss:0.7284 - val_acc :0.8018

エポック180分の16の 192S - 損失:0.7439 - ACC:0.8187 - val_loss:0.7516 - val_acc:0.8103

エポック180分の17の 191S - 損失:0.7401 - ACC:0.8323 - val_loss:0.7966 - val_acc:0.7945

エポック180分の18の 192S - 損失:0.7451 - ACC:0.8392 - val_loss:0.7601 - val_acc:0.8328

エポック180分の19の 191S - 損失:0.7653 - ACC:0.8471 - val_loss:0.7776 - val_acc。 0.8243

エポック180分の20 191S - 損失:0.7514 - ACC:0.8553 - val_loss:0.8367 - val_acc:0.8170

エポック180分の21 191S - 損失:0.7580 - ACC:0.8601 - val_loss:0.8336 - val_acc:0.8219

エポック180分の22 192S - 損失:0.7639 - ACC:0.8676 - val_loss:0.8226 - val_acc:0.8438

エポック180分の23の 191S - 損失:0.7599 - ACC:0.8767 - val_loss:0.8618 - val_acc:0.8280

エポック180分の24の 191S - 損失:0.7632 - ACC:0.8761 - val_loss:0.8367 - val_acc:0.8426

エポック180分の25の 191S - 損失:0.7651 - ACC:0.8769 - val_loss:0.8520 - val_acc。 0.8365

エポック26/180 191S - ロス:0.7713 - ACC:0.8815 - val_loss:0.8770 - val_acc:増加し、精度も(トレーニングと検証の両方を)増加している中0.8316

など.....

損失

softmaxクラシファイアを使用しているので、開始損失〜0.69(-ln(0.5))を得ることは論理的ですが、ここでは損失がそれよりも高くなります。

これはあまりにもフィットしているかどうか混乱しています。 誰も私にここで何が起こっているか教えてもらえますか?バイナリ分類のための

+0

はあなたの予測を確認しましたか?あなたはすべてについて同じ予測を得ることができます。また、これは大きなネットワークです。最初にConv2Dレイヤーを1つだけ試して、テスト結果を試しましたか? – DJK

+0

私はそれを試していない。それを試みます。しかし、このオーバーフィットですか? –

+0

はい、あなたはフィッティングオーバーですが、これは列車の損失が検証損失よりも小さい場合に発生しますが、損失が時間の経過と共に増加している点で、より大きな問題があります。問題が何であるかを知るのは難しいです。ネットワークは提供するだけですが、データ処理を含める必要があります。他の人が方法論全体を見ることができるようにしてください。 – DJK

答えて

3

:)事前に

おかげで、あなたの予測層のためにこれを変更しようとすることができます:

model.add(Dense(1, kernel_initializer='normal', activation='sigmoid')) 
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) 
+0

私は混乱しています。これは私が得ている結果とどのように関連していますか?説明していただけますか? –

+0

ユースケースに合わせて間違ったアーキテクチャを選んだだけです。私は '' model.compile() ''の中の選択された損失とメトリックについての詳細を示していないので、あなたの設定に関するトレーニング値については推測できません。 – petezurich

+0

model.compile(loss = 'categorical_crossentropy'、optimizer = optimizers.Adam ()、メトリクス= ['精度']) –

関連する問題