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

猜你喜欢

转载自blog.csdn.net/sinat_41665224/article/details/128149604
今日推荐