我正在尝试对两个均为200维的张量实现成对的铰链损耗。目标是将两个张量的余弦相似度用作评分函数,并使用成对铰链损失训练模型。
该模型接受两个文本输入,它们已转换为两个200维向量。 (第二个文本输入是第一个文本输入的正确标签。)
有人可以告诉我如何在Keras中实现这一点吗?
def cosine_distance(vests):
jd, jt = vests
jd = K.l2_normalize(jd, axis=-1)
jt = K.l2_normalize(jt, axis=-1)
return -K.mean(jd * jt, axis=-1, keepdims=True)
def cos_dist_output_shape(shapes):
shape1, shape2 = shapes
return (shape1[0],1)
上面是我用于lambda层以计算余弦相似度的代码,jd是第一个文本输入,而jt是第二个文本输入。
谢谢
答案 0 :(得分:0)
IIUC(CMIIW),您的模型需要两个输入并输出两个张量:
ip1, ip2 = Input(shape=(20,)), Input(shape=(20,))
backbone = Sequential()
backbone.add(Dense(50, activation='relu'))
backbone.add(Dense(200, activation='sigmoid'))
op1, op2 = backbone(ip1), backbone(ip2)
model = Model(inputs=[ip1, ip2], outputs=[op1, op2])
要计算这两个输出张量的余弦距离,您的损失函数需要两个输入:
def cosine_distance(jd, jt):
jd = K.l2_normalize(jd, axis=-1)
jt = K.l2_normalize(jt, axis=-1)
return -K.mean(jd * jt, axis=-1, keepdims=True)
最后用这种特定的损失进行编译:
model.compile('sgd', loss=cosine_distance)