带有灰度图像的 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')
并且有效!
我用 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') 并且有效!