代码之家  ›  专栏  ›  技术社区  ›  Weimin Chan

Keras SegNet使用ImageDataGenerator和fit或fit\u generator

  •  4
  • Weimin Chan  · 技术社区  · 7 年前

    导入数据集的问题会让我发疯。

    这是我的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)
    

    我的问题是:

    1. 我将输入大小更改为500*500,所以我调整了池和上采样层的大小。这是否可以实现? 此外,我可以制作经典网络(如AlexNet、VGG、Segnet…)通过调整池和上采样层的大小和过滤器数量来接受任意输入图像大小?

    2. 我想知道变量“images”和“masks”的数据类型是什么:

      image_datagen.fit(images, augment=True, seed=seed1)
      mask_datagen.fit(masks, augment=True, seed=seed1)
      

      这部分来自Keras官方教程。(答:现在我知道它们都是numpy阵列。)

    3. 根据上述问题。如何推导它们?

      我应该写一个像mnist这样的函数吗。是否在下面加载\u data()?

      我需要一些例子。

          (x_train_image, y_train_label), (x_test_image, y_test_label) = mnist.load_data()
      
    4. 我使用函数

      flow_from_directory
      

      这是否意味着不需要定义这样的函数 “mnist.load\u 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)
    

    谢谢!

    1 回复  |  直到 7 年前
        1
  •  2
  •   pietz    7 年前

    让我们开始吧。

    1. SegNet是一种FCN(完全卷积网络-->它不使用密集层),可用于您指定的任何输入/输出大小。我建议对这些编码器-解码器架构使用16的倍数。为什么?因为在你的情况下,我们将从500到250到125到62,另一边从62到124到248到496。突然之间,你的决心不再一致了。AlexNet和VGG使用致密层。这意味着您可以根据需要更改初始输入大小,但无法使用不同分辨率的预训练权重。参数的数量根本不匹配。旁注:VGG和AlexNet是分类体系结构,而SegNet是分段体系结构。
    2. images masks 是形状为 (num_imgs, width, height, num_channels) . 这些变量来自哪里?您必须在前面的步骤中从各自的图像文件中读取它们。
    3. 您希望遍历这两个文件夹中的每一个,读取每个图像,将它们添加到列表中,完成后将此列表转换为numpy数组。确保图像和遮罩的排序方式相同,以便它们相互匹配。
    4. flow_from_directory 是一个可以与IDG一起使用的函数,用于为您读取图像。非常方便。不过,如果你不需要的话,它只能让你绕过这个 featurewise_center , featurewise_std_normalization zca_whitening 因为在这种情况下,您需要已经可用的numpy数组才能执行IDG fit() 作用顺便说一句,这个拟合函数与 fit() 开始模型培训的函数。它只是使用相同的命名约定。