Sci-kit Learn Confusion Matrix:发现样本数量不一致的输入变量
Posted
技术标签:
【中文标题】Sci-kit Learn Confusion Matrix:发现样本数量不一致的输入变量【英文标题】:Sci-kit Learn Confusion Matrix: Found input variables with inconsistent numbers of samples 【发布时间】:2019-05-06 07:28:49 【问题描述】:我正在尝试在预测的测试标签和实际标签之间绘制混淆矩阵,但我收到了这个错误
ValueError: 发现样本数量不一致的输入变量:[1263, 12630]
数据集:GTSRB
使用的代码
图像增强
train_datagen = ImageDataGenerator(rescale=1./255,
rotation_range=20,
horizontal_flip=True,
width_shift_range=0.1,
height_shift_range=0.1,
shear_range=0.01,
zoom_range=[0.9, 1.25],
brightness_range=[0.5, 1.5])
test_datagen = ImageDataGenerator(rescale=1./255)
train_generator 和 test_generator
batch_size = 10
train_generator = train_datagen.flow_from_directory(
directory=train_path,
target_size=(224, 224),
color_mode="rgb",
batch_size=batch_size,
class_mode="categorical",
shuffle=True,
seed=42
)
test_generator = test_datagen.flow_from_directory(
directory=test_path,
target_size=(224, 224),
color_mode="rgb",
batch_size=batch_size,
class_mode="categorical",
shuffle=False,
seed=42
)
该代码的输出
找到属于 43 个类别的 39209 张图片。
找到属于 43 个类别的 12630 张图片。
然后,我使用了 VGG-16 模型并将最新的 Dense 层替换为 Dense(43, activation='softmax')
模型摘要
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
block1_conv1 (Conv2D) (None, 224, 224, 64) 1792
_________________________________________________________________
block1_conv2 (Conv2D) (None, 224, 224, 64) 36928
_________________________________________________________________
block1_pool (MaxPooling2D) (None, 112, 112, 64) 0
_________________________________________________________________
block2_conv1 (Conv2D) (None, 112, 112, 128) 73856
_________________________________________________________________
block2_conv2 (Conv2D) (None, 112, 112, 128) 147584
_________________________________________________________________
block2_pool (MaxPooling2D) (None, 56, 56, 128) 0
_________________________________________________________________
block3_conv1 (Conv2D) (None, 56, 56, 256) 295168
_________________________________________________________________
block3_conv2 (Conv2D) (None, 56, 56, 256) 590080
_________________________________________________________________
block3_conv3 (Conv2D) (None, 56, 56, 256) 590080
_________________________________________________________________
block3_pool (MaxPooling2D) (None, 28, 28, 256) 0
_________________________________________________________________
block4_conv1 (Conv2D) (None, 28, 28, 512) 1180160
_________________________________________________________________
block4_conv2 (Conv2D) (None, 28, 28, 512) 2359808
_________________________________________________________________
block4_conv3 (Conv2D) (None, 28, 28, 512) 2359808
_________________________________________________________________
block4_pool (MaxPooling2D) (None, 14, 14, 512) 0
_________________________________________________________________
block5_conv1 (Conv2D) (None, 14, 14, 512) 2359808
_________________________________________________________________
block5_conv2 (Conv2D) (None, 14, 14, 512) 2359808
_________________________________________________________________
block5_conv3 (Conv2D) (None, 14, 14, 512) 2359808
_________________________________________________________________
block5_pool (MaxPooling2D) (None, 7, 7, 512) 0
_________________________________________________________________
flatten (Flatten) (None, 25088) 0
_________________________________________________________________
fc1 (Dense) (None, 4096) 102764544
_________________________________________________________________
fc2 (Dense) (None, 4096) 16781312
_________________________________________________________________
predictions (Dense) (None, 1000) 4097000
_________________________________________________________________
dense_1 (Dense) (None, 43) 43043
=================================================================
Total params: 138,400,587
Trainable params: 43,043
Non-trainable params: 138,357,544
_________________________________________________________________
编译模型
my_sgd = SGD(lr=0.01)
model.compile(
optimizer=my_sgd,
loss='categorical_crossentropy',
metrics=['accuracy']
)
训练模型
STEP_SIZE_TRAIN=train_generator.n//train_generator.batch_size
epochs=10
model.fit_generator(generator=train_generator,
steps_per_epoch=STEP_SIZE_TRAIN,
epochs=epochs,
verbose=1
)
预测
STEP_SIZE_TEST=test_generator.n//test_generator.batch_size
test_generator.reset()
predictions = model.predict_generator(test_generator, steps=STEP_SIZE_TEST, verbose=1)
输出
1263/1263 [==============================] - 229s 181ms/步
预测形状 打印(预测.形状)
(12630, 43)
获取 test_data 和 test_labels
test_data = []
test_labels = []
batch_index = 0
while batch_index <= test_generator.batch_index:
data = next(test_generator)
test_data.append(data[0])
test_labels.append(data[1])
batch_index = batch_index + 1
test_data_array = np.asarray(test_data)
test_labels_array = np.asarray(test_labels)
test_data_array 和 test_labels_array 的形状
test_data_array.shape
(1263, 10, 224, 224, 3)
test_labels_array.shape
(1263, 10, 43)
混淆矩阵
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(test_labels_array, predictions)
我得到了输出
ValueError: 发现样本数量不一致的输入变量:[1263, 12630]
我知道这个错误是因为 test_labels_array 的大小不等于预测;分别是1263和12630,但我真的不知道我做错了什么。
任何帮助将不胜感激。
PS:如果有人对如何提高训练准确性有任何建议,那就太好了。
谢谢!
【问题讨论】:
【参考方案1】:您应该如下重塑test_data_array
和test_labels_array
:
data_count, batch_count, w, h, c = test_data_array.shape
test_data_array=np.reshape(test_data_array, (data_count*batch_count, w, h, c))
test_labels_array = np.reshape(test_labels_array , (data_count*batch_count, -1))
您附加test_generator
结果的方式是原因。事实上,第一次调用test_generator
将生成 10 个形状为 (224, 224, 3) 的数据。对于下一次调用,您的 test_generator
将生成 10 个形状为 (224, 224, 3) 的数据。因此,现在您应该有 20 个形状数据(224、224、3),而附加结果的方式会导致您想出 2 个形状数据(10、224、224、3)。这不是您所期望的。
【讨论】:
感谢您的快速回复。我试过你的答案,现在我收到这个错误“ValueError:分类指标无法处理多标签指标和连续多输出目标的混合” 可能是因为您的预测输出是浮点数,您可能应该对每个条目进行四舍五入,然后使用您的度量函数。 我试过pred = predictions.round()
,但我得到了同样的错误。我还尝试在 flow_from_directory 函数中使用“稀疏”而不是“分类”的类模式,但这也不起作用。
更新:使用 argmax 工作正常 cm = confusion_matrix(test_labels_array.argmax(axis=1), pred.argmax(axis=1))
谢谢你的帮助!
是的,你是对的。抱歉我的舍入错误:(。以上是关于Sci-kit Learn Confusion Matrix:发现样本数量不一致的输入变量的主要内容,如果未能解决你的问题,请参考以下文章
如何将个人 PNG 数据集放入 Sci-Kit Learn 进行图像识别?
在 Sci-kit Learn 中将参数解析为 SVM 的自定义核函数