Ich versuche ein Net für semantische Segmentierung mit Klassenungleichgewicht zu trainieren. Um dies zu berücksichtigen, habe ich versucht, den InfoGainLoss-Layer zu implementieren und die infogain_matrix wie angegeben angegeben: here, wobei ich stattdessen für jedes diagonale Element 1 Häufigkeit (Klasse) verwendet habe.
Beim Trainieren der net konvergieren jedoch Genauigkeit und Verlust sofort auf 0, selbst bei niedrigem base_lr, und das Netz kennzeichnet alles als Klasse 0 ("unbekannt"). Meine Frage ist jetzt, ob die infogain_matrix wie in der Post angegeben werden sollte, die ich verlinkte, und wenn ja, welche anderen Gründe für dieses ungewöhnliche Verhalten des Netzes sein könnten (ich erwartete entweder Verlust 0 Genauigkeit 1 oder Verlust INF Genauigkeit 0).InfoGainLoss führt zu Genauigkeit und Verlust von 0
Edit:
Also, wenn ich das Netz mit der Schicht SoftMaxWithLoss laufen statt InfoGainLoss, beginnt es sofort alles als repräsentativste Klasse (class1 mit 90%) zu klassifizieren, und ändert sich nicht mehr. Meine Vermutung ist jetzt, dass ich die lmdb für die infogain_matrix falsch konfiguriert habe. Weiß jemand, ob man den dtype von lmdb für die caffe-Datenschicht spezifizieren muss (Bilder und infogain_matrix werden als float32 gespeichert), obwohl caffe documentation for the layer das nicht sagt? Oder was erwartet die Caffedatenschicht von der lmdb?
lmdbs wurden unter Verwendung des aus here genommenen/modifizierten Codes erzeugt, aber für die Bilder wurde die mittlere Subtraktion im Voraus durchgeführt. Ich habe lmdb Auslesung in Python getestet, und hier musste ich den dtype angeben, da sonst in die ursprünglichen Matrixdimensionen Fehler umgewandelt werden.
Edit2:
So ist der Fehler war in der Tat in der LMDB Definition, wie für dtype = float, Daten zu datum.float_data angehängt werden muss, statt datum.data, here sehen. Jetzt sieht alles gut aus und die Genauigkeiten und Verluste sind kein lockeres Whacky :)