关于使用tf.train.shuffle_batch()创建批次

use*_*609 17 tensorflow

Tensorflow教程中,它提供了以下有关以下示例tf.train.shuffle_batch():

# Creates batches of 32 images and 32 labels.
image_batch, label_batch = tf.train.shuffle_batch(
     [single_image, single_label],
     batch_size=32,
     num_threads=4,
     capacity=50000,
     min_after_dequeue=10000)
Run Code Online (Sandbox Code Playgroud)

我不太清楚capacity和的含义min_after_dequeue.在这个例子中,它被设定为5000010000分别.这种设置的逻辑是什么,或者是什么意思.如果输入有200个图像和200个标签,会发生什么?

mrr*_*rry 25

tf.train.shuffle_batch()函数使用tf.RandomShuffleQueue内部来累积批量batch_size元素,这些元素从当前队列中的元素中随机均匀地采样.

许多训练算法,例如TensorFlow用于优化神经网络的基于随机梯度下降的算法,依赖于从整个训练集中随机均匀地采样记录.但是,将整个训练集加载到内存中(以便从中进行采样)并不总是切实可行的,因此tf.train.shuffle_batch()提供了折衷方案:它使用between min_after_dequeuecapacityelements 填充内部缓冲区,并从该缓冲区中随机均匀地采样.对于许多培训过程,这可以提高模型的准确性并提供足够的随机化.

这些min_after_dequeuecapacity论点对培训绩效产生间接影响.设置较大的min_after_dequeue值会延迟训练的开始,因为TensorFlow必须在训练开始之前处理至少那么多元素.它capacity是输入管道将消耗的内存量的上限:设置太大可能导致训练过程耗尽内存(并且可能开始交换,这将损害训练吞吐量).

如果数据集只有200个图像,则可以轻松地将整个数据集加载到内存中.tf.train.shuffle_batch()效率很低,因为它会将每个图像排列并多次标记tf.RandomShuffleQueue.在这种情况下,您可能会发现使用tf.train.slice_input_producer()和执行以下操作更有效tf.train.batch():

random_image, random_label = tf.train.slice_input_producer([all_images, all_labels],
                                                           shuffle=True)

image_batch, label_batch = tf.train.batch([random_image, random_label],
                                          batch_size=32)
Run Code Online (Sandbox Code Playgroud)