我正在尝试训练具有三重态丢失的卷积神经网络(更多关于三重态丢失here),以便生成面部嵌入(128个准确描述面部的值)。
为了只选择半硬三联体(距离(锚点,正面)<距离(锚点,负面)),我首先输入小批量中的所有值并计算距离:
distance1, distance2 = sess.run([d_pos, d_neg], feed_dict={x_anchor:input1, x_positive:input2, x_negative:input3})
然后我选择输入的索引,其距离与上述公式相符:
valids_batch = compute_valids(distance1, distance2, batch_size)
函数 compute_valids :
def compute_valids(distance1, distance2, batch_size):
valids = list();
for q in range(0, len(distance1)):
if(distance1[q] < distance2[q]):
valids.append(q)
return valids;
然后我只从具有此过滤功能返回的索引的训练示例中学习:
input1_valid = [input1[q] for q in valids_batch]
input2_valid = [input2[q] for q in valids_batch]
input3_valid = [input3[q] for q in valids_batch]
_, loss_value, summary = sess.run([optimizer, cost, summary_op], feed_dict={x_anchor:input1_valid, x_positive:input2_valid, x_negative:input3_valid})
将优化程序定义为:
model1 = siamese_convnet(x_anchor)
model2 = siamese_convnet(x_positive)
model3 = siamese_convnet(x_negative)
d_pos = tf.reduce_sum(tf.square(model1 - model2), 1)
d_neg = tf.reduce_sum(tf.square(model1 - model3), 1)
cost = triplet_loss(d_pos, d_neg)
optimizer = tf.train.AdamOptimizer(learning_rate = 1e-4).minimize( cost )
但有些事情是错误的,因为准确度非常低(50%)。
我做错了什么?
答案 0 :(得分:1)
网络性能不佳的原因有很多。根据我的理解,你的三重生成方法很好。以下提示可能有助于提高您的表现。
在深度度量学习中,人们通常在ImageNet分类任务上使用一些预先训练的模型,因为这些模型非常具有表现力并且可以为图像生成良好的表示。您可以根据这些预先训练的模型对模型进行微调,例如VGG16,GoogleNet,ResNet。
即使您拥有良好的预训练模型,通常也很难在您自己的数据集上使用这些模型直接优化三重态损失。由于这些预先训练的模型是在ImageNet上训练的,如果您的数据集与ImageNet有很大不同,您可以先使用数据集上的分类任务对模型进行微调。一旦您的模型在自定义数据集上的分类任务上表现得相当好,您就可以将分类模型用作三重网络的基础网络(可能稍微调整一下)。它通常会带来更好的表现。
学习率,动量,weight_decay等超级参数对于良好的表现也是非常重要的(学习率可能是最重要的因素)。因为您正在进行微调,而不是从头开始训练网络。您应该使用较小的学习率,例如lr=0.001
或lr=0.0001
。对于动力,0.9是一个不错的选择。对于weight_decay,人们通常使用0.0005或0.00005。
如果添加一些完全连接的图层,则对于这些图层,学习率可能高于其他图层(例如0.01)。
由于您的网络有多个图层,您需要决定要微调哪个图层。研究人员发现,网络中的较低层只产生一些通用特征,如线条或边缘。通常,人们会冻结较低层的更新,只更新上层的权重,这往往会产生面向任务的功能。您应该尝试从不同的较低层开始优化,并查看哪个设置效果最佳。
答案 1 :(得分:1)
distance(anchor, positive) < distance(anchor, negative)
这将选择三元组,其中锚和正之间的相似性大于锚和负,它与硬三元组相反。您需要使用d(a,p)>d(a,n)
表示硬三元组的示例。对于半硬三元组,您需要满足d(a,p)<d(a,n)<d(a,p)+margin
的示例。
以下是解释:https://stackoverflow.com/a/49314187/7693521
我希望我对此是正确的,如果不是,请纠正我。