我如何看待两个Keras张量的平方差异?

时间:2017-05-31 21:24:36

标签: keras

我有一个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)(即第一维是批量大小,第二维代表128个隐藏元素。)

Keras采用两种张量差异的正确方法是什么?

2 个答案:

答案 0 :(得分:4)

我没有资格说明这是否正确,但以下代码会根据您的要求计算(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.]]]]

答案 1 :(得分:2)

正如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])