2017-11-07 22 views
6

TensorFlow 1.4 di chuyển TF Dữ liệu vào lõi (tf.data.Dataset) và doc/tutorial đề xuất sử dụng tf.estimator để đào tạo mô hình.Không thể sử dụng ước tính + tập dữ liệu và đào tạo cho ít hơn một kỷ nguyên

Tuy nhiên, như được đề xuất ở cuối this page, đối tượng Tập dữ liệu và trình lặp của nó phải được khởi tạo bên trong hàm input_fn. Điều này có nghĩa là các lần lặp thông qua tập dữ liệu sẽ bắt đầu lại cho mỗi cuộc gọi đến estimator.train(input_fn, steps). Vì vậy, gọi là với các bước < số lượng mẫu trong kỷ nguyên, sẽ dẫn đến đào tạo mô hình trên một tập hợp con của tập dữ liệu.

Vì vậy, câu hỏi của tôi. Là nó có thể thực hiện một cái gì đó như thế này với Estimator + 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) 

mà không bắt đầu đào tạo các mẫu lặp đi lặp lại từ đầu ở mỗi cuộc gọi đến estimator.train(input_fn=train_input_fn, steps=valid_freq)?

Ví dụ: không giống như here, khởi tạo Bộ dữ liệu và trình lặp của nó bên ngoài input_fn? Tôi đã thử nó nhưng nó không hoạt động bởi vì sau đó đầu vào (từ bộ dữ liệu iterator) và mô hình (từ các ước tính model_fn) không phải là một phần của cùng một đồ thị.

Cảm ơn

liên quan vấn đề github: https://github.com/tensorflow/tensorflow/issues/14283

Trả lời

0

Tôi không biết cách nào để làm cho công tác đào tạo nhất quán trên chạy của estimator.train().

Tuy nhiên những gì bạn có thể làm là đảm bảo rằng bạn xây dựng train_input_fn sao cho nó đủ ngẫu nhiên để có được cùng một hiệu ứng.


Ví dụ giả sử bạn có một tập dữ liệu của giá trị [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] và bạn chỉ có thể đào tạo trên một nửa số liệu tại mỗi cuộc gọi của estimator.train.
Nếu bạn không xáo trộn cũng đủ, bạn sẽ tiếp tục đào tạo về giá trị [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)) 

Tuy nhiên, nếu bạn gọi tf.data.Dataset.shuffle() với một buffer_size ít nhất lớn như các tập dữ liệu, bạn sẽ nhận được ngẫu nhiên giá trị. Gọi nhiều lần estimator.train với điều này sẽ tương đương với việc gọi nó một lần với nhiều kỷ nguyên.

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

tôi đã viết câu trả lời khác để giải thích tầm quan trọng của buffer_sizehere.

Các vấn đề liên quan