【问题标题】:TypeError: add(): argument 'other' (position 1) must be Tensor, not numpy.ndarrayTypeError: add(): argument 'other' (position 1) must be Tensor, not numpy.ndarray
【发布时间】:2019-05-25 02:59:51
【问题描述】:

我正在使用最新 anaconda3 的 Linux 系统上使用 Pytorch 和 fastai 测试 ResNet-34 训练模型。要将其作为批处理作业运行,我注释掉了与 gui 相关的行。它开始运行几个小时,然后在验证步骤中停止,错误消息如下。

...
^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])

有没有人知道这个问题的线索?

非常感谢, 杰米

【问题讨论】:

  • 你能否——如果你自己没有指定引发错误的代码——至少包含一个存储库的链接,或者以其他方式明确你在看什么?您是否查看了相应的行,并仅在调试器中运行验证步骤?
  • 我已经在问题中添加了链接和代码行,谢谢!
  • 好的,感谢更新!我也可能对解决方案有所暗示:在我看来,第 237-239 行正在调用 PyTorch 函数 .sum()(这也是有道理的,.add() 函数在这种情况下会引发错误,但您输入这已经被转换为 NumPy 数组了!不知道 predstargs 的确切输入类型是什么,我只能猜测,但我会尝试制定一些解决方案。

标签: machine-learning pytorch kaggle resnet fast-ai


【解决方案1】:

好的,错误似乎是最新的 pytorch-1.0.0,当将 pytorch 降级到 pytorch-0.4.1 时,代码似乎工作(此时通过了错误行)。仍然不知道如何使代码与 pytorch-1.0.0 一起工作

【讨论】:

    【解决方案2】:

    我在使用这个 Kaggle 内核时遇到了同样的问题。我的解决方法如下:

    第一个选项:在F1 __call__ 方法中,将predstargspytorch 张量转换为numpy 数组;

    第二个选项:用pytorch张量而不是numpy数组初始化TP/FP/FN,即将np.zeros(self.n)替换为torch.zeros(1, self.n)

    基本上,主要思想 - 所有变量都应该属于同一类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-02
      • 1970-01-01
      • 1970-01-01
      • 2020-03-28
      • 2016-11-13
      • 1970-01-01
      • 2017-08-07
      • 1970-01-01
      相关资源
      最近更新 更多