l2标准的Keras lambda层

2024-09-27 21:25:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我只想实现一个自定义层,用于获取两个向量的l2范数(当然是匹配的维度),这两个向量是由keras中的两个不同模型输出的。我使用函数API方法编写keras函数,因此我有如下内容:

    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层,如:

^{pr2}$

其中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)

但我也犯了同样的错误。在


Tags: lambda函数范数input向量kerasdensel2
1条回答
网友
1楼 · 发布于 2024-09-27 21:25:37

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

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

相关问题 更多 >

    热门问题