2017-03-24 130 views
2

我正在嘗試實現一個將產生自定義丟失函數的Lambda圖層。在圖層中,我需要能夠將批次中的每個元素與批次中的每個其他元素進行比較,以便計算成本。理想情況下,我想代碼看起來是這樣的:Keras Lambda圖層自定義丟失

for el_1 in zip(y_pred, y_true): 
    for el_2 in zip(y_pred, y_true): 
     if el_1[1] == el_2[1]: 
      # Perform a calculation 
     else: 
      # Perform a different calculation 

當我真的這樣,我得到:

TypeError: TensorType does not support iteration. 

我使用Keras版本2.0.2與Theano版本0.9.0後端。我明白我需要使用Keras張量函數來做到這一點,但我無法弄清楚任何張量函數都是我想要的。

此外,我很難理解我的Lambda函數應該返回什麼。它是每個樣品總成本的張量,還是僅僅是該批次的總成本?

幾天來,我一直在毆打我的頭。任何幫助深表謝意。

+0

沒關係,用Keras回調,我確定Lambda應該返回什麼 - 每批一個標量。但是,我仍然無法弄清楚在訓練過程中如何迭代張量。我認爲這可能與切片有關... – gaw89

+0

你看過我的回答嗎? – nemo

+0

對不起,週末過去了。剛接受。非常感謝! – gaw89

回答

2

Keras中的張量通常至少有2個維度,批次和神經元/單位/節點/ ...維度。因此,128個訓練有64個批量的單元的密集層因此會產生形狀爲(64,128)的張量。

您的LambdaLayer會像其他圖層一樣處理張量,在您之前的密集圖層將會爲您提供一張形狀爲(64,128)的張量來處理張量。處理張量的工作方式類似於numpy數組上的計算(或任何其他矢量處理庫):指定一個操作以在數據結構中的所有元素上進行廣播。

例如,您的自定義成本是批中每個值的差異,你會實現它,像這樣:

cost_layer = LambdaLayer(lambda a,b: a - b) 

-操作廣播在ab將返回提供了合適的結果尺寸匹配。結論是,你真的只能爲每個值指定一個操作。如果您想執行更復雜的任務(例如基於該值的計算),則需要執行兩個操作的單個操作並相應地應用正確的操作,即操作switch

K.switch語法

K.switch(condition, then_expression, else_expression) 

例如,如果要減去這兩個值時a != b但增加了他們時,他們是平等的,你可以這樣寫:

import keras.backend as K 
cost_layer = LambdaLayer(lambda a,b: K.switch(a != b, a - b, a + b))