从我在网上看到的所有内容来看,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'
请您参考如下方法:
这里的问题是您的 numpy 输入使用 double 作为数据类型,相同的数据类型也应用于生成的张量。
另一方面,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
- 或者您可以将图层权重转换为两倍:
如果您需要 double ,您还可以将权重转换为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 as double 需要更多的计算能力。
