TensorFlow的中阶API主要包括:
- 数据管道(tf.data)
- 特征列(tf.feature_column)
- 激活函数(tf.nn)
- 模型层(tf.keras.layers)
- 损失函数(tf.keras.losses)
- 评估函数(tf.keras.metrics)
- 优化器(tf.keras.optimizers)
- 回调函数(tf.keras.callbacks)
如果把模型比作一个房子,那么中阶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包含了非常丰富的数据转换功能。
- map: 将转换函数映射到数据集每一个元素。
- flat_map: 将转换函数映射到数据集的每一个元素,并将嵌套的Dataset压平。
- interleave: 效果类似flat_map,但可以将不同来源的数据夹在一起。
- filter: 过滤掉某些元素。
- zip: 将两个长度相同的Dataset横向铰合。
- concatenate: 将两个Dataset纵向连接。
- reduce: 执行归并操作。
- batch : 构建批次,每次放一个批次。比原始数据增加一个维度。其逆操作为unbatch。
- padded_batch: 构建批次,类似batch, 但可以填充到相同的形状。
- window :构建滑动窗口,返回Dataset of Dataset.
- shuffle: 数据顺序洗牌。
- repeat: 重复数据若干次,不带参数时,重复无数次。
- shard: 采样,从某个位置开始隔固定距离采样一个元素。
- take: 采样,从开始位置取前几个元素。
三,提升管道性能
训练深度学习模型常常会非常耗时。
模型训练的耗时主要来自于两个部分,一部分来自数据准备,另一部分来自参数迭代。
参数迭代过程的耗时通常依赖于GPU来提升。
而数据准备过程的耗时则可以通过构建高效的数据管道进行提升。
以下是一些构建高效数据管道的建议。
- 1,使用 prefetch 方法让数据准备和参数迭代两个过程相互并行。
- 2,使用 interleave 方法可以让数据读取过程多进程执行,并将不同来源数据夹在一起。
- 3,使用 map 时设置num_parallel_calls 让数据转换过程多进行执行。
- 4,使用 cache 方法让数据在第一个epoch后缓存到内存中,仅限于数据集不大情形。
- 5,使用 map转换时,先batch, 然后采用向量化的转换方法对每个batch进行转换。
1,使用 prefetch 方法让数据准备和参数迭代两个过程相互并行。
2,使用 interleave 方法可以让数据读取过程多进程执行,并将不同来源数据夹在一起。
3,使用 map 时设置num_parallel_calls 让数据转换过程多进行执行。
4,使用 cache 方法让数据在第一个epoch后缓存到内存中,仅限于数据集不大情形。
5,使用 map转换时,先batch, 然后采用向量化的转换方法对每个batch进行转换。