如何改善损失和避免过拟合

数据挖掘 深度学习 图像分类 准确性 卷积神经网络 过拟合
2021-09-25 18:42:57

我正在尝试使用本博客第一部分中建议的架构构建一个 2 类图像分类器https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html

我的数据集有 1500 个类别 1 的图像和 500 个类别 2 的图像。我创建了 4 个 class2 副本,以使两个类中的图像数量相同。

我还使用 ImageDataGenerator 来增强图像

datagen = ImageDataGenerator(
        featurewise_center=True,
        featurewise_std_normalization=True,
        shear_range=0.2,
        zoom_range=0.5,
        rotation_range=45,
        horizontal_flip=True,
        vertical_flip=True)
datagen.fit(train_imgs)

我正在使用 AdaDelta、RMSProp、SGD、Adam、AdaGrad 优化器并尝试添加/删除 Conv2D 和 Dense 层。尝试了 BatchNormalizationa 和 Dropout。结果几乎相同:

在最初的几个 epoch(大约 20 个)训练和验证错误不断减少,直到 log loss 达到大约 0.4(到目前为止我得到的最好),之后模型开始过度拟合并且验证损失不断增加。

我知道我可以通过降低网络复杂性和增加 dropout 来防止过度拟合,但这也会降低训练的准确性。

请提出一些提示以提高准确性并避免过度拟合。

4个回答

我不熟悉您使用的软件,但请记住:如果减少过度拟合,您预计准确性会下降。这不是一件坏事。过度拟合本质上是“假准确性”。

不过,通常有一些避免过度拟合的好方法:使用交叉验证、规范化特征、增加数据集的大小,而不是仅仅通过复制数据来增加数据集。

您可以采取一些措施来减少过度拟合。

  1. 使用 Dropout 增加其值并增加训练 epoch 的数量
  2. 通过使用数据增强来增加数据集
  3. 通过添加更多训练参数来调整您的 CNN 模型。减少全连接层。
  4. 改变整个模型
  5. 使用迁移学习(预训练模型)

您可以使用 dropout,这将有助于控制模型过度训练。在使用 CNN 时,数据集起着重要作用。数据集越多,模型可以从中学习到的特征就越多。您可以将数据集分为 3 个部分。培训、测试和验证。

您可以尝试以下几件事来减少过度拟合:

  1. 使用批量标准化
  2. 添加辍学层
  3. 增加数据集
  4. 使用尽可能大的批量(我认为您使用的是 32 和 64)
  5. 从数据中生成图像数据集使用
  6. 卷积层中使用l1 和 l2 正则化
  7. 如果数据集很大,则增加神经网络中的层数。
  8. 在这里使用回调 tf.keras.callbacks.ReduceLROnPlateau

希望这个垫子有所帮助,同时绘制训练的历史图表,以更好地了解您的模型。