ResNet: 100% Genauigkeit während der Ausbildung, aber 33% der Vorhersagegenauigkeit mit den gleichen Daten
Ich bin neu in machine learning and deep learning " und für das lernen-Zwecke, die ich zu spielen versuchte mit Resnet. Ich habe versucht, zu overfit über kleine Daten (3 verschiedenen Bilder) und sehen, wenn ich fast 0 Verlust-und 1,0-Genauigkeit - und das Tat ich.
Das problem ist, dass Vorhersagen auf der Ausbildung Bilder (d.h. die gleichen 3 Bilder zum training verwendet werden) sind nicht korrekt.
Training Bilder
Bild-Etiketten
[1,0,0]
, [0,1,0]
, [0,0,1]
Mein python-code
#loading 3 images and resizing them
imgs = np.array([np.array(Image.open("./Images/train/" + fname)
.resize((197, 197), Image.ANTIALIAS)) for fname in
os.listdir("./Images/train/")]).reshape(-1,197,197,1)
# creating labels
y = np.array([[1,0,0],[0,1,0],[0,0,1]])
# create resnet model
model = ResNet50(input_shape=(197, 197,1),classes=3,weights=None)
# compile & fit model
model.compile(loss='categorical_crossentropy', optimizer='adam',metrics=['acc'])
model.fit(imgs,y,epochs=5,shuffle=True)
# predict on training data
print(model.predict(imgs))
Das Modell nicht overfit die Daten:
3/3 [==============================] - 22s - loss: 1.3229 - acc: 0.0000e+00
Epoch 2/5
3/3 [==============================] - 0s - loss: 0.1474 - acc: 1.0000
Epoch 3/5
3/3 [==============================] - 0s - loss: 0.0057 - acc: 1.0000
Epoch 4/5
3/3 [==============================] - 0s - loss: 0.0107 - acc: 1.0000
Epoch 5/5
3/3 [==============================] - 0s - loss: 1.3815e-04 - acc: 1.0000
aber Vorhersagen sind:
[[ 1.05677405e-08 9.99999642e-01 3.95520459e-07]
[ 1.11955103e-08 9.99999642e-01 4.14905685e-07]
[ 1.02637095e-07 9.99997497e-01 2.43751242e-06]]
was bedeutet, dass alle Bilder habe label=[0,1,0]
warum? und wie kann das passieren?
- Wo ist die Bilder? Warum Sie nicht posten?
- Ich glaube nicht, Bilder sind relevant hier.. Sie sind einfach Graustufenbilder, über 110x90 Größe..
- Gut, wie kann ich das problem reproduzieren?
- ohh Recht 🙂 ich werde Sie in einer minute
- imgur.com/a/XKlKA - 3 Bilder, die ich verwenden, um zu versuchen, überanpassung
- Poste bitte die Bilder einzeln in Ihre Frage.
- Dank WilmarvanOmmeren die Frage ist, aktualisiert
ValueError: Input size must be at least 197x197
... welche version von Keras verwenden Sie?- Ich benutze Keras2.0.8, aber ich glaube nicht, dass die version wichtig ist.. stellen Sie sicher, dass Sie die Größe der Bilder, wie ich in den obigen code
- die Ausnahme wird ausgelöst, wenn Sie versuchen zu erklären
ResNet50(input_shape=(140...
- du hast Recht!! Es tut mir Leid, ändern 140 bis 197 und es sollte funktionieren.. schau in den code oben 🙂
- Dude - es ist nicht zu arbeiten - es erwartet Bild der Größe
(224, 224, 3)
mitinclude_top=True
. - Komisch.. es funktioniert für mich.. bist du sicher, dass input_shape ist (197,197,1) bei der Erstellung ResNet50 Objekt?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist, weil der batch-Normalisierung Schichten.
In der Ausbildung phase, die batch normalisiert w.r.t. den Mittelwert und die Varianz. Jedoch in der Testphase befinden, wird der batch normalisiert w.r.t. die gleitenden Durchschnitt der bisher beobachteten Mittelwert und Varianz.
Nun ist dies ein problem, wenn die Anzahl der beobachteten Chargen klein ist (z.B. 5 in deinem Beispiel), weil in den
BatchNormalization
Schicht, standardmäßigmoving_mean
ist initialisiert auf 0 undmoving_variance
wird initialisiert, werden 1.Gegeben auch, dass die Standard -
momentum
ist 0.99, Sie müssen aktualisieren, die gleitenden Durchschnitte durchaus eine Menge Zeit, bevor Sie konvergieren, um die "wahre" Mittelwert und Varianz.Dass ist der Grund, warum die Vorhersage falsch ist, in der frühen Phase, aber richtig ist nach 1000 Epochen.
Können Sie es überprüfen, indem das
BatchNormalization
Schichten zu arbeiten im "Trainings-Modus".Während der Ausbildung, die Genauigkeit ist 1, und der Verlust ist nahe null:
Nun, wenn wir beurteilen das Modell, wir werden beobachten, hohe Verluste und geringe Genauigkeit, denn nach 5 updates, die gleitenden Durchschnitte sind noch ziemlich nah an die ursprünglichen Werte:
Jedoch, wenn wir manuell angeben, der "Lern-phase" variable und lassen die
BatchNormalization
Schichten verwenden Sie die "wirkliche" batch-Mittelwert und die Varianz, das Ergebnis wird das gleiche wie das, was beobachtetfit()
.Es ist auch möglich zu überprüfen, ob es durch die änderung der Dynamik auf einen kleineren Wert.
Beispielsweise durch hinzufügen von
momentum=0.01
alle batch-norm Schichten inResNet50
die Vorhersage nach 20 Epochen ist:momentum
für alle bereits ausgebildeten batch-norm Schichten inResNet50
? Bin ich es richtig, dass die Einstellungmomentum=0.01
sollten die gleichen Ergebnisse erzielt, während bei Ausbildung und evaluation? Soll das nur für die überprüfung oder als Einstellung für die Ausbildung?Was passiert, ist im Grunde, dass keras.fit() ich.e Ihre
ist, während die am besten passen, ist die Präzision verloren. Wie, ist die Präzision verloren, die Modelle passen Probleme gibt und unterschiedliche Ergebnisse.Die keras.passen nur hat eine gute Passform, die nicht die geforderte Präzision