Pytorch:将FloatTensor转换为DoubleTensor

时间:2017-06-23 08:50:59

标签: python torch pytorch

我有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_收到一个无效的参数组合 - got(int,int,torch.DoubleTensor,torch.FloatTensor),但是期望的一个:    [...]
   *(float beta,float alpha,torch.DoubleTensor mat1,torch.DoubleTensor mat2)         没有匹配,因为有些参数的类型无效:(int,int,torch.DoubleTensor,torch.FloatTensor)
   *(float beta,float alpha,torch.SparseDoubleTensor mat1,torch.DoubleTensor mat2)         没有匹配因为一些参数的类型无效:(int,int,torch.DoubleTensor,torch.FloatTensor)

最后一个错误来自:

  

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

正如您在我的代码中看到的那样,我尝试使用.double()来转换张量 - 但这不起作用。为什么他将一个数组转换为FloatTensor对象而另一个数组转换为DoubleTensor? 有什么想法吗?

2 个答案:

答案 0 :(得分:11)

您的ListItem数组为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() Float,请取消。

答案 1 :(得分:5)

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

请不要这样做! Trying to convert the model to double is greatly discouraged by PyTorch devs因为GPU不擅长双精度计算。此外,浮点足以深入学习。