3

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 :)

Antwort

2

Der Fehler war in der lmdb Definition, wie für dtype = float, die Daten müssen an datum.float_data anstelle von datum.data angehängt werden muss leer bleiben, damit caffe automatisch nach Datum sucht.float_data); SOURCE

So ist der Code von here zur Erzeugung von LMDB Datensatz mit Python modifiziert werden könnte, wie folgt:

with env.begin(write=True) as txn: 
    # txn is a Transaction object 
    for i in range(N): 
     datum = caffe.proto.caffe_pb2.Datum() 
     datum.channels = X.shape[1] 
     datum.height = X.shape[2] 
     datum.width = X.shape[3] 
     datum.float_data.extend(X[i].astype(float).flat) 
     datum.label = int(y[i]) 
     str_id = '{:08}'.format(i) 
     # The encode is only essential in Python 3 
     txn.put(str_id.encode('ascii'), datum.SerializeToString()) 

Die Sache ist, caffe sich nicht um Fehler werfen, wenn Sie falsch float Daten datum.data statt anhängen von datum.float_data, führt aber zu einem verrückten Verhalten wie Genauigkeit und Verlust, die beide auf 0 gehen (da das infogain_mat H für bestimmte Klassen aufgrund von dtype mismatch 0 sein kann)

Verwandte Themen