Sdílet prostřednictvím


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á. Tato blockRandomize možnost vyžaduje soubor archivu, který je popsaný níže. Jak je popsáno níže, při použití ve spojení s frameMode = "false" metodou blockRandomize č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 je rollingWindow , 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 je blockRandomize.

  • 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. zadat 17280000. Parametr randomize také rozumí dvěma speciálním hodnotám: auto nebo none. 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 nebo full, tato možnost rozhodne, jak zpracovat poslední minibatch, pokud není dostatek snímků k vytvoření kompletní minibatch požadované velikosti. Výchozí hodnota je partial, která použije zbývající snímky v menším posledním minibatchu trénovací epochy. Tato full 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 stylu mlf HTK, který obsahuje popisky pro všechny promluvy zadané v scp souboru.

  • labelDim: celková kardinalita sady popisků.

  • labelMappingFile: cesta k souboru, který obsahuje všechny popisky zobrazené v mlf 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 nebo false, 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 na false, 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 metodou blockRandomize č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 je 1, ale jakákoli hodnota nižší než 20 až 30 povede k významnému snížení efektivity u gpu.

  • truncated: true nebo false. 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-7a 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í float32sloupce 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). And
  • sampperiodměla by být 100000 (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.