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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 00:55:22