Dzielenie plików TFRecord na odłamki pomaga tasować duże zestawy danych, które nie mieszczą się w pamięci.
Wyobraź sobie, że masz zapisane miliony przykładów szkoleń na dysku i chcesz je wielokrotnie przeprowadzać podczas procesu szkolenia. Ponadto załóżmy, że dla każdego powtórzenia danych treningowych (tj. Każdej epoki) chcesz załadować dane w całkowicie losowej kolejności.
Jednym z podejść jest posiadanie jednego pliku na przykład szkolenia i generowanie listy wszystkich nazw plików. Następnie na początku każdej epoki tasujesz listę nazw plików i ładujesz poszczególne pliki. Problem z tym podejściem polega na tym, że ładujesz miliony plików z losowych lokalizacji na dysku. Może to być powolne, szczególnie na dysku twardym. Nawet macierz RAID 0 nie pomoże w szybkości, jeśli ładujesz miliony małych plików z losowych lokalizacji. Problem staje się jeszcze poważniejszy, jeśli uzyskujesz dostęp do plików przez połączenie sieciowe.
Innym podejściem jest odczytywanie przykładów treningu w jednym dużym pliku TFRecord i tasowanie przykładów w pamięci za pomocą bufora losowego. Jednak bufor losowy zwykle nie może być większy niż pamięć DDR dostępna dla procesora. A jeśli bufor losowy jest znacznie mniejszy niż zestaw danych, może on nie przetasować danych w odpowiedni sposób. Dane mogą być tasowane „lokalnie”, ale nie tasowane „globalnie”. Oznacza to, że przykładów z początku zestawu danych nie można tasować z przykładami z końca zestawu danych.
Dobrym rozwiązaniem jest użycie zrównoważonej kombinacji powyższych dwóch podejść poprzez podzielenie zestawu danych na wiele plików TFRecord (zwanych odłamkami). Podczas każdej epoki możesz losowo zmieniać nazwy plików odłamków, aby uzyskać losowe tasowanie globalne, i użyć bufora losowego, aby uzyskać lokalne losowanie. Dobra równowaga sprawi, że odłamki będą wystarczająco duże, aby zapobiec problemom z prędkością dysku, ale utrzymają odłamki na tyle małe, aby umożliwić odpowiednie przetasowanie przez bufor losowy.
Oto dokładne kroki:
- Losowo umieść wszystkie przykłady treningu w wielu plikach TFRecord (odłamkach).
- Na początku każdej epoki potasuj listę nazw plików odłamków.
- Przeczytaj przykłady szkolenia z odłamków i prześlij je przez bufor losowy. Zazwyczaj bufor losowy powinien być większy niż rozmiar fragmentu, aby zapewnić dobre tasowanie między fragmentami.
- Przekaż tasowane przykłady do swojego procesu treningowego.
.shuffle()
Metoda nie jest idealnym rozwiązaniem, jeśli masz jeden duży plik tfrecord. Przetasowane dane wyjściowe są nieco związane z pierwotną kolejnością, jeśli nie używasz dużego rozmiaru bufora. Myślę, że wstępne przetasowanie danych przed zapisaniem do tfrecord lub podzieleniem na odłamki jest konieczne, gdy masz duży zestaw danych.