三重态网络、损失函数和等距离

2024-04-25 03:46:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在实现一个三元组网络来识别两个图像是否描述了同一个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是具有共享权重的卷积网络的输出,并且是批量标准化的:

^{pr2}$

结果如下:

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,那么我们可以计算出与锚定点的距离大于锚点与正+边距的距离的负数吗?

非常感谢你的回答!在


Tags: posself网络距离reducetfbatch方向