Средство чтения HTKMLF Для BrainScript
Предупреждение
HTKMLFReader устарел и заменяется HTK MLF и десериализаторами компонентов, cf. Понимание и расширение модулей чтения. Используйте их для сетей.
HTKMLFReader — это средство чтения данных, которое считывает файлы, обычно связанные с задачами распознавания речи, и в частности с набором средств hidden Markov Model Toolkit (HTK). Средство чтения может принимать в качестве входных двух типов файлов, список файлов компонентов, известных в языке HTK как scp
файл (файл скрипта), файл метки, известный как mlf
файл ("файл метки модели") и архивный файл.
HTKMLFReader использует определенные HTK форматы наборов данных, поэтому мы рекомендуем ознакомиться с основами HTK, например книгой HTK.
Так как CNTK можно использовать для создания сетей с произвольной топологией, включая сети с несколькими входными и выходными данными, средство HTKMLFReader может обрабатывать один или несколько scp
файлов и MLF
файлов. Типичный пример использования для HTKMLFReader выглядит следующим образом:
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 имеет следующие параметры конфигурации:
readMethod
: метод, используемый для чтения файлов компонентов в память для обработки во время обучения сети. ПараметрreadMethod
, который будет разделятьblockRandomize
данные на большие блоки, а затем рандомизировать порядок блоков, а затем порядок данных в блоке. Данные в каждом блоке считываются непосредственно из файлов компонентов и освобождаются из ОЗУ, когда они больше не используются. ДляblockRandomize
этого параметра требуется архивный файл, описанный ниже. Кроме того, как описано ниже, при использовании в сочетании сframeMode = "false"
методомblockRandomize
чтения случайным образом будет рандомизироваться над речевыми фрагментами, но не кадрами. Это подходит для использования с повторяющимися архитектурами при сохранении последовательного характера примеров обучения. Альтернативой являетсяrollingWindow
то, что считывает все файлы компонентов и сохраняет их на диске в одном большом временном двоичном файле. Затем данные рандомизированы, запустив большое скользякое окно по данным в этом файле и рандомизировав данные в окне. Этот метод следует использовать только в том случае, если архивный файл недоступен и работает только в режиме фрейма. По умолчанию используетсяblockRandomize
метод .pageFilePath
: укажите место хранения временного файла подкачки компонентов. По умолчанию он будет использовать предоставленный системой временный файл.randomize
: указывает размер окна случайной выборки. CNTK использует скользякое окно этого размера для выборки данных. Только образцы внутри этого последовательного окна загружаются с диска и хранятся в ОЗУ только при необходимости. Рекомендуемый параметр для корпоративной базы речи производственного размера составляет 48 часов, то есть укажите17280000
. Параметрrandomize
также понимает два специальных значения:auto
илиnone
.none
отключает случайность в целом, полезная для оценки или записи выходных данных.auto
будет считывать весь корпус в ОЗУ, что, как правило, нецелесообразно или желательно для рабочих наборов данных из нескольких тысяч часов речи.minibatchMode
:partial
илиfull
, этот параметр решает, как обрабатывать последнюю мини-бэтч, если недостаточно кадров для формирования полного мини-пакета запрошенного размера. Значение по умолчанию —partial
использование оставшихся кадров в меньшем окончательном мини-пакете эпохи обучения. Этотfull
параметр будет обрабатывать только завершенные мини-бэтчи.
В приведенном выше примере имеются два источника данных, обрабатываемых средством чтения, функции, в виде списка файлов компонентов HTK и меток, которые находятся в виде HTK-файла MLF. Оба компонента и метки соответствуют узлам в вычислительной сети, в данном случае — входным и выходным узлам соответственно. Обратите внимание, что features
и labels
являются именами по умолчанию, используемыми SimpleNetworkBuilder, но если сеть разработана с помощью языка описания сети (NDL), можно использовать любые имена, если каждый из них имеет соответствующий узел в сети.
Чтобы указать непрерывные функции, например коэффициенты MFCC или mel filterbank для журналов, в блок конфигурации должны быть включены следующие параметры:
scpFile
: список обрабатываемых файлов. Файлы должны быть совместимыми с HTK и могут быть указаны в стандартном или архивном формате. Ниже описаны сведения об использовании архива.dim
: целое число, указывающее полное измерение вектора признаков с нужным контекстным окном. Например, если у вас есть 72-мерные признаки (24-мерные фильтры, а также коэффициенты дельта и дельта) и сеть предназначена для обработки контекстного окна 11 кадров, указанное измерение должно быть 792. Обратите внимание, что поддерживаются только симметричные контекстные окна.
Чтобы указать соответствующие метки, например фонемы или метки senone, следует использовать блок конфигурации, указывающий следующие параметры:
mlfFile
: файл в стилеmlf
HTK, содержащий метки для всех речевых фрагментов, указанных вscp
файле.labelDim
: общая кратность набора меток.labelMappingFile
: путь к файлу, в котором перечислены все метки, видимыеmlf
в файле, по одной на строку.
Обратите внимание, что можно указать несколько входных и выходных данных с помощью дополнительных блоков чтения для функций чтения из файлов, перечисленных в scp
файле, или меток, считываемых из mlf
файла. Например, в сценарии обучения с несколькими задачами, в котором сеть предсказывала удостоверение говорящего и метку сеноне, пользователь указал дополнительный блок, включающий mlf
файл, содержащий метки, соответствующие удостоверению говорящего. Аналогичным образом, для сети с несколькими входными данными, например для функций MFCC и PLP, будет использоваться дополнительный блок компонентов.
Для повторяющихся структур, таких как RNN или LSTM, в HTKMLFReader есть дополнительные параметры конфигурации.
frameMode
:true
илиfalse
, должен ли читатель случайным образом рандомизировать данные на уровне кадра или на уровне речевых фрагментов. ПараметрframeMode
имеетtrue
значение по умолчанию и подходит для обучающих сетей без временных подключений. Для сетей, предназначенных для изучения последовательных сведений, например RNN,frameMode
должно быть задано значениеfalse
, что означает, что высказывания случайными, но правильная последовательность сохраняется в высказывании. Обратите внимание, что это работает только с методомblockRandomize
чтения.nbruttsineachrecurrentiter
: указывает количество речевых фрагментов, обрабатываемых вместе для эффективного обучения сетей с повторяющимися структурами. Значение по умолчанию равно1
, но любое значение ниже 20–30 приведет к значительному снижению эффективности с gpu.truncated
:true
илиfalse
. Это позволяет усеченной BPTT.
Важно отметить, что существуют небольшие различия между стандартом scp
и mlf
файлами, используемыми в HTK, и теми, которые используются в CNTK.
В частности, файл должен содержать фактические символы, mlf
используемые для классификации. Для непрерывного распознавания речи это обычно означает метки, соответствующие сенонам (physicalHMMstates). Однако HVite обычно создает принудительное mlf
выравнивание, включающее только логические имена состояний HMM. Таким образом, чтобы использовать это mlf
в CNTK, mlf
необходимо либо после обработки заменить имена логических состояний соответствующими метками senone, либо HVite необходимо изменить так, чтобы они записывайте метки сенона напрямую.
scp
Файлы, обрабатываемые HTKMLFReader, могут быть одним из двух разновидностей: стандартным форматом, где каждая строка соответствует физическому файлу признаков или формату псевдонима, где каждая строка содержит логическое имя и ссылается на сегмент возможно большего физического файла, определяемый начальными и конечными кадрами. Логическое имя используется для идентификации соответствующих меток в mlf
файле. Даже если файлы хранятся по отдельности, как в первом случае, псевдоним формата всегда должен использоваться с blockRandomize
методом чтения, так как он использует сведения о начальных и конечных кадрах в scp
файле для определения длины речевых фрагментов без необходимости открывать сами файлы. В этом случае начальный кадр должен иметь значение 0, а конечный кадр должен быть равен длине высказывания минус 1. Кроме того, для нескольких входных и (или) выходных данных также следует использовать псевдонимный формат, чтобы все scp
файлы и mlf
файлы имели свои логические имена в общем. rollingWindow
Если вместо метода чтения используетсяblockRandomize
, то сведения о начальном и конце кадре могут быть опущены.
Ниже приведены примеры фрагментов scp
кода и mlf
файлов для корпусов TIMIT, подходящих для сети с 2 входными данными признаков (в данном случае функции MFCC и PLP) и 1 выходными данными, соответствующими состояниям фонемы.
В scp
файле перечислены все обрабатываемые файлы с помощью следующего синтаксиса:
id=pathname
Расширение этого формата (не найденное в исходном формате HTK) CNTK заключается в том, что CNTK позволяет более удобный синтаксис относительных имен пути, если scp
файл находится рядом с функциями:
id=.../filename
где ...
ссылается на каталог scp
файла.
Файл scp
для функций MFCC содержит записи, такие как эти.
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]
Файл scp
для функций PLP аналогичен, но указывает на различные физические файлы. Обратите внимание, что логическое корневое имя в обоих scp
файлах совпадает.
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]
В mlf
файле перечислены метки с помощью следующего синтаксиса:
#!MLF!#
"id"
labelBegin1 labelEnd1 label1
labelBegin2 labelEnd2 label1
...
.
"id"
labelBegin1 labelEnd1 label1
labelBegin2 labelEnd2 label1
...
.
...
Здесь у нас есть раздел, заканчивающийся .
точкой на каждый входной файл, и по одной строке на токен в каждом разделе. Время метки задается в базе 10e-7
времени, а речевые кадры обычно 10e-2
имеют значение, поэтому 5 нулей необходимо добавлять к каждому индексу.
Важно заметить, что CNTK считывает только первые три столбца* в разделе mlp
файла и игнорирует остальные. В нашем примере mlf
файл также использует логическое имя с файлами "scp". Ниже приведен фрагмент кода:
#!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
Теперь мы будем описывать архивные файлы, которые иногда также называются chunk
файлами. CNTK использует концепцию фрагмента для всех своих читателей, и это означает абсолютно разные вещи, поэтому, чтобы избежать путаницы, мы не используем фрагмент терминов в отношении файлов, описанных ниже, а вызывая их архивы.
Архивные файлы по сути являются матрицами с основными float32
столбцами с 12-байтным заголовком, содержащим размер выборки и количество выборок. Как правило, они проще использовать, особенно в качестве начала. Ожидаемый заголовок файла определяется следующим struct
образом:
struct fileheader
{
int nsamples;
int sampperiod;
short sampsize;
short sampkind;
}
Где:
sampsize
— это размер вектора в байтах (=4 * feature dimension
);sampkind
— это числовой идентификатор типа компонента (MFCC, PLP и т. д.). CNTK игнорирует это. Если файлы не создаются с помощью HTK, вы можете задать для этого значение 9 (USER). Andsampperiod
должен быть100000
(CNTK в основном игнорирует это значение, за исключением сообщений об ошибках).
Наконец, важно отметить, что в большинстве приложений распознавания речи функции непрерывного значения используются в качестве входных данных, а дискретные категориальные метки используются в качестве выходных данных. Однако HTKMLFReader просто связывает данные с именами узлов и не зависит от способа использования этих данных. Например, соответствующий mlf
файл меток удостоверений говорящего можно использовать для создания одноотечного вектора функций идентификации говорящего в качестве входных данных в сеть.