解决:复现RFLA遇到的报错RuntimeError: indices should be either on cpu or on the same device as the indexed tensor (cpu)
问题描述:
使用博主https://blog.csdn.net/sinat_38213499/article/details/126813894的调试方法进行调试(在此表示感谢),在最后一步执行训练命令:python tools/train.py configs/rfla/aitod_cascade_r50_rfla_kld_1x.py后,训练了12轮,最后保存时报错:RuntimeError: indices should be either on cpu or on the same device as the indexed tensor (cpu)
原因:
网上有一些这个问题的解决办法,但都是在跑yolo遇到的这个问题,由于rfla是22年才出的,网上资料很少。查阅了一些资料,原来是我们训练时数据是在GPU上的,而有部分自己生成的数据是保存在CPU上的,所以有冲突就会报这个错。 于是借鉴yolo的修改办法进行了尝试。
解决办法:
1、根据报错的最后个文件File “/home/ipsg/code/tx/mmdet-rfla-main/mmdet/core/post_processing/bbox_nms.py”,找到变量inds,就是生成这个ins变量时储存在cpu里了,需要将这个变量转换到GPU再进行后续处理。这是修改前的代码截图
给inds加一个.to(device),在使用.to(device)前得先声明一下。
device = torch.device("cuda:0" if torch.cuda.is_available() else "cuda:1")
inds = valid_mask.nonzero(as_tuple=False).squeeze(1).to(device)
2、看网上也对其他地方进行了修改,我索性就参照着修改了(训练一次的时间太久了,两个办法都用了,然后再训练,至于是哪个办法有用就不去深究了,有用就可以)。在…/mmdet-rfla-main/mmdet/core/bbox/assigners/point_assigner.py中找到变量points_range,进行和第一步一样的操作。
device = torch.device("cuda:0" if torch.cuda.is_available() else "cuda:1") #加一行
inds = valid_mask.nonzero(as_tuple=False).squeeze(1).to(device) #替换成这一句
这是修改后的代码截图
结果:
再训练,12轮后成功保存输出结果