记录 之 tf.data进行数据集处理常用的几个函数介绍

1.tf.data.Dataset.from_tensor_slices(),前面的文章我们有介绍过。

2.tf.data.Dataset.shuffle(buffer_size = n)

这里的shuffle函数是将数据集进行混洗,已达到次序的优化,这里的buffer_size的作用是先从原数据集中预取n个数据,然后每次从缓冲区中抽取一个元素,来达到输入数据无序的目的,buffer_size的大小设置也会影响实验结果,一般将buffer_sizeshe设置为len(your_dataset),即buffer_size的大小等于你数据集的大小(前提是每一个item代表的是一个单独数据,当然每个item也可代表一个batch的数据,则这时的buffer_size = len(your_dataset)// batch_size)。具体操作如图:

3.tf.data.Dataset.repeat(n)

这个其实比较好理解,就是为了加快数据处理的速度,在准备数据时,将整个数据集复制多少份,以epoch为界限,一般代码运行多少个epoch,则参数n的值为epoch的数量,相当于我们为每个epoch都准备了相应的数据。

注意:其实这里大家可以考虑一下shuffle 和 repeat的顺序关系对数据及构成有什么影响。
①先shuffle后repeat,在每一个epoch开始时都会进行shuffle的初始化,会影响性能。
②先repeat后shuffle,这样就不能保证每一个epoch能包含整个数据集的数据,有些数据可能会在一个epoch里出现多次。
因此官方建议:采用方法①的顺序。或采用:
tf.contrib.data.shuffle_and_repeat

4.tf.data.Dataset.prefetch(buffer_size)

字面理解,这个函数就是一个预取函数,那么到底预取什么呢,我们来看下面两张图:
1.传统输入方式(横轴为时间):

2.采用预取函数后
 

大家对比这两张图就可以发现,预取函数讲道理就是进一步提高了CPU的利用率,在GPU/NPU进行数据运算的时候,CPU同步为下一次训练进行数据的准备工作。这里一个batch所花费的时间就是Prepare 和 train 两者之间的最大值。
本质上这是一个ET(数据准备)和L(消耗过程)的一个解耦过程。

以上几个函数所涉及到的过程,在这篇博客里有非常详细的图解,能加深各位同学的理解,链接:https://www.cnblogs.com/yaos/p/12761917.html

 我们先介绍这么多,后续会继续更新。

猜你喜欢

转载自blog.csdn.net/qq_41368074/article/details/110007670