2016-11-09 5 views
2

Ich versuche das siamesische Netzwerk zu verstehen, das im Keras Repository als example angegeben ist.Kann nicht verstehen, wie Lambda-Schicht in Keras arbeiten?

Die Netzwerke fügen eine Lambda als Ausgabe an das Modell durch die folgende Zeile

model = Model(input=[input_a, input_b], output=distance) 

wo Abstand wie Lambda als

definiert ist
distance = Lambda(euclidean_distance, output_shape=eucl_dist_output_shape)([processed_a, processed_b]) 

Die beiden anderen Funktion wie folgt definiert:

def euclidean_distance(vects): 
    x, y = vects 
    return K.sqrt(K.sum(K.square(x - y), axis=1, keepdims=True)) 


def eucl_dist_output_shape(shapes): 
    shape1, shape2 = shapes 
    return (shape1[0], 1) 

Nun kann ich nicht verstehen, was diese Lambda-Schicht an die nächste Schicht weitergibt .

Keras definiert als Lambda

Lambda(function,output_shape,arguments) 

also denke ich, die Eingabe vom vorhergehenden Schicht kommt, wird durch Funktion verarbeitet und zurückgegeben als die Ausgabe in der gewünschten Form. Jetzt würde mir die Funktion euklidische Distanz, wenn sie angewendet wird, einen Zeilenvektor zurückgeben, der den Abstand jedes Paares in der aktuellen Gruppe darstellt. So ist die Dimension eines solchen Ergebnis wäre so etwas wie

batch_size * 1 

Nun wird die Funktion eucl_dist_output_shape verwandeln würde seine Form, was ich nicht in der Lage bin zu verstehen, was genau diese Funktion ist hier tun und was es ist, zu berechnen, was ist return (shape1[0],1) erreicht in dieser Funktion?

Antwort

0

Der Eingang für diese Lambda-Schicht ist [processed_a, processed_b].

Die Funktion, die es ausführt, ist euclidean_distance, und was es weitergibt, ist K.sqrt(K.sum(K.square(x - y), axis=1, keepdims=True)). Es wird x und y vom Eingang genommen.

Dies ist die einzige echte Verarbeitung, die vor sich geht. Dies ist derjenige, der die Form entweder steuert.

Die Eingänge scheinen von Form (batch, n) zu sein, und die Ausgaben werden (batch,1) sein. Die n wird wegen der sum Funktion mit axis=1 verschwinden. Aber da es keepdims=True verwendet, wird die Achse als 1 beibehalten.

Jetzt ist die Ausgabeform nicht wirklich etwas tun. Diese Funktion ist nicht erforderlich, wenn Sie Tensorflow verwenden. Aber wenn du Theano benutzt, brauchst du es, weil Theano die Formen aus den Berechnungen nicht verstehen kann.

Diese Funktion gibt nur die Form (batch,1) zurück, weil der Ersteller der Funktion weiß, dass dies die Ausgabeform ist.

Der Eingang dieser Ausgangsformfunktion ist [shapeOfProcessed_a, shapeOfProcessed_b]. Sie nehmen nur die Stapelgröße von einer der Eingabeformen.