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