pytorch训练过程中出现如题错误的解决方案

常规解决方案

从报错问题描述中可以找到错误原因

  • 输入的数据类型为torch.cuda.FloatTensor,说明输入数据在GPU中
  • 模型参数的数据类型为torch.FloatTensor,说明模型还在CPU

问题原因搞清楚了,模型没加载到CPU,在代码中加一行语句就可以了

  1. model = model.cuda()
  2. model = model.to('cuda')
  3. model.cuda()
  4. model.to('cuda')

上面四行任选一,还有其他未列出的表述方法,都可以将模型加载到GPU。

反之Input type (torch.FloatTensor) and weight type (torch.cuda.FloatTensor) should be the问题来源是输入数据没有加载到GPU,解决方法为

  1. tensor = tensor.cuda()
  2. tensor = tensor.to('cuda')

任选任选~

但是要注意直接tensor.to('cuda')等方法不行,

原因:

Module.to() 是一个“in-place”方法,tensor.to() 函数不是。tensor.to() 这个函数功能是产生一个新的tensor,并不会改变原数据。

疑难杂症

有时已经写了将模型和输入数据加载到GPU的语句,但还是报了这个错误。

检查模型和输入加载位置
模型

print(next(model.parameters()).is_cuda)

输入数据

print(tensor.device)

模型深层问题

如果检查过模型加载位置,确实在GPU,依然报了如题所述错误,那就要去检查一下模型了。

自定义模型中我们会使用一系列继承了nn.Module类的自定义类,使用过程中可能加入了一些不被nn.Module认可的python表述,这些表述内部的层会被model.cuda()忽略。

例如笔者使用list包装了一些卷积层,模型加载到GPU时会被忽略。

备注:搭建网络时list的替代方案为nn.ModuleList()

发文目的:记录一下遇到的bug,避免再次落坑。解决该问题的过程中未发现从模型结构入手的解决方案,因此发布博文帮各位大佬踩坑。

(如果对您有帮助,厚着脸皮要个赞)

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