2017-06-12 1 views
3

Ich benutze ein angepasstes LeNet-Modell in Keras, um eine binäre Klassifizierung zu machen. Ich habe ungefähr 250.000 Trainingsproben im Verhältnis 60/40. Mein Modell trainiert sehr gut. In der ersten Epoche erreicht die Genauigkeit 97 Prozent mit einem Verlust von 0,07. Nach 10 Epochen ist die Genauigkeit über 99 Prozent mit einem Verlust von 0,01. Ich verwende einen CheckPointer, um meine Modelle zu speichern, wenn sie sich verbessern.Keras: Modellgenauigkeit fällt nach Erreichen von 99 Prozent Genauigkeit und Verlust 0,01

Um die 11. Epoche herum sinkt die Genauigkeit auf etwa 55 Prozent mit einem Verlust von etwa 6. Wie könnte das möglich sein? Liegt es daran, dass das Modell nicht genauer sein kann und versucht, bessere Gewichte zu finden, dies aber völlig versäumt?

Mein Modell ist eine Anpassung an die Lenet Modell:

lenet_model = models.Sequential() 
lenet_model.add(Convolution2D(filters=filt_size, kernel_size=(kern_size, kern_size), padding='valid',\ 
         input_shape=input_shape)) 
lenet_model.add(Activation('relu')) 
lenet_model.add(BatchNormalization()) 
lenet_model.add(MaxPooling2D(pool_size=(maxpool_size, maxpool_size))) 
lenet_model.add(Convolution2D(filters=64, kernel_size=(kern_size, kern_size), padding='valid')) 
lenet_model.add(Activation('relu')) 
lenet_model.add(BatchNormalization()) 
lenet_model.add(MaxPooling2D(pool_size=(maxpool_size, maxpool_size))) 
lenet_model.add(Convolution2D(filters=128, kernel_size=(kern_size, kern_size), padding='valid')) 
lenet_model.add(Activation('relu')) 
lenet_model.add(BatchNormalization()) 
lenet_model.add(MaxPooling2D(pool_size=(maxpool_size, maxpool_size))) 
lenet_model.add(Flatten()) 
lenet_model.add(Dense(1024, kernel_initializer='uniform')) 
lenet_model.add(Activation('relu')) 
lenet_model.add(Dense(512, kernel_initializer='uniform')) 
lenet_model.add(Activation('relu')) 
lenet_model.add(Dropout(0.2)) 
lenet_model.add(Dense(n_classes, kernel_initializer='uniform')) 
lenet_model.add(Activation('softmax')) 

lenet_model.compile(loss='binary_crossentropy', optimizer=Adam(), metrics=['accuracy']) 
+0

Fällt die Trainingsgenauigkeit oder die Validierungsgenauigkeit? Es kann nicht sein, dass es nur neue Gewichte findet, da der Gradientenabfall nicht nur die Gewichte so plötzlich ändern lässt. – michetonu

+0

Das Modell ist für alle Variablen trainiert, daher verwende ich in diesem Fall keine Validierungsdaten. –

+3

Versuchen Sie, 'loss' in' categorical_crossentropy' zu ändern. Oder ändern Sie den Ausgang, um "dim = 1" und "activation =" softmax "' zu haben. –

Antwort

3

Das Problem bei der Anwendung eines binary_crossentropy Verlust belogen, während in diesem Fall categorical_crossentropy angewendet werden sollte. Ein anderer Ansatz besteht darin, binary_crossentropy loss zu belassen, aber die Ausgabe zu ändern, um dim=1 und die Aktivierung zu sigmoid zu haben. Das seltsame Verhalten kommt von der Tatsache, dass mit binary_crossentropy eine binäre Klassifizierung mit mehreren Klassen (mit zwei Klassen) tatsächlich gelöst wird, während Ihre Aufgabe eine binäre Einklassenklasse ist.

Verwandte Themen