1

Ich trainiere ein konvolutionelles neuronales Netzwerk, um ein Bild in eine von fünf Klassen einzuteilen (Klasse 1 - Klasse 5).Konvolutionelles neuronales Netzwerk, das schiefe Vorhersagen macht

Ich habe sehr wenige Trainingsbilder für Klasse 1 und so führte ich einige Datenerhöhung durch zufällige Schnitte und Spiegeln der Bilder um mehr Daten zu erstellen. Ich habe mindestens 3000 Trainingsbilder für Klasse 2 - 5. Jetzt besteht mein Trainingssatz aus 3000 Bildern für jede Klasse und ich trainiere es mit stochastischem Gradientenabfall.

Mein Test-Set besteht aus:

Class 1 - 8 images 
Class 2 - 83 images 
Class 3 - 227 images 
Class 4 - 401 images 
Class 5 - 123 images 

Mein Netzwerk korrekt vorhersagt:

Class 1 - 0 images 
Class 2 - 0 images 
Class 3 - 0 images 
Class 4 - 399 images 
Class 5 - 0 images 

Ich erwarte nicht, ein sehr genaues Netzwerk die Grenzen meines Trainingssatzes gegeben und 15000 Bilder sind wahrscheinlich nicht genug - aber ich hätte nicht erwartet, dass es so verzerrt wäre, wenn man bedenkt, dass die Klassen 2 - 5 die gleiche Anzahl an unterschiedlichen Trainingsbildern hatten. Wenn ich mein Netzwerk auf einen viel größeren Anteil von Bildern der Klasse 4 trainiert hätte, würde mich das nicht überraschen. Ich hätte erwartet, dass das Netzwerk mindestens einige der anderen Klassen korrekt vorhersagen würde.

Irgendwelche Gedanken?

EDIT:

Bildtypen: Gebäude

Netzwerkarchitektur:

Input image - 256 x 256 x 3 
Convolutional layer - 15 x 15 filters, 16 filters 
Max 2x2 pooling layer 
Convolutional layer - 11 x 11 filters, 32 filters 
Max 2x2 pooling layer 
Convolutional layer - 7 x 7 filters, 64 filters 
Max 2x2 pooling layer 
Fully connected layer - 1024 outputs 
Softmax classifier layer - 5 outputs 

Kostenfunktion: Kreuz-Entropie

+0

Es gibt einen bestimmten Data Science Stapelaustausch - vielleicht Ihre Frage dort besser wäre? – user3791372

+0

Sie sollten die Architektur Ihres Convnets sowie die Objekte, die Sie klassifizieren, beschreiben. –

+0

@ user3791372 Danke, dass du mich in diese Richtung gelenkt hast! – jlhw

Antwort

0

Dies kann passieren (obwohl nicht sehr häufig). Ich denke du hast nicht lange genug trainiert. Ein CNN versucht, eine Klasse zu einer Zeit richtig zu bekommen, die in der Regel die mit der maximalen Anzahl von Proben ist, wenn Sie den Verlust nicht normalisiert haben. Dies liegt daran, dass es den größten Nutzen davon hat, diese Klasse am Anfang richtig zu prognostizieren. Da es mit der Zeit immer besser wird, bekommt es diesen Vorteil nicht mehr und versucht dann auch, andere Klassen korrekt vorherzusagen.

Sie können Ihren Softmax-Verlust basierend auf den Klassenhäufigkeiten gewichten oder Ihren Datensatz neu einlesen, um dieses Problem zu umgehen. Ich sehe auch, dass dein CNN nicht tief genug ist, die Filtergrößen sind nicht für die Auflösung geeignet, die du hast, und die Anzahl der Trainingsbeispiele ist zu gering. Ich würde Ihnen empfehlen, einige vortrainierte neuronale Netzwerke wie VGG, GoogLeNet, ResNet oder AlexNet für Ihre Aufgabe zu optimieren.

Caffè Sie diesem Beispiel folgen können, http://caffe.berkeleyvision.org/gathered/examples/finetune_flickr_style.html

+0

Vielen Dank für Ihre Kommentare und die Links! Ich habe meinen Datensatz erneut abgetastet, um mehr Bilder der Klasse 1 zu erhalten. Aber du hattest Recht - mein Netzwerk wird nicht lange genug trainiert, also sagt es jetzt im Grunde die letzte Klasse voraus, die es sieht! Könnten Sie mir helfen zu verstehen, wie tief mein Netzwerk ungefähr sein sollte und welche Filtergrößen angemessen sind? – jlhw

0

Ich glaube, ich bin ziemlich spät für eine Antwort zu geben, aber ich bin bereit, meine Erfahrung/Wissen zu teilen. :)

In der Praxis wird empfohlen, kleine Filtergrößen wie 3x3 und 5x5 maximal zu verwenden, da diese weniger Parameter ergeben, die die Trainingszeit ohne Genauigkeitsunterschied im Vergleich zu 15x15 usw. verringern. Es wurden Untersuchungen durchgeführt darüber (siehe Gewinner des ImageNet-Wettbewerbs 2013-2015).

Auf der einen Seite ist ein möglicher Grund, dass Ihr Modell auf eine Klasse voreingenommen ist, weil sie nicht ausgeglichen sind.Was Sie tun können, ist bestraft, dass das Modell mit kleineren Instanzen stärker auf die Klasse ausgerichtet ist. In Keras gibt es einen class_weight-Parameter, mit dem Sie Ihre Verlustfunktion skalieren können.

1 - Sequential - Keras

2- How to set class weights for imbalanced classes in Keras?

Verwandte Themen