Поделиться через


Средство чтения 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). And
  • sampperiodдолжен быть 100000 (CNTK в основном игнорирует это значение, за исключением сообщений об ошибках).

Наконец, важно отметить, что в большинстве приложений распознавания речи функции непрерывного значения используются в качестве входных данных, а дискретные категориальные метки используются в качестве выходных данных. Однако HTKMLFReader просто связывает данные с именами узлов и не зависит от способа использования этих данных. Например, соответствующий mlf файл меток удостоверений говорящего можно использовать для создания одноотечного вектора функций идентификации говорящего в качестве входных данных в сеть.