2017-09-21 3 views
1

Ich erstelle eine benutzerdefinierte Verlust in Keras. Nehmen wir an, dass wir die folgenden haben:Mit benutzerdefinierten Verlust und Vorhersage in Keras

def a_loss(X): 
    a, b = X 
    loss = . . . 
    return loss 

def mean_loss(y_true, y_pred): 
    return K.mean(y_pred - 0 * y_true) 

Und das Modell geht in etwa so:

       . 
          . 
          . 
z1 = Dense(shape1, activation="linear")(conv_something) 
z2 = Dense(shape1, activation="linear")(conv_something2) 
loss = a_loss([z1, z2]) 

model = Model(
    inputs=[input1, input2, ..], 
    outputs=[loss]) 

model.compile(loss=mean_loss,optimizer=Adam()) 

nun dieses hypothetische Modell compines normal. Aber wenn ich die trainierten Modell zu verwenden, etwas vorherzusagen, ich bin mit:

model.predict(X_dictionary) 

Ich gehe davon aus, dass die Ausgabe der oben genannten ist die loss (Ausgabe von a_loss Funktion) .RIGHT? Wenn mich das nicht korrigiert.

Was ich für die Ausgabe von model.predict möchte, ist die z2. Suche in der API u mehrere Ausgänge verwenden können:

model = Model(
    inputs=[sequence_input_desc, sequence_input_title_positive, sequence_input_title_negative], 
    outputs=[loss, z2] 
) 

Aber die oben trainieren, um sowohl loss und z2 zu minimieren. Was ich will, ist nur zu trainieren, loss zu minimieren und die Vorhersagefunktion z2 auszugeben. Eine Möglichkeit, das Dokument zu überprüfen, ist die Verwendung in der compile, aber es funktioniert nicht. Es gibt den Fehler aus The model expects 2target arrays, but only received one array. Found: array with shape ..

Eine Idee, wie es geht?

Antwort

1

Nach dem Training erfolgt können Sie einfach ein neues Modell erstellen, das die gleichen Schichten verwendet aber eine andere Ausgabe:

model = Model(
    inputs=[input1, input2, ..], 
    outputs=[z2]) 

Es wird die gelernten Gewichte wieder verwenden, wie sie in den Schichten gespeichert sind, nicht im Modell (es ist nur ein Container).

Sie können dann model.predict verwenden, um die Ergebnisse wie gewohnt zu erhalten.

+0

Sie meinen, dass kurz nach 'model.fit (x, y ..)' kann ich zuweisen 'model2 = Model (eingaben = [input1, ..], outputs = [z2])' und das 'model2' wird die Gewichte des trainierten "Modells" erben? Oder muss ich die Architektur des Modells neu schreiben und nach Aufruf 'Model' mit dem anderen Ausgang? –

+1

Wenn Sie die "Architektur" (die Layer) neu definieren, werden Sie die Gewichte verlieren. Sie müssen nur ein neues Modell definieren, wie ich in der Antwort gezeigt habe. – nemo

+0

ja. Ich finde es heraus, indem ich später die Ausgabe der Gewichte teste. Danke. –

Verwandte Themen