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,如果您想将模型参数、输入和目标转换为 Float
或 Double
。
这是因为在PyTorch中,不同类型的Tensor之间不能进行运算。你的 data
是 DoubleTensor
,但模型参数是 FloatTensor
。所以你得到这个错误信息。正如@mexmex 所说,将 data
转换为 FloatTensor
以使其符合模型参数类型。
不要反其道而行之! Trying to convert the model to double is greatly discouraged by PyTorch devs 因为 GPU 不擅长双精度计算。此外,浮点数对于深度学习来说已经足够了。
我有 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,如果您想将模型参数、输入和目标转换为 Float
或 Double
。
这是因为在PyTorch中,不同类型的Tensor之间不能进行运算。你的 data
是 DoubleTensor
,但模型参数是 FloatTensor
。所以你得到这个错误信息。正如@mexmex 所说,将 data
转换为 FloatTensor
以使其符合模型参数类型。
不要反其道而行之! Trying to convert the model to double is greatly discouraged by PyTorch devs 因为 GPU 不擅长双精度计算。此外,浮点数对于深度学习来说已经足够了。