Pytorch 遇到[W IndexingUtils.h:25] Warning: indexing with dtype torch. uint8 is now deprecated, please use a dtype torch. bool instead.(function expandTensors)警告信息
问题描述:
在跑用Pytorch搭的网络时出现了“[W IndexingUtils.h:25] Warning: indexing with dtype torch. uint8 is now deprecated, please use a dtype torch. bool instead.(function expandTensors)”警告信息,这种警告信息一直出现在训练的过程中,输出的loss几乎都被覆盖,严重影响我们看loss的输出。
这个警告是在loss.backward()中出现的,即是在反向传播的过程中出现的。
为什么会出现这个问题?
Pytorch1.2 以前的版本的tensor的索引都是用torch.uint8类型,Pytorch1.2以后tensor的索引都是用torch.bool类型。
解决方法:
方法一:
网上说忽略警告信息,可以解决。亲测无效。
import warnings
warnings.filterwarnings('ignore')
方法二:
将你的Pytorch的版本降到1.2以前。但是由于目前最新的显卡( RTX 2060, RTX3090)的CUDA版本都是11.0以上,但是CUDA11.0只支持Pytorch1.7以上版本。如果你的显卡比较新,是无法将Pytorch降到1.2的。
方法三:
网上有一些解决在运行pyotch-yolov3时,出现[W IndexingUtils.h:25] Warning: indexing with dtype torch. uint8 is now deprecated的方案。
从中看出看出obj_mask 和 noobj_mask都是x、y、w、h等的index,因此我们只需要把obj_mask和noobj_mask的类型都变成bool类型即可。
再看一个我遇到的例子:
把pos和neg的类型都变成bool类型就行了,即 pos = pos.bool() 和 neg = neg.bool()。
总结:
当Pytorch的版本大于1.2,在计算loss时,无论你的损失函数是 F.cross_entropy() or F.smooth_l1_loss() or F.mse_loss or F.binary_cross_entropy()等,那么输入进损失函数的tensor的索引都必须是bool类型。