位置: IT常识 - 正文

【torch.nn.Parameter 】参数相关的介绍和使用

编辑:rootadmin
【torch.nn.Parameter 】参数相关的介绍和使用 文章目录torch.nn.Parameter基本介绍参数构造参数访问参数初始化使用内置初始化自定义初始化参数绑定参考torch.nn.Parameter基本介绍

推荐整理分享【torch.nn.Parameter 】参数相关的介绍和使用,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

torch.nn.Parameter是继承自torch.Tensor的子类,其主要作用是作为nn.Module中的可训练参数使用。它与torch.Tensor的区别就是nn.Parameter会自动被认为是module的可训练参数,即加入到parameter()这个迭代器中去。

具体格式如下:

torch.nn.parameter.Parameter(data=None, requires_grad=True)

其中 data 为待传入的 Tensor,requires_grad 默认为 True。

事实上,torch.nn 中提供的模块中的参数均是 nn.Parameter 类,例如:

module = nn.Linear(3, 3)type(module.weight)# torch.nn.parameter.Parametertype(module.bias)# torch.nn.parameter.Parameter参数构造

nn.Parameter可以看作是一个类型转换函数,将一个不可训练的类型 Tensor 转换成可以训练的类型 parameter ,并将这个 parameter 绑定到这个module 里面nn.Parameter()添加的参数会被添加到Parameters列表中,会被送入优化器中随训练一起学习更新

此时调用 parameters()方法会显示参数。读者可自行体会以下两端代码:

""" 代码片段一 """class Net(nn.Module): def __init__(self): super().__init__() self.weight = torch.randn(3, 3) self.bias = torch.randn(3) def forward(self, inputs): passnet = Net()print(list(net.parameters()))# []""" 代码片段二 """class Net(nn.Module): def __init__(self): super().__init__() self.weight = **nn.Parameter**(torch.randn(3, 3)) # 将tensor转换成parameter类型 self.bias = **nn.Parameter**(torch.randn(3)) def forward(self, inputs): passnet = Net()print(list(**net.parameters()**)) # 显示参数# [Parameter containing:# tensor([[-0.4584, 0.3815, -0.4522],# [ 2.1236, 0.7928, -0.7095],# [-1.4921, -0.5689, -0.2342]], requires_grad=True), Parameter containing:# tensor([-0.6971, -0.7651, 0.7897], requires_grad=True)]

nn.Parameter相当于把传入的数据包装成一个参数,如果要直接访问/使用其中的数据而非参数本身,可对 nn.Parameter对象调用 data属性:

a = torch.tensor([1, 2, 3]).to(torch.float32)param = nn.Parameter(a)print(param)# Parameter containing:# tensor([1., 2., 3.], requires_grad=True)print(param.data)# tensor([1., 2., 3.])参数访问

nn.Module 中有 **state_dict()** 方法,该方法将以字典形式返回模块的所有状态,包括模块的参数和 persistent buffers ,字典的键就是对应的参数/缓冲区的名称。

【torch.nn.Parameter 】参数相关的介绍和使用

由于所有模块都继承 nn.Module,因此我们可以对任意的模块调用 state_dict() 方法以查看状态:

linear_layer = nn.Linear(2, 2)print(linear_layer.state_dict())# OrderedDict([('weight', tensor([[ 0.2602, -0.2318],# [-0.5192, 0.0130]])), ('bias', tensor([0.5890, 0.2476]))])print(linear_layer.state_dict().keys())# odict_keys(['weight', 'bias'])

对于线性层,除了 state_dict()之外,我们还可以对其直接调用相应的属性,如下:

linear_layer = nn.Linear(2, 1)print(linear_layer.weight)# Parameter containing:# tensor([[-0.1990, 0.3394]], requires_grad=True)print(linear_layer.bias)# Parameter containing:# tensor([0.2697], requires_grad=True)

需要注意的是以上返回的均为参数对象,如需使用其中的数据,可调用 data 属性。

参数初始化使用内置初始化

对于下面的单隐层网络,我们想对其中的两个线性层应用内置初始化器

class Net(nn.Module): def __init__(self): super().__init__() self.layers = nn.Sequential( nn.Linear(3, 2), nn.ReLU(), nn.Linear(2, 3), ) def forward(self, X): return self.layers(X)

假设权重从 N(0,1) 中采样,偏置全部初始化为 0,则初始化代码如下:

def init_normal(module): # 需要判断子模块是否为nn.Linear类,因为激活函数没有参数 if type(module) == nn.Linear: nn.init.normal_(module.weight, mean=0, std=1) nn.init.zeros_(module.bias)net = Net()net.apply(init_normal)for param in net.parameters(): print(param)# Parameter containing:# tensor([[-0.3560, 0.8078, -2.4084],# [ 0.1700, -0.3217, -1.3320]], requires_grad=True)# Parameter containing:# tensor([0., 0.], requires_grad=True)# Parameter containing:# tensor([[-0.8025, -1.0695],# [-1.7031, -0.3068],# [-0.3499, 0.4263]], requires_grad=True)# Parameter containing:# tensor([0., 0., 0.], requires_grad=True)

对 net调用 apply方法则会递归地对其下所有的子模块应用 init_normal函数。

自定义初始化

