pytorch怎么打印网络回传梯度
发表于:2024-11-29 作者:千家信息网编辑
千家信息网最后更新 2024年11月29日,这篇文章将为大家详细讲解有关pytorch怎么打印网络回传梯度,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。需求:打印梯度,检查网络学习情况net = your_n
千家信息网最后更新 2024年11月29日pytorch怎么打印网络回传梯度
这篇文章将为大家详细讲解有关pytorch怎么打印网络回传梯度,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
需求:
打印梯度,检查网络学习情况
net = your_network().cuda()def train(): ... outputs = net(inputs) loss = criterion(outputs, targets) loss.backward() for name, parms in net.named_parameters(): print('-->name:', name, '-->grad_requirs:',parms.requires_grad, ' -->grad_value:',parms.grad) ...
打印结果中:
name表示网络参数的名字; parms.requires_grad 表示该参数是否可学习,是不是frozen的; parm.grad 打印该参数的梯度值。
补充:pytorch的梯度计算
看代码吧~
import torchfrom torch.autograd import Variablex = torch.Tensor([[1.,2.,3.],[4.,5.,6.]]) #grad_fn是Nonex = Variable(x, requires_grad=True)y = x + 2z = y*y*3out = z.mean()#x->y->z->outprint(x)print(y)print(z)print(out)#结果:tensor([[1., 2., 3.], [4., 5., 6.]], requires_grad=True)tensor([[3., 4., 5.], [6., 7., 8.]], grad_fn=)tensor([[ 27., 48., 75.], [108., 147., 192.]], grad_fn=)tensor(99.5000, grad_fn=)
若是关于graph leaves求导的结果变量是一个标量,那么gradient默认为None,或者指定为"torch.Tensor([1.0])"
若是关于graph leaves求导的结果变量是一个向量,那么gradient是不能缺省的,要是和该向量同纬度的tensor
out.backward()print(x.grad)#结果:tensor([[3., 4., 5.], [6., 7., 8.]])#如果是z关于x求导就必须指定gradient参数:gradients = torch.Tensor([[2.,1.,1.],[1.,1.,1.]])z.backward(gradient=gradients)#若z不是一个标量,那么就先构造一个标量的值:L = torch.sum(z*gradient),再关于L对各个leaf Variable计算梯度#对x关于L求梯度x.grad#结果:tensor([[36., 24., 30.], [36., 42., 48.]])
错误情况
z.backward()print(x.grad) #报错:RuntimeError: grad can be implicitly created only for scalar outputs只能为标量创建隐式变量 x1 = Variable(torch.Tensor([[1.,2.,3.],[4.,5.,6.]])) x2 = Variable(torch.arange(4).view(2,2).type(torch.float), requires_grad=True)c = x2.mm(x1)c.backward(torch.ones_like(c))# c.backward()#RuntimeError: grad can be implicitly created only for scalar outputsprint(x2.grad)
从上面的例子中,out是常量,可以默认创建隐变量,如果反向传播的不是常量,要知道该矩阵的具体值,在网络中就是loss矩阵,方向传播的过程中就是拿该归一化的损失乘梯度来更新各神经元的参数。
看到一个博客这样说:loss = criterion(outputs, labels)对应loss += (label[k] - h) * (label[k] - h) / 2
就是求loss(其实我觉得这一步不用也可以,反向传播时用不到loss值,只是为了让我们知道当前的loss是多少)
我认为一定是要求loss的具体值,才能对比阈值进行分类,通过非线性激活函数,判断是否激活。
关于"pytorch怎么打印网络回传梯度"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
梯度
结果
网络
参数
变量
标量
就是
篇文章
求导
传播
向量
常量
情况
更多
激活
矩阵
若是
学习
不错
实用
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
闵行区常规软件开发质量保障
2020全国网络安全技能
获取linux服务器编码格式
游戏软件开发的工资待遇
英语倡议书格式范文网络安全
软件开发方向什么热门
mic 服务器
车载软件开发前景
高防cdn服务器安全吗
华擎x99极限玩家3能用服务器
奉贤区上门软件开发厂家范围
软件开发数据库如何进行测试
搭建官网需要服务器吗
发送一条请求怎么查看数据库
计算机三级网络技术交换机
阿里云服务器更换系统教程
只有备份文件怎么做数据库
定位服务器的选择
ftp服务器搭建xp
excel服务器软件有用吗
网络安全性的参考文献
云nas音乐服务器搭建
九章服务器
海南州网络技术哪家强
宁波软件开发学徒招聘
数据库创建表的时候怎么设计关系
数据库如何从视图中查询信息
省委网络安全人才培养
兴业数金数据库笔试题
上海访客管理软件开发服务