2017-11-07 89 views
6

TensorFlow 1.4 przenosi zestaw danych TF do rdzenia (tf.data.Dataset) oraz dokument/samouczek sugerują użycie tf.estimator do modelowania pociągów.Nie można użyć estymatora + zestawu danych i pociągu dla mniej niż jednej epoki.

Jednak zgodnie z zaleceniami pod koniec this page obiekt zestawu danych i jego iterator musi być utworzony w funkcji input_fn. Oznacza to, że iteracje za pośrednictwem zbioru danych będą zaczynać się od nowa dla każdego połączenia z estimator.train(input_fn, steps). Tak więc wywoływanie jest z krokami < liczba próbek w epoce, doprowadzi do wyszkolenia modelu w podzbiorze zbioru danych.

Tak więc moje pytanie. Czy jest możliwe aby zaimplementować coś takiego z Szacow + Dataset:

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) 

bez uruchamiania próbki szkoleniowe iteracje od nowa przy każdym wywołaniu estimator.train(input_fn=train_input_fn, steps=valid_freq)?

Na przykład, w przeciwieństwie do here, utworzyć egzemplarz zestawu danych i jego iteratora poza input_fn? Próbowałem, ale to nie działa, ponieważ wtedy dane wejściowe (z iteratora zestawu danych) i model (z estymatora model_fn) nie są częścią tego samego wykresu.

Dzięki

Powiązane problem github: https://github.com/tensorflow/tensorflow/issues/14283

Odpowiedz

0

ja nie znam żadnego sposobu, aby szkolenie spójne ciągami estimator.train().

Możliwe jest jednak, aby zbudować model train_input_fn w taki sposób, aby był wystarczająco losowy, aby uzyskać ten sam efekt.


Na przykład załóżmy, że masz zestaw danych o wartościach [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] i można nauczyć się tylko na połowę zestawu danych przy każdym wywołaniu estimator.train.
Jeśli nie przetasować na tyle dobrze, będziecie zachowywać szkolenie na temat wartości [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)) 

Jednak jeśli zadzwonisz tf.data.Dataset.shuffle() z buffer_size co najmniej tak duża jak w zbiorze danych, otrzymasz losowy wartości. Wywołanie wielokrotnie estimator.train z tym będzie równoznaczne z wywołaniem go jeden raz z wieloma epokami.

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

napisałem kolejną odpowiedź wyjaśnić znaczenie buffer_sizehere.