tf-utils
tf.contrib.data.Dataset
假设我们有 N 个样本, 对应的样本 ID 为 {0, 1, 2, ..., N-1}。我们使用 tensorflow.contrib.data 中的 Dataset 按顺序读入的数据,随后我们每次从中获取一个 mini_batch (大小为 batch_size)的样本,共获取 N/batch_size个mini_batch。因为数据是按照由小到大的顺序读入,因此获取数据的顺序同样由小到大,如下所示:
batch_0: {index_0+0, index_0+1, ..., index_0+batch_size-1}, index_0 = 0
batch_1: {index_1+0, index_1+1, ..., index_1+batch_size-1}, index_1 = batch_size * 1
...
batch_i: {index_i+0, index_i+1, ..., index_i+batch_size-1}, index_i = batch_size * (i-1)
...
现在我们使用 Dataset.shuffle(buffer_size) 方法对数据进行打乱,并测试 buffer_size 的大小对 shuffle 效果的影响。
理想情况下我们希望每次获取的 batch_size 个样本数据在原始顺序中尽可能的混乱。因此我们
- 计算每个
mini_batch中的样本位于原始序列中的batch_id = ID//batch_size - 并统计
batch_id的种类数作为混乱度 (diversity) 用来衡量混乱程度
比如当 N=100, batch_size=10, 某次获取的一个 mini_batch 数据的样本 ID 为
ID = {12, 10, 29, 40, 19, 19, 26, 76, 56, 20}
则对应的 batch_id 和 diversity 为
batch_id = {1, 1, 2, 4, 1, 1, 2, 7, 5, 2}
diversity = len(set(batch_id)) = 5。
通常情况下 N >> batch_size,因此 diversity 越接近 batch_size 表明混乱度越高。
如下图所示,我们取N={1000, 2000, 4000, 8000, 16000, 20000, 32000}, batch_size=100, 对于每组 (N, batch_size),测试 buffer_size={1, batch_size, 2*batch_size, ..., factor*batch_size} 其中 factor = N//batch_size
