Keras - 了解 ImageDataGenerator 维度

数据挖掘 Python 喀拉斯
2022-03-06 20:16:53

我正在尝试通过在 Keras 中采用经过训练的 YOLOv2 模型、删除最后一层并用新数据重新训练它来实现自定义对象检测。不过,我对如何将数据提供给 Keras 感到困惑。我使用 YOLO 注释用边界框注释了一堆图片,并将它们放在两个单独的文件夹中(images.jpgs 所在的位置和annots.txt 注释所在的位置)。

我还从模型中删除了最后一层并添加了一个自定义层(我正在尝试预测 2 个类的边界框)。

我正在尝试使用 ImageDataGenerator 传递我的数据,因为我的数据集非常小。

我有以下输入对象:

np.shape(train_images) # this contains RGB data from 79 pictures 
(79, 1, 608, 608, 3)
np.shape(train_y)
(79,)

我正在尝试将这些传递给 ImageDataGenerator,但出现错误:

train_datagen = ImageDataGenerator(
      rotation_range=20,
      width_shift_range=0.2,
      height_shift_range=0.2,
      horizontal_flip=True,
      fill_mode='nearest')

train_generator = train_datagen.flow(
        train_images,
        train_y)

ValueError: `x` (images tensor) and `y` (labels) should have the same length. Found: x.shape = (1, 608, 608, 3), y.shape = (79,)

我不明白问题是什么。不知何故,我的图像数据的第一维完全消失了,因此不匹配......它有什么问题?

1个回答

我认为你的train_images数组应该有 shape (79, 698, 608, 3)生成器处理这些数组的每个第一维,因此传递一批 4d numpy 数组,而不是一批 3d numpy 数组。

您可以尝试使用numpy.squeeze()查看是否有帮助,如下所示:

In [1]: import numpy as np                                                      

In [2]: a = np.random.randint(0, 10, (2, 1, 10, 10, 3))                         

In [3]: np.squeeze(a, axis=1).shape                                             
Out[3]: (2, 10, 10, 3)

所以一定要设置axis=1参数。然后就像你做的那样传递更新的数组。