В чем разница между шагами и эпохами в TensorFlow?
В большинстве моделей есть параметр шагов, указывающий количество шагов для выполнения данных. Но, тем не менее, я вижу в большинстве практических применений, мы также выполняем функцию соответствия N эпох.
В чем разница между запуском 1000 шагов с 1 эпохой и запуском 100 шагов с 10 эпохой? Какой из них лучше на практике? Любая логика меняется между последовательными эпохами? Перетасовка данных?
Ответы
Ответ 1
Эпоха обычно означает одну итерацию по всем данным обучения. Например, если у вас есть 20 000 изображений и размер партии 100, тогда эпоха должна содержать 20 000/100 = 200 шагов. Однако я обычно устанавливаю фиксированное число шагов, например, 1000 за эпоху, хотя у меня есть гораздо больший набор данных. В конце эпохи я проверяю среднюю стоимость, и если она улучшилась, я сохраняю контрольную точку. Между шагами от одной эпохи к другой нет разницы. Я просто рассматриваю их как контрольно-пропускные пункты.
Люди часто перемешивают набор данных между эпохами. Я предпочитаю использовать функцию random.sample для выбора данных для обработки в мои эпохи. Так что скажите, что я хочу сделать 1000 шагов с размером партии 32. Я просто случайно выберу 32 000 выборок из пула данных обучения.
Ответ 2
Шаг обучения - это одно обновление градиента. За один шаг batch_size обрабатывается много примеров.
Эпоха состоит из одного полного цикла через данные обучения. Обычно это много шагов. Например, если у вас есть 2000 изображений и размер партии составляет 10, эпоха состоит из 2000 изображений /(10 изображений/шагов) = 200 шагов.
Если вы выбираете наш обучающий образ случайным образом (и независимым) на каждом шаге, вы обычно не называете его эпохой. [Здесь мой ответ отличается от предыдущего. Также см. Мой комментарий.]
Ответ 3
Поскольку в настоящее время я экспериментирую с API tf.estimator, я хотел бы также добавить сюда свои выводы. Я пока не знаю, является ли использование параметров steps и epochs единым для всего 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 = 700 000 и batch_size = 4), и это точно количество шагов estimator.train
, хотя для параметра steps было задано значение 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
, нижняя граница определяет количество шагов, которые будут выполнены.
Ответ 4
Простыми словами
Эпоха: Эпоха считается числом одного прохода из всего набора данных.
Шаги: В тензорном потоке один шаг рассматривается как количество эпох, умноженное на примеры, деленное на размер партии.
steps = (epoch * examples)/batch size
For instance
epoch = 100, examples = 1000 and batch_size = 1000
steps = 100
Ответ 5
Эпоха: Эпоха обучения представляет собой полное использование всех данных обучения для расчета и оптимизации градиентов (обучаем модель).
Шаг. Шаг обучения - это обучение с использованием пакета данных обучения за один раз.
Количество обучающих шагов за эпоху: total_number_of_training_examples/batch_size
Общее количество тренировочных шагов: количество эпох x Количество тренировочных шагов за эпоху
Почему люди иногда указывают только количество этапов обучения без указания количества периодов обучения: Люди хотят многократно произвольно извлекать данные "размера партии" из данных обучения для обучения вместо того, чтобы последовательно проходить все данные обучения. Поэтому люди просто устанавливают количество тренировочных шагов.