【问题标题】:Why does Pytorch expect a DoubleTensor instead of a FloatTensor?为什么 Pytorch 需要 DoubleTensor 而不是 FloatTensor?
【发布时间】:2019-04-02 22:50:23
【问题描述】:

从我在网上看到的所有内容来看,FloatTensors 是 Pytorch 的默认设置,当我创建一个张量以传递给我的生成器模块时,它是一个 FloatTensor,但是当我尝试通过线性层运行它时它会抱怨它想要一个DoubleTensor

class Generator(nn.Module):
  def __init__(self):
    super(Generator, self).__init__()
    self.fully_connected = nn.Linear(100, 1024*4*4, bias=False)

  def forward(self, zvec):
    print(zvec.size())
    fc = self.fully_connected(zvec)
    return(fc.size())

gen = Generator();

gen(torch.from_numpy(np.random.normal(size=100)))

哪个产生

RuntimeError: Expected object of type torch.DoubleTensor but found type torch.FloatTensor for argument #2 'mat2'

【问题讨论】:

    标签: python pytorch tensor


    【解决方案1】:

    Numpy 返回一个 64 位浮点数,在调用 .from_numpy() 时将其转换为 DoubleTensor。令人困惑的部分是,如果您运行 print(type(zvec)),它会返回 torch.Tensor,无论它是浮点数还是双精度数。

    【讨论】:

      【解决方案2】:

      这里的问题是您的 numpy 输入使用 double 作为数据类型,相同的数据类型也应用于生成的张量。

      另一方面,您的层self.fully_connectedweightsfloat。当通过层提供数据时,会应用矩阵乘法,并且这种乘法要求两个矩阵具有相同的数据类型。

      所以你有两个解决方案:

      • 您可以将输入转换为浮点数:

      通过改变:

      gen(torch.from_numpy(np.random.normal(size=100)))
      

      收件人:

      gen(torch.from_numpy(np.random.normal(size=100)).float())
      

      您输入到gen 的输入将被转换为float

      转换输入的完整工作代码:

      from torch import nn
      import torch
      import numpy as np
      class Generator(nn.Module):
          def __init__(self):
              super(Generator, self).__init__()
              self.fully_connected = nn.Linear(100, 1024*4*4, bias=False)
      
          def forward(self, zvec):
              print(zvec.size())
              fc = self.fully_connected(zvec)
              return(fc.size())
      
      gen = Generator();
      gen(torch.from_numpy(np.random.normal(size=100)).float()) # converting network input to float
      

      • 或者,您可以将图层权重转换为双倍:

      如果您需要双精度,您还可以将weights 转换为double

      改变这一行:

      self.fully_connected = nn.Linear(100, 1024*4*4, bias=False)
      

      只是为了:

      self.fully_connected = nn.Linear(100, 1024*4*4, bias=False).double()
      

      转换权重的完整工作代码:

      from torch import nn
      import torch
      import numpy as np
      class Generator(nn.Module):
          def __init__(self):
              super(Generator, self).__init__()
              self.fully_connected = nn.Linear(100, 1024*4*4, bias=False).double() # converting layer weights to double()
      
          def forward(self, zvec):
              print(zvec.size())
              fc = self.fully_connected(zvec)
              return(fc.size())
      
      gen = Generator();
      gen(torch.from_numpy(np.random.normal(size=100)))
      

      所以这两种方法都适合你,但如果你不需要double 的额外精度,你应该使用float,因为double 需要更多的计算能力。

      【讨论】:

      • 谢谢。我遇到了类似的问题,你的解释解决了。
      猜你喜欢
      • 2017-11-26
      • 2018-03-18
      • 2018-07-30
      • 2011-06-18
      • 2021-04-13
      • 1970-01-01
      • 2019-09-29
      • 2019-06-06
      • 1970-01-01
      相关资源
      最近更新 更多