对Pytorch神经网络初始化kaiming分布详解


Posted in Python onAugust 18, 2019

函数的增益值

torch.nn.init.calculate_gain(nonlinearity, param=None)

提供了对非线性函数增益值的计算。

对Pytorch神经网络初始化kaiming分布详解

增益值gain是一个比例值,来调控输入数量级和输出数量级之间的关系。

fan_in和fan_out

pytorch计算fan_in和fan_out的源码


def _calculate_fan_in_and_fan_out(tensor):
 dimensions = tensor.ndimension()
 if dimensions < 2:
  raise ValueError("Fan in and fan out can not be computed 
  for tensor with fewer than 2 dimensions")

 if dimensions == 2: # Linear
  fan_in = tensor.size(1)
  fan_out = tensor.size(0)
 else:
  num_input_fmaps = tensor.size(1)
  num_output_fmaps = tensor.size(0)
  receptive_field_size = 1
  if tensor.dim() > 2:
   receptive_field_size = tensor[0][0].numel()
  fan_in = num_input_fmaps * receptive_field_size
  fan_out = num_output_fmaps * receptive_field_size

 return fan_in, fan_out

对Pytorch神经网络初始化kaiming分布详解

xavier分布

xavier分布解析:https://prateekvjoshi.com/2016/03/29/understanding-xavier-initialization-in-deep-neural-networks/

假设使用的是sigmoid函数。当权重值(值指的是绝对值)过小,输入值每经过网络层,方差都会减少,每一层的加权和很小,在sigmoid函数0附件的区域相当于线性函数,失去了DNN的非线性性。

当权重的值过大,输入值经过每一层后方差会迅速上升,每层的输出值将会很大,此时每层的梯度将会趋近于0.

xavier初始化可以使得输入值x x x<math><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math>x方差经过网络层后的输出值y y y<math><semantics><mrow><mi>y</mi></mrow><annotation encoding="application/x-tex">y</annotation></semantics></math>y方差不变。

(1)xavier的均匀分布

torch.nn.init.xavier_uniform_(tensor, gain=1)

对Pytorch神经网络初始化kaiming分布详解

也称为Glorot initialization。

>>> w = torch.empty(3, 5)
>>> nn.init.xavier_uniform_(w, gain=nn.init.calculate_gain('relu'))

(2) xavier正态分布

torch.nn.init.xavier_normal_(tensor, gain=1)

对Pytorch神经网络初始化kaiming分布详解

也称为Glorot initialization。

kaiming分布

Xavier在tanh中表现的很好,但在Relu激活函数中表现的很差,所何凯明提出了针对于relu的初始化方法。pytorch默认使用kaiming正态分布初始化卷积层参数。

(1) kaiming均匀分布

torch.nn.init.kaiming_uniform_
 (tensor, a=0, mode='fan_in', nonlinearity='leaky_relu')

对Pytorch神经网络初始化kaiming分布详解

也被称为 He initialization。

a ? the negative slope of the rectifier used after this layer (0 for ReLU by default).激活函数的负斜率,

mode ? either ‘fan_in' (default) or ‘fan_out'. Choosing fan_in preserves the magnitude of the variance of the weights in the forward pass. Choosing fan_out preserves the magnitudes in the backwards

pass.默认为fan_in模式,fan_in可以保持前向传播的权重方差的数量级,fan_out可以保持反向传播的权重方差的数量级。

>>> w = torch.empty(3, 5)
>>> nn.init.kaiming_uniform_(w, mode='fan_in', nonlinearity='relu')

(2) kaiming正态分布

torch.nn.init.kaiming_normal_
 (tensor, a=0, mode='fan_in', nonlinearity='leaky_relu')

对Pytorch神经网络初始化kaiming分布详解

也被称为 He initialization。

>>> w = torch.empty(3, 5)
>>> nn.init.kaiming_normal_(w, mode='fan_out', nonlinearity='relu')

以上这篇对Pytorch神经网络初始化kaiming分布详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
编写Python的web框架中的Model的教程
Apr 29 Python
Python使用Scrapy保存控制台信息到文本解析
Dec 27 Python
python特性语法之遍历、公共方法、引用
Aug 08 Python
python实现一组典型数据格式转换
Dec 15 Python
Django处理多用户类型的方法介绍
May 18 Python
django框架基于模板 生成 excel(xls) 文件操作示例
Jun 19 Python
浅析Python3 pip换源问题
Jan 06 Python
在pytorch中动态调整优化器的学习率方式
Jun 24 Python
python中执行smtplib失败的处理方法
Jul 01 Python
python else语句在循环中的运用详解
Jul 06 Python
python 基于opencv 绘制图像轮廓
Dec 11 Python
Python网络编程之ZeroMQ知识总结
Apr 25 Python
pytorch中的embedding词向量的使用方法
Aug 18 #Python
Pytorch加载部分预训练模型的参数实例
Aug 18 #Python
在pytorch中查看可训练参数的例子
Aug 18 #Python
浅析PyTorch中nn.Module的使用
Aug 18 #Python
关于PyTorch 自动求导机制详解
Aug 18 #Python
pytorch神经网络之卷积层与全连接层参数的设置方法
Aug 18 #Python
pytorch numpy list类型之间的相互转换实例
Aug 18 #Python
You might like
一个经典的PHP文件上传类分享
2014/11/18 PHP
PHP实现CSV文件的导入和导出类
2015/03/24 PHP
javascript针对DOM的应用实例(一)
2012/04/15 Javascript
jQuery - css() 方法示例详解
2014/01/16 Javascript
jquery通过closest选择器修改上级元素的方法
2015/03/17 Javascript
详解Angularjs filter过滤器
2016/02/06 Javascript
jQuery实现返回顶部功能
2016/02/23 Javascript
JS简单获取及显示当前时间的方法
2016/08/03 Javascript
javascript的函数劫持浅析
2016/09/26 Javascript
Node.js 8 中的重要新特性
2017/06/28 Javascript
Bootstrap与Angularjs的模态框实例代码
2017/08/03 Javascript
bootstrap datetimepicker控件位置异常的解决方法
2017/11/23 Javascript
解决vue动态为数据添加新属性遇到的问题
2018/09/18 Javascript
简单了解vue中父子组件如何相互传递值(基础向)
2019/07/12 Javascript
图解NodeJS实现登录注册功能
2019/09/16 NodeJs
javascript中contains是否包含功能实现代码(扩展字符、数组、dom)
2020/04/07 Javascript
浅析VUE防抖与节流
2020/11/24 Vue.js
[36:19]2018DOTA2亚洲邀请赛 小组赛 A组加赛 Newbee vs LGD
2018/04/03 DOTA
[02:40]2018年度DOTA2最佳新人-完美盛典
2018/12/16 DOTA
[05:09]DOTA2-DPC中国联赛2月22日Recap集锦
2021/03/11 DOTA
python模块之StringIO使用示例
2015/04/08 Python
在Python的Flask框架中实现全文搜索功能
2015/04/20 Python
python中异常捕获方法详解
2017/03/03 Python
Python元组操作实例分析【创建、赋值、更新、删除等】
2017/07/24 Python
Python简单实现控制电脑的方法
2018/01/22 Python
python对验证码降噪的实现示例代码
2019/11/12 Python
Python操作Excel工作簿的示例代码(\*.xlsx)
2020/03/23 Python
CSS3 边框效果
2019/11/04 HTML / CSS
中国高端家电购物商城:顺电
2018/03/04 全球购物
浙大网新C/C++面试解惑
2015/05/27 面试题
大学生毕业自我鉴定
2013/11/06 职场文书
国家助学金获奖感言
2014/01/31 职场文书
2014年信息中心工作总结
2014/12/17 职场文书
2015初中教导处工作总结
2015/07/21 职场文书
2016五一手机促销广告语
2016/01/28 职场文书
Promise面试题详解之控制并发
2021/05/14 面试题