PaddlePaddle / PaddleSlim

PaddleSlim is an open-source library for deep model compression and architecture search.
https://paddleslim.readthedocs.io/zh_CN/latest/
Apache License 2.0
1.56k stars 345 forks source link

iou_loss loss 为nan #489

Closed aboutmei closed 3 years ago

aboutmei commented 3 years ago

INFO: iter: 0, lr: 0.000010, 'loss_xy': '1.828222', 'loss_wh': '5.254690', 'loss_obj': '130.993652', 'loss_cls': '30.401878', 'loss_iou': 'nan', 'loss': 'nan', time: 0.000, eta: 0:00:00

paddlepaddle 1.8.4,paddleslim 1.1.0 yolov3_darknet_voc_diouloss配置,LR 1e-1 - 1e-6都试过,使用 iou_loss ,dioulossyolo, diouloss ciou_term: False, diouloss ciou_term: True, iou loss 均为nan ,偶尔第一个迭代不为nan,检查代码和配置均没发现问题,请问是什么原因导致的? 补充:0.4分支代码

aboutmei commented 3 years ago

请问是否有人遇到同样的问题? 导致问题的原因? 应该如何解决?

aboutmei commented 3 years ago

请问有人回答这个问题吗?

aboutmei commented 3 years ago

该配置下,直接浮点训练没有问题,量化训练无论是从头开始训练,还是加载训练好的浮点模型量化训练,都是直接loss_iou为nan 量化配置如下: config = { 'weight_quantize_type': 'channel_wise_abs_max', 'activation_quantize_type': 'moving_average_abs_max', 'quantize_op_types': ['conv2d', 'mul', 'elementwise_add'], 'not_quant_pattern': not_quant_pattern, --not_quant_pattern 为空

yghstill commented 3 years ago

@justinmeibi 指定--not_quant_pattern yolo_output 看训练是否正常呢?

qingqing01 commented 3 years ago

related to https://github.com/PaddlePaddle/PaddleDetection/issues/1628

aboutmei commented 3 years ago

之前也怀疑是不是把yolo_loss,或者detection 部分也插入了量化节点,做过尝试,还是为nan

baiyfbupt commented 3 years ago

如果用yolov3_mobilenet结构呢,这个结构验证过是可以较好的进行量化的,请参考https://github.com/PaddlePaddle/PaddleDetection/tree/master/slim#yolov3-on-coco-2 ?可能是darknet结构对量化比较敏感,请先不要使用,我们再定位一下问题

aboutmei commented 3 years ago

mobilenet v1 :voc INFO: iter: 0, lr: 0.002000, 'loss_xy': '4.297863', 'loss_wh': '3.359149', 'loss_obj': '6862.832031', 'loss_cls': '27.458761', 'loss_iou': 'nan', 'loss': 'nan', time: 0.004, eta: 0:01:24 mobilenet v3 :coco INFO: iter: 0, lr: 0.002000, 'loss_xy': '10.744431', 'loss_wh': '14.427622', 'loss_obj': '6154.750977', 'loss_cls': '284.704651', 'loss_iou': 'nan', 'loss': 'nan', time: 0.002, eta: 0:00:45 配置为: iou_loss: DiouLossYolo

DiouLossYolo: loss_weight: 5 其他未改

aboutmei commented 3 years ago

觉得还是我这里有问题,但是代码我都比对过,还进行了还原。浮点直接训练是没问题的,你感觉是哪里出的问题?

aboutmei commented 3 years ago

查到问题原因了。 'quantize_op_types': ['conv2d', 'depthwise_conv2d', 'mul', 'elementwise_add'], elementwise_add 为quantize op 。应该是loss中的elementwise_add 也被量化了,导致iou_loss 为nan。 请问如何能skip use_fine_grained_loss的自定义loss

baiyfbupt commented 3 years ago

https://github.com/PaddlePaddle/PaddleDetection/blob/bc453fb20086b9466fa052fe08e67b5b7b1fee4a/ppdet/modeling/anchor_heads/yolo_head.py#L352 可以参考这个写法,在https://github.com/PaddlePaddle/PaddleDetection/blob/8551de92b9c5bd355f1981dc984850fd69caab39/ppdet/modeling/architectures/yolo.py#L108 之上添加一个scope并命名,然后在量化时指定not_quant_pattern为前面命名的

aboutmei commented 3 years ago

已解决,谢谢了