起因
我给buffer_size = 1,发现没有shuffle的作用。所以想知道到底是如何shuffle的。
函数内部设置
首先,Dataset会取所有数据的前buffer_size数据项,填充 buffer,如下图:
然后,从buffer中随机选择一条数据输出,比如这里随机选中了item 7,那么buffer中item 7对应的位置就空出来了。
然后,从Dataset中顺序选择最新的一条数据填充到buffer中,这里是item 10。
然后在从Buffer中随机选择下一条数据输出。
好了,这下就不难理解为什么buffer_size = 1就没有打乱了。因为只取出了一个到buffer,也就是只取出了第一个元素,然后从buffer中弹出1个,也就只能弹出buffer中这唯一的一个了,buffer空了,按顺序从剩下的元素中取出一个到buffer,所以元素2进入到buffer,buffer弹出一个,也只能弹出元素2,接下里按顺序又取出元素3到buffer,依次类推,就是原序列顺序输出了。
同理,可以推测出buffer_size=2的输出,也可以推测buffer_size=3的输出,可用程序验证。
程序验证
import tensorflow as tf
import numpy as np
buffer_size=2
data = np.array([0.1, 0.4, 0.6, 0.2, 0.8, 0.8, 0.4, 0.9, 0.3, 0.2])
label = np.array([0, 0, 1, 0, 1, 1, 0, 1, 0, 0])
dataset = tf.data.Dataset.from_tensor_slices((data, label))
dataset = dataset.shuffle(buffer_size)
it = dataset.__iter__()
for i in range(10):
x, y = it.next()
print(x, y)
输出:
tf.Tensor(0.1, shape=(), dtype=float64) tf.Tensor(0, shape=(), dtype=int32)
tf.Tensor(0.4, shape=(), dtype=float64) tf.Tensor(0, shape=(), dtype=int32)
tf.Tensor(0.6, shape=(), dtype=float64) tf.Tensor(1, shape=(), dtype=int32)
tf.Tensor(0.8, shape=(), dtype=float64) tf.Tensor(1, shape=(), dtype=int32)
tf.Tensor(0.2, shape=(), dtype=float64) tf.Tensor(0, shape=(), dtype=int32)
tf.Tensor(0.8, shape=(), dtype=float64) tf.Tensor(1, shape=(), dtype=int32)
tf.Tensor(0.4, shape=(), dtype=float64) tf.Tensor(0, shape=(), dtype=int32)
tf.Tensor(0.9, shape=(), dtype=float64) tf.Tensor(1, shape=(), dtype=int32)
tf.Tensor(0.2, shape=(), dtype=float64) tf.Tensor(0, shape=(), dtype=int32)
tf.Tensor(0.3, shape=(), dtype=float64) tf.Tensor(0, shape=(), dtype=int32)
参考来源链接
感谢原作者。
Ps:我也不知道该链接是不是原作者。。。
https://www.jianshu.com/p/1285036e314c