我只想实现一个自定义层,用于获取两个向量的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)
但我也犯了同样的错误。在
我发现keras中的Lambda层只能接受一个参数作为输入,所以我必须将Lambda函数作为一个函数输入到一个列表中,并将两个张量作为一个列表传入。我还意识到我不能使用l2范数,因为它只给我一个数字来运行最后的层,我必须使用一个不同的距离函数,它可以给出两个向量之间的元素方向的距离,而不是欧几里德距离。我现在使用的是卡平方距离,所以我的代码看起来是这样的,它运行(但是它给我的损失是nan,但我想这是另一个问题。至少可以运行):
相关问题 更多 >
编程相关推荐