2017-11-22 3 views
2

トレーニング中に検証セットを評価するには、DatasetIteratorを使用します。私は1つ(またはいくつか)の検証バッチを毎回評価したいと思います。今は毎回ではなく、エポックです。同時トレーニングと検証のための再初期化可能イテレータ

しかし、再初期化可能なイテレータは、入力を切り替えるために再初期化されたときに再び開始されます。例えば。

import tensorflow as tf 

dataset_trn = tf.data.Dataset.range(10) 
dataset_tst = tf.data.Dataset.range(10).map(lambda i: i + 1000) 
iterator = tf.data.Iterator.from_structure(dataset_trn.output_types, 
    dataset_trn.output_shapes) 
batch = iterator.get_next() 
trn_init_op = iterator.make_initializer(dataset_trn) 
tst_init_op = iterator.make_initializer(dataset_tst) 

sess = tf.InteractiveSession() 

for _ in range(2): 
    sess.run(trn_init_op) 
    for _ in range(5): 
    print(batch.eval()) 

    sess.run(tst_init_op) 
    print(batch.eval()) 

戻り

0 
1 
2 
3 
4 
1000 
0 
1 
2 
3 
4 
1000 

が、私はそれがそのようなトレーニングを再開したいと思います:

0 
1 
2 
3 
4 
1000 
5 
6 
7 
8 
9 
1001 

は、これを達成する方法はありますか?実際には、バッチはシャッフルされており、同じ疑似ランダムポイントで再開したいと考えています。

答えて

2

Feedable iteratorsは助けてください。でも、それはうまく動作しません。プレースホルダと文字列ハンドルを作成する必要があります。

dataset_trn = tf.data.Dataset.range(10) 
dataset_tst = tf.data.Dataset.range(10).map(lambda i: i + 1000) 

holder = tf.placeholder(tf.string, shape=[]) 
iterator = tf.data.Iterator.from_string_handle(
    holder, dataset_trn.output_types, dataset_trn.output_shapes) 
batch = iterator.get_next() 

trn_iter = dataset_trn.make_one_shot_iterator() 
trn_handle = trn_iter.string_handle() 

tst_iter = dataset_tst.make_one_shot_iterator() 
tst_handle = tst_iter.string_handle() 

with tf.Session() as sess: 
    for _ in range(2): 

    trn_string = sess.run(trn_handle) 
    tst_string = sess.run(tst_handle) 

    for _ in range(5): 
     print(sess.run(batch, feed_dict={holder: trn_string})) 

    print(sess.run(batch, feed_dict={holder: tst_string})) 
関連する問題