BrainScript HTKMLF 讀取器
警告
HTKMLFReader 已經過時,且正由 HTK MLF 和功能還原序列化器取代,cf. Understanding and Extending Reader。 請針對您的網路使用這些值。
HTKMLFReader 是一種資料讀取器,可讀取通常與語音辨識工作相關聯的檔案,特別是與 隱藏 Markov 模型工具組 (HTK) 套件。 讀取器可以接受兩種類型的檔案、HTK 剖析中已知的功能檔案清單,以 scp
檔案 (「腳本」檔案) 、稱為 mlf
檔案的標籤檔案 (「模型標籤檔案」) 和封存檔案。
HTKMLFReader 依賴 HTK 定義的資料集格式,因此我們建議您使用 HTK Book等,熟悉 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
:用來將功能檔案讀取到記憶體中的 方法,以在網路定型期間進行處理。blockRandomize
將 設定readMethod
為 會將資料分割成大型區塊,然後隨機化區塊的順序,以及區塊內資料的順序。 每個區塊中的資料都會直接從功能檔案讀取,並在不再使用時從 RAM 釋出。blockRandomize
此選項需要封存檔案,如下所述。 此外,如以下所述,搭配 read 方法使用frameMode = "false"
blockRandomize
時,會隨機處理語句,但不會隨機顯示畫面。 當需要保留定型範例的循序本質時,這適合用於迴圈架構。 替代方式是rollingWindow
,它會讀取所有功能檔案,並將其儲存在一個大型暫存二進位檔的磁片上。 然後,藉由在此檔案中的資料上執行大型滾動視窗,並隨機化視窗內的資料,以隨機化資料。 只有在封存檔案無法使用,而且只能在畫面模式中使用此方法。 預設方法為blockRandomize
。pageFilePath
:指定應該儲存功能暫存頁面檔案的位置。 根據預設,它會使用系統提供的暫存檔案。randomize
:這會指定隨機視窗大小。 CNTK使用此大小的滾動視窗來取樣資料。 只有此滾動視窗內的範例會從磁片載入,並只視需要保留在 RAM 中。 生產大小語音主體的建議設定為 48 小時,也就是指定17280000
。 參數randomize
也會瞭解兩個特殊值:auto
或none
。none
完全停用隨機化,有助於評估或寫入輸出資料。auto
會將整個主體讀入 RAM,這通常不適用於數千小時語音的生產大小資料集。minibatchMode
:partial
或full
,此選項會決定如果沒有足夠的畫面格形成要求大小的完整迷你批次,則此選項會決定如何處理最後一個迷你批次。 預設值為partial
,這會在定型 epoch 的較小最終迷你批次中使用其餘畫面。 此選項full
只會處理完整的迷你batches。
上述範例有兩種由讀取器處理的資料來源:功能,格式為 HTK 功能檔案的清單,以及採用 HTK MLF 檔案格式的標籤。 特徵和標籤都會分別對應至計算網路中節點,也就是輸入和輸出節點。 請注意, features
和 labels
是 SimpleNetworkBuilder 所使用的預設名稱,但如果網路是使用網路描述語言 (NDL) 來設計,只要它們各自在網路中都有對應的節點,就可以使用任何名稱。
若要指定連續值特徵,例如 MFCC 的 或記錄 mel filterbank 係數,組態區塊中應包含下列參數:
scpFile
:要處理的檔案清單。 這些檔案應該是 HTK 相容的檔案,而且可以標準格式或「封存」格式指定。 使用封存的詳細資料如下所述。dim
:整數,指定具有所需內容視窗的完整特徵向量維度。 例如,如果您有 72 維特徵 (24 維篩選銀行特徵加上差異和差異差異係數) ,且網路的設計目的是要處理 11 個框架的內容視窗,則指定的維度應該是 792。 請注意,僅支援對稱內容視窗。
若要指定對應的標籤,例如 phoneme 或 senone 標籤,應該使用設定區塊來指定下列參數:
mlfFile
:HTK 樣式mlf
檔案,其中包含檔案中指定的所有語句卷scp
標。labelDim
:標籤集的總基數。labelMappingFile
:檔案的路徑,其中列出檔案中看到mlf
的所有標籤,每一行各一個標籤。
請注意,您可以使用其他讀取器區塊來指定多個輸入和輸出,以便讀取檔案中列出的 scp
檔案或從檔案讀取的 mlf
標籤讀取功能。 例如,在多工學習案例中,網路正在預測說話者身分識別和敏感度標籤,使用者會指定額外的區塊,其中包含 mlf
包含與說話者身分識別相對應之標籤的檔案。 同樣地,對於具有多個輸入的網路,例如 MFCC 和 PLP 功能,則會使用額外的功能區塊。
針對 RNN 或 LSTM 等迴圈結構,HTKMLFReader 中有額外的設定選項
frameMode
:true
或false
,讀取器是否應該隨機化框架層級或語句層級的資料。true
設定frameMode
為 是預設值,適合用於訓練網路,而不需要任何時態連線。 針對設計來學習循序資訊的網路,例如 RNN 應該設定為false
,這表示語句會隨機化,frameMode
但在語句內維護適當的序列。 請注意,這只適用于blockRandomize
read 方法。nbruttsineachrecurrentiter
:指定要一起處理的語句數目,以便有效率地定型具有遞迴結構的網路。 預設值為1
,但任何低於 20 到 30 的值,都會導致 GPU 大幅效率降低。truncated
:true
或false
。 這可啟用截斷的 BPTT。
請務必注意,在 HTK 中使用的標準和 scp
mlf
檔案與CNTK中使用的檔案之間有一些小差異。
最值得注意的是,檔案 mlf
必須包含用於分類的實際符號。 針對連續語音辨識,這通常表示對應至 physicalHMMstates (senones) 的標籤。 不過,HVite 通常會在強制對齊期間產生 , mlf
只包含邏輯 HMM 狀態名稱。 因此,若要在CNTK中使用此功能 mlf
, mlf
必須經過後續處理,才能將邏輯狀態名稱取代為對應的 senone 標籤,或必須修改 HVite,以便直接寫入 senone 標籤。
scp
HTKMLFReader 處理的檔案可以是兩種的其中一種:標準格式、其中每一行對應至實體特徵檔案,或是別名格式,其中每一行都包含邏輯名稱,並參考開頭和結束畫面所定義的可能較大的實體檔案區段。 邏輯名稱是用來識別檔案中 mlf
對應的標籤。 即使個別儲存檔案,如同第一個案例,別名格式一律必須與 read 方法搭配 blockRandomize
使用,因為它會使用檔案中 scp
開始和結束畫面的相關資訊來判斷語句長度,而不需要開啟檔案本身。 在此情況下,開始畫面應該為 0,而結束畫面應該等於語句的長度減 1。 此外,針對多個輸入和輸出,也應該使用別名格式,讓所有 scp
檔案和 mlf
檔案都有其通用邏輯名稱。 rollingWindow
如果使用 read 方法,而不是 blockRandomize
,則可以省略開始和結束畫面資訊。
以下是 TIMIT 主體的範例程式碼片段 scp
, mlf
適用于具有 2 個功能 (輸入的網路,在此案例中為 MFCC 和 PLP 功能,) 和 1 個對應至電話狀態的輸出。
檔案會 scp
使用此語法列出您要處理的所有檔案:
id=pathname
原始 HTK) 中找不到此 (格式的CNTK專屬延伸模組,就是當檔案位於功能旁時 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]
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
適當的說話者身分識別標籤檔案可用來產生單熱向量說話者身分識別功能作為網路的輸入。