Jaka jest różnica między krokami a epokami w TensorFlow?


125

W większości modeli występuje parametr steps określający liczbę kroków potrzebnych do uruchomienia danych . Jednak widzę, że w większości praktycznych zastosowań wykonujemy również funkcję dopasowania N epok .

Jaka jest różnica między uruchomieniem 1000 kroków w 1 epoce a przebiegiem 100 kroków z 10 epoką? Który z nich jest lepszy w praktyce? Jakieś zmiany logiczne między kolejnymi epokami? Tasowanie danych?


1
Jason Brownlee z machinelearningmastery.com ma bardzo ładną, szczegółową odpowiedź na dokładnie to pytanie.
BmyGuest

Odpowiedzi:


84

Epoka zwykle oznacza jedną iterację po wszystkich danych uczących. Na przykład, jeśli masz 20 000 obrazów i rozmiar partii 100, to epoka powinna zawierać 20 000/100 = 200 kroków. Jednak zwykle ustawiam stałą liczbę kroków, na przykład 1000 na epokę, mimo że mam znacznie większy zestaw danych. Pod koniec epoki sprawdzam średni koszt i jeśli się poprawił to zapisuję punkt kontrolny. Nie ma różnicy między krokami z jednej epoki do drugiej. Traktuję je po prostu jako punkty kontrolne.

Ludzie często poruszają się po zbiorach danych między epokami. Wolę używać funkcji random.sample, aby wybrać dane do przetworzenia w moich epokach. Powiedzmy, że chcę wykonać 1000 kroków przy wielkości partii 32. Po prostu wybiorę losowo 32 000 próbek z puli danych uczących.


47
Moim zdaniem druga część twojej odpowiedzi jest błędna. Epoka jest definiowana jako jeden cykl przez dane uczące. Nie jest to epoka, jeśli ustalisz liczbę kroków. Analogicznie nie możesz nazwać tego epoką, jeśli próbkujesz przykład treningowy niezależnie w każdym kroku. Możesz zapisać swój punkt kontrolny i sprawdzać co N Kroków, ale nie oznacza to, że N Kroków staje się epoką. Uniknąłbym nazwania tej epoki w kodzie, może to być mylące.
MarvMind,

84

Etap szkolenia to jedna aktualizacja gradientu. W jednym kroku batch_size przetwarzanych jest wiele przykładów.

Epoka składa się z jednego pełnego cyklu obejmującego dane uczące. Zwykle jest to wiele kroków. Na przykład, jeśli masz 2000 obrazów i używasz rozmiaru partii 10, epoka składa się z 2000 obrazów / (10 obrazów / krok) = 200 kroków.

Jeśli wybierzesz nasz obraz treningowy losowo (i niezależnie) na każdym kroku, zwykle nie nazywasz tego epoką. [Tutaj moja odpowiedź różni się od poprzedniej. Zobacz także mój komentarz.]


Zrobiłem edycję w obliczeniu 200 kroków, ale zapomniałem się zalogować, więc jeśli chcesz porozmawiać z „nieznanym użytkownikiem” ... Jestem tutaj
Chris Chiasson.

16

Ponieważ obecnie eksperymentuję z interfejsem API tf.estimator, chciałbym tutaj również dodać moje zroszone odkrycia. Nie wiem jeszcze, czy użycie parametrów kroków i epok jest spójne w całym TensorFlow i dlatego na razie odnoszę się tylko do tf.estimator (a konkretnie tf.estimator.LinearRegressor).

Etapy szkolenia zdefiniowane przez num_epochs: stepsnie zostały wyraźnie określone

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)

Komentarz: Ustawiłemnum_epochs=1 dla danych wejściowych uczących i wpis w dokumencie numpy_input_fnmówi mi „num_epochs: Integer, liczba epok do iteracji po danych. Jeśli Nonebędzie działać wiecznie”. . W num_epochs=1powyższym przykładzie szkolenie przebiega dokładnie x_train.size / batch_size razy / kroki (w moim przypadku było to 175000 kroków, a x_trainmiał rozmiar 700000 ibatch_size było 4).

Kroki szkoleniowe zdefiniowane przez num_epochs: stepsjawnie zdefiniowane powyżej liczby kroków domyślnie zdefiniowane przeznum_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)

