我试图通过在Keras中使用经过训练的YOLOv2模型来实现自定义对象检测,删除最后一层并使用新的数据对其进行再培训。不过,我对如何将数据提供给Keras感到困惑。我用YOLO注释用边框注释了一堆图片,并将它们放在两个单独的文件夹中( .jpgs所在的.jpgs文件夹和.txt注释所在的annots )。
我还从模型中删除了最后一层,并添加了一个自定义层(我正在尝试预测两个类的边界框)。
我试图用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,)我不明白问题出在哪里。不知怎么的,我的图像数据的第一个维度完全消失了,因此不匹配.它有什么问题?
发布于 2019-07-04 13:58:57
我认为您的train_images数组应该具有形状(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参数。然后,就像您正在做的那样,传递更新的数组。
https://datascience.stackexchange.com/questions/55054
复制相似问题