位置: 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前端-淘宝首页设计(淘宝前端用什么写的)

  • 中国移动怎么取消视频彩铃(中国移动怎么取消自动续费流量包)

    中国移动怎么取消视频彩铃(中国移动怎么取消自动续费流量包)

  • 视频格式有哪几种(视频格式有哪几种mpg)

    视频格式有哪几种(视频格式有哪几种mpg)

  • 红米k40有nfc功能吗(红米k40有nfc嘛)

    红米k40有nfc功能吗(红米k40有nfc嘛)

  • m1901f7e红米啥型号(红米m1901f7c)

    m1901f7e红米啥型号(红米m1901f7c)

  • 华为手机应用签名异常(华为手机应用签名不一致)

    华为手机应用签名异常(华为手机应用签名不一致)

  • 苹果静音微信消息还响(苹果静音微信消息震动)

    苹果静音微信消息还响(苹果静音微信消息震动)

  • xt图像的斜率代表什么

    xt图像的斜率代表什么

  • pca是啥

    pca是啥

  • 接入交换机和汇聚交换机有什么区别(接入交换机和汇聚交换机和核心交换机有什么区别)

    接入交换机和汇聚交换机有什么区别(接入交换机和汇聚交换机和核心交换机有什么区别)

  • 抖音企业号可以直播吗(抖音企业号可以挂别人的商品吗)

    抖音企业号可以直播吗(抖音企业号可以挂别人的商品吗)

  • iphone7plus微信消息不提示(苹果7plus微信信息不提示)

    iphone7plus微信消息不提示(苹果7plus微信信息不提示)

  • 充电宝2.1a和1a的区别(充电宝1a和2.1a的区别,充手机用哪个好)

    充电宝2.1a和1a的区别(充电宝1a和2.1a的区别,充手机用哪个好)

  • oppoa73呼吸灯怎么开(oppoa73呼吸灯怎么设置)

    oppoa73呼吸灯怎么开(oppoa73呼吸灯怎么设置)

  • iphonex日历不显示节日(iphone日历不显示)

    iphonex日历不显示节日(iphone日历不显示)

  • 手机上hd图标怎么取消(手机hd图标怎么关闭)

    手机上hd图标怎么取消(手机hd图标怎么关闭)

  • 如何取消滴答常用路线(滴答如何取消自动接单)

    如何取消滴答常用路线(滴答如何取消自动接单)

  • b612怎么调好看(b612怎么调整照片大小)

    b612怎么调好看(b612怎么调整照片大小)

  • tt cam连接步骤(tt cam连接步骤图片)

    tt cam连接步骤(tt cam连接步骤图片)

  • 百度贴吧如何私聊(百度贴吧如何私信)

    百度贴吧如何私聊(百度贴吧如何私信)

  • 打印机名称在哪里找(打印机名称在哪里修改)

    打印机名称在哪里找(打印机名称在哪里修改)

  • 电话号码空号怎么恢复(电话号码空号怎么设置)

    电话号码空号怎么恢复(电话号码空号怎么设置)

  • html网站video标签blob视频如何下载(html5 video标签)

    html网站video标签blob视频如何下载(html5 video标签)

  • Java Web中的ServletContext对象(java web中的转发和重定向)

    Java Web中的ServletContext对象(java web中的转发和重定向)

  • transformers包介绍——nlp界最顶级的包——可以不用 但不能不知道——python包推荐系列(transformerss)

    transformers包介绍——nlp界最顶级的包——可以不用 但不能不知道——python包推荐系列(transformerss)

  • 第09章_异常处理(异常处理流程为哪几个部分)

    第09章_异常处理(异常处理流程为哪几个部分)

  • 帝国CMS如何实现会员登陆赠送积分(帝国cms如何使用)

    帝国CMS如何实现会员登陆赠送积分(帝国cms如何使用)

  • 长期待摊费用一般指什么
  • 自然人收缴税务客户端
  • 汇算清缴研发费用加计扣除优惠明细表
  • 本期收入和本期减除费用
  • 待抵扣税金怎么算
  • 分公司可以在银行开户吗
  • 未交增值税借方表示什么
  • 收入与成本不配合
  • 企业所得税不含税价格怎么算
  • 银行日记账的登记实例图
  • 一季度计提的所得税分录
  • 企业注销了,报表的银行存款还有余额
  • 供应商给的折扣比发票少怎么做账
  • 暂估成本结转后怎么冲回
  • 企业间贴现手续怎么办理
  • 个人挂靠公司承接工程如何做会计处理?
  • 银行利息的现金流量项目是什么
  • 跨年错误分录能红冲吗
  • 事业单位收到增值税专用发票抵扣联怎么办
  • 合伙企业交个税例题
  • 社保可以在税前扣除吗
  • 免抵扣税额
  • 销售商品会计凭证
  • 出口退税收汇凭证号
  • 个人所得税减免申请
  • 普通股资本成本计算方法
  • 哪些外籍个人应在中国缴纳个税?
  • 苹果电脑任务栏跑到左边去了
  • bios里硬盘是哪个
  • 捐赠口罩的人
  • 根据完工进度确认成本
  • php如何实现多线程
  • 非金融机构从事贷款谁负责监管
  • 将预收款冲抵前欠货款会计分录
  • php输出对象
  • 玄学2021
  • python的复制命令
  • vue中created和mounted
  • flask实现登录
  • php initialize
  • php内存缓存功能怎么用
  • 通过点击office文件按钮可以选择设置系统选项
  • 培训机构先收费后付费
  • python 熵值法
  • 非三包退车能否退款
  • 在计算应纳税所得额时,下列支出不得扣除
  • 电子发票的缺点
  • 三栏式明细账适用于原材料明细账
  • mysql关闭连接命令
  • 坏帐损失的税务处理
  • 暂估入库后发票整单折扣
  • 应收账款计提减值准备会计处理
  • 工程物资原材料在资产负债表哪个科目体现
  • 绩效工资定义及标准
  • 免征增值税账务处理办法
  • 营业执照类型有限责任公司(自然人独资)是什么行业类别
  • 企业股权无偿转让
  • 其他债权投资有没有减值准备
  • 子公司的亏损能算到母公司吗
  • 教育经费支出
  • 医疗机构药库设置标准
  • win10如何设置视频缩略图
  • ubuntu20设置wifi
  • ubuntu获取当前路径
  • 苹果官网
  • xwizard.exe是什么
  • win8切换管理员账户
  • sdis.exe
  • xp连接到共享打印机
  • android环境搭建教程
  • 使用forever管理nodejs应用教程
  • JavaScript html5 canvas绘制时钟效果(二)
  • jquery的选择器作用是选中某些元素
  • unityui渲染顺序
  • 简述javascript
  • 水电费收税
  • 公民海外收入纳税
  • 财税库银是什么费用
  • 酒店业需要缴纳哪些税
  • 酒店访客时间是几个小时
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设