pytorch学习(2):通过检查梯度参数,判断是否正常反向传播

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 问题
  • 一、相关代码
  • 二、寻找含有梯度参数的变量文件
  • 总结


问题

在检查神经网络时,我们可能会检查神经网络是否真的把梯度反向传播给了优化器,然而存储梯度参数的变量文件很难找,因此有必要整理一下路径。


一、相关代码

我们创建了一个CFAR10的神经网络,输入测试集,计算交叉熵和下降梯度,并将梯度进行反向传播(优化器部分没有写,这里只演示如何寻找存储梯度的变量文件)

#loss函数的作用:
#计算实际输出和标签之间的误差
#为反向传播提供依据(即梯度)gradient
import torch
import torchvision
#from tensorboardX import SummaryWriter
from torch import nn
from torch.nn import Conv2d, Flatten, Linear, Sequential, MaxPool2d
from torch.utils.data import DataLoader

dataset = torchvision.datasets.CIFAR10("./dataset", train=False,
                                       transform=torchvision.transforms.ToTensor(),download=True)
test_data = DataLoader(dataset, batch_size=64, drop_last=True)
#Sequential 是一个更为简洁的书写方式
class CFAR10_Modle(nn.Module):
    def __init__(self):
        super().__init__()
        self.model1 = Sequential(
            Conv2d(3, 32, kernel_size=5,stride=1, padding=2),
            MaxPool2d(kernel_size=2),
            Conv2d(32, 32, kernel_size=5, stride=1, padding=2),
            MaxPool2d(kernel_size=2),
            Conv2d(32, 64, kernel_size=5, stride=1, padding=2),
            MaxPool2d(kernel_size=2),
            Flatten(),
        #self.linear = Linear(64, 10)  应该是64*4*4
            Linear(1024, 64),
            Linear(64, 10)
        )


    def forward(self, x):
        x = self.model1(x)
        return(x)

Ni_CFAR10_Modle = CFAR10_Modle()
#loss = torch.nn.MSELoss()  #选用误差函数,要看神经网络的输出和数据集的标签是什么形式,这里就是错误的
loss = torch.nn.CrossEntropyLoss()

print(Ni_CFAR10_Modle)
#将数据集传入网络中,计算输出结果并与targets核对,计算误差
for data in test_data:
    images, targets = data
    output = Ni_CFAR10_Modle(images)
    print(output)
    loss_result = loss(output, targets)
    print(loss_result)
    loss_result.backward()  #计算梯度,并反向传播,如果没有这一行是不会计算梯度的, 计算梯度以后,就可以传给优化器 ,来调整参数了
    #查看梯度时,将断点设在“上一行“,然后查看Variables,点击自己”实例化“好的模型名称,
    # 在这里是Ni_CIFAR10_Modle,点击里面的modle1-->protected attitude -->modules -->'0',最下面有个weights文件夹,
    # 在里面找不到grad文件夹,只能看到“grad = {NoneType}None” 那说明没有生成梯度参数
    #注意:如果点击的是‘1’ ‘3’等非卷积层文件夹,,是没有weights的
    #然后,你运行上一行,就可以看到 weight文件夹下出现了grad文件夹,
    # 虽然文件夹下依然可以看到“grad = {NoneType}None”,但这已经说明有了梯度参数。

二、寻找含有梯度参数的变量文件

在最后一行(loss_result.backward())处设置断点,运行pycharm的Debug工具,此时查看Variable一栏,可以看到生成了一堆变量文件
pytorch学习(2):通过检查梯度参数,判断是否正常反向传播_第1张图片
由代码可知,我们实例化了一个叫Ni_CFAR10_Modle的网络模型,所以存储网络模型参数的变量文件也叫Ni_CFAR10_Modle,我们点开此文件,可以看到里面有一个叫modle1的文件夹,我们依次点击modle1–>protected attitude -->modules -->‘0’,'0’文件夹中,最下面有个weight文件夹。
注意:****‘0’ ‘2’ ‘4’ 层是Conv2d,卷积层,有weights参数;像’1’ '3’层这种池化层是没有weights参数的,也就没有weight变量文件。
此时,我们weights文件夹下是没有黄色的名为grad的变量文件夹的,只有一个蓝色图标的:“grad = {NoneType}None” ,那说明没有生成梯度参数。
pytorch学习(2):通过检查梯度参数,判断是否正常反向传播_第2张图片
然后我们运行断点,就可以看到 weights文件夹下出现了grad文件夹,虽然文件夹下依然可以看到“grad = {NoneType}None”,但这已经说明有了梯度参数,并进行了反向传播,只不过由于没写优化器,所以优化器还没接受梯度。
pytorch学习(2):通过检查梯度参数,判断是否正常反向传播_第3张图片
黄色文件夹grad后的参数就是梯度参数(grad = {Tensor:(32,3,5,5)}……)
黄色文件夹weight后的参数是该卷积层的权重参数(weight ={Parameter:[32,3,5,5]……})。

总结

路径:实例化的模型名称–>modle1–>protected attitude -->modules -->‘0’–>weight–>grad
注意损失函数所需要的数据形状要正确。

你可能感兴趣的:(pytorch,学习,深度学习)