首页 > 解决方案 > 使用 ImageDataGenerator 进行批量训练

问题描述

我有一个训练数据集,准备如下:

FileName              
s01_l01/1_1.png     

Labels_onehot
[[0.0, 0.0, 0.0,..., 1.0],..., [0.0, 0.0, 1.0,..., 0.0]]

FileName直接导致输入图像。我想预处理图像(将它们调整为 (224, 224) 并重新缩放它们 (1./255)。Labels_onehot是一个热门编码标签。这些不必进一步预处理。

最后,预处理的图像是我的X_train数据。

X_train.shape
(n, 224, 224, 3)

标签是y_train数据。

y_train.shape
(n, 8, 36)

到目前为止,我手动预处理图像,然后加载预处理图像(一个数据集)和标签(另一个数据集)。这不是一种非常有效的方法,并且完全填满了我的 RAM。

但最后我能够相对容易地适应我的模型,例如使用以下代码:

model.fit(X_train, y_train, epochs=50, batch_size=32)

现在,我想知道,如何使用ImageDataGenerator. 有没有一种方法可以手动完成我之前所做的所有步骤?

标签: pythonconv-neural-networkgenerator

解决方案


ImageDataGenerator 有很多方法

  1. flow:获取特征数据和标签数组,并返回一个迭代器,该迭代器生成增强数据批次。
  2. flow_from_directory:获取目录的路径并生成批量增强数据。

首先,我们将创建一个 ImageDataGenerator 实例。

aug = tf.keras.preprocessing.image.ImageDataGenerator( rotation_range=20,
width_shift_range=0.1, shear_range=0.2, zoom_range=0.4, horizontal_flip=True)
  • 旋转范围:度数(0 到 180)。
  • width_shift_rangeheight_shift_range分别用于水平和垂直移位。
  • zoom_range:缩放量。如果是标量 z,缩放将在 [1-z, 1+z] 范围内随机选取。
  • Horizo​​ntal_flip:是否随机水平翻转图像。
  • vertical_flip:是否随机垂直翻转图像。
  • rescale:重新缩放因子。这将图像乘以重新缩放因子。通过指定 1.0/255 的重新缩放因子,这可能是标准化数据的一种有用方法。

flow 函数返回一个生成器,它是一个 Python 迭代器对象,用于构建我们的增强图像

flow_train_generator = aug.flow(x_train, y_train, batch_size=32)

flow_from_directory 方法返回一个迭代器,它产生 (x, y) 的元组,其中 x 是包含一批图像的 NumPy 数组,y 是对应标签的 NumPy 数组。

flow_dict_train_generator = aug.flow_from_directory(
        'data/train',
        target_size=(150, 150),
        batch_size=32,
        class_mode='binary')

请注意,目录中的流可能会减慢您的模型训练过程,因为您每次生成新批次时都直接从磁盘读取,然后再对数据进行修改,然后将批次传递到网络。

有关更多详细信息,您可以参考以下链接: https ://www.tensorflow.org/api_docs/python/tf/keras/preprocessing/image/ImageDataGenerator


推荐阅读