Python 三重网络、损耗函数和等距离

Python 三重网络、损耗函数和等距离,python,tensorflow,loss-function,triplet,Python,Tensorflow,Loss Function,Triplet,我目前正在实施一个三重网络,以识别两幅图像是否描述了相同的3d模型,但我对结果有一些问题,锚定正片之间的距离始终等于锚定负片之间的距离 这里是我的损失函数的代码: 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)

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

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

    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和DPO是正负对的距离)

这么多问题:

  • 如何调整保证金?所以这两个距离之间的差异很小,我必须留一个很小的余量

  • 因为两个距离相等,所以损耗等于裕度。如何避免这个问题

  • 如何测量三重网络的精度?例如,如果一批大小为100,我们可以计算负面示例的数量,这些示例与锚的距离大于锚与正+边距之间的距离吗

非常感谢你的回答