第一次运行后,读取Tensorflow记录文件不起作用

第一次运行后,读取Tensorflow记录文件不起作用,tensorflow,Tensorflow,我有一小段代码从一些TFRecord文件中读取数据。如果我从ipython笔记本上运行代码,那么在我第一次执行块时,它就可以正常工作。但是,如果在不重新启动内核的情况下再次尝试执行同一代码块,则会产生错误(错误:StatusNotOK:Not found:FetchOutputs node DecodeRaw_2:0:Not found)。代码如下所示。我是否需要关闭/清除/重新初始化某些内容才能使代码正确运行多次 filename_queue = tf.train.string_input_p

我有一小段代码从一些TFRecord文件中读取数据。如果我从ipython笔记本上运行代码,那么在我第一次执行块时,它就可以正常工作。但是,如果在不重新启动内核的情况下再次尝试执行同一代码块,则会产生错误(错误:StatusNotOK:Not found:FetchOutputs node DecodeRaw_2:0:Not found)。代码如下所示。我是否需要关闭/清除/重新初始化某些内容才能使代码正确运行多次

filename_queue = tf.train.string_input_producer(filename_list)
init = tf.initialize_all_variables()
image = []
label = []
with tf.Session() as sess:
    sess.run(init)

    coord = tf.train.Coordinator()
    threads = tf.train.start_queue_runners(sess=sess, coord=coord)

    tf_image, tf_label = read_and_decode(filename_queue)
    for i in range(len(filename_list)):
        image.append(sess.run(tf_image))
        label.append(sess.run(tf_label))

    coord.request_stop()
    coord.join(threads)

请注意,默认情况下,read_和_decode()取自。命令使用新名称附加到默认图形。在第二次运行代码段之前,可以使用tf.reset\u default\u graph()清除默认图形。

默认情况下为tf。命令使用新名称附加到默认图形。在第二次运行代码段之前,可以使用tf.reset\u default\u graph()清除默认图形。

问题代码中存在一些问题

  • 首先,所有的操作都被添加到同一个图中。这意味着当您调用(或运行op)时,会话将执行与您运行此代码段的次数成比例的工作。您可以在对该代码的调用之间进行调用,但隔离内容的更干净方法可能是每次声明一个单独的图:

    with tf.Graph().as_default():  # Declares a new graph for the life of the block.
        filename_queue = tf.train.string_input_producer(filename_list)
        init = tf.initialize_all_variables()
        image = []
        label = []
        with tf.Session() as sess:
            # ...
            coord.join(threads)
    
  • 第二个问题是,分别调用
    sess.run(tf\u image)
    sess.run(tf\u label)
    意味着图像和标签之间的关联丢失。调用
    sess.run(tf_-image)
    时,您从读卡器中获取图像和标签,但丢弃标签(反之亦然,对于
    sess.run(tf_-label)
    。正确的解决方案是在同一步骤中获取它们:

    image_val, label_val = sess.run([tf_image, tf_label])
    image.append(image_val)
    label.append(label_val)
    
  • 即使重置了图形,也可能导致问题的最后一个问题是,代码在调用
    tf.train.start\u queue\u runners()后将节点添加到图形中
    。TensorFlow图上可能存在数据争用,因为它会向图中添加节点,而并行队列运行程序会同时读取它,
    tf.graph
    不是线程安全的

    处理此问题的最佳方法是在启动队列运行程序之前定义所有图形:

    with tf.Graph().as_default():
        filename_queue = tf.train.string_input_producer(filename_list)
        image = []
        label = []
        tf_image, tf_label = read_and_decode(filename_queue)
    
        with tf.Session() as sess:
           coord = tf.train.Coordinator()
           threads = tf.train.start_queue_runners(sess=sess, coord=coord)
    
           for i in range(len(filename_list)):
               image_val, label_val = sess.run([tf_image, tf_label])
               image.append(image_val)
               label.append(label_val)
    
           coord.request_stop()
           coord.join(threads)
    

  • 问题代码中有几个问题

  • 首先,所有操作都被添加到同一个图中。这意味着当您调用(或运行操作)时会话将执行与您运行此代码段的次数成比例的工作。您可以在调用此代码之间调用,但隔离内容的更简洁方法可能是每次声明一个单独的图:

    with tf.Graph().as_default():  # Declares a new graph for the life of the block.
        filename_queue = tf.train.string_input_producer(filename_list)
        init = tf.initialize_all_variables()
        image = []
        label = []
        with tf.Session() as sess:
            # ...
            coord.join(threads)
    
  • 第二个问题是,分别调用
    sess.run(tf\u image)
    sess.run(tf\u label)
    意味着图像和标签之间的关联丢失。当调用
    sess.run(tf\u image)
    时,您从读卡器中使用图像和标签,但丢弃标签(反之亦然,调用
    sess.run(tf\u label)
    。正确的解决方案是在同一步骤中获取它们:

    image_val, label_val = sess.run([tf_image, tf_label])
    image.append(image_val)
    label.append(label_val)
    
  • 即使重置了图形,也可能导致问题的最后一个问题是,代码在调用
    tf.train.start\u queue\u runners()后将节点添加到图形中
    。TensorFlow图上可能存在数据争用,因为它会向图中添加节点,而并行队列运行程序会同时读取它,
    tf.graph
    不是线程安全的

    处理此问题的最佳方法是在启动队列运行程序之前定义所有图形:

    with tf.Graph().as_default():
        filename_queue = tf.train.string_input_producer(filename_list)
        image = []
        label = []
        tf_image, tf_label = read_and_decode(filename_queue)
    
        with tf.Session() as sess:
           coord = tf.train.Coordinator()
           threads = tf.train.start_queue_runners(sess=sess, coord=coord)
    
           for i in range(len(filename_list)):
               image_val, label_val = sess.run([tf_image, tf_label])
               image.append(image_val)
               label.append(label_val)
    
           coord.request_stop()
           coord.join(threads)
    

  • 在第二次运行代码段之前,请尝试
    tf.reset\u default\u graph()
    。感谢您的快速响应。尝试
    tf.reset\u default\u graph())
    在第二次运行代码片段之前,它成功了!感谢您的快速响应。非常棒的答案!感谢您的详细评论。我学到了很多!非常棒的答案!感谢您的详细评论。我学到了很多!