Komentarz: num_epochs=1w moim przypadku oznaczałoby to 175000 kroków ( x_train.size / batch_size z x_train.size = 700000 i batch_size = 4 ) i jest to dokładnie liczba kroków, estimator.trainchociaż parametr kroków został ustawiony na 200000 estimator.train(input_fn=train_input, steps=200000).

Etapy szkolenia zdefiniowane przez 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)

Komentarz: Chociaż ustawiłem num_epochs=1przy wywoływaniu numpy_input_fntrening zatrzymuje się po 1000 krokach. Dzieje się tak, ponieważ steps=1000w estimator.train(input_fn=train_input, steps=1000)nadpisuje num_epochs=1in tf.estimator.inputs.numpy_input_fn({'x':x_train},y_train,batch_size=4,num_epochs=1,shuffle=True).

Wniosek : Niezależnie od parametrów num_epochsdla tf.estimator.inputs.numpy_input_fni stepsdo estimator.trainzdefiniowania, dolna granica określa liczbę kroków, które zostaną wykonane.


11

W prostych słowach
Epoka: Epoka jest traktowana jako liczba jednego przebiegu z całego zbioru danych
Kroki: W tensorflow jeden krok jest traktowany jako liczba epok pomnożona przez przykłady podzielone przez rozmiar partii

steps = (epoch * examples)/batch size
For instance
epoch = 100, examples = 1000 and batch_size = 1000
steps = 100

Umar, uzyskuję lepszy wynik, używając twojej formuły, ale zastanawiam się, dlaczego każdy ma inną formułę? Jak wszyscy powyżej mówią, kroki = (całkowita liczba obrazów) / rozmiar partii.
Satyendra Sahani

@SatyendraSahani Otrzymałem tę formułę od jednego z instruktorów kursu GCP oferowanego na coursera, może tak jest, że uzyskałeś lepszy wynik.
Muhammad Umar Amanat

@Umar, ale czasami liczba próbek jest ogromna. Tak jak w naszym przypadku mamy 99 000 próbek. Jeśli wybierzemy rozmiar wsadu 8 i epoki 20., całkowita wielkość step_size wynosi (20 * 99000) / 8 = 247,500. To naprawdę duża liczba. tam zaczynam wątpić w tę metodę.
Satyendra Sahani

8

Epoka: okres uczenia reprezentuje pełne wykorzystanie wszystkich danych uczących do obliczania gradientów i optymalizacji (trenowanie modelu).

Krok: Etap uczenia oznacza użycie jednego rozmiaru partii danych uczących do trenowania modelu.

Liczba kroków treningowych na epokę: total_number_of_training_examples/batch_size .

Całkowita liczba kroków treningowych: number_of_epochsx Number of training steps per epoch.


2

Ponieważ nie ma jeszcze zaakceptowanej odpowiedzi: Domyślnie epoka obejmuje wszystkie dane treningowe. W tym przypadku masz n kroków, gdzie n = długość_szkolenia / rozmiar_batchu.

Jeśli Twoje dane treningowe są zbyt duże, możesz zdecydować o ograniczeniu liczby kroków w ciągu epoki. [ Https://www.tensorflow.org/tutorials/structured_data/time_series?_sm_byp=iVVF1rD6n2Q68VSN]

Gdy liczba kroków osiągnie ustalony limit, proces rozpocznie się od nowa, rozpoczynając kolejną epokę. Podczas pracy w TF Twoje dane są zwykle najpierw przekształcane w listę partii, które zostaną przekazane do modelu w celu szkolenia. Na każdym etapie przetwarzasz jedną partię.

Jeśli chodzi o to, czy lepiej ustawić 1000 kroków dla 1 epoki, czy 100 kroków dla 10 epok, nie wiem, czy istnieje prosta odpowiedź. Ale oto wyniki szkolenia CNN przy użyciu obu podejść przy użyciu samouczków dotyczących danych TensorFlow Timeseries:

W tym przypadku oba podejścia prowadzą do bardzo podobnych przewidywań, różnią się tylko profile treningowe.

kroki = 20 / epoki = 100 wprowadź opis obrazu tutaj

wprowadź opis obrazu tutaj

kroki = 200 / epok = 10

wprowadź opis obrazu tutaj

wprowadź opis obrazu tutaj

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.