2017-08-29 846 views
7

看來,如果一個MonitoredTrainingSession第一次調用之前做一些操作(記錄?)到.RUN(..),這意味着當我這樣做:tf.train.MonitoredTrainingSession並重新初始化的迭代器從數據集

train_data = reader.traindata() # returns a tf.contrib.data.Dataset 
it = tf.contrib.data.Iterator.from_structure(train_data.output_types, train_data.output_shapes) 
init_train = it.make_initializer(train_data) 
ne = it.get_next() 
ts = tf.train.MonitoredTrainingSession(checkpoint_dir=save_path) 

... no calls to ts.run ... 

ts.run(init_train) 

這產生了錯誤:

FailedPreconditionError (see above for traceback): GetNext() failed because the iterator has not been initialized. Ensure that you have run the initializer operation for this iterator before getting the next element 

所以接縫彷彿MonitoredTrainingSession運行操作我喂之前做一些操作,使其無法togeather從數據集一個重新初始化的迭代器使用。

我相信我失去了一些東西,很想聽聽:-)​​

+0

部分地回覆我,我設法通過各種各樣的變通方法: .ts._coordinated_creator.tf_sess.run(init_train ) 但這非常感覺像是一個黑客,而不是一個推薦的方法? –

回答

5

貌似沒有直接的解決方案但在Tensorflow。是的,奇怪的是他們沒有完全支持Dataset API。

原因是受監視的會話在從檢查點加載時跳過運行init_op。因此Iterator初始化器應該是一個局部變量。

目前變通的建議在這個問題上給出 - https://github.com/tensorflow/tensorflow/issues/12859

scaffold = tf.train.Scaffold(local_init_op=tf.group(tf.local_variables_initializer(), 
            init_train)) 
with tf.train.MonitoredTrainingSession(scaffold=scaffold, 
             checkpoint_dir=checkpoint_dir) as sess: 
    while not sess.should_stop(): 
     sess.run(train_op)