Яка різниця між кроками та епохами в TensorFlow?


125

У більшості моделей є параметр кроків, який вказує кількість кроків для запуску даних . Але все ж я бачу, що в практичному використанні ми також виконуємо функцію придатності N епох .

Яка різниця між виконанням 1000 кроків з 1 епохою і 100 кроків з 10 епохами? Який з них краще на практиці? Будь-яка логіка змінюється між послідовними епохами? Переміщення даних?


1
Джейсон Браунлі на сайті machinelearningmastery.com має дуже приємну, детальну відповідь саме на це питання.
BmyGuest

Відповіді:


84

Епоха, як правило, означає одну ітерацію всіх навчальних даних. Наприклад, якщо у вас є 20 000 зображень і розмір партії 100, то епоха повинна містити 20 000/100 = 200 кроків. Однак я зазвичай просто встановлюю фіксовану кількість кроків, таких як 1000 за епоху, хоча у мене є набагато більший набір даних. В кінці епохи я перевіряю середню вартість, і якщо вона покращилася, я зберігаю контрольний пункт. Немає різниці між кроками від однієї епохи до іншої. Я просто розглядаю їх як контрольно-пропускні пункти.

Люди часто перемішуються навколо набору даних між епохами. Я вважаю за краще використовувати функцію random.sample для вибору даних для обробки в мої епохи. Тому скажіть, що я хочу зробити 1000 кроків з розміром партії 32. Я просто випадковим чином виберу 32 000 зразків з пулу даних про навчання.


47
Друга частина вашої відповіді неправильна, на мою думку. Епоха визначається як один цикл через дані навчання. Це не епоха, якщо ви фіксуєте кількість кроків. Аналогічно, ви не можете назвати це епохою, якщо на кожному кроці ви самостійно відбираєте приклад навчання. Ви можете зберегти свою контрольну точку і робити перевірки кожні N кроків, але це не означає, що N кроків стає епохою. Я б не закликав цю епоху в коді, вона може заплутатись.
MarvMind

84

Навчальний крок - це одне оновлення градієнта. За один крок batch_size обробляється багато прикладів.

Епоха складається з одного повного циклу через дані навчання. Зазвичай це багато кроків. Наприклад, якщо у вас є 2000 зображень і використовуєте розмір партії 10, епоха складається з 2000 зображень / (10 зображень / крок) = 200 кроків.

Якщо ви обираєте наш тренувальний образ випадковим чином (і незалежним) на кожному кроці, ви зазвичай не називаєте це епохою. [Тут моя відповідь відрізняється від попередньої. Також дивіться мій коментар.]



16

Оскільки я зараз експериментую з API tf.estimator, я також хотів би додати свої родові висновки і тут. Я ще не знаю, чи використання параметрів кроків та епох є послідовним у всьому TensorFlow, і тому я зараз лише стосуюся tf.estimator (конкретно tf.estimator.LinearRegressor).

Навчальні етапи визначені num_epochs: 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)

Коментар: Я встановив num_epochs=1для введення тренінгу, і запис в документі для numpy_input_fnмене говорить "num_epochs: Ціле число, кількість епох, щоб повторити дані. Якщо Noneбуде запущено назавжди". . У num_epochs=1наведеному вище прикладі навчання проходить точно x_train.size / batch_size раз / кроки (у моєму випадку це було 175000 кроків, оскільки x_trainмали розмір 700000 і batch_sizeбуло 4).

Навчальні кроки визначені num_epochs: stepsявно визначені вище, ніж кількість ступенів, неявно визначеніnum_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)

Коментар: num_epochs=1у моєму випадку означало б 175000 кроків ( x_train.size / batch_size з x_train.size = 700 000 і batch_size = 4 ), і саме це число кроків, estimator.trainхоч параметр кроків було встановлено на 200 000 estimator.train(input_fn=train_input, steps=200000).

Кроки навчання, визначені 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)

Коментар: Хоча я встановив, num_epochs=1коли виклик numpy_input_fnтренувань припиняється після 1000 кроків. Це тому, що steps=1000в estimator.train(input_fn=train_input, steps=1000)перезаписі num_epochs=1в tf.estimator.inputs.numpy_input_fn({'x':x_train},y_train,batch_size=4,num_epochs=1,shuffle=True).

Висновок : Незалежно від параметрів num_epochsдля tf.estimator.inputs.numpy_input_fnта stepsдля estimator.trainвизначення, нижня межа визначає кількість кроків, які будуть проходити.


11

Простими словами
Епоха: Епоха вважається числом одного проходу з цілого набору даних.
Етапи: У tensorflow один крок вважається числом епох, помноженим на приклади, розділені на розмір партії

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

Умар, я отримую кращий результат, використовуючи вашу формулу, але просто цікаво, чому у кожного є інша формула? Як і всі інші вище, кроки = (загальна кількість зображень) / розмір партії.
Satyendra Sahani

@SatyendraSahani Я отримав цю формулу від одного з інструкторів курсу GCP, запропонованого на курсі, можливо, саме так ви отримали кращий результат.
Мухаммад Умар Аманат

@Umar, але іноді кількість зразків величезна. Як і в нашому випадку, ми маємо 99 000 зразків. Якщо ми обираємо партію розміром 8 та епохи 20. число загального розміру step_s (20 * 99000) / 8 = 247,500. Що насправді велика кількість. там я починаю сумніватися в цьому методі.
Satyendra Sahani

8

Епоха: навчальна епоха являє собою повне використання всіх навчальних даних для розрахунку та оптимізації градієнтів (тренуйте модель).

Крок: Навчальний крок означає використання однієї величини партії навчальних даних для тренування моделі.

Кількість навчальних етапів за епоху: total_number_of_training_examples/ batch_size.

Загальна кількість навчальних етапів: number_of_epochsx Number of training steps per epoch.


2

Оскільки відповіді ще не прийнято: за замовчуванням епоха запустила всі ваші дані навчання. У цьому випадку у вас є n кроків, з n = Training_lenght / batch_size.

Якщо ваші дані про навчання занадто великі, ви можете вирішити обмежити кількість кроків протягом епохи. [ Https://www.tensorflow.org/tutorials/structured_data/time_series?_sm_byp=iVVF1rD6n2Q68VSN]

Коли кількість кроків досягне встановленого вами межі, процес почнеться заново, починаючи наступну епоху. Під час роботи в TF ваші дані, як правило, спочатку перетворюються на список партій, які будуть подані моделі для тренування. На кожному кроці ви обробляєте одну партію.

Щодо того, чи краще встановити 1000 кроків за 1 епоху або 100 кроків за 10 епох, я не знаю, чи є відповідь прямої. Але ось результати навчання CNN з обома підходами, використовуючи навчальні посібники даних TensorFlow:

У цьому випадку обидва підходи призводять до дуже схожого прогнозу, відрізняються лише профілі тренувань.

кроки = 20 / епохи = 100 введіть тут опис зображення

введіть тут опис зображення

кроки = 200 / епох = 10

введіть тут опис зображення

введіть тут опис зображення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.