Lector de BrainScript HTKMLF
Advertencia
HTKMLFReader está obsoleto y se está reemplazando por HTK MLF y deserializadores de características, cf. Descripción y extensión de lectores. Por favor, úselos para sus redes.
HTKMLFReader es un lector de datos que lee archivos asociados normalmente con tareas de reconocimiento de voz y, específicamente, con el conjunto de herramientas hidden markov Model Toolkit (HTK). El lector puede tomar como entrada dos tipos de archivos, una lista de archivos de características conocidos en el análisis de HTK como un scp
archivo (archivo "script"), un archivo de etiqueta conocido como mlf
archivo ("archivo de etiqueta de modelo") y un archivo de archivo.
HTKMLFReader se basa en formatos definidos por HTK de conjuntos de datos, por lo que se recomienda familiarizarse con los conceptos básicos de HTK mediante, por ejemplo, HTK Book.
Dado que CNTK se pueden usar para crear redes con topología arbitraria, incluidas las redes con varias entradas y salidas, HTKMLFReader puede procesar uno o varios scp
archivos y MLF
. Un ejemplo típico de uso para HTKMLFReader es el siguiente:
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"
]
]
HTKMLFReader tiene los siguientes parámetros de configuración:
readMethod
: el método utilizado para leer los archivos de características en la memoria para su procesamiento durante el entrenamiento de red.blockRandomize
Si se establecereadMethod
en , los datos se dividirán en bloques grandes y, a continuación, se aleatoriará el orden de los bloques y, a continuación, el orden de los datos dentro del bloque. Los datos de cada bloque se leen directamente desde los archivos de características y se liberan desde la RAM cuando ya no se usan. LablockRandomize
opción requiere un archivo de archivo, que se describe a continuación. Además, como se describe a continuación, cuando se usa junto conframeMode = "false"
elblockRandomize
método read, se aleatorizará sobre expresiones, pero no los fotogramas. Esto es adecuado para su uso con arquitecturas recurrentes al conservar la naturaleza secuencial de los ejemplos de entrenamiento. Una alternativa esrollingWindow
, que lee todos los archivos de características y los almacena en el disco en un archivo binario temporal grande. A continuación, los datos se aleatorizan mediante la ejecución de una ventana gradual grande sobre los datos de este archivo y la selección aleatoria de los datos dentro de la ventana. Este método solo debe usarse cuando un archivo de archivo no está disponible y solo funciona en modo de marco. El método predeterminado esblockRandomize
.pageFilePath
: especifique dónde se debe almacenar el archivo de página temporal de las características. De forma predeterminada, usará el archivo temporal proporcionado por el sistema.randomize
: especifica el tamaño de la ventana de selección aleatoria. CNTK usa una ventana gradual de este tamaño sobre los datos desde los que se va a muestrear. Solo las muestras dentro de esta ventana gradual se cargan desde el disco y se mantienen en RAM solo mientras sea necesario. La configuración recomendada para speech corpora de tamaño de producción es de 48 horas, es decir, especifique17280000
. Elrandomize
parámetro también entiende dos valores especiales:auto
onone
.none
deshabilita la selección aleatoria por completo, útil para la evaluación o la escritura de datos de salida.auto
leerá todo el corpus en RAM, que normalmente no es factible o deseable para los conjuntos de datos de tamaño de producción de varias miles de horas de voz.minibatchMode
:partial
ofull
, esta opción decide cómo controlar el último minibatch si no hay suficientes marcos para formar un minibatch completo del tamaño solicitado. El valor predeterminado espartial
, que usará los fotogramas restantes en un minibatch final más pequeño de la época de entrenamiento. Lafull
opción solo procesará minibatches completos.
El ejemplo anterior tiene dos orígenes de datos que el lector procesa, características, en forma de una lista de archivos de características HTK y etiquetas, que están en forma de un archivo MLF de HTK. Tanto las características como las etiquetas corresponden a los nodos de la red computacional, en este caso, los nodos de entrada y salida, respectivamente. Tenga en cuenta que features
y labels
son los nombres predeterminados usados por SimpleNetworkBuilder, pero si la red está diseñada mediante el lenguaje de descripción de red (NDL), se pueden usar nombres, siempre y cuando cada uno tenga un nodo correspondiente en la red.
Para especificar características con valores continuos, por ejemplo, los coeficientes de filtro de mel de registro o MFCC, los parámetros siguientes deben incluirse en un bloque de configuración:
scpFile
: una lista de archivos que se van a procesar. Los archivos deben ser archivos compatibles con HTK y se pueden especificar en formato estándar o en formato "archivo". A continuación se describen los detalles del uso de un archivo.dim
: entero que especifica la dimensión de vector de característica completa con la ventana de contexto deseada. Por ejemplo, si tenía 72 características dimensionales (características de filtro de 24 dimensiones más coeficientes delta y delta-delta) y la red está diseñada para procesar una ventana de contexto de 11 fotogramas, la dimensión especificada debe ser 792. Tenga en cuenta que solo se admiten ventanas de contexto simétricas.
Para especificar las etiquetas correspondientes, por ejemplo, las etiquetas phoneme o senone, se debe usar un bloque de configuración que especifique los parámetros siguientes:
mlfFile
: un archivo de estilomlf
HTK que contiene las etiquetas de todas las expresiones especificadas en elscp
archivo.labelDim
: cardinalidad total del conjunto de etiquetas.labelMappingFile
: la ruta de acceso a un archivo que enumera todas las etiquetas que se ven en elmlf
archivo, una por línea.
Tenga en cuenta que se pueden especificar varias entradas y salidas mediante bloques de lector adicionales para las características leídas de los archivos enumerados en un scp
archivo o etiquetas leídos de un mlf
archivo. Por ejemplo, en un escenario de aprendizaje de varias tareas, donde la red predice la identidad del hablante y la etiqueta senone, el usuario especificaría un bloque adicional que incluye un mlf
archivo que contiene etiquetas correspondientes sobre la identidad del hablante. De forma similar, para una red con varias entradas, por ejemplo, características MFCC y PLP, se usaría un bloque de características adicional.
En el caso de las estructuras recurrentes, como un RNN o un LSTM, hay opciones de configuración adicionales en HTKMLFReader.
frameMode
:true
ofalse
, si el lector debe aleatorizar los datos en el nivel de fotograma o en el nivel de expresión. EstablecerframeMode
entrue
es el valor predeterminado y es adecuado para las redes de entrenamiento sin ninguna conexión temporal. En el caso de las redes diseñadas para aprender información secuencial, por ejemplo, RNN,frameMode
debe establecersefalse
en , lo que significa que las expresiones se aleatorizarán, pero la secuencia adecuada se mantiene dentro de una expresión. Tenga en cuenta que esto solo funciona con elblockRandomize
método read.nbruttsineachrecurrentiter
: especifica el número de expresiones que se van a procesar conjuntamente para un entrenamiento eficaz de redes con estructuras recurrentes. El valor predeterminado es1
, pero cualquier valor inferior a 20 a 30 provocará importantes degradaciones de eficiencia con GPU.truncated
:true
ofalse
. Esto habilita BPTT truncado.
Es importante tener en cuenta que hay algunas pequeñas diferencias entre los archivos estándar scp
y mlf
usados en HTK y los usados en CNTK.
En particular, el mlf
archivo debe contener los símbolos reales usados para la clasificación. Para el reconocimiento continuo de voz, normalmente significa etiquetas correspondientes a las senones (physicalHMMstates). Sin embargo, HVite normalmente genera una mlf
durante la alineación forzada que incluye solo los nombres de estado de HMM lógicos. Por lo tanto, para usarlo mlf
en CNTK, debe mlf
procesarse después de procesarse para reemplazar los nombres de estado lógicos por las etiquetas senone correspondientes, o HVite debe modificarse para que escriba directamente las etiquetas senone.
Los scp
archivos procesados por HTKMLFReader pueden ser una de las dos variedades: el formato estándar, donde cada línea corresponde a un archivo de características físicos o al formato con alias, donde cada línea contiene un nombre lógico y hace referencia a un segmento de un archivo físico posiblemente mayor, definido por marcos inicial y final. El nombre lógico se usa para identificar las etiquetas correspondientes en el mlf
archivo. Incluso si los archivos se almacenan individualmente, como en el primer caso, el formato con alias siempre debe usarse con el blockRandomize
método read, ya que usa la información sobre los marcos iniciales y finales del scp
archivo para determinar las longitudes de expresión sin tener que abrir los propios archivos. En este caso, el marco inicial debe ser 0 y el marco final debe ser igual a la longitud de la expresión menos 1. Además, para varias entradas o salidas, también se debe usar el formato con alias para que todos los scp
archivos y mlf
archivos tengan sus nombres lógicos en común. Si se usa el rollingWindow
método read en lugar de blockRandomize
, se puede omitir la información del marco inicial y final.
Estos son fragmentos de código de ejemplo de scp
y mlf
archivos para el corpus de TIMIT para que sea adecuado para una red con 2 entradas de características (en este caso, características MFCC y PLP) y 1 salida correspondiente a estados de phoneme.
El scp
archivo enumera todos los archivos que se van a procesar con esta sintaxis:
id=pathname
Una extensión de propiedad CNTK de este formato (que no se encuentra en el HTK original) es que CNTK permite una sintaxis pathname relativa más cómoda cuando el scp
archivo se encuentra junto a las características:
id=.../filename
donde ...
hace referencia al directorio del scp
archivo.
El scp
archivo de las características MFCC contiene entradas como estas.
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]
El scp
archivo de las características de PLP es similar, pero apunta a archivos físicos diferentes. Tenga en cuenta que el nombre raíz lógico en ambos scp
archivos es el mismo.
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
archivo enumera las etiquetas con esta sintaxis:
#!MLF!#
"id"
labelBegin1 labelEnd1 label1
labelBegin2 labelEnd2 label1
...
.
"id"
labelBegin1 labelEnd1 label1
labelBegin2 labelEnd2 label1
...
.
...
Aquí tenemos una sección terminada con .
(punto) por cada archivo de entrada y una línea por token dentro de cada sección. Los tiempos de etiqueta se proporcionan en una base temporal de y los fotogramas de 10e-7
voz son normalmente 10e-2
, por lo que se necesitan 5 ceros para anexarse a cada índice de tiempo.
Es importante tener en cuenta que CNTK lee solo las tres primeras columnas* dentro de una sección de un mlp
archivo y omite el resto. En nuestro archivo de ejemplo mlf
también se comparte el nombre lógico con los archivos """scp". Este es el fragmento de código:
#!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
Ahora describiremos archivos de archivo , que a veces también se conocen como chunk
archivos. CNTK usa un concepto de fragmento para todos sus lectores y significa una cosa absolutamente diferente, por lo que para evitar la confusión que no usamos el término fragmento en relación con los archivos descritos a continuación, sino llamarlos Archives.
Los archivos de archivo son básicamente matrices principales de columna de , con un encabezado de float32
12 bytes que contiene el tamaño de la muestra y el número de muestras. Por lo general, son más fáciles de usar, especialmente como inicio. El encabezado esperado del archivo se define a través de lo struct
siguiente:
struct fileheader
{
int nsamples;
int sampperiod;
short sampsize;
short sampkind;
}
donde:
sampsize
es el tamaño de un vector en bytes (=4 * feature dimension
);sampkind
es un identificador numérico del tipo de característica (MFCC, PLP, etc.). CNTK omite esto. Si HTK no crea los archivos, puede establecerlo en 9 (USUARIO). Andsampperiod
debe ser100000
(CNTK omite principalmente este valor, excepto posiblemente para los mensajes de error).
Por último, es importante tener en cuenta que en la mayoría de las aplicaciones de reconocimiento de voz, las características con valores continuos se usan como entradas mientras se usan etiquetas de categorías discretas como salida. Sin embargo, el HTKMLFReader simplemente asocia los datos con los nombres de nodo y es independiente de cómo se usan estos datos. Por ejemplo, se podría usar un archivo adecuado mlf
de etiquetas de identidad del hablante para generar un vector activo de características de identidad del hablante como entrada a la red.