Pytorch:将 FloatTensor 转换为 DoubleTensor

Pytorch: Convert FloatTensor into DoubleTensor

我有 2 个 numpy 数组,我将其转换为张量以使用 TensorDataset 对象。

import torch.utils.data as data_utils

X = np.zeros((100,30))
Y = np.zeros((100,30))

train = data_utils.TensorDataset(torch.from_numpy(X).double(), torch.from_numpy(Y))
train_loader = data_utils.DataLoader(train, batch_size=50, shuffle=True)

当我这样做时:

for batch_idx, (data, target) in enumerate(train_loader):
    data, target = Variable(data), Variable(target)
    optimizer.zero_grad()
    output = model(data)               # error occurs here

我得到了休闲错误:

TypeError: addmm_ received an invalid combination of arguments - got (int, int, torch.DoubleTensor, torch.FloatTensor), but expected one of: [...]
* (float beta, float alpha, torch.DoubleTensor mat1, torch.DoubleTensor mat2) didn't match because some of the arguments have invalid types: (int, int, torch.DoubleTensor, torch.FloatTensor)
* (float beta, float alpha, torch.SparseDoubleTensor mat1, torch.DoubleTensor mat2) didn't match because some of the arguments have invalid types: (int, int, torch.DoubleTensor, torch.FloatTensor)

最后一个错误来自:

output.addmm_(0, 1, input, weight.t())

如您在我的代码中所见,我尝试使用 .double() 转换张量 - 但这没有用。为什么他要将一个数组转换为 FloatTensor 对象,而将另一个数组转换为 DoubleTensor? 有什么想法吗?

您的 numpy 数组是 64-bit floating point 并且将被标准地转换为 torch.DoubleTensor。现在,如果您将它们与您的模型一起使用,您需要确保您的模型参数也是 Double。或者您需要确保将 numpy 数组转换为 Float,因为模型参数标准转换为 float.

因此,执行以下任一操作:

data_utils.TensorDataset(torch.from_numpy(X).float(), torch.from_numpy(Y).float())

或做:

model.double()

Depeding,如果您想将模型参数、输入和目标转换为 FloatDouble

这是因为在PyTorch中,不同类型的Tensor之间不能进行运算。你的 dataDoubleTensor,但模型参数是 FloatTensor。所以你得到这个错误信息。正如@mexmex 所说,将 data 转换为 FloatTensor 以使其符合模型参数类型。

不要反其道而行之! Trying to convert the model to double is greatly discouraged by PyTorch devs 因为 GPU 不擅长双精度计算。此外,浮点数对于深度学习来说已经足够了。