三网络,丢失功能和等距离

时间:2018-05-31 10:15:07

标签: python tensorflow loss-function triplet

我目前正在实施一个三重网络,以识别两个图像是否描述相同的三维模型,但我对结果有一些问题,锚定正之间的距离总是等于锚之间的距离 - 负。

这里是我的损失函数的代码:

    def triplet_loss(self):
    self.d_pos = tf.reduce_sum(tf.square(self.o1 - self.o2), axis=-1)
    self.d_neg = tf.reduce_sum(tf.square(self.o1 - self.o3), axis=-1)

    loss = tf.maximum(0.0, self.margin + (self.d_pos - self.d_neg))
    loss = tf.reduce_mean(loss)

    return loss

其中o1,o2和o3是具有共享权重的卷积网络的输出,并且是批量标准化的:

output = tf.layers.batch_normalization(inputs=output, axis=-1, momentum=0.9, epsilon=0.0001, center=True, scale=True, name='batch_3_norm')

第一批结果如下:

epoch 0:    batch:0   loss 0.0000199945   dneg : 0.079995   dpos; 0.079995 

epoch 0:    batch:1   loss 0.0000201295   dneg : 0.092946   dpos; 0.092946

epoch 0:    batch:2   loss 0.0000205572   dneg : 0.110583   dpos; 0.110583 

epoch 0:    batch:3   loss 0.0000216728   dneg : 0.122692   dpos; 0.122693 

epoch 0:    batch:4   loss 0.0000202223   dneg : 0.111207   dpos; 0.111207 

epoch 0:    batch:5   loss 0.0000200346   dneg : 0.105684   dpos; 0.105684 
############### Test set : batch:5   loss 0.000 

epoch 1:    batch:0   loss 0.0000207106   dneg : 0.105736   dpos; 0.105737 

epoch 1:    batch:1   loss 0.0000200992   dneg : 0.107299   dpos; 0.107299 

epoch 1:    batch:2   loss 0.0000207007   dneg : 0.111667   dpos; 0.111667 

epoch 1:    batch:3   loss 0.0000201932   dneg : 0.109080   dpos; 0.109081 

epoch 1:    batch:4   loss 0.0000206707   dneg : 0.111295   dpos; 0.111295 

(dneg和dpos是正负夫妇的距离)

这么多问题:

  • 如何调整保证金?那么两个距离之间的差异是如此之小,以至于我必须设置一个很小的余量?

  • 因为两个距离相等,所以损失等于边距。如何避免这个问题?

  • 如何衡量三联网络的准确性?例如,如果批量为100的批次,我们是否可以计算负数示例的数量,这些示例与锚点之间的距离大于锚点与正+边距之间的距离?

非常感谢您的回答!

0 个答案:

没有答案