【问题标题】:TensorFlow shuffle_batch not workingTensorFlow shuffle_batch 不起作用
【发布时间】:2018-05-12 08:50:51
【问题描述】:
import tensorflow as tf
sess = tf.Session()

def add_to_batch(image):

    print('Adding to batch')
    image_batch = tf.train.shuffle_batch([image],batch_size=5,capacity=11,min_after_dequeue=1,num_threads=1)

    # Add to summary
    tf.image_summary('images',image_batch)

    return image_batch

def get_batch():

    # Create filename queue of images to read
    filenames = [('/media/jessica/Jessica/TensorFlow/Practice/unlabeled_data_%d.png' % i) for i in range(11)]
    filename_queue = tf.train.string_input_producer(filenames)
    reader = tf.WholeFileReader()
    key, value = reader.read(filename_queue)

    # Read and process image
    my_image = tf.image.decode_png(value)
    my_image_float = tf.cast(my_image,tf.float32)
    image_mean = tf.reduce_mean(my_image_float)
    my_noise = tf.random_normal([96,96,3],mean=image_mean)
    my_image_noisy = my_image_float + my_noise
    print('Reading images')

    return add_to_batch(my_image_noisy)

def main ():

    sess.run(tf.initialize_all_variables())
    tf.train.start_queue_runners(sess=sess)
    writer = tf.train.SummaryWriter('/media/jessica/Jessica/TensorFlow/Practice/summary_logs', graph_def=sess.graph_def)
    merged = tf.merge_all_summaries()
    images = get_batch()
    summary_str = sess.run(merged)
    writer.add_summary(summary_str)

嗨,

我正在尝试在 TensorFlow 中构建一个简单的神经网络。我正在尝试分批加载我的输入图像。现在我正在使用 11 张图片和 batch_size = 5 测试代码。最终我将使用 100000 张图片。

这段代码是从 TensorFlow 的 cifar10.py 示例修改而来的。出于某种原因,我的代码在tf.train.shuffle_batch([image],batch_size=5,capacity=1,min_after_dequeue=1,num_threads=1)

停止(不会终止,它只是挂在那里)

我尝试了不同的 batch_size、容量、min_after_dequeue 等组合,但我仍然不知道出了什么问题。

任何帮助将不胜感激!谢谢!

【问题讨论】:

  • 我编辑了您的代码以修复缩进(否则 Python 解释器不会接受它)。如果有错误请告诉我!

标签: tensorflow


【解决方案1】:

看起来问题的出现是因为声明

tf.train.start_queue_runners(sess=sess)

...在创建任何队列运行器之前执行。如果将此行移到images = get_batch() 之后,您的程序应该可以运行。

这里有什么问题? tf.train.shuffle_batch() 函数在内部使用 tf.RandomShuffleQueue 来生成随机批次。目前,将元素放入该队列的唯一方法是运行一个调用q.enqueue() 操作的步骤。为了使这更容易,TensorFlow 有一个 "queue runners" 的概念,在您构建图形时会隐式收集这些概念,然后从调用 tf.train.start_queue_runners() 开始。但是,调用 tf.train.start_queue_runners() 只会启动当时已定义的队列运行器,因此它必须在创建队列运行器的代码之后

【讨论】:

    猜你喜欢
    • 2017-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-10
    • 2018-11-23
    • 1970-01-01
    相关资源
    最近更新 更多