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

我一直在遵循一个教程,该教程显示了如何制作word2vec模型。

本教程使用以下代码:

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

现在,我已经对merge方法进行了一些研究,但是找不到很多。
据我了解,它已被许多功能(例如layers.Add(), layers.Concat()...)取代。

我应该使用什么?有一个.Dot(),它有一个axis参数(看起来是正确的),但没有mode参数。

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

python大神给出的解决方案

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答案!

Python sqlite3数据库已锁定 - python

我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…

Python pytz时区函数返回的时区为9分钟 - python

由于某些原因,我无法从以下代码中找出原因:>>> from pytz import timezone >>> timezone('America/Chicago') 我得到:<DstTzInfo 'America/Chicago' LMT-1 day, 18:09:00 STD…

keras中的自定义RMSPE损失函数 - python

我正在尝试在keras中定义我自己的损失函数,即均方根百分比误差。 RMSPE定义为:我已经将损失函数定义为:from keras import backend as K def rmspe(y_true, y_pred): sum = K.sqrt(K.mean(K.square( (y_true - y_pred) / K.clip(K.abs(y_tr…

用大写字母拆分字符串,但忽略AAA Python Regex - python

我的正则表达式:vendor = "MyNameIsJoe. I'mWorkerInAAAinc." ven = re.split(r'(?<=[a-z])[A-Z]|[A-Z](?=[a-z])', vendor) 以大写字母分割字符串,例如:'我的名字是乔。 I'mWorkerInAAAinc”变成…

如何打印浮点数的全精度[Python] - python

我编写了以下函数,其中传递了x,y的值:def check(x, y): print(type(x)) print(type(y)) print(x) print(y) if x == y: print "Yes" 现在当我打电话check(1.00000000000000001, 1.0000000000000002)它正在打印:<…