Ich spiele ein bisschen mit Convnets. Insbesondere verwende ich den Datensatz kaggle cats-vs-dogs, der aus 25000 Bildern besteht, die entweder als Katze oder als Hund (jeweils 12500) gekennzeichnet sind.
Ich habe es geschafft, mit meinem Testset eine Klassifizierungsgenauigkeit von ca. 85% zu erreichen, habe mir jedoch das Ziel gesetzt, eine Genauigkeit von 90% zu erreichen.
Mein Hauptproblem ist die Überanpassung. Irgendwie passiert es immer (normalerweise nach Epoche 8-10). Die Architektur meines Netzwerks ist lose von VGG-16 inspiriert, genauer gesagt, meine Bilder werden auf verkleinert , und dann führe ich Folgendes aus:
Convolution 1 128x128x32 (kernel size is 3, strides is 1)
Convolution 2 128x128x32 (kernel size is 3, strides is 1)
Max pool 1 64x64x32 (kernel size is 2, strides is 2)
Convolution 3 64x64x64 (kernel size is 3, strides is 1)
Convolution 4 64x64x64 (kernel size is 3, strides is 1)
Max pool 2 32x32x64 (kernel size is 2, strides is 2)
Convolution 5 16x16x128 (kernel size is 3, strides is 1)
Convolution 6 16x16x128 (kernel size is 3, strides is 1)
Max pool 3 8x8x128 (kernel size is 2, strides is 2)
Convolution 7 8x8x256 (kernel size is 3, strides is 1)
Max pool 4 4x4x256 (kernel size is 2, strides is 2)
Convolution 8 4x4x512 (kernel size is 3, strides is 1)
Fully connected layer 1024 (dropout 0.5)
Fully connected layer 1024 (dropout 0.5)
Alle Ebenen mit Ausnahme der letzten haben Relus als Aktivierungsfunktionen.
Beachten Sie, dass ich verschiedene Kombinationen von Windungen ausprobiert habe (ich habe mit einfacheren Windungen begonnen).
Außerdem habe ich den Datensatz durch Spiegeln der Bilder erweitert, sodass ich insgesamt 50000 Bilder habe.
Außerdem normalisiere ich die Bilder mithilfe der Min-Max-Normalisierung, wobei X das Bild ist
Der Code ist in Tensorflow geschrieben und die Chargengrößen sind 128.
Die Mini-Chargen von Trainingsdaten sind zu stark angepasst und haben eine Genauigkeit von 100%, während die Validierungsdaten bei etwa 84-85% nicht mehr zu lernen scheinen.
Ich habe auch versucht, die Abbrecherquote zu erhöhen / zu verringern.
Der verwendete Optimierer ist AdamOptimizer mit einer Lernrate von 0,0001
Im Moment spiele ich seit 3 Wochen mit diesem Problem und 85% scheinen eine Barriere vor mir gesetzt zu haben.
Ich verstehe, dass ich Transferlernen verwenden könnte, um viel höhere Ergebnisse zu erzielen, aber ich bin daran interessiert, dieses Netzwerk als selbstlernende Erfahrung aufzubauen.
Aktualisieren:
Ich verwende das gleiche Netzwerk mit einer anderen Stapelgröße. In diesem Fall verwende ich eine viel kleinere Stapelgröße (16 statt 128). Bisher erreiche ich eine Genauigkeit von 87,5% (statt 85%). Trotzdem ist das Netzwerk ohnehin überfordert. Ich verstehe immer noch nicht, wie ein Ausfall von 50% der Einheiten nicht hilft ... offensichtlich mache ich hier etwas falsch. Irgendwelche Ideen?
Update 2:
Scheint, als hätte das Problem mit der Batchgröße zu tun, da ich mit einer kleineren Größe (16 statt 128) jetzt eine Genauigkeit von 92,8% auf meinem Test-Set erreiche. Mit der kleineren Batchgröße passt das Netzwerk immer noch (die Mini-Batches enden) mit einer Genauigkeit von 100%) nimmt der Verlust (Fehler) jedoch immer weiter ab und ist im Allgemeinen stabiler. Die Nachteile sind eine VIEL langsamere Laufzeit, aber das Warten lohnt sich auf jeden Fall.