2017-09-11 41 views
0

我想在keras中使用lambda層來返回兩個向量的歐幾里得距離。代碼是:keras/theano-如何在lambda中返回常量

def distance(x): 
    a=x[0] 
    b=x[1] 
    dist=np.linalg.norm(a-b) 
    return dist 
dist=Lambda(distance,output_shape=(1,1)name='dist')([x,y]) 

該圖層的輸入是兩個向量(100,1,8192)。 100是批次。理論上輸出是一個常數。我想用DIST因爲這種模式類似的輸出:

model = Model(inputs=[probe_input_car,probe_input_sign,gallary_input_car,gallary_input_sign], outputs=dist, name='fcn')` 

當我運行這個模型中,會出現一個錯誤:

ValueError: Input dimension mis-match. (input[0].shape[2] = 1, input[1].shape[2] = 8192) 
Apply node that caused the error: Elemwise{Composite{EQ(i0, RoundHalfToEven(i1))}}(/dist_target, Elemwise{Composite{sqrt(sqr(i0))}}.0) 
Toposort index: 92 
Inputs types: [TensorType(float32, 3D), TensorType(float32, 3D)] 
Inputs shapes: [(100, 1, 1), (100, 1, 8192)] 
Inputs strides: [(4, 4, 4), (32768, 32768, 4)] 
Inputs values: ['not shown', 'not shown'] 
Outputs clients: [[Sum{acc_dtype=int64}(Elemwise{Composite{EQ(i0, RoundHalfToEven(i1))}}.0)]] 

我認爲這是由拉姆達層的output_shape引起。我應該如何設置圖層的output_shape。因爲我使用theano作爲後端,它不能計算output_shape本身。 如果它不是由output_shape引起的。錯誤在哪裏?

+0

你可以發佈你「運行」這個模型的路線嗎? –

回答

0

看來你只是得到了矢量的錯誤部分。

有消息稱它試圖計算與形狀的兩個張量的東西:

  • (100,1,1)
  • (100,1,8192)基於

您輸入列表,你有[car,signal,car2,signal2]。我相信您可能需要在car x carsignal x signal之間進行一些操作。

所以,你的拉姆達層或許應該開始爲兩種:

a = x[0] 
b = x[2] 

或:

a = x[1] 
b = x[3] 

提示:如果你能找到一個同等功能在keras backend算得了什麼你想,它可能會更好。我想知道如何使用numpy函數沒有「斷開」錯誤信息。

0

發生此錯誤是因爲您在Theano張量上使用了np.linalg.norm()。它不會拋出錯誤,但輸出絕對不是您所期望的。

爲避免此錯誤,請改爲使用Keras後端功能。例如,

dist = K.sqrt(K.sum(K.square(a - b), axis=-1, keepdims=True)) 

發生了什麼事內部np.linalg.norm(X):

  1. x = np.asarray(x)包裹a - b到長度爲1的陣列(D型細胞object的),其唯一的元件是Theano形狀張量(100,1,8192)。
  2. sqnorm = np.dot(x, x):回想點積的定義。當你使用自己的長度爲1的數組時,實際上你計算的是(a - b) * (a - b),或者是a - b的元素方塊。這就是爲什麼你的錯誤的第二行有sqr(i0)
  3. np.sqrt(sqnorm)被返回。所以你可以看到sqrt(sqr(i0))出現在你的錯誤中。
  4. 因此,np.linalg.norm(a - b)的輸出是形狀(100,1,8192)的張量,而不是(100,1,1)。

此外,如果您仔細查看the codeElemwise{Composite{EQ(i0, RoundHalfToEven(i1))}}只是準確性。

def binary_accuracy(y_true, y_pred): 
    return K.mean(K.equal(y_true, K.round(y_pred)), axis=-1) 

所以錯誤消息是想告訴你,還有的y_truey_pred形狀之間的不匹配。雖然y_true具有形狀(100,1,1),但y_pred具有形狀(100,1,8192),因爲np.linalg.norm()給出Theano張量的結果不正確。

+0

感謝您的回答。它在使用你的方法後開始工作。 –