如果我们想要自定义初始化,例如使用以下的分布来初始化网络的权重:

def my_init(module): if type(module) == nn.Linear: nn.init.uniform_(module.weight, -10, 10) mask = module.weight.data.abs() >= 5 module.weight.data *= masknet = Net()net.apply(my_init)for param in net.parameters(): print(param)# Parameter containing:# tensor([[-0.0000, -5.9610, 8.0000],# [-0.0000, -0.0000, 7.6041]], requires_grad=True)# Parameter containing:# tensor([ 0.4058, -0.2891], requires_grad=True)# Parameter containing:# tensor([[ 0.0000, -0.0000],# [-6.9569, -9.5102],# [-9.0270, -0.0000]], requires_grad=True)# Parameter containing:# tensor([ 0.2521, -0.1500, -0.1484], requires_grad=True)参数绑定

对于一个三隐层网络:

net = nn.Sequential(nn.Linear(4, 8), nn.ReLU(), nn.Linear(8, 8), nn.ReLU(), nn.Linear(8, 8), nn.ReLU(), nn.Linear(8, 1))

如果我们想让第二个隐层和第三个隐层共享参数,则可以这样做:

shared = nn.Linear(8, 8)net = nn.Sequential(nn.Linear(4, 8), nn.ReLU(), shared, nn.ReLU(), shared, nn.ReLU(), nn.Linear(8, 1))参考

PyTorch学习笔记(六)–Sequential类、参数管理与GPU_Lareges的博客-CSDN博客_sequential类

torch.nn 中文文档

Python的torch.nn.Parameter初始化方法_昊大侠的博客-CSDN博客_torch.nn.parameter初始化

本文链接地址:https://www.jiuchutong.com/zhishi/293777.html 转载请保留说明!

上一篇:如何vue使用ant design Vue中的select组件实现下拉分页加载数据,并解决存在的一个问题。(ant desgin-vue)

下一篇:7.25 web前端-淘宝首页设计(淘宝前端用什么写的)

  • 2019年的个税现在还可以退吗
  • 个人所得税有哪些减免政策
  • 返岗补贴怎么办理
  • 国际货运代理免税报表填写
  • 运输企业印花税按什么缴纳
  • 企业所得税完税凭证在哪里打印
  • 税控盘备案在电子税务局操作流程
  • 购进的库存商品转自用需要开发票吗
  • 兼营行为的税务处理办法
  • 产成品返工如何处理
  • 预付款什么时候确认收入
  • 白条确认收款后还能分期吗
  • 进项税额不可抵扣
  • 产成品或自制半成品核算方法有哪些
  • 开办费转入管理费用分录
  • 建筑劳务分包一般纳税人可以选择简易计税法吗?
  • 应扣缴税额是什么意思
  • 没有库存先开票再发货
  • 小规模银行存款多笔小金额财务费用可以合并记账吗?
  • 进项税额转出后再转入怎么做账
  • 服务业发票进项税怎么做凭证?
  • 管理费用保险费汇算清缴
  • 增值税抄税报税流程2021
  • 补交以前年度增值税的科目处理
  • 文件类型有几种分类
  • xlsx长数字
  • 变动成本法和完全成本法利润差异
  • 自己使用过的固定资产和旧货有什么区别
  • 公司长期贷款
  • 劳务费没发票怎样下账
  • php几天可以速成
  • quicklylook
  • 无产权买卖
  • 提取企业发展基金分录比例
  • 魅族路由器mini说明书
  • php中file
  • php缩进
  • vue sse
  • 残保金申报缴纳时间
  • 将本月发生的制造费用在甲、乙产品之间
  • 存根联明细是自动生成
  • 人力资源公司的招聘专员怎么样
  • 出口退税还需要交企业所得税吗
  • 投资性房地产由成本模式转为公允价值模式
  • 甲企业持有乙企业股票的市价为920000
  • 企业借款利息计入什么科目
  • 天猫的费用
  • 税法中对差旅费的处理
  • mysql数据库服务器配置
  • 母公司给子公司注资要交印花税吗
  • 以前年度损益调整属于哪类科目
  • 资产现金流量收益率为什么不是净利润除以平均现金流量
  • 税务ukey版怎么读入发票
  • 没有发票的费用怎么报销
  • 税局代开专票对方隔月退回重开如何做账务处理呢?
  • 商品周转率公式
  • 高新企业账目有什么不同
  • 来料加工账务处理案例
  • 一般纳税人城建税怎么计算
  • 企业到外地
  • 如何审计营业收入
  • 开办费如何摊销成本
  • sql Server 触发器的when的用法
  • win8系统开机直接进入桌面
  • openstack 创建云主机,计算节点磁盘不足
  • 苹果电脑如何查看WiFi密码
  • linux crontab -e
  • windows7包含6个版本其中什么最强大支持的功能最多
  • win1020h2硬件要求
  • centos7添加ip地址
  • pavprsrv.exe - pavprsrv是什么进程 有什么用
  • win7找不到启动
  • win7升级到win10有无影响
  • perl语言
  • html中的表格
  • jquery中点击事件点击没动静
  • NGUI简介
  • 万代南梦宫上海互娱出品的网络动画
  • 社保扣缴客户端密码
  • 北京地税局报税时间
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设