2017-11-07 6 views
6

TensorFlow 1.4はTFデータセットをコア(tf.data.Dataset)に移動し、doc/tutorialはtf.estimatorを使用してモデルをトレーニングすることを推奨します。エフェクト+データセットと列車が1エポジト秒未満で使用できない

ただし、this pageの最後に推奨されているように、Datasetオブジェクトとそのイテレータはinput_fn関数内でインスタンス化する必要があります。これは、estimator.train(input_fn, steps)への呼び出しごとに、データセットによる反復処理が開始されることを意味します。したがって、呼び出すステップは、エポックのサンプル数が<であり、データセットのサブセットでモデルをトレーニングすることにつながります。

私の質問です。 estimator.train(input_fn=train_input_fn, steps=valid_freq)への各呼び出しでゼロから学習サンプルの繰り返しを起動せずに

for i in range(num_epochs): 
    # Train for some steps 
    estimator.train(input_fn=train_input_fn, steps=valid_freq) 

    validation_iterator. 
    # Evaluate on the validation set (steps=None, we evaluate on the full validation set) 
    estimator.evaluate(input_fn=valid_input_fn) 

:それは見積もり+データセットを使用してこのような何かを実装することは可能ですか?

たとえば、hereとは異なり、データセットとそのイテレータをinput_fnの外部にインスタンス化しますか?私は試しましたが、データセットイテレータからの入力と推定モデルmodel_fnからのモデルは同じグラフの一部ではないため、動作しません。

おかげ

関連githubの問題:https://github.com/tensorflow/tensorflow/issues/14283

答えて

0

私はestimator.train()の実行間訓練の一貫性を保つためにどのような方法を知りません。

ただし、同じ効果を得るには十分にランダムになるようにtrain_input_fnを作成することをお勧めします。例えば


あなたが値[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]のデータセットを持っているし、あなただけestimator.trainの各呼び出しで半分のデータセットに訓練することができたとします。
あなたが十分をシャッフルしていない場合は、値[0, 1, 2, 3, 4]に関する研修を維持します:あなたがデータセットと少なくとも同じ大きbuffer_sizetf.data.Dataset.shuffle()を呼び出した場合、あなたがランダムになります、

train_size = 10 
dataset = tf.data.Dataset.range(train_size) 
x = dataset.make_one_shot_iterator().get_next() 

sess = tf.Session() 
for i in range(train_size // 2): 
    print(sess.run(x)) 

しかし、値。 estimator.trainを複数回呼び出すことは、複数のエポックで1回呼び出すことと同等です。

train_size = 10 
dataset = tf.data.Dataset.range(train_size) 
dataset = dataset.shuffle(buffer_size=train_size) 
x = dataset.make_one_shot_iterator().get_next() 

sess = tf.Session() 
for i in range(train_size // 2): 
    print(sess.run(x)) 

私はbuffer_sizehereの重要性を説明するために別の答えを書きました。

関連する問題