Ошибка при выполнении кода RNN на pyTorch? - PullRequest
0 голосов
/ 24 октября 2018

Я запускаю код двоичного сложения с использованием PyTorch.

Однако при обучении модели я получаю следующую ошибку:

can't convert np.ndarray of type numpy.object. 
The only supported types are: double, float, float16, int64, int32, and uint8.  

Кто-нибудь может мне помочь?Вот мой код:

featDim=2 # two bits each from each of the String
outputDim=1 # one output node which would output a zero or 1

lstmSize=10

lossFunction = nn.MSELoss()
model =Adder(featDim, lstmSize, outputDim)
print ('model initialized')
#optimizer = optim.SGD(model.parameters(), lr=3e-2, momentum=0.8)
optimizer=optim.Adam(model.parameters(),lr=0.001)
epochs=500
### epochs ##
totalLoss= float("inf")
while totalLoss > 1e-5:
  print(" Avg. Loss for last 500 samples = %lf"%(totalLoss))
  totalLoss=0
  for i in range(0,epochs): # average the loss over 200 samples

    stringLen=4
    testFlag=0
    x,y=getSample(stringLen, testFlag)

    model.zero_grad()


    x_var=autograd.Variable(torch.from_numpy(x).unsqueeze(1).float()) #convert to torch tensor and variable
    # unsqueeze() is used to add the extra dimension since
    # your input need to be of t*batchsize*featDim; you cant do away with the batch in pytorch
    seqLen=x_var.size(0)
    #print (x_var)
    x_var= x_var.contiguous()
    y_var=autograd.Variable(torch.from_numpy(y).float()) ##ERROR ON THIS LINE
    finalScores = model(x_var)
    #finalScores=finalScores.

    loss=lossFunction(finalScores,y_var)  
    totalLoss+=loss.data[0]
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()


  totalLoss=totalLoss/epochs

1 Ответ

0 голосов
/ 24 октября 2018

Основной проблемой здесь является тип вашего y.Вы не предоставили никакой информации об этом, поэтому здесь это будет более общим:

Но, очевидно, ваш ndarray не содержит числовых типов данных.Вы должны использовать один из них, упомянутых в сообщении об ошибке:

Поддерживаются только следующие типы: double, float, float16, int64, int32 и uint8.

Вот краткий пример, демонстрирующий проблему:

Если вы используете один из ранее упомянутых типов данных, он прекрасно работает:

import torch
import numpy as np
a = np.ndarray(shape=(2,2), dtype=np.float) # data type np.float
print(a)
print(torch.autograd.Variable(torch.from_numpy(a).float()))

Вывод:

[[2.16641777e-314 2.16641777e-314]
 [2.16641777e-314 2.16641777e-314]]
Variable containing:
 0  0
 0  0
[torch.FloatTensor of size 2x2]


Но если вы используете какой-либо другой тип данных numpy (например, np.object), вы получите это сообщение об ошибке:
import torch
import numpy as np
a = np.ndarray(shape=(2,2), dtype=np.object) # data type np.object
print(a)
print(torch.autograd.Variable(torch.from_numpy(a).float()))

В результате:

[[None None]
 [None None]]
---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-27-01e1e4bec020> in <module>()
      3 a = np.ndarray(shape=(2,2), dtype=np.object)
      4 print(a)
----> 5 print(torch.autograd.Variable(torch.from_numpy(a).float()))

RuntimeError: can't convert a given np.ndarray to a tensor - it has an invalid type. The only supported types are: double, float, int64, int32, and uint8.

YouВозможно, вы не указали тип данных np.object напрямую.Я думаю, что это может быть результатом некоторых вложенных массивов или около того.

Но вам нужно привести свой числовой массив y в правильную форму с числовым типом данных, тогда он должен работать для вас.

...