为啥 keras 测试生成器只返回批量大小作为数组形状的长度?

Posted

技术标签:

【中文标题】为啥 keras 测试生成器只返回批量大小作为数组形状的长度?【英文标题】:Why does keras test generator only return batch size as the length in the shape of the array?为什么 keras 测试生成器只返回批量大小作为数组形状的长度? 【发布时间】:2021-09-24 14:08:45 【问题描述】:

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

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 的大小与预测大不相同,我很难进行任何类型的比较。 y_test 与批量大小设置为 32 的 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个标签?

非常感谢您的建议!

【问题讨论】:

【参考方案1】:

作为文档here 状态,生成器返回的是:

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

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

【讨论】:

啊,好的,谢谢,我已经看到了这种数据类型,但不确定它是如何工作的。这有助于我理解发生了什么。只是一个简单的问题,如果我想测试预测,我只能测试批量大小的限制,32。我希望根据所有预测测试 x_test 中的所有样本,看看我是否能得到“不正确与正确”的图像表。再次感谢您的澄清。 没有。您不仅限于测试一批数据。您可以将您的生成器传递给model.predict,它会为您提供对整个数据的预测,但是由于您的生成器会批量处理数据,因此它会逐批进行预测。

以上是关于为啥 keras 测试生成器只返回批量大小作为数组形状的长度?的主要内容,如果未能解决你的问题,请参考以下文章

如何确定Keras ImageDataGenerator中测试数据集的最佳“步数”和“批量大小”?

预测取决于 Keras 中的批量大小

生成器只进行12次迭代 - 无论批量大小

批量大小未传递给 tf.keras 模型:“检查输入时出错:预期 input1 有 3 个维度,但得到的数组形状为 (a,b)”

Keras:构造一个与给定张量具有相同批量大小的完整张量

Keras flow_from_dataframe错误的数据排序