Sự khác biệt giữa các bước và kỷ nguyên trong TensorFlow là gì?


125

Trong hầu hết các mô hình, có một tham số bước cho biết số bước để chạy trên dữ liệu . Nhưng tôi thấy trong hầu hết cách sử dụng thực tế, chúng tôi cũng thực hiện hàm fit N kỷ nguyên .

Sự khác biệt giữa chạy 1000 bước với 1 kỷ nguyên và chạy 100 bước với 10 kỷ nguyên là gì? Cái nào tốt hơn trong thực tế? Bất kỳ thay đổi logic nào giữa các kỷ nguyên liên tiếp? Xáo trộn dữ liệu?


1
Jason Brownlee tại machinelearningmastery.com có ​​một câu trả lời rất hay và chi tiết cho chính xác câu hỏi đó.
BmyGuest

Câu trả lời:


84

Một kỷ nguyên thường có nghĩa là một lần lặp lại trên tất cả dữ liệu đào tạo. Ví dụ: nếu bạn có 20.000 hình ảnh và kích thước lô là 100 thì kỷ nguyên phải chứa 20.000 / 100 = 200 bước. Tuy nhiên, tôi thường chỉ đặt một số bước cố định như 1000 mỗi kỷ nguyên mặc dù tôi có tập dữ liệu lớn hơn nhiều. Vào cuối kỷ nguyên, tôi kiểm tra chi phí trung bình và nếu nó được cải thiện, tôi sẽ lưu một điểm kiểm tra. Không có sự khác biệt giữa các bước từ kỷ nguyên này sang kỷ nguyên khác. Tôi chỉ coi chúng như những trạm kiểm soát.

Mọi người thường xáo trộn tập dữ liệu giữa các kỷ nguyên. Tôi thích sử dụng hàm random.sample để chọn dữ liệu cần xử lý trong các kỷ nguyên của mình. Vì vậy, giả sử tôi muốn thực hiện 1000 bước với kích thước lô là 32. Tôi sẽ chỉ chọn ngẫu nhiên 32.000 mẫu từ nhóm dữ liệu đào tạo.


47
Phần thứ hai của câu trả lời của bạn là sai, theo ý kiến ​​của tôi. Một kỷ nguyên được định nghĩa là một chu kỳ thông qua dữ liệu đào tạo. Nó không phải là một kỷ nguyên, nếu bạn cố định số bước. Tương tự, bạn không thể gọi nó là kỷ nguyên, nếu bạn lấy mẫu ví dụ đào tạo một cách độc lập trong mỗi bước. Bạn có thể lưu điểm kiểm tra của mình và kiểm tra mỗi N Bước, nhưng điều này không có nghĩa là N Bước trở thành một kỷ nguyên. Tôi sẽ tránh gọi kỷ nguyên này trong mã, nó có khả năng gây nhầm lẫn.
MarvMind

84

Một bước đào tạo là một bản cập nhật gradient. Trong một bước, nhiều ví dụ được xử lý theo batch_size.

Một kỷ nguyên bao gồm một chu kỳ đầy đủ thông qua dữ liệu đào tạo. Đây thường là nhiều bước. Ví dụ: nếu bạn có 2.000 hình ảnh và sử dụng kích thước lô là 10 thì kỷ nguyên bao gồm 2.000 hình ảnh / (10 hình ảnh / bước) = 200 bước.

Nếu bạn chọn hình ảnh đào tạo của chúng tôi một cách ngẫu nhiên (và độc lập) trong mỗi bước, bạn thường không gọi nó là kỷ nguyên. [Đây là điểm mà câu trả lời của tôi khác với câu trước. Cũng xem bình luận của tôi.]


Tôi đã thực hiện một chỉnh sửa đến việc tính 200 bước nhưng quên đăng nhập, vì vậy nếu bạn muốn nói chuyện với các "không rõ người sử dụng" ... Tôi ở đây
Chris Chiasson

16

Vì tôi hiện đang thử nghiệm với API tf.estimator, tôi cũng muốn thêm những phát hiện khó hiểu của mình ở đây. Tôi vẫn chưa biết liệu việc sử dụng các thông số bước và kỷ nguyên có nhất quán trong suốt TensorFlow hay không và do đó tôi chỉ liên quan đến tf.estimator (cụ thể là tf.estimator.LinearRegressor).

Các bước đào tạo được xác định bởi num_epochs: stepskhông được xác định rõ ràng

estimator = tf.estimator.LinearRegressor(feature_columns=ft_cols)
train_input =  tf.estimator.inputs.numpy_input_fn({'x':x_train},y_train,batch_size=4,num_epochs=1,shuffle=True)
estimator.train(input_fn=train_input)

Nhận xét: Tôi đã đặt num_epochs=1cho đầu vào đào tạo và mục nhập doc cho numpy_input_fntôi biết "num_epochs: Số nguyên, số kỷ nguyên để lặp qua dữ liệu. NếuNone sẽ chạy mãi mãi." . Với num_epochs=1ví dụ trên, quá trình đào tạo chạy chính xác x_train.size / batch_size lần / bước (trong trường hợp của tôi, đây là 175000 bước so với x_trainkích thước 700000 và batch_sizelà 4).

