我的代码的重要部分如下:
def forward(self, x):
x = T.tensor(x).to(self.device)
x = x.type(T.DoubleTensor)
x = self.conv1(x)
...
然而,我仍然在该片段的最后一行得到错误expected scalar type Double but found Float
。线路x = x.type(T.DoubleTensor)
应该解决这个问题,对吧?我也为前面的行尝试了x = x.double()
和x = T.tensor(x, dtype = T.double).to(self.device)
,但仍然会出现错误。我不知所措,我做错了什么?
PyTorch期望层的输入与层的参数具有相同的设备和数据类型(dtype(。对于包括conv层在内的大多数层,默认数据类型为torch.float32
,即FloatTensor
。
要解决问题,可以将x
强制转换为与self.conv1
层的weight
或bias
参数相同的类型(假设这是nn.Conv*d
层(。
def forward(self, x):
x = T.tensor(x, device=self.device, dtype=self.conv1.weight.dtype)
x = self.conv1(x)
...
最有可能的self.conv1.weight.dtype
将只是torch.float32
。除非您使用model.to(dtype=torch.float64)
之类的东西明确地更改了模型参数类型,否则您可以等效地只使用
def forward(self, x):
x = T.tensor(x, device=self.device, dtype=torch.float32)
x = self.conv1(x)
...
错误消息具有误导性。您应该将原始数据的dtype转换为float32
,而不是double
。
我是如何修复的:
data_X = np.array(data.iloc[:, 2:7], dtype='float32')
data_y = np.array(data['output'], dtype='float32')