精华内容
下载资源
问答
  • 1.pytorch自定义网络结构不进行参数初始化会怎样,参数值是随机的吗? 2.如何自定义参数初始化? 先回答第一个问题 在pytorch中,有自己默认初始化参数方式,所以在你定义好网络结构以后,不进行参数初始化也是...

    本文用两个问题来引入

    1.pytorch自定义网络结构不进行参数初始化会怎样,参数值是随机的吗?

    2.如何自定义参数初始化?

    先回答第一个问题

    在pytorch中,有自己默认初始化参数方式,所以在你定义好网络结构以后,不进行参数初始化也是可以的。

    1.Conv2d继承自_ConvNd,在_ConvNd中,可以看到默认参数就是进行初始化的,如下图所示

    2.torch.nn.BatchNorm2d也一样有默认初始化的方式

    3.torch.nn.Linear也如此

    现在来回答第二个问题。

    pytorch中对神经网络模型中的参数进行初始化方法如下:

    from torch.nn import init
    #define the initial function to init the layer's parameters for the network
    def weigth_init(m):
        if isinstance(m, nn.Conv2d):
            init.xavier_uniform_(m.weight.data)
            init.constant_(m.bias.data,0.1)
        elif isinstance(m, nn.BatchNorm2d):
            m.weight.data.fill_(1)
            m.bias.data.zero_()
        elif isinstance(m, nn.Linear):
            m.weight.data.normal_(0,0.01)
            m.bias.data.zero_()

      首先定义了一个初始化函数,接着进行调用就ok了,不过要先把网络模型实例化:

      #Define Network
        model = Net(args.input_channel,args.output_channel)
        model.apply(weigth_init)

     此上就完成了对模型中训练参数的初始化。

     在知乎上也有看到一个类似的版本,也相应的贴上来作为参考了:

    
    def initNetParams(net):
        '''Init net parameters.'''
        for m in net.modules():
            if isinstance(m, nn.Conv2d):
                init.xavier_uniform(m.weight)
                if m.bias:
                    init.constant(m.bias, 0)
            elif isinstance(m, nn.BatchNorm2d):
                init.constant(m.weight, 1)
                init.constant(m.bias, 0)
            elif isinstance(m, nn.Linear):
                init.normal(m.weight, std=1e-3)
                if m.bias:
                    init.constant(m.bias, 0)
     
    initNetParams(net)

    再说一下关于模型的保存及加载

    1.保存有两种方式,第一种是保存模型的整个结构信息和参数,第二种是只保存模型的参数

     #保存整个网络模型及参数
     torch.save(net, 'net.pkl') 
    
     #仅保存模型参数
     torch.save(net.state_dict(), 'net_params.pkl')

    2.加载对应保存的两种网络

    # 保存和加载整个模型  
    torch.save(model_object, 'model.pth')  
    model = torch.load('model.pth')  
     
    # 仅保存和加载模型参数  
    torch.save(model_object.state_dict(), 'params.pth')  
    model_object.load_state_dict(torch.load('params.pth'))
    

     

    展开全文
  • 参数初始化

    2019-03-27 11:15:10
    随机初始化就是搞一些很小的值进行初始化, 实验表明大了就容易饱和,小的就激活不动 看一下第一个分布:sigmoid+标准差=0.01的随机初始化 可以看到激活之在0.5附近啊,很容易梯度就是0了,这就没法学习了 ...

    1.为什么不能全部设为0

    https://zhuanlan.zhihu.com/p/27190255

    简单来讲就是如果全为零那么每次更新的时候权重都一样

    这里的deltaw和之前正想传播学习的a值什么的相关:因为正想传播所有的那个都一样,从而deltaw一样

    preview

    参考:https://zhuanlan.zhihu.com/p/24801814 

    本来我们希望不同的结点学习到不同的参数,但是由于参数相同以及输出值都一样,不同的结点根本无法学到不同的特征!这样就失去了网络学习特征的意义了。

    参考链接:https://zhuanlan.zhihu.com/p/38315135

     

    简单的说:

    随机初始化的缺点是因为网络输出数据分布的方差会随着神经元个数改变(而且也和上一层输出神经元的方差相关)

    从而(?)这个梯度在每一层是不一样的,要么就是导致激活失灵/要么就是激活饱和,导致剃度接近0,就是导致很难更新了

    随机初始化就是搞一些很小的值进行初始化,实验表明大了就容易饱和,小的就激活不动

    看一下第一个分布:sigmoid+标准差=0.01的随机初始化

    可以看到激活之在0.5附近啊,很容易梯度就是0了,这就没法学习了

     sigmoid+标准差=1的随机初始化

    你看看激活函数都饱和成什么样子了!在-1,1附近还是梯度很小啊,没法学习

    preview

    现在Tanh+随机初始化看看发生了什么

    同时伴随着Z值消失激活消失 

     

    preview

    增大标准差会怎么样

    从最后一个隐藏层反向传播至第一个隐藏层的过程中,梯度越来越大?另外,类似sigmoid激活函数,Z值区间太宽了,导致激活塌缩到大多数值要么是零要么是一的情形。同样,这不好 

    preview

    看看冠军搭配0.1

    preview

    • 首先,梯度所有层相似(同时位于一个适宜的尺度——约为权重的1/20)
    • 其次,Z值位于一个适宜的区间(-1, 1),在所有层上相似(虽然可以观察到一些收缩)
    • 最后,激活没有塌缩到二值模式,并且在所有层上相似(同样,有一些收缩)

    简单来说,这意味着我们可以在网络后面堆叠另一层,然后期望Z值激活梯度分布仍然是相似的。我们肯定希望网络表现出塌缩消失爆炸

    到这里我们应该看出来了,关键在权重的标准差选取上!!

     

    所有有了X初始化(但X适合和tanh不适合relu)

     

     

     

     

     

     

    所以有了H初始化

    然后又有了BN

     

     

    展开全文
  • 深度学习之参数初始化策略

    万次阅读 2017-10-13 22:09:43
    本文介绍了深度学习中参数的初始化对训练的影响以及常用参数初始化策略,标准初始化,Xavier初始化,He初始化。

    为什么需要参数初始化策略

    目的

    为了让神经网络在训练过程中学习到有用的信息,需要参数更新时的梯度不为0。在一般的全连接网络中,参数更新的梯度和反向传播得到的状态梯度以及输入激活值有关。那么参数初始化应该满足以下两个条件:

    1. 初始化必要条件一:各层激活值不会出现饱和现象(对于sigmoid,tanh);
    2. 初始化必要条件二:各层激活值不为0。

    全零初始化存在的问题

    全零初始化方法在前向传播过程中会使得隐层神经元的激活值均未0,在反向过程中根据BP公式,不同维度的参数会得到相同的更新。
    需要破坏这种“对称性”。
    这里写图片描述

    激活函数输入值的方差

    这里写图片描述
    这里写图片描述
    从上述推导可以看出,神经元输出的方差会随着神经元数量的增大而变多。
    这里写图片描述

    标准初始化

    标准初始化方法通过对方差乘以一个系数确保每层神经元的输出具有相同的方差,提高训练收敛速度。

    标准均匀初始化方法保证了激活函数的输入值的均值为0,方差为常量13\frac{1}{3}31,和网络的层数和神经元的数量无关。对于sigmoid激活函数来说,可以确保自变量处于有梯度的范围内。
    但是注意对于sigmoidsigmoidsigmoid函数,其输出是大于零的,这违反了上面推导中关于E(xi)=0E(x_i)=0E(xi)=0的假设。综上,标准初始化方法更适用于tanhtanhtanh激活函数。

    标准正态初始化方法保证激活函数的输入均值为,方差为1。

    对于含有ninn_{in}nin个输入和noutn_{out}nout个输出的全连接层,

    • standard_normal
      Wi,j∼N(0,1nin)W_{i,j}\sim N(0,\frac{1}{\sqrt{n_{in}}})Wi,jN(0,nin1)
    • standard_uniform
      Wi,j∼U(−1nin,1nin)W_{i,j}\sim U(-\frac{1}{\sqrt{n_{in}}},\frac{1}{\sqrt{n_{in}}})Wi,jU(nin1,nin1)

    Xavier初始化(glorot初始化)

    glorot认为优秀的初始化应该使得各层的激活值和状态梯度的方差在传播过程中的方差保持一致。
    glorot假设DNN使用激活值关于0对称且在0处梯度为1的激活函数(如tanh)。

    si=ziWi+bis^i=z^iW^i+b^isi=ziWi+bizi+1=f(si)z^{i+1}=f(s^i)zi+1=f(si)

    ∂Cost∂ski=∂Cost∂si+1Wki+1f′(ski)..............(2)\frac{\partial{Cost}}{\partial{s_k^i}}=\frac{\partial{Cost}}{\partial{s^{i+1}}}W_k^{i+1}f'(s_k^i) \text{..............(2)}skiCost=si+1CostWki+1f(ski)..............(2)
    ∂Cost∂wl,ki=∂Cost∂skizli..............(3)\frac{\partial{Cost}}{\partial{w_{l,k}^i}}=\frac{\partial{Cost}}{\partial{s_k^i}}z_l^i\text{..............(3)}wl,kiCost=skiCostzli..............(3)
    根据之前的假设
    f′(ski)≈1..............(4)f'(s_k^i)\approx1\text{..............(4)}f(ski)1..............(4),
    Var[zi]=Var[x]∏i′=0i−1ni′Var[Wi′]..............(5)Var[z^i]=Var[x]\prod_{i'=0}^{i-1}n_{i'}Var[W^{i'}]\text{..............(5)}Var[zi]=Var[x]i=0i1niVar[Wi]..............(5)
    这里写图片描述
    为了满足之前的假设,即
    这里写图片描述
    综合以上两个要求,
    Xavier初始化要求神经元的权重的方差Var(w)=2nin+noutVar(w)=\frac{2}{n_{in}+n_{out}}Var(w)=nin+nout2

    • xavier_normal
      Wi,j∼N(0,2nin+nout)W_{i,j}\sim N(0,\sqrt{\frac{2}{n_{in}+n_{out}}})Wi,jN(0,nin+nout2)
    • xavier_uniform
      Wi,j∼U(−6nin+nout,6nin+nout)W_{i,j}\sim U(-\sqrt{\frac{6}{n_{in}+n_{out}}},\sqrt{\frac{6}{n_{in}+n_{out}}})Wi,jU(nin+nout6,nin+nout6)

    该方法有一定限制,其推导过程假设激活函数在零点附近接近线性函数,且激活值关于0对称。
    sigmoid函数和relu函数不满足这些假设。
    在tensorflow中,

    w = tf.get_variable("w",shape[100,10],initializer=tf.contrib.layers.xavier_initializer())
    

    He初始化

    • he_normal
      Wi,j∼N(0,2nin)W_{i,j}\sim N(0,\sqrt{\frac{2}{n_{in}}})Wi,jN(0,nin2)
    • he_uniform
      Wi,j∼U(−6nin,6nin)W_{i,j}\sim U(-\sqrt{\frac{6}{n_{in}}},\sqrt{\frac{6}{n_{in}}})Wi,jU(nin6,nin6)
      ReLU建议使用

    参考资料

    东山客的博客
    码农王小呆的博客
    Xavier论文
    Kaiming论文

    深度学习交流群

    为了方便朋友们讨论交流,我们成立了机器学习&深度学习相关的算法技术交流群,关注公众号【浅梦的学习笔记】,后台回复【加群】即可加入~
    在这里插入图片描述

    展开全文
  • 网络参数初始化

    2019-01-06 09:08:39
    参考:《解析深度学习——卷积神经网络原理与...一、Xaiver参数初始化方法和He参数初始化方法 (1)Xaiver参数初始化方法 随机初始化+方差大小的规范化 , n指输入神经元个数n_in,也可以指定为(n_in+n_out)/2...

    参考:《解析深度学习——卷积神经网络原理与视觉实践》

    网址:http://lamda.nju.edu.cn/weixs/book/CNN_book.pdf

    实际应用中,随机参数服从高斯分布或均匀分布

    一、Xaiver参数初始化方法和He参数初始化方法

    (1)Xaiver参数初始化方法

    随机初始化+方差大小的规范化

    , n指输入神经元个数n_in,也可以指定为(n_in+n_out)/2。

    Xaiver参数初始化方法收敛速度快原因:维持了输入输出数据分布方差的一致性。具体分析:

    缺点:未考虑非线性函数对输入的影响。

    (2)He参数初始化方法

    将Xaiver参数初始化方法中方差规范化的分母改为

    (3)上述两种方法比较

    (4)使用均匀分布的修改

    Xaiver参数初始化方法

    He参数初始化方法

    二、其他参数初始化方法

    (1)使用预训练模型的参数进行初始化——首选

     

    (2)数据敏感的参数初始化方式 ,是一种根据自身任务数据集量身定制的参数初始化方式,读者在进行自己训练任务时不妨尝试一下。

     

    展开全文
  • Pytorch 默认参数初始化

    千次阅读 多人点赞 2019-07-29 20:32:57
    Pytorch 默认参数初始化 代码参考自pytorch pytorch中的各种参数层(Linear、Conv2d、BatchNorm等)在__init__方法中定义后,不需要手动初始化就可以直接使用,这是因为Pytorch对这些层都会进行默认初始化,因此,...
  • 深度学习之参数初始化(一)——Xavier初始化

    万次阅读 多人点赞 2017-06-10 18:28:19
    Understanding the difficulty of training deep ...本文介绍一下深度学习参数初始化问题中耳熟能详的参数初始化方法——Xavier(发音[‘zeɪvɪr])初始化。大家应该感觉到一般的深度学习文章上来就是实验,
  • C++参数初始化

    千次阅读 2018-11-05 15:26:26
    参数初始化表对数据成员初始化 类名::构造函数名(参数表):参数初始化表{ 构造函数体 } 参数初始化表的一般形式是: 数据成员名1(初始值1),数据成员名2(初始值2),、、、 Tdate::Tdate(int y,int ...
  • pytorch中的参数初始化方法总结

    万次阅读 多人点赞 2019-06-30 16:20:33
    参数初始化(Weight Initialization) PyTorch 中参数的默认初始化在各个层的 reset_parameters() 方法中。例如:nn.Linear 和 nn.Conv2D,都是在 [-limit, limit] 之间的均匀分布(Uniform distribution),其中 ...
  • Pytorch中的参数初始化

    2020-07-25 16:03:40
    参数初始化(Weight Initialization)1.1 常数初始化1.2 均匀分布初始化1.3 正态分布初始化1.4 Xavier均匀分布1.5 Xavier正态分布1.6 kaiming均匀分布1.7 kaiming正态分布1.8 单位矩阵初始化1.9 正交初始化1.10 ...
  • DL之DNN优化技术:DNN中权重初始值优化【Xavier初始值】的简介、使用方法详细攻略 目录 【Xavier初始值】的简介 【Xavier初始值】的使用方法 【Xavier初始值】的简介 Xavier Glorot等人的论文中推荐...
  • tensorflow参数初始化方法

    千次阅读 2019-12-02 15:55:14
    在tensorflow中,经常会遇到参数初始化问题,比如在训练自己的词向量时,需要对原始的embeddigs矩阵进行初始化,更一般的,在全连接神经网络中,每层的权值w也需要进行初始化。 tensorlfow中应该有以下几种初始化...
  • Pytorch:参数初始化 笔记

    千次阅读 2018-12-06 17:13:39
    一、参数初始化概述 在设计好神经网络结构之后,权重初始化方式会很大程度上影响模型的训练过程和最终效果。 权重初始化方式包括ImageNet预训练参数,kaiming_uniform方式以及多种权重初始化方式。这篇笔记主要...
  • 神经网络参数初始化方法

    千次阅读 2019-09-14 10:29:31
    文章目录过大或者过小的初始化1. 所有的参数初始化为0或者相同的常数2. 随机初始化3. Batch Normalization4. Xavier限制均匀分布正态分布5. MSRA正态分布均匀分布总结及使用的概率公式...理想的网络参数初始化使模型...
  • 常见的参数初始化方法

    千次阅读 2019-08-08 10:42:56
    常见的参数初始化方法 我们常见的几种初始化方法是按照“正态分布随机初始化——对应为normal”和按照“均匀分布随机初始化——对应为uniform”,这里就不再多说了,这里介绍几种遇见较少的初始化方法。 1、...
  • C++参数初始化列表 1、举例:foo(string s, int i):name(s), id(i){} ; // 初始化列表  即将字符串s的值赋给name。 2、默认构造函数:没有参数或参数有默认值的构造函数  class();或class(int age=12,name=“xiao ...
  • pytorch参数初始化方法

    千次阅读 2019-11-28 17:48:00
    pytorch参数初始化方法 PyTorch 中参数的默认初始化在各个层的 reset_parameters() 方法中。例如:nn.Linear 和 nn.Conv2D,都是在 [-limit, limit] 之间的均匀分布(Uniform distribution),其中 limit 是 1. / ...
  • 参数初始化列表

    千次阅读 2015-09-10 13:11:24
    1、参数初始化列表 初始化类的成员有两种方式,一是使用初始化列表,二是在构造函数体内进行赋值操作。 对于内置类型,如int, float等,使用初始化类表和在构造函数体内初始化差别不是很大,但是对于类类型来说...
  • c++参数初始化

    千次阅读 2019-04-15 09:32:57
    我们知道构造函数的主要用途就是初始化对象的,除了采用上节所讲述的那种在函数体中一一赋值的方法外,通过参数初始化表同样可以对对象进行初始化,请看下面的代码(例1): class book { public: book(){} book...
  • 除了使用构造函数可以对类中的成员变量进行初始化,还可以使用参数初始化列表。这种方法不在函数体内对数据成员初始化,而是在函数首部实现。这样可以减少函数体的长度。 举例如下: #include using namespace std...
  • 神经网络参数初始化

    千次阅读 2018-08-23 18:29:25
    如果参数初始化的过小,很可能导致网络每一层的输出为都接近于0,那么可以这样认为每一层的输入都会很接近于0,在进行反向传播的时候,假如我们要更新某一层的参数W,该层的输出是g(WX)暂且先不考虑偏置项,则求W...
  • 神经网络参数初始化总结分析

    千次阅读 2020-01-08 16:12:19
    神经网络的参数主要是权重(weights):W, 和偏置项(bias...2、全相同参数初始化 3、正态分布随机初始化 1)使用较小的随机值初始化 2)使用较大的随机值初始化 3)选择合适的随机值进行初始化 4)讨论 5、X...
  • pytorch中的参数初始化方法

    千次阅读 2020-05-11 11:11:22
    参数初始化(Weight Initialization) PyTorch 中参数的默认初始化在各个层的 reset_parameters() 方法中。例如:nn.Linear 和 nn.Conv2D,都是在 [-limit, limit] 之间的均匀分布(Uniform distribution),其中 ...
  • 深度学习中常用的参数初始化方法及caffe中的初始化方法介绍 本文首先介绍了深度学习中常用的权重初始化方法,然后介绍 caffe 中的初始化方法的使用。 1. 深度学习中常用的权重初始化方法 1.1 随机初始化(Gaussian)...
  • 神经网络参数初始化-He初始化

    千次阅读 2020-06-11 03:24:30
    Glorot和Bengio提出了Xavier方法来初始化网络参数。该方法基于激活是线性的假设。但该假设对ReLU不适用。何凯明(He kaiming)在论文《Delving Deep into Rectifiers:Surpassing Human-Level Performance on ...
  • Junit4 - 参数初始化

    千次阅读 2018-10-27 22:01:03
    在没有使用参数初始化之前,创了13个test,太冗杂。 下面来说说参数初始化。 以下是代码: public class MyCalendar2 { public int getNumberOfDaysInMonth(int year, int month) { if (month == 1 || month == 3...
  • Deep Learning 之 参数初始化

    千次阅读 2017-04-26 10:27:55
    本文仅对常见的参数初始化方法进行总结(大部分内容来自deep learning一书),原理性的问题不进行过多的探讨。**Deep Learning中参数初始化十分重要,一般来说有以下这些原因:** 1.初始点的选取,有时候能够决定...
  • 深度学习参数初始化(weights initializer)策略大全

    万次阅读 多人点赞 2019-03-21 11:20:37
    前言:深度学习的初始化参数指的是在网络训练之前,对各个节点的权重和偏置进行初始化的过程,很多时候我们...本文就来讨论一下参数初始化到底有什么讲究以及常见的参数初始化的一些策略方法。阅读本文需要神经网络...
  • Tensorflow中关于参数初始化的方法

    千次阅读 2018-04-01 20:42:52
    在对神经网络模型进行训练的时候,训练的就是模型中的Weight、Bias参数,要想模型效果好,当然参数就要训练到一个...在tensorflow中有很多关于参数初始化的方法,以下内容转自以下链接:http://www.mamicode.com/inf...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 59,118
精华内容 23,647
关键字:

参数初始化