【问题标题】:Keras ImageDataGenarator: Inconsistency in flow functions parameterKeras ImageDataGenerator:流函数参数不一致
【发布时间】:2019-01-14 16:15:56
【问题描述】:

我正在努力解决 Keras 中的图像增强问题。

我定义了一个 ImageDataGenerator 来修改数据和一个流函数来将其应用于数据的概念对我来说(或看起来)很清楚。

但是为什么流函数(flowflow_from_dataframeflow_from_directory)彼此不同?我很清楚他们的目的:他们处理不同类型来源的数据。

我的意思是要传递的参数的差异。特别是,我想到了一个区别:对于流(我在其中增加已加载的数据)

我无法说明插值机制。但那我不需要一个吗?

【问题讨论】:

  • 区别在于数据的来源
  • 它们之间的主要区别在于您要生成的数据生命:flow 用于内存中的 numpy 数组,flow_from_directory 用于图像目录等。你到底是什么意思不一致?
  • @sdcbr:谢谢,需要通过编辑来澄清这一点

标签: python keras deep-learning data-augmentation


【解决方案1】:

您可以根据拥有的数据量以及数据的组织方式选择适当的流函数。

flow() 用于您可以在内存中完全管理的小型数据集。

flow_from_directory() 将使用每个子目录的名称作为标签从父目录中的子目录读取文件。如果您有大量按目录组织的数据,则此选择很好。如果您有一组要训练的具有不同功能集的通用文件,这可能会成为一个挑战,因为您需要将数据的冗余副本存储在不同的子目录中(或至少创建充满符号链接的目录回到你真正的文件存储)。

flow_from_dataframe() 将读取 pandas DataFrame 指定的文件和标签。此功能是最近添加的,它是最灵活的选择,因为您可以使用您喜欢的任何目录结构存储文件的单个副本,并且您可以从存储为 csv 文件、数据库、或 pandas 支持的任何其他方法。

【讨论】:

    【解决方案2】:

    Flow 通常与ImageDataGenerator class一起使用

    一般而言,增强管道基于 ImageDataGeneration 对象,该对象具有参数fill_mode= 'nearest' - 所以这就是您能够定义插值机制的方式。

    在此处查看文档中的工作示例:

    (x_train, y_train), (x_test, y_test) = cifar10.load_data()
    y_train = np_utils.to_categorical(y_train, num_classes)
    y_test = np_utils.to_categorical(y_test, num_classes)
    
    datagen = ImageDataGenerator(
        featurewise_center=True,
        featurewise_std_normalization=True,
        rotation_range=20,
        width_shift_range=0.2,
        height_shift_range=0.2,
        horizontal_flip=True,
        fill_mode= 'nearest')
    
    datagen.fit(x_train)
    
    # fits the model on batches with real-time data augmentation:
    model.fit_generator(datagen.flow(x_train, y_train, batch_size=32),
                        steps_per_epoch=len(x_train) / 32, epochs=epochs)
    

    【讨论】:

      【解决方案3】:

      感谢您的所有帖子和 cmets。不幸的是,没有一个已发布的答案完全适用于我的问题。我做了一些研究并浏览了所有的 Keras 代码,并想出了一个我现在可以使用的答案。

      我猜,Keras 文档误导了我一点。我误解了flow_from_directory()flow_from_directory() 方法的参数interpolation。认为这也用于放大图像。在文档中,这应该更清楚地说明。

      首先,卡尔的观点是有效的。这些函数中的每一个都更适合于一定数量的数据以及获取数据的来源。插值出现在这里,这仅适用于加载的图像。对于使用flow 函数处理的图像,假定这些图像已经具有所需的图像大小。因此,必须提前完成。

      fill_mode 参数也不适用于插值,因为这只是在实际图像周围设置虚拟像素,以执行仿射变换。

      【讨论】:

        猜你喜欢
        • 2019-03-24
        • 2019-02-08
        • 2022-06-11
        • 2019-12-02
        • 2020-01-12
        • 2019-02-07
        • 2020-10-10
        • 1970-01-01
        • 2018-03-05
        相关资源
        最近更新 更多