我认为 Keras 文档中有一些不清楚的地方对于理解至关重要:
对于Merge 的 keras 文档中的每个函数,定义了一个小写字母和一个大写字母,即 add() 和 Add()。
在 Github 上,farizrahman4u 概述了差异:
Merge is a layer.
Merge takes layers as input
Merge is usually used with Sequential models
merge is a function.
merge takes tensors as input.
merge is a wrapper around Merge.
merge is used in Functional API
Using Merge:
left = Sequential()
left.add(...)
left.add(...)
right = Sequential()
right.add(...)
right.add(...)
model = Sequential()
model.add(Merge([left, right]))
model.add(...)
using merge:
a = Input((10,))
b = Dense(10)(a)
c = Dense(10)(a)
d = merge([b, c])
model = Model(a, d)
要回答您的问题,由于Merge 已被弃用,我们必须自己为cosine similarity 定义和构建一个层。一般来说,这将涉及使用那些小写函数,我们将它们包装在 Lambda 中,以创建可以在模型中使用的层。
我找到了解决方案here:
from keras import backend as K
def cosine_distance(vests):
x, y = vests
x = K.l2_normalize(x, axis=-1)
y = K.l2_normalize(y, axis=-1)
return -K.mean(x * y, axis=-1, keepdims=True)
def cos_dist_output_shape(shapes):
shape1, shape2 = shapes
return (shape1[0],1)
distance = Lambda(cosine_distance, output_shape=cos_dist_output_shape)([processed_a, processed_b])
根据您的数据,您可能希望移除 L2 标准化。关于该解决方案需要注意的重要一点是它是使用 Keras 函数 api 构建的,例如K.mean() - 我认为在定义自定义层甚至损失函数时这是必要的。
希望我很清楚,这是我的第一个 SO 答案!