BrainScript HTKMLF リーダー
警告
HTKMLFReader は廃止され、HTK MLF および機能デシリアライザー (cf. Understanding and Extending Reader) に置き換えられます。 これらはネットワークに使用してください。
HTKMLFReader は、通常音声認識タスクに関連付けられているファイルを読み取るデータ リーダーであり、特にツールの Hidden Markov Model Toolkit (HTK) スイートと共に読み取ります。 リーダーは、2 種類のファイル、ファイル ("スクリプト" ファイル)、ファイル ("モデル ラベル ファイル") とアーカイブ ファイルとして scp
知られている mlf
機能ファイルの一覧を入力として受け取ることができます。
HTKMLFReader は、HTK で定義されたデータセットの形式に依存しているため、 HTK Book などの HTK 基本を使用して理解することをお勧めします。
CNTKを使用して、複数の入力と出力を持つネットワークを含む任意のトポロジを持つネットワークを構築できるため、HTKMLFReader は 1 つまたは複数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
、データが大きなブロックに分割され、ブロックの順序とブロック内のデータの順序がランダム化されます。 各ブロック内のデータは機能ファイルから直接読み取られ、使用されなくなったら RAM から解放されます。 このオプションにはblockRandomize
、以下で説明するアーカイブ ファイルが必要です。 また、以下で説明するように、読み取り方法とframeMode = "false"
blockRandomize
組み合わせて使用すると、発話に対してランダム化されますが、フレームはランダム化されません。 これは、トレーニング例のシーケンシャルな性質を維持することが望ましい場合に、反復アーキテクチャでの使用に適しています。 別の方法としてrollingWindow
、すべての機能ファイルを読み取り、1 つの大きな一時バイナリ ファイルにディスクに格納します。 その後、このファイル内のデータに対して大きなローリング ウィンドウを実行し、ウィンドウ内のデータをランダム化することで、データがランダム化されます。 このメソッドは、アーカイブ ファイルが使用できない場合にのみ使用し、フレーム モードでのみ機能します。 既定のメソッドはblockRandomize
.pageFilePath
: フィーチャーの一時ページ ファイルを格納する場所を指定します。 既定では、システム提供の一時ファイルが使用されます。randomize
: ランダム化ウィンドウのサイズを指定します。 CNTKは、サンプリングの対象となるデータに対して、このサイズのローリング ウィンドウを使用します。 このローリング ウィンドウ内のサンプルのみがディスクから読み込まれ、必要な限り RAM に保持されます。 実稼働サイズの音声コーパスの推奨設定は 48 時間です。つまり、指定17280000
します。 このパラメーターはrandomize
、2 つの特別な値auto
(またはnone
.none
はランダム化を完全に無効にし、評価や出力データの書き込みに役立ちます。auto
は、コーパス全体を RAM に読み取ります。これは通常、数千時間の音声の実稼働サイズのデータ セットでは実現できないか、望ましくありません。minibatchMode
:partial
またはfull
、このオプションは、要求されたサイズの完全なミニバッチを形成するのに十分なフレームがない場合に、最後のミニバッチを処理する方法を決定します。 既定値は、partial
トレーニング エポックの小さな最終的なミニバッチ内の残りのフレームを使用します。 このオプションではfull
、完全なミニバッチのみが処理されます。
上の例には、HTK 機能ファイルの一覧の形式でリーダー、機能、および HTK MLF ファイルの形式であるラベルによって処理される 2 つのデータ ソースがあります。 特徴とラベルはそれぞれ、計算ネットワーク内のノード (この場合は入力ノードと出力ノード) に対応します。 features
labels
SimpleNetworkBuilder で使用される既定の名前ですが、ネットワークがネットワーク記述言語 (NDL) を使用して設計されている場合は、ネットワーク内に対応するノードがある限り、任意の名前を使用できます。
MFCC やログ メル フィルターバンク係数など、連続値の特徴を指定するには、次のパラメーターを構成ブロックに含める必要があります。
scpFile
: 処理するファイルの一覧。 ファイルは HTK 互換ファイルで、標準形式または "アーカイブ" 形式で指定できます。 アーカイブの使用の詳細については、以下で説明します。dim
: 目的のコンテキスト ウィンドウを持つ完全な特徴ベクトル次元を指定する整数。 たとえば、72 次元の特徴 (24 次元フィルターバンク特徴とデルタおよびデルタデルタ係数) があり、ネットワークが 11 フレームのコンテキスト ウィンドウを処理するように設計されている場合、指定されたディメンションは 792 である必要があります。 対称コンテキスト ウィンドウのみがサポートされていることに注意してください。
対応するラベル (音素ラベルや senone ラベルなど) を指定するには、次のパラメーターを指定する構成ブロックを使用する必要があります。
mlfFile
: ファイルで指定されたすべての発話のラベルを含む HTK スタイルmlf
のscp
ファイル。labelDim
: ラベル セットのカーディナリティの合計。labelMappingFile
: ファイルに表示されるすべてのラベルを 1 行に 1 つずつ一覧表示するmlf
ファイルへのパス。
ファイルに一覧表示されているファイルから読み取られた機能またはファイルから読み取られたラベルに対して、追加のリーダー ブロックを scp
使用して複数の入力と出力を mlf
指定できることに注意してください。 たとえば、ネットワークが話者 ID と senone ラベルの両方を予測していたマルチタスク学習シナリオでは、ユーザーは話者 ID に対応するラベルを含むファイルを含む mlf
追加のブロックを指定します。 同様に、MFCC と PLP の両方の機能など、複数の入力を持つネットワークでは、追加の機能ブロックが使用されます。
RNN や LSTM などの反復構造の場合、HTKMLFReader には追加の構成オプションがあります。
frameMode
:true
またはfalse
、リーダーがフレーム レベルまたは発話レベルでデータをランダム化する必要があるかどうか。 設定frameMode
はtrue
既定値であり、テンポラル接続のないトレーニング ネットワークに適しています。 RNN などのシーケンシャルな情報を学習するように設計されたネットワークの場合は、発話がランダム化されますが、frameMode
false
発話内で適切なシーケンスが維持されることを意味します。 これは read メソッドでのみ機能しますblockRandomize
。nbruttsineachrecurrentiter
: 反復構造を持つネットワークを効率的にトレーニングするために、一緒に処理する発話の数を指定します。 既定値は1
、ただし、20 ~ 30 未満の値を指定すると、GPU の効率が大幅に低下します。truncated
:true
またはfalse
。 これにより、切り捨てられた BPTT が有効になります。
HTKで使用される標準scp
とファイルとmlf
CNTKで使用されるファイルにはいくつかの小さな違いがあることに注意することが重要です。
特に、ファイルには mlf
分類に使用される実際のシンボルが含まれている必要があります。 継続的な音声認識の場合、これは通常、セノン (physicalHMMstates) に対応するラベルを意味します。 ただし、HVite は通常、論理 HMM 状態名のみを含む強制アラインメント中に生成 mlf
します。 したがって、これをmlf
CNTKで使用するには、mlf
論理状態名を対応する senone ラベルに置き換えるために後処理する必要があります。HVite を変更して、セノン ラベルを直接書き込む必要があります。
HTKMLFReader によって処理されるファイルには scp
、標準形式 (各行が物理機能ファイルに対応する標準形式) または別名形式の 2 つのいずれかを指定できます。各行には論理名が含まれており、開始フレームと終了フレームで定義された、より大きな物理ファイルのセグメントを参照します。 論理名は、ファイル内の対応するラベルを識別するために使用されます mlf
。 最初のケースのように、ファイルが個別に格納されている場合でも、エイリアス化された形式は常に読み取りメソッドで blockRandomize
使用する必要があります。ファイル内 scp
の開始フレームと終了フレームに関する情報を使用して、ファイル自体を開かなくても発話の長さを判断します。 この場合、開始フレームは 0 で、終了フレームは発話の長さから 1 を引いた長さに等しい必要があります。 さらに、複数の入力や出力の場合は、すべての scp
ファイルと mlf
ファイルに共通の論理名が含まれるように、エイリアス化された形式も使用する必要があります。 rollingWindow
代わりに blockRandomize
read メソッドを使用する場合は、開始フレームと終了フレームの情報を省略できます。
次に示すのは、2 つの機能入力 (この場合は MFCC および PLP 機能) とmlf
音素の状態に対応する 1 つの出力を持つネットワークに適した TIMIT コーパスのスニペットscp
とファイルの例です。
このファイルには scp
、次の構文を使用して、処理するすべてのファイルが一覧表示されます。
id=pathname
この形式のCNTK独自の拡張 (元の HTK では見つかりません) は、ファイルが機能の横にある場合scp
に、CNTKにより便利な相対パス名構文を使用できることです。
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]
PLP 機能のファイルは scp
似ていますが、異なる物理ファイルを指しています。 両方 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
...
.
...
ここでは、各入力ファイルごとに (ドット) で .
終わるセクションと、各セクション内のトークンごとに 1 行で終わるセクションがあります。 ラベルの時刻は時間ベース 10e-7
で指定され、音声フレームは通常 10e-2
、 5 つのゼロ を各時間インデックスに追加する必要があります。
CNTKは、ファイルのセクション内の最初の mlp
3 つの列 * のみを読み取り、残りの列を無視していることに注意することが重要です。 このサンプル 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 はデータをノード名に関連付けるだけで、このデータの使用方法には依存しません。 たとえば、スピーカー ID ラベルの適切な mlf
ファイルを使用して、ネットワークへの入力としてスピーカー ID 機能のワンホット ベクターを生成できます。