2017-08-29 13 views
7

Dường như nếu một MonitoredTrainingSession làm một số hoạt động (khai thác gỗ?) Trước khi cuộc gọi đầu tiên .run (..), có nghĩa là khi tôi làm:tf.train.MonitoredTrainingSession và iterator reinitializable từ Dataset

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) 

này mang lại các lỗi:

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 

vì vậy, nó seams như nếu MonitoredTrainingSession được thực hiện một số hoạt động trước khi chạy hoạt động tôi nuôi nó, làm cho nó không thể sử dụng togeather với một iterator reinitializable từ Dataset.

Tôi chắc chắn rằng tôi đang thiếu thứ gì đó và muốn nghe những gì :-)

+0

Để phần nào trả lời cho bản thân mình, tôi đã cố gắng để làm việc xung quanh nó bằng cách sử dụng: .ts._coordinated_creator.tf_sess.run (init_train) Nhưng điều này rất giống như một hack và không phải là một cách tiếp cận được đề nghị? –

Trả lời

5

Có vẻ như chưa có giải pháp trực tiếp nào trong Tensorflow. Vâng, thật lạ khi họ không hỗ trợ đầy đủ cho Dataset API.

Lý do là phiên được theo dõi bỏ qua để chạy init_op khi tải từ điểm kiểm tra. Do đó bộ khởi tạo Iterator phải là một biến cục bộ.

Những đề nghị công việc xung quanh hiện tại được đưa ra trong vấn đề này - 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)