Разделение файлов TFRecord на осколки помогает перетасовать большие наборы данных, которые не помещаются в память.
Представьте, что у вас есть миллионы обучающих примеров, сохраненных на диске, и вы хотите многократно выполнять их в процессе обучения. Кроме того, предположим, что для каждого повторения обучающих данных (т.е. для каждой эпохи) вы хотите загружать данные в совершенно случайном порядке.
Один из подходов состоит в том, чтобы иметь один файл на учебный пример и генерировать список всех имен файлов. Затем в начале каждой эпохи вы перемешиваете список имен файлов и загружаете отдельные файлы. Проблема этого подхода заключается в том, что вы загружаете миллионы файлов из случайных мест на вашем диске. Это может быть медленным, особенно на жестком диске. Даже массив RAID 0 не поможет со скоростью, если вы загружаете миллионы маленьких файлов из случайных мест. Проблема становится еще хуже, если вы получаете доступ к файлам через сетевое соединение.
Другой подход заключается в чтении обучающих примеров по порядку из одного большого файла TFRecord и перемешивании примеров в памяти с использованием буфера перемешивания. Однако буфер случайного воспроизведения обычно не может быть больше памяти DDR, доступной вашему ЦП. И если буфер перемешивания значительно меньше, чем ваш набор данных, то он может не адекватно перемешивать данные. Данные могут быть «локально» перетасованы, но не «глобально» перетасованы. То есть примеры из начала набора данных не могут быть перемешаны с примерами из конца набора данных.
Хорошее решение - использовать сбалансированную комбинацию двух вышеупомянутых подходов, разделив ваш набор данных на несколько файлов TFRecord (называемых осколками). В течение каждой эпохи вы можете перетасовывать имена осколков для получения глобальной перестановки и использовать буфер перестановок для получения локальной перестановки. Хороший баланс сделает шарды достаточно большими, чтобы предотвратить проблемы со скоростью диска, но при этом шарды будут достаточно маленькими, чтобы можно было адекватно перетасовать буфер перемешивания.
Вот точные шаги:
- Поместите случайным образом все обучающие примеры в несколько файлов TFRecord (осколки).
- В начале каждой эпохи перемешивайте список имен файлов осколков.
- Прочитайте обучающие примеры из осколков и пропустите их через буфер перемешивания. Как правило, буфер перетасовки должен быть больше, чем размер сегмента, чтобы обеспечить хорошую перестановку между фрагментами.
- Передайте перемешанные примеры в процессе обучения.
.shuffle()
Метод не является идеальным решением, если у вас есть один большой файл tfrecord. Перемешанный вывод несколько связан с исходным порядком, если вы не используете большой размер буфера. Я думаю, что необходимо предварительно перемешать данные перед сохранением в tfrecord или разбить их на фрагменты, когда у вас большой набор данных.