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

如何提升基于图像的革兰氏阴阳性细菌分类器准确率?

细菌染色图像分类模型优化求助

我是机器学习新手,正在开发基于染色特性的细菌分类模型,当前模型准确率仅为0.52。数据集包含223张图像,分为Gram Negative(革兰氏阴性)和Gram Positive(革兰氏阳性)两类。已尝试调整epoch数量和更换模型,但准确率提升效果不明显,实现代码如下:

dir = os.getcwd()
dataset_dir = os.path.join(dir,'Dataset')
Grampos_dir = os.path.join(dataset_dir,'GRAMPOS')
Gramneg_dir = os.path.join(dataset_dir,'GRAMNEG')

train_data_gen = keras.preprocessing.image.ImageDataGenerator(rescale=1./255,
        shear_range=0.2,
        horizontal_flip=True,
        validation_split=0.1,
        channel_shift_range=10.0,
        rotation_range=0.4
                                                              )
train_set = train_data_gen.flow_from_directory(
        dataset_dir,
        target_size=(256,256)
        ,color_mode='rgb',
        classes=(['GRAMNEG','GRAMPOS']),
        class_mode='categorical',
        batch_size= 1,
        subset='training'
        ,seed = 123
)
val_set = train_data_gen.flow_from_directory(
        dataset_dir,
        target_size=(256,256)
        ,color_mode='rgb',
        classes=(['GRAMNEG','GRAMPOS']),
        class_mode='categorical',
        batch_size=1,
        subset='validation'
        ,seed = 123,save_to_dir='/home/yusuf/Desktop/MİKROPROJECT/deneme'
)

model_check = ModelCheckpoint(filepath=os.path.join(dir,'ResNet50V2.hdf5'),save_best_only=True)
early_stop = EarlyStopping(monitor='val_loss', mode='min', verbose=1, patience=10)
basemodel = ResNet50V2(weights='imagenet',input_shape=(256,256,3),include_top=False)

model = Sequential()
model.add(basemodel)
model.add(GlobalAveragePooling2D())
model.add(Flatten())
model.add(Dropout(0.5))
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(2, activation='softmax'))
model.compile(optimizer='rmsprop',loss = keras.losses.categorical_crossentropy,metrics=['acc'])

history = model.fit(train_set,epochs=50,validation_data=val_set,callbacks=[model_check,early_stop])
可行的优化建议

数据集层面

  • 检查类别平衡:先统计两类图像的数量,如果某类占比过高(比如超过70%),模型会偏向多数类,导致准确率虚高但泛化能力差。解决方法:对少数类进行过采样、对多数类进行欠采样,或者在训练时设置class_weight参数给少数类更高权重。
  • 强化数据增强:当前rotation_range=0.4几乎没有旋转效果,建议调到15-30度;同时添加垂直翻转、随机缩放(zoom_range=0.2)、亮度调整(brightness_range=[0.8,1.2])等增强方式。注意验证集不要应用数据增强,单独创建不带增强的ImageDataGenerator(只保留rescale=1./255)用于验证。
  • 优化图像预处理:细菌染色图像的核心特征在染色区域,可尝试转为灰度图(设置color_mode='grayscale'),减少RGB通道的冗余信息;也可以添加直方图均衡化,增强染色区域与背景的对比度。
  • 扩充数据集:223张图像对于ResNet这类大模型来说太少,容易过拟合。尽可能收集更多同类型的细菌染色图像,或者利用现有图像生成更多合理的增强样本。

模型与训练策略

  • 冻结预训练模型底层权重:当前直接训练ResNet50V2的全部权重,小数据集下容易被噪声干扰。先设置basemodel.trainable = False,只训练顶层的全连接层;等模型收敛后,再解冻最后10-20层,用更小的学习率(比如1e-5)进行微调。
  • 简化顶层网络结构:GlobalAveragePooling2D已经输出一维特征,不需要再添加Flatten(),这一步是冗余的,直接删除。小数据集下避免过多全连接层,可简化为:GlobalAveragePooling2D() -> Dropout(0.3) -> Dense(2, activation='softmax'),降低过拟合风险。
  • 调整优化器与学习率:RMSProp在小数据集上的稳定性不如Adam,建议换成optimizer=keras.optimizers.Adam(learning_rate=1e-4);同时添加ReduceLROnPlateau回调,当验证集损失连续几轮不下降时自动降低学习率,帮助模型收敛。
  • 增大batch size:当前batch_size=1会导致训练梯度波动大,模型不稳定。根据显存情况调整到8或16,如果显存不足,可减小target_size到128x128。
  • 适配二分类任务的损失函数:把损失函数换成binary_crossentropy,最后一层激活改为sigmoid,同时将class_mode设为binary,这样更贴合二分类场景,计算更高效。

训练监控与分析

  • 绘制训练曲线:训练完成后,画出训练集和验证集的准确率、损失曲线,判断是过拟合还是欠拟合。如果训练准确率高但验证准确率低,说明过拟合,需增加dropout比例、简化模型;如果两者都低,说明欠拟合,需增大模型容量、调大学习率或增加训练轮数。
  • 分析错误样本:把验证集中分类错误的图像提取出来,观察错误原因(比如图像模糊、染色不规范、标注错误),针对性优化数据集或预处理策略。

内容的提问来源于stack exchange,提问作者Yusuf Tarık

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 21:40:54