BrainScript HTKMLF Reader
Upozornění
HTKMLFReader je zastaralý a nahrazuje ho HTK MLF a deserializery funkcí, cf. Principy a rozšíření čtenářů. Použijte je pro své sítě.
HTKMLFReader je čtečka dat, která čte soubory obvykle spojené s úlohami rozpoznávání řeči, a konkrétně se sadou nástrojů hidden Markov Model Toolkit (HTK). Čtenář může jako vstup použít dva typy souborů, seznam souborů funkcí známých v HTK jako scp
soubor ("skript" soubor), soubor popisku známý jako mlf
soubor (soubor popisku modelu) a archivní soubor.
HTKMLFReader spoléhá na definované formáty datových sad HTK, takže doporučujeme seznámit se se základy HTK, např. HTK Book.
Vzhledem k tomu, že CNTK lze použít k vytváření sítí s libovolnou topologií, včetně sítí s více vstupy a výstupy, může HTKMLFReader zpracovat jeden nebo více scp
souborů.MLF
Typickým příkladem použití HTKMLFReader je následující:
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 má následující konfigurační parametry:
readMethod
: metoda použitá ke čtení souborů funkcí do paměti pro zpracování během trénování sítě. NastaveníreadMethod
rozděleníblockRandomize
dat na velké bloky a následné náhodné rozdělení pořadí bloků a pořadí dat v bloku. Data v každém bloku se čtou přímo ze souborů funkcí a uvolní se z paměti RAM, když se už nepoužívá. TatoblockRandomize
možnost vyžaduje soubor archivu, který je popsaný níže. Jak je popsáno níže, při použití ve spojení sframeMode = "false"
metodoublockRandomize
čtení se randomizuje nad promluvami, ale ne rámce. To je vhodné pro použití s opakujícími se architekturami při zachování sekvenční povahy příkladů trénování je žádoucí. Alternativou jerollingWindow
, který čte ve všech souborech funkcí a ukládá je na disk do jednoho velkého dočasného binárního souboru. Data se pak randomizují spuštěním velkého posuvného okna nad daty v tomto souboru a náhodným rozdělením dat v okně. Tato metoda by měla být použita pouze v případě, že soubor archivu není k dispozici a funguje pouze v režimu rámečku. Výchozí metoda jeblockRandomize
.pageFilePath
: určete, kam má být uložen dočasný stránkovat soubor funkcí. Ve výchozím nastavení bude používat systémový soubor temp.randomize
: Určuje velikost náhodného okna. CNTK používá posuvné okno této velikosti nad daty, ze které se má vzorkovat. Z disku se načtou pouze vzorky uvnitř tohoto klouzavého okna a uchovávají se v paměti RAM pouze za předpokladu, že je to potřeba. Doporučené nastavení pro korpory řeči v produkční velikosti je 48 hodin, tj. zadat17280000
. Parametrrandomize
také rozumí dvěma speciálním hodnotám:auto
nebonone
.none
zakáže randomizaci úplně, užitečné pro vyhodnocení nebo zápis výstupních dat.auto
bude číst celý korpus do paměti RAM, což obvykle není možné nebo žádoucí pro datové sady produkční velikosti několika tisíc hodin řeči.minibatchMode
:partial
nebofull
, tato možnost rozhodne, jak zpracovat poslední minibatch, pokud není dostatek snímků k vytvoření kompletní minibatch požadované velikosti. Výchozí hodnota jepartial
, která použije zbývající snímky v menším posledním minibatchu trénovací epochy. Tatofull
možnost zpracuje pouze úplné minibatchy.
Výše uvedený příklad obsahuje dva zdroje dat, které čtenář zpracovává, funkce, ve formě seznamu souborů funkcí HTK a popisky, které jsou ve formě souboru MLF HTK. Funkce i popisky odpovídají uzlům ve výpočetní síti, v tomto případě vstupním a výstupním uzlům. Všimněte si, že features
a labels
jsou výchozí názvy používané SimpleNetworkBuilder, ale pokud je síť navržena pomocí jazyka NDL (Network Description Language), lze použít všechny názvy, pokud mají každý z nich odpovídající uzel v síti.
Chcete-li zadat funkce souvislé hodnoty, například koeficienty filterbank knihovny MFCC nebo log mel, měly by být do bloku konfigurace zahrnuty následující parametry:
scpFile
: seznam souborů, které se mají zpracovat. Soubory by měly být kompatibilní s HTK a dají se zadat ve standardním formátu nebo ve formátu archivu. Podrobnosti o použití archivu jsou popsány níže.dim
: celé číslo určující celočíselnou dimenzi vektoru funkce s požadovaným kontextovým oknem. Pokud máte například 72rozměrné funkce (24rozměrné funkce filtru plus rozdílové a rozdílové rozdílové koeficienty) a síť je navržená tak, aby zpracovávala kontextové okno 11 snímků, měla by zadaná dimenze být 792. Všimněte si, že jsou podporována pouze symetrická kontextová okna.
Chcete-li zadat odpovídající popisky, např. popisky fone nebo senone, měl by se použít blok konfigurace, který určuje následující parametry:
mlfFile
: soubor ve stylumlf
HTK, který obsahuje popisky pro všechny promluvy zadané vscp
souboru.labelDim
: celková kardinalita sady popisků.labelMappingFile
: cesta k souboru, který obsahuje všechny popisky zobrazené vmlf
souboru, jeden na řádek.
Všimněte si, že více vstupů a výstupů lze zadat pomocí dalších bloků čtečky pro funkce přečtené ze souborů uvedených v scp
souboru nebo popisky přečtené ze mlf
souboru. Například ve scénáři učení s více úlohami, ve kterém síť předpovídala identitu mluvčího i popisek senone, uživatel zadal další blok, který obsahuje mlf
soubor, který obsahuje popisky odpovídající identitě mluvčího. Podobně se pro síť s více vstupy, například funkce MFCC a PLP, použije se další blok funkcí.
Pro opakující se struktury, jako je RNN nebo LSTM, existují další možnosti konfigurace v HTKMLFReader.
frameMode
:true
nebofalse
, zda by čtenář měl randomizovat data na úrovni rámce nebo na úrovni promluvy.true
NastaveníframeMode
je výchozí a je vhodné pro trénovací sítě bez dočasných připojení. Pro sítě navržené tak, aby se naučily sekvenční informace, například RNN, by měly být nastaveny nafalse
, což znamená, že promluvy jsou randomizovány,frameMode
ale v promluvě se udržuje správná posloupnost. Všimněte si, že to funguje jenom s metodoublockRandomize
čtení.nbruttsineachrecurrentiter
: určuje počet promluv, které se mají zpracovat společně za účelem efektivního trénování sítí s opakujícími se strukturami. Výchozí hodnota je1
, ale jakákoli hodnota nižší než 20 až 30 povede k významnému snížení efektivity u gpu.truncated
:true
nebofalse
. To umožňuje zkrácený BPTT.
Je důležité si uvědomit, že mezi standardními scp
a mlf
soubory používanými v HTK a soubory použitými v CNTK existují určité malé rozdíly.
Soubor musí zejména mlf
obsahovat skutečné symboly používané pro klasifikaci. Pro průběžné rozpoznávání řeči to obvykle znamená popisky odpovídající senonesům (physicalHMMstates). HVite však obvykle generuje mlf
během vynuceného zarovnání, který obsahuje pouze logické názvy stavů HMM. Chcete-li to mlf
použít v CNTK, mlf
musí být buď po zpracování nahrazeny názvy logických stavů odpovídajícími senone popisky, nebo HVite musí být upraven tak, aby zapisoval popisky senone přímo.
scp
Soubory zpracovávané HTKMLFReader mohou být jednou ze dvou odrůd: standardní formát, kde každý řádek odpovídá souboru fyzické funkce, nebo aliasovaný formát, kde každý řádek obsahuje logický název a odkazuje na segment pravděpodobně většího fyzického souboru definovaného počátečním a koncovým rámcem. Logický název slouží k identifikaci odpovídajících popisků v mlf
souboru. I když jsou soubory uloženy jednotlivě, jako v prvním případě, musí být aliasovaný formát vždy použit s metodou blockRandomize
čtení, protože používá informace o počáteční a koncové rámce v scp
souboru k určení délky promluvy, aniž by bylo nutné otevírat samotné soubory. V tomto případě by počáteční rámec měl být 0 a koncový rámec by měl být roven délce promluvy minus 1. Pro více vstupů a/nebo výstupů by se měl používat také aliasovaný formát, aby všechny scp
soubory a mlf
soubory měly společné logické názvy. rollingWindow
Pokud se místo metody čtení používá blockRandomize
, mohou být informace o počátečním a koncovém rámečku vynechány.
Tady jsou ukázkové fragmenty a mlf
soubory pro timit korpus pro odpovídající síť se 2 vstupy scp
funkcí (v tomto případě MFCC a PLP) a 1 výstup odpovídající stavům fome.
Soubor scp
obsahuje seznam všech souborů, které chcete zpracovat, pomocí této syntaxe:
id=pathname
Rozšíření CNTK proprietárního formátu (které se nenachází v původním HTK) je to, že CNTK umožňuje pohodlnější syntaxi relativního názvu cesty, když scp
se soubor nachází vedle funkcí:
id=.../filename
kde ...
odkazuje na adresář scp
souboru.
Soubor scp
pro funkce MFCC obsahuje například položky.
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]
Soubor scp
pro funkce PLP je podobný, ale ukazuje na různé fyzické soubory. Všimněte si, že logický kořenový název v obou scp
souborech je stejný.
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
Soubor obsahuje seznam popisků pomocí této syntaxe:
#!MLF!#
"id"
labelBegin1 labelEnd1 label1
labelBegin2 labelEnd2 label1
...
.
"id"
labelBegin1 labelEnd1 label1
labelBegin2 labelEnd2 label1
...
.
...
Tady máme oddíl ukončený (tečkou .
) pro každý vstupní soubor a jeden řádek na token v jednotlivých oddílech. Časy popisků jsou uvedeny v časovém základu 10e-7
a rámce řeči jsou obvykle 10e-2
, takže k každému indexu je potřeba připojit 5 nul .
Je důležité si uvědomit, že CNTK čte pouze první tři sloupce* v oddílu mlp
souboru a ignoruje zbytek. V našem ukázkovém mlf
souboru také sdílí logický název se soubory ''scp'. Tady je fragment kódu:
#!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
Teď popíšeme archivní soubory, které se někdy také označují jako chunk
soubory. CNTK používá koncept bloků dat pro všechny své čtenáře, a to znamená naprosto odlišnou věc, takže abychom se vyhnuli nejasnostem, nepoužíváme termín bloků dat ve vztahu k souborům popsaným níže, ale spíše jim říkáme Archivy.
Archivní soubory jsou v podstatě matice hlavní float32
sloupce s hlavičkou 12 bajtů, která obsahuje velikost vzorku a počet vzorků. Obecně se používají snadněji, zejména jako začátek. Očekávaná hlavička souboru je definována pomocí následujícího struct
postupu:
struct fileheader
{
int nsamples;
int sampperiod;
short sampsize;
short sampkind;
}
kde:
sampsize
je velikost vektoru v bajtech (=4 * feature dimension
);sampkind
je číselný identifikátor typu funkce (MFCC, PLP atd.). CNTK to ignoruje. Pokud vaše soubory nevytvořil HTK, můžete ho nastavit na 9 (USER). Andsampperiod
měla by být100000
(CNTK většinou tuto hodnotu ignoruje, s výjimkou chybových zpráv).
Nakonec je důležité si uvědomit, že ve většině aplikací pro rozpoznávání řeči se jako vstupy používají nepřetržité funkce, zatímco jako výstup se používají diskrétní popisky kategorií. HTKMLFReader ale pouze přidruží data k názvům uzlů a je nezávislá na tom, jak se tato data používají. K vygenerování jednorázového vektoru funkcí identity mluvčího jako vstupu do sítě je možné použít například příslušný mlf
soubor popisků identit mluvčího.