我只想实现一个自定义层,用于获取两个向量(当然是匹配维数)的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之间距离的out1范数进一步输入到另一个网络中,因此我有一个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)但我也犯了同样的错误。
发布于 2017-11-07 05:32:11
我发现keras中的Lambda层只能接受一个参数作为输入,所以我必须将lambda函数作为一个函数输入到一个列表中,并将两个张量作为一个列表传递。我还意识到我不能使用l2范数,因为这只给了我一个数字来运行最后的层,我必须使用一个不同的距离函数,它可以给出一个元素间的距离,而不是两个向量之间的欧几里德距离。我现在使用的是x平方距离,所以我的代码看起来像这样运行(但这给我带来了损失,但我想这是另一个问题。)(至少它能运行):
chisqdist = keras.layers.Lambda(lambda x: (x[0]-x[1])**2/(x[0]+x[1]))([out1,out2])https://stackoverflow.com/questions/47149675
复制相似问题