tf.keras 用生成器读取图片数据+预处理

Posted mx0813

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了tf.keras 用生成器读取图片数据+预处理相关的知识,希望对你有一定的参考价值。

0. 需求

  • 当训练的数据非常多时,是不希望分配过多的内存将数据存入,否则其他占用内存的数据处理步骤就没法进行了。我们最好是以小批量地方式读入数据,然后预处理,然后送到网络,之后释放内存,以此循环。

 

1. 方法的简要说明

  • tf.keras中有一个高度封装的图片预处理类:ImageDataGenerator
  • ImageDataGenerator类还实现了一个非常方便的自动读取训练集文件夹的方法:flow_from_directory()
  • 我们实例化一个ImageDataGenerator类后,设置预处理的参数;然后对实例调用flow_from_directory()方法。对该方法传递一个路径参数,路径为数据集所在目录。其中训练集和测试集要分成两个文件夹,并且每一个label对应的图片存放在以label命名的文件夹中。
  • 调用flow_from_directory()方法之后,会返回一个生成器。
  • 生成器可以用next()函数来在每次迭代中提取(X,y),或者也可以直接传递给实例化的模型类的fit()方法

(使用前建议shift+tab查看函数|类的说明文档)

 

2. 案例: 斯坦福120个狗品种分类

(忽略训练结果,只是示例数据读取和预处理)

<代码及运行结果>

https://nbviewer.jupyter.org/github/JoJoJohnSnow/JPnotes/blob/master/notes/%E7%94%A8%E7%94%9F%E6%88%90%E5%99%A8%E8%AF%BB%E5%8F%96%E5%9B%BE%E7%89%87%E6%95%B0%E6%8D%AE%E5%92%8C%E9%A2%84%E5%A4%84%E7%90%86.ipynb

(不要介意图片中的狗看起来像个地精)

以上是关于tf.keras 用生成器读取图片数据+预处理的主要内容,如果未能解决你的问题,请参考以下文章

深度学习笔记:tf.keras.preprocessing.image_dataset_from_directory运行错误

如何从大型 .h5 数据集中批量读取数据,使用 ImageDataGenerator 和 model.fit 进行预处理,所有这些都不会耗尽内存?

是否可以将数据帧传递给每行都有一个 numpy 数组的 TF/Keras?

tf.keras在 cifar 上训练 AlexNet,数据集过大导致 OOM

如何在 tf.data.Dataset 对象上使用序列/生成器将部分数据放入内存?

OpenCV+Python实现将车牌数字分割为单个的字符图片