Bug记录——nn.Parameter()参数不更新、根据loss自学习权重变量不更新、pytorch 模型自定义参数不更新、网络梯度为None,参数不更新解、tensor参数有梯度,但不更新

2023-10-28

系列文章目录

PyTorch学习——关于tensor、Variable、nn.Parameter()、叶子节点、非叶子节点、detach()函数、查看网络层参数
pytorch优化器——add_param_group()介绍及示例、Yolov7 优化器代码示例


Bug关键词:pytorch 模型自定义参数不更新、网络梯度为None,参数不更新解、tensor参数有梯度,但不更新、nn.Parameter()参数不更新。

1、Bug介绍

记录一个bug。
bug描述:这是关于一个Pytorch模型自定义nn.Parameter()参数不更新的bug。
就是用nn.Parameter()定义一个参数变量,它可以根据loss调整大小。

2、Bug复现、解决bug的心路历程

程序非常简单,但我发现定义的权重变量(self.w)并没有变化。
为了复现bug,这里我用了resnet18网络跑数字手写体mini数据集,网络模型如下:

class resnet18(torch.nn.Module):
    def __init__(self):
        super(resnet18, self).__init__()
        self.block1 = torch.nn.Sequential(
            torch.nn.Conv2d(1, 10, 5),
            torch.nn.MaxPool2d(2),
            torch.nn.ReLU(True),
            torch.nn.BatchNorm2d(10),
        )
        self.block2 = torch.nn.Sequential(
            torch.nn.Conv2d(10, 20, 5),
            torch.nn.MaxPool2d(2),
            torch.nn.ReLU(True),
            torch.nn.BatchNorm2d(20),
        )
        self.fc = torch.nn.Sequential(
            torch.nn.Flatten(),
            torch.nn.Linear(320, 10)
        )
        self.w = torch.nn.Parameter(torch.ones(2)) # 定义自学习参数
        
    def forward(self, x):
        x = self.block1(x)*self.w[0]
        x = self.block2(x)*self.w[1]
        x = self.fc(x)
        return x

输出结果如下:
在这里插入图片描述
从上面的程序看逻辑上没有问题。程序正常运行,就是self.w没有变化。在网上查资料很多人说的是定义的变量不是叶子节点、或者没有求梯度、没有加入网络层等原因。我把这些不确定的原因都通过一些输出函数打印了出来。
结果
是否是叶子节点:发现self.w在初始化的前两个输出是叶子节点,但后面就不是叶子节点了。
梯度:显卡单卡是可以求出梯度的,但梯度很小(例如0.0001),多卡运行梯度输出为None。

这里问题就出现了,我自己nn.Parameter()定义的变量正常来说跟网络层的权重一样是叶子节点,而且默认求梯度,为什么输出是非叶子节点且梯度为None。然后我开是蒙了。

关于叶子节点和梯度的介绍可以看这个:PyTorch学习——关于tensor、Variable、nn.Parameter()、叶子节点、非叶子节点、detach()函数、查看网络层参数

之后我想是不是梯度太小加学习率太小。导致为0了。然后开始向学习率优化器方向入手。结果bug就是出现在了这里。想到这里就差不多知道bug出现的原因了,但并不是学习率太小。而是:
bug:自己定义的self.w参数并没有加入到优化器中迭代。 很多网络是直接对全局定义,那么自己定义的self.w参数自然加入了优化器。比如这样:

optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.5)

而我用的是yolo网络,优化器函数如下:
self.w参数没有加入了优化器的迭代行列自然不会根据损失调整大小。

#---------------------------------------------------------------------# 
# 构造损失函数和优化函数
# 损
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Bug记录——nn.Parameter()参数不更新、根据loss自学习权重变量不更新、pytorch 模型自定义参数不更新、网络梯度为None,参数不更新解、tensor参数有梯度,但不更新 的相关文章

