在不使用ImageDataGenerator的情况下为Keras CNN培训准备数据

时间:2018-03-18 04:16:16

标签: python keras

我试图弄清楚如何在不使用ImageDataGenerator的情况下在Keras训练CNN。从本质上讲,我试图找出ImageDataGenerator类背后的魔力,这样我就不必依赖它来完成我的所有项目。

我有一个数据集,分为2个文件夹:training_settest_set。每个文件夹都包含2个子文件夹:catsdogs

我使用Keras'将它们全部加载到内存中。 for循环中的load_img类如下:

trainingImages = []
trainingLabels = []
validationImages = []
validationLabels = []

imgHeight = 32
imgWidth = 32
inputShape = (imgHeight, imgWidth, 3)

print('Loading images into RAM...')

for path in imgPaths:

    classLabel = path.split(os.path.sep)[-2]
    classes.add(classLabel)
    img = img_to_array(load_img(path, target_size=(imgHeight, imgWidth)))

    if path.split(os.path.sep)[-3] == 'training_set':
        trainingImages.append(img)
        trainingLabels.append(classLabel)
    else:
        validationImages.append(img)
        validationLabels.append(classLabel)

trainingImages = np.array(trainingImages)
trainingLabels = np.array(trainingLabels)
validationImages = np.array(validationImages)
validationLabels = np.array(validationLabels)

当我打印shape()的trainingImages和trainingLabels时,我得到了:

Shape of trainingImages: (8000, 32, 32, 3)
Shape of trainingLabels: (8000,)

我的模型看起来像这样:

model = Sequential()
model.add(Conv2D(
        32, (3, 3), padding="same", input_shape=inputShape))
model.add(Activation("relu"))
model.add(Flatten())
model.add(Dense(len(classes)))
model.add(Activation("softmax"))

当我编译并尝试拟合数据时,我得到: ValueError: Error when checking target: expected activation_2 to have shape (2,) but got array with shape (1,)

这告诉我我的数据没有正确输入系统。如何在不使用ImageDataGenerator的情况下正确准备数据阵列?

1 个答案:

答案 0 :(得分:1)

错误是因为您的模型定义而不是len(classes) = 2(我在您发布的代码中看不到这些内容)。由于您收到的错误消息,我假设trainingLabels。您收到错误是因为模型的最后一层希望trainingLabels为每个数据点都有一个大小为2的向量,但您的model.add(Dense(1)) 是一维数组。

为了解决这个问题,您可以将最后一层更改为只有一个单元,因为它是二进制分类:

from keras.utils import to_categorical
training_labels_one_hot = to_categorical(trainingLabels)
validation_labels_one_hot = to_categorical(validationLabels)

或者您可以使用一个热编码将训练和验证标签更改为矢量:

android:label