2017-01-16 6 views
5

in Keras, ich möchte meine Verlustfunktion anpassen, die nicht nur (y_true, y_pred) als Eingabe, sondern muss auch die Ausgabe von der internen Schicht des verwenden Netzwerk als die Bezeichnung für eine Ausgabeschicht. Dieses Bild zeigt die Network LayoutKeras Implementierung der benutzerdefinierten Verlustfunktion, die interne Layer-Ausgabe als Etikett benötigen

Hier ist die interne Ausgabe xn, die ein 1D-Merkmalsvektor ist. in der oberen rechten Ecke ist die Ausgabe xn ', was die Vorhersage von xn ist. Mit anderen Worten, xn ist die Bezeichnung für xn '.

Während [Ax, Ay] traditionell als y_true bekannt ist und [Ax ', Ay'] ist y_pred.

Ich möchte diese beiden Verlustkomponenten zu einem kombinieren und das Netzwerk gemeinsam trainieren.

Irgendwelche Ideen oder Gedanken werden sehr geschätzt!

Antwort

0

Zuerst sollten Sie die Functional API verwenden. Dann sollten Sie die Netzwerkausgabe als Ausgabe plus das Ergebnis der internen Ebene definieren, sie zu einer einzelnen Ausgabe zusammenführen (und dann verketten) und dann eine benutzerdefinierte Verlustfunktion erstellen, die die zusammengeführte Ausgabe in zwei Teile aufteilt und die Verlustberechnungen durchführt allein.

Etwas wie:

def customLoss(y_true, y_pred): 
    #loss here 
    internalLayer = Convolution2D()(inputs) #or other layers 
    internalModel = Model(input=inputs, output=internalLayer) 
    tmpOut = Dense(...)(internalModel) 
    mergedOut = merge([tmpOut, mergedOut], mode = "concat", axis = -1) 
    fullModel = Model(input=inputs, output=mergedOut) 

    fullModel.compile(loss = customLoss, optimizer = "whatever") 
+0

Vielen Dank für Ihre Antwort! Ich denke, mein Hauptanliegen ist, wie man meine Verlustfunktion bildet. Ja, wir können beide Ausgaben zu einem kombinieren, aber bei der Berechnung des Verlustes für die interne Ausgabe (xn ') benötigt das customLoss Zugriff auf das Modell selbst, um die Bezeichnung für die interne Ausgabe (xn) zu erhalten. xn sind nicht die Trainingsdaten, sondern eine Transformation der vom Modell verarbeiteten Trainingsdaten. – ljklonepiece

+0

@LiJuekun Kannst du nicht einfach das "interne Label" in den Y-Wert setzen, den du passierst? –

7

Ich habe einen Weg herausgefunden, jemand im Fall, dass für den gleichen sucht, ich hier gepostet (bezogen auf das Netzwerk in diesem Beitrag nicht angegeben):

Die Idee ist, die angepasste Verlustfunktion zu definieren und sie als Ausgabe des Netzwerks zu verwenden. (Notation: A ist die wahre Label Variable A und A' ist der vorhergesagte Wert der Variablen A)

def customized_loss(args): 
    #A is from the training data 
    #S is the internal state 
    A, A', S, S' = args 
    #customize your own loss components 
    loss1 = K.mean(K.square(A - A'), axis=-1) 
    loss2 = K.mean(K.square(S - S'), axis=-1) 
    #adjust the weight between loss components 
    return 0.5 * loss1 + 0.5 * loss2 

def model(): 
    #define other inputs 
    A = Input(...) # define input A 
    #construct your model 
    cnn_model = Sequential() 
    ... 
    # get true internal state 
    S = cnn_model(prev_layer_output0) 
    # get predicted internal state output 
    S' = Dense(...)(prev_layer_output1) 
    # get predicted A output 
    A' = Dense(...)(prev_layer_output2) 
    # customized loss function 
    loss_out = Lambda(customized_loss, output_shape=(1,), name='joint_loss')([A, A', S, S']) 
    model = Model(input=[...], output=[loss_out]) 
    return model 

    def train(): 
     m = model() 
     opt = 'adam' 
     model.compile(loss={'joint_loss': lambda y_true, y_pred:y_pred}, optimizer = opt) 
     # train the model 
     .... 
+0

Ich weiß, dass das schon eine Weile still war, aber kannst du erklären, was A und A sind? A 'ist die Vorhersage von A ist es nicht? A sollte das tatsächlich erwartete Ergebnis sein, also warum ist es als Eingabe definiert anstatt als ein numpiges Array, das Werte annimmt? – tryingtolearn

Verwandte Themen