网络梯度为None、参数不更新解决思路(又名“魔改代码的报应”)

这篇具有很好参考价值的文章主要介绍了网络梯度为None、参数不更新解决思路(又名“魔改代码的报应”)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

报错提示

RuntimeError: Expected to have finished reduction in the prior iteration before starting a new one. This error indicates that your module has parameters that were not used in producing loss. You can enable unused parameter detection by (1) passing the keyword argument find_unused_parameters=True to torch.nn.parallel.DistributedDataParallel; (2) making sure all forward function outputs participate in calculating loss. If you already have done the above two steps, then the distributed data parallel module wasn’t able to locate the output tensors in the return value of your module’s forward function. Please include the loss function and the structure of the return value of forward of your module when reporting this issue (e.g. list, dict, iterable).

问题来源

在原网络中新加了一个特征提取的模块,单卡不报错,双卡报上面的错

排查

出现这个错最本质的原因是有一部分网络的参数无法正常反向传播。
首先通过在loss.backward()后添加下面代码,找出是哪一处的参数梯度为None:

for name, param in model.named_parameters():
	if param.grad is None:
		print(name, param.grad_fn)

然后发现确实是我加的那一部分的模块的参数有问题,梯度都是None

参考博客

下面的博客给出了一些参考
参考博客1
参考博客2

我的解决思路

由于我加的这一部分是特征提取,不需要在这一步计算loss,而原来后面那一部分的网络的反向传播是没问题的,所以问题应该就是出在我写的这块。

排除了一系列loss没算、初始化没删、requires_grad没开等等一系列问题后,
我认为不能反向传播的原因可能是我把特征提取这一部分的输出后面加了一系列复杂的操作(涉及到一些复杂的维度变换),
然后才传到下一个网络中去,导致有些操作无法正确的追溯(比如for循环、scatter操作以及一些其他复杂的操作函数)。

接着我把所有的for循环删除,把直接计算的池化部分改为通过AvgPool2d()实现,就可以正常反向传播了!

所以出现了这个问题,且你对代码做了魔改的基础上,可以检查一下自己有没有在输出的特征向量上做一些复杂的操作,尽量把这些操作简化,同时也要注意尽量不要初始化一个新的tensor(这种中间变量的梯度也是没有的),没准就能行得通!

大半夜终于解决了困扰了好几天的bug,共勉!!!文章来源地址https://www.toymoban.com/news/detail-667568.html

到了这里,关于网络梯度为None、参数不更新解决思路(又名“魔改代码的报应”)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前后台传递参数中出现+、-、=、%、&、#、空格等字符的解决思路

    一、描述问题 前后台传输数据多样化,可能会出现特殊字符的情况,比如传递的参数中含有+、空格、=、%等字符,遇到这样的情况我们该如何解决呢? 二、问题分析 前后台特殊字符对其编码,原因可能是这些特殊字符对于前后台传递参数的时候,有其特殊的用途,比如url中

    2024年01月17日
    浏览(69)
  • 2023年研究生数学建模A题WLAN网络信道接入机制建模思路及参考代码(持续更新)

    背景 无线局域网(WLAN, wireless local area network)也即Wi-Fi广泛使用,提供低成本、高吞吐和便利的无线通信服务。基本服务集(BSS, basic service set)是WLAN的基本组成部分。处于某一特定覆盖区域内的站点(STA, station)与一个专职管理BSS的无线接入点(AP, access point)组成一个BSS,

    2024年02月07日
    浏览(30)
  • YOLOv8改进 | 检测头篇 | 利用DBB重参数化模块魔改检测头实现暴力涨点 (支持检测、分割、关键点检测)

    本文给大家带来的改进机制是 二次创新 的机制,二次创新是我们发表论文中关键的一环,本文给大家带来的二次创新机制是通过 DiverseBranchBlock(DBB) 模块来改进我们的检测头形成一个新的检测头Detect_DBB,其中DBB是一种重参数化模块,其训练时采用复杂结构,推理时使用单分支

    2024年01月16日
    浏览(34)
  • 机器学习_通过梯度下降找到最佳参数

    所谓训练机器,也称拟合的过程,也就是 确定模型内部参数的过程 。具体到线性模型,也就是确定y’=wx+b 函数中的w和b。 对于线性回归来说,针对损失函数的 梯度下降 (gradient descent )方法可以使猜测沿着 正确的方向前进 ,因此总能找到比起上一次猜测时 误差更小的w和b组

    2024年01月21日
    浏览(41)
  • 解决pandas.errors.InvalidIndexError: (slice(None, None, None), None)

    ValueError: x and y must have same first dimension, but have shapes (2, 14) and (14,) 问题分析: 由于上图索引(时间列)存在重复,导致下面代码中, ax.plot()的时候,把两个相同的索引,构造了一个(2,14)的重复 解决办法:对索引列去重复

    2024年02月16日
    浏览(26)
  • 神经网络解决回归问题(更新ing)

    神经网络是处理回归问题的强大工具,它们能够学习输入数据和输出之间的复杂关系。 神经网络提供了一种灵活且强大的框架,用于建模和预测回归问题。通过 适当的 网络结构 、 训练策略 和 正则化 技术,可以有效地从数据中学习并做出准确的预测。 在实际应用中,选择

    2024年04月10日
    浏览(25)
  • WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None))解决办法

    问题描述:  WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by \\\'ReadTimeoutError(\\\"HTTPSConnectionPool(host=\\\'files.pythonhosted.org\\\', port=443): Read timed out. (read timeout=15)\\\")\\\': /packages/77/ec/ccdfcafb958f6007cc357ce12fd945551a71503b88cd3f78e49fd958f949/torchvision-0.14.1-cp37-cp37m-w

    2024年02月08日
    浏览(44)
  • python解决WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) afte

    pip安装报错计算机拒绝,代理问题 WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by ‘ProxyError(‘Cannot connect to proxy.’, NewConnectionError(’pip._vendor.urllib3.connection.HTTPConnection object at 0x000001937A5BDDC0: Failed to establish a new connection: [WinError 10061] 由于

    2024年02月06日
    浏览(30)
  • 已解决Retrying(Retry (total=4, connect=None,read=None,redirect=None,status=None)) after connection brok

    已解决Retrying(Retry (total=4, connect=None,read=None,redirect=None,status=None)) after connection broken by ‘ReadTimeoutError(“\\\'HTTPSConnectionPool(host=\\\'files.pythonhosted.org , port=443);: Read timed out.(read timeout=15)”,)’: /packages/91/68/c9ce4bd8989333cbb59b42c15d7a43e414d495dba3a21664411564c77b6a/tensorflow-2.6.2-cp36-cp36m-win_amd64.

    2023年04月15日
    浏览(31)
  • 已解决WARNING: Retrying (Retry(total=0,connect=None,read=None,redirect=None, status=None)) after connec

    已解决(pip升级报错)WARNING: Retrying (Retry(total=0,connect=None,read=None,redirect=None, status=None)) after connection broken by ‘SSLError(SSLEOFError(8,‘EOF occurred in violation of protocol (_ssl.c:997)’))’: /pypi/simple/pip/ WARNING: There was an error checking the latest version of pip. 一个小伙伴用pip命令升级pip,但是

    2024年02月15日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包