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安全错误
数据库的锁怎样保障安全
连不上mysql软件开发
帮别人软件开发交付流程
天然气网络安全创新
揭阳进销存软件开发费用
办公楼设计软件开发
jdbc创建数据库用户
数据库小型超市会员管理系统
汉威科技工业互联网
rtx 服务器设置
2019网络安全国家政策
儿童网络安全做到三不
联影医疗科技互联网医院牌照
iis服务器默认文档y
服务器虚拟化解决方案pdf
手机免费代理服务器怎么用
最右显示服务器繁忙
广东专科学院软件开发工程师
浙江软件开发驻场靠谱吗
连云港app软件开发价钱
软件开发培训l
软件开发定制文案
搭建群发服务器
宁波构建智慧医院软件开发
awvs数据库服务启动不了
怎么进行数据库安全
后端软件开发专业
域名交易所软件开发公司
吉林网络技术服务参考价
什么服务器主板好用
网络安全周漫说网络安全