Python 三重网络、损耗函数和等距离
我目前正在实施一个三重网络,以识别两幅图像是否描述了相同的3d模型,但我对结果有一些问题,锚定正片之间的距离始终等于锚定负片之间的距离 这里是我的损失函数的代码: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)
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,我们可以计算负面示例的数量,这些示例与锚的距离大于锚与正+边距之间的距离吗