在线魔法世代 - 我做得对吗?

时间:2017-08-23 12:16:24

标签: tensorflow neural-network conv-neural-network

我正在尝试训练具有三重态丢失的卷积神经网络(更多关于三重态丢失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%)。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

网络性能不佳的原因有很多。根据我的理解,你的三重生成方法很好。以下提示可能有助于提高您的表现。

模型

在深度度量学习中,人们通常在ImageNet分类任务上使用一些预先训练的模型,因为这些模型非常具有表现力并且可以为图像生成良好的表示。您可以根据这些预先训练的模型对模型进行微调,例如VGG16,GoogleNet,ResNet。

如何罚款

即使您拥有良好的预训练模型,通常也很难在您自己的数据集上使用这些模型直接优化三重态损失。由于这些预先训练的模型是在ImageNet上训练的,如果您的数据集与ImageNet有很大不同,您可以先使用数据集上的分类任务对模型进行微调。一旦您的模型在自定义数据集上的分类任务上表现得相当好,您就可以将分类模型用作三重网络的基础网络(可能稍微调整一下)。它通常会带来更好的表现。

超级参数

学习率,动量,weight_decay等超级参数对于良好的表现也是非常重要的(学习率可能是最重要的因素)。因为您正在进行微调,而不是从头开始训练网络。您应该使用较小的学习率,例如lr=0.001lr=0.0001。对于动力,0.9是一个不错的选择。对于weight_decay,人们通常使用0.0005或0.00005。

如果添加一些完全连接的图层,则对于这些图层,学习率可能高于其他图层(例如0.01)。

要细化哪一层

由于您的网络有多个图层,您需要决定要微调哪个图层。研究人员发现,网络中的较低层只产生一些通用特征,如线条或边缘。通常,人们会冻结较低层的更新,只更新上层的权重,这往往会产生面向任务的功能。您应该尝试从不同的较低层开始优化,并查看哪个设置效果最佳。

参考

  1. Fast rcnn(第4.5节,要进行微调)
  2. Deep image retrieval(第5.2节,微调表示的影响)

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

我希望我对此是正确的,如果不是,请纠正我。