Keras lambda层为l2范数

时间:2017-11-07 03:50:21

标签: python keras

我只想实现一个自定义图层,用于获取两个矢量(当然是匹配尺寸)的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

我显然只放了两个参数,out1和out2,为什么python认为我给出了3个参数? 我用lambda函数试过这个:

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

但我得到同样的错误。

1 个答案:

答案 0 :(得分:3)

我发现keras中的Lambda层只能接受一个参数作为输入,所以我必须将lambda函数作为函数输入到列表中,并将两个张量作为列表传递。我也意识到我不能使用l2范数,因为它只给我一个数字来运行最后一层,我必须使用一个不同的距离函数,它可以给出一个元素明智的距离而不是两个向量之间的欧几里德距离。我现在正在使用卡方距离,所以我的代码看起来像这样并运行(但是它给了我一个损失,但这是一个不同的问题,我想。至少它运行):

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