TypeError: add (): аргумент 'other' (позиция 1) должен быть Tensor, а не numpy.ndarray - PullRequest
0 голосов
/ 27 декабря 2018

Я тестирую ResNet-34 training_model, используя Pytorch и fastai в системе linux с последней версией anaconda3.Чтобы запустить его как пакетную работу, я закомментировал строки, связанные с графическим интерфейсом.Он начал работать в течение нескольких часов, затем остановился на этапе проверки, сообщение об ошибке, как показано ниже.

...
^M100%|█████████▉| 452/453 [1:07:07<00:08,  8.75s/it, 
loss=1.23]^[[A^[[A^[[A

^MValidation:   0%|          | 0/40 [00:00<?, ?it/s]^[[A^[[A^[[ATraceback 
(most recent call last):
  File "./resnet34_pretrained_PNG_nogui_2.py", line 279, in <module>
    learner.fit(lr,1,callbacks=[f1_callback])
  File "/project/6000192/jemmyhu/resnet_png/fastai/learner.py", line 302, 
in fit
    return self.fit_gen(self.model, self.data, layer_opt, n_cycle, 
**kwargs)
  File "/project/6000192/jemmyhu/resnet_png/fastai/learner.py", line 249, 
in fit_gen
    swa_eval_freq=swa_eval_freq, **kwargs)
  File "/project/6000192/jemmyhu/resnet_png/fastai/model.py", line 162, in 
fit
    vals = validate(model_stepper, cur_data.val_dl, metrics, epoch, 
seq_first=seq_first, validate_skip = validate_skip)
  File "/project/6000192/jemmyhu/resnet_png/fastai/model.py", line 241, in 
validate
    res.append([to_np(f(datafy(preds), datafy(y))) for f in metrics])
  File "/project/6000192/jemmyhu/resnet_png/fastai/model.py", line 241, in 
<listcomp>
    res.append([to_np(f(datafy(preds), datafy(y))) for f in metrics])
  File "./resnet34_pretrained_PNG_nogui_2.py", line 237, in __call__
    self.TP += (preds*targs).float().sum(dim=0)
TypeError: add(): argument 'other' (position 1) must be Tensor, not 
numpy.ndarray

Ссылка на оригинальный код https://www.kaggle.com/iafoss/pretrained-resnet34-with-rgby-0-460-public-lb

, строки 279 и 237 в моей копии показаны ниже:

226 class F1:
227     __name__ = 'F1 macro'
228     def __init__(self,n=28):
229         self.n = n
230         self.TP = np.zeros(self.n)
231         self.FP = np.zeros(self.n)
232         self.FN = np.zeros(self.n)
233
234     def __call__(self,preds,targs,th=0.0):
235         preds = (preds > th).int()
236         targs = targs.int()
237         self.TP += (preds*targs).float().sum(dim=0)
238         self.FP += (preds > targs).float().sum(dim=0)
239         self.FN += (preds < targs).float().sum(dim=0)
240         score = (2.0*self.TP/(2.0*self.TP + self.FP + self.FN + 1e-6)).mean()
241         return score

276 lr = 0.5e-2
277 with warnings.catch_warnings():
278     warnings.simplefilter("ignore")
279     learner.fit(lr,1,callbacks=[f1_callback])

Может кто-нибудь иметь подсказкудля вопроса?

Большое спасибо, Джемми

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019

У меня была такая же проблема с этим ядром Kaggle.Мои обходные пути следующие:

1-й вариант : в методе F1 __call__ конвертируйте preds и targs из pytorch тензоров в числовые массивы;

2-й вариант : Инициализировать TP / FP / FN с pytorch тензорами вместо числовых массивов, т.е. заменить np.zeros(self.n) на torch.zeros(1, self.n).

По сути, основная идея - все переменные должныбыть того же типа.

0 голосов
/ 31 декабря 2018

Хорошо, похоже, ошибка для последней версии pytorch-1.0.0, когда при понижении версии pytorch до pytorch-0.4.1 код кажется работающим (пропущены строки ошибок на этом этапе).До сих пор не знаю, как заставить код работать с pytorch-1.0.0

...