使用tf.train.match_filenames_once()时报错FailedPreconditionError: Attempting to use uninitialized value X

来源:互联网 发布:mac系统qq如何远程 编辑:程序博客网 时间:2024/05/29 19:41
import tensorflow as tf


#使用tf.train.match_filenames_once函数获取文件列表
files=tf.train.match_filenames_once("data.tfrecords-*")


#通过tf.train.string_input_producer函数创建输入队列,输入队列中的文件列表为
#tf.train.mach_filenames_once函数获取的文件列表。这里将shuffle参数设为False
#来避免随机打乱读文件的顺序。但一般在解决问题是,会将shuffle参数设置为True
filename_queue=tf.train.string_input_producer(files,shuffle=False)


reader=tf.TFRecordReader()
_,serialized_example=reader.read(filename_queue)
features=tf.parse_single_example(
        serialized_example,
        features={
                'i':tf.FixedLenFeature([],tf.int64),
                'j':tf.FixedLenFeature([],tf.int64),
                })


#init=(tf.global_variables_initializer(),tf.local_variables_initializer()) #收集全局变量和局部变量
#init=tf.local_variables_initializer() #收集全局变量
#init=tf.local_variables_initializer() #收集局部变量


with tf.Session() as sess:
    #虽然在本段程序中没有声明任何变量,但使用tf.train.match_filenames_once函数时
    #需要初始化一些变量
    
    #sess.run(tf.local_variables_initializer())
    sess.run(tf.global_variables_initializer())
    #sess.run(init)
    print(sess.run(files))
    
    #声明tf.train.Coordinator类来协同不同线程,并启动线程
    coord=tf.train.Coordinator()
    threads=tf.train.start_queue_runners(sess=sess,coord=coord)
    
    #多次执行获取数据的操作
    for i in range(6):
        print(sess.run([features['i'],features['j']]))
        coord.request_stop()
        coord.join(threads)

运行以后就会报错FailedPreconditionError: Attempting to use uninitialized value matching_filenames_9



解决方法: 因为此例只有一个局部变量,所以把sess.run(tf.global_variables_initializer())换成sess.run(tf.local_variables_initializer())即可



原代码为《Tensorflow:实战Google深度学习框架》中7.3.2节中的代码

变量未初始化,原因global_variables_initiaiizer()函数仅初始化了全局变量,而local_variables_initializer()则仅初始化局部变量,而train.match_filenames_once()返回的文件列表作为临时变量并没有保存到checkpoint,所以并不会作为全局变量被global_variables_initializer()函数初始化,所以sess.run(files)时,files文件实则并没有被初始化,进而导致报错。


参考https://stackoverflow.com/questions/44143139/tensorflow-operation-tf-train-match-filenames-once-not-working#

跟我的问题完美吻合

本质问题实则是global_variables_initializer()和local_variables_initializer()的区别

参考https://stackoverflow.com/questions/40220201/tensorflow-tf-initialize-all-variables-vs-tf-initialize-local-variables


阅读全文
0 0