Estoy trabajando en el reconocimiento de voz con Tensorflow y planeo entrenar LSTM NN con un conjunto de datos de ondas masivas. Debido a las ganancias de rendimiento, planeo usar tfrecords. Hay varios ejemplos en Internet (Inception for ej.) Donde los archivos de registro se dividen en fragmentos. Mi pregunta es: ¿cuál es el beneficio de tener archivos tfrecords en fragmentos? ¿Hay alguna ganancia de rendimiento adicional de esta división?
fuente
.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.Para aquellos que aún se preguntan: es para que puedan mezclar sus datos. Con sus TFrecords en un archivo, no puede barajar el pedido. Esto suele ser necesario con SGD.
Sin embargo, con los fragmentos, puede mezclar el orden de los fragmentos, lo que le permite aproximar los datos aleatoriamente como si tuviera acceso a los TFRecords individuales. Esto es claramente mejor que nada, y claramente cuantos más fragmentos tenga, mejor será esta aproximación.
La alternativa es mezclar previamente sus datos duplicándolos o no usar TFRecords en absoluto.
fuente
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:
fuente
Dividir un archivo TFRecords en múltiples fragmentos tiene esencialmente 3 ventajas:
fuente