首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >l2范数的层

l2范数的层
EN

Stack Overflow用户
提问于 2017-11-07 03:50:20
回答 1查看 5.9K关注 0票数 4

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

代码语言:javascript
复制
    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层,类似于:

代码语言:javascript
复制
    l2dist = keras.layers.Lambda(l2dist)(out1,out2)

其中l2dist是定义为:

代码语言:javascript
复制
    def l2dist(x,y):
        return K.sqrt(K.sum((x-y)**2))

但是我得到了l2dist =.线上写着:

代码语言:javascript
复制
    TypeError: __call__() takes 2 positional arguments but 3 were given

显然,我只提出了两个参数,out1和out2,为什么python认为我给出了3个参数?

我用lambda函数尝试过这样的方法:

代码语言:javascript
复制
    l2dist = keras.layers.Lambda(lambda x,y: K.sqrt(K.sum((x-y)**2)))(out1,out2)

但我也犯了同样的错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-07 05:32:11

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

代码语言:javascript
复制
    chisqdist = keras.layers.Lambda(lambda x: (x[0]-x[1])**2/(x[0]+x[1]))([out1,out2])
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47149675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档