2017-04-24 96 views
0

我有以下代碼:隊列爲空

import tensorflow as tf 

xs = tf.random_normal([5, 2]) 
ys = xs[:, 0] + xs[:, 1] + tf.random_normal([5], stddev=0.01) 

xs_inp, ys_inp = tf.train.slice_input_producer([xs, ys], num_epochs=20) 

coord = tf.train.Coordinator() 

with tf.Session() as sess: 
    threads = tf.train.start_queue_runners(coord=coord) 
    for i in range(100): 
     print(sess.run([xs_inp, ys_inp])) 

    coord.request_stop() 
    coord.join(threads) 

在我看來,我應該服用100對及打印出來,但程序不顯示任何信息,並拋出異常。

tensorflow.python.framework.errors_impl.OutOfRangeError: FIFOQueue '_0_input_producer/input_producer' is closed and has insufficient elements (requested 1, current size 0) 

回答

4

這是一個棘手的難題:原來,你需要添加sess.run(tf.local_variables_initializer())啓動隊列跑步前:

import tensorflow as tf 

xs = tf.random_normal([5, 2]) 
ys = xs[:, 0] + xs[:, 1] + tf.random_normal([5], stddev=0.01) 

xs_inp, ys_inp = tf.train.slice_input_producer((xs, ys), num_epochs=20) 

coord = tf.train.Coordinator() 

with tf.Session() as sess: 
    sess.run(tf.local_variables_initializer()) 
    threads = tf.train.start_queue_runners(coord=coord) 
    for i in range(100): 
     print(sess.run([xs_inp, ys_inp])) 

    coord.request_stop() 
    coord.join(threads) 

爲什麼是這個必要嗎?當您設置num_epochs=20時,TensorFlow會隱式創建一個「局部變量」,充當當前時期索引的計數器;當這個計數器達到20時,隊列將被關閉。像所有其他TensorFlow變量一樣,這個計數器必須被初始化。如果你沒有初始化它,看起來隊列選手會立即發出一個錯誤(不會打印它,不幸的是)並關閉隊列......給出你所看到的錯誤。

+0

非常感謝,你是如此的有幫助。如果沒有你,我需要幾天時間才能找出問題所在。 –