首页 > 解决方案 > 为什么 keras 测试生成器只返回批量大小作为数组形状的长度?

问题描述

这是我的测试生成器代码:

test_generator=test_datagen.flow_from_dataframe(
                      dataframe=df_test,
                      directory=img_dir,
                      x_col="filename",
                      y_col="label",
                      batch_size=32,
                      seed=42,
                      shuffle=False,
                      class_mode="categorical",
                      target_size=(img_size,img_size))

为什么batch_size创建生成器后参数仍然很重要:

Found 229 validated image filenames belonging to 2 classes.

例如,创建生成器后数组的形状被限制为 32 - 批量大小:

x_test, y_test = test_generator.next()

这是 的形状x_test,我假设这是包含实际图像数据的数组:

>>> print(x_test.shape)
(32, 224, 224, 3)

这是我将其与预测长度进行比较时的结果:

print(len(x_test))  #32
print(len(y_test))  #32
print(len(pred))    #229

由于大小与y_test预测大不相同,我很难进行任何类型的比较。与批量大小设置为 32的y_test直接相关test_generator

测试生成器标签似乎具有正确数量的元素:

test_generator.labels

[0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0........

x_test那么为什么只有32的形状呢?我显然错误地认为它应该是 229,因为有 229 个样本,229 个标签?

非常感谢您的任何建议!

标签: image-processingkerasgenerator

解决方案


正如此处的文档所述,生成器返回的是:

DataFrameIterator 产生 (x, y) 的元组,其中 x 是一个 numpy 数组,其中包含一批形状为 (batch_size, target_size, channels) 的图像,y 是一个对应标签的 numpy 数组。

所以,test_generator是 a DataFrameIterator,每次你调用它时,它都会给你一批 shape 的图像(32, 224, 224, 3)。因此,您错误地认为它应该是 229,因为有 229 个样本。每次它会从 229 个样本中为您提供一批 32 个图像。


推荐阅读