当前位置:   article > 正文

RuntimeError: Input type (torch.FloatTensor) and weight type (torch.cuda.FloatTensor)

runtimeerror: input type (torch.floattensor) and weight type (torch.cuda.flo

错误:
RuntimeError: Input type (torch.FloatTensor) and weight type (torch.cuda.FloatTensor) should be the same
RuntimeError:输入类型(torch.FloatTensor)和权重类型(torch.cuda.FloatTensor)应该相同,或者输入应该是一个MKLDNN张量,而权重是一个密集张量。 

     
问题原因:

       错误内容就在类型不匹配,根据报错内容可以看出Input type(输入的数据)为torch.FloatTensor(CPU数据类型),而weight type(即网络权重参数这些)为torch.cuda.FloatTensor(GPU数据类型)。

两个解决方案

方案一:Input type进行转换

对Inputs进行转换。

inputs为输入数据进行实例化的表示

    1. device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
    2. print(torch.cuda.is_available())
    3. inputs = inputs.to(device) #1, 通过to(device)方法
    4. inputs = inputs.cuda() #2,通过直接指定输入cuda类型

若与上面错误是反的,即 RuntimeError: Input type (torch.cuda.FloatTensor) and weight type (torch.FloatTensor) should be the same

那就同理,对net进行转换。

net为神经网络进行实例化的表示
 

  1. net = Unet()
  2. device = torch.device('cuda:0')
  3. net= net.to(device)
  4. net = net.cuda()

方案二:模型定义全放在类的初始化里

把所有的网络层(只要有参数需要训练的网络层)都放到 __init__()函数里面去定义,只在 forward()中写运行时的逻辑,即:

  1. class A(nn.Module):
  2. def __init__(self):
  3. super(A,self).__init__()
  4. self.conv = nn.Conv2d(in_channels=3, out_channels=8, kernel_size=3)
  5. self.relu = nn.ReLU(inplace=True)
  6. self.b_module = B()
  7. def forward(self,x):
  8. out = self.conv(x)
  9. out = self.relu(out)
  10. out = self.b_module(out)
  11. return out
  12. class B(nn.Module):
  13. def __init__(self):
  14. super(B,self).__init__()
  15. self.conv = nn.Conv2d(in_channels=8, out_channels=16, kernel_size=3)
  16. self.relu = nn.ReLU(inplace=True)
  17. def forward(self, x):
  18. out = self.conv(x)
  19. out = self.relu(out)
  20. return out

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/103346
推荐阅读
相关标签
  

闽ICP备14008679号