pytorch模型查看网络参数的梯度以及参数更新是否正确,优化器学习率的分层设置(代码片段)

呆呆象呆呆 呆呆象呆呆     2022-12-22     488

关键词:

主要目标

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

  • 更新前的值
  • 优化器中的学习率
  • 计算出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 x

def 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

结果说明

网络前传公式
w e i g h t 1 ∗ i n p u t 1 + w e i g h t 2 ∗ i n p u t 2 + b i a s = o u t p u t weight1*input1+weight2*input2+bias = output weight1input1+weight2input2+bias=output
MSEloss的计算公式
Loss = ( o u t p u t − l a b e l ) 2 \\textLoss = (output-label)^2 Loss=(outputlabel)2
针对几个参数的偏导数可以用如下的方式计算:
∂ Loss ∂ w e i g h t 1 = ∂ Loss ∂ o u t p u t ∂ o u t p u t ∂ w e i g h t 1 = 2 ( o u t p u t − l a b e l ) i n p u t 1 = 2 ( 1.0098 − 2 ) ∗ 1 = − 1.9805 \\frac\\partial\\textLoss\\partial weight1 = \\frac\\partial\\textLoss\\partial output\\frac\\partial output\\partial weight1 =2(output-label)input1 = 2(1.0098-2)*1=-1.9805 weight1Loss=outputLossweight1output=2(outputlabel)input1=2(1.00982)1=1.9805

∂ Loss ∂ w e i g h t 2 = ∂ Loss ∂ o u t p u t ∂ o u t p u t ∂ w e i g h t 2 = 2 ( o u t p u t − l a b e l ) i n p u t 2 = 2 ( 1.0098 − 2 ) ∗ 1 = − 1.9805 \\frac\\partial\\textLoss\\partial weight2 = \\frac\\partial\\textLoss\\partial output\\frac\\partial output\\partial weight2 =2(output-label)input2 = 2(1.0098-2)*1=-1.9805 weight2Loss=outputLossweight2output=2(outputlabel)input2=2(1.00982)1=1.9805

∂ Loss ∂ b i a s = ∂ Loss ∂ o u t p u t ∂ o u t p u t ∂ b i a s = 2 ( o u t p u t − l a b e l ) = 2 ( 1.0098 − 2 ) = − 1.9805 \\frac\\partial\\textLoss\\partial bias = \\frac\\partial\\textLoss\\partial output\\frac\\partial output\\partial bias =2(output-label) = 2(1.0098-2)=-1.9805 biasLoss=outputLossbiasoutput=2(outputlabel)=2(1.00982)=1.9805

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

数据更新
w e i g h t 1 n e w = − 0.0795 − ( − 1.9805 ) ∗ 0.001 = − 0.0776 w e i g h t 2 n e w = 0.625 − ( − 1.9805 ) ∗ 0.001 = 0.627 b i a s = 0.4643 − ( − 1.9805 ) ∗ 0.001 = 0.4663 \\beginaligned 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 \\endaligned 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的更新

算一下实际用于更新的梯度
m t = β 1 ∗ m t − 1 + ( 1 − β 1 ) ∗ g t

-pytorch实现深度神经网络与训练(代码片段)

...层的权重进行初始化2.针对一个网络的权重初始化方法6.pytorch中定义网络的方式6.1数据准备6.2网络定义与训练方式16.3网络定义与训练方式27.Pytorch模型保存和加载方法1.随机梯度下降算法在深度学习网络中,通常需要设计一个... 查看详情

使用pytorch实现transformer,如何巧妙的使用或者停用optimizer.zero_grad()来训练大模型?

...d()意思是把梯度置零,也就是把loss关于weight的导数变成0.pytorch对于每个batch大都执行了这样的操作:optimizer.zero_grad()##梯度清零preds=model(inputs)##inferenceloss=criterion(preds,targets)##求解lossloss.backward()##反向传播求解梯度optimizer.step()##更... 查看详情

pytorch实现网络部分层的固定不进行回传更新(代码片段)

实际问题Pytorch有的时候需要对一些层的参数进行固定,这些层不进行参数的梯度更新问题解决思路那么从理论上来说就有两种办法优化器初始化的时候不包含这些不想被更新的参数,这样他们会进行梯度回传,但是... 查看详情

[深度学习][pytorch]pytorch实现一个简单得线性回归模型并训练

一个典型的神经网络的训练过程如下:定义具有学习参数(或权重)的神经网络迭代输入数据集根据神经网络对输入数据集进行运算计算损失(输出与真实结果的距离,损失越小说明模型越准确)将梯度反... 查看详情

使用 Pytorch 的梯度矩阵 (NxWxEPOCH)

