【问题标题】:Keras validation accuracy is increasingKeras 验证准确性正在提高
【发布时间】:2020-06-15 23:01:02
【问题描述】:

更新:将旋转范围增加到 180,添加了 GaussianNoise。查看代码

我正在使用 CNN 进行图像分类。我在训练数据集中有 2 张 3500 级灰度照片,每个在验证数据集中有 1000 张。问题是首先 5-10 个 epoch 训练 acc 并且有效 acc 正在增加,但随后有效 acc 开始急剧下降,而 train acc 不断增加。

Old Picture

我看到这是因为过度拟合,但我也尝试通过在ImageDataGenerator. 中放入一些参数来处理过度拟合

train_image_generator = ImageDataGenerator(rescale=1. / 255,
                                           rotation_range=180,
                                           width_shift_range=.15,
                                           height_shift_range=.15,
                                           horizontal_flip=True,
                                           fill_mode='nearest',
                                           shear_range=0.05,
                                           zoom_range=0.5
                                           )

我还将Dropout 层放入CNN 架构中。

model = Sequential([
    GaussianNoise(0.01, input_shape=(IMG_HEIGHT, IMG_WIDTH, 1)),
    Conv2D(16, 3, padding='same', activation='relu', input_shape=(IMG_HEIGHT, IMG_WIDTH, 1)),
    Dropout(0.7),
    MaxPooling2D(),

    Conv2D(32, 3, padding='same', activation='relu'),
    Dropout(0.7),
    MaxPooling2D(),
    Dropout(0.5),

    Conv2D(64, 3, padding='same', activation='relu'),
    Dropout(0.7),
    MaxPooling2D(),
    Dropout(0.5),

    Flatten(),
    Dropout(0.7),

    Dense(512, activation='relu'),
    Dense(2, activation='softmax')
])

我已经设置了学习率:

adamOpti = Adam(lr=0.00005)
model.compile(optimizer=adamOpti,
              loss="categorical_crossentropy",
              metrics=['accuracy'])

即使我也设置了 EarlyStopping:

es = EarlyStopping(monitor='val_loss', mode='min', verbose=1, patience=200)
mc = ModelCheckpoint('best_model.h5', monitor='val_acc', mode='max', verbose=1, save_best_only=True)

TL,DR 我尝试过的处理过度拟合的列表:

  1. 图像增强
  2. 减少层数和神经元数
  3. 洗牌训练图像生成器
  4. 辍学
  5. 提前停止
  6. 调整学习率
  7. 更多数据(仍在收集,不知道什么时候)

我不知道还有什么我错过的。欢迎所有的cmets。 提前谢谢你

【问题讨论】:

  • 看起来肯定是过拟合了,你检查过吗? stackoverflow.com/questions/36139980/…
  • 如您所见,我尝试了大多数建议,例如 dropout、缩小网络、增强等。现在我正在尝试带来更多数据,看看是否会有任何不同。
  • 你过拟合了。你可以尝试降低你的 CNN 复杂度;例如减少层数或神经元数。还要检查训练集和验证集是否以随机方式分割
  • 感谢您的评论。我也减少了层数和神经元的数量,但仍然得到几乎相同的输出。我忘记在训练和有效图像生成器中添加但 shuffle=True。

标签: python tensorflow machine-learning keras deep-learning


【解决方案1】:

我建议从图像增强过程开始。为您的图像添加模糊、旋转、噪声、剪裁等,这样模型就不会一遍又一遍地看到同一组图像。尽管可能感觉反直觉,但您需要通过增加多样性来增加模型的难度。这将使它更好地泛化。

还要确保您的类不是高度不平衡的(最大类与最小类的图像数量不超过 10 倍)。这是为了确保您的批次中没有一个班级过多。如果您在一个类中的图像比另一个类中的图像多,请从较大的类中删除一些图像,或者为较小的类收集更多图像(或生成以某种方式增强的新图像),直到每个类的图像数量更偶数类。

最后,如果您的硬件支持,您可以增加批量大小,从而增加每批图像的多样性。

编辑:

看起来你只有两个类,而且它们是平衡的。我建议尝试将图像增强作为第一种方法(旋转、模糊、噪声、剪辑、倾斜)

【讨论】:

  • 感谢您的评论,但您确定我不是在扩充图像吗?因为正如您在代码中看到的那样,ImageDataGenerator 中有旋转、缩放、剪辑。我在这里发信息吗?
  • 对不起,我错过了,尝试为这些参数创建一个非常宽的范围,例如,旋转可以在 -180、180 之间,并且添加的噪点、模糊和其他失真比你想象的要多您应该希望模型难以适应,并且您会看到在许多时期内的准确性都在提高。如果是这种情况,您可以稍微调整一下,直到找到合适的平衡!
  • 感谢您的所有建议。我增加了旋转范围,但我不能添加噪点和模糊,因为我的图像已经有太多的噪点和模糊了:(让我感到困惑的是这个模型在我输入更多数据之前就已经工作了。减少数据数量可以解决吗?(多么奇怪的问题啊哈哈)
  • 很有可能您可以建立一个比您想象的更少图像的质量模型。这通常是品种而不是数量的问题。不要让自己害怕添加模糊和噪点,即使您认为这是一个坏主意 - 通过实验自己确认。无论哪种方式,您都会从中学到一些东西。
  • 我刚刚完成了一项新模型的实验,该模型配置了您的建议。 Val acc 保持不变:/ 更新结果和代码。我认为我做错了什么,但是
猜你喜欢
  • 2020-10-02
  • 1970-01-01
  • 2020-01-07
  • 2019-01-30
  • 2018-09-18
  • 2019-10-21
  • 2020-02-02
  • 2017-12-21
  • 2015-04-21
相关资源
最近更新 更多