2014-12-24 3 views
13

Ich möchte eine Verlustschicht des Typs InfogainLoss in meinem Modell verwenden. Aber ich habe Schwierigkeiten, es richtig zu definieren.InfogainLoss Schicht

  1. Gibt es ein Tutorial/Beispiel für die Verwendung von INFOGAIN_LOSS Schicht?

  2. Sollte der Eingang zu dieser Schicht, die Klassenwahrscheinlichkeiten, die Ausgabe einer SOFTMAX Schicht sein, oder genügt es, die "Oberseite" einer vollständig verbundenen Schicht einzugeben?

INFOGAIN_LOSS benötigt drei Eingaben: Klassenwahrscheinlichkeiten, Etiketten und die Matrix H. Die Matrix H kann entweder als Layer-Parameter infogain_loss_param { source: "fiename" } bereitgestellt werden.
Angenommen, ich habe ein Python-Skript, das H als numpy.array von Form (L,L) mit dtype='f4' berechnet (wobei L die Anzahl der Etiketten in meinem Modell ist).

  1. Wie kann ich meine numpy.array in eine binproto-Datei umwandeln, die als infogain_loss_param { source } zum Modell zur Verfügung gestellt werden können?

  2. Angenommen, ich möchte H als dritte Eingabe (unten) zur Verlustschicht bereitstellen (und nicht als Modellparameter). Wie kann ich das machen?
    Definiere ich eine neue Datenschicht, die "oben" H ist? Wenn ja, würden die Daten dieser Schicht nicht bei jeder Trainingsiteration wie die Trainingsdaten inkrementiert werden? Wie kann ich mehrere nicht zusammenhängende Input "Daten" Schichten definieren, und wie Caffe wissen kann, aus dem Training/Test "Daten" Schicht Batch nach Batch zu lesen, während von der H "Daten" Schicht es nur einmal für alle zu lesen Trainingsprozess?

Antwort

7

Ich habe immer noch keine vollständige Antwort auf meine Frage. Diese Antwort bezieht sich nur auf meine dritte und vierte Teile:
3. Wie kann ich eine numpy.array in eine binproto Datei konvertieren:

In Python

H = np.eye(L, dtype = 'f4') 
import caffe 
blob = caffe.io.array_to_blobproto(H.reshape((1,1,L,L))) 
with open('infogainH.binaryproto', 'wb') as f : 
    f.write(blob.SerializeToString()) 

Jetzt können Sie zum Modell Proto hinzufügen die INFOGAIN_LOSS Schicht mit H als Parameter:

layer { 
    bottom: "topOfPrevLayer" 
    bottom: "label" 
    top: "infoGainLoss" 
    name: "infoGainLoss" 
    type: "InfogainLoss" 
    infogain_loss_param { 
    source: "infogainH.binaryproto" 
    } 
} 

4. Wie H als Teil einer Datenschicht

Zitiert Evan Shelhamer's post laden:

Es gibt keine Möglichkeit derzeit Datenschichten laden Eingabe mit unterschiedlichen Geschwindigkeiten zu machen. Bei jedem Vorwärtsdurchlauf werden alle Datenschichten vorgerückt. Die Eingabe von Konstanten H könnte jedoch erfolgen, indem eine Eingangsdatei lmdb/leveldb/hdf5 erstellt wird, die nur H ist, da die Datenschicht eine Schleife bildet und das gleiche H lädt. Dies verschwendet offensichtlich Festplatten-IO.


Was die ersten beiden Teile meiner Frage:
1. Gibt es eine Anleitung/Beispiel über die Verwendung von InfogainLoss Schicht?:
Ein schönes Beispiel kann gefunden werden here: mit InfogainLoss gegen Klassenungleichgewicht.

2. Sollte die Eingabe für diese Schicht, die Klassenwahrscheinlichkeiten, die Ausgabe einer Softmax Schicht sein?
Nach Yair's answer die Antwort ist JA es sollte die Ausgabe von Softmax Schicht sein (oder irgendeine andere Schicht, die die Eingangswerte sicherstellt, in Reihe sind [0..1]).


Vor kurzem habe ich bemerkt, dass "InfogainLoss" oben auf "Softmax" Schicht unter Verwendung der numerischen Instabilität führen kann. Daher schlage ich vor, diese beiden Schichten zu einer einzigen Schicht zu kombinieren (ähnlich der Schicht "SoftmaxWithLoss"). Die Mathematik dieser kombinierten Schicht ist gegeben unter here. Eine Implementierung dieses "kombinierten" infogainLoss + Softmax findet sich in .

1

Die Schicht wird zusammenfassend

-log(p_i) 

und so die Notwendigkeit des p_i in (0 sein, 1] Sinn als Verlustfunktion zu machen (sonst höhere Konfidenzgrade einen höheren Verlust produzieren). Siehe Kurve unten für die Werte von log (p).

enter image description here

ich glaube nicht, dass sie auf 1 summieren, aber wird sie durch eine Softmax Schicht vorbei beide Eigenschaften erzielen.

+0

es ist nicht genau diese Summe, es gibt auch Gewichte – Shai

+0

Ja, es gibt die Gewichte, aber sie sind nicht der Faktor, der den Wert von p_i einschränkt. log (p) <0 für 0 1 log (p)> 0 und so wird -log (p) größer, wenn p kleiner wird. Dies ist das Gegenteil von dem, was die Verlustfunktion tun sollte. Deshalb muss p in (0, 1) sein. Log (0) = -infinity, also sollte darauf geachtet werden, p = 0 nicht zu haben, aber das ist bereits in der Schicht selbst implementiert. – Yair

+0

Also, wenn ich das richtig verstehe , Ihre Antwort auf Frage Nummer 2 ist: der Eingang zu 'info_gain' sollte der" oberste "eines' softmax' Layers sein. – Shai