batch(batch_size)和shuffle(buffer_size)

法玮
2023-12-01

问题描述:

#批量化和打乱数据

train_dataset=tf.data.Dataset.from_tensor_slices(train_images).shuffle(BUFFER_SIZE).batch(BATCH_SIZE)

最近在学tensorflow2.0碰到这条语句,不知道怎么理解。查了一些资料,记录下来!下面先来说说batch(batch_size)和shuffle(buffer_size)

1.batch(batch_size)

直接先上代码:

import tensorflow as tf
import numpy as np
dataset = tf.data.Dataset.from_tensor_slices(np.array([1, 2, 3, 4, 5, 6,
                                                       7,8,9,10,11,12,13,14,15,16]))
#有序的
batch_dataset=dataset.batch(4)
for ele in batch_dataset:
    print(ele)

输出:

tf.Tensor([1 2 3 4], shape=(4,), dtype=int32)
tf.Tensor([5 6 7 8], shape=(4,), dtype=int32)
tf.Tensor([ 9 10 11 12], shape=(4,), dtype=int32)
tf.Tensor([13 14 15 16], shape=(4,), dtype=int32)

这里batch就是从dataset中按顺序分成4个批次,仔细看可以知道上面所有输出结果都是有序的,这在机器学习中用来训练模型是浪费资源且没有意义的,所以我们需要将数据打乱,这样每批次训练的时候所用到的数据集是不一样的,这样啊可以提高模型训练效果。下面介绍shuffle()来解决这个问题

2.shuffle(buffer_size)

shuffle就是从数据集中随机抽取buffer_size个数据,再冲buffer_size输出其中1个数据项item,item并不只是单单一条真实数据,如果有batch size,则一条数据项item包含了batch size条真实数据。参考:https://zhuanlan.zhihu.com/p/42417456

import tensorflow as tf
import numpy as np
shuffle_dataset=dataset.shuffle(4)
for i in shuffle_dataset:
    print(i)

输出:

tf.Tensor(1, shape=(), dtype=int32)
tf.Tensor(4, shape=(), dtype=int32)
tf.Tensor(3, shape=(), dtype=int32)
tf.Tensor(5, shape=(), dtype=int32)
tf.Tensor(7, shape=(), dtype=int32)
tf.Tensor(2, shape=(), dtype=int32)
tf.Tensor(8, shape=(), dtype=int32)
tf.Tensor(6, shape=(), dtype=int32)
tf.Tensor(12, shape=(), dtype=int32)
tf.Tensor(9, shape=(), dtype=int32)
tf.Tensor(14, shape=(), dtype=int32)
tf.Tensor(15, shape=(), dtype=int32)
tf.Tensor(11, shape=(), dtype=int32)
tf.Tensor(13, shape=(), dtype=int32)
tf.Tensor(10, shape=(), dtype=int32)
tf.Tensor(16, shape=(), dtype=int32)

3.shuffle(buffer_size)+batch(batch_size)

现在回到文章开头的地方,shuffle+batch是怎么样的呢?先上代码:

import tensorflow as tf
import numpy as np
dataset = tf.data.Dataset.from_tensor_slices(np.array([1, 2, 3, 4, 5, 6,
                                                       7,8,9,10,11,12,13,14,15,16]))
                                                       dataset2=dataset.shuffle(16).batch(2)
for j in dataset2:
    print(j)

输出:

tf.Tensor([ 1 16], shape=(2,), dtype=int32)
tf.Tensor([13 7], shape=(2,), dtype=int32)
tf.Tensor([ 3 10], shape=(2,), dtype=int32)
tf.Tensor([14 15], shape=(2,), dtype=int32)
tf.Tensor([2 8], shape=(2,), dtype=int32)
tf.Tensor([ 4 12], shape=(2,), dtype=int32)
tf.Tensor([6 5], shape=(2,), dtype=int32)
tf.Tensor([ 9 11], shape=(2,), dtype=int32)

在这里buffer_size:该函数的作用就是先构建buffer,大小为buffer_size,然后从dataset中提取数据将它填满。batch操作,从buffer中提取。如果buffer_size小于Dataset的大小,每次提取buffer中的数据,会再次从Dataset中抽取数据将它填满(当然是之前没有抽过的)。所以一般最好的方式是buffer_size=Dataset_size。

参考:
https://www.cnblogs.com/marsggbo/p/9603789.html
https://blog.csdn.net/m0_37663944/article/details/103842670

 类似资料: