Lecteur HTKMLF BrainScript
Avertissement
HTKMLFReader est obsolète et est remplacé par les MLF HTK et les désérialiseurs de fonctionnalités, cf. Présentation et extension des lecteurs. Utilisez-les pour vos réseaux.
HTKMLFReader est un lecteur de données qui lit les fichiers généralement associés aux tâches de reconnaissance vocale, et spécifiquement avec la suite d’outils Hidden Markov Model Toolkit (HTK). Le lecteur peut prendre comme entrée deux types de fichiers, une liste de fichiers de fonctionnalités connus dans l’analyseur HTK en tant que scp
fichier (« script »), un fichier d’étiquette appelé mlf
fichier (« fichier d’étiquette de modèle ») et un fichier d’archive.
HTKMLFReader s’appuie sur les formats définis par HTK des jeux de données. Nous vous recommandons donc de vous familiariser avec les concepts de base HTK à l’aide de la bibliothèque HTK.
Étant donné que CNTK pouvez être utilisé pour créer des réseaux avec une topologie arbitraire, y compris des réseaux avec plusieurs entrées et sorties, le HTKMLFReader peut traiter un ou plusieurs fichiers et MLF
fichiersscp
. Un exemple typique d’utilisation pour HTKMLFReader est le suivant :
reader = [
readerType = "HTKMLFReader"
readMethod = "blockRandomize"
miniBatchMode = "partial"
randomize = "17280000"
features = [
dim = 792
scpFile = "$ScpDir$\TIMIT.train.scp.fbank.fullpath"
]
labels = [
mlfFile = "$MlfDir$\TIMIT.train.align_cistate.mlf.cntk"
labelDim = 183
labelMappingFile = "$MlfDir$\TIMIT.statelist"
]
]
Le HTKMLFReader a les paramètres de configuration suivants :
readMethod
: méthode utilisée pour lire les fichiers de fonctionnalités en mémoire pour le traitement pendant l’entraînement réseau. DéfinirreadMethod
pourblockRandomize
diviser les données en blocs volumineux, puis aléatoirer l’ordre des blocs, puis l’ordre des données dans le bloc. Les données de chaque bloc sont lues directement à partir des fichiers de fonctionnalités et libérées de LA RAM lorsqu’elles ne sont plus utilisées. L’optionblockRandomize
nécessite un fichier d’archive, décrit ci-dessous. En outre, comme décrit ci-dessous, lorsqu’elle est utilisée conjointement avecframeMode = "false"
lablockRandomize
méthode de lecture, aléatoire sur les énoncés, mais pas sur les images. Cela convient pour une utilisation avec des architectures récurrentes lors de la préservation de la nature séquentielle des exemples d’apprentissage souhaité. Une alternative estrollingWindow
, qui lit dans tous les fichiers de fonctionnalités et les stocke sur le disque dans un fichier binaire temporaire volumineux. Les données sont ensuite aléatoires en exécutant une fenêtre propagée volumineuse sur les données de ce fichier et en randomisant les données dans la fenêtre. Cette méthode ne doit être utilisée que lorsqu’un fichier d’archive n’est pas disponible et fonctionne uniquement en mode frame. La méthode par défaut estblockRandomize
.pageFilePath
: spécifiez l’emplacement où le fichier de page temporaire des fonctionnalités doit être stocké. Par défaut, il utilise le fichier temporaire fourni par le système.randomize
: spécifie la taille de la fenêtre de randomisation. CNTK utilise une fenêtre propagée de cette taille sur les données à partir de laquelle échantillonner. Seuls les exemples à l’intérieur de cette fenêtre propagée sont chargés à partir du disque et conservés en RAM uniquement tant que nécessaire. Le paramètre recommandé pour les corporax vocaux de taille de production est de 48 heures, c’est-à-dire spécifier17280000
. Lerandomize
paramètre comprend également deux valeurs spéciales :auto
ounone
.none
désactive complètement la randomisation, utile pour l’évaluation ou l’écriture de données de sortie.auto
lit l’intégralité du corpus en RAM, ce qui n’est généralement pas réalisable ou souhaitable pour les jeux de données de taille de production de plusieurs milliers d’heures de parole.minibatchMode
:partial
oufull
, cette option décide comment gérer le dernier minibatch s’il n’y a pas assez de cadres pour former un minibatch complet de la taille demandée. La valeur par défaut estpartial
, qui utilisera les images restantes dans un minibatch final plus petit de l’époque d’apprentissage. L’optionfull
ne traite que les minibatches complets.
L’exemple ci-dessus contient deux sources de données traitées par le lecteur, des fonctionnalités, sous la forme d’une liste de fichiers de caractéristiques HTK et d’étiquettes, qui sont sous la forme d’un fichier MLF HTK. Les deux fonctionnalités et étiquettes correspondent aux nœuds du réseau de calcul, dans ce cas, les nœuds d’entrée et de sortie, respectivement. Notez que features
et labels
sont les noms par défaut utilisés par SimpleNetworkBuilder, mais si le réseau est conçu à l’aide du langage NDL (Network Description Language), tous les noms peuvent être utilisés, tant qu’ils ont chacun un nœud correspondant dans le réseau.
Pour spécifier des caractéristiques à valeur continue, par exemple les coefficients mfCC ou de filtre de fusion de journal, les paramètres suivants doivent être inclus dans le bloc de configuration :
scpFile
: liste de fichiers à traiter. Les fichiers doivent être des fichiers compatibles HTK et peuvent être spécifiés au format standard ou « archive ». Les détails de l’utilisation d’une archive sont décrits ci-dessous.dim
: entier qui spécifie la dimension de vecteur de caractéristique complète avec la fenêtre de contexte souhaitée. Par exemple, si vous avez des caractéristiques de 72 dimensions (24 caractéristiques filterbank plus des coefficients delta et delta-delta) et que le réseau est conçu pour traiter une fenêtre de contexte de 11 images, la dimension spécifiée doit être 792. Notez que seules les fenêtres de contexte symétrique sont prises en charge.
Pour spécifier les étiquettes correspondantes, par exemple, les étiquettes phonème ou senone, un bloc de configuration doit être utilisé qui spécifie les paramètres suivants :
mlfFile
: fichier de stylemlf
HTK qui contient les étiquettes de tous les énoncés spécifiés dans lescp
fichier.labelDim
: cardinalité totale de l’ensemble d’étiquettes.labelMappingFile
: chemin d’accès à un fichier qui répertorie toutes les étiquettes affichées dans lemlf
fichier, une par ligne.
Notez que plusieurs entrées et sorties peuvent être spécifiées à l’aide de blocs de lecteur supplémentaires pour les fonctionnalités lues à partir de fichiers répertoriés dans un scp
fichier ou des étiquettes lues à partir d’un mlf
fichier. Par exemple, dans un scénario d’apprentissage multi-tâche, où le réseau prédit à la fois l’identité de l’orateur et l’étiquette senone, l’utilisateur spécifie un bloc supplémentaire qui inclut un mlf
fichier qui contient des étiquettes correspondant à l’identité de l’orateur. De même, pour un réseau avec plusieurs entrées, par exemple, les fonctionnalités MFCC et PLP, un bloc de fonctionnalités supplémentaire serait utilisé.
Pour les structures récurrentes, telles qu’un RNN ou un LSTM, il existe des options de configuration supplémentaires dans HTKMLFReader
frameMode
:true
oufalse
, si le lecteur doit aléatoirer les données au niveau de l’image ou au niveau de l’énoncé.true
La valeur par défaut est la valeurframeMode
par défaut et convient pour les réseaux d’entraînement sans aucune connexion temporelle. Pour les réseaux conçus pour apprendre des informations séquentielles, par exemple RNN,frameMode
doivent être définisfalse
sur , ce qui signifie que les énoncés sont aléatoires, mais une séquence appropriée est conservée dans un énoncé. Notez que cela fonctionne uniquement avec lablockRandomize
méthode de lecture.nbruttsineachrecurrentiter
: spécifie le nombre d’énoncés à traiter ensemble pour une formation efficace des réseaux avec des structures récurrentes. La valeur par défaut est1
, mais toute valeur inférieure à 20 à 30 entraîne des dégradations significatives de l’efficacité avec des GPU.truncated
:true
oufalse
. Cela permet de tronquer BPTT.
Il est important de noter qu’il existe quelques petites différences entre les fichiers standard scp
et mlf
les fichiers utilisés dans HTK et ceux utilisés dans CNTK.
Plus particulièrement, le mlf
fichier doit contenir les symboles réels utilisés pour la classification. Pour la reconnaissance vocale continue, cela signifie généralement des étiquettes correspondant aux snones (physicalHMMstates). Toutefois, HVite génère généralement un mlf
pendant l’alignement forcé qui inclut uniquement les noms d’état HMM logiques. Par conséquent, pour l’utiliser mlf
dans CNTK, il mlf
doit être post-traité pour remplacer les noms d’état logique par les étiquettes sénone correspondantes, ou HVite doit être modifié afin qu’il écrit les étiquettes senone directement.
Les scp
fichiers traités par HTKMLFReader peuvent être l’une des deux variétés : soit le format standard, où chaque ligne correspond à un fichier de caractéristiques physiques, soit au format alias, où chaque ligne contient un nom logique et fait référence à un segment d’un fichier physique éventuellement plus grand, défini par les images de début et de fin. Le nom logique est utilisé pour identifier les étiquettes correspondantes dans le mlf
fichier. Même si les fichiers sont stockés individuellement, comme dans le premier cas, le format alias doit toujours être utilisé avec la blockRandomize
méthode de lecture, car il utilise les informations sur les images de début et de fin dans le scp
fichier pour déterminer les longueurs d’énoncé sans avoir à ouvrir les fichiers eux-mêmes. Dans ce cas, le cadre de début doit être égal à 0 et le cadre de fin doit être égal à la longueur de l’énoncé moins 1. En outre, pour plusieurs entrées et/ou sorties, le format alias doit également être utilisé afin que tous les scp
fichiers et mlf
fichiers aient leurs noms logiques en commun. Si la rollingWindow
méthode de lecture est utilisée au lieu de , les informations d’image de début et de blockRandomize
fin peuvent être omises.
Voici des exemples d’extraits de code et mlf
de fichiers pour le corpus TIMIT approprié pour un réseau avec 2 entrées de scp
fonctionnalité (dans ce cas, les fonctionnalités MFCC et PLP) et 1 sortie correspondant aux états phonèmes.
Le scp
fichier répertorie tous les fichiers que vous devez traiter à l’aide de cette syntaxe :
id=pathname
Une extension propriétaire CNTK de ce format (introuvable dans le HTK d’origine) est que CNTK permet une syntaxe relative de nom de chemin plus pratique lorsque le scp
fichier se trouve à côté des fonctionnalités :
id=.../filename
où ...
fait référence au répertoire du scp
fichier.
Le scp
fichier des fonctionnalités MFCC contient des entrées telles que celles-ci.
train-dr1-fcjf0-si1027.mfc=//hostname/data/TIMIT/mfc/train/dr1/fcjf0/train-dr1-fcjf0-si1027.mfc[0,306]
train-dr1-fcjf0-si1657.mfc=//hostname/data/TIMIT/mfc/train/dr1/fcjf0/train-dr1-fcjf0-si1657.mfc[0,281]
train-dr1-fcjf0-si648.mfc=//hostname/data/TIMIT/mfc/train/dr1/fcjf0/train-dr1-fcjf0-si648.mfc[0,359]
Le scp
fichier des fonctionnalités PLP est similaire, mais pointe vers différents fichiers physiques. Notez que le nom racine logique dans les deux scp
fichiers est le même.
train-dr1-fcjf0-si1027.plp=//hostname/data/TIMIT/plp/train/dr1/fcjf0/train-dr1-fcjf0-si1027. plp[0,306]
train-dr1-fcjf0-si1657.plp=//hostname/data/TIMIT/plp/train/dr1/fcjf0/train-dr1-fcjf0-si1657. plp[0,281]
train-dr1-fcjf0-si648.plp=//hostname/data/TIMIT/plp/train/dr1/fcjf0/train-dr1-fcjf0-si648.plp [0,359]
Un mlf
fichier répertorie les étiquettes à l’aide de cette syntaxe :
#!MLF!#
"id"
labelBegin1 labelEnd1 label1
labelBegin2 labelEnd2 label1
...
.
"id"
labelBegin1 labelEnd1 label1
labelBegin2 labelEnd2 label1
...
.
...
Ici, nous avons une section terminée par .
(point) par chaque fichier d’entrée, et une ligne par jeton dans chaque section. Les heures d’étiquette sont données dans une base temporelle 10e-7
, et les trames vocales sont normalement 10e-2
, de sorte que 5 zéros sont nécessaires pour être ajoutés à chaque index de temps.
Il est important de noter que CNTK lit uniquement trois premières colonnes* dans une section d’un mlp
fichier et ignore le reste. Dans notre exemple mlf
de fichier partage également le nom logique avec les deux fichiers « scp ». Voici l’extrait de code :
#!MLF!#
"train-dr1-fcjf0-si1027.rec"
0 200000 h#_s2 -136.655975 h# -589.680481 h#
200000 400000 h#_s3 -145.780716
400000 800000 h#_s4 -307.243774
800000 1200000 q_s2 -349.529327 q -897.429504 q
1200000 1500000 q_s3 -280.568817
1500000 1800000 q_s4 -267.331390
1800000 1900000 iy_s2 -76.825096 iy -673.892883 iy
1900000 2400000 iy_s3 -305.832458
2400000 2800000 iy_s4 -291.235352
À présent, nous allons décrire les fichiers Archive , parfois également appelés chunk
fichiers. CNTK utilise un concept de segment pour tous ses lecteurs, et cela signifie une chose absolument différente, afin d’éviter la confusion que nous n’utilisons pas le terme segment par rapport aux fichiers décrits ci-dessous, mais plutôt de les appeler Archives.
Les fichiers d’archive sont essentiellement des matrices principales de colonnes, float32
avec un en-tête de 12 octets qui contient la taille de l’échantillon et le nombre d’échantillons. En règle générale, ils sont plus faciles à utiliser, en particulier en tant que début. L’en-tête attendu du fichier est défini par le biais de ce struct
qui suit :
struct fileheader
{
int nsamples;
int sampperiod;
short sampsize;
short sampkind;
}
où :
sampsize
est la taille d’un vecteur en octets (=4 * feature dimension
);sampkind
est un identificateur numérique du type de fonctionnalité (MFCC, PLP, etc.). CNTK ignore cela. Si vos fichiers ne sont pas créés par HTK, vous pouvez simplement définir cette valeur sur 9 (USER). andsampperiod
doit être100000
(CNTK ignore principalement cette valeur, sauf éventuellement pour les messages d’erreur).
Enfin, il est important de noter que dans la plupart des applications de reconnaissance vocale, les fonctionnalités à valeur continue sont utilisées comme entrées tandis que les étiquettes catégorielles discrètes sont utilisées comme sortie. Toutefois, htKMLFReader associe simplement les données aux noms de nœud et est indépendant de la façon dont ces données sont utilisées. Par exemple, un fichier approprié mlf
d’étiquettes d’identité de l’orateur peut être utilisé pour générer un vecteur à chaud des fonctionnalités d’identité de l’orateur comme entrée sur le réseau.