uni_loss

阅读您的代码,我发现您的uni_xy_loss的实现有一些问题,argsort不是说某个数值对应的是排序后的第几个。 举个例子 ,如果position 是 [0.1, 0.5, 0.3, 0.2, 0.4],那argsort的结果是 [0., 3., 2., 4., 1] ,而实际上您想要的是[0,4,2,1,3],这是不同的。正确的实现可以类似于一下: target_distribution = t.arange(position.shape[0]).type_as(rela_a) / (position.shape[0] - 1) position = t.sort(position)[0] uni_loss = t.sum((a - ta) ** 2) 虽然看起来不那么优雅,但他是对的。
感谢你指出的问题,这里的确是错误的实现。正确的实现应该用两次argsort,如a.argsort().argsort()这样的形式;或者是按照你提供的方法,直接排序。欢迎pr或者我抽时间更新一下。
我目前也在复现这篇论文,目前已经基本实现效果,其中参考了您的许多实现,非常感谢,多交流,嘻嘻!
我目前也在复现这篇论文,目前已经基本实现效果,其中参考了您的许多实现,非常感谢,多交流,嘻嘻!
好的,看你是做slam方向的,也许还有很多可以交流的地方,我也做slam。关于UnsuperPoint的实现,还有一个就是描述子的bit独立性,按作者的套路一直没成功,所以我换成了位置独立性监督(明显不太合理),不知道是不是我实现有问题,你要是发现我哪里写错了,也可以说一声。
阅读您的代码,我发现您的uni_xy_loss的实现有一些问题,argsort不是说某个数值对应的是排序后的第几个。 举个例子 ,如果position 是 [0.1, 0.5, 0.3, 0.2, 0.4],那argsort的结果是 [0., 3., 2., 4., 1] ,而实际上您想要的是[0,4,2,1,3],这是不同的。正确的实现可以类似于一下: target_distribution = t.arange(position.shape[0]).type_as(rela_a) / (position.shape[0] - 1) position = t.sort(position)[0] uni_loss = t.sum((a - ta) ** 2) 虽然看起来不那么优雅,但他是对的。
idx = torch.argsort(position) p = position.shape[0] idx_f = torch.arange(p).float() uni_l2 = torch.mean(torch.pow(position[idx] - (idx_f / p), 2))