Dataset

1 shuffle中的buffer_size作用

 tf.data.Dataset.from_tensor_slices((input_tensor_train, target_tensor_train)).shuffle(BUFFER_SIZE)

【1】先看Demo

import tensorflow as  tf
nums = [i for i in range(10)]

dataset = tf.data.Dataset.from_tensor_slices(nums)
dataset = dataset.shuffle(buffer_size=2)
dataset = dataset.batch(batch_size=1)
iterator = dataset.make_initializable_iterator()
next_element = iterator.get_next()

init_op = iterator.initializer
with tf.Session() as sess:
    sess.run(init_op)
    for i in range(100):
        print(sess.run(next_element))

【2】再看图
对于输入【1,2,3,4,5,6,7,8,9】

1.png

buffer_size = 2时
2.png

数量太小,看不出来,对于输入【1,2,3,...,99,100】
3.png

buffer_size = 2时
4.png

buffer_size = 16时
5.png

buffer_size = 32时
6.png

buffer_size = 100时
7.png

【3】理解
buffer中总是保存着buffer_size个元素。一旦你从buffer中随机地得到了一个sample(batch),你会把下一个batch的元素放进buffer,再次从新buffersample

 buffer:0,1, get a sample  [1]
 buffer:0,2, get a sample  [0]
 buffer:2,3, get a sample  [3]
 buffer:2,4, get a sample  [2]
 buffer:4,5, get a sample  [4]
 buffer:5,6, get a sample  [5]
 buffer:6,7, get a sample  [7]
 buffer:6,8, get a sample  [8]
 buffer:6,9, get a sample  [9]
 buffer:6    get a sample  [6]

从上面的测试图来说,有一个相对有序的概念。
Buffer_size越大,数据集较原先越无序,越小越有序。如果Buffer_size=1,输出是没有经过shuffle
【4】有啥用
举个例子,动态的RNN会在batch里面padding到同一个长度。假设数据集按照长度排序
(1)如果数据集是打乱的,那么padding会产生很多0。比如[1,6,10000],会padding到10000
(2)如果数据集是绝对有序的,尽管会有最小的padding长度,但模型输入的顺序是固定的,模型泛化性减弱
(3)如果数据集是相对有序的,那么既可以减少padding的长度,又能使得数据打乱。因而buffer size的大小控制着数据集相对有序的程度。

当然,作用不止这个,仅仅是一个例子

你可能感兴趣的:(Dataset)