计算网络的两个输出之间的余弦接近损耗

时间:2017-04-08 19:09:50

标签: deep-learning keras loss

我正在使用Keras 2.0.2 Functional API(Tensorflow 1.0.1)来实现一个需要多个输入并产生两个输出ab的网络。我需要使用cosine_proximity loss来训练网络,因此ba的标签。我该怎么做?

在这里分享我的代码。最后一行model.fit(..)是有问题的部分,因为我本身没有标记数据。标签由模型本身生成。

from keras.models import Model
from keras.layers import Input, LSTM
from keras import losses

shared_lstm = LSTM(dim)

q1 = Input(shape=(..,.. ), name='q1')
q2 = Input(shape=(..,.. ), name='q2')
a = shared_lstm(q1)
b = shared_lstm(q2)
model = Model(inputs=[q1,q2], outputs=[a, b])
model.compile(optimizer='adam', loss=losses.cosine_proximity)

model.fit([testq1, testq2], [?????])

1 个答案:

答案 0 :(得分:3)

您可以先定义假的真实标签。例如,将其定义为输入数据大小的一维数组。

现在出现了损失功能。您可以按如下方式编写。

def my_cosine_proximity(y_true, y_pred):
    a = y_pred[0]
    b = y_pred[1]
    # depends on whether you want to normalize
    a = K.l2_normalize(a, axis=-1)
    b = K.l2_normalize(b, axis=-1)        
    return -K.mean(a * b, axis=-1) + 0 * y_true

我将y_true乘以零,并将其添加,以便Theano确实不会丢失输入警告/错误。

您应该正常调用fit功能,即包含您的假地面真相标签。

model.compile('adam', my_cosine_proximity) # 'adam' used as an example optimizer 
model.fit([testq1, testq2], fake_y_true)