主要目标

有的时候想看一下设置了优化器和学习率之后是否按照我设置的样子去进行更新,所以想查看一下网络参数中的及各相关变量:

  • 更新前的值
  • 优化器中的学习率
  • 计算出loss之后的梯度值
  • 更新后的值

有了这几个值,可能在之后我调试网络结构的过程当中能确保代码没有问题,或者检查中间的结果

实验代码1:查看梯度以及参数更新的问题

import torch
import torch.nn as nn
import numpy as np
import torch.optim as optim
from torchsummary import summary
import os
from torch.utils.data.dataset import Dataset
from torch.utils.data import DataLoader
from tqdm import tqdm# 设置一下数据集   数据集的构成是随机两个整数,形成一个加法的效果 input1 + input2 = label
class TrainDataset(Dataset):def __init__(self):super(TrainDataset, self).__init__()self.data = []for i in range(1,1000):for j in range(1,1000):self.data.append([i,j])def __getitem__(self, index):input_data = self.data[index]label = input_data[0] + input_data[1]return torch.Tensor(input_data),torch.Tensor([label])def __len__(self):return len(self.data)class TestNet(nn.Module):def __init__(self):super(TestNet, self).__init__()self.net1 = nn.Linear(2,1)def forward(self, x):x = self.net1(x)return xdef train():traindataset = TrainDataset()traindataloader = DataLoader(dataset = traindataset,batch_size=1,shuffle=False)testnet = TestNet().cuda()myloss = nn.MSELoss().cuda()optimizer = optim.SGD(testnet.parameters(), lr=0.001 )for epoch in range(100):for data,label in traindataloader :print("\n=====迭代开始=====")data = data.cuda()label = label.cuda()output = testnet(data)print("输入数据:",data)print("输出数据:",output)print("标签:",label)loss = myloss(output,label)optimizer.zero_grad()for name, parms in testnet.named_parameters():   print('-->name:', name)print('-->para:', parms)print('-->grad_requirs:',parms.requires_grad)print('-->grad_value:',parms.grad)print("===")loss.backward()optimizer.step()print("=============更新之后===========")for name, parms in testnet.named_parameters(): print('-->name:', name)print('-->para:', parms)print('-->grad_requirs:',parms.requires_grad)print('-->grad_value:',parms.grad)print("===")print(optimizer)input("=====迭代结束=====")if __name__ == '__main__':os.environ["CUDA_VISIBLE_DEVICES"] = "{}".format(3)train()

代码结果1

结果说明

网络前传公式
weight1∗input1+weight2∗input2+bias=outputweight1*input1+weight2*input2+bias = output weight1∗input1+weight2∗input2+bias=output
MSEloss的计算公式
Loss=(output−label)2\text{Loss} = {(output-label)}^2 Loss=(output−label)2
针对几个参数的偏导数可以用如下的方式计算:
∂Loss∂weight1=∂Loss∂output∂output∂weight1=2(output−label)input1=2(1.0098−2)∗1=−1.9805\frac{\partial\text{Loss}}{\partial weight1} = \frac{\partial\text{Loss}}{\partial output}\frac{\partial output}{\partial weight1} =2(output-label)input1 = 2(1.0098-2)*1=-1.9805 ∂weight1∂Loss​=∂output∂Loss​∂weight1∂output​=2(output−label)input1=2(1.0098−2)∗1=−1.9805

∂Loss∂weight2=∂Loss∂output∂output∂weight2=2(output−label)input2=2(1.0098−2)∗1=−1.9805\frac{\partial\text{Loss}}{\partial weight2} = \frac{\partial\text{Loss}}{\partial output}\frac{\partial output}{\partial weight2} =2(output-label)input2 = 2(1.0098-2)*1=-1.9805 ∂weight2∂Loss​=∂output∂Loss​∂weight2∂output​=2(output−label)input2=2(1.0098−2)∗1=−1.9805

∂Loss∂bias=∂Loss∂output∂output∂bias=2(output−label)=2(1.0098−2)=−1.9805\frac{\partial\text{Loss}}{\partial bias} = \frac{\partial\text{Loss}}{\partial output}\frac{\partial output}{\partial bias} =2(output-label) = 2(1.0098-2)=-1.9805 ∂bias∂Loss​=∂output∂Loss​∂bias∂output​=2(output−label)=2(1.0098−2)=−1.9805

运行一下代码换几个输入输出梯度就不一样了,这里主要是因为输入是两个1所以导致剃度一样。

