pytorch系列 -- 9 pytorch nn.init 中实现的初始化函数 uniform, normal, const, Xavier, He initialization
本文内容:
1. Xavier 初始化
2. nn.init 中各种初始化函数
3. He 初始化
torch.init https://pytorch.org/docs/stable/nn.html#torch-nn-init
1. 均匀分布
torch.nn.init.uniform_(tensor, a=0, b=1)
服从~U(a,b) U(a, b)U(a,b)
2. 正太分布
torch.nn.init.normal_(tensor, mean=0, std=1)
服从~N(mean,std) N(mean, std)N(mean,std)
3. 初始化为常数
torch.nn.init.constant_(tensor, val)
初始化整个矩阵为常数val
4. Xavier
基本思想是通过网络层时,输入和输出的方差相同,包括前向传播和后向传播。具体看以下博文:
为什么需要Xavier 初始化?
文章第一段通过sigmoid激活函数讲述了为何初始化?
简答的说就是:
如果初始化值很小,那么随着层数的传递,方差就会趋于0,此时输入值 也变得越来越小,在sigmoid上就是在0附近,接近于线性,失去了非线性
如果初始值很大,那么随着层数的传递,方差会迅速增加,此时输入值变得很大,而sigmoid在大输入值写倒数趋近于0,反向传播时会遇到梯度消失的问题
其他的激活函数同样存在相同的问题。
https://prateekvjoshi.com/2016/03/29/understanding-xavier-initialization-in-deep-neural-networks/
所以论文提出,在每一层网络保证输入和输出的方差相同。
2. xavier初始化的简单推导
https://blog.csdn.net/u011534057/article/details/51673458
对于Xavier初始化方式,pytorch提供了uniform和normal两种:
torch.nn.init.xavier_uniform_(tensor, gain=1) 均匀分布 ~ U(−a,a) U(-a,a )U(−a,a)
其中, a的计算公式:
a=gain×6fan_in+fan_out−−−−−−−−−−−√ a=gain \times \sqrt{ \frac{6}{fan\_in +fan\_out}}
a=gain×
fan_in+fan_out
6
torch.nn.init.xavier_normal_(tensor, gain=1) 正态分布~N(0,std) N(0,std)N(0,std)
其中std的计算公式:
std=gain×2fan_in+fan_out−−−−−−−−−−−√ std= gain \times \sqrt{\frac{2}{fan\_in+ fan\_out}}
std=gain×
fan_in+fan_out
2
5. kaiming (He initialization)
Xavier在tanh中表现的很好,但在Relu激活函数中表现的很差,所何凯明提出了针对于Relu的初始化方法。
Delving deep into rectifiers: Surpassing human-level performance on ImageNet classification He, K. et al. (2015)
该方法基于He initialization,其简单的思想是:
在ReLU网络中,假定每一层有一半的神经元被激活,另一半为0,所以,要保持方差不变,只需要在 Xavier 的基础上再除以2
也就是说在方差推到过程中,式子左侧除以2.
pytorch也提供了两个版本:
torch.nn.init.kaiming_uniform_(tensor, a=0, mode=‘fan_in’, nonlinearity=‘leaky_relu’), 均匀分布 ~ U(−bound,bound) U(−bound,bound)U(−bound,bound)
其中,bound的计算公式:
bound=6(1+a2)×fan_in−−−−−−−−−√ \text{bound} = \sqrt{\frac{6}{(1 + a^2) \times \text{fan\_in}}}
bound=
(1+a
2
)×fan_in
6
torch.nn.init.kaiming_normal_(tensor, a=0, mode=‘fan_in’, nonlinearity=‘leaky_relu’), 正态分布~ N(0,std) N(0,std)N(0,std)
其中,std的计算公式:
std=2(1+a2)×fan_in−−−−−−−−−√ \text{std} = \sqrt{\frac{2}{(1 + a^2) \times \text{fan\_in}}}
std=
(1+a
2
)×fan_in
2
两函数的参数:
a:该层后面一层的激活函数中负的斜率(默认为ReLU,此时a=0)
mode:‘fan_in’ (default) 或者 ‘fan_out’. 使用fan_in保持weights的方差在前向传播中不变;使用fan_out保持weights的方差在反向传播中不变
针对于Relu的激活函数,基本使用He initialization,pytorch也是使用kaiming 初始化卷积层参数的
---------------------
作者:墨氲
来源:CSDN
原文:https://blog.csdn.net/dss_dssssd/article/details/83959474
版权声明:本文为博主原创文章,转载请附上博文链接!
pytorch系列 -- 9 pytorch nn.init 中实现的初始化函数 uniform, normal, const, Xavier, He initialization的更多相关文章
- STM32入门系列-使用库函数点亮LED,LED初始化函数
要点亮LED,需要完成LED的驱动, 在工程模板上新建一个led.c和led.h文件,将其存放在led文件夹内.这两个文件需要我们自己编写. 通常xxx.c文件用于存放编写的驱动程序,xxx.h文件用 ...
- 【转载】PyTorch系列 (二):pytorch数据读取
原文:https://likewind.top/2019/02/01/Pytorch-dataprocess/ Pytorch系列: PyTorch系列(一) - PyTorch使用总览 PyTorc ...
- PyTorch 学习笔记(四):权值初始化的十种方法
pytorch在torch.nn.init中提供了常用的初始化方法函数,这里简单介绍,方便查询使用. 介绍分两部分: 1. Xavier,kaiming系列: 2. 其他方法分布 Xavier初始化方 ...
- 【小白学PyTorch】4 构建模型三要素与权重初始化
文章目录: 目录 1 模型三要素 2 参数初始化 3 完整运行代码 4 尺寸计算与参数计算 1 模型三要素 三要素其实很简单 必须要继承nn.Module这个类,要让PyTorch知道这个类是一个Mo ...
- pytorch和tensorflow的爱恨情仇之参数初始化
pytorch和tensorflow的爱恨情仇之基本数据类型 pytorch和tensorflow的爱恨情仇之张量 pytorch和tensorflow的爱恨情仇之定义可训练的参数 pytorch版本 ...
- caffe中权值初始化方法
首先说明:在caffe/include/caffe中的 filer.hpp文件中有它的源文件,如果想看,可以看看哦,反正我是不想看,代码细节吧,现在不想知道太多,有个宏观的idea就可以啦,如果想看代 ...
- pytorch中文文档-torch.nn.init常用函数-待添加
参考:https://pytorch.org/docs/stable/nn.html torch.nn.init.constant_(tensor, val) 使用参数val的值填满输入tensor ...
- 『PyTorch』第十三弹_torch.nn.init参数初始化
初始化参数的方法 nn.Module模块对于参数进行了内置的较为合理的初始化方式,当我们使用nn.Parameter时,初始化就很重要,而且我们也可以指定代替内置初始化的方式对nn.Module模块进 ...
- Pytorch系列教程-使用字符级RNN生成姓名
前言 本系列教程为pytorch官网文档翻译.本文对应官网地址:https://pytorch.org/tutorials/intermediate/char_rnn_generation_tutor ...
随机推荐
- Ubuntu中右击出现终端
1 root用户 $sudo apt-get install nautilus-open-terminal 2重启 3ok
- linux 问题一 apt-get install 被 lock
问题: sudo apt-get install vim E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporari ...
- CF580D Kefa and Dishes 【状压dp】By cellur925
题目传送门 友情链接:new2zydalao%%% 一篇优秀的状压文章 题目大意:$n$个菜有$k$个规则,如果kefa在吃完第$xi$个菜之后吃了第$yi$个菜(保证$xi$.$yi$不相等), ...
- windows 异步通知I/O模型与重叠I/O模型
一.异步IO模型(asynchronous IO) (1)什么是异步I/O 异步I/O(asynchronous I/O)由POSIX规范定义.演变成当前POSIX规范的各种早起标准所定义的实时函数中 ...
- 伪元素选择器:before 以及 :after
E:after.E:before 在旧版本里是伪类,在新版本里是伪元素,新版本下E:after.E:before会被自动识别为E::after.E::before,按伪元素来对待,这样做的目的是用来做 ...
- win10下JDK安装,配置环境变量后报Error: could not open `C:\Program Files\Java\jre1.8.0_112\lib\amd64\jvm.cfg'
把Path里面的%JAVA_HOME%/bin放在最前面.
- (027)[技术资料]业余制作Windows图标
这几天一直在纠结一件事,想给软件制作一个简单的图标,以前(2014-10-4 11:00)制作的是下面这个,多重ICO,最大尺寸256,无压缩(windows允许图标尺寸在大于256时按PNG方式进行 ...
- (023) 关于51单片机的A5指令
可看见一篇讲51单片机加密的文章这么讲: [加密方法:在A5后加一个二字节或三字节操作码,因为所有反汇编软件都不会反汇编A5指令,造成正常程序反汇编乱套,执行程序无问题仿制者就不能改变你的源程序.] ...
- jQuery access()方法
最开始只是想了解attr方法,发现它内部调用了jQuery.access()方法.除了attr,还有prop.text.html.css.data 都是内部调用了jQuery.access()方法,可 ...
- Ionic之ui-sref引入图片,图片部分挡住解决方案
ionic图片设置大小跟图片像素相同,但是使用ui-sref="parkInfo"上半部分图片会挡住,增加height的高度,就可以显示原本图片 页面: <ion-conte ...