[PyTorch]PyTorch中模型的参数初始化的几种方法(转)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
本文目录
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
转载请注明出处:
http://www.cnblogs.com/darkknightzh/p/8297793.html
参考网址:
http://pytorch.org/docs/0.3.0/nn.html?highlight=kaiming#torch.nn.init.kaiming_normal
https://github.com/prlz77/ResNeXt.pytorch/blob/master/models/model.py
https://github.com/facebookresearch/ResNeXt/blob/master/models/resnext.lua
https://github.com/bamos/densenet.pytorch/blob/master/densenet.py
https://github.com/szagoruyko/wide-residual-networks/blob/master/models/utils.lua
说明:暂时就这么多吧,错误之处请见谅。前两个初始化的方法见pytorch官方文档
1. xavier初始化
torch.nn.init.xavier_uniform(tensor, gain=1)
对于输入的tensor或者变量,通过论文Understanding the difficulty of training deep feedforward neural networks” - Glorot, X. & Bengio, Y. (2010)的方法初始化数据。初始化服从均匀分布U(−a,a)" role="presentation" style="position: relative;">U(−a,a)U(−a,a),其中a=gain×2/(fan_in+fan_out)×3" role="presentation" style="position: relative;">a=gain×2/(fan_in+fan_out)−−−−−−−−−−−−−−−−−−√×3–√a=gain×2/(fan_in+fan_out)×3,该初始化方法也称Glorot initialisation。
参数:
tensor:n维的 torch.Tensor 或者 autograd.Variable类型的数据
a:可选择的缩放参数
例如:
w = torch.Tensor(3, 5)
nn.init.xavier_uniform(w, gain=nn.init.calculate_gain('relu'))
torch.nn.init.xavier_normal(tensor, gain=1)
对于输入的tensor或者变量,通过论文Understanding the difficulty of training deep feedforward neural networks” - Glorot, X. & Bengio, Y. (2010)的方法初始化数据。初始化服从高斯分布N(0,std)" role="presentation" style="position: relative;">N(0,std)N(0,std),其中std=gain×2/(fan_in+fan_out)" role="presentation" style="position: relative;">std=gain×2/(fan_in+fan_out)−−−−−−−−−−−−−−−−−−√std=gain×2/(fan_in+fan_out),该初始化方法也称Glorot initialisation。
参数:
tensor:n维的 torch.Tensor 或者 autograd.Variable类型的数据
a:可选择的缩放参数
例如:
w = torch.Tensor(3, 5)
nn.init.xavier_normal(w)
2. kaiming初始化
torch.nn.init.kaiming_uniform(tensor, a=0, mode='fan_in')
对于输入的tensor或者变量,通过论文“Delving deep into rectifiers: Surpassing human-level performance on ImageNet classification” - He, K. et al. (2015)的方法初始化数据。初始化服从均匀分布U(−bound,bound)" role="presentation" style="position: relative;">U(−bound,bound)U(−bound,bound),其中bound=2/((1+a2)×fan_in)×3" role="presentation" style="position: relative;">bound=2/((1+a2)×fan_in)−−−−−−−−−−−−−−−−−−√×3–√bound=2/((1+a2)×fan_in)×3,该初始化方法也称He initialisation。
参数:
tensor:n维的 torch.Tensor 或者 autograd.Variable类型的数据
a:该层后面一层的激活函数中负的斜率(默认为ReLU,此时a=0)
mode:‘fan_in’ (default) 或者 ‘fan_out’. 使用fan_in保持weights的方差在前向传播中不变;使用fan_out保持weights的方差在反向传播中不变。
例如:
w = torch.Tensor(3, 5)
nn.init.kaiming_uniform(w, mode='fan_in')
torch.nn.init.kaiming_normal(tensor, a=0, mode='fan_in')
对于输入的tensor或者变量,通过论文“Delving deep into rectifiers: Surpassing human-level performance on ImageNet classification” - He, K. et al. (2015)的方法初始化数据。初始化服从高斯分布N(0,std)" role="presentation" style="position: relative;">N(0,std)N(0,std),其中std=2/((1+a2)×fan_in)" role="presentation" style="position: relative;">std=2/((1+a2)×fan_in)−−−−−−−−−−−−−−−−−−√std=2/((1+a2)×fan_in),该初始化方法也称He initialisation。
参数:
tensor:n维的 torch.Tensor 或者 autograd.Variable类型的数据
a:该层后面一层的激活函数中负的斜率(默认为ReLU,此时a=0)
mode:‘fan_in’ (default) 或者 ‘fan_out’. 使用fan_in保持weights的方差在前向传播中不变;使用fan_out保持weights的方差在反向传播中不变。
例如:
w = torch.Tensor(3, 5)
nn.init.kaiming_normal(w, mode='fan_out')
使用的例子(具体参见原始网址):
https://github.com/prlz77/ResNeXt.pytorch/blob/master/models/model.py

