计算Keras中两个张量之间的余弦相似度

Ind*_*Dev 4 python keras

我一直在学习如何制作word2vec模型的教程.

本教程使用这段代码:

similarity = merge([target, context], mode='cos', dot_axes=0)(没有给出其他信息,但我想这来自keras.layers)

现在,我对该merge方法进行了一些研究,但我找不到多少.据我所知,它已被许多功能所取代layers.Add(), layers.Concat()....

我该怎么用?有.Dot(),有一个axis参数(似乎是正确的),但没有mode参数.

在这种情况下我可以使用什么?

Kyl*_*ira 19

DotKeras中的图层现在使用normalize = True参数支持内置余弦相似性.

来自Keras文件:

keras.layers.Dot(axes, normalize=True)

normalize:在获取点积之前是否沿点积轴对样本进行L2标准化.如果设置为True,则点积的输出是两个样本之间的余弦接近度.

资源


isa*_*tan 15

Keras文档中有一些不清楚的事项,我认为这些内容对于理解是至关重要的:

对于keras文档中的每个函数Merge,有一个小写和大写的一个定义ie 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)
Run Code Online (Sandbox Code Playgroud)

要回答你的问题,因为Merge已被弃用,我们必须自己定义和构建一个层cosine similarity.通常,这将涉及使用那些小写函数,我们在其中包装Lambda以创建我们可以在模型中使用的层.

我在这里找到了解决方案:

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]
Run Code Online (Sandbox Code Playgroud)

根据您的数据,您可能希望删除L2规范化.关于解决方案的重要注意事项是它是使​​用Keras函数api构建的K.mean()- 例如,我认为在定义自定义层甚至丢失函数时这是必要的.

希望我很清楚,这是我的第一个SO答案!

  • 谢谢!我将添加你需要的任何未来访问者`从keras导入后端作为K`. (2认同)