Bug记录1--pytorch上训练自己构建的网络时出现的bug及解决方法

RuntimeError: Input type (torch.cuda.FloatTensor) and weight type (torch.FloatTensor) should be the same

这段时间,在学习SSD目标检测网络并进行网络结构改进时,开始训练时出现了上述问题。在网上寻找了很多方法后,总结如下:

(一)网上给的很多解决方法:将网络放到GPU上(常规方法)

出现这个问题的主要原因是输入的数据类型与网络参数的类型不符。

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

因此,错误原因就是模型没加载到GPU,只需在代码中加一行语句即可。

  1. device = torch.device('cuda:0')
    nmodel.to(device)
    
  2. model = model.cuda()
    

上面两种表述方法,任选其一,都可以将模型加载到GPU上。

同理:Input type (torch.FloatTensor) and weight type (torch.cuda.FloatTensor) should be the same的问题是:输入数据没有加载到GPU!解决方法为:

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

上面两种表述方法,任选其一,都可以将输入数据加载到GPU上。但是要注意直接tensor.to('cuda')等方法不行。

(二)搭建网络结构时产生该报错:需返回网络搭建的正向传播(forward函数)中逐一排查

上述(一)解决方法并不适合我遇到的问题,因为通过调试发现,代码中我是写了将模型和输入数据加载到GPU的语句,但还是报了这个错误。

可以通过简单调试排查一下是否是模型和输入数据未加载到GPU的问题,检查模型和输入加载位置调试方法如下:

  • 模型
print(next(model.parameters()).is_cuda)
  • 输入数据
print(tensor.device)

如果检查过模型加载位置,确实在GPU,依然报了如题所述错误,那就得返回自己网络构建的代码部分仔细去排查一下。我遇到的问题是:在搭建net时,在forward函数中定义网络的方式不一致导致网络一部分没有写入GPU中,如下图:

错误示范(红点部分错误):

应改为(红点部分修正):

不是直接去调用函数add_extras(),而是应该先将它放在与self.body同在的类(class)中,即定义self.extras=add_extras([1024, 512, 512, 256, 256, 256]),再将其用于正向传播过程中。

问题完美解决!!!!

自己遇到的问题卡了好几天,终于解决,开心哈哈哈,分享给大家参考。

参考资料:(非常感谢网上提供的一些经验)

https://www.cnblogs.com/expttt/p/13047451.html

https://www.jianshu.com/p/73759cee9e36

https://www.iotword.com/2424.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值