2016-11-09 82 views
2

我想了解keras倉庫中作爲example給出的連體網絡。無法理解lambda層如何在keras中工作?

的網絡添加lambda作爲輸出該模型,通過下面的行

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

其中距離被定義爲lambda作爲

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

另外兩個函數定義爲:

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) 

現在我無法理解這個lambda層傳遞到下一層。

Keras定義lambda作爲

Lambda(function,output_shape,arguments) 

所以我想從前面的層來的輸入由功能處理並返回,如所希望的形狀的輸出。 現在根據我應用的歐幾里得距離函數將返回一個行向量,表示當前批次中每對的距離。所以,這樣的結果的尺寸會是這樣的

batch_size * 1 

現在的功能eucl_dist_output_shape將改變它的形狀,我所無法理解到底是什麼是這個功能在這裏做什麼它是計算,什麼是return (shape1[0],1)實現這個功能嗎?

回答

0

此lambda層的輸入是[processed_a, processed_b]

它運行的功能是euclidean_distance,它傳遞的是K.sqrt(K.sum(K.square(x - y), axis=1, keepdims=True))。從輸入中取得xy

這是唯一真正的處理進行。這也是決定形狀的因素之一。

輸入看起來是形狀(batch, n),輸出將是(batch,1)n將由於sum函數axis=1而消失。但是由於它使用了keepdims=True,因此該軸將保留爲1.

現在,輸出形狀並沒有真正做任何事情。如果您使用Tensorflow,則無需使用此功能。但是如果你使用Theano,你需要它,因爲Theano無法理解計算中的形狀。

該函數只是返回形狀(batch,1),因爲函數的創建者知道這是輸出形狀。

該輸出形狀函數的輸入是[shapeOfProcessed_a, shapeOfProcessed_b]。他們只是從一個輸入形狀中獲取批量大小。