参数初始化
时间:2021-08-02
本文章向大家介绍参数初始化,主要包括参数初始化使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一、前言
1、深度学习框架提供默认随机初始化
2、深度学习框架提供了最常用的规则,也允许创建自定义初始化方法
3、默认情况下,Pytorch会根据一个范围均匀地初始化权重和偏置矩阵,这个范围是根据输入和输出维度计算出来的
二、内置初始化
1、下面代码将所有权重参数初始化为标准差为0.01的正态分布,且将偏置参数设置为0
# 内置的初始化器 # m就是一个module def init_normal(m): if type(m) == nn.Linear: # 给权重赋值-将所有权重参数初始化为标准差为0.01的正态分布 nn.init.normal_(m.weight, mean=0, std=0.01) # 给偏置赋值-将偏置设为0 nn.init.zeros_(m.bias) # 将net里面所以层遍历一遍 net.apply(init_normal) net[0].weight.data[0], net[0].bias.data[0] # 输出结果 (tensor([-0.0210, -0.0141, -0.0058, 0.0037]), tensor(0.))
2、将所有参数初始化为给定的常数
# 将参数初始化为给定的常数 def init_constant(m): if type(m) == nn.Linear: ''' torch.nn.init.constant_(tensor, val)[source] 用值val填充向量tensor ''' nn.init.constant_(m.weight, 1) nn.init.zeros_(m.bias) net.apply(init_constant) net[0].weight.data[0], net[0].bias.data[0] #输出结果 (tensor([1., 1., 1., 1.]), tensor(0.))
3、对不同的块应用不同的初始化方法
# 对不同的块用不同的初始化方法 def xavier(m): if type(m) == nn.Linear: # 均匀分布 nn.init.xavier_uniform_(m.weight) def init_42(m): if type(m) == nn.Linear: # 常数赋值 nn.init.constant_(m.weight, 42) net[0].apply(xavier) net[2].apply(init_42) print(net[0].weight.data[0]) print(net[2].weight.data) #输出结果 tensor([ 0.1352, -0.2794, 0.1592, 0.3462]) tensor([[42., 42., 42., 42., 42., 42., 42., 42.]])
三、自定义初始化
def my_init(m): if type(m) == nn.Linear: print( "Init", *[(name, param.shape) for name, param in m.named_parameters()][0]) # 对权重使用均匀分布 nn.init.uniform_(m.weight, -10, 10) m.weight.data *= m.weight.data.abs() >= 5 net.apply(my_init) net[0].weight[:2] #输出结果 Init weight torch.Size([8, 4]) Init weight torch.Size([1, 8]) tensor([[ 0.0000, 5.1760, 0.0000, -7.1530], [ 0.0000, 0.0000, 0.0000, -0.0000]], grad_fn=<SliceBackward>)
我们可以直接设置参数,先直接定位到参数再给其赋值
net[0].weight.data[:] += 1 net[0].weight.data[0, 0] = 42 net[0].weight.data[0] #输出结果 tensor([42.0000, 6.1760, 1.0000, -6.1530])
四、参数绑定
1、在多个层间共享参数。我们可以定义一个稠密层,然后使用他的参数来设置另一个层的参数
2、列子表明,第二层和第三层是绑定的。他们不仅值相等,而且由相同的张量表示。因此,如果改变其中一个参数,另一个参数也会相应改变
# 在多个层间共享参数 # 我们需要给共享层一个名称,以便可以引用它的参数。 shared = nn.Linear(8, 8) net = nn.Sequential(nn.Linear(4, 8), nn.ReLU(), shared, nn.ReLU(), shared, nn.ReLU(), nn.Linear(8, 1)) net(X) # 检查参数是否相同 print(net[2].weight.data[0] == net[4].weight.data[0]) # 改变net[2]中的值,net[4]也会改变。说明使用的其实是一个对象 net[2].weight.data[0, 0] = 100 print(net[2].weight.data[0,0]) print(net[4].weight.data[0,0]) # 确保它们实际上是同一个对象,而不只是有相同的值。 print(net[2].weight.data[0] == net[4].weight.data[0]) # 输出结果 tensor([True, True, True, True, True, True, True, True]) tensor(100.) tensor(100.) tensor([True, True, True, True, True, True, True, True])
原文地址:https://www.cnblogs.com/xiaoqing-ing/p/15090238.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python创建包,导入包
- Python查看模块(变量、函数、类)方法
- Python __doc__属性:查看文档
- Python __file__属性:查看模块的源文件路径
- python第三方库的安装pip的使用与换源
- 表白必备:C语言实现会变色的心
- 人心易变,这段有趣的C代码也一样,来看一下?
- 一个简单但能考察C语言基础的题目,试试?
- 这绝对是C语言的一个经典例题了!
- 你见过最美的C语言代码是什么?
- C语言直接实现开机密码修改!
- C语言实现类似QQ聊天界面抖动功能!
- Java基础数据类型和引用类型的区别
- 解决Android8.0之后开启service
- 深入理解Java泛型(一.泛型的作用与定义)