Tensorflow 使用半硬三元组时,损耗降低

Tensorflow 使用半硬三元组时,损耗降低,tensorflow,neural-network,conv-neural-network,Tensorflow,Neural Network,Conv Neural Network,这是对三胞胎学习的简短回顾。 我使用三个具有共享权重的卷积神经网络来生成人脸嵌入(锚定,正,负),并描述损失 三重态损耗: anchor_output = ... # shape [None, 128] positive_output = ... # shape [None, 128] negative_output = ... # shape [None, 128] d_pos = tf.reduce_sum(tf.square(anchor_output - positive_out

这是对三胞胎学习的简短回顾。 我使用三个具有共享权重的卷积神经网络来生成人脸嵌入(锚定),并描述损失

三重态损耗:

anchor_output = ...  # shape [None, 128]
positive_output = ...  # shape [None, 128]
negative_output = ...  # shape [None, 128]

d_pos = tf.reduce_sum(tf.square(anchor_output - positive_output), 1)
d_neg = tf.reduce_sum(tf.square(anchor_output - negative_output), 1)

loss = tf.maximum(0., margin + d_pos - d_neg)
loss = tf.reduce_mean(loss)
当我只选择硬三元组(
distance(锚定,正)
)时,损失非常小:0.08。 当我选择所有三元组时,损失变得更大0.17855。这些只是10000个三重态对的测试值,但我在实际集合(600000个三重态对)上得到了类似的结果

为什么会发生这种情况?对吗


我使用的是有动量的SGD,从学习率0.001开始,你服用tf.sqrt(d_pos)和tf.sqrt(d_neg)后得到了什么?

服用tf.sqrt(d_pos)和tf.sqrt(d_neg)后得到了什么?

这里是关于三胞胎硬度的术语的快速回顾:

  • 简单三联体:由于
    d(a,p)+边距
  • 硬三联体:负向比正向更靠近锚定的三联体,即
    d(a,n)
  • 半硬三联体:负片不比正片更靠近锚点,但仍有正损耗的三联体:
    d(a,p)

你在这里描述的是:

当我仅选择硬三元组时(距离(锚定,正)<距离(锚定,负))


实际上是选择半硬三胞胎和简单三胞胎。您正在移除硬三胞胎,因此您的损失更小。

以下是有关三胞胎硬度的术语的简要概述:

  • 简单三联体:由于
    d(a,p)+边距
  • 硬三联体:负向比正向更靠近锚定的三联体,即
    d(a,n)
  • 半硬三联体:负片不比正片更靠近锚点,但仍有正损耗的三联体:
    d(a,p)

你在这里描述的是:

当我仅选择硬三元组时(距离(锚定,正)<距离(锚定,负))


实际上是选择半硬三胞胎和简单三胞胎。您正在移除硬三胞胎,因此您的损失更小。

请原谅我的noobness请原谅我的noobness