随机推荐

  • python中super的作用_Python代码中super()函数具有哪些功能呢?

    摘要 下文讲述Python代码中super 函数的功能说明 如下所示 super函数简介 super 函数是Python中的一个内置函数 用来处理多重继承问题中直接用类名调用父类方法 在使用单继承的时候没问题 当使用多继承 会涉及到查找顺序
  • 小米4A刷入breed教程

    已迁移到新的博客 新链接 飞young使用路由器教程 ndsx的博客 CSDN博客https blog csdn net qq 58617843 article details 127381367 csdn share tail 7B 22
  • Go 语言面试题(一):基础语法

    文章目录 Q1 和 的区别 Q2 指针的作用 Q3 Go 允许多个返回值吗 Q4 Go 有异常类型吗 Q5 什么是协程 Goroutine Q6 如何高效地拼接字符串 Q7 什么是 rune 类型 Q8 如何判断 map 中是否包含某个 k
  • Oracle中的序列(Sequence)

    1 什么是序列 序列 SEQUENCE 是序列号生成器 可以为表中的行自动生成序列号 产生一组等间隔的数值 类型为数字 不占用磁盘空间 占用内存 其主要用途是生成表的主键值 可以在插入语句中引用 也可以通过查询检查当前值 或使序列增至下一个
  • 入坑nodemcu,从刷固件到点亮LED,读完这篇文章就够了

    今天进手了一块nodemcu 准备入坑 有兴趣的朋友们 跟着小智手机手学习如何刷Lua固件且运行第一个亮灯实例吧 nodemcu NodeMCU 是一个开源的物联网平台 它包含了可以运行在esp8266 Wi FiSoC芯片之上的固件 以及
  • 一个C#操作Excel类,功能比较全

    using System using System Data using System Configuration using System Web using Microsoft Office Interop using Microsof
  • 【STM32】系统时钟RCC详解(超详细,超全面)

    RCC Reset and Clock Control 复位和时钟控制 在绝大部分MCU芯片中都包含复位和时钟控制模块 也是MCU重要的组成部分 相比于以前51单片机 现在STM32内部集成的时钟模块功能更加丰富 包含时钟选择 倍频 输出
  • Vue.js基础知识解析:Vue绑定

    文章目录 Vue绑定 类绑定 对象语法 数组语法 样式绑定 对象语法 数组语法 常见绑定 文本绑定 属性绑定 事件绑定 Vue绑定 Vue js 是一种流行的前端 JavaScript 框架 用于构建交互式的用户界面 在 Vue 中 有多种
  • 微信小程序.日期组件

    缘起 微信小程序官方提供的picker样式不好控制 跟其他样式不统一 也没法进行其他操作 不如自定义一个 使用 picker view封装为一个组件 代码现成 直接复制过去用吧 效果 组件代码 haiweidate wxml
  • msgpack c++的使用

    msgpack C 的使用 一 MessagePack 是什么 二 msgpack的使用 三 总结 一 MessagePack 是什么 MessagePack 是一种高效的二进制序列化格式 二 msgpack的使用 include
  • 安卓(Android)的原生系统真的那么好用吗

    定制系统有定制系统的优点 它一定更适合中国的大众用户 毕竟中国的大众用户甚至连微信调整一个功能都可能不会使用了 学习成本 这种东西能不要就不要 在 Android 9 0 之前也一定更适合中国的 Android 软件环境 原生 Androi
  • tomcat如何增大并发_【高并发】高并发环境下如何优化Tomcat性能?看完我懂了!...

    写在前面 Tomcat作为最常用的Java Web服务器 随着并发量越来越高 Tomcat的性能会急剧下降 那有没有什么方法来优化Tomcat在高并发环境下的性能呢 Tomcat运行模式 Tomcat的运行模式有3种 1 bio模式 默认的
  • Doxygen和VS助手配置代码注释模板

    Title FileNote Shortcut filenote Description 文件注释 Copyright c YEAR xx科技有限公司 http blog csdn net stelalala All rights rese
  • android ios通用OTG,被忽视的iOS13福利:OTG随心读写移动SSD

    被忽视的iOS13福利 OTG随心读写移动SSD 2019 09 22 15 58 14 11点赞 59收藏 29评论 iOS13带来了深色模式 HapticTouch等众多新功能 但很少有人提到OTG读取优盘 移动固态硬盘的新增特性 所需
  • MySQL视图详解

    今天继续给大家介绍MySQL相关知识 本文主要内容是MySQL视图 一 MySQL视图详解 MySQL引入了视图的概念 所谓视图 其实就是一张虚拟的数据表 该数据表与其他普通数据表一样 有列和属性 视图和普通的数据表唯一不同的是 视图中本身
  • Java定义一个队列Queue及操作

    定义一个队列 定义一个队列 Queue
  • postMessage - 跨域消息传递

    window postMessage 方法允许来自一个文档的脚本可以传递文本消息到另一个文档里的脚本 而不用管是否跨域 一个文档里的脚本还是不能调用在其他文档里方法和读取属性 但他们可以用这种消息传递技术来实现安全的通信 这项技术称为 跨文
  • grep 基本选项

    grep 命令基本格式 gt gt grep 选项 模式 文件 如果模式字符串中有空格必须用 括起来 1 c 选项 表示输出匹配字符串行的数量 默认情况下 grep命令打印出包含模式的所有行 2 n 选项 不但显示匹配的行号 而且会将该行打
  • forms组件

    转载于 https www cnblogs com cmd61 p 11582275 html
  • Bug记录——nn.Parameter()参数不更新、根据loss自学习权重变量不更新、pytorch 模型自定义参数不更新、网络梯度为None,参数不更新解、tensor参数有梯度,但不更新

    系列文章目录 PyTorch学习 关于tensor Variable nn Parameter 叶子节点 非叶子节点 detach 函数 查看网络层参数 pytorch优化器 add param group 介绍及示例 Yolov7 优化器