You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TensorFlow数据增强致模型性能下降的原因及评估疑问

问题描述

使用VGG16开展图像分类任务,数据集为平衡数据集(每类150张图像),已划分为训练集、验证集和测试集。测试数据增强的影响时,无论调整epochs、patience等参数,添加数据增强后模型在测试集上的性能均下降。实现代码如下:

tf_train=tf.data.Dataset.from_tensor_slices((np.array(images_np_train), y_train)).batch(10)
tf_test=tf.data.Dataset.from_tensor_slices((np.array(images_np_test), y_test)).batch(10)
tf_val=tf.data.Dataset.from_tensor_slices((np.array(images_np_val), y_val)).batch(10)

def create_model_fct2() :

    IMG_SIZE = 224
    resize_and_rescale = Sequential([
        Resizing(IMG_SIZE, IMG_SIZE,input_shape=(224, 224, 3)),
      
    ])
    # Data augmentation
    data_augmentation = Sequential([
    #    RandomFlip("horizontal_and_vertical", input_shape=(224, 224, 3)),
        RandomRotation(0.2, input_shape=(224, 224, 3)),
        RandomZoom(0.1),
        Rescaling(1./255)

    ])

    model_base = VGG16(include_top=False, weights="imagenet", input_shape=(224, 224, 3))
    for layer in model_base.layers:
        layer.trainable = False



    # Définition du nouveau modèle
    model = Sequential([
        resize_and_rescale,
        data_augmentation,
        model_base,
        GlobalAveragePooling2D(),
        Dense(256, activation='relu'),
        Dropout(0.5),
        Dense(7, activation='softmax')
    ])

    # compilation du modèle
    model.build()
    model.compile(loss="categorical_crossentropy", optimizer='adam', metrics=["accuracy"])

    print(model.summary())

    return model


model4 = create_model_fct2()


model4_save_path = "./model4_best_weights.keras"
checkpoint = ModelCheckpoint(model4_save_path, monitor='val_accuracy', verbose=1, save_best_only=True, mode='max')
es = EarlyStopping(monitor='val_accuracy', mode='max', verbose=1, patience=15)
callbacks_list = [checkpoint, es]

history4 = model4.fit(tf_train,
                      validation_data=tf_val,
                      batch_size=10, epochs=100, callbacks=callbacks_list, verbose=1)

loss, accuracy = model4.evaluate(tf_test, verbose=False)
print("Test Accuracy       :  {:.4f}".format(accuracy))

疑问:

  1. 无法解释添加数据增强后测试集性能下降的原因;
  2. 使用model4.evaluate(tf_test, verbose=False)评估时,是否会排除数据增强层?数据增强是否应仅作用于训练阶段,而非测试/验证阶段?

解答

关于第二个疑问:数据增强在评估阶段的行为

  • TensorFlow中的RandomFlip、RandomRotation、RandomZoom这类随机数据增强层,会自动区分训练/评估模式:调用model.fit(训练模式)时会生效,调用model.evaluate或model.predict(评估/预测模式)时,这些随机操作会被自动关闭,仅保留确定性的预处理(比如你的Rescaling(1./255))。
  • 数据增强确实应该仅作用于训练阶段,你的代码在这一点上的行为是符合预期的,评估时不会应用随机增强操作,不需要额外手动排除。

关于第一个疑问:性能下降的可能原因

  • 数据集规模过小:每类仅150张图像,整体数据集容量有限。数据增强的本质是正则化,在小数据集上过度的正则化会导致模型难以学习到稳定的核心特征,反而引入过多噪声,最终泛化能力下降。
  • 预训练模型冻结过死:你将VGG16的所有层都冻结,仅训练顶层的全连接层。数据增强会改变训练样本的分布,而固定的ImageNet预训练特征可能无法适配这些变换后的样本,顶层小网络的拟合能力不足以弥补这种分布差异。建议尝试解冻VGG16的最后3-4层,让预训练特征能微调适配你的任务数据。
  • 数据增强强度过高:当前设置的RandomRotation(0.2)(±36度)、RandomZoom(0.1)(±10%)可能超出了任务中图像的特征容忍范围,过度变换破坏了图像中的关键分类特征,导致模型学习到无效信息。可以先降低增强强度(比如Rotation调到0.1,Zoom调到0.05),或仅保留RandomFlip这类温和的增强方式,逐步验证效果。
  • 双重正则化过强:数据增强本身是正则化手段,再加上顶层的Dropout(0.5),在小数据集下可能导致模型欠拟合,无法充分学习到数据特征。可以尝试降低Dropout比例(比如0.3),或暂时移除Dropout再测试。
  • 训练参数适配问题:Adam默认学习率0.001对于冻结预训练模型的场景可能过高,导致模型在训练中震荡,无法收敛到最优状态。建议调低学习率至0.0001,同时可以适当调整EarlyStopping的patience值(比如调到20),给模型更多的训练收敛时间。
  • 预处理冗余问题:你的resize_and_rescale层中已经设置了Resizing(224,224),但输入图像已经是224x224尺寸,这一步属于冗余操作;另外要确认原始图像的像素值范围,如果已经做过归一化,那么数据增强层中的Rescaling(1./255)会导致数据分布异常,影响模型性能。

内容的提问来源于stack exchange,提问作者Leo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 00:00:58