为什么在应用数据增强时验证准确度高于训练准确度?

use*_*121 5 machine-learning deep-learning keras

我正在处理 Keras 中的图像分类问题。

我正在训练model.fit_generator用于数据增强的模型。在每个时期训练的同时,我也在评估验证数据。

训练在 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)
Run Code Online (Sandbox Code Playgroud)

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

在此处输入图片说明 在此处输入图片说明

当我不应用数据增强时,训练准确度高于验证准确度。根据我的理解,训练准确度通常应该大于验证准确度。任何人都可以提供见解,为什么在我应用数据增强的情况下情况并非如此?

myr*_*cat 11

以下只是一种理论,但它是您可以测试的!

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

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

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

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

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