赞
踩
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
在检查神经网络时,我们可能会检查神经网络是否真的把梯度反向传播给了优化器,然而存储梯度参数的变量文件很难找,因此有必要整理一下路径。
我们创建了一个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一栏,可以看到生成了一堆变量文件

由代码可知,我们实例化了一个叫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” ,那说明没有生成梯度参数。

然后我们运行断点,就可以看到 weights文件夹下出现了grad文件夹,虽然文件夹下依然可以看到“grad = {NoneType}None”,但这已经说明有了梯度参数,并进行了反向传播,只不过由于没写优化器,所以优化器还没接受梯度。

黄色文件夹grad后的参数就是梯度参数(grad = {Tensor:(32,3,5,5)}……)
黄色文件夹weight后的参数是该卷积层的权重参数(weight ={Parameter:[32,3,5,5]……})。
路径:实例化的模型名称–>modle1–>protected attitude -->modules -->‘0’–>weight–>grad
注意损失函数所需要的数据形状要正确。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。