2016-02-26 8 views
5

Rozumiem, że dobrą praktyką jest tasowanie próbek treningowych dla każdej epoki, tak aby każda mini-partia zawierała ładną losową próbkę całego zestawu danych. Jeśli przekonwertuję cały zestaw danych na pojedynczy plik zawierający TFRecords, to w jaki sposób można osiągnąć to szuranie przed załadowaniem całego zestawu danych? Rozumiem, że nie ma efektywnego dostępu do plików TFRecord. Tak więc, aby być konkretnym, szukam wskazówek, w jaki sposób pliki TFRecord są używane w tym scenariuszu.TFRecords i tasowanie rekordów

+0

Istnieje 'shuffle_batch', który używa' RandomShuffleQueue'. Przetasowuje buforowaną część zestawu danych, to pytanie zawiera więcej szczegółów - http://stackoverflow.com/questions/33715728/using-queues-to-uniformly-sample-from-multiple-input-files –

+0

To jest pomocne ale proponowane przez niego rozwiązanie wciąż ładuje cały zestaw danych: wydaje się, że problem polega na tym, aby upewnić się, że klasy są w równym stopniu reprezentowane w mini-serii. Jeśli załadowanie całego zbioru danych nie jest praktyczne, wydaje się, że najlepszym rozwiązaniem jest po prostu utrzymywanie kolejek nazw plików i ładowanie poszczególnych instancji (być może z wieloma wątkami wprowadzanymi do kolejki). W tym scenariuszu TFRecord nie wydaje się dostarczać wiele wartości. – bobw

Odpowiedz

3

Nie można - można nieco poprawić miksowanie, dzieląc dane wejściowe na wiele plików danych wejściowych, a następnie traktując je jako as explained in this answer.

Jeśli potrzebujesz czegoś zbliżonego do "doskonałego" tasowania, musisz go wczytać do pamięci, ale w praktyce dla większości rzeczy, prawdopodobnie dostaniesz "wystarczająco dobre" tasowanie, dzieląc się na 100 lub 1000 plików i następnie za pomocą kolejki losowej, która jest wystarczająco duża, aby pomieścić dane o wartości 8-16 plików.

Mam swędzenie w tyle głowy, aby napisać losową losową kolejkę losową, która może przelać się na dysk, ale jest bardzo niska na mojej liście priorytetów - jeśli ktoś chciałby ją wnieść, wolę przejrzeć to. :)

+6

Jak leci swędzenie? +1 – TimZaman

0

Teraz już nie musisz się martwić tasowaniem przed zapisaniem do TFRecords. To dlatego, że (obecnie) zalecana metoda odczytu TFRecords używa metody tf.data.TFRecordDataset, która implementuje metodę .shuffle().

+0

Właściwie nie jestem pewien, czy to prawda. Metoda shuffle(), którą opisujesz, daje tylko losowość lokalną (w całej pojemności kolejki), a nie w całym rekordzie. – ezfn

+0

Nigdy nie powiedziałem, że używa całego zbioru danych. Ale to również nie oznacza, że ​​tasowanie w kolejce nie jest wystarczające, aby zapewnić konieczną losowość. Widziałem, że jest on używany w kilku implementacjach, możesz rzucić okiem np. tensor2tensor repo, w którym stosowana jest ta metoda. – bartgras

Powiązane problemy