Keras Dropout

发布时间 2023-10-08 09:30:36作者: emanlee

===============================================================

 一、Keras 中使用 Dropout 正则化减少过度拟合

Dropout正则化是最简单的神经网络正则化方法。其原理非常简单粗暴:任意丢弃神经网络层中的输入,该层可以是数据样本中的输入变量或来自先前层的激活。它能够模拟具有大量不同网络结构的神经网络,并且反过来使网络中的节点更具有鲁棒性。

阅读完本文,你就学会了在Keras框架中,如何将深度学习神经网络Dropout正则化添加到深度学习神经网络模型里,具体内容如下:如何使用Keras API创建Dropout层;如何使用Keras API将Dropout正则化添加到MLP、CNN和RNN层;在现有模型中,如何使用Dropout正则化减少过拟合。
Keras中的Dopout正则化

在Keras深度学习框架中,我们可以使用Dopout正则化,其最简单的Dopout形式是Dropout核心层。

在创建Dopout正则化时,可以将 dropout rate的设为某一固定值,当dropout rate=0.8时,实际上,保留概率为0.2。下面的例子中,dropout rate=0.5。

layer = Dropout(0.5)

Dropout层

将Dropout层添加到模型的现有层和之前的输出层之间,神经网络将这些输出反馈到后续层中。用dense()方法指定两个全连接网络层:

    ...
    model.append(Dense(32))
    model.append(Dense(32))
    ...

在这两层中间插入一个dropout层,这样一来,第一层的输出将对第二层实现Dropout正则化,后续层与此类似。现在,我们对第二层实现了Dropout正则化。

    ...
    model.append(Dense(32))
    model.append(Dropout(0.5))
    model.append(Dense(32))
    ...

Dropout也可用于可见层,如神经网络的输入。在这种情况下,就要把Dropout层作为网络的第一层,并将input_shape参数添加到层中,来制定预期输入。

    ...
    model.add(Dropout(0.5, input_shape=(2,)))
    ...

下面,我们来看看Dropout正则化如何与常见的网络类型一起使用。
MLP Dropout正则化

在两个全连接层之间添加Dropout正则化,代码如下所示:

    # example of dropout between fully connected layers
    from keras.layers import Dense
    from keras.layers import Dropout
    ...
    model.add(Dense(32))
    model.add(Dropout(0.5))
    model.add(Dense(1))
    ...

CNN Dropout正则化

我们可以在卷积层和池化层后使用Dropout正则化。一般来说,Dropout仅在池化层后使用。

    # example of dropout for a CNN
    from keras.layers import Dense
    from keras.layers import Conv2D
    from keras.layers import MaxPooling2D
    from keras.layers import Dropout
    ...
    model.add(Conv2D(32, (3,3)))
    model.add(Conv2D(32, (3,3)))
    model.add(MaxPooling2D())
    model.add(Dropout(0.5))
    model.add(Dense(1))
    ...

 链接:https://blog.csdn.net/yangwohenmai1/article/details/123346240

===============================================================

了解Dropout

神经网络在其输入和输出层之间具有隐藏层,这些隐藏层中嵌入了神经元,神经元内的权重以及神经元之间的连接使得神经网络系统能够模拟学习过程。

简单神经网络

一般的观点是,神经网络体系结构中的神经元和层越多,其表示能力就越强。表示能力的提高意味着神经网络可以拟合更复杂的函数,并可以更好地泛化到训练数据。

 

复杂神经网络

越深的神经网络越容易过度拟合。过度拟合是一个常见问题,它的定义是:模型在训练数据上表现良好,但经过训练的机器学习模型无法很好地泛化到不看见的数据。

Dropout的主要目的是使网络中过度拟合的影响最小化。

Dropout技术是通过随机减少神经网络中相互连接的神经元的数量来实现的。在每一个训练步骤中,每个神经元都有可能被排除在外(从连接的神经元中被剔除)。在某种意义上,层内的神经元学习的权重值不是基于其相邻神经元的协作。

假设你训练了7000个不同的神经网络结构,为了选出最好的一个神经网络体系结构,你只需要取这7000个训练过的神经网络的平均值。

实际上,我们在每个训练步骤中都在训练各种不同的网络(因为在任何两个训练步骤中都不可能排除相同的神经元),因此,使用dropout技术训练的神经网络是在每个训练步骤中的所有不同神经元连接组合的平均值。

实际场景

在实际场景中,或者在测试训练神经网络的性能时,需要考虑以下两点:

1、实际上并不是在神经网络的每个层上都实现了Dropout技术,它通常在神经网络的最后几层被使用。

在CIFAR-10机器学习数据集上进行测试时,如果在最后一个隐藏层中使用了Dropout,则错误率为15.6%。当相同的数据集在相同的卷积神经网络上进行测试(任何一层中均未包含dropout技术)时,错误率为16.6%,相比之下,这是一个进步。

 

 

2、评估训练过的神经网络时不会使用Dropout。由于在评估或测试阶段未使用Dropout,因此神经网络可以充分发其潜力,这意味着网络中的所有神经元都处于活动状态,每个神经元的输入连接都比训练时多。

 https://baijiahao.baidu.com/s?id=1667213407197650339&wfr=spider&for=pc

===============================================================

 

几个建议

1.dropout在0.2~0.5之间,一般0.2就挺好的

2.input也可以用,不止是hiddenlayer

3. Use a larger network. You are likely to get better performance when dropout is used on a larger network, giving the model more of an opportunity to learn independent representations.
4. Use a large learning rate with decay and a large momentum. Increase your learning rate by a factor of 10 to 100 and use a high momentum value of 0.9 or 0.99.
5. Constrain the size of network weights. A large learning rate can result in very large network weights. Imposing a constraint on the size of network weights such as max-norm regularization with a size of 4 or 5 has been shown to improve results

 

http://www.manongjc.com/article/38261.html

===============================================================