我目前正在实施一个三重网络,以识别两个图像是否描述相同的三维模型,但我对结果有一些问题,锚定正之间的距离总是等于锚之间的距离 - 负。
这里是我的损失函数的代码:
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的批次,我们是否可以计算负数示例的数量,这些示例与锚点之间的距离大于锚点与正+边距之间的距离?
非常感谢您的回答!