Memisahkan file TFRecord ke dalam pecahan membantu Anda mengocok kumpulan data besar yang tidak akan masuk ke dalam memori.
Bayangkan Anda memiliki jutaan contoh pelatihan yang disimpan di disk dan Anda ingin berulang kali menjalankannya melalui proses pelatihan. Lebih jauh, anggaplah bahwa untuk setiap pengulangan data pelatihan (yaitu setiap zaman) Anda ingin memuat data dalam urutan yang benar-benar acak.
Satu pendekatan adalah memiliki satu file per contoh pelatihan dan menghasilkan daftar semua nama file. Kemudian pada awal setiap zaman, Anda mengacak daftar nama file dan memuat file-file individual. Masalah dengan pendekatan ini adalah Anda memuat jutaan file dari lokasi acak pada disk Anda. Ini bisa lambat terutama pada hard disk drive. Bahkan array RAID 0 tidak akan membantu dengan kecepatan jika Anda memuat jutaan file kecil dari lokasi acak. Masalahnya menjadi lebih buruk jika Anda mengakses file melalui koneksi jaringan.
Pendekatan lain adalah membaca contoh-contoh pelatihan secara berurutan dari satu file TFRecord besar dan mengocok contoh-contoh dalam memori menggunakan buffer shuffle. Namun, shuffle buffer biasanya tidak bisa lebih besar dari memori DDR yang tersedia untuk CPU Anda. Dan jika shuffle buffer secara signifikan lebih kecil dari dataset Anda, maka itu mungkin tidak cukup mengocok data. Data mungkin "dikocok" secara lokal tetapi tidak dikocok "secara global". Artinya, contoh-contoh dari awal dataset tidak boleh dikocok dengan contoh-contoh dari akhir dataset.
Solusi yang baik adalah dengan menggunakan kombinasi seimbang dari dua pendekatan di atas dengan memisahkan dataset Anda menjadi beberapa file TFRecord (disebut pecahan). Selama setiap zaman, Anda dapat mengocok nama file shard untuk mendapatkan pengocokan global dan menggunakan buffer pengocok untuk mendapatkan pengocokan lokal. Keseimbangan yang baik akan membuat shard cukup besar untuk mencegah masalah kecepatan disk tetapi akan membuat shard cukup kecil untuk memungkinkan pengocokan yang cukup oleh shuffle buffer.
Berikut langkah-langkahnya:
- Tempatkan secara acak semua contoh pelatihan ke dalam beberapa file TFRecord (pecahan).
- Di awal setiap zaman, kocok daftar nama file shard.
- Baca contoh pelatihan dari pecahan dan berikan contoh melalui buffer acak. Biasanya, shuffle buffer harus lebih besar dari ukuran shard untuk memastikan pengocokan shard yang baik.
- Masukkan contoh-contoh yang diacak ke dalam proses pelatihan Anda.
.shuffle()
Metode bukan solusi ideal jika Anda memiliki satu file tfrecord besar. Output yang dikocok agak terkait dengan pesanan asli jika Anda tidak menggunakan ukuran buffer yang besar. Saya pikir pre-shuffle data sebelum menyimpan ke tfrecord atau membelah menjadi pecahan diperlukan ketika Anda memiliki dataset besar.