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

TensorFlow图像分类验证精度停滞问题求助

3类图像分类验证精度停滞在随机水平的排查思路与解决方案

从训练日志和代码来看,训练精度能快速上升到90%以上,但验证精度始终维持在33%-35%(接近3类任务的随机猜测水平),且调整模型结构、正则化、数据增强都无效,核心问题大概率出在数据处理环节,以下是具体排查步骤:

一、优先排查数据处理环节

1. 验证集标签与图像匹配正确性

  • 检查val_df中的image_id与val_image_dir下的图片文件名是否完全一致,注意大小写、文件后缀(代码中固定用.png,需确认实际验证集图片是否都是该后缀)。
  • 随机抽取10-20张验证集图片,手动对比图片内容与CSV中的label值,确认标签无标注错误(比如是否所有验证集标签被误设为同一值,或CSV列名匹配错误)。
  • 统计验证集标签分布:执行print(val_df['label'].value_counts()),若三类样本占比严重失衡(比如某类占比90%以上),或分布与训练集完全不符,会导致模型泛化失效。

2. 验证集数据加载完整性

  • 执行print(len(X_val), len(val_df)),确认加载的验证集图片数量与CSV中的样本数一致。若差距较大,说明大量图片未找到(路径错误、文件名不匹配),导致标签与图片错位。
  • 检查load_and_preprocess_image函数的逻辑:load_img默认加载为RGB格式,若验证集图片是灰度图,需显式指定color_mode='rgb'确保输出为3通道数组,避免与模型输入维度不匹配。

3. 训练/验证集分布一致性

  • 随机抽取训练集与验证集的图片进行视觉对比,确认两者的场景、风格、内容是否属于同一分布。若训练集是A场景数据,验证集是完全无关的B场景数据,模型无法泛化。
  • 对比训练集与验证集的标签分布:执行print(train_df['label'].value_counts()),若两者分布差异极大(比如训练集90%为类0,验证集90%为类1),也会导致验证精度停滞。

4. 数据预处理维度匹配

  • 调整后的模型输入尺寸为(80,80,3),但数据加载代码中load_and_preprocess_image的target_size仍为(224,224),这会导致输入数据维度与模型要求不匹配,是明显错误。需将数据加载的target_size修改为(80,80),或把模型输入改回(224,224)。

二、模型与训练环节排查

1. 优化器配置修正

  • 调整后的模型中定义了optimizer = tf.keras.optimizers.Adam(learning_rate=0.0001),但model.compile仍使用optimizer='adam',导致自定义学习率未生效(默认学习率为0.001)。需修改为optimizer=optimizer。

2. 标签类型检查

  • 确认y_train和y_val为整数类型(int32/int64),因为你使用的SparseCategoricalCrossentropy要求标签是整数索引。执行print(y_train.dtype, y_val.dtype)验证,若为字符串类型需转换为整数。

3. 用预训练模型快速验证

  • 使用预训练模型(如ResNet50)测试,若预训练模型验证精度仍卡在33%,则可确定是数据问题;若精度能提升,则说明之前的自定义模型能力不足:
base_model = tf.keras.applications.ResNet50(weights='imagenet', include_top=False, input_shape=(224,224,3))
base_model.trainable = False
model = tf.keras.Sequential([
    base_model,
    tf.keras.layers.GlobalAveragePooling2D(),
    tf.keras.layers.Dense(3)
])
model.compile(
    optimizer=tf.keras.optimizers.Adam(learning_rate=0.0001),
    loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
    metrics=['accuracy']
)

4. 训练回调优化

  • 加入早停回调,避免模型过度拟合训练集,同时保留最优权重:
from tensorflow.keras.callbacks import EarlyStopping
early_stop = EarlyStopping(monitor='val_loss', patience=5, restore_best_weights=True)
history = model.fit(
    train_dataset,
    validation_data=val_dataset,
    epochs=epochs,
    callbacks=[early_stop]
)

三、快速验证流程

  1. 先确认验证集加载数量与CSV样本数一致,排除路径/文件名错误。
  2. 手动检查至少5张验证集图片的标签匹配情况,确认标签无错误。
  3. 修正模型输入尺寸与数据预处理的尺寸匹配问题。
  4. 用训练好的模型预测几张训练集图片,确认模型能正确分类训练数据,再预测验证集图片,观察预测结果是否随机。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 05:18:10