Je travaille sur la reconnaissance vocale avec Tensorflow et je prévois de former LSTM NN avec un ensemble de données d'ondes massives. En raison des gains de performances, je prévois d'utiliser des tfrecords. Il existe plusieurs exemples sur Internet (Inception par exemple) où les fichiers tfrecords sont divisés en fragments. Ma question est: quel est l'avantage d'avoir le fichier tfrecords en fragments? Y a-t-il un gain de performances supplémentaire de cette division?
la source
.shuffle()
n'est pas une solution idéale si vous avez un gros fichier tfrecord. La sortie mélangée est quelque peu liée à l'ordre d'origine si vous n'utilisez pas une grande taille de tampon. Je pense que pré-mélanger les données avant de les enregistrer sur tfrecord ou de les diviser en fragments est nécessaire lorsque vous avez un grand ensemble de données.Pour ceux qui se demandent encore: c'est pour que vous puissiez mélanger vos données. Avec vos TFrecords dans un seul fichier, vous ne pouvez pas mélanger la commande. Cela est généralement nécessaire avec SGD.
Cependant, avec les fragments, vous pouvez mélanger l'ordre des fragments, ce qui vous permet d'approximer le mélange des données comme si vous aviez accès aux enregistrements TFR individuels. C'est clairement mieux que rien, et clairement plus vous avez d'éclats, meilleure est cette approximation.
L'alternative consiste à pré-mélanger vos données en les dupliquant ou à ne pas utiliser du tout TFRecords.
la source
La division des fichiers TFRecord en fragments vous aide à mélanger de grands ensembles de données qui ne tiennent pas en mémoire.
Imaginez que vous avez des millions d'exemples de formation enregistrés sur le disque et que vous souhaitez les exécuter à plusieurs reprises tout au long d'un processus de formation. De plus, supposons que pour chaque répétition des données d'entraînement (c'est-à-dire à chaque époque) vous souhaitez charger les données dans un ordre complètement aléatoire.
Une approche consiste à avoir un fichier par exemple de formation et à générer une liste de tous les noms de fichiers. Ensuite, au début de chaque époque, vous mélangez la liste des noms de fichiers et chargez les fichiers individuels. Le problème avec cette approche est que vous chargez des millions de fichiers à partir d'emplacements aléatoires sur votre disque. Cela peut être lent, en particulier sur un disque dur. Même une matrice RAID 0 n'aidera pas à la vitesse si vous chargez des millions de petits fichiers à partir d'emplacements aléatoires. Le problème s'aggrave encore si vous accédez aux fichiers via une connexion réseau.
Une autre approche consiste à lire les exemples d'apprentissage en séquence à partir d'un grand fichier TFRecord et à mélanger les exemples en mémoire à l'aide d'un tampon de lecture aléatoire. Cependant, le tampon de lecture aléatoire ne peut généralement pas être plus grand que la mémoire DDR disponible pour votre CPU. Et si le tampon de lecture aléatoire est considérablement plus petit que votre ensemble de données, il peut ne pas mélanger correctement les données. Les données peuvent être mélangées "localement" mais pas "globalement". Autrement dit, les exemples du début de l'ensemble de données peuvent ne pas être mélangés avec des exemples de la fin de l'ensemble de données.
Une bonne solution consiste à utiliser une combinaison équilibrée des deux approches ci-dessus en divisant votre ensemble de données en plusieurs fichiers TFRecord (appelés fragments). Pendant chaque époque, vous pouvez mélanger les noms de fichiers des fragments pour obtenir un brassage global et utiliser un tampon de shuffle pour obtenir un brassage local. Un bon équilibre rendra les fragments suffisamment grands pour éviter les problèmes de vitesse du disque mais gardera les fragments suffisamment petits pour permettre un brassage adéquat par un tampon de shuffle.
Voici les étapes exactes:
la source
La division d'un fichier TFRecords en plusieurs fragments présente essentiellement 3 avantages:
la source