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

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