2017-08-30 22 views
2

我正在嘗試使用the from_generator interface for the Dataset API將多個「輪次」輸入注入圖表。在使用數據集時重置OutOfRangeError後的Tensorflow圖表

在我的first attempt上,我使用了repeat() function來使發生器連續運行3次。然而,批次大小爲而非的批次大小爲每輪迭代次數的偶數倍(批次大小爲3的10次迭代),來自不同「回合」/「時期」的數據最終在同一批次中(取決於張量的處理順序;圖中有一些並行性)。

在我的second attempt上,我試圖在每個紀元完成後重新運行迭代器。但是,只要tf.errors.OutOfRangeError is thrown,所有後續調用sess.run() on the output of the batch call再次拋出OutOfRangeError,即使在rerunning the iterator's initializer之後。

我想連續注入多輪輸入到一個圖中,而不是像第一個例子那樣重疊(例如在批處理選項上使用allow_smaller_final_batch)。我在自定義Tensorflow分叉中實例化的一些內核在重新啓動時非常昂貴, mmap一個O(10GB)的文件,所以我想以某種方式獲得這兩個世界的最好。

+0

請添加一個可運行的小樣本,顯示您的輸入管道,這樣我們就可以重現您的問題 – GPhilo

+0

這應該可以使用Tensorflow存儲庫的master分支運行,這是數據集的from_iterator函數所需的。如果這個例子不適用於該版本,我可以修復它。 –

回答

2

我認爲問題源於使用tf.contrib.data.Dataset(支持重新初始化)和tf.train.batch_join()(它使用TensorFlow隊列和隊列運行器,因此不支持重新初始化)。

我不完全清楚你的代碼在做什麼,但我認爲你可以實現整個管道作爲Dataset。替換下面的代碼片段:

my_iterator = MyIterator(iterations=iterations) 
dataset = ds.Dataset.from_generator(my_iterator, 
output_types=my_iterator.output_types, 
output_shapes=my_iterator.output_shapes) 
#dataset = dataset.repeat(count=repetitions) 
iterator = dataset.make_initializable_iterator() 
next_elem = iterator.get_next() 

#change constant to 1 or 2 or something to see that the batching is more predictable 
ripple_adds = [(tf.stack((next_elem[0], next_elem[1] + constant)),) 
for constant in ripple_add_coefficients] 
batch = tf.train.batch_join(ripple_adds, batch_size=batch_size, 
enqueue_many=False, name="sink_queue") 

...的東西,如下列:

my_iterator = MyIterator(iterations=iterations) 
dataset = tf.contrib.data.from_generator(my_iterator, 
             output_types=my_iterator.output_types, 
             output_shapes=my_iterator.output_shapes) 

def ripple_add_map_func(x, y): 
    return (tf.contrib.data.Dataset.range(num_ripples) 
      .map(lambda r: tf.stack([x, y + r]))) 

dataset = dataset.flat_map(ripple_add_map_func).batch(batch_size) 

iterator = dataset.make_initializable_iterator() 
batch = iterator.get_next() 
相關問題