精华内容
下载资源
问答
  • 通过实验分析keras中Dropout训练阶段和测试阶段的使用情况。 结论: Keras使用的 Inverted Dropout,因此测试时不需要修改 Dropout中的参数(rate)。 1. Dropout 的实现方式 Dropout的实现方式有两种。 ...

    0. 写作目的

    通过实验分析keras中Dropout在训练阶段和测试阶段的使用情况。

    结论: Keras使用的 Inverted Dropout,因此测试时不需要修改 Dropout中的参数(rate)。

    1.  Dropout 的实现方式

    Dropout的实现方式有两种。

    Dropout:(使用较少, AlexNet使用的是这种Dropout)

           训练阶段:

                      keepProb: 保留该神经元的概率。

                      d3 = np.random.rand( a3.shape[0], a3.shape[1] ) < keepProb

                     a3=a3 * d3 

                     测试阶段: 计算的结果需要乘以keepProb: a3 = a3 * Keepprob 

    Inverted Dropout:(目前常用的方法)

            训练阶段:

                        d3 = np.random.rand( a3.shape[0], a3.shape[1] ) < keepProb

                        a3=a3 * d3

                       a3 = a3 / keepProb

                        测试阶段:  a3=a3

    2. 实验验证Dropout的实现(也可以通过源码查看)

    实验思路通过训练带有Dropout的网络,然后加载训练的模型,并修改其中的Dropout的参数。观察在相同的数据集上的预测结果是否相同,为避免实验的随机性,对于测试实验运行10次观察结果。

    实验过程:首先运行代码一,然后运行代码二,然后对比代码一与代码二的结果。

    实验结果猜测:如果代码一的结果是代码二结果的 1/2,说明Keras中Dropout是采用AlexNet中的Dropout,如果代码一二的结果近似相等,说明Keras中Dropout使用的是Inverted Dropout。

    代码一:

    # _*_ coding:utf-8 _*_
    
    
    import keras
    from keras.layers import Dense, Dropout, Input
    from keras.optimizers import SGD
    import numpy as np
    from keras.models import Model, load_model
    import tensorflow as tf
    
    ## y = 2 * x1 + x2
    def generateData():
        X = np.array([[3, 2], [2, 4], [1, 6]])
        y = np.array([[8], [8], [8]])
        return X, y
    
    
    
    def Net(rate=0):
        tf.reset_default_graph()
        input_x = Input( shape=(2, ) )
        x = Dense(units=100, activation='linear')(input_x)
        x = Dropout(rate=rate)(x)
        x = Dense(units=100, activation='linear')(x)
        x = Dense(units=1, activation='linear')(x)
        model = Model(inputs=input_x, outputs=x)
        model.summary()
        return model
    
    
    def main():
        model_with = Net(rate=0.5)
        model_with.compile(optimizer=SGD(0.001), loss='mse')
    
        X, y = generateData()
        model_with.fit(X, y, nb_epoch=1000, verbose=0)
        model_with.save('model.h5')
    
        for ii in range(10):
            y_with = model_with.predict( X )
            print( 'model with dropout:{}'.format(y_with) )
    
    
    
    if __name__ == "__main__":
        main()
    
    

    代码二:

    #!/usr/bin/env python
    # _*_ coding:utf-8 _*_
    
    import keras
    from keras.layers import Dense, Dropout, Input
    from keras.optimizers import SGD
    import numpy as np
    from keras.models import Model, load_model
    import tensorflow as tf
    
    ## y = 2 * x1 + x2
    def generateData():
        X = np.array([[3, 2], [2, 4], [1, 6]])
        y = np.array([[8], [8], [8]])
        return X, y
    
    
    
    def Net(rate=0):
        tf.reset_default_graph()
        input_x = Input( shape=(2, ) )
        x = Dense(units=100, activation='linear')(input_x)
        x = Dropout(rate=rate)(x)
        x = Dense(units=100, activation='linear')(x)
        x = Dense(units=1, activation='linear')(x)
        model = Model(inputs=input_x, outputs=x)
        model.summary()
        return model
    
    def main():
        X, y = generateData()
        model_without = Net(rate=0)
        model_without.load_weights('model.h5', by_name=True)
        # model_without = load_model( 'model.h5' )
        for ii in range(10):
            y_without = model_without.predict(X)
            print('model without dropout: {}'.format(y_without))
    
    if __name__ == "__main__":
        main()
    

    3. 实验结果

    代码一结果:

    model with dropout:[[8.249627]
     [8.171895]
     [8.094164]]
    model with dropout:[[8.249627]
     [8.171895]
     [8.094164]]
    model with dropout:[[8.249627]
     [8.171895]
     [8.094164]]
    model with dropout:[[8.249627]
     [8.171895]
     [8.094164]]
    model with dropout:[[8.249627]
     [8.171895]
     [8.094164]]
    model with dropout:[[8.249627]
     [8.171895]
     [8.094164]]
    model with dropout:[[8.249627]
     [8.171895]
     [8.094164]]
    model with dropout:[[8.249627]
     [8.171895]
     [8.094164]]
    model with dropout:[[8.249627]
     [8.171895]
     [8.094164]]
    model with dropout:[[8.249627]
     [8.171895]
     [8.094164]]

    代码二结果:

    model without dropout: [[8.249627]
     [8.171895]
     [8.094164]]
    model without dropout: [[8.249627]
     [8.171895]
     [8.094164]]
    model without dropout: [[8.249627]
     [8.171895]
     [8.094164]]
    model without dropout: [[8.249627]
     [8.171895]
     [8.094164]]
    model without dropout: [[8.249627]
     [8.171895]
     [8.094164]]
    model without dropout: [[8.249627]
     [8.171895]
     [8.094164]]
    model without dropout: [[8.249627]
     [8.171895]
     [8.094164]]
    model without dropout: [[8.249627]
     [8.171895]
     [8.094164]]
    model without dropout: [[8.249627]
     [8.171895]
     [8.094164]]
    model without dropout: [[8.249627]
     [8.171895]
     [8.094164]]

    4. 实验结论

    通过实验结果可以看出,Keras中Dropout使用的是Inverted Dropout。

     

    [Reference]

    https://github.com/keras-team/keras/issues/5357

    展开全文
  • (深度学习)Pytorch之dropout训练

    万次阅读 多人点赞 2020-04-22 09:15:16
    (深度学习)Pytorch学习笔记之dropout训练 Dropout训练实现快速通道:...通过下图可以看出,dropout训练训练阶段所有模型共享参数,测试阶段直接组装成一个整体的大网络: 那么,我们在深度学习的有力工具——Pytor...

    (深度学习)Pytorch学习笔记之dropout训练

    Dropout训练实现快速通道:点我直接看代码实现

    Dropout训练简介

    在深度学习中,dropout训练时我们常常会用到的一个方法——通过使用它,我们可以可以避免过拟合,并增强模型的泛化能力。

    通过下图可以看出,dropout训练训练阶段所有模型共享参数,测试阶段直接组装成一个整体的大网络:
    在这里插入图片描述

    那么,我们在深度学习的有力工具——Pytorch中如何实现dropout训练呢?





    易错大坑

    网上查找到的很多实现都是这种形式的:

            out = F.dropout(out, p=0.5)
    

    这种形式的代码非常容易误导初学者,给人带来很大的困扰:

    • 首先,这里的F.dropout实际上是torch.nn.functional.dropout的简写(很多文章都没说清这一点,就直接给个代码),我尝试了一下我的Pytorch貌似无法使用,可能是因为版本的原因。
    • 其次,torch.nn.functional.dropout()还有个大坑:F.dropout()相当于引用的一个外部函数,模型整体的training状态变化也不会引起F.dropout这个函数的training状态发生变化。因此,上面的代码实质上就相当于out = out

    因此,如果你非要使用torch.nn.functional.dropout的话,推荐的正确方法如下(这里默认你已经import torch.nn as nn了):

           out = nn.functional.dropout(out, p=0.5, training=self.training)
    





    推荐代码实现方法

    这里更推荐的方法是:nn.Dropout(p),其中p是采样概率。nn.Dropout实际上是对torch.nn.functional.dropout的一个包装, 也将self.training传入了其中,可以有效避免前面所说的大坑。

    下面给出一个三层神经网络的例子:

    import torch.nn as nn
    
    
    input_size = 28 * 28   
    hidden_size = 500   
    num_classes = 10    
    
    
    # 三层神经网络
    class NeuralNet(nn.Module):
        def __init__(self, input_size, hidden_size, num_classes):
            super(NeuralNet, self).__init__()
            self.fc1 = nn.Linear(input_size, hidden_size)  # 输入层到影藏层
            self.relu = nn.ReLU()
            self.fc2 = nn.Linear(hidden_size, num_classes)  # 影藏层到输出层
            self.dropout = nn.Dropout(p=0.5)  # dropout训练
    
        def forward(self, x):
            out = self.fc1(x)
            out = self.dropout(out)
            out = self.relu(out)
            out = self.fc2(out)
            return out
       
    
    model = NeuralNet(input_size, hidden_size, num_classes)
    model.train()
    model.eval()
    

    另外还有一点需要说明的是,训练阶段随机采样时需要用model.train(),而测试阶段直接组装成一个整体的大网络时需要使用model.eval():

    • 如果你二者都没使用的话,默认情况下实际上是相当于使用了model.train(),也就是开启dropout随机采样了——这样你如果你是在测试的话,准确率可能会受到影响。
    • 如果你不希望开启dropout训练,想直接以一个整体的大网络来训练,不需要重写一个网络结果,而只需要在训练阶段开启model.eval()即可。
    展开全文
  • 【时间】2019.08.06 【题目】Dropout与Inverted Dropout细节,在训练与测试阶段的使用 现在常说的Dropout指Inverted Dropout,Keras中实现...Inverted-dropout的基本实现原理是在训练阶段每次迭代过程中,以keep_p...

    【时间】2019.08.06

    【题目】Dropout与Inverted Dropout细节,在训练与测试阶段的使用

    现在常说的Dropout指Inverted Dropout,Keras中实现的Dropout也是Inverted Dropout。

    一、Dropout 的实现方式

    二、两者的区别

    Inverted-dropout的基本实现原理是在训练阶段每次迭代过程中,以keep_prob的概率保留一个神经元(也就是以1-keep_prob的概率关闭一个神经元),上述代码中利用numpy的具体实现方式为:用U1=(np.random.rand(*H1.shape) < p) / p得到一个mask,再用神经元输出的激活值乘以这个mask,这里numpy.random.rand得到的是一个满足0到1的均匀分布的数组,注意numpy.random.rand和numpy.random.randn两者的区别,后者得到的是标准正态分布的数组。np.random.rand(*H1.shape) < p 得到的是一个布尔值数组,当其元素值小于p时是True,大于p时是False(这里遇到一个python和JavaScript语法不同的地方,就是True和False的首字母必须大写)。那么后面为什么还要除以 p 呢?吴恩达在课里讲的是为了保证神经元输出激活值的期望值与不使用dropout时一致,我们结合概率论的知识来具体看一下:假设一个神经元的输出激活值为a,在不使用dropout的情况下,其输出期望值为a,如果使用了dropout,神经元就可能有保留和关闭两种状态,把它看作一个离散型随机变量,它就符合概率论中的0-1分布,其输出激活值的期望变为 p*a+(1-p)*0=pa,此时若要保持期望和不使用dropout时一致,就要除以 p。

            了解了上述数学细节,我们再回过头来看看AlexNet里传统的dropout,在训练阶段应用dropout时没有让神经元的输出激活值除以 p,因此其期望值为 pa,在测试阶段不用dropout,所有神经元都保留,因此其输出期望值为 a ,为了让测试阶段神经元的输出期望值和训练阶段保持一致(这样才能正确评估训练出的模型),就要给测试阶段的输出激活值乘上 p ,使其输出期望值保持为 pa。

           看到这里你应该已经发现,传统的dropout和Inverted-dropout虽然在具体实现步骤上有一些不同,但从数学原理上来看,其正则化功能是相同的,那么为什么现在大家都用Inverted-dropout了呢?有两点原因:

          1、测试阶段的模型性能很重要,特别是对于上线的产品,模型已经训练好了,只要执行测试阶段的推断过程,那对于用户来说,当然是推断越快用户体验就越好了,而Inverted-dropout把保持期望一致的关键步骤转移到了训练阶段,节省了测试阶段的步骤,提升了速度。

          2、dropout方法里的 keep_prob 是一个可能需要调节的超参数,用Inverted-dropout的情况下,当你要改变 keep_prob 的时候,只需要修改训练阶段的代码,而测试阶段的推断代码没有用到 keep_prob ,就不需要修改了,降低了写错代码的概率。
     

    具体见:

    1、Keras 实现细节——dropout在训练阶段与测试阶段的使用分析

    2、Dropout 和 Inverted Dropout 代码中实现

    展开全文
  • Dropout

    2017-06-10 11:08:34
    Dropout是hintion在他的文章Improving neural networks by preventing co-adaptation of feature detectors(通过阻止特征检测器的共同...Dropout是指在模型训练时随机让网络某些隐含层节点的权重不工作,不工作...

    论文地址:https://arxiv.org/abs/1207.0580

    Dropout是hintion在他的文章Improving neural networks by preventing co-adaptation of feature detectors(通过阻止特征检测器的共同作用来提高神经网络的性能)提出的

    Dropout是指在模型训练时随机让网络某些隐含层节点的权重不工作,不工作的那些节点可以暂时认为不是网络结构的一部分,但是将其权重保留下来(只是暂时不更新而已),因为下次样本输入时它又可以工作了。
    居中

    1、为了防止overfitting,使用dropout的方式,在数据量较大的情况下比较有效果。

    2、hidden unit采用0.5的比例,随机被忽略。

    3、传统RBM的方式使用了权衰减策略,主要目的是防止过度拟合,一般的做法是正常的梯度项后增加一项,作为惩罚项。惩罚函数采用L2 范数,其中λ是学习率,而且偏置unit不需要使用该策略。

    4、没有采用pre-training的网络时(Dropout当然可以结合pre-training一起使用),dropout并不是像通常那样对权值采用L2范数惩罚,而是对每个隐含节点的权值L2范数设置一个上限bound,当训练过程中如果该节点不满足bound约束,则用该bound值对权值进行一个规范化操作(即同时除以该L2范数值),说是这样可以让权值更新初始的时候有个大的学习率供衰减,并且可以搜索更多的权值空间(没理解)。

    5、在模型的测试阶段,使用”mean network(均值网络)”来得到隐含层的输出,其实就是在网络前向传播到输出层前时隐含层节点的输出值都要减半(如果dropout的比例为50%)
    关于Dropout,文章中没有给出任何数学解释,Hintion的直观解释和理由如下:

    1、由于每次用输入网络的样本进行权值更新时,隐含节点都是以一定概率随机出现,因此不能保证每2个隐含节点每次都同时出现,这样权值的更新不再依赖于有固定关系隐含节点的共同作用,阻止了某些特征仅仅在其它特定特征下才有效果的情况。
    2、可以将dropout看作是模型平均的一种。对于每次输入到网络中的样本(可能是一个样本,也可能是一个batch的样本),其对应的网络结构都是不同的,但所有的这些不同的网络结构又同时share隐含节点的权值。这样不同的样本就对应不同的模型,是bagging的一种极端情况。个人感觉这个解释稍微靠谱些,和bagging,boosting理论有点像,但又不完全相同。
    3、native bayes是dropout的一个特例。Native bayes有个错误的前提,即假设各个特征之间相互独立,这样在训练样本比较少的情况下,单独对每个特征进行学习,测试时将所有的特征都相乘,且在实际应用时效果还不错。而Droput每次不是训练一个特征,而是一部分隐含层特征。
    4、还有一个比较有意思的解释是,Dropout类似于性别在生物进化中的角色,物种为了使适应不断变化的环境,性别的出现有效的阻止了过拟合,即避免环境改变时物种可能面临的灭亡。

    展开全文
  • PyTorch的dropout设置训练和测试模式

    万次阅读 2017-12-05 20:40:13
    class Net(nn.Module): … model = Net() …model.train() # 把module设成训练模式,对Dropout和BatchNorm有影响model.eval() # 把module设置为预测模式,对Dropout和BatchNorm模块有影响
  • 深度学习中Dropout原理解析

    万次阅读 多人点赞 2018-06-19 19:12:24
    1. Dropout简介1.1 Dropout出现的原因在机器学习的模型中,如果模型的参数太多,而训练样本又太少,训练出来的模型很容易产生过拟合的现象。在训练神经网络的时候经常会遇到过拟合的问题,过拟合具体表现在:模型在...
  • BN和Dropout训练和测试时的差别

    万次阅读 多人点赞 2019-04-07 16:19:01
    BN,Batch Normalization,就是在深度神经网络训练过程中使得每一层神经网络的输入保持相近的分布。 BN训练和测试时的参数是一样的嘛? 对于BN,在训练时,是对每一批的训练数据进行归一化,也即用每一批数据的均值...
  • dropout

    2019-03-22 13:43:46
    1 dropout简介 1.1 dropout出现的原因 在机器学习的模型中,如果模型的参数太多,而训练样本又太少,训练出来的模型很容易产生过拟合的现象。 ...dropout是指在深度学习网络的训练过程中,对...
  • DropOut

    2018-09-27 19:17:00
    1. Dropout简介 1.1 Dropout出现的原因 在机器学习的模型中,如果模型的参数太多,而训练样本又太少,训练出来的模型很容易产生过拟合的现象。在训练神经网络的时候经常会遇到过拟合的问题,过拟合具体表现在:...
  • BN层和Dropout训练与测试时的差别以及实现细节 1·BN层介绍及测试训练的差别 BN也即Batch Normalization,批规范化,是由谷歌的大佬们在2015年《Batch Normalization: Accelerating Deep Network Training by ...
  • https://blog.csdn.net/songyunli1111/article/details/89071021
  • Numpy手写神经网络(包含Dropout、Batch Normalization)
  • Dropout ,在训练时以一定的概率使神经元失活,实际上就是让对应神经元的输出为0 假设失活概率为 p ,就是这一层中的每个神经元都有p的概率失活,如下图的三层网络结构中,如果失活概率为0.5,则平均每一次训练有3...
  • dropout理解

    千次阅读 2018-08-23 16:31:41
    1.dropout解决的问题 深度神经网络的训练是一件非常困难的事,涉及到很多因素,比如损失函数的非凸性导致的局部最优值、计算过程中的数值稳定性、训练过程中的过拟合等。...dropout是指在训练一...
  • Dropout 笔记

    2021-09-16 20:43:01
    Dropout操作是指在网络的训练阶段,每次迭代时会从基础网络中随机丢弃一定比例的神经元,然后在修改后的网络上进行数据的前向传播和误差的反向传播。模型在测试阶段会恢复全部的神经元。Dropout是一种常用的正则化...
  • 分析 Dropout

    2018-08-01 16:43:05
    过拟合是深度神经网(DNN)中的一个常见问题:模型只学会在训练集上分类,这些年提出的许多过拟合问题的解决方案;其中dropout具有简单性并取得良好的结果: Dropout 上图为Dropout的可视化表示,左边...
  • Dropout详解

    2019-04-08 23:50:40
    Dropout详解算法背景算法原理算法详解训练与测试反向传播 算法背景 过拟合的原因: 在使用深度学习算法进行预测时,为了训练出powerful的神经网络,通常需要设计带有大量参数的神经网络。 但若神经网络结构...
  • dropout学习整理

    2018-10-12 11:08:36
    dropout在训练过程中每次迭代都会得到一个新模型,最终结果是多个模型的融合,得到的只有一个模型,一组... 测试过程,神经元一直都在,在测试阶段必须仿真出在训练阶段使用的网络集的行为,所以每个参数都要乘以...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,802
精华内容 4,720
关键字:

dropout训练阶段