python - 如何转换通过 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
?
解决方案
让我们逐步分解错误以找出它告诉我们的内容:
检查输入时出错:
所以它与模型的输入数据和输入层有关。
预期 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)
)。
推荐阅读
- r - 如何强制多个列类?
- visual-studio-code - 如何在 VSCode 任务中使用 MSTest --filter 参数
- javascript - 对测试非继承但继承的 CSS 显示属性感到震惊
- sql - 阻止较新版本的 SQL 构建或执行
- python - 如何从 Python 中的 Double For 循环中的值创建字典?
- amazon-web-services - 如何将参数发送到 EC2 实例 aws
- python - 如何从基于列表的较大矩阵中提取非连续矩阵
- python - 基于 uint32 id 以 x 长度的块解析流
- github-actions - 上一个作业的参考输出 GH Actions
- c# - C# 类属性集未被调用或设置