¿Cuál es la diferencia entre pasos y épocas en TensorFlow?

125

En la mayoría de los modelos, hay un parámetro de pasos que indica el número de pasos para ejecutar sobre los datos . Pero aún veo en el uso más práctico, también ejecutamos la función de ajuste N epochs .

¿Cuál es la diferencia entre ejecutar 1000 pasos con 1 época y ejecutar 100 pasos con 10 épocas? ¿Cuál es mejor en la práctica? ¿Algún cambio lógico entre épocas consecutivas? ¿Mezcla de datos?

Yang
fuente
1
Jason Brownlee en machinelearningmastery.com tiene una respuesta muy agradable y detallada a exactamente esa pregunta.
BmyGuest

Respuestas:

84

Una época generalmente significa una iteración sobre todos los datos de entrenamiento. Por ejemplo, si tiene 20,000 imágenes y un tamaño de lote de 100, la época debe contener 20,000 / 100 = 200 pasos. Sin embargo, generalmente solo establezco un número fijo de pasos como 1000 por época, aunque tengo un conjunto de datos mucho más grande. Al final de la época verifico el costo promedio y, si mejora, guardo un punto de control. No hay diferencia entre los pasos de una época a otra. Solo los trato como puntos de control.

La gente a menudo baraja el conjunto de datos entre épocas. Prefiero usar la función random.sample para elegir los datos a procesar en mis épocas. Digamos que quiero hacer 1000 pasos con un tamaño de lote de 32. Solo elegiré al azar 32,000 muestras del grupo de datos de entrenamiento.

chasep255
fuente
47
La segunda parte de su respuesta es incorrecta, en mi opinión. Una época se define como un ciclo a través de los datos de entrenamiento. No es una época, si arreglas el número de pasos. Analógicamente, no puede llamarse época, si muestra el ejemplo de entrenamiento de forma independiente en cada paso. Puede guardar su punto de control y hacer controles cada N Pasos, pero esto no significa que los N Pasos se conviertan en una época. Evitaría llamar a esta época en el código, tiene el potencial de confundir.
MarvMind
84

Un paso de entrenamiento es una actualización de gradiente. En un solo paso, se procesan muchos ejemplos.

Una época consiste en un ciclo completo a través de los datos de entrenamiento. Esto suele ser muchos pasos. Como ejemplo, si tiene 2.000 imágenes y utiliza un tamaño de lote de 10, una época consta de 2.000 imágenes / (10 imágenes / paso) = 200 pasos.

Si elige nuestra imagen de entrenamiento al azar (e independiente) en cada paso, normalmente no lo llamará época. [Aquí es donde mi respuesta difiere de la anterior. También vea mi comentario.]

MarvMind
fuente
Hice una edición en el cálculo de 200 pasos, pero olvidé iniciar sesión, así que si quieres hablar con el "usuario desconocido" ... estoy aquí
Chris Chiasson
16

Como actualmente estoy experimentando con la API tf.estimator, me gustaría agregar mis hallazgos húmedos aquí también. Todavía no sé si el uso de los parámetros de pasos y épocas es consistente en todo TensorFlow y, por lo tanto, solo me estoy relacionando con tf.estimator (específicamente tf.estimator.LinearRegressor) por ahora.

Pasos de entrenamiento definidos por num_epochs: stepsno explícitamente

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)

Comentario: he configurado num_epochs=1la entrada de entrenamiento y la entrada de documentación para numpy_input_fnme dice "num_epochs: Entero, número de épocas para iterar sobre los datos. Si Nonese ejecutará para siempre". . En num_epochs=1el ejemplo anterior, el entrenamiento se ejecuta exactamente x_train.size / batch_size times / steps (en mi caso, esto era 175000 pasos, x_traintenía un tamaño de 700000 y batch_sizeera 4).

Pasos de entrenamiento definidos por num_epochs: stepsexplícitamente definido mayor que el número de pasos implícitamente definidos pornum_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)

