一、相关代码

我们创建了一个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
注意损失函数所需要的数据形状要正确。

PyTorch 教程系列:https://blog.csdn.net/qq_38962621/category_10652223.html PyTorch教程-2:PyTorch反向传播梯度追踪与计算 torch.Tensor类具有一个属性 requires_grad 用以表示该tensor是否需要计算梯度,如果该属性设置为True的话,表示这个张量需要计算梯度,计算梯度的张量会跟踪其在后续的所有运算,当我们完成计算后需要反向传播(back propagation)计算梯度时,使用 .back
自动求梯度 torch提供了简便的求梯度方法:带入变量值x,求解目标函数f(x),将目标函数的值反向传播f.backward(),就能计算对应变量的导数。 例如最简单的直线函数: f(x)=ax2+bf(x)=ax^2+bf(x)=ax2+b 其中:a,b是已知的参数,对x 求导: f′(x)=2axf'(x)=2axf′(x)=2ax 当a=1,x=1时a=1,x=1时a=1,...
为什么要使用梯度检测 我们需要使用反向传播算法完成神经网络的训练任务,反向传播算法是不能出现错误的,一旦出现错误那么神经网络的训练就会出现意想不到的问题。我们一般不能根据反向传播算法的运行结果判断反向传播算法是否执行正确,也就是反向传播算法是否执行正确,我们也不知道。那么既然反向传播算法的正确这么重要,那么我们就应该能够通过一种方式来判断神经网络的反向传播算法是否执行正确,我们可以使用梯度检测完成这个任务。 梯度检测的原理 假如此时的神经网络的损失函数如上所示,θ0处的导数,也就是上图中的蓝色直线的斜率
复现论文的时候一直在思考模型梯度注入的方式,对于模型参数加载很容易得知: #方式1:state_dict()后注入 def model_change1(model,param): model:被注入的模型 param:要注入model的参数,此例子为与参数同size w_avg = copy.deepcopy(model.state_dict()) for key in w_avg.keys():
参考:https://www.jianshu.com/p/5460b7fa3ec4、https://blog.csdn.net/weixin_41990278/article/details/111414592、 https://www.cnblogs.com/picassooo/p/14153787.html、 https://editor.csdn.net/md/?articleId=117135289、 https://blog.csdn.net/weixin_36411839/article/det
在训练网络中发现了结果一直不变的问题,就去输出看看网络参数: dicte = model.state_dict() # .items() print('up_concat4.conv.conv2.0.weight', dicte['up_concat4.conv.conv2.0.weight'][0]) print('center.conv2.0.bias', dicte['center.conv2.0.bias']) print('center.conv1.0.bias', dicte['center.
在编写好自己的 autograd function 后,可以利用gradcheck中提供的gradcheck和gradgradcheck接口,对数值算得的梯度和求导算得的梯度进行比较,以检查backward是否编写正确。 即用它可以check自己写的反向传播函数是否正确 这个函数可以自己计算通过数值法求得的梯度,然后和我们写的backward的结果比较 在下面的例子中,我们自己实现了Sigmoid函数,并利用gradcheck来检查backward的编写是否正确。 impo...
torch.save:保存序列化的对象到磁盘,使用了Python的pickle进行序列化,模型、张量、所有对象的字典。 torch.load:使用了pickle的unpacking将pickled的对象反序列化到内存中。 torch.nn.Module.load_state_dict:使用反序列化的state_dict加载模型的参数字典。 state_dict 是一个Python字典,将每一层...
pytorch报错(4)forward() missing 1 required positional argument: ‘x‘或者‘NoneType‘ object is not callable 28986
pytorch报错(4)forward() missing 1 required positional argument: ‘x‘或者‘NoneType‘ object is not callable xt1317348220: 多了括号的原因报错,找了半天表情包 pytorch报错(4)forward() missing 1 required positional argument: ‘x‘或者‘NoneType‘ object is not callable 永远的大大真: 很有用!!!一个括号困了我一下午!!感谢 pytorch报错(4)forward() missing 1 required positional argument: ‘x‘或者‘NoneType‘ object is not callable 秋水三千尺: 还真是多了括号的原因导致的,感谢大佬的帮助 pytorch学习(2):通过检查梯度参数,判断是否正常反向传播 快去写论文: 这个路子有点野,但是很有道理 pytorch报错(4)forward() missing 1 required positional argument: ‘x‘或者‘NoneType‘ object is not callable Moon_candy: 很有帮助,谢谢大佬 pytorch报错(4)forward() missing 1 required positional argument: ‘x‘或者‘NoneType‘ object is not callable pytorch报错整理(1):搭建卷积层时,误用Conv2d和conv2d而引发的错误 pytorch报错(4)forward() missing 1 required positional argument: ‘x‘或者‘NoneType‘ object is not callable pytorch报错整理(1):搭建卷积层时,误用Conv2d和conv2d而引发的错误