2016-09-14 60 views
1

批处理看起来比feed_dicts更清洁,所以我想了解Tensorflow中的批处理。Tensorflow批处理参数

下面的代码块是否会在批处理中创建32个相同的图像,然后将其送入队列?

# 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) 

一点上下文:我目前有一个文件包含大约5万行。我使用tf.train.string_input_producertf.decode_csv来读取CSV行,但很困惑,如何提供给tf.train.shuffle_batch作为参数,各行或包含从文件读取的所有行的张量。

回答

1

在您的问题的代码片段中,张量single_imagesingle_label对应于一个图像及其相关标签。从tf.train.shuffle_batch(),image_batch和返回的张量对应于32个可能* - 不同图像打包在一起,以及32个相关标签。 TensorFlow在内部使用tf.RandomShuffleQueue来洗牌数据,并创建其他线程来评估single_imagesingle_label,以便将它们添加到此队列中。

tf.train.shuffle_batch()函数根据传递的参数不同的行为。例如,如果您通过enqueue_many=True,则参数tensors中的张量将被解释为批次元素,并且TensorFlow将在前导维上加入它们(因此每个张量在第0维中必须具有相同的大小)。使用enqueue_many=True您可以将整个数据集传递给tf.train.shuffle_batch(),或者可以传递批量元素(例如使用tf.ReaderBase.read_up_to())。


  *我说:“可能,不同的”,因为你正在使用的批号等功能洗牌版本,如果你的数据集相比capacitymin_after_dequeue参数小,很可能你会看到单个批次中同一个示例的多个副本。

+0

感谢您的回复;我仍然对'tf.train.shuffle_batch()'从哪里绘制32个不同的图像感到困惑。在原始文章的代码片段中,根据提供给'tf.train.shuffle_batch()'的参数判断,我没有看到它能够访问'single_image'之外的数据。 – Eweler

+1

会发生什么事是,TensorFlow评估'single_image'和'single_label'多次(在一个单独的线程,通过'tf.train.start_queue_runners()'创建),并增加了这些来这里面'tf.train.shuffle_batch创建队列( )'。因此,如果'single_image'和'single_label'在每次评估时都有不同的值(例如,因为它们是'ReaderBase.read()'op)的结果),那么结果中会得到不同的图像。如果'single_image'总是评估为相同的值(例如,因为它是一个常量),那么您将获得同一图像的32份副本。 – mrry