首页 > 其他分享 >5.2 参数管理

5.2 参数管理

时间:2023-07-25 11:33:28浏览次数:24  
标签:初始化 5.2 nn weight 管理 访问 参数 net

参数访问

当使用nn.Sequential类创建模型时,我们可以通过索引来访问模型的任意层。我们首先创建一个nn.Sequential:

net = nn.Sequential(
    nn.Linear(64,32),
    nn.ReLU(),
    nn.Dropout(0.2),
    nn.Linear(32,8),
    nn.Linear(8,2)
)

net[4].state_dict()

(1)使用state_dict()访问模型的参数状态:

 state为“状态”的意思,这可以从自动机的角度理解。上面的代码访问了net的第5层的参数状态。从输出可以看出,第5层参数包含weight以及bias,它们对应的张量及其值被打印了出来。

同样可以访问其weight及bias:

 注意,所有参数都是参数类的一个实例。比如访问weight这个参数,我们使用net[4].weight访问到的是这个参数实例,要访问其底层的数值,需要使用net[4].weight.data.

 

接下来是书中给出的例子:

import torch
from torch import nn

net = nn.Sequential(nn.Linear(4, 8), nn.ReLU(), nn.Linear(8, 1))
X = torch.rand(size=(2, 4))
net(X)

访问网络中的所有参数:

拿第一行代码举例子。这里面, net[0].named_parameters()返回的是一个迭代器,其中包含了net第0层的所有参数的名字(name)和对应的张量。

[(name, param.shape) for name, param in net[0].named_parameters()]是一个列表解析,它创建了一个包含元组的列表,元组的两个元素分别为net[0]中参数的名字以及该参数张量的形状,这是通过用name以及param遍历迭代器中参数的名字和张量实现的,圆括号(name,param.shape)表示用网络第0层中参数的名字(name)以及张量的形状(param.shape)创建元组。最后,*是将列表中的所有元组展开成单独的参数。

举一个简单的列表解析的例子,下面的代码根据相应条件推导出一个列表:

>>> [ i*2 for i in range(10) if i % 2 == 0 ]
[0, 4, 8, 12, 16]

还要注意:输出中的0.weight , 0.bias; 2.weight , 2.bias就分别表示的是第0层的权重及偏置;第2层的权重及偏置。这里第1层是ReLU层,没有参数,所以没打印任何东西。

这为我们提供了访问参数的另一种方式,如下所示:

 这等价于:

 

 从嵌套块收集参数

我们定义一个嵌套块:

 打印一下看看:

 我们用如下方式访问第一个主要的块中、第二个子块的第一层的偏置项。

 

参数初始化

我们可以对不同的层应用不同的初始化函数:

 由nn.Sequential创建的net是nn.Module的实例,它可以用net.apply()进行初始化。net中的net[0]和net[2]两个层为nn.Linear,也是nn.Module的实例,同样可以用net[0].apply及net[2].apply进行初始化。上面的例子中,我们对net[0]应用了xavier初始化方法,对net[2]应用了常量初始化。注意,这里是按照uniform的分布进行xavier初始化,同样可以用高斯分布进行xavier初始化。

 

参数绑定

深度学习中有时会有共享参数的需求。即神经网络中的某些层我们希望它们的参数是一样的。参数绑定可以实现这种参数共享。

 可以看到,改了net[2]的参数值后,net[2]和net[4]的参数值依然是相等的。实际上,它们是指向同一个parameter对象的,所以改了一个,另一个也会变。

 

标签:初始化,5.2,nn,weight,管理,访问,参数,net
From: https://www.cnblogs.com/pkuqcy/p/17578872.html

相关文章

  • 提升生产效率和精益管理:如何有效运用ECRS标准工时管理软件?
    精益生产管理是被广泛认可的有效管理模式,许多企业都越来越重视精益生产的管理和工具的选择。在实现降本增效的前提下,选择适合的工具至关重要。精益生产管理是以丰田生产模式为基础,将人、机、料、法、环整合为一个高效的生产运作系统。它通过策划、驱动、改进和控制等一系列活动实现......
  • Jmeter(二十二)jmeter命令行的执行方式以及常用参数
    jmeter命令-n-t:-n  表示使用非GUI的方式运行;-t  表示指定jmeter的测试脚本; -l :-l  表示生成指定的报告文件,一般使用jtl格式来保存,因为jtl文件可以使用jmeter任意监听器打开;jmeter.save.saveservice.output_format=xmljmeter.save.saveservice.response_da......
  • 用于管理 SQL Server 重建和重新组织索引碎片的脚本
    问题索引是SQLServer中对性能有巨大贡献的主要数据库对象之一。通过使用正确的索引,您可以避免完全扫描表中的数百万条记录来查找您要查找的内容。您可以遍历索引树(索引查找操作)并更快地找到您要查找的内容,而不是扫描表。尽管索引在高性能数据库设计中非常方便且必要,但它们需......
  • ORACLE空间管理实验4:块管理之ASSM三级位图结构
    L1、L2、L3块的作用:--方便查找数据块。L3中有指向L2的指针,L2有指向L1的指针,L1中有多个数据块的指针和状态。1、每个L3中,有多个L2的地址(第一个L3是段头)。2、每个L2中,有多个L1的地址。3、每个L1中,有多个数据块地址。ORACLE最多支持三级位图。一级位图用于管理具体数据块的使用。......
  • ORACLE空间管理实验5:块管理之ASSM下高水位的影响--删除和查询
    高水位概念:所有的oracle段(segments,在此,为了理解方便,建议把segment作为表的一个同义词)都有一个在段内容纳数据的上限,我们把这个上限称为"highwatermark"或HWM。这个HWM是一个标记,用来说明已经有多少没有使用的数据块分配给这个segment。HWM原则上HWM只......
  • ORACLE空间管理实验2:区的管理与分配
    内容基于LMT管理的表空间,字典管理已经不用了。本篇主要验证了这些问题:1.LMT管理的表空间,区的分配有两种方法:系统分配和UNIFORM固定大小-->见实验   2.验证Oracle找寻可用区的方式:从数据文件开头的位图块中获得可用区的信息,DUMP时可见FIRST:3这种,表......
  • 系统管理:parted
    您的足迹:»parted您在这里:start»系统管理»parted−目录1.什么是parted2.parted的作用3.使用parted1.什么是partedparted是一个磁盘分区管理管理工具,它比fdisk更加灵活,功能也更丰富,同时还支持GUID分区表(GUIDPartitionTable),这在I......
  • Visual Studio 启动调试程序 以管理员运行的设置(相比右键管理员运行生成好的exe文件优
    在解决方案文件上,选择添加=>新项目=>应用程序清单文件然后在C#上打开它。在应用程序清单文件上,将“asInvoker”重命名为“requireAdministrator”。生成解决方案。可以管理员权限打开所有应用程序。......
  • linux中的磁盘管理
    一、机械硬盘结构1.机械硬盘(HDD)我们先来看看最常见的机械硬盘。 机械硬盘主要由磁盘盘片、磁头、主轴与传动轴等组成,数据就存放在磁盘盘片中。大家见过老式的留声机吗?留声机上使用的唱片和我们的磁盘盘片非常相似,只不过留声机只有一个磁头,而硬盘是上下双磁头,盘片在两个磁......
  • 关于保存自己的权重参数
    关于保存自己的权重参数有的模型自己可以保存权重模型文件,那如果没有自己该怎么保存呢?首先我们可以先查看一下,人家自带的权重模型文件,一般是.pt或.pth的文件,运行以下代码:importtorchmy_weights=torch.load(r'权重文件地址')print('len=',len(my_weights.keys())......