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

卷积神经网络始终预测同一类别问题排查与进展

基于Keras的图像分类器开发:从四分类困境到二分类突破

最近我在基于Keras开发一款卷积神经网络(CNN)图像分类器,过程中踩了不少坑,这里分享下我的项目细节、遇到的问题以及当前的解决进展:

项目基础信息

  • 数据集:包含尺寸为360×480的.jpg格式图像,标签分为0、1、2、3四类
  • 数据准备:训练集与验证集已做平衡处理,按目录结构组织,方便使用Keras数据生成器加载

初始模型与训练代码

我最初定义的CNN模型及训练流程代码如下:

# 模型定义
model = Sequential()
model.add(Conv2D(128, kernel_size=3, activation='relu', input_shape=input_shape, padding="valid"))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(64, kernel_size=3, activation='relu', padding="valid"))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(32, kernel_size=3, activation='relu', padding="valid"))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Flatten())
model.add(Dense(512, activation="relu"))
model.add(Dense(4, activation="softmax"))

# 编译模型
opt = SGD(lr=learning_rate)
model.compile(loss="categorical_crossentropy", optimizer=opt, metrics=["accuracy"])

# 数据生成器
train_datagen = ImageDataGenerator(
    width_shift_range=0.05,
    height_shift_range=0.05,
    rescale=1./255,
    horizontal_flip=True)
validate_datagen = ImageDataGenerator(rescale=1./255)

# 生成数据加载器
train_generator = train_datagen.flow_from_directory(
    path_data + '/train',
    shuffle = True,
    target_size=input_generator,
    batch_size=batch_size)
validation_generator = train_datagen.flow_from_directory(
    path_data + '/validate',
    shuffle = True,
    target_size=input_generator,
    batch_size=batch_size)

# 训练模型
steps_per_epoch = np.ceil(train_size/batch_size)
validation_steps = np.ceil(validation_size/batch_size)
H = model.fit_generator(
    train_generator,
    steps_per_epoch=steps_per_epoch,
    epochs=epochs,
    validation_data=validation_generator,
    validation_steps=validation_steps)

遇到的核心问题

训练过程中出现了非常棘手的情况:训练准确率始终维持在0.25左右(刚好是4类随机猜测的准确率),而且测试集的混淆矩阵显示模型始终预测同一类别,完全没有学习到任何特征。

排查尝试(均未解决)

为了定位问题,我做了一系列尝试:

  • 改用VGG架构替换自定义CNN
  • 调整图像输入尺寸与学习率参数
  • 缩小数据集规模,简化任务复杂度
  • 使用纯色图像数据集测试,排除数据本身的特征问题

但以上所有尝试都没能让模型正常学习,问题依旧存在。

当前解决方案与后续计划

无奈之下,我暂时将任务转为二分类:合并0、1标签为一类,2、3标签为一类,对应管道污垢的两个等级。同时改用无预训练权重的ResNet50架构,并将图像裁剪为224×224的标准尺寸。目前模型已经开始正常学习,准确率逐步提升。

后续我会继续优化这个二分类模型,待效果稳定后,再尝试回归原本的四分类任务,探索更适合的模型结构与训练策略。

内容的提问来源于stack exchange,提问作者Jaume Brossa Ordóñez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:11:04