数据更新
weight1new=−0.0795−(−1.9805)∗0.001=−0.0776weight2new=0.625−(−1.9805)∗0.001=0.627bias=0.4643−(−1.9805)∗0.001=0.4663\begin{aligned} weight1_{new} = -0.0795 - (-1.9805)*0.001=-0.0776\\ weight2_{new} = 0.625 - (-1.9805)*0.001=0.627\\ bias = 0.4643 - (-1.9805)*0.001=0.4663 \end{aligned} weight1new​=−0.0795−(−1.9805)∗0.001=−0.0776weight2new​=0.625−(−1.9805)∗0.001=0.627bias=0.4643−(−1.9805)∗0.001=0.4663​

实验代码2:不同优化器的验证(Adam)

将实验1中的优化器换为如下的代码

optimizer = optim.Adam(testnet.parameters(), lr=0.001, betas=(0.9, 0.99))

代码结果2

验证一下梯度loss求导公式没变所以针对梯度我们就不验证了

验证一下Adam的更新

算一下实际用于更新的梯度
mt=β1∗mt−1+(1−β1)∗gtvt=β2∗vt−1+(1−β2)∗gt2mt^=mt1−β1tvt^=nt1−β2tθt=θt−1−mt^vt^+ϵ∗α\begin{aligned} &m_{t}=\beta_1 * m_{t-1}+(1-\beta_1) * g_{t} \\ &v_{t}=\beta_2 * v_{t-1}+(1-\beta_2) * g_{t}^{2} \\ &\hat{{m}_{t}}=\frac{m_{t}}{1-\beta_1^{t}} \\ &\hat{{v}_{t}}=\frac{n_{t}}{1-\beta_2^{t}} \\ &\theta_{t}=\theta_{t-1}-\frac{\hat{{m}_{t}}}{\sqrt{\hat{{v}_{t}}}+\epsilon} * \alpha \end{aligned} ​mt​=β1​∗mt−1​+(1−β1​)∗gt​vt​=β2​∗vt−1​+(1−β2​)∗gt2​mt​^​=1−β1t​mt​​vt​^​=1−β2t​nt​​θt​=θt−1​−vt​^​​+ϵmt​^​​∗α​
我们验证一个weight1weight1weight1
mt=0.9∗m0+(1−0.9)∗−4.3555=−0.43555nt=0.99∗n0+(1−0.99)∗−4.35552=0.1897m^t=−0.435551−0.91=−4.3555n^t=0.18971−0.991=18.97−0.2538=−0.2548−−4.355518.97+ϵ∗0.001\begin{aligned} &m_{t}=0.9 * m_{0}+(1-0.9) * -4.3555 = -0.43555\\ &n_{t}=0.99 * n_{0}+(1-0.99) *-4.3555^{2} = 0.1897\\ &\hat{m}_{t}=\frac{-0.43555}{1-0.9^1} = -4.3555 \\ &\hat{n}_{t}=\frac{0.1897}{1-0.99^1} =18.97\\ &-0.2538=-0.2548-\frac{-4.3555}{\sqrt{18.97}+\epsilon} * 0.001 \end{aligned} ​mt​=0.9∗m0​+(1−0.9)∗−4.3555=−0.43555nt​=0.99∗n0​+(1−0.99)∗−4.35552=0.1897m^t​=1−0.91−0.43555​=−4.3555n^t​=1−0.9910.1897​=18.97−0.2538=−0.2548−18.97​+ϵ−4.3555​∗0.001​
会发现第一轮的时候最终更新的幅度一定是等于学习率的,这个结论我们等会在实验代码三种再使用一次

实验代码3:优化器对不同层不同参数设置不一样的学习率

比较具体的可以参考之后的一片博客

Pytorch不同层设置不同学习率_呆呆象呆呆的博客-CSDN博客

将实验1中的优化器换为如下的代码

    optimizer = optim.Adam([{'params': testnet.net1.weight,'lr': 1e-2},{'params': testnet.net1.bias, 'lr': 1e-1}])

代码结果3

使用一下实验二的结果Adam优化器第一轮的更新幅度就等于学习率

补充说明

好像只能对一个具体的层进行参数的学习率设置,而不能再细化下去对每个层的不同位置的参数进行学习率的精细调整

LAST 参考文献

Pytorch 查看模型参数_happyday_d的博客-CSDN博客_pytorch查看模型参数

简单认识Adam优化器 - 简书

