tf.data.Dataset.shuffle(buffer_size)中buffer_size的理解

起因

我给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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值