为什么 Pytorch 需要 DoubleTensor 而不是 FloatTensor?

从我在网上看到的所有内容来看,FloatTensorsPytorch 对所有内容都是默认设置,当我创建一个张量以传递给我的生成器模块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'


子衿沉夜
浏览 847回答 2
2回答

慕的地6264312

这里的问题是您的 numpy 输入double用作数据类型,同样的数据类型也应用于结果张量。该weights图层的self.fully_connected,另一方面是float。当通过该层馈送数据时,会应用矩阵乘法,并且该乘法要求两个矩阵具有相同的数据类型。所以你有两个解决方案:您可以将输入转换为浮点数:通过改变:gen(torch.from_numpy(np.random.normal(size=100)))到:gen(torch.from_numpy(np.random.normal(size=100)).float())您输入的输入gen将转换为floatthen。转换输入的完整工作代码:from torch import nnimport torchimport numpy as npclass 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 nnimport torchimport numpy as npclass 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需要更多的计算能力。

qq_笑_17

Numpy 返回一个 64 位浮点数,它被强制转换为DoubleTensorwhen.from_numpy()被调用。令人困惑的部分是,如果您运行print(type(zvec))它,它会返回torch.Tensor它是浮点数还是双精度数。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python