为什么Pytorch期望使用DoubleTensor而不是FloatTensor?

时间:2018-10-29 22:57:28

标签: python pytorch tensor

从网上看到的所有内容来看,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'

2 个答案:

答案 0 :(得分:4)

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

您的图层weights的{​​{1}}是self.fully_connected。当通过层馈送数据时,将应用矩阵乘法,并且该乘法要求两个矩阵都属于同一数据类型。

因此,您有两种解决方案:

  • 您可以将输入转换为float:

通过更改:

float

收件人:

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需要更多的计算能力。

答案 1 :(得分:0)

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