-1

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

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

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

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

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

4

3 回答 3

1

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

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

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

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

于 2019-01-14T17:49:32.437 回答
0

Flow 通常与ImageDataGenerator 类一起使用

增强管道通常基于具有参数的 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)
于 2019-01-14T17:58:09.723 回答
0

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

我想,Keras 文档误导了我一点。interpolation我误解了flow_from_directory()andflow_from_directory()方法的论点。考虑到这也用于放大图像。在文档中,这应该更清楚地说明。

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

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

于 2019-01-15T06:38:57.813 回答