Keras-SegNet 使用 ImageDataGenerator 并适合或 fit_generator
Keras-SegNet use ImageDataGenerator and fit or fit_generator
有关导入数据集的问题快把我逼疯了。
这是我的 segnet 代码的一部分。
我将重点介绍有关图像和遮罩数据导入的问题。
print("CNN Model created.")
###training data
data_gen_args = dict()
image_datagen = ImageDataGenerator(**data_gen_args)
mask_datagen = ImageDataGenerator(**data_gen_args)
seed1 = 1
image_datagen.fit(images, augment=True, seed=seed1)
mask_datagen.fit(masks, augment=True, seed=seed1)
train_image_generator = image_datagen.flow_from_directory(TRAIN_im,target_size=(500, 500),batch_size=BATCH_SIZE, class_mode = None)
train_mask_generator = mask_datagen.flow_from_directory(TRAIN_mask,target_size=(500, 500),batch_size=BATCH_SIZE, class_mode = None)
train_generator = zip(train_image_generator,train_mask_generator)
###validation data
valid_gen_args = dict()
val_image_datagen = ImageDataGenerator(**valid_gen_args)
val_mask_datagen = ImageDataGenerator(**valid_gen_args)
seed2 = 5
val_image_datagen.fit(val_images, augment=True, seed=seed2)
val_mask_datagen.fit(val_masks, augment=True, seed=seed2)
val_image_generator = val_image_datagen.flow_from_directory(VAL_im,target_size=(500, 500),batch_size=BATCH_SIZE, class_mode = None)
val_mask_generator = val_mask_datagen.flow_from_directory(VAL_mask,target_size=(500, 500),batch_size=BATCH_SIZE, class_mode = None)
val_generator = zip(val_image_generator,val_mask_generator)
###
model.fit_generator(
train_generator,steps_per_epoch=nb_train_samples//BATCH_SIZE,epochs=EPOCHS,validation_data=val_generator,validation_steps=nb_validation_samples//BATCH_SIZE)
My question is:
我将输入大小更改为 500*500,因此我调整了池化层和上采样层的大小。这是可以实现的吗?
此外,我可以通过调整池化和上采样层的大小和滤波器数量,使经典网络(如 AlexNet、VGG、Segnet...)接受任意输入图像大小吗?
我想知道变量"images"和"masks"的数据类型是什么:
image_datagen.fit(images, augment=True, seed=seed1)
mask_datagen.fit(masks, augment=True, seed=seed1)
这部分来自Keras官方教程。(Ans:现在我知道它们都是numpy数组了。)
根据上面的问题。我怎样才能推导出它们?
我应该写一个像下面的 mnist.load_data() 这样的函数吗?
我需要一些例子。
(x_train_image, y_train_label), (x_test_image, y_test_label) = mnist.load_data()
我用函数
flow_from_directory
是否意味着不需要定义像这样的函数
"mnist.load_data()"我自己,我可以用它直接从我的目录结构中获取(批处理,随机播放)数据吗?
这是我的目录结构:
Dataset -training----------images----"many images"
| |
| |-----mask-----"ground truth images(mask)"
|
|
validation----------val_images----"many images"
| |
| |------val_mask------"ground truth images(mask)"
|
|
testing---------------test images (no ground truth)
非常感谢!
让我们开始吧。
- SegNet 是一个 FCN(完全卷积网络 --> 它不使用密集层),适用于您指定的任何 input/output 大小。我只建议对这些编码器-解码器架构使用 16 的倍数。为什么?因为在你的情况下,我们将从 500 到 250 到 125 到 62,而在另一边从 62 到 124 到 248 到 496。突然间你的分辨率不再匹配。 AlexNet 和 VGG 使用密集层。这意味着您可以更改适合您需要的初始输入大小,但您将无法使用来自不同分辨率的预训练权重。参数的数量根本不匹配。旁注:VGG 和 AlexNet 是分类架构,而 SegNet 是分割架构。
images
和 masks
是形状为 (num_imgs, width, height, num_channels)
的 4 维 numpy 数组。这些变量来自哪里?您必须在前面的步骤中从它们各自的图像文件中读取它们。
- 您想遍历这两个文件夹中的每一个,读取每张图像,将它们添加到列表中,完成后将此列表转换为 numpy 数组。确保图像和蒙版以相同方式排序,以便它们相互匹配。
flow_from_directory
是一个可以与IDG一起使用的功能,以便为您读取图像。非常便利。但是,如果您不需要 featurewise_center
、featurewise_std_normalization
和 zca_whitening
,它只会让您解决这个问题,因为在这种情况下,您需要已经可用的 numpy 数组才能执行 IDG fit()
函数。顺便说一句,这个拟合函数与启动模型训练的 fit()
函数无关。它只是使用相同的命名约定。
有关导入数据集的问题快把我逼疯了。
这是我的 segnet 代码的一部分。
我将重点介绍有关图像和遮罩数据导入的问题。
print("CNN Model created.")
###training data
data_gen_args = dict()
image_datagen = ImageDataGenerator(**data_gen_args)
mask_datagen = ImageDataGenerator(**data_gen_args)
seed1 = 1
image_datagen.fit(images, augment=True, seed=seed1)
mask_datagen.fit(masks, augment=True, seed=seed1)
train_image_generator = image_datagen.flow_from_directory(TRAIN_im,target_size=(500, 500),batch_size=BATCH_SIZE, class_mode = None)
train_mask_generator = mask_datagen.flow_from_directory(TRAIN_mask,target_size=(500, 500),batch_size=BATCH_SIZE, class_mode = None)
train_generator = zip(train_image_generator,train_mask_generator)
###validation data
valid_gen_args = dict()
val_image_datagen = ImageDataGenerator(**valid_gen_args)
val_mask_datagen = ImageDataGenerator(**valid_gen_args)
seed2 = 5
val_image_datagen.fit(val_images, augment=True, seed=seed2)
val_mask_datagen.fit(val_masks, augment=True, seed=seed2)
val_image_generator = val_image_datagen.flow_from_directory(VAL_im,target_size=(500, 500),batch_size=BATCH_SIZE, class_mode = None)
val_mask_generator = val_mask_datagen.flow_from_directory(VAL_mask,target_size=(500, 500),batch_size=BATCH_SIZE, class_mode = None)
val_generator = zip(val_image_generator,val_mask_generator)
###
model.fit_generator(
train_generator,steps_per_epoch=nb_train_samples//BATCH_SIZE,epochs=EPOCHS,validation_data=val_generator,validation_steps=nb_validation_samples//BATCH_SIZE)
My question is:
我将输入大小更改为 500*500,因此我调整了池化层和上采样层的大小。这是可以实现的吗? 此外,我可以通过调整池化和上采样层的大小和滤波器数量,使经典网络(如 AlexNet、VGG、Segnet...)接受任意输入图像大小吗?
我想知道变量"images"和"masks"的数据类型是什么:
image_datagen.fit(images, augment=True, seed=seed1) mask_datagen.fit(masks, augment=True, seed=seed1)
这部分来自Keras官方教程。(Ans:现在我知道它们都是numpy数组了。)
根据上面的问题。我怎样才能推导出它们?
我应该写一个像下面的 mnist.load_data() 这样的函数吗?
我需要一些例子。
(x_train_image, y_train_label), (x_test_image, y_test_label) = mnist.load_data()
我用函数
flow_from_directory
是否意味着不需要定义像这样的函数 "mnist.load_data()"我自己,我可以用它直接从我的目录结构中获取(批处理,随机播放)数据吗?
这是我的目录结构:
Dataset -training----------images----"many images"
| |
| |-----mask-----"ground truth images(mask)"
|
|
validation----------val_images----"many images"
| |
| |------val_mask------"ground truth images(mask)"
|
|
testing---------------test images (no ground truth)
非常感谢!
让我们开始吧。
- SegNet 是一个 FCN(完全卷积网络 --> 它不使用密集层),适用于您指定的任何 input/output 大小。我只建议对这些编码器-解码器架构使用 16 的倍数。为什么?因为在你的情况下,我们将从 500 到 250 到 125 到 62,而在另一边从 62 到 124 到 248 到 496。突然间你的分辨率不再匹配。 AlexNet 和 VGG 使用密集层。这意味着您可以更改适合您需要的初始输入大小,但您将无法使用来自不同分辨率的预训练权重。参数的数量根本不匹配。旁注:VGG 和 AlexNet 是分类架构,而 SegNet 是分割架构。
images
和masks
是形状为(num_imgs, width, height, num_channels)
的 4 维 numpy 数组。这些变量来自哪里?您必须在前面的步骤中从它们各自的图像文件中读取它们。- 您想遍历这两个文件夹中的每一个,读取每张图像,将它们添加到列表中,完成后将此列表转换为 numpy 数组。确保图像和蒙版以相同方式排序,以便它们相互匹配。
flow_from_directory
是一个可以与IDG一起使用的功能,以便为您读取图像。非常便利。但是,如果您不需要featurewise_center
、featurewise_std_normalization
和zca_whitening
,它只会让您解决这个问题,因为在这种情况下,您需要已经可用的 numpy 数组才能执行 IDGfit()
函数。顺便说一句,这个拟合函数与启动模型训练的fit()
函数无关。它只是使用相同的命名约定。