2017-03-28 3 views
0

私が使用したデータセットには33kの画像が含まれています。トレーニングには27kが含まれ、検証セットには6k画像が含まれます。
私はモデルの次のCNNコードを使用する:データセットのオーバーフィットの可能性のある理由

model = Sequential() 

model.add(Convolution2D(32, 3, 3, activation='relu', border_mode="same", input_shape=(row, col, ch))) 
model.add(Convolution2D(32, 3, 3, activation='relu', border_mode="same")) 
model.add(MaxPooling2D(pool_size=(2, 2))) 
model.add(Dropout(0.25)) 
model.add(Convolution2D(64, 3, 3, activation='relu', border_mode="same")) 
model.add(Convolution2D(128, 3, 3, activation='relu', border_mode="same")) 
model.add(MaxPooling2D(pool_size=(2, 2))) 
model.add(Dropout(0.25)) 
model.add(Flatten()) 
model.add(Activation('relu')) 
model.add(Dense(1024)) 
model.add(Dropout(0.5)) 
model.add(Activation('relu')) 
model.add(Dense(1)) 
adam = Adam(lr=0.0001) 
model.compile(optimizer=adam, loss="mse", metrics=["mae"]) 

Iが得出力overfittingを示唆decreasing training lossincreasing validation lossしかしを有しています。しかし、私は .Followingに役立ってきたはずであるdropoutsが含まれている出力のスナップ10のエポックのための訓練を受けたときである:

Epoch 1/10 
27008/27040 [============================>.] - ETA: 5s - loss: 0.0629 - mean_absolute_error: 0.1428 Epoch 00000: val_loss improved from inf to 0.07595, saving model to dataset/-00-val_loss_with_mymodel-0.08.hdf5 
27040/27040 [==============================] - 4666s - loss: 0.0629 - mean_absolute_error: 0.1428 - val_loss: 0.0759 - val_mean_absolute_error: 0.1925 
Epoch 2/10 
27008/27040 [============================>.] - ETA: 5s - loss: 0.0495 - mean_absolute_error: 0.1287 Epoch 00001: val_loss did not improve 
27040/27040 [==============================] - 4605s - loss: 0.0494 - mean_absolute_error: 0.1287 - val_loss: 0.0946 - val_mean_absolute_error: 0.2289 
Epoch 3/10 
27008/27040 [============================>.] - ETA: 5s - loss: 0.0382 - mean_absolute_error: 0.1119 Epoch 00002: val_loss did not improve 
27040/27040 [==============================] - 4610s - loss: 0.0382 - mean_absolute_error: 0.1119 - val_loss: 0.1081 - val_mean_absolute_error: 0.2463 

So, what is wrong? Are there any other methods to prevent overfitting?
Does shuffling of data help?

+0

「ドロップアウト」レートを上げてみることもできます。 'dropout'の後に' BatchNormalization'を追加します。 –

+0

@MarcinMożejko、この[リンク](http://stackoverflow.com/questions/34716454/where-do-i-call-the-batchnormalization-function-in-keras)で提案されているように、Activationの前にBatchNormalizationを追加しました。増加したval_lossは挿入されていない前は0.06、挿入されていれば0.09のval_lossが得られます。 – SupposeXYZ

答えて

1

私は1E-4の重量崩壊を追加しようとします。これは、以下のように重量減衰層を追加することによって行うことができます:model.add(Convolution2D(32, 3, 3, activation='relu', border_mode="same", input_shape=(row, col, ch), W_regularizer=l2(1E-4), b_regularizer=l2(1E-4)))。 L2はkeras.regularizershttps://keras.io/regularizers/#example)にあります。体重正則化は、誇張に対抗するのに非常に優れています。

しかし、過適合は、モデルの結果だけでなく、モデルの結果である可能性があります。バリデーションデータが何らかの形で「より難しい」場合は、列車のデータであれば、それに合わせることができない可能性もあります。

+0

私は33%の画像をデータセットとして持っていて、80%のトレーニングと20%のバリデーションセットでシャッフルして配布しました。 'regularizer'はすべてのレイヤーに追加されていますか、モデルをコンパイルしている間だけ' model.compile() 'ですか? – SupposeXYZ

+0

すべてのレイヤーに追加されました。 –

関連する問題