from torch.nn import init
self.classifier = nn.Linear(self.stages[3], nlabels)
init.kaiming_normal(self.classifier.weight)
for key in self.state_dict():
if key.split('.')[-1] == 'weight':
if 'conv' in key:
init.kaiming_normal(self.state_dict()[key], mode='fan_out')
if 'bn' in key:
self.state_dict()[key][...] = 1
elif key.split('.')[-1] == 'bias':
self.state_dict()[key][...] = 0

3. 实际使用中看到的初始化
3.1 ResNeXt,densenet中初始化
https://github.com/facebookresearch/ResNeXt/blob/master/models/resnext.lua
https://github.com/bamos/densenet.pytorch/blob/master/densenet.py
conv
n = kW* kH*nOutputPlane
weight:normal(,math.sqrt(/n))
bias:zero()
batchnorm
weight:fill()
bias:zero()
linear
bias:zero()
3.2 wide-residual-networks中初始化(MSRinit)
https://github.com/szagoruyko/wide-residual-networks/blob/master/models/utils.lua
conv
n = kW* kH*nInputPlane
weight:normal(,math.sqrt(/n))
bias:zero()
linear
bias:zero()
[PyTorch]PyTorch中模型的参数初始化的几种方法(转)的更多相关文章
- java中Map和List初始化的两种方法
第一种方法(常用方法): //初始化List List<string> list = new ArrayList</string><string>(); list. ...
- Pytorch基础(6)----参数初始化
一.使用Numpy初始化:[直接对Tensor操作] 对Sequential模型的参数进行修改: import numpy as np import torch from torch import n ...
- 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理
服务器文档下载zip格式 刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Co ...
- Spring3 MVC请求参数获取的几种方法
Spring3 MVC请求参数获取的几种方法 一. 通过@PathVariabl获取路径中的参数 @RequestMapping(value="user/{id}/{name}&q ...
- 获取网页URL地址及参数等的两种方法(js和C#)
转:获取网页URL地址及参数等的两种方法(js和C#) 一 js 先看一个示例 用javascript获取url网址信息 <script type="text/javascript&q ...
- 在Java Web程序中使用监听器可以通过以下两种方法
之前学习了很多涉及servlet的内容,本小结我们说一下监听器,说起监听器,编过桌面程序和手机App的都不陌生,常见的套路都是拖一个控件,然后给它绑定一个监听器,即可以对该对象的事件进行监听以便发生响 ...
- Spring3 MVC请求参数获取的几种方法[转]
Spring3 MVC请求参数获取的几种方法 Spring3 MVC请求参数获取的几种方法 一. 通过@PathVariabl获取路径中的参数 @RequestMapping(value=& ...
- PHP中获取文件扩展名的N种方法
PHP中获取文件扩展名的N种方法 从网上收罗的,基本上就以下这几种方式: 第1种方法:function get_extension($file){substr(strrchr($file, '.'), ...
- 在MySQL中设置事务隔离级别有2种方法:
在MySQL中设置事务隔离级别有2种方法: 1 在my.cnf中设置,在mysqld选项中如下设置 [mysqld] transaction-isolation = READ-COMMITTED 2 ...
随机推荐
- 关于spring的applicationContext.xml配置文件的ref和value之自我想法
今天在做SSH的一个项目的时候,因为需要定时操作,所以就再sping里面加入了一个quartz的小定时框架,结果在运行时候,发生了一个小bug. Caused by: org.springframew ...
- Ansible安装过程中常遇到的错误(FAQ)
1.安装完成后允许命令报错 Traceback (most recent call last): File , in <module> (runner, results) = cli.ru ...
- scrollend,滚动结束执行一次
var timer;window.onscroll = function () { clearTimeout(timer); timer = setTimeout(function () { aler ...
- onNewIntent 作用
按 home 键,再打开app,会调用onNewIntent() 按 back 键,再打开app,会调用onCreate() public class MainActivity extends Act ...
- java组件学习15天
Linuxdocker redminegitlabnginxmavenkibanakafkaspringspring cloudLucene 搭建基本使用
- Android Volley全然解析(四),带你从源代码的角度理解Volley
版权声明:本文出自郭霖的博客,转载必须注明出处. https://blog.csdn.net/sinyu890807/article/details/17656437 转载请注明出处:http://b ...
- UVA Team Queue
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u013840081/article/details/26180081 题目例如以下: Team Qu ...
- python 中字典的操作(增、删、改、查)
字典是另一种可变容器模型,且可存储任意类型对象,下标从0开始,最后一个为-1. 字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({}) ...
- C# 获取计算机cpu 硬盘 网卡信息
/// <summary>/// 机器码 /// </summary> public class MachineCode { ...
- Java基础知识陷阱(七)
本文发表于本人博客. 上次说了下HashSet和HashMap之间的关系,其中HashMap这个内部有这么一句: static final float DEFAULT_LOAD_FACTOR = 0. ...