在最后一行(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