【问题标题】:How do I take the squared difference of two Keras tensors?如何取两个 Keras 张量的平方差?
【发布时间】:2017-05-31 21:24:36
【问题描述】:

我有一个 Keras Model,它计算两个相同形状的张量 r1r2。我想让模型计算(r1 - r2)**2

我可以用keras.layers.add(r1, r2) 对这些张量求和。我可以用keras.layers.multiply(r1, r2) 拿一个产品。如果有 subtract 函数,我会写

r = keras.layers.subtract(r1, r2)
square_diff = keras.layers.multiply(r, r)

但似乎没有keras.layers.subtract 函数。

取而代之的是,我一直试图弄清楚如何将我的一个输入乘以一个常数 -1 张量然后相加,但我不知道如何创建那个 -1 张量。我已经尝试了多种变体

negative_one = keras.backend.constant(np.full(r1.get_shape()), -1)

这些都不起作用。大概是因为r1的维度是(?, 128)(即第一个维度是batch size,第二个维度代表128个隐藏元素)

Keras 中取两个张量之差的正确方法是什么?

【问题讨论】:

标签: keras


【解决方案1】:

正如 dhinckley 所说,您应该使用 Lambda 层。但我建议先定义您的自定义函数。有了这段代码会更清楚一点:

import keras.backend as K
from keras.layers import Lambda

def squared_differences(pair_of_tensors):
    x, y = pair_of_tensors
    return K.square(x - y)

square_diff = Lambda(squared_differences)([r1, r2])

【讨论】:

    【解决方案2】:

    我没有资格说这是否是正确的方法,但以下代码将根据您的要求计算(r1 - r2)**2。这里的关键促成因素是使用 Keras 功能 API 和 Lambda 层来反转输入张量的符号。

    import numpy as np
    from keras.layers import Input, Lambda
    from keras.models import Model
    from keras.layers import add
    
    r1 = Input(shape=(1,2,2))
    r2 = Input(shape=(1,2,2))
    
    # Lambda for subtracting two tensors
    minus_r2 = Lambda(lambda x: -x)(r2)
    subtracted = add([r1,minus_r2])
    out= Lambda(lambda x: x**2)(subtracted)
    
    model = Model([r1,r2],out)
    
    a = np.arange(4).reshape([1,1,2,2])
    b = np.ones(4).reshape([1,1,2,2])
    
    print(model.predict([a,b]))
    # [[[[ 1.  0.]
    #    [ 1.  4.]]]]
    
    print((a-b)**2)
    # [[[[ 1.  0.]
    #    [ 1.  4.]]]]
    

    【讨论】:

    • @dhinckley 很好的答案。我的问题是如何执行相同的操作,即对一系列张量进行减法和平方运算。那么,例如,lstm 层的输出?
    猜你喜欢
    • 2019-02-10
    • 2020-10-16
    • 2018-12-03
    • 2019-04-18
    • 1970-01-01
    • 1970-01-01
    • 2019-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多