gpt4 book ai didi

python - 用于 l2 规范的 Keras lambda 层

转载 作者:太空宇宙 更新时间:2023-11-03 15:50:27 25 4
gpt4 key购买 nike

我只想实现一个自定义层,以获取两个向量(当然具有匹配的维度)的 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 范数,因为它只给我 1 个数字来运行最后一层,我必须使用不同的距离函数,它可以给出元素明智的距离,而不是两个向量之间的欧几里得距离。我现在正在使用卡方距离,所以我的代码看起来像这样并且它运行了(但它给我 nan 作为损失,但我想这是一个不同的问题。至少它运行):

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

关于python - 用于 l2 规范的 Keras lambda 层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47149675/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com