带有灰度图像的 CNN 形状问题

Issue with shape on CNN with grayscale images

我用 10 个 类 制作了一个用于分类的 CNN。 input = 49000张灰度图片,全部混合(我指的是训练集和验证集) train.csv 包含图像列表及其标签,例如:

id,label
0.png,4
1.png,9
2.png,1
3.png,7
4.png,3
5.png,9

这里是CNN的一部分:

traindf = pd.read_csv('train.csv', dtype=str)

datagen = ImageDataGenerator(rescale=1./255, validation_split=0.25, shear_range = 0.2, zoom_range = 0.2, horizontal_flip = True)

train_generator = datagen.flow_from_dataframe(dataframe = traindf,
                                              directory='images',
                                              target_size = (28, 28),
                                              color_mode='grayscale',
                                              x_col='id',
                                              y_col='label',
                                              subset='training',
                                              batch_size = 32,
                                              shuffle=True,
                                              class_mode = 'categorical')

valid_generator = datagen.flow_from_dataframe(dataframe = traindf,
                                              directory="images",
                                              target_size=(28,28),
                                              color_mode='grayscale',
                                              x_col="id",
                                              y_col="label",
                                              subset="validation",
                                              batch_size=32,
                                              shuffle=True,
                                              class_mode="categorical")

STEP_SIZE_TRAIN = train_generator.n//train_generator.batch_size
STEP_SIZE_VALID = valid_generator.n//valid_generator.batch_size

和拟合方法:

classifier.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics = ['accuracy'])

classifier.fit_generator(train_generator,
                         steps_per_epoch = STEP_SIZE_TRAIN,
                         epochs = 10,
                         validation_data = valid_generator,
                         validation_steps = STEP_SIZE_VALID)

为了清楚起见,我没有显示神经网络的创建,但请注意 input_shape = (28,28,1)

然后我保存模型:

filepath = './NumChar_model_01'
save_model(classifier, filepath)

在另一个程序中,我想预测一个图像:

loaded_model = load_model(filepath,custom_objects=None, compile=True)

img = img.resize((28, 28))
img = image.img_to_array(img)
img = np.expand_dims(img, axis = 0)
result = loaded_model.predict(img)

我得到了这个错误:

ValueError: Input 0 of layer sequential is incompatible with the layer: expected axis -1 of input shape to have value 1 but received input with shape [None, 28, 28, 3]

我知道这是形状问题,但请相信我,我阅读了世界上所有关于这个的话题...

我尝试在 train_generator 和 valid_generator 上重塑,但它也给我一个错误('DataFrameIterator' 对象没有属性 'reshape')

解决方案:

img 由

获取

img = ImageGrab.grab((cx, cy, cx + cw, cy + ch)) 它 returns 一个 RGB 图像,它抛出错误。所以我将其转换为灰度图像:

img = img.convert('L') 并且有效!