2016-02-26 14 views
5

La mia comprensione è che è buona norma mescolare i campioni di addestramento per ogni epoca in modo che ogni mini batch contenga un campione casuale di tutto il set di dati. Se converto tutto il mio set di dati in un singolo file contenente TFRecords, come si può ottenere questo shuffling prima di caricare l'intero set di dati? La mia comprensione è che non esiste un accesso casuale efficiente ai file TFRecord. Quindi, per essere precisi, sto cercando una guida su come i file TFRecord sono usati in questo scenario.TFRecords e record shuffling

+0

C'è 'shuffle_batch' che utilizza' RandomShuffleQueue'. Mescola la parte buffer del set di dati, questa domanda ha maggiori dettagli - http://stackoverflow.com/questions/33715728/using-queues-to-uniformly-sample-from-multiple-input-files –

+0

Questo è un utile post ma la soluzione che propone carica ancora l'intero set di dati: sembra che il problema sia quello di assicurarsi che le classi siano ugualmente rappresentate in un mini-batch. Se non è pratico caricare l'intero set di dati, sembra che l'approccio migliore sia semplicemente mantenere code di nomi di file e caricare singole istanze (forse con molti thread che si inseriscono in una coda). In questo scenario, TFRecord non sembra fornire molto valore. – bobw

risposta

3

Non è - è possibile migliorare la miscelazione in qualche modo suddividendo il proprio input in più file di dati di input e quindi trattandoli as explained in this answer.

Se hai bisogno di qualcosa di simile a "perfetto" mescolamento, dovresti leggerlo in memoria, ma in pratica per la maggior parte delle cose, probabilmente otterrai un "misero abbastanza" rimescolamento semplicemente dividendo in 100 o 1000 file e quindi utilizzando una coda shuffle che è abbastanza grande da contenere 8-16 file di dati.

Ho un prurito nella parte posteriore della mia testa per scrivere una coda casuale casuale shuffle che può versare su disco, ma è molto bassa sul mio elenco di priorità - se qualcuno volesse contribuire con uno, mi sto volontario per rivedere esso. :)

+6

Come va il prurito? +1 – TimZaman

0

In realtà ora non devi preoccuparti di mischiare prima di salvare su TFRecords. È perché (attualmente) il metodo consigliato per leggere TFRecords utilizza tf.data.TFRecordDataset che implementa il metodo .shuffle().

+0

In realtà, non sono sicuro che sia vero. Il metodo shuffle() che descrivi fornisce solo casualità locale (attraverso la capacità della coda), e non attraverso l'intero record. – ezfn

+0

Non ho mai detto che usa l'intero set di dati. Ma anche questo non significa che lo shuffling basato sulla coda non sia abbastanza per fornire la casualità necessaria. Ho visto che è stato utilizzato in poche implementazioni, puoi dare un'occhiata ad es. tensore tensor2tensor in cui viene utilizzato questo metodo. – bartgras

Problemi correlati