2017-03-28 2 views
0

Der Datensatz, den ich verwendet habe, enthält 33k Bilder. Das Training enthält 27k und das Validierungsset enthält 6k Bilder.
ich verwendet, um die folgenden CNN-Code für das Modell:Mögliche Gründe für die Überanpassung des Datensatzes

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"]) 

Der Ausgang I erhalten eine decreasing training loss hat aber increasing validation lossoverfitting hindeutet. Aber ich habe dropouts enthalten, die in .Following geholfen haben sollte, ist die Schnippen ausgegeben, wenn für 10 Epochen trainiert:

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

Sie könnten versuchen, eine Dropout-Rate zu erhöhen. Und fügen Sie 'BatchNormalization' nach' dropout's hinzu. –

+0

@ MarcinMożejko, habe ich BatchNormalisierung vor der Aktivierung wie in diesem [Link] vorgeschlagen (http://StackOverflow.com/Questions/34716454/where-do-i-call-the-batchnormalization-function-in-keras). Val_loss erhöht, vorher ohne Insertion war 0,06 und mit Insertion erhalte ich val_loss von 0,09. – SupposeXYZ

Antwort

1

Ich würde versuchen, Gewicht Zerfall von 1E-4 hinzuzufügen. Dies kann durch Hinzufügen der Gewichtsabnahmeebene wie folgt geschehen: 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 kann in keras.regularizers (https://keras.io/regularizers/#example) gefunden werden. Die Regularisierung des Gewichts ist sehr gut gegen Überanpassung.

Die Überanpassung kann jedoch nicht nur auf Ihr Modell, sondern auch auf Ihr Modell zurückzuführen sein. Wenn die Validierungsdaten irgendwie "härter" sind als Ihre Zugdaten, dann könnte es einfach sein, dass Sie auch nicht passen können.

+0

Ich hatte 33K Bilder als Datensatz, die ich in 80% Training und 20% Validierungs-Set gemischt und verteilt habe. Wird '' Regularizer' 'zu jeder Ebene hinzugefügt oder nur während des Kompilierens des Modells, d. H. 'Model.compile()'? – SupposeXYZ

+0

Für jede Ebene hinzugefügt. –

Verwandte Themen