我正在努力解决 Keras 的图像增强问题。
我定义了一个 ImageDataGenerator 来修改数据和一个流函数来将其应用于数据的概念对我来说(或似乎)很清楚。
但是为什么流函数(flow
, flow_from_dataframe
, flow_from_directory
)彼此不同?我很清楚他们的目的:他们处理不同类型来源的数据。
我的意思是要传递的参数的差异。特别是,我想到了一个区别:对于流(我在其中增加已经加载的数据)
我无法说明插值机制。但那我不需要一个吗?
我正在努力解决 Keras 的图像增强问题。
我定义了一个 ImageDataGenerator 来修改数据和一个流函数来将其应用于数据的概念对我来说(或似乎)很清楚。
但是为什么流函数(flow
, flow_from_dataframe
, flow_from_directory
)彼此不同?我很清楚他们的目的:他们处理不同类型来源的数据。
我的意思是要传递的参数的差异。特别是,我想到了一个区别:对于流(我在其中增加已经加载的数据)
我无法说明插值机制。但那我不需要一个吗?
您可以根据拥有的数据量以及数据的组织方式来选择适当的流函数。
flow()
适用于可以在内存中完全管理的小型数据集。
flow_from_directory()
将从父目录中的子目录读取文件,使用每个子目录的名称作为标签。如果您有大量按目录组织的数据,则此选择很好。如果您有一组要训练的具有不同功能集的通用文件,这可能会成为一个挑战,因为您需要将数据的冗余副本存储在不同的子目录中(或至少创建充满符号链接的目录这一点回到你的真实文件存储)。
flow_from_dataframe()
将读取 pandas DataFrame 指定的文件和标签。此功能是最近添加的,它是最灵活的选择,因为您可以使用您喜欢的任何目录结构存储文件的单个副本,并且您可以从存储为 csv 文件、数据库、或 pandas 支持的任何其他方法。
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)
感谢您的所有帖子和评论。不幸的是,没有一个已发布的答案完全适用于我的问题。我做了一些研究并浏览了所有的 Keras 代码,并想出了一个我现在可以使用的答案。
我想,Keras 文档误导了我一点。interpolation
我误解了flow_from_directory()
andflow_from_directory()
方法的论点。考虑到这也用于放大图像。在文档中,这应该更清楚地说明。
首先,卡尔的观点是有效的。这些函数中的每一个都更适合一定数量的数据以及获取数据的来源。插值在这里出现,它仅适用于加载的图像。对于使用该函数处理的图像flow
,假设这些图像已经具有所需的图像大小。因此,必须提前完成。
该fill_mode
参数也不适用于插值,因为这只是在实际图像周围设置虚拟像素,以便执行仿射变换。