如何取两个 Keras 张量的平方差?



我有一个 KerasModel,它计算两个张量,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 中取两个张量之差的正确方法是什么?

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

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

最新更新