从网上看到的所有内容来看,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'
答案 0 :(得分:4)
这里的问题是您的numpy输入使用double
作为数据类型,相同的数据类型也应用于结果张量。
您的图层weights
的{{1}}是self.fully_connected
。当通过层馈送数据时,将应用矩阵乘法,并且该乘法要求两个矩阵都属于同一数据类型。
因此,您有两种解决方案:
通过更改:
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
。