Quelle est la différence entre les étapes et les époques dans TensorFlow?

125

Dans la plupart des modèles, il existe un paramètre d' étapes indiquant le nombre d'étapes à parcourir sur les données . Mais pourtant, je vois dans la plupart des usages pratiques, nous exécutons également la fonction fit N epochs .

Quelle est la différence entre exécuter 1000 étapes avec 1 époque et 100 étapes avec 10 périodes? Lequel est le meilleur en pratique? Y a-t-il des changements de logique entre des époques consécutives? Mélange de données?

Yang
la source
1
Jason Brownlee à machinelearningmastery.com a une très belle réponse détaillée à cette question.
BmyGuest

Réponses:

84

Une époque signifie généralement une itération sur toutes les données d'apprentissage. Par exemple, si vous avez 20 000 images et une taille de lot de 100, l'époque devrait contenir 20 000/100 = 200 étapes. Cependant, je fixe généralement un nombre fixe d'étapes comme 1000 par époque, même si j'ai un ensemble de données beaucoup plus grand. À la fin de l'époque, je vérifie le coût moyen et s'il s'améliore, je sauvegarde un point de contrôle. Il n'y a aucune différence entre les étapes d'une époque à l'autre. Je les traite simplement comme des points de contrôle.

Les gens se déplacent souvent dans l'ensemble de données entre les époques. Je préfère utiliser la fonction random.sample pour choisir les données à traiter à mon époque. Alors disons que je veux faire 1 000 étapes avec une taille de lot de 32. Je vais juste choisir au hasard 32 000 échantillons dans le pool de données d'entraînement.

chasep255
la source
47
La deuxième partie de votre réponse est erronée, à mon avis. Une époque est définie comme un cycle à travers les données d'apprentissage. Ce n'est pas une époque, si vous fixez le nombre d'étapes. De manière analogique, vous ne pouvez pas l'appeler époque si vous échantillonnez l'exemple d'entraînement indépendamment à chaque étape. Vous pouvez enregistrer votre point de contrôle et effectuer des vérifications toutes les N étapes, mais cela ne signifie pas que N étapes deviennent une époque. J'éviterais d'appeler cette époque dans le code, cela peut prêter à confusion.
MarvMind
84

Une étape de formation est une mise à jour de gradient. En une seule étape batch_size de nombreux exemples sont traités.

Une époque consiste en un cycle complet à travers les données d'apprentissage. Il s'agit généralement de plusieurs étapes. Par exemple, si vous avez 2 000 images et que vous utilisez une taille de lot de 10, une époque se compose de 2 000 images / (10 images / étape) = 200 étapes.

Si vous choisissez notre image d'entraînement au hasard (et indépendamment) à chaque étape, vous ne l'appelez normalement pas époque. [C'est là que ma réponse diffère de la précédente. Voir aussi mon commentaire.]

MarvMind
la source
J'ai modifié le calcul des 200 étapes mais j'ai oublié de me connecter, donc si vous voulez parler à "l'utilisateur inconnu" ... Je suis là
Chris Chiasson
16

Comme j'expérimente actuellement avec l'API tf.estimator, j'aimerais également ajouter mes résultats de rosée ici. Je ne sais pas encore si l'utilisation des paramètres d'étapes et d'époques est cohérente dans TensorFlow et je ne parle donc que de tf.estimator (en particulier de tf.estimator.LinearRegressor) pour le moment.

Étapes de formation définies par num_epochs: stepsnon explicitement définies

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)

Commentaire: J'ai défini num_epochs=1l'entrée de formation et l'entrée de doc pour numpy_input_fnme dit "num_epochs: Integer, nombre d'époques à parcourir sur les données. If Nonefonctionnera pour toujours." . Dans num_epochs=1l'exemple ci-dessus, la formation s'exécute exactement x_train.size / batch_size fois / étapes (dans mon cas, il s'agissait de 175000 étapes comme x_trainune taille de 700000 et batch_sizeétait de 4).

Étapes d'entraînement définies par num_epochs: stepsexplicitement définies plus haut que le nombre d'étapes implicitement définies parnum_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)

