我正在 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)
但是,在绘制训练准确度和验证准确度(以及训练损失和验证损失)后,我注意到验证准确度高于训练准确度(同样,验证损失低于训练损失)。这是训练后的结果图(请注意,验证在图中称为“测试”):
当我不应用数据增强时,训练精度高于验证精度。根据我的理解,训练精度通常应高于验证精度。任何人都可以给出见解,为什么在我应用数据增强的情况下情况并非如此?
最佳答案
以下只是一种理论,但您可以测试它!
验证准确性优于训练准确性的一个可能解释是,您应用于训练数据的数据增强使网络的任务变得更加困难。 (从您的代码示例中尚不完全清楚。但看起来您仅将增强应用于训练数据,而不是验证数据)。
要了解为什么会出现这种情况,想象一下您正在训练一个模型来识别图片中的某人是在微笑还是皱眉。大多数面部照片的面部都是“正确向上”的,因此模型可以通过识别嘴巴并测量它是否向上或向下弯曲来解决该任务。如果您现在通过应用随机旋转来增强数据,模型将不再只关注嘴部,因为脸部可能是上下颠倒的。除了识别嘴巴并测量其曲线之外,模型现在还必须计算出整个面部的方向并比较两者。
一般来说,对数据应用随机转换可能会导致分类变得更加困难。这可能是一件好事,因为它使您的模型对输入的变化更加稳健,但这也意味着当您在非增强数据上测试您的模型时,它会变得更容易。
此解释可能不适用于您的模型和数据,但您可以通过两种方式对其进行测试:
- 如果您减小所使用的增强变换的范围,您应该会看到训练损失和验证损失更加接近。
- 如果您对验证数据应用与训练数据完全相同的增强转换,那么您应该会看到验证准确率低于预期的训练准确率。
关于machine-learning - 为什么应用数据增强时验证准确率高于训练准确率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48845354/