web-dev-qa-db-fra.com

Pytorch: convertir FloatTensor en DoubleTensor

J'ai 2 tableaux numpy, que je convertis en tenseurs pour utiliser l'objet 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)

quand je fais:

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

J'obtiens l'erreur de jachère:

TypeError: addmm_ a reçu une combinaison non valide d'arguments - got (int, int, torch.DoubleTensor, torch.FloatTensor), mais attendait l'un de: [...]
* (float beta, float alpha, torch.DoubleTensor mat1, torch.DoubleTensor mat2) ne correspond pas car certains des arguments ont des types non valides: (int, int, torch.DoubleTensor, torch.FloatTensor)
* (float beta, float alpha, torch.SparseDoubleTensor mat1, torch.DoubleTensor mat2) ne correspond pas car certains des arguments ont des types non valides: (int, int, torch.DoubleTensor, torch.FloatTensor)

La dernière erreur vient de:

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

Comme vous le voyez dans mon code, j'ai essayé de convertir le tenseur en utilisant .double () - mais cela n'a pas fonctionné. Pourquoi jette-t-il un tableau dans un objet FloatTensor et l'autre dans un DoubleTensor? Des idées?

12
N8_Coder

Vos numpy tableaux sont 64-bit floating point et sera converti en torch.DoubleTensor standard. Maintenant, si vous les utilisez avec votre modèle, vous devrez vous assurer que les paramètres de votre modèle sont également Double. Ou vous devez vous assurer que vos tableaux numpy sont convertis en Float, car les paramètres du modèle sont généralement convertis en float.

Par conséquent, effectuez l'une des opérations suivantes:

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

ou faites:

model.double()

Dépendant, si vous souhaitez convertir vos paramètres, entrées et cibles de modèle en Float ou en Double.

13
mexmex

En effet, dans PyTorch, vous ne pouvez pas effectuer d'opérations entre Tensor de types différents. Votre data est DoubleTensor, mais les paramètres du modèle sont FloatTensor. Vous obtenez donc ce message d'erreur. Comme l'a dit @mexmex, convertissez data en FloatTensor pour le rendre conforme au type de paramètre du modèle.

Ne faites pas l'inverse! Essayer de convertir le modèle en double est fortement déconseillé par Les développeurs PyTorch car les GPU ne sont pas bons en calcul double précision. De plus, la virgule flottante est assez jolie pour l'apprentissage en profondeur.

5
jdhao