Việc chia các tệp TFRecord thành các phân đoạn giúp bạn xáo trộn các bộ dữ liệu lớn không phù hợp với bộ nhớ.
Hãy tưởng tượng bạn có hàng triệu ví dụ đào tạo được lưu trên đĩa và bạn muốn liên tục chạy chúng thông qua một quy trình đào tạo. Hơn nữa, giả sử rằng với mỗi lần lặp lại dữ liệu huấn luyện (tức là mỗi kỷ nguyên), bạn muốn tải dữ liệu theo thứ tự hoàn toàn ngẫu nhiên.
Một cách tiếp cận là có một tệp cho mỗi ví dụ đào tạo và tạo danh sách tất cả tên tệp. Sau đó, ở đầu mỗi epoch, bạn xáo trộn danh sách tên tệp và tải các tệp riêng lẻ. Vấn đề với phương pháp này là bạn đang tải hàng triệu tệp từ các vị trí ngẫu nhiên trên đĩa của bạn. Điều này có thể chậm đặc biệt là trên một ổ đĩa cứng. Ngay cả một mảng RAID 0 cũng không giúp ích gì về tốc độ nếu bạn đang tải hàng triệu tệp nhỏ từ các vị trí ngẫu nhiên. Vấn đề thậm chí còn tồi tệ hơn nếu bạn đang truy cập các tệp qua kết nối mạng.
Một cách tiếp cận khác là đọc các ví dụ huấn luyện theo trình tự từ một tệp TFRecord lớn và xáo trộn các ví dụ trong bộ nhớ bằng cách sử dụng bộ đệm xáo trộn. Tuy nhiên, bộ đệm xáo trộn thường không thể lớn hơn bộ nhớ DDR có sẵn cho CPU của bạn. Và nếu bộ đệm xáo trộn nhỏ hơn đáng kể so với tập dữ liệu của bạn, thì nó có thể không xáo trộn đầy đủ dữ liệu. Dữ liệu có thể được xáo trộn "cục bộ" nhưng không bị xáo trộn "toàn cầu". Đó là, các ví dụ từ đầu tập dữ liệu có thể không được xáo trộn với các ví dụ từ cuối tập dữ liệu.
Một giải pháp tốt là sử dụng kết hợp cân bằng hai cách tiếp cận trên bằng cách chia dữ liệu của bạn thành nhiều tệp TFRecord (được gọi là phân đoạn). Trong mỗi kỷ nguyên, bạn có thể xáo trộn tên tập tin shard để có được sự xáo trộn toàn cầu và sử dụng bộ đệm xáo trộn để có được sự xáo trộn cục bộ. Một sự cân bằng tốt sẽ làm cho các mảnh vỡ đủ lớn để ngăn chặn các vấn đề về tốc độ đĩa nhưng sẽ giữ cho các mảnh vỡ đủ nhỏ để cho phép xáo trộn đầy đủ bởi một bộ đệm xáo trộn.
Dưới đây là các bước chính xác:
- Đặt ngẫu nhiên tất cả các ví dụ đào tạo vào nhiều tệp TFRecord (phân đoạn).
- Vào đầu mỗi kỷ nguyên, xáo trộn danh sách tên tập tin shard.
- Đọc các ví dụ đào tạo từ các phân đoạn và chuyển các ví dụ thông qua bộ đệm xáo trộn. Thông thường, bộ đệm xáo trộn phải lớn hơn kích thước phân đoạn để đảm bảo xáo trộn tốt trên các mảnh vỡ.
- Vượt qua các ví dụ xáo trộn vào quá trình đào tạo của bạn.
.shuffle()
phương pháp không phải là một giải pháp lý tưởng nếu bạn có một tệp tfrecord lớn. Đầu ra được xáo trộn có phần liên quan đến thứ tự ban đầu nếu bạn không sử dụng kích thước bộ đệm lớn. Tôi nghĩ việc trộn trước dữ liệu trước khi lưu vào tfrecord hoặc chia thành các phân đoạn là cần thiết khi bạn có một tập dữ liệu lớn.