TensorFlow的中阶API主要包括:
如果把模型比作一个房子,那么中阶API就是【模型之墙】。
本篇我们介绍数据管道。
如果需要训练的数据大小不大,例如不到1G,那么可以直接全部读入内存中进行训练,这样一般效率最高。
但如果需要训练的数据很大,例如超过10G,无法一次载入内存,那么通常需要在训练的过程中分批逐渐读入。
使用 tf.data API 可以构建数据输入管道,轻松处理大量的数据,不同的数据格式,以及不同的数据转换。
可以从 Numpy array, Pandas DataFrame, Python generator, csv文件, 文本文件, 文件路径, tfrecords文件等方式构建数据管道。
其中通过Numpy array, Pandas DataFrame, 文件路径构建数据管道是最常用的方法。
通过tfrecords文件方式构建数据管道较为复杂,需要对样本构建tf.Example后压缩成字符串写到tfrecoreds文件,读取后再解析成tf.Example。
但tfrecoreds文件的优点是压缩后文件较小,便于网络传播,加载速度较快。
1,从Numpy array构建数据管道
2,从 Pandas DataFrame构建数据管道
3,从Python generator构建数据管道
4,从csv文件构建数据管道
5, 从文本文件构建数据管道
6,从文件路径构建数据管道
7,从tfrecords文件构建数据管道
Dataset数据结构应用非常灵活,因为它本质上是一个Sequece序列,其每个元素可以是各种类型,例如可以是张量,列表,字典,也可以是Dataset。
Dataset包含了非常丰富的数据转换功能。
训练深度学习模型常常会非常耗时。
模型训练的耗时主要来自于两个部分,一部分来自数据准备,另一部分来自参数迭代。
参数迭代过程的耗时通常依赖于GPU来提升。
而数据准备过程的耗时则可以通过构建高效的数据管道进行提升。
以下是一些构建高效数据管道的建议。
1,使用 prefetch 方法让数据准备和参数迭代两个过程相互并行。
2,使用 interleave 方法可以让数据读取过程多进程执行,并将不同来源数据夹在一起。
3,使用 map 时设置num_parallel_calls 让数据转换过程多进行执行。
4,使用 cache 方法让数据在第一个epoch后缓存到内存中,仅限于数据集不大情形。
5,使用 map转换时,先batch, 然后采用向量化的转换方法对每个batch进行转换。