如何在 CNN 预测中准备不同大小的输入

数据挖掘 机器学习 神经网络 深度学习 喀拉斯 美国有线电视新闻网
2021-09-16 05:13:18

我想制作一个Keras可以输入不同大小图像的 CNN 模型。根据其他问题,我可以理解如何设置模型,例如Input =(None,None,3). 但是,我不确定如何准备输入/输出数据集。具体来说,现在我想将数据集与(100,100)和(240,360)结合起来。但是,我不知道如何组合这些数据集。

4个回答

传统上,当在 CNN 中处理不同大小的图像时(这在现实世界的问题中经常发生),我们会借助任何图像处理库(OpenCV、PIL 等)或有时将图像调整为最小图像的大小,将大小不等的图像填充到所需大小。调整图像大小更简单,并且最常用。

正如Media在上述答案中所提到的,无法直接使用不同尺寸的图像。这是因为当您定义 CNN 架构时,您会根据输入大小计划应该有多少层。如果没有固定的输入形状,您将无法定义模型的架构。因此,有必要将所有图像转换为相同大小。

有一种方法可以同时包含两种图像尺寸。您可以对图像进行预处理,以便将它们重新调整为相同的尺寸。

一些显示这一点的免费代码:

img_width, img_height = 150, 150

train_data_dir = '/yourdir/train'
validation_data_dir = '/yourdir/validation'
nb_train_samples = 
nb_validation_samples = 
epochs = 50
batch_size = 16

if K.image_data_format() == 'channels_first':
    input_shape = (3, img_width, img_height)
else:
    input_shape = (img_width, img_height, 3)



model = Sequential()
model.add(Conv2D(32, (3, 3), input_shape=input_shape))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Flatten())
model.add(Dense(64))
model.add(Activation('relu'))
model.add(Dense(64))
model.add(Activation('relu'))
model.add(Dropout(0.3))
model.add(Dense(1))
model.add(Activation('sigmoid'))

model.compile(loss='binary_crossentropy',
              optimizer='rmsprop',
              metrics=['accuracy'])


train_datagen = ImageDataGenerator(
    rescale=1. / 255,
    shear_range=0.1,
    zoom_range=0.1,
    horizontal_flip=True)

test_datagen = ImageDataGenerator(rescale=1. / 255)

train_generator = train_datagen.flow_from_directory(
    train_data_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode='binary')

validation_generator = test_datagen.flow_from_directory(
    validation_data_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode='binary')

这使用 Keras 图像流 API 进行动态数据增强,代码底部的数据生成器会将您的图像调整为您在顶部指定的任何尺寸。

Keras 中有一个concatenate函数(docsdocs)。
另见这篇论文它的应用可以在这里这里看到。

此方法可用于具有不同图像大小的多个输入通道。

一种方法是在训练时填充图像。也就是说,在训练时,Keras 会期望一批中的所有张量大小相同。但是,在推理时,如果您只使用单个图像,它可以是任意大小。所以在训练时你可以做的是填充你的 100 x 100 图像,这样它们在填充后的新尺寸变成 240 x 360。

你可以看看这个教程