Dividir los archivos TFRecord en fragmentos lo ayuda a mezclar grandes conjuntos de datos que no caben en la memoria.
Imagine que tiene millones de ejemplos de capacitación guardados en el disco y desea ejecutarlos repetidamente a través de un proceso de capacitación. Además, suponga que para cada repetición de los datos de entrenamiento (es decir, cada época) desea cargar los datos en un orden completamente aleatorio.
Un enfoque es tener un archivo por ejemplo de entrenamiento y generar una lista de todos los nombres de archivo. Luego, al comienzo de cada época, baraja la lista de nombres de archivo y carga los archivos individuales. El problema con este enfoque es que está cargando millones de archivos desde ubicaciones aleatorias en su disco. Esto puede ser lento, especialmente en un disco duro. Incluso una matriz RAID 0 no ayudará con la velocidad si está cargando millones de archivos pequeños desde ubicaciones aleatorias. El problema empeora aún más si está accediendo a los archivos a través de una conexión de red.
Otro enfoque es leer los ejemplos de entrenamiento en secuencia de un archivo TFRecord grande y mezclar los ejemplos en la memoria utilizando un búfer aleatorio. Sin embargo, el búfer aleatorio normalmente no puede ser mayor que la memoria DDR disponible para su CPU. Y si el búfer aleatorio es significativamente más pequeño que su conjunto de datos, entonces puede que no baraje adecuadamente los datos. Los datos pueden ser barajados "localmente" pero no barajados "globalmente". Es decir, los ejemplos del comienzo del conjunto de datos no pueden mezclarse con ejemplos del final del conjunto de datos.
Una buena solución es utilizar una combinación equilibrada de los dos enfoques anteriores dividiendo su conjunto de datos en múltiples archivos TFRecord (llamados fragmentos). Durante cada época, puede barajar los nombres de archivo de fragmentos para obtener una barajadura global y utilizar un búfer de barajadura para obtener barajaduras locales. Un buen equilibrio hará que los fragmentos sean lo suficientemente grandes como para evitar problemas de velocidad del disco, pero mantendrá los fragmentos lo suficientemente pequeños como para permitir una mezcla adecuada mediante un búfer aleatorio.
Aquí están los pasos exactos:
- Coloca al azar todos los ejemplos de entrenamiento en múltiples archivos TFRecord (fragmentos).
- Al comienzo de cada época, baraja la lista de nombres de archivos de fragmentos.
- Lea ejemplos de entrenamiento de los fragmentos y pase los ejemplos a través de un buffer aleatorio. Por lo general, el búfer aleatorio debe ser más grande que el tamaño del fragmento para garantizar una buena combinación en fragmentos.
- Pase los ejemplos mezclados a su proceso de entrenamiento.
.shuffle()
El método no es una solución ideal si tiene un gran archivo tfrecord. La salida aleatoria está algo relacionada con el orden original si no utiliza un tamaño de búfer grande. Creo que es necesario mezclar previamente los datos antes de guardarlos en un registro o dividirlos en fragmentos cuando tiene un gran conjunto de datos.