Pytorch 模型 查看网络参数的梯度以及参数更新是否正确,优化器学习率设置固定的学习率,分层设置学习率相关推荐

  1. 选择正确优化器,加速深度学习模型训练

    ❤️觉得内容不错的话,欢迎点赞收藏加关注

  2. 【视频课】Pytorch模型分析进阶(可视化,参数量与计算量,计算速度)

    课程内容 本次课程内容是Pytorch的高阶使用部分,要求大家预先要熟练掌握Pytorch.总课程大纲包括Pytorch模型结构的分析,Pytorch模型速度与计算量分析,Pytorch模型可视化3部 ...

  3. Pytorch生成对抗网络(GAN)官方入门教程

    目录 引言(Introduction) 生成对抗网络(Generative Adversarial Networks) 什么是GAN?(What is a GAN?) 什么是DCGAN?(What i ...

  4. 快速上手笔记,PyTorch模型训练实用教程(附代码)

    机器之心发布 作者:余霆嵩 前言 自 2017 年 1 月 PyTorch 推出以来,其热度持续上升,一度有赶超 TensorFlow 的趋势.PyTorch 能在短时间内被众多研究人员和工程师接受并 ...

  5. PyTorch 模型训练实用教程(附代码)

    向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程   公众号:datayx PyTorch 能在短时间内被众多研究人员和工程师接受并推崇是因为其有着诸多优点,如采用 Py ...

  6. 《PyTorch模型训练实用教程》—学习笔记

    文章目录 前言 数据 Dataset类 DataLoader类 transform 裁剪-Crop 翻转和旋转-Flip and Rotation 图像变换 对transforms操作,使数据增强更灵 ...

  7. ifconfig命令找不到_02. Linux命令之查看网络连接

    1. 查看网络连接数和端口 使用 netstat 命令查看网络连接情况 netstat -anp 参数: -a 显示所有选项 -t (tcp)仅显示tcp相关选项 -u (udp)仅显示udp相关选项 ...

  8. 【资源下载】《Pytorch模型训练实现教程》(附下载链接)

    前言 自 2017 年 1 月 PyTorch 推出以来,其热度持续上升,一度有赶超 TensorFlow 的趋势.PyTorch 能在短时间内被众多研究人员和工程师接受并推崇是因为其有着诸多优点,如 ...

  9. Pytorch框架中SGD&Adam优化器以及BP反向传播入门思想及实现

    因为这章内容比较多,分开来叙述,前面先讲理论后面是讲代码.最重要的是代码部分,结合代码去理解思想. SGD优化器 思想: 根据梯度,控制调整权重的幅度 公式: 权重(新) = 权重(旧) - 学习率 ...

  10. 【Pytorch学习笔记三】Pytorch神经网络包nn和优化器optm(一个简单的卷积神经网络模型的搭建)

    文章目录 一, 神经网络包nn 1.1定义一个网络 1.2 损失函数 二.优化器 nn构建于 Autograd之上,可用来定义和运行神经网络, PyTorch Autograd 让我们定义计算图和计算 ...

最新文章

  1. linux我安装虚拟机后安装FTP出现如下错误求解决
  2. 监控利器之 Prometheus
  3. python自带的shell是什么-python shell是什么东西
  4. Linux 常见命令
  5. java-多线程知识
  6. ios 代码设置控件宽高比_ios-自动布局以保持视图大小比例
  7. 申通完美支撑“双11”——亿级包裹背后的云基础设施
  8. MySQL 服务挂了 CPU 消耗接近 100% 你知道怎么回事吗???
  9. TestNg测试框架使用
  10. eclipse折叠if语句块_第五章 if语句
  11. html生成图片有色差,引起打印的产品和电脑图片有色差的原因有哪些?
  12. 树莓派 armv几_如何在具有armv6处理器的树莓派板上安装和使用Java 11和JavaFX 11
  13. 远程医疗作用_是远程医疗保健的未来
  14. 小试牛刀1:制作一个简单的导航栏页面
  15. 【Games101】Lecture05 光栅化 笔记
  16. 大一到大二的总结与感想
  17. python3今日头条App电商数据抓取
  18. webpack打包路径更改_webpack打包教程
  19. html给页面整体添加左右边距_DIV CSS padding内补白(内边距)left right top bottom案例教程...
  20. 【阿里云】短信服务 无认证 测试版本 附带短信发送工具类

热门文章

  1. Hive的行列转换(行转多列、多列转行、行转单列、单列转行)
  2. 硬盘分区形式之MBR、GPT
  3. [4G5G专题-78]:流程 - 4G LTE 核心网的Attach流程
  4. 【饥荒脚本】饥荒控制台代码自动输入
  5. 《涨知识啦34》-LED器件的I-V特性曲线
  6. wordpress 通过get_the_excerpt和the_excerpt函数获取文章摘要
  7. python sin_Python入门之三角函数sin()函数实例详解
  8. sin40度不用计算机怎么求,sin40度怎么算 sin40度如何算
  9. ShuipFCMS -- 简单强大内容管理系统
  10. 在android客户端加载html源代码总结