数据管道Dataset
如果需要训练的数据大小不大,例如不到1G,那么可以直接全部读入内存中进行训练,这样一般效率最高。
但如果需要训练的数据很大,例如超过10G,无法一次载入内存,那么通常需要在训练的过程中分批逐渐读入。
使用tf.data API
可以构建数据输入管道,轻松处理大量的数据,不同的数据格式,以及不同的数据转换。
构建数据管道
可以从 Numpy array, Pandas DataFrame, Python generator, csv文件, 文本文件, 文件路径, tfrecords文件等方式构建数据管道。
其中通过Numpy array, Pandas DataFrame, 文件路径构建数据管道是最常用的方法。
通过tfrecords文件方式构建数据管道较为复杂,需要对样本构建tf.Example后压缩成字符串写到tfrecords文件,读取后再解析成tf.Example。
但tfrecords文件的优点是压缩后文件较小,便于网络传播,加载速度较快。
从numpy array构建数据管道
|
|
从Pdandas DataFrame构建数据管道
|
|
从Python generator构建数据管道
|
|
从csv文件构建数据管道
|
|
从文本文件构建数据管道
|
|
从文件路径构建数据管道
|
|
从threcords文件构建数据管道
|
|
应用数据转换
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进行转换。