Saya sedang mengerjakan pengenalan suara dengan Tensorflow dan berencana untuk melatih LSTM NN dengan dataset gelombang besar. Karena keuntungan kinerja, saya berencana menggunakan tfrecords. Ada beberapa contoh di internet (Inception for ex.) Di mana file tfrecords dibagi menjadi pecahan. Pertanyaan saya adalah: apa manfaat memiliki file tfrecords ke dalam pecahan? Apakah ada penambahan kinerja tambahan dari pemisahan ini?
sumber
.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.Bagi mereka yang masih bertanya-tanya: itu agar Anda dapat mengocok data Anda. Dengan TF record Anda dalam satu file, Anda tidak dapat mengacak pesanan. Ini biasanya diperlukan dengan SGD.
Namun, dengan pecahan, Anda dapat mengacak urutan pecahan yang memungkinkan Anda untuk memperkirakan pengacakan data seolah-olah Anda memiliki akses ke TFRecords individu. Ini jelas lebih baik daripada tidak sama sekali, dan jelas semakin banyak pecahan yang Anda miliki, semakin baik perkiraan ini.
Alternatifnya adalah pre-shuffle data Anda melalui menduplikasi atau tidak menggunakan TFRecords sama sekali.
sumber
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:
sumber
Membagi file TFRecords menjadi beberapa pecahan pada dasarnya memiliki 3 keuntungan:
sumber