sess.run()读取数据卡住,死循环

sess.run()读取数据死循环,卡住

这个问题困扰了我好几天,要读取tfrecord文件里面存储的二进制数据,发现用sess.run去读取tensor张量的值时候,一直卡住,一开始以为可能数据量较大,卡住了,但是等了三四分钟发现还是没有反应

第一种情况

数据量计算太大,需要加上线程,在with tf.Session() as sess: 下加上一下代码,开启线程

coord=tf.compat.v1.train.Coordinator()
threads=tf.compat.v1.train.start_queue_runners(coord=coord)
第二种情况

在我加上线程代码后,发现还是死循环卡住,下面是代码:

def read_and_decode():
    file1='data.tfrecords'
    data1=tf.compat.v1.train.string_input_producer([file1])
    reader=tf.compat.v1.TFRecordReader()
    _,serialized_example=reader.read(data1)
    feature=tf.compat.v1.parse_single_example(serialized_example,
                                              features={
                                                  'label':tf.compat.v1.FixedLenFeature([],tf.int64),
                                                  'img_row':tf.compat.v1.FixedLenFeature([],tf.string)
                                              })
    image=tf.compat.v1.decode_raw(feature['img_row'],tf.uint8)
    image=tf.reshape(image,[128,128,3])
    label=tf.compat.v1.cast(feature['label'],tf.int64)
    with tf.compat.v1.Session() as sess:
        init=tf.compat.v1.global_variables_initializer()
        sess.run(init)  
        coord=tf.compat.v1.train.Coordinator()
        threads=tf.compat.v1.train.start_queue_runners(coord=coord)
        for i in range(2):
            example,I=sess.run([image,label])    //发生卡住
            img=Image.fromarray(example,'RGB')
            img.save(str(i)+'.jpg')
            print(example,I)

我开始debug了下,发现sess.run 发生死循环,运行到后面一直在两个函数互相跳跃,首先sess.run([image,label]),image,label是两个张量,sess.run两个tensor量是负责取值,在后台debug后发现卡住的原因是tensor向量里面为空值,就是image和label都为空,追溯到上面,这两个量是从feature里面得到后进行处理的,开始用sess.run()去读取feature的数组值(在TensorFlow中,你不能用print去输出tensor的值,print只会输出它的数据类型,并不会输出tensor张量的值,所以只能用print(sess.run()) ),发现还是死循环,说明feature读取数据失败,为空,继续往上,用sess.run去输出serialized_example,发现还是空,那么只有一点,你文件为空,跑到对应的tfrecord文件里一看尽为空文件,这才发现问题所在

我以为只要运行一次保存tfrecord文件的函数就可以了,该文件就永久保存了,不用一直去调用函数让其重复保存,然后以后直接就运行对tfrecord文件操作的函数就够了,但是每次再一次运行,tfrecord文件就会清空,所以sess.run死循环就两个原因 1.没有加上线程控制 2.sess.run所要读取的数据即tensor张量为空,他就会陷入死循环,发生卡住的现象

上一篇:true_fn和false_fn输出的dtype类型不一致怎么办


下一篇:深度学习进度08(卷积神经网络实现cnn实现手写数字识别)