无法使用简单的TFRecord阅读器

时间:2017-01-05 15:06:52

标签: python tensorflow protocol-buffers

我想让一个非常简单的TFRecord读者工作,但无济于事。 (我可以让作家工作得很好)。

this github repo开始,有一个reader.py文件,它看起来像这样:

import tensorflow as tf
import numpy as np
import time
from PIL import Image

def read_and_decode(filename_queue):
    reader = tf.TFRecordReader()
    _, serialized_example = reader.read(filename_queue)
    features = tf.parse_single_example(
            serialized_example,
            # Defaults are not specified since both keys are required.
            features={
                    'height':tf.FixedLenFeature([], tf.int64),
                    'image_raw': tf.FixedLenFeature([], tf.string),
                    'label': tf.FixedLenFeature([], tf.int64)
            })
    image = tf.decode_raw(features['image_raw'], tf.uint8)
    image = tf.reshape(image,[478, 717, 3])
    image = tf.cast(image, tf.float32) * (1. / 255) - 0.5
    label = tf.cast(features['label'], tf.int32)
    return image


'''
Pointers:   Remember to run init_op
            tf.reshape may not be the ideal way.
'''
def run():
    with tf.Graph().as_default():
        filename_queue = tf.train.string_input_producer(["sample.tfrecords"],num_epochs=1)
        images = read_and_decode(filename_queue)
        image_shape = tf.shape(images)
        init_op = tf.initialize_all_variables()
        with tf.Session() as sess:
            sess.run(init_op)
            coord = tf.train.Coordinator()
            threads = tf.train.start_queue_runners(coord=coord)
            img = sess.run([images])
            coord.request_stop()
            coord.join(threads)
run()

问题是,当我运行它时,我收到以下错误:

enter image description here

所以,我在最后一天一直在敲打着我。我不知道该怎么做,甚至不知道为什么它不起作用。这似乎是一个简单的例子,应该没有问题。我正在使用TF010。

由于

2 个答案:

答案 0 :(得分:1)

问题可能不在于TFRecords,而是在设置num_epochs时使用了LOCAL_VARIABLES集合的string_input_producer。请参阅here

操作tf.initialize_all_variables()未初始化所有变量,顾名思义。作为快速解决方法,请使用以下命令:

init_op = tf.group(tf.initialize_all_variables(), tf.initialize_local_variables())

,但请考虑转到Tensorflow r0.12,其中弃用此操作,转而使用tf.global_variables_initializertf.local_variables_initializer

答案 1 :(得分:1)

在较新版本的TensorFlow中:

  

tf.initialize_all_variables()已被弃用。

他们提到你必须使用:

  

tf.global_variables_initializer()

这并没有解决问题。如果我们查看tf.train.string_input_producer()的较新API,它会提到num_epochs将被创建为局部变量。这里发生的事情是队列中没有任何内容可供阅读,因此它说请求1个当前0.只需添加:

  

tf.local_variables_initializer()

我推动了更新。