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

Dans la plupart des modèles, il existe un paramètre d’ étapes indiquant le nombre d’étapes à exécuter sur les données . Mais pourtant, dans la plupart des cas, nous réalisons la fonction d’ajustement N époques .

Quelle est la différence entre exécuter 1000 pas avec 1 époque et exécuter 100 pas avec 10 époques? Lequel est le meilleur en pratique? Toute logique change entre les époques consécutives? Mélange de données?

Une époque signifie généralement une itération de toutes les données de formation. 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, j’ai l’habitude de définir un nombre fixe d’étapes comme 1000 par période, même si j’ai un dataset beaucoup plus volumineux. À la fin de l’époque, je vérifie le coût moyen et si cela s’améliore, j’enregistre un sharepoint 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 se déplacent souvent autour de l’dataset entre les époques. Je préfère utiliser la fonction random.sample pour choisir les données à traiter dans mes époques. Alors, disons que je veux faire 1000 étapes avec une taille de lot de 32. Je vais simplement choisir au hasard 32 000 échantillons du pool de données de formation.

Une étape de formation est une mise à jour de dégradé. Dans une étape, batch_size de nombreux exemples sont traités.

Une époque consiste en un cycle complet à travers les données d’entraînement. C’est généralement beaucoup d’étapes. Par exemple, si vous avez 2 000 images et utilisez une taille de lot de 10, une époque se compose de 2 000 images / (10 images / pas) = ​​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 époque. [C’est là que ma réponse diffère de la précédente. Voir aussi mon commentaire.]

Comme je suis actuellement en train d’expérimenter l’API tf.estimator, je voudrais aussi append mes résultats de rosée ici. Je ne sais pas encore si l’utilisation des parameters step et epochs est cohérente à travers TensorFlow et je ne parle donc que de tf.estimator (en particulier tf.estimator.LinearRegressor) pour le moment.

Les étapes de formation 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’entraînement et l’entrée doc pour numpy_input_fn me dit “num_epochs: Integer, nombre d’époques à parcourir sur les données. Si None est exécuté pour toujours.” . Avec num_epochs=1 dans l’exemple ci-dessus, l’entraînement s’exécute exactement x_train.size / batch_size times / steps (dans mon cas, il s’agissait de 175000 pas car x_train avait une taille de 700000 et batch_size était de 4).

num_epochs d’ num_epochs définies par num_epochs : steps explicitement définies 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 signifierait 175000 pas ( x_train.size / batch_size avec x_train.size = 700,000 et batch_size = 4 ) et c’est exactement le nombre d’étapes estimator.train même si le paramètre steps a été défini à 200 000 estimator.train(input_fn=train_input, steps=200000) .

Les é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’aie défini num_epochs=1 lors de l’appel de numpy_input_fn l’entraînement s’arrête après 1000 pas. C’est parce que steps=1000 dans estimator.train(input_fn=train_input, steps=1000) écrase 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 : Quel que soit le paramètre ( num_epochs pour tf.estimator.inputs.numpy_input_fn ou steps pour estimator.train ) définissant la limite inférieure, cela détermine le nombre d’étapes à exécuter.