】使用Pytorch的梯度矩阵(NxWxEPOCH)【英文标题】:GradientMatrix(NxWxEPOCH)usingPytorch【发布时间】:2021-10-0900:42:18【问题描述】:我正在尝试使用参数和EPOCH的每个观察值的梯度创建一个梯度矩阵。如果我的模型有100个obs、1000个参数和10... 查看详情

pytorch学习笔记8.实现线性回归模型

PyTorch学习笔记8.实现线性回归模型一、回归的概念1.概念2.目标3.应用4.训练线性回归的步骤二、数据集1.构造数据集2.把数据集转为pytorch使用的张量三、模型1.模型定义2.损失函数3.优化器四、使用模型1.训练2.测试3.预测4.可视化五... 查看详情

神经网络基础部件-优化算法详解(代码片段)

...化算法对于深度学习非常重要,如果说网络参数初始化(模型迭代的初始点)能够决定模型是否收敛,那优化算法的性能则直接影响模型的训练效率。了解不同优化算法的原理及其超参数的作用将使我们更有效的调整优化器的超... 查看详情

【神经网络原理】如何利用梯度下降法更新权重与偏置

参考技术A损失函数的值减小,意味着神经网络的预测值(实际输出)和标签值(预期的输出)越接近。损失函数通常为多元函数,其自变量包括网络中包含的所有的权重w、以及所有的偏置b,有的地方也将其称作代价函数(Costfunc... 查看详情

pytorch:自动求导(代码片段)

...就是为什么它被称为反向传播。为了计算这些梯度,PyTorch有一个内置的微分引擎torch.autograd。它支持任何计算图的梯度自动计算。importtorchx=torch.ones(5)#inputtensory=torch.zeros(3)#expectedoutputw=torch.randn(5,3,requires_grad=True)b&... 查看详情

计算梯度:网络的前向与反向传播和优化方法:更新模型参数的方法

...及一些常用的损失函数。你还记得我们当时说的么:模型有了损失函数,才能够进行学习。那么问题来了,模型是如何通过损失函数进行学习的呢?在接下来,我们将会学习前馈网络、导数与链式法则、反向... 查看详情

pytorch-优化模型参数(代码片段)

参考:OPTIMIZINGMODELPARAMETERS梯度反向传播算法,更新参数SGD->Adamdataset->dataloader,train_dataloader训练,test_dataloader测试,迭代器模型继承Module类,__init__(self),定义层ÿ 查看详情

基于pytorch模型剪枝的实现(极大的减少模型计算参数加快模型运行速度)(代码片段)

深度模型剪枝实现以及一些网络优化技巧模型剪枝:LearningEfficientConvolutionalNetworksThroughNetworkSlimming(ICCV2017).基于论文的代码复现以及拓展:在网络上中加入其它优化方法最强深度学习优化器Rangerwarmup与consinelearningrate为什... 查看详情

神经网络基础部件-参数初始化详解(代码片段)

一,参数初始化概述我们知道神经网络模型一般是依靠随机梯度下降优化算法进行神经网络参数更新的,而神经网络参数学习是非凸问题,利用梯度下降算法优化参数时,网络权重参数的初始值选取十分关键。首先得明确的是现... 查看详情

深度学习性能的提升

...于梯度消失/爆炸的原因,参数的初始化关系着神经网络模型性能的问题。常见的参数的初始化有以下几种:0初始化随机初始化He初始化0初始化:所谓0初始化就是将所有的参数都初始化为零,但是由于初始化的值是一样的,它将... 查看详情

分布式tensorflow:谁应用参数更新?

我已经使用过TensorFlow但是对于训练模型分发TensorFlow是新手。我的理解是,当前的最佳实践支持使用异步更新的数据并行模型:GoogleBrain团队于2016年4月发布的一篇论文对各种方法进行了基准测试,发现使用一些备用复制品进行同... 查看详情

梯度下降:sgdvsmomentumvsnagvsadagradvsadadeltavsrmspropvsadam

...基本公式:这三种梯度下降优化框架的区别在于每次更新模型参数时使用不同的样本数。批/全量梯度下降每次更新模型参数时使用全部的训练样本。,为训练样本数随机梯度下降每次更新参数时从训练样本中随机选择一个样本... 查看详情

深度学习常见问题解析

...,变为 值,再也无法更新。3、权重矩阵的退化导致模型的有效自由度减少。参数空间中学习的退化速度减慢,导致减少了模型的有效维数,网络的可用自由度对学习中梯度范数的贡献不均衡,随着相乘矩阵的数量(即网络... 查看详情

在pytorch中,后向方法的第一个参数(梯度)是啥?

】在pytorch中,后向方法的第一个参数(梯度)是啥?【英文标题】:Whatisthefirstparameter(gradients)ofthebackwardmethod,inpytorch?在pytorch中,后向方法的第一个参数(梯度)是什么?【发布时间】:2018-01-3121:58:18【问题描述】:我们从pytorc... 查看详情