Open SpringCCC opened 1 year ago
nn.BCEWithLogitsLoss 搜搜
nn.BCEWithLogitsLoss 搜搜
nn.BCEWithLogitsLoss在代码中是用于对obj_preds和cls_preds做损失, 预测最后一维为:[cx, cy, w, h, conf, cls] obj_preds对应conf,cls_preds对应cls 前面的cx和cy没有做变化,直接与grid_offset相加,w,h做了exp()变换,然后形成pred_bbox,与gt做的是iou_loss,也就是说cx和cy的损失函数里是与BCEWithLogitsLoss无关的
在代码中添加sigmoid激活cx和cy之后的结果图,也能很好的结果
鹅,BCEWithLogitsLoss是不需要进行sigmoid先的
添加sigmoid后其实是添加sigmoid再做一次sigmoid再算损失呢
添加sigmoid后其实是添加sigmoid再做一次sigmoid再算损失呢
计算类别和和置信度时使用的是bcewithlog_loss损失函数,计算位置损失时用的是iou_loss
我说的就是对于位置损失没有用到sigmoid
这是刚进入yolo loss的计算,进入get_output_and_grid()函数对output整形,
此时可以看到只对2:4的索引进行exp,也就是在这里并没有对cx,cy预测值进行sigmoid
接上面
然后进入get_losses()函数
得到bbox_preds对outputs提取出来的
然后到计算iou_loss这里,可以看出是对bbox_preds选择出fg_mask这些索引进行loss计算,也就是说,到现在为止,还是没有用到sigmoid
然后进入iou_loss
这里面也是没有用到sigmoid的
我不是很理解 "BCEWithLogitsLoss是不需要进行sigmoid先的",这个话是存在歧义吗
据说是初始权重选的好不管给x,y加不加sigmoid不会影响结果,加上或许可以加快训练。
模型输出时结果是没有sigmoid()的 在计算损失函数时,对某个grid预测时,是预测在这个grid上的偏移,范围是(0-1),因为如果超过1了,理论上可以由其他相邻的grid来做预测工作, 基于此,可是在代码中只是对预测的w,h做了exp()相关的变换,而对cx和cy没有做sigmoid,直接与grid_offset相加了 当然当前方式(没有sigmoid的结果也是特别好),所以就比较疑问,求教一下