2017-06-19 1 views
1

Premier projet avec pytorch et je me suis coincé en essayant de convertir un label MNIST 'int' dans une torche 'Variable'. Le débogueur dit qu'il n'a pas de dimension ?!Convertir 'int' en pytorch 'Variable' fait des problèmes

# numpy mnist data 
X_train, Y_train = read_data("training") 
X_test , Y_test = read_data("testing") 

arr = np.zeros(5) 
for i in range(5): 
    # in your training loop: 
    costs_ = 0 
    for k in range(10000): 
     optimizer.zero_grad()       # zero the gradient buffers 
     a = torch.from_numpy(np.expand_dims(X_train[k].flatten(), axis=0)).float() 
     b = torch.from_numpy(np.array(Y_train[k], dtype=np.float)).float() 
     input = Variable(a) 
     output = net(input) 
     target = Variable(b)        # PROBLEM!! 
     loss = criterion(output, target) 
     loss.backward() 
     optimizer.step()         # Does the update 

     costs_ += loss.data.numpy() 
    arr[i] = costs_ 
    print(i) 

erreur de jet est: « RuntimeError: entrée et la cible ont un nombre différent d'éléments: entrée [1 x 1] qui possède 1 éléments, alors que la cible [] a 0 éléments à/b/roue/pytorch-src/torch/lib/THNN/generic/MSECriterion.c: 12 "

Répondre

1

L'erreur vous indique exactement ce qui se passe. Votre variable target est vide.

Modifier (après le commentaire ci-dessous):

si Y_train[k] = 5, puis np.array(Y_train[k], dtype=np.float).shape =(), et à son tour Variable(b) devient un tenseur sans dimension.

Afin de résoudre ce problème, vous devrez passer une liste à np.array() et pas un entier ou un flottant.

Comme ceci:

b = torch.from_numpy(np.array([Y_train[k]], dtype=np.float)).float() 
+0

Non, ce n'est pas vide. Quand je fais "print (Y_train [k])" je vois le "5" dans le terminal ... –

+0

J'ai édité la réponse. Cela devrait certainement l'être. Aussi je vous demanderais d'éditer votre question avec les informations suivantes pour les futurs lecteurs: la dimension des entrées 'X_train',' Y_train', 'X_test' et' Y_test', et la dimension de 'output'. – entrophy