TFRecord dosyalarını kırıklara bölmek, belleğe sığmayan büyük veri kümelerini karıştırmanıza yardımcı olur.
Diskte kayıtlı milyonlarca eğitim örneğiniz olduğunu ve bunları bir eğitim süreci boyunca tekrar tekrar çalıştırmak istediğinizi düşünün. Ayrıca, egzersiz verilerinin her tekrarında (yani her bir çağda) verileri tamamen rastgele bir sırada yüklemek istediğinizi varsayalım.
Bir yaklaşım, eğitim örneği başına bir dosyaya sahip olmak ve tüm dosya adlarının bir listesini oluşturmaktır. Daha sonra her dönemin başında dosya adları listesini karıştırır ve dosyaları tek tek yüklersiniz. Bu yaklaşımdaki sorun, diskinizdeki rastgele konumlardan milyonlarca dosya yüklemenizdir. Bu özellikle bir sabit disk sürücüsünde yavaş olabilir. Rastgele konumlardan milyonlarca küçük dosya yüklerseniz bir RAID 0 dizisi bile hızda yardımcı olmaz. Bir ağ bağlantısı üzerinden dosyalara erişiyorsanız sorun daha da kötüleşir.
Diğer bir yaklaşım, eğitim örneklerini büyük bir TFRecord dosyasından sırayla okumak ve bir karıştırma tamponu kullanarak bellekteki örnekleri karıştırmaktır. Ancak, karıştırma arabelleği genellikle CPU'nuzun kullanabileceği DDR belleğinden daha büyük olamaz. Karıştırma arabelleği, veri kümenizden önemli ölçüde daha küçükse, verileri yeterince karıştırmayabilir. Veriler "yerel olarak" karıştırılabilir, ancak "global olarak" karıştırılamaz. Yani, veri kümesinin başlangıcından örnekler veri kümesinin sonundan örneklerle karıştırılamaz.
İyi bir çözüm, veri kümenizi birden çok TFRecord dosyasına (parça adı verilir) bölerek yukarıdaki iki yaklaşımın dengeli bir kombinasyonunu kullanmaktır. Her çağda, küresel karıştırma elde etmek için parça dosya adlarını karıştırabilir ve yerel karıştırma için bir karıştırma arabelleği kullanabilirsiniz. İyi bir denge, parçaların disk hızı sorunlarını önleyecek kadar büyük olmasını sağlar, ancak parçaları bir arabellekle yeterince karıştırmaya izin verecek kadar küçük tutar.
İşte tam adımlar:
- Tüm eğitim örneklerini rastgele birden fazla TFRecord dosyasına (kırık) yerleştirin.
- Her dönemin başında, kırık dosya adları listesini karıştırın.
- Kırıklardan eğitim örneklerini okuyun ve örnekleri bir karıştırma tamponundan geçirin. Tipik olarak, karıştırma tamponu, kırıklar arasında iyi karıştırma sağlamak için parça boyutundan daha büyük olmalıdır.
- Karıştırılmış örnekleri eğitim sürecinize aktarın.
.shuffle()
büyük bir tfrecord dosyanız varsa yöntem ideal bir çözüm değildir. Karıştırılmış çıktı, büyük bir arabellek boyutu kullanmıyorsanız orijinal siparişle bir miktar ilişkilidir. Büyük bir veri kümeniz olduğunda, tfrecord'a kaydetmeden veya parçalara bölmeden önce verileri önceden karıştırmak gerektiğini düşünüyorum.