【问题标题】:Why is validation accuracy higher than training accuracy when applying data augmentation?为什么在应用数据增强时验证准确度高于训练准确度?
【发布时间】:2018-07-28 11:01:53
【问题描述】:

我正在研究 Keras 中的图像分类问题。

我正在使用 model.fit_generator 训练模型以进行数据增强。 在每个 epoch 进行训练的同时,我也在评估验证数据。

对 90% 的数据进行训练,对 10% 的数据进行验证。以下是我的代码:

datagen = ImageDataGenerator(
    rotation_range=20,
    zoom_range=0.3)


batch_size=32
epochs=30

model_checkpoint = ModelCheckpoint('myweights.hdf5', monitor='val_acc', verbose=1, save_best_only=True, mode='max')

lr = 0.01
sgd = SGD(lr=lr, decay=1e-6, momentum=0.9, nesterov=False)
model.compile(loss='categorical_crossentropy',
          optimizer=sgd,
          metrics=['accuracy'])



def step_decay(epoch):
    # initialize the base initial learning rate, drop factor, and
    # epochs to drop every
    initAlpha = 0.01
    factor = 1
    dropEvery = 3

    # compute learning rate for the current epoch
    alpha = initAlpha * (factor ** np.floor((1 + epoch) / dropEvery))

    # return the learning rate
    return float(alpha)



history=model.fit_generator(datagen.flow(xtrain, ytrain, batch_size=batch_size),
                    steps_per_epoch=xtrain.shape[0] // batch_size,
                  callbacks[LearningRateScheduler(step_decay),model_checkpoint],
                    validation_data = (xvalid, yvalid),
                    epochs = epochs, verbose = 1)

但是,在绘制训练准确度和验证准确度(以及训练损失和验证损失)时,我注意到验证准确度高于训练准确度(同样,验证损失低于训练损失)。这是我训练后的结果图(请注意,验证在图中称为“测试”):

当我不应用数据增强时,训练准确度高于验证准确度。据我了解,训练准确度通常应该高于验证准确度。任何人都可以提供见解,为什么在我应用数据增强的情况下不是这种情况?

【问题讨论】:

  • 您认为数据增强可能是罪魁祸首,这似乎是合理的。但是,您能否澄清一下:您是否在没有数据增强的情况下尝试过这个?如果是这样,那么训练损失和验证损失如何比较?
  • 当我不应用数据增强时,训练准确率高于验证准确率....现在包含在帖子中。
  • 从您的代码中并不完全清楚,但看起来您没有对验证数据应用任何数据扩充。这是正确的吗?
  • 这是正确的...我没有对验证数据应用数据扩充
  • 我认为这就是问题所在。请看下面我的回答。 TL;DR 数据增强有时使模型的任务更加困难。如果您也增加验证数据,您应该会看到一切恢复正常。

标签: machine-learning deep-learning keras


【解决方案1】:

以下只是一个理论,但它是你可以测试的!

验证准确度优于训练准确度的一个可能解释是,您对训练数据应用的数据增强使网络的任务变得更加困难。 (从您的代码示例中并不完全清楚。但看起来您仅将增强应用于您的训练数据,而不是您的验证数据)。

要了解为什么会出现这种情况,假设您正在训练一个模型来识别图片中的某个人是在微笑还是在皱眉。大多数人脸图片的人脸“正确向上”,因此模型可以通过识别嘴巴并测量嘴巴是向上还是向下弯曲来解决任务。如果您现在通过应用随机旋转来增加数据,则模型将不再只关注嘴巴,因为脸部可能会上下颠倒。除了识别嘴巴并测量其曲线外,模型现在还必须计算出整个面部的方向并比较两者。

一般来说,对您的数据应用随机变换可能会使其更难分类。这可能是一件好事,因为它使您的模型对输入的变化更加健壮,但这也意味着当您在非增强数据上测试您的模型时,它会变得更容易。

此解释可能不适用于您的模型和数据,但您可以通过两种方式对其进行测试:

  1. 如果您减小正在使用的增强转换的范围,您应该会看到训练损失和验证损失更接近。
  2. 如果您对验证数据应用与训练数据完全相同的增强转换,那么您应该会看到验证准确度低于预期的训练准确度。

【讨论】:

    猜你喜欢
    • 2020-11-02
    • 2021-07-22
    • 2020-03-29
    • 2017-12-21
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    • 2017-10-14
    • 1970-01-01
    相关资源
    最近更新 更多