Jak działa parametr validation_split funkcji dopasowania Keras?

17

Podział walidacji w funkcji dopasowania modelu sekwencyjnego Keras jest udokumentowany w następujący sposób na https://keras.io/models/sequential/ :

validation_split: Zmienna między 0 a 1. Część danych treningowych do wykorzystania jako dane walidacyjne. Model oddzieli tę część danych treningowych, nie będzie na nich trenował i oceni utratę oraz wszelkie metryki modelu na tych danych na końcu każdej epoki. Dane sprawdzania poprawności są wybierane z ostatnich próbek w dostarczonych danych x i y, przed tasowaniem.

Proszę zwrócić uwagę na ostatni wiersz:

Dane sprawdzania poprawności są wybierane z ostatnich próbek w dostarczonych danych x i y, przed tasowaniem.

Czy to oznacza, że ​​dane sprawdzania poprawności są zawsze ustalane i pobierane z dolnej części głównego zestawu danych?

Czy można w jakiś sposób losowo wybrać podaną część danych z głównego zestawu danych?

rnso
źródło

Odpowiedzi:

17

W rzeczywistości nie chcesz ponownie próbkować zestawu sprawdzania poprawności po każdej epoce. Jeśli to zrobisz, Twój model zostanie przeszkolony na każdej pojedynczej próbce w zbiorze danych, a to spowoduje nadmierne dopasowanie. Chcesz zawsze podzielić dane przed procesem szkoleniowym, a następnie algorytm powinien być szkolony przy użyciu podzbioru danych do treningu.

Zaprojektowana funkcja zapewnia, że ​​dane są rozdzielone w taki sposób, że zawsze trenuje tę samą część danych dla każdej epoki. Całe tasowanie odbywa się w próbce treningowej między epokami, jeśli ta opcja jest wybrana.

Jednak w przypadku niektórych zestawów danych pobranie ostatnich kilku instancji nie jest przydatne, szczególnie jeśli zestaw danych jest przegrupowany na podstawie klasy. Następnie rozkład waszych klas będzie wypaczony. Potrzebny będzie zatem jakiś sposób losowego wyodrębnienia podzbioru danych, aby uzyskać zrównoważone rozkłady klas w zestawie szkoleniowym i walidacyjnym. W tym celu zawsze lubię używać funkcji sklearn w następujący sposób

from sklearn.model_selection import train_test_split

# Split the data
x_train, x_valid, y_train, y_valid = train_test_split(data, labels, test_size=0.33, shuffle= True)

Jest to przyjemna, łatwa w użyciu funkcja, która robi to, co chcesz. Zmienne datai labelssą standardowymi macierzami liczbowymi, przy czym pierwszym wymiarem są instancje.

JahKnows
źródło
1
Nie miałem na myśli ustawiania różnych zestawów testowych po każdej epoce. Pytałem o to, czy pobiera dane z końca zestawu danych, ponieważ wiele zestawów danych może być ułożonych według klasy (jak wspomniałeś). Wiem o tym train_test_spliti teraz potwierdzasz, że jest to lepsza metoda, ponieważ losowo pobiera dane testowe / sprawdzające poprawność z zestawu danych.
rnso
@rnso, niestety Keras nie zapewnia tej opcji. Myślę, że tak naprawdę nie wchodzi w zakres tego, co chcą zaoferować. Sprawiłoby, że implementacja byłaby nieco myląca, mając 2 różne metody wprowadzania danych z losową nazwą.
JahKnows
Czy nie użyłeś definicji walidacji i danych testowych, używając tego train_test_spli?
bagustris
Jeśli użyjesz tego shuffleparametru, czy użyjesz go również shufflew modelu .fitfor keras?
Shamoon