2017-11-07 2 views
6

TensorFlow 1.4 verschiebt TF-Dataset nach Kern (tf.data.Dataset) und doc/tutorial empfiehlt, tf.estimator zum Trainieren von Modellen zu verwenden.Schätzer + Dataset kann nicht verwendet werden und für weniger als eine Epoche trainiert werden

Wie jedoch am Ende von this page empfohlen, müssen das Dataset-Objekt und sein Iterator innerhalb der input_fn-Funktion instanziiert werden. Dies bedeutet, dass die Iterationen durch das Dataset bei jedem Aufruf an estimator.train(input_fn, steps) neu beginnen. Somit wird das Aufrufen der Schritte < Anzahl der Stichproben in der Epoche dazu führen, dass das Modell auf einer Teilmenge des Datensatzes trainiert wird.

Also meine Frage. Ist es möglich, so etwas wie dies mit Estimator + Datensatz zu implementieren:

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) 

ohne Training zu beginnen Proben Iterationen von Grund auf bei jedem Aufruf estimator.train(input_fn=train_input_fn, steps=valid_freq)?

Zum Beispiel, im Gegensatz zu here, instanziieren Sie das Dataset und seinen Iterator außerhalb input_fn? Ich habe es versucht, aber es funktioniert nicht, weil dann die Eingabe (vom Dataset-Iterator) und das Modell (vom Schätzer model_fn) nicht Teil desselben Graphen sind.

Dank

Verwandte Github Ausgabe: https://github.com/tensorflow/tensorflow/issues/14283

Antwort

0

Ich kenne keine Möglichkeit, das Training konsequent über Läufe von estimator.train() zu machen.

Aber was Sie tun können, ist sicherzustellen, dass Sie die train_input_fn so bauen, dass es zufällig genug ist, um den gleichen Effekt zu erhalten.


Zum Beispiel: Angenommen, Sie einen Datensatz von Werten [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] und Sie können bei jedem Aufruf von estimator.train auf die Hälfte des Datensatzes nur trainieren.
Wenn Sie nicht gut genug, mischen, werden Sie mit dem Training auf Werte halten [0, 1, 2, 3, 4]:

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)) 

Wenn Sie jedoch tf.data.Dataset.shuffle() mit einem buffer_size mindestens so groß wie die Datenmenge aufrufen, werden Sie zufällig erhalten Werte. Ein mehrfacher Anruf mit estimator.train entspricht dem einmaligen Aufruf mit mehreren Epochen.

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)) 

schrieb ich eine andere Antwort auf die Bedeutung von buffer_sizehere zu erklären.

Verwandte Themen