yolov2-yolov3_PyTorch
yolov2-yolov3_PyTorch copied to clipboard
Can someone help me? Why txty_loss_function is BCEWithLogitsLoss?
请问为什么tools.py里面 txty_loss_function采用的是BCEWithLogitsLoss,而conf_loss_function采用的是MSEWithLogitsLoss,两者是否弄反了?
@WHYwyh txty是经过sigmoid处理的,值域在01之间,用BCE效果要好于MSE,这是我测试出来的结果,所以对于txty loss,我选择了BCE,而非MSE。conf_loss也可以用BCE,毕竟值域也是在01之间,但在我的测试下,我发现用MSE效果要好于BCE,所以,conf loss我选择了MSE,而非BCE
@WHYwyh txty是经过sigmoid处理的,值域在01之间,用BCE效果要好于MSE,这是我测试出来的结果,所以对于txty loss,我选择了BCE,而非MSE。conf_loss也可以用BCE,毕竟值域也是在01之间,但在我的测试下,我发现用MSE效果要好于BCE,所以,conf loss我选择了MSE,而非BCE
我应该明白您的意思了,感谢回答! 我之前是对照论文的公式来查看的,yolo里面conf loss,txty loss都用的MSE,看到您的代码不太一样所以提了这个问题。 看来对回归的预测也是可以用分类的loss来做,只用work就行,虽然这样做从解释性上来有点奇怪: 例如,在您代码里面,在训练时,txty的ground truth是在对应grid里的偏移量,然后inference时,模型输出的txty经过sigmoid之后在(0,1)之间,当作在对应grid中的占比。对于BCE来说,最后计算loss的时候,是对y*ln(x)+(1-y)*ln(1-x)的求和,本来期待的y是{0,1}的值,而您的y是[0,grid_size]。 理论上,模型通过这样的训练收敛之后,输出的txty就应该是gird里的偏移量(因为监督信号就是偏移量),然后这样的偏移量经过sigmoid之后直接当成在grid内的占比,居然效果还会更好...Anyway,it works.
@WHYwyh 是的,对于01之间的连续变量,BCE也是可以去回归的,尤其是被sigmoid映射到01之间的,BCE多数情况下会学习得更好。对于txty的物理含义,在我看来,您理解得完全正确。
@WHYwyh 是的,对于01之间的连续变量,BCE也是可以去回归的,尤其是被sigmoid映射到01之间的,BCE多数情况下会学习得更好。对于txty的物理含义,在我看来,您理解得完全正确。
感谢您的耐心回答和鼓励,收获良多!