使用ConvNet生成混淆矩阵时持续触发ValueError错误求助
解决CNN混淆矩阵生成时的样本数不一致错误
我看到你在生成卷积神经网络的混淆矩阵时遇到了样本数量不匹配的错误,下面帮你分析问题根源并给出具体的解决方案:
问题代码片段
from keras.preprocessing.image import ImageDataGenerator from keras.models import Sequential from keras.layers import Conv2D, MaxPooling2D from keras.layers import Activation, Dropout, Flatten, Dense from keras import backend as K import numpy as np from keras.preprocessing import image from sklearn.metrics import classification_report, confusion_matrix img_width, img_height = 150, 150 train_data_dir = "train" validation_data_dir = "test" nb_train_samples = 2000 nb_validation_samples = 400 epochs = 50 batch_size = 40 #16 if K.image_data_format() == 'channels_first': input_shape = (3, img_width, img_height) else: input_shape = (img_width, img_height, 3) train_datagen = ImageDataGenerator( rescale = 1. / 255, shear_range = 0.2, zoom_range= 0.2, horizontal_flip= True) test_datagen = ImageDataGenerator(rescale=1. / 255) train_generator = test_datagen.flow_from_directory( train_data_dir, target_size= (img_width, img_height), batch_size= batch_size, class_mode= 'binary') validation_generator = test_datagen.flow_from_directory( validation_data_dir, target_size= (img_width, img_height), batch_size= batch_size, class_mode= 'binary') # Applying CNN Layers ... model.compile(loss= 'binary_crossentropy', optimizer= 'rmsprop', metrics= ['accuracy'] ) model.fit_generator( train_generator, steps_per_epoch= nb_train_samples // batch_size, epochs= epochs, validation_data= validation_generator, validation_steps= nb_validation_samples // batch_size) Y_pred = model.predict_generator(validation_generator, nb_validation_samples // batch_size+1) y_pred = np.argmax(Y_pred, axis=1) print('Confusion Matrix') print(confusion_matrix(validation_generator.classes, y_pred))
错误信息
ValueError: Found input variables with inconsistent numbers of samples: [400, 440]
问题分析
- 样本数量不匹配:你计算预测步数时加了
+1,也就是400//40 +1 =11,每个batch40个样本,最终预测了440个样本,但验证集实际只有400个样本,导致预测结果和真实标签的数量不一致。 - 二分类预测逻辑错误:你的模型是二分类任务(
class_mode='binary'),输出是单个概率值而非多分类的概率分布,用np.argmax()处理结果是完全错误的。 - 生成器状态未重置:
model.fit_generator已经遍历过验证生成器,生成器会记录上次的遍历位置,直接调用predict_generator会从断点继续生成,导致样本重复或缺失。
解决方案
修改预测部分的代码即可解决问题,具体代码如下:
# 重置验证生成器,回到数据集起始位置,避免之前的遍历影响结果 validation_generator.reset() # 计算正确的预测步数:刚好覆盖所有400个验证样本 Y_pred = model.predict_generator(validation_generator, nb_validation_samples // batch_size) # 二分类任务用阈值(通常取0.5)转换概率为类别标签,替换错误的np.argmax y_pred = (Y_pred > 0.5).astype(int) print('Confusion Matrix') print(confusion_matrix(validation_generator.classes, y_pred)) # 可选:打印更详细的分类报告 print('Classification Report') target_names = list(validation_generator.class_indices.keys()) print(classification_report(validation_generator.classes, y_pred, target_names=target_names))
关键修正点说明:
- 重置生成器:
validation_generator.reset()确保生成器从验证集第一个样本开始生成,保证获取完整的400个样本。 - 移除步数+1:
400//40=10,10个batch刚好覆盖全部验证样本,让预测结果和真实标签数量完全匹配。 - 替换np.argmax:二分类模型输出的是样本属于类别1的概率,用
(Y_pred > 0.5).astype(int)将概率转换为0/1的类别标签,符合二分类任务的逻辑。
这样修改后就能正常生成混淆矩阵和分类报告了。
内容的提问来源于stack exchange,提问作者Arush Jain
相关产品推荐
相关产品推荐

