Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image TensorFlow:读取队列中的图像而无需洗牌_Image_Queue_Tensorflow - Fatal编程技术网

Image TensorFlow:读取队列中的图像而无需洗牌

Image TensorFlow:读取队列中的图像而无需洗牌,image,queue,tensorflow,Image,Queue,Tensorflow,我有一个614张图片的训练集,已经被洗牌了。我想按5个批次的顺序读取图像。因为我的标签是按相同的顺序排列的,所以当读取到批中时,任何图像的混乱都会导致不正确的标签 以下是我的函数,用于读取图像并将其添加到批处理中: # To add files from queue to a batch: def add_to_batch(image): print('Adding to batch') image_batch = tf.train.batch([image],batch_si

我有一个614张图片的训练集,已经被洗牌了。我想按5个批次的顺序读取图像。因为我的标签是按相同的顺序排列的,所以当读取到批中时,任何图像的混乱都会导致不正确的标签

以下是我的函数,用于读取图像并将其添加到批处理中:

# To add files from queue to a batch:
def add_to_batch(image):

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

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

    return image_batch

# To read files in queue and process:
def get_batch():

    # Create filename queue of images to read
    filenames = [('/media/jessica/Jessica/TensorFlow/StreetView/training/original/train_%d.png' % i) for i in range(1,614)]
    filename_queue =   tf.train.string_input_producer(filenames,shuffle=False,capacity=614)
    reader = tf.WholeFileReader()
    key, value = reader.read(filename_queue)

    # Read and process image
    # Image is 500 x 275:
    my_image = tf.image.decode_png(value)
    my_image_float = tf.cast(my_image,tf.float32)
    my_image_float = tf.reshape(my_image_float,[275,500,4])

    return add_to_batch(my_image_float)
这是我执行预测的功能:

def inference(x):

    < Perform convolution, pooling etc.>

    return y_conv
这是我的主要职能:

def main ():

    # Training
    images = get_batch()
    y_conv = inference(images)
    loss = train_step(y_label,y_conv)

    # To write and merge summaries
    writer = tf.train.SummaryWriter('/media/jessica/Jessica/TensorFlow/StreetView/SummaryLogs/log_5', graph_def=sess.graph_def)
    merged = tf.merge_all_summaries()

    """ Run session """
    sess.run(tf.initialize_all_variables())
    tf.train.start_queue_runners(sess=sess)

    print "Running..."
    for step in range(5):

        # y_1 = <get the correct labels here>

        # Train
        loss_value = sess.run(train_step,feed_dict={y_label:y_1})
        print "Step %d, Loss %g"%(step,loss_value)

        # Save summary
        summary_str = sess.run(merged,feed_dict={y_label:y_1})
        writer.add_summary(summary_str,step)

    print('Finished')

if __name__ == '__main__':
  main()
当我检查我的图像摘要时,图像似乎没有顺序。或者更确切地说,正在发生的是:

图像1-5:丢弃,图像6-10:读取,图像11-15:丢弃,图像16-20:读取等

所以看起来我两次得到我的批次,扔掉第一批,使用第二批?我试过一些补救办法,但似乎都不管用。我觉得调用images=get_batch and sess.run从根本上理解了一些错误。

您的批处理操作是一个FIFOQueue,因此每次使用它的输出时,它都会提升状态

第一个session.run调用在计算train_步骤时使用图像1-5,第二个session.run请求计算图像_摘要,该摘要提取图像5-6并在可视化中使用它们

如果希望在不影响输入状态的情况下可视化内容,则可以将队列值缓存在变量中,并使用变量作为输入定义摘要,而不是依赖于实时队列

(image_batch_live,) = tf.train.batch([image],batch_size=5,num_threads=1,capacity=614)

image_batch = tf.Variable(
  tf.zeros((batch_size, image_size, image_size, color_channels)),
  trainable=False,
  name="input_values_cached")

advance_batch = tf.assign(image_batch, image_batch_live)
现在你的图像批处理是一个静态值,你可以用它来计算损失和可视化。在两个步骤之间,您可以调用sess.runadvance\u batch来推进队列


使用这种方法会产生一些小问题-默认的保护程序会将您的image\u批处理变量保存到checkpoint。如果更改批大小,则检查点恢复将失败,因为维度不匹配。要解决此问题,您需要指定手动恢复的变量列表,并为其余变量运行初始值设定项。

您使用的是什么版本的tensorflow?它能处理较少的图像吗?尝试使用batch=1Okay,因此基本上我只是错误地可视化了图像,但队列是正确的?我对图像进行可视化的唯一原因是确保队列是正确的。哈哈哈。因此,如果我删除我的tf.image_摘要,所有内容都应该正常工作,即使我无法通过可视化来验证这一点,除非我按照您上面的建议去做?非常感谢!另外一个问题,如果我调用y_conv,loss=sess.run[inference,train_step],feed_dict={y_label:y_1},那么将使用相同的image_批来计算y_conv和loss是否正确?是的,如果使用image_batch变量而不是live_image_批,那么所有计算都将使用相同的批
(image_batch_live,) = tf.train.batch([image],batch_size=5,num_threads=1,capacity=614)

image_batch = tf.Variable(
  tf.zeros((batch_size, image_size, image_size, color_channels)),
  trainable=False,
  name="input_values_cached")

advance_batch = tf.assign(image_batch, image_batch_live)