В чем разница между шагами и эпохами в TensorFlow?


126

В большинстве моделей есть параметр steps, указывающий количество шагов для обработки данных . Но все же я вижу, что в большинстве случаев практического использования мы также выполняем функцию соответствия N epochs .

В чем разница между выполнением 1000 шагов с 1 эпохой и 100 шагов с 10 эпохами? Какой из них лучше на практике? Есть ли логические изменения между последовательными эпохами? Перетасовка данных?


1
У Джейсона Браунли из machinelearningmaster.com есть очень хороший и подробный ответ именно на этот вопрос.
BmyGuest

Ответы:


84

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

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


47
На мой взгляд, вторая часть вашего ответа неверна. Эпоха определяется как один цикл обучающих данных. Если зафиксировать количество шагов, это не эпоха. По аналогии, вы не можете назвать это эпохой, если вы пробуете обучающий пример независимо на каждом шаге. Вы можете сохранить контрольную точку и выполнять проверки каждые N шагов, но это не означает, что N шагов становятся эпохой. Я бы не назвал эту эпоху в коде, это может сбить с толку.
MarvMind 07

84

Шаг обучения - это одно обновление градиента. За один шаг batch_size обрабатывается множество примеров.

Эпоха состоит из одного полного цикла обучающих данных. Обычно это много шагов. Например, если у вас 2000 изображений и вы используете размер пакета 10, эпоха состоит из 2000 изображений / (10 изображений / шаг) = 200 шагов.

Если вы выбираете наш обучающий образ случайным образом (и независимо) на каждом шаге, вы обычно не называете это эпохой. [Здесь мой ответ отличается от предыдущего. Также см. Мой комментарий.]


Я внес изменения в расчет 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: Integer, количество эпох для перебора данных. Если 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 = 700000 и batch_size = 4 ), и это именно то количество шагов, estimator.trainхотя для параметра steps было установлено значение 200000 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=1000in estimator.train(input_fn=train_input, steps=1000)перезаписывает файл num_epochs=1in 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определения, нижняя граница определяет количество шагов , которые будут пробегают.


12

Проще говоря,
Эпоха: Эпоха считается числом одного прохода от всего набора данных.
Шаги: В тензорном потоке один шаг рассматривается как количество эпох, умноженное на примеры, деленное на размер пакета.

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

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

@SatyendraSahani Я получил эту формулу от одного из инструкторов курса GCP, предлагаемого на coursera, может быть, в этом случае вы получили лучший результат.
Мухаммад Умар Аманат

@Umar, но порой количество сэмплов огромно. Как и в нашем случае, у нас 99 000 образцов. Если мы выберем размер пакета 8 и эпох 20. общее число step_size будет (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.