2017-11-07 101 views
6

TensorFlow 1.4, TF Veri Kümesini çekirdeğe taşır (tf.data.Dataset) ve doc/eğitici modelleri eğitmek için tf.estimator'u kullanmayı önerir. Ancak, this page'un sonunda önerildiği gibi, Dataset nesnesi ve yineleyicisi input_fn işlevinin içinde başlatılmalıdır. Bu, her bir çağrı için estimator.train(input_fn, steps) numaralı çağrıya yeniden başlayacaktır. Bu nedenle çağırma, çağdaki örneklerin < numarasıyla, modelin veri kümesinin bir alt kümesinde çalıştırılmasına yol açacaktır.Kestirici + veri kümesi kullanamaz ve bir epoch için daha az efor uygulayamaz

Bu yüzden benim sorum.

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) 

estimator.train(input_fn=train_input_fn, steps=valid_freq) yapılan her çağrı en baştan eğitim numuneleri yinelemeleri başlatmadan: Bu Tahmincisi + DataSetbırakma ile böyle bir şey uygulamak mümkün mü?

Örneğin, here'dan farklı olarak, Veri Kümesi ve yineleyicisini input_fn'un dışına çıkarın. Denedim ama işe yaramaz çünkü o zaman giriş (veri kümesi yineleyicisinden) ve model (tahminciden model_fn) aynı grafiğin bir parçası değildir.

Teşekkür

İlgili github sorunu: https://github.com/tensorflow/tensorflow/issues/14283

cevap

0

Ben estimator.train() ishal çeşitli yerlerindeki eğitim tutarlı hale getirmek için herhangi bir yol bilmiyorum.

Ancak yapabilecekleriniz, aynı efekti elde etmek için yeterince rastgele olacak şekilde train_input_fn'u oluşturduğunuzdan emin olmanızdır. Örneğin


Eğer değerler [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] bir veri kümesi varsa ve sadece estimator.train her çağrının yarım veri kümesi üzerinde eğitebilirsiniz varsayalım.
sizi yeteri kadar karıştırmak yoksa, değerler [0, 1, 2, 3, 4] konusunda eğitim tutacak: Eğer veri kümesi olarak en az büyük bir buffer_size ile tf.data.Dataset.shuffle() ararsanız, rastgele alacak

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

Ancak değerler. Bunun ile birden çok kez estimator.train aranması, bir defaya mahsus çoklu çağlar ile çağrılmasına eşdeğer olacaktır.

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

Ben buffer_size here önemini açıklamak için başka bir yanıt yazdı.