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?
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
.
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.