问题解决:Input type (torch.cuda.FloatTensor) and weight type (torch.FloatTensor) should be the

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,避免再次落坑。解决该问题的过程中未发现从模型结构入手的解决方案,因此发布博文帮各位大佬踩坑。

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

    来源:ys-li

    物联沃分享整理
    物联沃-IOTWORD物联网 » 问题解决:Input type (torch.cuda.FloatTensor) and weight type (torch.FloatTensor) should be the

    发表评论