2017-05-15 5 views
2

Ich versuche, tiefes Lernen zu verwenden, um Einkommen von 15 selbst berichteten Attributen von einer Dating-Site vorherzusagen.Höhere Validierungsgenauigkeit, als Training Accurracy usin Tensor und Keras

Wir erhalten ziemlich merkwürdige Ergebnisse, bei denen unsere Validierungsdaten eine bessere Genauigkeit und einen geringeren Verlust haben als unsere Trainingsdaten. Und dies ist konsistent über die verschiedenen Größen versteckter Ebenen hinweg. Dies ist unser Modell:

for hl1 in [250, 200, 150, 100, 75, 50, 25, 15, 10, 7]: 
    def baseline_model(): 
     model = Sequential() 
     model.add(Dense(hl1, input_dim=299, kernel_initializer='normal', activation='relu', kernel_regularizer=regularizers.l1_l2(0.001))) 
     model.add(Dropout(0.5, seed=seed)) 
     model.add(Dense(3, kernel_initializer='normal', activation='sigmoid')) 

     model.compile(loss='categorical_crossentropy', optimizer='adamax', metrics=['accuracy']) 
     return model 

    history_logs = LossHistory() 
    model = baseline_model() 
    history = model.fit(X, Y, validation_split=0.3, shuffle=False, epochs=50, batch_size=10, verbose=2, callbacks=[history_logs]) 

Und dies ist ein Beispiel für die Richtigkeit und Verluste: Accuracy with hidden layer of 250 neurons und the loss.

Wir haben versucht, Regularisierung und Dropout zu entfernen, was wie erwartet in Überanpassung endete (Training acc: ~ 85%). Wir haben sogar versucht, die Lernrate drastisch zu reduzieren, mit ähnlichen Ergebnissen.

Hat jemand ähnliche Ergebnisse gesehen?

Antwort

4

Dies passiert, wenn Sie Dropout verwenden, da das Verhalten beim Training und Testen unterschiedlich ist.

Beim Training wird ein Prozentsatz der Funktionen auf Null gesetzt (50% in Ihrem Fall, da Sie Dropout(0.5) verwenden). Beim Testen werden alle Features verwendet (und entsprechend skaliert). So ist das Modell zum Testzeitpunkt robuster - und kann zu höheren Testgenauigkeiten führen.

+0

Also sagen Sie, dass, wenn val_acc etwas höher als trn_acc ist ok ist? –

1

Das ist eigentlich eine ziemlich oft Situation. Wenn Ihr Datensatz nicht so stark variiert, könnten Sie das Verhalten so haben. Here können Sie eine Erklärung finden, warum dies passieren könnte.

0

Dies weist auf eine hohe Verzerrung in Ihrem Dataset hin. Es ist unterausgestattet. Die auszustellenden Lösungen sind: -

  1. Wahrscheinlich hat das Netzwerk Schwierigkeiten, die Trainingsdaten anzupassen. Versuchen Sie daher ein etwas größeres Netzwerk.

  2. Versuchen Sie ein anderes tiefes neurales Netzwerk. Ich meine zu ändern die Architektur ein bisschen.

  3. Zug für längere Zeit.

  4. Verwenden Sie erweiterte Optimierungsalgorithmen.

1

Sie können prüfen, die Keras FAQ und vor allem der Abschnitt „Warum die Ausbildung Verlust Verlust viel höher als die Prüfung ist?“.

Ich würde auch vorschlagen, Sie einige Zeit in Anspruch nehmen und diese sehr gutarticle in Bezug auf einige „Gesundheits-Checks“ Sie berücksichtigen sollte immer lesen, wenn ein NN Gebäude.

Überprüfen Sie nach Möglichkeit, ob Ihre Ergebnisse sinnvoll sind. Zum Beispiel sollte im Fall einer n-Klassen-Klassifizierung mit kategorischer Kreuzentropie der Verlust in der ersten Epoche -ln(1/n) sein.

Abgesehen von Ihrem speziellen Fall glaube ich, dass abgesehen von der Dropout die Dataset-Split manchmal in dieser Situation führen kann. Insbesondere wenn die Datasetaufteilung nicht zufällig ist (in dem Fall, dass zeitliche oder räumliche Muster existieren), kann die Validierungsmenge von dem Zug grundlegend anders sein, dh weniger Rauschen oder weniger Varianz, und somit leichter vorherzusagen, was zu einer höheren Genauigkeit des Validierungssatzes führt als beim Training.

Wenn darüber hinaus der Validierungssatz ist sehr klein, um die Ausbildung im Vergleich dann durch gelegentliche das Modell besser paßt den Validierungssatz als das Training.]

Verwandte Themen