我试图弄清楚如何在不使用ImageDataGenerator的情况下在Keras训练CNN。从本质上讲,我试图找出ImageDataGenerator类背后的魔力,这样我就不必依赖它来完成我的所有项目。
我有一个数据集,分为2个文件夹:training_set
和test_set
。每个文件夹都包含2个子文件夹:cats
和dogs
。
我使用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
的情况下正确准备数据阵列?
答案 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