为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

子衿沉夜 2021-07-29 16:53:10
从我在网上看到的所有内容来看,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'
查看完整描述

2 回答

?
慕的地6264312

TA贡献1817条经验 获得超6个赞

这里的问题是您的 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 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需要更多的计算能力。


查看完整回答
反对 回复 2021-08-03
?
qq_笑_17

TA贡献1818条经验 获得超7个赞

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


查看完整回答
反对 回复 2021-08-03
  • 2 回答
  • 0 关注
  • 846 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号