Các bước đào tạo được xác định bởi num_epochs : stepsđược xác định rõ ràng cao hơn số bước được xác định ngầm bởinum_epochs=1

estimator = tf.estimator.LinearRegressor(feature_columns=ft_cols)
train_input =  tf.estimator.inputs.numpy_input_fn({'x':x_train},y_train,batch_size=4,num_epochs=1,shuffle=True)
estimator.train(input_fn=train_input, steps=200000)

Nhận xét: num_epochs=1trong trường hợp của tôi có nghĩa là 175000 bước ( x_train.size / batch_size với x_train.size = 700.000batch_size = 4 ) và đây chính xác là số bước estimator.trainmặc dù thông số bước được đặt thành 200.000 estimator.train(input_fn=train_input, steps=200000).

Các bước đào tạo được xác định bởi steps

estimator = tf.estimator.LinearRegressor(feature_columns=ft_cols)
train_input =  tf.estimator.inputs.numpy_input_fn({'x':x_train},y_train,batch_size=4,num_epochs=1,shuffle=True)
estimator.train(input_fn=train_input, steps=1000)

Nhận xét: Mặc dù tôi đã thiết lập num_epochs=1khi gọi numpy_input_fnviệc đào tạo dừng sau 1000 bước. Đây là bởi vìsteps=1000 trong estimator.train(input_fn=train_input, steps=1000)ghi đè các num_epochs=1trong tf.estimator.inputs.numpy_input_fn({'x':x_train},y_train,batch_size=4,num_epochs=1,shuffle=True).

Kết luận : Bất kể các tham số num_epochsfor tf.estimator.inputs.numpy_input_fnstepsfor estimator.traindefine, giới hạn dưới sẽ xác định số bước sẽ được chạy qua.


11

Nói một cách dễ hiểu
Kỷ nguyên: Kỷ nguyên được coi là số lần vượt qua toàn bộ tập dữ liệu
Các bước: Trong tensorflow, một bước được coi là số kỷ nguyên nhân với các ví dụ chia cho kích thước lô

steps = (epoch * examples)/batch size
For instance
epoch = 100, examples = 1000 and batch_size = 1000
steps = 100

Umar, tôi nhận được kết quả tốt hơn khi sử dụng công thức của bạn nhưng chỉ thắc mắc tại sao mọi người lại có một công thức khác nhau? Giống như những người khác ở trên đã nói, các bước = (tổng số hình ảnh) / kích thước lô.
Satyendra Sahani,

@SatyendraSahani Tôi nhận được công thức này từ một trong những người hướng dẫn của khóa học GCP được cung cấp tại khóa học, có thể đây là trường hợp bạn có kết quả tốt hơn.
Muhammad Umar Amanat

@Umar, nhưng tại một số thời điểm số lượng mẫu rất lớn. Giống như trong trường hợp của chúng tôi, chúng tôi đang có 99.000 mẫu. Nếu chúng ta chọn kích thước lô là 8 và kỷ nguyên 20. thì tổng số step_size là (20 * 99000) / 8 = 247.500. Đó thực sự là một con số cao. ở đó tôi bắt đầu nghi ngờ phương pháp này.
Satyendra Sahani

8

Kỷ nguyên: Kỷ nguyên đào tạo đại diện cho việc sử dụng hoàn toàn tất cả dữ liệu đào tạo để tính toán và tối ưu hóa độ dốc (đào tạo mô hình).

Bước: Bước đào tạo có nghĩa là sử dụng một kích thước hàng loạt dữ liệu đào tạo để đào tạo mô hình.

Số bước đào tạo mỗi kỷ nguyên: total_number_of_training_examples/batch_size .

Tổng số bước đào tạo: number_of_epochsxNumber of training steps per epoch .


2

Vì chưa có câu trả lời nào được chấp nhận: Theo mặc định, một kỷ nguyên chạy trên tất cả dữ liệu đào tạo của bạn. Trong trường hợp này, bạn có n bước, với n = Training_lenght / batch_size.

Nếu dữ liệu đào tạo của bạn quá lớn, bạn có thể quyết định giới hạn số bước trong một kỷ nguyên. [ Https://www.tensorflow.org/tutorials/structured_data/time_series?_sm_byp=iVVF1rD6n2Q68VSN]

Khi số bước đạt đến giới hạn mà bạn đã đặt, quá trình sẽ bắt đầu lại, bắt đầu kỷ nguyên tiếp theo. Khi làm việc trong TF, dữ liệu của bạn thường được chuyển đổi đầu tiên thành danh sách các lô sẽ được cung cấp cho mô hình để đào tạo. Ở mỗi bước, bạn xử lý một loạt.

Về việc đặt 1000 bước cho 1 kỷ nguyên hay 100 bước với 10 kỷ nguyên thì tốt hơn, tôi không biết nếu có câu trả lời thẳng thắn. Nhưng đây là kết quả về việc đào tạo CNN với cả hai cách tiếp cận bằng cách sử dụng hướng dẫn dữ liệu thời gian của TensorFlow:

Trong trường hợp này, cả hai cách tiếp cận đều dẫn đến dự đoán rất giống nhau, chỉ khác nhau về cấu hình đào tạo.

bước = 20 / epochs = 100 nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

bước = 200 / epochs = 10

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.