2

我在我的一个项目中使用了一个密集网络模型,并且在使用正则化时遇到了一些困难。

如果没有任何正则化,验证和训练损失 (MSE) 都会减少。但是,训练损失下降得更快,导致最终模型出现一些过度拟合。

所以我决定使用 dropout 来避免过拟合。使用 Dropout 时,在第一个 epoch 期间验证和训练损失都减少到大约 0.13,并在大约 10 个 epoch 内保持不变。

之后,两个损失函数都以与没有 dropout 相同的方式减小,从而再次导致过度拟合。最终的损失值与没有 dropout 的范围大致相同。

所以对我来说,辍学似乎并没有真正起作用。

如果我切换到 L2 正则化,我能够避免过度拟合,但我宁愿使用 Dropout 作为正则化器。

现在我想知道是否有人经历过这种行为?

我在密集块(瓶颈层)和过渡块(辍学率 = 0.5)中都使用了 dropout:

def bottleneck_layer(self, x, scope):
    with tf.name_scope(scope):
        x = Batch_Normalization(x, training=self.training, scope=scope+'_batch1')
        x = Relu(x)
        x = conv_layer(x, filter=4 * self.filters, kernel=[1,1], layer_name=scope+'_conv1')
        x = Drop_out(x, rate=dropout_rate, training=self.training)

        x = Batch_Normalization(x, training=self.training, scope=scope+'_batch2')
        x = Relu(x)
        x = conv_layer(x, filter=self.filters, kernel=[3,3], layer_name=scope+'_conv2')
        x = Drop_out(x, rate=dropout_rate, training=self.training)

        return x

def transition_layer(self, x, scope):
    with tf.name_scope(scope):
        x = Batch_Normalization(x, training=self.training, scope=scope+'_batch1')
        x = Relu(x)
        x = conv_layer(x, filter=self.filters, kernel=[1,1], layer_name=scope+'_conv1')
        x = Drop_out(x, rate=dropout_rate, training=self.training)
        x = Average_pooling(x, pool_size=[2,2], stride=2)

        return x
4

2 回答 2

4

如果没有任何正则化,验证和训练损失 (MSE) 都会减少。但是,训练损失下降得更快,导致最终模型出现一些过度拟合。

不是过拟合。

当你的验证损失开始增加,而你的训练损失继续减少时,过度拟合就开始了;这是它的标志性签名:

在此处输入图像描述

该图像改编自关于过度拟合的 Wikipedia 条目- 不同的东西可能位于水平轴上,例如深度或增强树的数量、神经网络拟合迭代的数量等。

训练和验证损失之间的(通常预期的)差异是完全不同的,称为泛化差距

理解泛化的一个重要概念是泛化差距,即模型在训练数据上的性能与其在从同一分布中提取的不可见数据上的性能之间的差异。

实际上,验证数据确实是看不见的数据。

所以对我来说,辍学似乎并没有真正起作用。

很可能就是这种情况——dropout并不总是适用于所有问题。

于 2020-04-05T14:07:38.483 回答
0

有趣的问题,
我建议绘制验证损失和训练损失,看看它是否真的过拟合。如果您发现验证损失没有改变而训练损失下降(您也可能会看到它们之间存在很大差距),那么它就是过度拟合。

如果它是过拟合的,那么尝试减少层数或节点数(在你这样做之后也可以稍微调整一下 Dropout 率)。减少 epoch 的数量也可能会有所帮助。

如果您想使用不同的方法而不是 dropout,我建议您使用 Gaussian Noise 层。
Keras - https://keras.io/layers/noise/
TensorFlow - https://www.tensorflow.org/api_docs/python/tf/keras/layers/GaussianNoise

于 2020-04-05T14:53:26.487 回答