python - 使用 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
. 有没有一种方法可以手动完成我之前所做的所有步骤?
解决方案
ImageDataGenerator 有很多方法
- flow:获取特征数据和标签数组,并返回一个迭代器,该迭代器生成增强数据批次。
- 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_range和height_shift_range分别用于水平和垂直移位。
- zoom_range:缩放量。如果是标量 z,缩放将在 [1-z, 1+z] 范围内随机选取。
- Horizontal_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
推荐阅读
- google-cloud-platform - 如何使用 Google Cloud Vision API 确认图像(包含手写和打印文本)是否包含手写文本?
- javascript - 在 js 中离开拖动滚动时防止单击
- php - Laravel routes/web.php Auth::routes() 如何调用注册/登录/主页?
- pdf - 使用 github/netlify 上的 hugo 从 markdown 自动构建 PDF
- lerna - 使用“lerna publish --conventional-commits”自动生成带有错误提交链接的 CHANGELOG.md
- javascript - 延迟到下一个数据项,一次又一次地追加
- recursion - Prolog - 按给定数字递增
- r - 我试图在同一目录中的多个二进制矩阵 csv 文件中查找包含三个或更多 1 的行数?
- firebase - Flutter 应用在 Release 模式下使用 Firestore 插件时崩溃
- sql - 如何在 SQL 中连接来自不同列的数据