bubbliiiing / yolox-pytorch

这是一个yolox-pytorch的源码,可以用于训练自己的模型。
Apache License 2.0
888 stars 185 forks source link

开放的问题:为什么计算损失时output[..., :2]不使用sigmoid限制范围到(0-1) #126

Open SpringCCC opened 1 year ago

SpringCCC commented 1 year ago

模型输出时结果是没有sigmoid()的 在计算损失函数时,对某个grid预测时,是预测在这个grid上的偏移,范围是(0-1),因为如果超过1了,理论上可以由其他相邻的grid来做预测工作, 基于此,可是在代码中只是对预测的w,h做了exp()相关的变换,而对cx和cy没有做sigmoid,直接与grid_offset相加了 当然当前方式(没有sigmoid的结果也是特别好),所以就比较疑问,求教一下

bubbliiiing commented 1 year ago

nn.BCEWithLogitsLoss 搜搜

SpringCCC commented 1 year ago

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无关的

SpringCCC commented 1 year ago

append_sigmoid code 在代码中添加sigmoid激活cx和cy之后的结果图,也能很好的结果

bubbliiiing commented 1 year ago

鹅,BCEWithLogitsLoss是不需要进行sigmoid先的

bubbliiiing commented 1 year ago

添加sigmoid后其实是添加sigmoid再做一次sigmoid再算损失呢

SpringCCC commented 1 year ago

添加sigmoid后其实是添加sigmoid再做一次sigmoid再算损失呢

计算类别和和置信度时使用的是bcewithlog_loss损失函数,计算位置损失时用的是iou_loss 1 我说的就是对于位置损失没有用到sigmoid image 这是刚进入yolo loss的计算,进入get_output_and_grid()函数对output整形, image 此时可以看到只对2:4的索引进行exp,也就是在这里并没有对cx,cy预测值进行sigmoid

SpringCCC commented 1 year ago

接上面 然后进入get_losses()函数 image 得到bbox_preds对outputs提取出来的 然后到计算iou_loss这里,可以看出是对bbox_preds选择出fg_mask这些索引进行loss计算,也就是说,到现在为止,还是没有用到sigmoid image 然后进入iou_loss image 这里面也是没有用到sigmoid的

bubbliiiing commented 1 year ago

我不是很理解 "BCEWithLogitsLoss是不需要进行sigmoid先的",这个话是存在歧义吗

6hhhi commented 6 months ago

据说是初始权重选的好不管给x,y加不加sigmoid不会影响结果,加上或许可以加快训练。