使用ImageDataGenerator时皮肤病分类CNN模型准确率骤降
皮肤病分类任务:数据增强后准确率下降的问题修复
核心问题分析
你的问题主要由三个关键因素导致:
- 重复归一化:预处理阶段已将图像归一化到
[0,1],但ImageDataGenerator又添加了rescale=1./255,导致数据被二次缩放至[0, 1/255²],数值范围过小,模型难以学习有效特征。 - 过度数据增强:200张图像属于极小数据集,当前设置的增强参数(旋转30度、剪切0.3、缩放0.3、位移0.4)强度过高,会破坏皮肤病病灶的关键形态特征,生成的增强样本与原数据差异过大,模型无法捕捉到分类所需的核心信息。
- 训练策略不匹配:学习率
1e-5过低,结合增强后的数据量,模型收敛速度过慢;同时验证集与训练集的预处理逻辑不一致,进一步加剧了性能下降。
具体修复步骤
1. 移除重复归一化操作
删除ImageDataGenerator中的rescale=1./255参数,因为X_train已经在预处理阶段完成了归一化:
datagen = ImageDataGenerator( rotation_range=15, shear_range=0.1, zoom_range=0.1, width_shift_range=0.15, height_shift_range=0.15, horizontal_flip=True, fill_mode='nearest' )
2. 降低数据增强强度
针对极小数据集,调整增强参数至温和范围,避免破坏原图像的关键特征:
- 旋转范围从30度降至15度
- 剪切、缩放范围从0.3降至0.1
- 位移范围从0.4降至0.15
3. 优化训练参数
- 提高学习率至
1e-4,加快模型在增强数据上的收敛速度 - 减小batch_size至8或16,让模型在小数据集下能接触到更多样的样本组合
- 确保训练与验证数据的预处理逻辑一致(验证集已完成归一化,无需额外处理)
修改后的训练代码:
from tensorflow.keras.optimizers import Adam # 调整学习率 optimizer = Adam(learning_rate=0.0001, name='Adam') model.compile(optimizer=optimizer, loss='categorical_crossentropy', metrics=['accuracy']) # 调整batch_size并添加回调 history5 = model.fit( datagen.flow(X_train, y_train, batch_size=8), epochs=epochs, validation_data=(X_val, y_val), callbacks=[es_callback, checkpoint] )
4. 引入迁移学习(推荐)
针对200张的极小数据集,从头训练CNN的效果有限,建议使用预训练模型做迁移学习,利用已学到的通用图像特征提升分类性能:
from tensorflow.keras.applications import MobileNetV2 from tensorflow.keras.layers import Dense, GlobalAveragePooling2D from tensorflow.keras.models import Model # 加载预训练模型,不包含顶层分类层 base_model = MobileNetV2(input_shape=(height, width, 3), include_top=False, weights='imagenet') # 冻结预训练层,避免破坏已学特征 base_model.trainable = False # 添加自定义分类层 x = base_model.output x = GlobalAveragePooling2D()(x) x = Dense(128, activation='relu')(x) predictions = Dense(4, activation='softmax')(x) model = Model(inputs=base_model.input, outputs=predictions)
预期效果
修复重复归一化和过度增强问题后,验证准确率应能回升至接近未增强时的水平;结合迁移学习,准确率有望进一步提升至60%以上。
内容的提问来源于stack exchange,提问作者Rezuana Haque
相关产品推荐
相关产品推荐

