首页 > 解决方案 > 如何转换通过 model.flow_from_directory 定向的图像尺寸?

问题描述

我正在尝试使用Keras 2.2.0和构建图像分类器tensorflow 1.9.0

我收到此类错误:

str(data_shape))
ValueError: Error when checking input: expected conv2d_1_input to have shape (1, 224, 224) but got array with shape (224, 224, 3)

这是代码:

train_datagen=ImageDataGenerator(rotation_range=40,
            width_shift_range=0.2,
            height_shift_range=0.2,
            rescale=1./255,
            shear_range=0.2,
            zoom_range=0.2,
            horizontal_flip=True,
            fill_mode='nearest')

validation_datagen=ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory('/media/centura/DANISH/mobile backup/moles/train/',class_mode='binary',target_size=(224, 224),batch_size=batch_size)

validation_generator = validation_datagen.flow_from_directory('/media/centura/DANISH/mobile backup/moles/test/',class_mode='binary',target_size=(224, 224),batch_size=batch_size)

#Data Dimensions
img_rows,img_cols=224,224

input_shape1=(1,img_rows,img_cols)

#initialising the model

model=Sequential()

#layer 1
model.add(Conv2D(filters=32, kernel_size=(3,3), strides=(1, 1), padding='same',input_shape=input_shape1,data_format="channels_last"))
model.add(BatchNormalization())
model.add(Activation('relu'))
#model.add(AveragePooling2D(pool_size=(2,2)))
model.add(Dropout(0.25))


#fully connected first layer

model.add(Flatten())
model.add(Dense(500,use_bias=False))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Dropout(0.25))      


#Fully connected final layer
model.add(Dense(1)) 
model.add(Activation('sigmoid')) 

tensorboard=TensorBoard(log_dir='logs/{}'.format(name))


model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])
#model.summary()
model.fit_generator(train_generator,epochs=50,validation_data=validation_generator,callbacks=[tensorboard])

我相信错误来自train_generator. 我在堆栈溢出中搜索了类似的问题。我找到了某些解决方案,但它对我不起作用。如果从 中调用图像,如何更改图像的尺寸.flow_from_directory

标签: pythonimage-processingmachine-learningkerasconv-neural-network

解决方案


让我们逐步分解错误以找出它告诉我们的内容:

检查输入时出错:

所以它与模型的输入数据和输入层有关。

预期 conv2d_1_input 的形状为 (1, 224, 224)

如果我们查看第一个卷积层的代码,我们会看到:

Conv2D(..., input_shape=input_shape1, ...)

input_shape1正如您所定义的那样,它的价值是(1,img_rows,img_cols)which is (1, 224, 224)。但:

但得到了形状为 (224, 224, 3) 的数组

这意味着由生成的图像train_generator具有(224, 224, 3)(正确且预期)的形状。

结果,我们看到这两个形状,生成图像的形状和input_shape参数的给定形状,必须相同。因此,您需要修改input_shape1如下的值:

input_shape1=(img_rows, img_cols, 3)

这正是卷积层期望的输入形状(即(image_height, image_width, image_channels))。


推荐阅读