Pytorch:RuntimeError:reduce 同步失败:cudaErrorAssert:触发设备端断言

Gul*_*zar 9 python machine-learning deep-learning pytorch

我想,当列车运行到下面的错误这个数据集

由于这是论文中发布的配置,我假设我做错了什么。

每次我尝试运行训练时,此错误都会出现在不同的图像上。

C:/w/1/s/windows/pytorch/aten/src/THCUNN/ClassNLLCriterion.cu:106: block: [0,0,0], thread: [6,0,0] Assertion `t >= 0 && t < n_classes` failed.
Traceback (most recent call last):
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2019.1.1\helpers\pydev\pydevd.py", line 1741, in <module>
    main()
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2019.1.1\helpers\pydev\pydevd.py", line 1735, in main
    globals = debugger.run(setup['file'], None, None, is_module)
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2019.1.1\helpers\pydev\pydevd.py", line 1135, in run
    pydev_imports.execfile(file, globals, locals)  # execute the script
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2019.1.1\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile
    exec(compile(contents+"\n", file, 'exec'), glob, loc)
  File "C:/Noam/Code/vision_course/hopenet/deep-head-pose/code/original_code_augmented/train_hopenet_with_validation_holdout.py", line 187, in <module>
    loss_reg_yaw = reg_criterion(yaw_predicted, label_yaw_cont)
  File "C:\Noam\Code\vision_course\hopenet\venv\lib\site-packages\torch\nn\modules\module.py", line 541, in __call__
    result = self.forward(*input, **kwargs)
  File "C:\Noam\Code\vision_course\hopenet\venv\lib\site-packages\torch\nn\modules\loss.py", line 431, in forward
    return F.mse_loss(input, target, reduction=self.reduction)
  File "C:\Noam\Code\vision_course\hopenet\venv\lib\site-packages\torch\nn\functional.py", line 2204, in mse_loss
    ret = torch._C._nn.mse_loss(expanded_input, expanded_target, _Reduction.get_enum(reduction))
RuntimeError: reduce failed to synchronize: cudaErrorAssert: device-side assert triggered
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

aks*_*k07 17

这种错误通常发生在使用NLLLoss或 时CrossEntropyLoss,以及当您的数据集具有负标签(或标签大于类数)时。这也是您得到断言t >= 0 && t < n_classes失败的确切错误。

这不会发生在MSELoss,但 OP 提到有一个CrossEntropyLoss地方,因此发生错误(程序在其他行异步崩溃)。解决方案是清理数据集并确保t >= 0 && t < n_classes满足(其中t代表标签)。

此外,请确保您的网络输出在 0 到 1 的范围内,以防您使用NLLLossor BCELoss(然后分别需要softmaxsigmoid激活)。请注意,这不是必需的,CrossEntropyLoss也不BCEWithLogitsLoss是因为它们在损失函数中实现了激活函数。(感谢@PouyaB 指出)。

  • 当使用 BCELoss 并且输入不在预期范围 (0-1) 内时,也会引发相同的错误。就我而言,网络输出上缺少 nn.Sigmoid() 。添加非线性解决了这个问题。 (3认同)