为什么Pythorch期望双张量而不是float张量?

2024-10-01 07:42:33 发布

您现在位置:Python中文网/ 问答频道 /正文

从我在网上看到的所有东西,FloatTensors是Pythorch的默认值,当我创建一个张量来传递给我的生成器模块时,它是一个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)))

产生

^{pr2}$

Tags: 模块selfsizeinitdefnngeneratorgen
2条回答

Numpy返回一个64位浮点数,当调用.from_numpy()时,它被转换成DoubleTensor。令人困惑的是,如果运行print(type(zvec)),它将返回torch.Tensor,不管它是不是浮点型还是双精度型。在

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

另一方面,self.fully_connected层的weights是{}。当通过层传送数据时,应用矩阵乘法,这种乘法要求两个矩阵具有相同的数据类型。在

所以你有两个解决方案:

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

通过改变:

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

收件人:

^{pr2}$

输入到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,因为{}需要更多的计算能力。在

相关问题 更多 >