2 回答

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需要更多的计算能力。

TA贡献1818条经验 获得超7个赞
Numpy 返回一个 64 位浮点数,它被强制转换为DoubleTensor
when.from_numpy()
被调用。令人困惑的部分是,如果您运行print(type(zvec))
它,它会返回torch.Tensor
它是浮点数还是双精度数。
添加回答
举报