Faster RCNN pytroch1.0 训练时:Warning: NaN or Inf found in input tensor.

文章目录[隐藏]

问题

  1. 在Pascal voc和coco上训练Faster RCNN都正常
  2. 在训练自己的数据集时(Pascal voc格式)训练Faster R-CNN pytorch1.0时出现Warning: NaN or Inf found in input tensor.

原因

  1. 可能是learning rate太大,调小learning rate。最有效的方法是learning rate设为0,看看是不是还有nan的问题。
  2. 因为自己的数据是从0开始的,但是源码中-1,如果这时候annotation中有为0的就会出现越界的问题。

解决

  1. 设置lr=0,如果不在出现loss=nan的问题,说明是learning rate太大,导致了梯度爆炸或梯度消失。可调整learning rate和weight decay。

  2. 如果lr=0后,依然存在loss=nan的问题,就修改pascal_voc.py中获取坐标框的代码:

    修改前
            bbox = obj.find('bndbox')
            # Make pixel indexes 0-based
            x1 = float(bbox.find('xmin').text) - 1
            y1 = float(bbox.find('ymin').text) - 1
            x2 = float(bbox.find('xmax').text) - 1
            y2 = float(bbox.find('ymax').text) - 1
    修改后
            bbox = obj.find('bndbox')
            # Make pixel indexes 0-based
            x1 = float(bbox.find('xmin').text) # - 1
            y1 = float(bbox.find('ymin').text) # - 1
            x2 = float(bbox.find('xmax').text) # - 1
            y2 = float(bbox.find('ymax').text) # - 1
    

    若设置了翻转(cfg.TRAIN.USE_FLIPPED = True),则需要在imdb.py中的def append_flipped_images(self)方法:

    修改前      
        boxes[:, 0] = widths[i] - oldx2  - 1
        boxes[:, 2] = widths[i] - oldx1  - 1
    修改后	 
        boxes[:, 0] = widths[i] - oldx2  # - 1
        boxes[:, 2] = widths[i] - oldx1  # - 1
    
  3. 最后记得清理data文件里面的缓存文件cache

参考:
【1】https://blog.csdn.net/qq_29936933/article/details/111378275
【2】https://github.com/jwyang/faster-rcnn.pytorch/issues/136

版权声明:本文为CSDN博主「异想天开的长颈鹿」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jokerwu192/article/details/121587522

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

YOLO-V3-SPP详细解析

YOLO-V3-SPP 继前两篇简单的YOLO博文 YOLO-V1 论文理解《You Only Look Once: Unified, Real-Time Object Detection》YOLO-V2论文理解《YOLO9000: Bet

YOLOv5 目标检测

前言 YOLOv5官方发布的代码中,检测网络共有四个版本,依次为YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x 。其中YOLOv5s是“深度”和“特征图宽度”均最小的网络,另外三种可以认为是在其基础上,进行了加深、加宽。 看一

pt模型在VS上运行

注意:本例子为我个人对YOLOv5的源码进行在VS上的实现,大家可按自己的模型根据源码进行修改 我这为单个物体的检测,如果检测多个物体需对结果处理函数(non_max_suppression2)进行修改