Wczesne zatrzymanie to po prostu zatrzymanie treningu, gdy strata zacznie rosnąć (innymi słowy, dokładność walidacji zaczyna spadać). Według dokumentów jest używany w następujący sposób;
keras.callbacks.EarlyStopping(monitor='val_loss',
min_delta=0,
patience=0,
verbose=0, mode='auto')
Wartości zależą od implementacji (problem, wielkość partii itp.), Ale ogólnie, aby zapobiec nadmiernemu dopasowaniu, użyłbym;
- Monitoruj utratę walidacji (musisz użyć walidacji krzyżowej lub przynajmniej trenować / testować zestawy), ustawiając
monitor
argument na 'val_loss'
.
min_delta
jest progiem pozwalającym określić ilościowo stratę w pewnym okresie jako poprawę, czy nie. Jeżeli różnica strat jest niższa min_delta
, określa się ją ilościowo jako brak poprawy. Lepiej zostawić wartość 0, ponieważ interesuje nas, kiedy strata się pogarsza.
patience
Argument reprezentuje liczbę epok przed zakończeniem, gdy strata zacznie rosnąć (przestanie się poprawiać). Zależy to od implementacji, jeśli używasz bardzo małych partii
lub dużego tempa uczenia się, twoja strata będzie zygzakowata (dokładność będzie bardziej hałaśliwa), więc lepiej ustaw duży patience
argument. Jeśli używasz dużych partii i mały wskaźnik uczenia się, Twoja strata będzie gładsza, więc możesz użyć mniejszego patience
argumentu. Tak czy inaczej zostawię to jako 2, więc dałbym modelowi więcej szans.
verbose
decyduje, co wydrukować, pozostaw to domyślne (0).
mode
Argument zależy od tego, w jakim kierunku ma monitorowana ilość (czy ma się zmniejszać, czy zwiększać), ponieważ monitorujemy stratę, możemy użyć min
. Ale zostawmy to kerasowi, który zajmie się tym za nas i ustawmy to naauto
Więc użyłbym czegoś takiego i eksperymentowałbym, wykreślając utratę błędu z wczesnym zatrzymaniem i bez niego.
keras.callbacks.EarlyStopping(monitor='val_loss',
min_delta=0,
patience=2,
verbose=0, mode='auto')
Aby uzyskać ewentualną niejednoznaczność dotyczącą działania wywołań zwrotnych, spróbuję wyjaśnić więcej. Raz zadzwoniszfit(... callbacks=[es])
modelu Keras wywołuje określone obiekty wywołania zwrotnego z predefiniowanymi funkcjami. Funkcje te można nazwać on_train_begin
, on_train_end
, on_epoch_begin
, on_epoch_end
i on_batch_begin
,on_batch_end
. Wczesne zatrzymanie wywołania zwrotnego jest wywoływane na każdym końcu epoki, porównuje najlepiej monitorowaną wartość z bieżącą i zatrzymuje się, jeśli spełnione są warunki (ile epok minęło od momentu zaobserwowania najlepiej monitorowanej wartości i czy jest to coś więcej niż argument cierpliwości, różnica między ostatnia wartość jest większa niż min_delta itp.).
Jak wskazał @BrentFaust w komentarzach, uczenie modelu będzie kontynuowane, dopóki nie zostaną spełnione warunki wczesnego zatrzymania lub epochs
parametr (domyślnie = 10) w fit()
zostanie spełniony. Ustawienie wywołania zwrotnego wczesnego zatrzymania nie spowoduje, że model będzie trenował poza jego epochs
parametrem. Więc wywołanie fit()
funkcji z większymepochs
wartości przyniosłoby większe korzyści z wywołania zwrotnego Early Stopping.
min_delta
jest progiem określającym ilościowo zmianę monitorowanej wartości jako poprawę, czy też nie. Więc tak, jeśli podamy,monitor = 'val_loss'
to odnosi się to do różnicy między bieżącą utratą walidacji a poprzednią utratą walidacji. W praktyce, jeśli podaszmin_delta=0.1
spadek utraty walidacji (bieżący - poprzedni) mniejszy niż 0,1, nie będzie to kwantyfikować, a tym samym zatrzyma szkolenie (jeśli maszpatience = 0
).callbacks=[EarlyStopping(patience=2)]
nie ma to żadnego efektu, chyba że podano epokimodel.fit(..., epochs=max_epochs)
.epoch=1
w pętli for (dla różnych przypadków użycia), w którym to wywołanie zwrotne zakończy się niepowodzeniem. Jeśli w mojej odpowiedzi jest dwuznaczność, spróbuję to ująć w lepszy sposób.restore_best_weights
argumentu (jeszcze nie w dokumentacji), który po treningu wczytuje model z najlepszymi wagami. Ale dla twoich celówModelCheckpoint
użyłbym callback zsave_best_only
argumentem. Możesz sprawdzić dokumentację, jest prosta w obsłudze, ale po treningu musisz ręcznie załadować najlepsze ciężarki.