Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于训练部分对loss的处理不太理解 #23

Open
CynicalHeart opened this issue Nov 23, 2020 · 5 comments
Open

关于训练部分对loss的处理不太理解 #23

CynicalHeart opened this issue Nov 23, 2020 · 5 comments

Comments

@CynicalHeart
Copy link

在前向传播部分(forward),已经对每个anchor选取了一个hard-neg和一个hard-pos。
在loss部分,这时候使用nn.MarginRankingLoss将anchor与正负例的距离和y(batch个1)传入进去损失函数即可。但是代码中不是这么处理的。

一个不理解的地方:

    pscore = torch.sum(f * pf_hard, dim=1)  # 对应位相乘并行求和
    nscore = torch.sum(f * nf_hard, dim=1)
    # not PCB
    reg = torch.sum((1 + nscore) ** 2) + torch.sum((-1 + pscore) ** 2)
    loss = torch.sum(torch.nn.functional.relu(nscore + opt.margin -pscore)) 
    loss_triplet = loss + opt.alpha * reg

我不太懂代码的含义,这个是什么公式吗,有什么理由需要自定义一个损失函数么。

PCB部分遵照了原论文分part使用Softmax和交叉熵进行训练。

还有for phase in ['train']:,代码是不是只写了训练,没有验证啊😥。。

@CynicalHeart
Copy link
Author

纠正理解:

# 计算anchor与困难正、负例余弦相似度得分:代表距离。shape=(batch,)
pscore = torch.sum(f * pf_hard, dim=1)  # anchor与困难正例对应位相乘并按行求和(×乘)
nscore = torch.sum(f * nf_hard, dim=1)  # anchor与困难负例对应位相乘并按行求和
# not opt.PCB
# 正则式
reg = torch.sum((1 + nscore) ** 2) + torch.sum((-1 + pscore) ** 2)
# 这里relu等同于max(·,0); 因为使用余弦相似度,范围在[-1,1],也就是说d(a,p)越大(接近1)越好。
# 所以这里的TripletLoss和原本的式子相反,需要让d(a,p)>d(a,n)+m
loss = torch.sum(torch.nn.functional.relu(nscore + opt.margin - pscore))
loss_triplet = loss + opt.alpha * reg  # 损失值+正则化

但还是有几个小问题不明白:

  • 正则化这里为何要对nscore+1,对pscore-1后再平方和。
  • 用余弦距离是不是更容易理解,也不需要改loss函数
  • 之所以没写验证阶段,是不是因为Triplet Loss与分类不同,不绑定类别标签(eg:0002),所以没法直接用类别验证。

刚学习两个月Re-id的小白,所以问的问题不太成熟,希望郑博士能宽容讲解。

@Meimeiainaonao
Copy link

有个问题请教一下,pf_hard和nf_hard都是从从相同身份的行人中选取出来的,都是正样本,为什么code里是nes_label=pos_lable呢?详见Ony have anchor and pos_sample #26

@layumi
Copy link
Owner

layumi commented Sep 3, 2021

@Meimeiainaonao 你好,label是一样的,但是组成triplet的时候 顺序换了 , 就是negative sample了。

@layumi
Copy link
Owner

layumi commented Sep 3, 2021

对不起,,,现在才看到。那时候在准备回国。。。。@CynicalHeart

  • 因为希望 nscore趋近于 -1, pscore趋近于1. 相似度越大越好。
  • 是的。更准确地说是 余弦相似度 越大越像。
  • 是的。验证理论上可以写。。。我就是懒。。。就没写。。。

@CynicalHeart
Copy link
Author

对不起,,,现在才看到。那时候在准备回国。。。。@CynicalHeart

  • 因为希望 nscore趋近于 -1, pscore趋近于1. 相似度越大越好。
  • 是的。更准确地说是 余弦相似度 越大越像。
  • 是的。验证理论上可以写。。。我就是懒。。。就没写。。。

感谢回复~,代码还是很好理解的。度量学习验证问题一直是个头疼的问题,后面用了circle loss,验证时还是离不开交叉熵,难顶。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants