python - 在 Keras 问题中实现暹罗网络

标签 python deep-learning keras lstm

我试图用 Keras 实现暹罗网络,我有两个输入数据,

X1 形状:(10000, 52) X2 形状:(10000, 600)

假设 X1 中的每个样本与 X2 中的样本相似。例如:X1[0]与X2[0]类似。因此,当两个输入合并时,我使用了“余弦相似度”。我试图使用以下代码:

def contrastive_loss(y_true, y_pred):
'''Contrastive loss from Hadsell-et-al.'06
http://yann.lecun.com/exdb/publis/pdf/hadsell-chopra-lecun-06.pdf
'''

margin = 1
return K.mean(y_true * K.square(y_pred) + (1 - y_true) * K.square(K.maximum(margin - y_pred, 0)))

left_branch = Sequential()
left_branch.add(Embedding(1000, 32, input_length=52))
left_branch.add(LSTM(64))
left_branch.add(Dense(256))

right_branch = Sequential()
right_branch.add(Embedding(1000, 32, input_length=600))
right_branch.add(LSTM(64))
right_branch.add(Dense(256))

merged = Merge([left_branch, right_branch], mode='cos',dot_axes=1)

final_model = Sequential()
final_model.add(merged)
final_model.summary()

x1 = np.random.randint(1000, size=(10000, 52))
x2 = np.random.randint(1000, size=(10000, 600))
y = np.ones((10000,),dtype=np.int)

final_model.compile(optimizer='adam', loss=contrastive_loss)

final_model.fit([x1, x2], y, nb_epoch=2, batch_size=32)

getoutput_t = K.function([merged.layers[0].layers[0].input], [merged.layers[0].layers[2].output])

getoutput_d = K.function([merged.layers[1].layers[0].input], [merged.layers[1].layers[2].output])

t1 = getoutput_t([x1])[0]

t2 = getoutput_d([x2])[0]

我的问题是:训练后,t1[0] 与 t1[1] 非常相似,但与 t2[0] 非常不同。我检查了 t1 和 t2 的输出,生成的输出很奇怪:

t1:

数组([[ -3.48182112e-01, 6.57344190e-03, -6.75882818e-03, 4.11706511e-03、-2.41146213e-03、-1.14028137e-02、 2.49683809e+00,-9.19755269e-03,-2.37327255e-02....]

[-3.48182231e-01、6.57369522e-03、-6.75880583e-03、 4.11719829e-03、-2.41167075e-03、-1.14026833e-02、 2.49683785e+00, -9.19752941e-03, -2.37324722e-02,...] ......]])

t1[0] 与 t1[1] 几乎相同,t2 中也发现了同样的问题。

因此,我不得不担心:

我的连体模型有什么问题吗? (例如损失函数或层设计)

到目前为止我还没有负采样,因此目标值为“1”,这是问题所在吗?

最佳答案

只有正对才是问题

如果通过

the target values are "1", is this the issue?

你的意思是你没有负数/不相似对,那么是的,这是一个问题。如果这不是您的情况,请忽略本答案的其余部分。

为什么只有正对是一个问题

paper 的第 3 页上在您的源代码中引用:

The contrastive term involving dissimilar pairs, LD, is crucial. Simply minimizing DW (X~ 1, X~ 2) over the set of all similar pairs will usually lead to a collapsed solution, since DW and the loss L could then be made zero by setting GW to a constant. Most energy-based models require the use of an explicit contrastive term in the loss function.

其中“对比项”是取决于负对的损失函数项。等式 3 中的 L_D。请注意 GW 是从输入向量到输出向量的模型/映射。基本上,在没有负对的情况下,学习者可以通过学习一个简单的模型来达到其优化目标(减少到最小化相似/正对之间的距离),该模型仅将输入向量映射到相同的输出向量。

直观上,对比损失通过迫使模型平衡最小化相似对之间的距离,同时使用 GW 中设置的相同参数最大化(达到一定限度)不同相似对之间的距离,从而帮助您找到最佳模型。

如果没有负对,如何生成负对

如果您没有负对,您可以尝试通过随机配对数据集中的元素来生成负对。

主要 Keras 存储库中有一个使用对比损失的示例:

https://github.com/fchollet/keras/blob/master/examples/mnist_siamese_graph.py

关于python - 在 Keras 问题中实现暹罗网络,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40510703/

相关文章:

python - 在 Django 中,如何从单个表单字段填充通用关系?

python - Keras - 使用 LSTM 进行模式预测

python - 在 Keras 中进行文本分类时出错

machine-learning - 使用人工神经网络的模型可以被视为多元线性回归模型吗?

python - 在 Keras 中串联训练多个模型以进行超参数优化

javascript - 用于编码 URL 的 Javascript 和 Python 结果不一致

python - 下拉菜单启动功能

python - 使用 yum 安装 python-devel

python-3.x - 连接模型时,Keras 出现无梯度错误

deep-learning - Keras LSTM : dropout vs recurrent_dropout