Dans la plupart des modèles, il existe un paramètre steps indiquant le nombre d'étapes à exécuter pour les données. Cependant, dans la plupart des applications pratiques, nous exécutons également la fonction d’ajustement N epochs.
Quelle est la différence entre exécuter 1000 étapes avec 1 époque et exécuter 100 étapes avec 10 périodes? Lequel est meilleur dans la pratique? Des changements de logique entre les époques consécutives? Remaniement des données?
Une époque signifie généralement une itération sur toutes les données d’entraînement. 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 règle généralement un nombre fixe d'étapes, par exemple 1000 par époque, même si mon ensemble de données est beaucoup plus volumineux. À la fin de l'époque, je vérifie le coût moyen et, si cela s'améliore, j'enregistre un point de contrôle. Il n'y a pas de différence entre les étapes d'une époque à l'autre. Je les traite simplement comme des points de contrôle.
Les gens mélangent souvent les données entre les époques. Je préfère utiliser la fonction random.sample pour choisir les données à traiter dans mes époques. Donc, disons que je veux faire 1000 étapes avec une taille de lot de 32. Je vais simplement sélectionner au hasard 32 000 échantillons dans le pool de données d’entraînement.
Une étape de formation est une mise à jour de gradient. En une étape batch_size, de nombreux exemples sont traités.
Une époque consiste en un cycle complet dans les données d'apprentissage. Ceci est généralement plusieurs étapes. Par exemple, si vous avez 2 000 images et utilisez une taille de lot de 10, une époque comprend 2 000 images/(10 images/étape) = 200 étapes.
Si vous choisissez notre image d'entraînement de manière aléatoire (et indépendante) à chaque étape, vous ne l'appelez normalement pas Epoch. [C'est là que ma réponse diffère de la précédente. Voir aussi mon commentaire.]
Étant donné que je suis en train d’expérimenter avec l’API tf.estimator, j’aimerais ajouter mes découvertes ici aussi. Je ne sais pas encore si l'utilisation des paramètres steps et epochs est cohérente dans TensorFlow et, par conséquent, je ne fais que me rapporter à tf.estimator (plus précisément tf.estimator.LinearRegressor) pour l'instant.
Les étapes d'apprentissage définies par num_epochs
: steps
non définies explicitement
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=1
pour l'entrée d'apprentissage et l'entrée de document pour numpy_input_fn
me dit "num_epochs: Integer, nombre d'époques à parcourir sur les données. Si None
fonctionnera pour toujours. ". Avec num_epochs=1
dans l'exemple ci-dessus, la formation se déroule exactement x_train.size/batch_size fois/étapes (dans mon cas, il s'agissait de 175 000 étapes sous la forme x_train
avait une taille de 700 000 et batch_size
avait 4).
Étapes d'apprentissage définies par num_epochs
: steps
explicitement définies comme supérieures au nombre d'étapes implicitement définies par 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)
Commentaire: num_epochs=1
dans mon cas, cela signifierait 175 000 étapes ( x_train.size/batch_size avec x_train. size = 700,000 et batch_size = 4 ) et il s’agit exactement du nombre d’étapes estimator.train
bien que le Le paramètre Steps a été défini sur 200 000 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 j'ai réglé num_epochs=1
lors de l'appel de numpy_input_fn
l'entraînement s'arrête après 1 000 pas. En effet, steps=1000
dans estimator.train(input_fn=train_input, steps=1000)
remplace le num_epochs=1
dans 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_epochs
pour tf.estimator.inputs.numpy_input_fn
et steps
pour estimator.train
définir, la limite inférieure détermine le nombre d'étapes à exécuter. .
En mots faciles
Epoch: Epoch est considéré comme le nombre d'un passage de l'ensemble de données
Steps: Dans tensorflow, une étape est considérée comme le nombre d'époques multiplié par des exemples divisés par la taille du lot
steps = (Epoch * examples)/batch size
For instance
Epoch = 100, examples = 1000 and batch_size = 1000
steps = 100
Epoque: une époque de formation représente une utilisation complète de toutes les données de formation pour le calcul et l'optimisation de gradients (former le modèle).
Étape: une étape de formation signifie une formation utilisant une taille de lot de données de formation à la fois.
Nombre d'étapes de formation par époque: total_number_of_training_examples/batch_size
Nombre total d'étapes de formation: nombre d'époques x Nombre d'étapes de formation par époque
Pourquoi les gens spécifient-ils parfois uniquement le nombre d'étapes d'apprentissage sans spécifier le nombre d'époques d'apprentissage? Donc, il suffit de définir le nombre d'étapes de formation.