3

我目前正在实现一个三元网络来识别两个图像是否描述了相同的 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 和 dpos 是正负对的距离)

这么多的问题 :

  • 如何调整边距?那么这两个距离之间的差异是如此之小,以至于我必须放一个很小的余量?

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

  • 如何衡量三元网络的准确性?例如,如果一批大小为 100,我们可以计算与锚点的距离大于锚点与正例 + 边距之间的距离的负例的数量吗?

非常感谢你的回答!

4

0 回答 0