这里的问题是您的 numpy 输入使用 double 作为数据类型,相同的数据类型也应用于生成的张量。
另一方面,您的层self.fully_connected 的weights 是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,因为double 需要更多的计算能力。