如何在Keras中实现成对铰链丢失?

时间:2019-01-14 18:27:55

标签: keras deep-learning nlp

我正在尝试对两个均为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是第二个文本输入。

谢谢

1 个答案:

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