Commentaire: num_epochs=1dans mon cas, cela signifierait 175000 étapes ( x_train.size / batch_size avec x_train.size = 700000 et batch_size = 4 ) et c'est exactement le nombre d'étapes estimator.trainbien que le paramètre steps ait été défini sur 200000 estimator.train(input_fn=train_input, steps=200000).

Étapes de formation définies par 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)

Commentaire: Bien que je l'ai défini num_epochs=1lors de l'appel, numpy_input_fnla formation s'arrête après 1000 étapes. En effet, steps=1000in estimator.train(input_fn=train_input, steps=1000)remplace le fichier num_epochs=1in tf.estimator.inputs.numpy_input_fn({'x':x_train},y_train,batch_size=4,num_epochs=1,shuffle=True).

Conclusion : Quels que soient les paramètres num_epochspour tf.estimator.inputs.numpy_input_fnet stepspour estimator.traindéfinir, la borne inférieure détermine le nombre d'étapes qui seront exécutées.

dmainz
la source
11

En termes simples
Epoch: L' époque est considérée comme le nombre d'une passe de l'ensemble de données.Étapes
: Dans tensorflow, une étape est considérée comme le nombre d'époques multiplié par les exemples divisé par la taille du lot

steps = (epoch * examples)/batch size
For instance
epoch = 100, examples = 1000 and batch_size = 1000
steps = 100
Muhammad Umar Amanat
la source
Umar, j'obtiens un meilleur résultat en utilisant votre formule, mais je me demande simplement pourquoi tout le monde a une formule différente? Comme tout le monde le dit ci-dessus, étapes = (nombre total d'images) / taille du lot.
Satyendra Sahani
@SatyendraSahani J'ai obtenu cette formule de l'un des instructeurs du cours GCP offert à coursera, peut-être que c'est le cas que vous obteniez un meilleur résultat.
Muhammad Umar Amanat
@Umar, mais à certains moments, le nombre d'échantillons est énorme. Comme dans notre cas, nous avons 99 000 échantillons. Si nous choisissons une taille de lot 8 et des époques 20. le nombre total de step_size est (20 * 99000) / 8 = 247.500. Ce qui est vraiment un nombre élevé. là je commence à douter de cette méthode.
Satyendra Sahani
8

Epoque: Une époque d'apprentissage représente une utilisation complète de toutes les données d'entraînement pour le calcul des gradients et les optimisations (entraîner le modèle).

Étape: Une étape d'entraînement signifie l'utilisation d'une taille de lot de données d'entraînement pour entraîner le modèle.

Nombre d'étapes de formation par époque: total_number_of_training_examples/ batch_size.

Nombre total d'étapes de formation: number_of_epochsx Number of training steps per epoch.

Xin Su
la source
2

Puisqu'il n'y a pas encore de réponse acceptée: par défaut, une époque couvre toutes vos données d'entraînement. Dans ce cas, vous avez n étapes, avec n = Training_lenght / batch_size.

Si vos données d'entraînement sont trop volumineuses, vous pouvez décider de limiter le nombre d'étapes au cours d'une époque. [ Https://www.tensorflow.org/tutorials/structured_data/time_series?_sm_byp=iVVF1rD6n2Q68VSN]

Lorsque le nombre d'étapes atteint la limite que vous avez définie, le processus recommence et commence à l'époque suivante. Lorsque vous travaillez dans TF, vos données sont généralement d'abord transformées en une liste de lots qui seront introduits dans le modèle pour la formation. À chaque étape, vous traitez un lot.

Quant à savoir s'il vaut mieux définir 1000 étapes pour 1 époque ou 100 étapes avec 10 époques, je ne sais pas s'il existe une réponse claire. Mais voici les résultats de la formation d'un CNN avec les deux approches à l'aide des didacticiels de données de séries temporelles TensorFlow:

Dans ce cas, les deux approches conduisent à des prédictions très similaires, seuls les profils de formation diffèrent.

pas = 20 / époques = 100 entrez la description de l'image ici

entrez la description de l'image ici

pas = 200 / époques = 10

entrez la description de l'image ici

entrez la description de l'image ici

Yoan B.
la source