Comentario: num_epochs=1en mi caso significaría 175000 pasos ( x_train.size / batch_size con x_train.size = 700,000 y batch_size = 4 ) y este es exactamente el número de pasos, estimator.trainaunque el parámetro de pasos se estableció en 200,000 estimator.train(input_fn=train_input, steps=200000).

Pasos de entrenamiento definidos por 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)

Comentario: aunque lo he configurado num_epochs=1al llamar, numpy_input_fnel entrenamiento se detiene después de 1000 pasos. Esto se debe a que steps=1000en estimator.train(input_fn=train_input, steps=1000)sobrescribe el num_epochs=1in tf.estimator.inputs.numpy_input_fn({'x':x_train},y_train,batch_size=4,num_epochs=1,shuffle=True).

Conclusión : Sean cuales sean los parámetros num_epochspara tf.estimator.inputs.numpy_input_fny stepspara estimator.traindefinir, el límite inferior determina el número de pasos que se ejecutarán.

dmainz
fuente
11

En palabras sencillas
Epoch: Epoch se considera como el número de una pasada de todo el conjunto de datos
Pasos: En el flujo de tensor, uno de los pasos se considera como el número de épocas multiplicado por ejemplos dividido por el tamaño del lote

steps = (epoch * examples)/batch size
For instance
epoch = 100, examples = 1000 and batch_size = 1000
steps = 100
Muhammad Umar Amanat
fuente
Umar, obtengo un mejor resultado con tu fórmula, pero me pregunto por qué todos tienen una fórmula diferente. Como todos los demás dicen, pasos = (número total de imágenes) / tamaño de lote.
Satyendra Sahani
@SatyendraSahani Obtuve esta fórmula de uno de los instructores del curso de GCP ofrecido en Coursera, puede ser el caso de que obtuviera mejores resultados.
Muhammad Umar Amanat
@Umar, pero a veces el número de muestras es enorme. Como en nuestro caso, tenemos 99,000 muestras. Si elegimos un lote de tamaño 8 y épocas 20. el número total de step_size es (20 * 99000) / 8 = 247,500. Lo cual es realmente un número alto. ahí empiezo a dudar de este método.
Satyendra Sahani
8

Época: una época de entrenamiento representa un uso completo de todos los datos de entrenamiento para el cálculo de gradientes y optimizaciones (entrenar el modelo).

Paso: Un paso de entrenamiento significa usar un tamaño de lote de datos de entrenamiento para entrenar el modelo.

Número de pasos de entrenamiento por época: total_number_of_training_examples/batch_size .

Número total de pasos de entrenamiento: number_of_epochsx Number of training steps per epoch.

Xin Su
fuente
2

Como todavía no hay una respuesta aceptada: por defecto, una época recorre todos sus datos de entrenamiento. En este caso, tiene n pasos, con n = Training_lenght / batch_size.

Si sus datos de entrenamiento son demasiado grandes, puede decidir limitar el número de pasos durante una época. [ Https://www.tensorflow.org/tutorials/structured_data/time_series?_sm_byp=iVVF1rD6n2Q68VSN]

Cuando el número de pasos alcanza el límite establecido, el proceso comenzará de nuevo, comenzando la próxima época. Cuando trabaja en TF, sus datos generalmente se transforman primero en una lista de lotes que se enviarán al modelo para su capacitación. En cada paso procesas un lote.

En cuanto a si es mejor establecer 1000 pasos para 1 época o 100 pasos con 10 épocas, no sé si hay una respuesta directa. Pero aquí hay resultados sobre la capacitación de una CNN con ambos enfoques utilizando los tutoriales de datos de la serie de tiempo TensorFlow:

En este caso, ambos enfoques conducen a predicciones muy similares, solo los perfiles de entrenamiento difieren.

pasos = 20 / épocas = 100 ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

pasos = 200 / épocas = 10

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Yoan B.
fuente