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

CINIC-10图像分类任务准确率卡10%问题求助

问题排查与解决方案

你的模型准确率始终卡在随机猜测水平(10%左右),核心原因是模型未有效学习到数据特征,结合你的代码和场景,以下是具体排查方向和解决方法:


1. 最直接的问题:训练轮次严重不足

CINIC-10是彩色图像分类任务,复杂度远高于MNIST手写数字集,仅训练3个epochs完全不足以让模型捕捉到图像特征。

  • 调整训练轮次至20-30次,同时添加早停机制防止过拟合:
from tensorflow.keras.callbacks import EarlyStopping

early_stop = EarlyStopping(monitor='val_loss', patience=3, restore_best_weights=True)

history = model.fit( 
    train_ds, 
    validation_data=validation_ds, 
    epochs=20,
    callbacks=[early_stop]
)

2. 验证数据集加载的正确性

虽然你能正确获取类别名称,但仍需确认图片与标签是否匹配、类别样本分布是否平衡:

(1)检查类别样本数量

import os
from collections import Counter

class_counts = Counter()
for class_name in class_names:
    class_dir = os.path.join(cinic_directory_train, class_name)
    class_counts[class_name] = len(os.listdir(class_dir))

print(class_counts)

如果某类别样本占比远超其他类别,会导致模型偏向该类,但你的准确率接近10%,更可能是模型未学习,而非样本不平衡。

(2)可视化样本验证标签匹配

import matplotlib.pyplot as plt

plt.figure(figsize=(10, 10))
for images, labels in train_ds.take(1):
    for i in range(9):
        ax = plt.subplot(3, 3, i + 1)
        plt.imshow(images[i].numpy().astype("uint8"))
        plt.title(class_names[labels[i]])
        plt.axis("off")
plt.show()

若图片与标签不对应,需重新整理数据集目录结构。


3. 自定义模型优化

当前模型结构过浅,对CINIC-10的特征提取能力不足,可调整模型复杂度:

model = keras.Sequential([
    keras.layers.experimental.preprocessing.Rescaling(1./255),
    keras.layers.Conv2D(32, 3, padding='same', activation='relu'),
    keras.layers.MaxPooling2D(),
    keras.layers.Conv2D(64, 3, padding='same', activation='relu'),
    keras.layers.MaxPooling2D(),
    keras.layers.Conv2D(128, 3, padding='same', activation='relu'),
    keras.layers.MaxPooling2D(),
    keras.layers.Conv2D(128, 3, padding='same', activation='relu'),
    keras.layers.MaxPooling2D(),
    keras.layers.Dropout(0.3),
    keras.layers.Flatten(),
    keras.layers.Dense(256, activation='relu'),
    keras.layers.Dense(10)
])

4. 预训练模型的正确使用

你使用预训练模型时未匹配对应的数据预处理逻辑,导致模型失效:

(1)匹配预训练模型的预处理规则

以VGG16为例,需使用官方提供的预处理函数,而非简单归一化:

base_model = tf.keras.applications.VGG16(
    input_shape=(32, 32, 3),
    include_top=False,
    weights='imagenet'
)
base_model.trainable = False  # 先冻结预训练层

model = keras.Sequential([
    keras.layers.Lambda(tf.keras.applications.vgg16.preprocess_input),  # 适配VGG16预处理
    base_model,
    keras.layers.GlobalAveragePooling2D(),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.Dense(10)
])

model.compile(
    optimizer='adam',
    loss='sparse_categorical_crossentropy',
    metrics=['accuracy']
)

(2)调整输入尺寸适配预训练模型

ResNet50、VGG16等预训练模型默认输入尺寸为(224,224,3),你的32x32输入会大幅降低特征提取能力,可修改数据集加载的image_size为(224,224),或添加Resize层:

train_ds = train_ds.map(lambda x, y: (tf.image.resize(x, (224, 224)), y))
validation_ds = validation_ds.map(lambda x, y: (tf.image.resize(x, (224, 224)), y))

(3)解冻预训练层微调

初始训练后,可解冻部分预训练层,用小学习率微调提升准确率:

base_model.trainable = True
# 仅解冻最后3层
for layer in base_model.layers[:-3]:
    layer.trainable = False

model.compile(
    optimizer=tf.keras.optimizers.Adam(learning_rate=1e-5),  # 使用极小学习率
    loss='sparse_categorical_crossentropy',
    metrics=['accuracy']
)

history_fine = model.fit(
    train_ds,
    validation_data=validation_ds,
    epochs=10,
    initial_epoch=history.epoch[-1],
    callbacks=[early_stop]
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 22:10:48