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

时间:2018-02-17 19:58:28

标签: 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)

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

enter image description here enter image description here

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

1 个答案:

答案 0 :(得分:3)

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

为什么验证准确性优于训练准确性的一个可能原因是,您应用于训练数据的数据增加使得任务对网络来说变得更加困难。 (您的代码示例并不完全清楚。但看起来您只是将扩充应用于您的训练数据,而不是验证数据。)

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

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

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

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