Keras CNN模型val_accuracy无变化问题排查
二分类模型验证准确率固定0.5070的问题排查
尝试使用Keras构建二分类模型,数据集共2400张图片,两类各1200张。为解决过拟合问题做了数据增强,但增强后验证准确率(val_accuracy)始终维持在0.5070不变。以下是模型代码及训练结果:
datagen = ImageDataGenerator( rotation_range=40, width_shift_range=0.2, height_shift_range=0.2, rescale=1./255, shear_range=0.2, zoom_range=0.2, horizontal_flip=True, fill_mode='nearest') dataset_tr = datagen.flow_from_directory( dataset_dir + "/test", target_size=(160, 160), batch_size=32, class_mode='binary') dataset_vl = datagen.flow_from_directory( dataset_dir + "/val", target_size=(160, 160), batch_size=32, class_mode='binary') def model1(kernelsize = 3): model = Sequential() model.add(Rescaling(1./225, input_shape=(160,160,3))) model.add(Conv2D(32, kernelsize, padding='same', activation='relu')) model.add(MaxPooling2D(pool_size=(2,2))) model.add(BatchNormalization()) model.add(Conv2D(32, kernelsize, padding='same', activation='relu')) model.add(MaxPooling2D(pool_size=(2,2))) model.add(BatchNormalization()) model.add(Conv2D(64, kernelsize, padding='same', activation='relu')) model.add(MaxPooling2D(pool_size=(2,2))) model.add(BatchNormalization()) model.add(Flatten()) model.add(Dense(64, activation='relu')) model.add(Dropout(0.2)) model.add(Dense(1, activation='sigmoid')) model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['accuracy']) model.summary() return model model1 = model1() history1 = model1.fit(dataset_tr, validation_data=dataset_vl, epochs=15)
训练结果摘要:
Total params: 1,667,681 Trainable params: 1,667,425 Non-trainable params: 256 _________________________________________________________________ Epoch 1/15 61/61 [==============================] - 399s 5s/step - loss: 3.1287 - accuracy: 0.6725 - val_loss: 0.7496 - val_accuracy: 0.5070 Epoch 2/15 61/61 [==============================] - 291s 5s/step - loss: 0.7012 - accuracy: 0.6843 - val_loss: 0.7872 - val_accuracy: 0.5070 ...(后续epoch验证准确率均为0.5070)
核心问题排查及修复方案
1. 训练集路径错误
你将训练集指向了dataset_dir + "/test",这明显是笔误,应该改为"/train"目录。如果训练集加载的是测试集数据,会导致模型学习的特征与验证集不匹配,最终出现验证准确率停滞的情况。
2. 重复且错误的归一化操作
ImageDataGenerator中已经设置了rescale=1./255,完成了图片归一化;- 模型内部又添加了
Rescaling(1./225),不仅重复缩放,还写错了数值(应为255)。双重错误的缩放会导致输入数据数值范围混乱,模型无法正常学习有效特征。
修复:移除模型中的Rescaling层,保留ImageDataGenerator的rescale参数即可。
3. 验证集不应使用数据增强
验证集的作用是评估模型在真实未增强数据上的泛化能力,你给验证集也用了带旋转、翻转等增强的datagen,会干扰验证结果的真实性,甚至导致模型无法正确评估。
修复:为验证集单独创建仅做归一化的生成器:
val_datagen = ImageDataGenerator(rescale=1./255) dataset_vl = val_datagen.flow_from_directory( dataset_dir + "/val", target_size=(160, 160), batch_size=32, class_mode='binary')
4. 检查验证集数据分布
确认/val目录下两类图片的数量是否均衡,是否存在加载错误(比如某类图片数量为0)。如果验证集实际类别分布异常,模型的准确率会固定在偏离随机猜测的异常值附近(比如0.5070)。
内容的提问来源于stack exchange,提问作者Lemon_prog
相关产品推荐
相关产品推荐

