簡體   English   中英

Keras lambda層為l2范數

[英]Keras lambda layer for l2 norm

我只想實現一個自定義圖層,用於獲取兩個矢量(當然是匹配尺寸)的l2范數,這兩個矢量由keras中的2個不同模型輸出。 我正在使用編寫keras函數的函數API方法,所以我有類似的東西:

    inp1 = Input(someshape)
    X = Conv2D(someargs)(inp1)
    ...
    ...
    out1 = Dense(128)(X)

    inp2 = Input(someshape)
    Y = Conv2D(someargs)(inp2)
    ...
    ...
    out2 = Dense(128)(Y)

然后我想取出out1和out2之間距離的l2范數並將其進一步輸入另一個網絡,所以我有一個lambda層,如:

    l2dist = keras.layers.Lambda(l2dist)(out1,out2)

其中l2dist是定義為的函數:

    def l2dist(x,y):
        return K.sqrt(K.sum((x-y)**2))

但我得到一個錯誤的l2dist = ...行說:

    TypeError: __call__() takes 2 positional arguments but 3 were given

我顯然只放了2個參數,out1和out2,為什么python認為我給出了3個參數?
我用lambda函數試過這個:

    l2dist = keras.layers.Lambda(lambda x,y: K.sqrt(K.sum((x-y)**2)))(out1,out2)

但我得到了同樣的錯誤。

我發現keras中的Lambda層只能接受一個參數作為輸入,所以我必須將lambda函數作為函數輸入到列表中,並將兩個張量作為列表傳遞。 我也意識到我不能使用l2范數,因為它只給我一個數字來運行最后一層,我必須使用一個不同的距離函數,它可以給出一個元素明智的距離而不是兩個向量之間的歐幾里德距離。 我現在正在使用卡方距離,所以我的代碼看起來像這樣並且它運行(但是它給了我一個損失,但這是一個不同的問題我猜。至少它運行):

    chisqdist = keras.layers.Lambda(lambda x: (x[0]-x[1])**2/(x[0]+x[1]))([out1,out2])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM