Čtečka CNTK formátu textu v BrainScriptu
Tato stránka dokumentuje CNTKTextFormatReader z pohledu BrainScriptu, ale uživatelé Pythonu se mohou naučit také čtením tohoto dokumentu – koncepty, parametry a vzory jsou stejné.
CNTKTextFormatReader (později jednoduše CTF Reader) je navržený tak, aby spotřeboval vstupní textová data formátovaná podle specifikace níže. Podporuje následující hlavní funkce:
- Více vstupních datových proudů (vstupů) na soubor
- Řídké i husté vstupy
- Posloupnosti délky proměnných
Každý řádek vstupního souboru obsahuje jednu ukázku pro jeden nebo více vstupů. Vzhledem k tomu, že (explicitně nebo implicitně) každý řádek je také připojen k sekvenci, definuje jednu nebo více <sekvencí, vstup, vzorové> relace. Každý vstupní řádek musí být formátován následujícím způsobem:
[Sequence_Id](Sample or Comment)+
kde:
Sample=|Input_Name (Value )*
Comment=|# some content
- Každý řádek začíná ID sekvence a obsahuje jeden nebo více ukázek (jinými slovy, každý řádek je neuspořádaná kolekce vzorků).
- ID sekvence je číslo. Je možné ho vynechat, v takovém případě se číslo řádku použije jako ID sekvence.
- Každá ukázka je efektivně pár klíč-hodnota sestávající ze vstupního názvu a odpovídajícího vektoru hodnoty (mapování na vyšší dimenze se provádí jako součást samotné sítě).
- Každá ukázka začíná symbolem kanálu (
|
) následovaným vstupním názvem (bez mezer), následovaným oddělovačem prázdných znaků a seznamem hodnot. - Každá hodnota je číslo nebo číslo s předponou indexu pro řídké vstupy.
- Tabulátory i mezery lze použít zaměnitelně jako oddělovače.
- Komentář začíná rourou okamžitě následovanou symbolem hash:
|#
a pak následuje skutečně obsah (text) komentáře. Tělo může obsahovat libovolné znaky, ale symbol kanálu uvnitř těla musí být řídicí, a to tak, že k němu připojíte symbol hash (viz následující příklad). Text komentáře pokračuje až do konce řádku nebo dalšího neuchyceného potrubí podle toho, co nastane dříve.
Tento příklad vychází z minimální sady parametrů a možností formátu.
Pokud chcete použít CTF Reader, nastavte readerType
CNTKTextFormatReader
ji v části čtenáře konfigurace CNTK:
...
reader = [
readerType = "CNTKTextFormatReader"
file = "c:\mydata\SampleInput.txt" # See the second example for Linux path example
# IMPORTANT!
# All inputs are grouped within "input" sub-section.
input = [
A = [
dim = 5
format = "dense"
]
B = [
dim = 1000000
format = "sparse"
]
C = [
dim = 1
format = "dense"
]
]
]
# the rest of the cntk config ...
(Tento fragment a další příklady NDL v tomto dokumentu představují pouze reader
oddíl, vynechání zbytku konfigurace CNTK; na konci této stránky najdete ukazatele na sadu kompletních ukázkových sítí a odpovídajících datových sad).
Čtečka CTF vyžaduje následující sadu parametrů:
file
– cesta k souboru s datovou sadou.input
– dílčí část definující vstupy identifikované názvy vstupů (A
B
aC
v příkladu výše). V každém vstupu musí být zadány následující požadované parametry:format
- určuje vstupní typ. Musí býtdense
buď nebosparse
dim
- určuje rozměr vstupního vektoru hodnot (pro husté vstupy to přímo odpovídá počtu hodnot v každém vzorku, pro řídké toto představuje horní mez rozsahu možných hodnot indexu).
Vstupní data odpovídající předchozí konfiguraci čtenáře by měla vypadat přibližně takto:
|B 100:3 123:4 |C 8 |A 0 1 2 3 4 |# a CTF comment
|# another comment |A 0 1.1 22 0.3 54 |C 123917 |B 1134:1.911 13331:0.014
|C -0.001 |# a comment with an escaped pipe: '|#' |A 3.9 1.11 121.2 99.13 0.04 |B 999:0.001 918918:-9.19
Poznamenejte si následující informace o vstupním formátu:
|Input_Name
identifikuje začátek každého vstupního vzorku. Tento prvek je povinný a následuje odpovídající vektor hodnoty.- Hustota vektoru je jen seznam hodnot s plovoucí desetinou čárkou; řídký vektor je seznam
index:value
řazených členů. - Tabulátory i mezery jsou povolené jako oddělovače hodnot (v rámci vstupních vektorů) i vstupní oddělovače (mezi vstupy).
- Každá samostatná čára představuje "sekvenci" délky 1 ("Reálné" sekvence délky proměnných jsou vysvětleny v rozšířeném příkladu níže).
- Každý vstupní identifikátor se může zobrazit jenom jednou na jednom řádku (který se překládá na jednu ukázku na vstupní požadavek na řádek ).
- Pořadí vstupních vzorků v řádku není důležité (koncepčně, každý řádek je neuspořádanou kolekcí párů klíč-hodnota).
- Každá dobře vytvořená čára musí končit symboly "Spojnicový kanál"
\n
nebo "Návrat řádku, spojnicový kanál"\r\n
.
Tento příklad obsahuje všechny možné parametry konfigurace a zobrazuje různé možnosti vstupního formátu. Úplný popis parametrů konfigurace použitých v tomto příkladu najdete v následujících tabulkách.
...
precision="double"
reader = [
readerType = "CNTKTextFormatReader"
file = "/home/mydata/SampleInput.txt" # See the first example for Windows style path example
randomize = true
randomizationWindow = 30
skipSequenceIds = false
maxErrors = 100
traceLevel = 2
chunkSizeInBytes = 1024
keepDataInMemory = true
frameMode = false
input = [
Some_very_long_input_name = [
alias = "a"
dim = 3
format = "dense"
]
Some_other_also_very_long_input_name = [
alias = "b"
dim = 2
format = "dense"
]
]
]
# the rest of the cntk config ...
U složené čtečky by to vypadalo takto:
reader = {
verbosity = 0 ;
randomize = true;
randomizationWindow=30
deserializers = ({
type = "CNTKTextFormatDeserializer" ; module = "CNTKTextFormatReader"
file = "/home/mydata/SampleInput.txt" # See the first example for Windows style path example
maxErrors = 100
skipSequenceIds = false
traceLevel = 2
input = {
qu1fea = {alias = "qui"; dim = 95589; format = "sparse"}
qu2fea = {alias = "quj"; dim = 95589; format = "sparse"}
pairweight = {alias = "wij"; dim = 1; format = "dense"}
}
})
}
Odpovídající vstupní soubor pak může vypadat přibližně takto:
100 |a 1 2 3 |b 100 200
100 |a 4 5 6 |b 101 201
100 |b 102983 14532 |a 7 8 9
100 |a 7 8 9
200 |b 300 400 |a 10 20 30
333 |b 500 100
333 |b 600 -900
400 |a 1 2 3 |b 100 200
|a 4 5 6 |b 101 201
|a 4 5 6 |b 101 201
500 |a 1 2 3 |b 100 200
Všechny možnosti, které jsou popsány v předchozím příkladu, stále platí tady. Kromě toho jsme zavedli dvě další funkce:
Vstupní názvy můžou být libovolné, takže jejich opakování v celém vstupním souboru nemusí být prostorově efektivní. Aby se to zmírnit, může datová sada místo úplných vstupních názvů používat "aliasy". Aliasy se pak musí zadat v rámci každého vstupního dílčího pododdílu. V našem příkladu datová sada používá aliasy a
a b
, které jsou mapovány na "Some_very_long_input_name" a "Some_other_also_very_long_input_name" v konfigurační části čtenáře.
Jak už bylo zmíněno, každý samostatný řádek ve vstupním souboru představuje sekvenci obsahující jednu ukázku pro každý vstup. Pokud je ale řádek předponou ne záporného čísla, použije se jako odpovídající ID sekvence. Všechny následující řádky, které sdílejí stejné ID sekvence, se sloučí dohromady, aby se staly součástí stejné sekvence. Opakování stejné číselné předpony pro N čáry proto umožňuje vytvořit sekvenci s více vzorky, přičemž každý vstup obsahuje 1 až N vzorků. Vynechání předpony sekvence na druhém a následujících řádcích má stejný účinek. Příklad datové sady výše tedy definuje pět sekvencí s ID 100
, 200
, 333
400
a 500
.
Nastavení skipSequenceIds
parametru v oddílu čtenáře na true
, vynutí čtenáři ignorovat všechny explicitní ID sekvence v datové sadě a považovat samostatné řádky za jednotlivé sekvence. Vynechání ID sekvence na prvním řádku datové sady má stejný účinek – všechny následující ID sekvence se ignorují, řádky, které jsou považovány za jednotlivé sekvence, jako v tomto příkladu:
|a 1 2 3 |b 100 200
100 |a 4 5 6 |b 101 201
200 |b 102983 14532 |a 7 8 9
Při použití sekvencí je potřeba vzít v úvahu několik konečných věcí:
- ID sekvence musí být jedinečné.
- Předpony ID se dají opakovat jenom pro po sobě jdoucí řádky.
- Délka sekvence v řádcích (tj. počet řádků sdílejících stejnou předponu ID) nesmí překročit maximální délku vstupu v vzorcích (počet vzorků ve vstupu) v této sekvenci.
Například následující datové sady jsou neplatné:
100 |a 1 2 3 |b 100 200
200 |a 4 5 6 |b 101 201
100 |b 102983 14532 |a 7 8 9
123 |a 1 2 3 |b 100 200
456 |a 4 5 6
456 |b 101 201
- Klasifikace: Každý řádek obsahuje ukázku, která se skládá z popisku a funkcí. Není potřeba žádné ID sekvence, protože každý řádek má vlastní "posloupnost" délky 1.
|class 23:1 |features 2 3 4 5 6
|class 13:1 |features 1 2 0 2 3
...
- DSSM: Každý řádek obsahuje dvojici zdrojového cílového dokumentu vyjádřenou pomocí tašky slov kódovaných jako řídké vektory.
|src 12:1 23:1 345:2 45001:1 |tgt 233:1 766:2 234:1
|src 123:1 56:1 10324:1 18001:3 |tgt 233:1 2344:2 8889:1 2234:1 253434:1
- Označování částí řeči: Sekvence mapují každý prvek na odpovídající popisek. Sekvence jsou zarovnané svisle (jedno slovo + značka na řádek).
0 |word 234:1 |tag 12:1
0 |word 123:1 |tag 10:1
0 |word 123:1 |tag 13:1
1 |word 234:1 |tag 12:1
1 |word 123:1 |tag 10:1
...
- Klasifikace sekvence: Sekvence mapované na jeden popisek Sekvence jsou zarovnané svisle; Popisek "třída" může nastat v libovolném řádku, který má stejný sekvenciId.
Poznámka
V okamžiku, kdy počet řádků nesmí překročit délku nejdelší sekvence. To znamená, že popisek se nemůže zobrazit na řádku samostatně. Jedná se o podrobnosti implementace, které budou v budoucnu zvednuty.
0 |word 234:1 |class 3:1
0 |word 123:1
0 |word 890:1
1 |word 11:1 |class 2:1
1 |word 344:1
- Sekvence k posloupnosti: Namapuje zdrojovou sekvenci na cílovou sekvenci. Tyto dvě sekvence jsou zarovnané svisle a v nejjednodušším případě se právě vytisknou za jinou. Spojí se tak, že mají stejné celkové "ID sekvence" (což se pak stane "ID pracovní jednotky" v tomto případě).
Poznámka
V okamžiku, kdy počet řádků nesmí překročit délku nejdelší sekvence. To znamená, že sekvence musí být zarovnány vodorovně. Jedná se o podrobnosti implementace, které budou v budoucnu zvednuty.
0 |sourceWord 234:1 |targetWord 344:1
0 |sourceWord 123:1 |targetWord 456:1
0 |sourceWord 123:1 |targetWord 2222:1
0 |sourceWord 11:1
1 |sourceWord 123:1
...
- Učení k pořadí: Posloupnost představuje dotaz, každý ukázkový dokument s ručním hodnocením. V tomto případě je "sekvence" jen multiset, která (v kontextu funkce ztráty pořadí) nemá pořadí.
0 |rating 4 |features 23 35 0 0 0 21 2345 0 0 0 0 0
0 |rating 2 |features 0 123 0 22 44 44 290 22 22 22 33 0
0 |rating 1 |features 0 0 0 0 0 0 1 0 0 0 0 0
1 |rating 1 |features 34 56 0 0 0 45 1312 0 0 0 0 0
1 |rating 0 |features 45 45 0 0 0 12 335 0 0 0 0 0
2 |rating 0 |features 0 0 0 0 0 0 22 0 0 0 0 0
...
Parametr | Popis |
---|---|
precision |
Určuje přesnost s plovoucí desetinou čárkou (double nebo float ) vstupních hodnot. Volitelné, výchozí hodnoty .float |
Parametr | Popis |
---|---|
readerType |
Určuje jednu z podporovaných CNTK čtenářů, které se mají načíst (napřCNTKTextFormatReader . ). Povinné. |
file |
Cesta k souboru obsahujícímu vstupní datovou sadu (styl Windows nebo Linuxu) Povinné. |
randomize |
Určuje, zda má být vstup randomizován (true , false ). Volitelné, výchozí hodnoty .true |
randomizationSeed |
Počáteční počáteční hodnota randomizace (při opětovném randomizaci vstupních dat se zvýší každé uklidnění). Volitelné, výchozí hodnoty .0 |
randomizationWindow |
Určuje velikost (kladné celé číslo) okna randomizace (tj. oblast náhodnosti). Tento parametr ovlivňuje, kolik datové sady se musí najednou nacházet v paměti. Volitelné, v závislosti na sampleBasedRandomizationWindow hodnotě se ve výchozím nastavení nastaví buď na velikost celé datové sady v ukázkách (tj. vstup je randomizován napříč celou datovou sadou), nebo 4 GB místa na disku v hodnotě bloků dat (tj 128 . když se velikost bloku rovná 32 MB). Tento parametr je ignorován, pokud randomize je false . |
sampleBasedRandomizationWindow |
Pokud true je velikost okna randomizace interpretována jako určitý počet vzorků, jinak jako počet bloků. Volitelné, výchozí hodnoty .false Podobně jako randomizationWindow tento parametr je ignorován, pokud randomize je false . |
skipSequenceIds |
Pokud true čtečka ignoruje ID posloupnosti ve vstupním souboru, interpretuje každý samostatný řádek jako nezávislou sekvenci velikosti 1 (viz část id sekvence). Volitelné, výchozí hodnoty .false |
maxErrors |
Počet vstupních chyb, po kterých by měla být vyvolána výjimka. Volitelné, výchozí nastavení 0 znamená, že první špatně formátovaná hodnota aktivuje výjimku. |
traceLevel |
Úroveň podrobností výstupu 0 - zobrazit pouze chyby; 1 - zobrazí chyby a upozornění; 2 - zobrazit veškerý výstup. Volitelné, výchozí hodnoty .1 |
chunkSizeInBytes |
Počet po sobě jdoucích bajtů, které se mají číst z disku v jedné operaci čtení. Volitelné, výchozí hodnoty jsou 33554432 (32 MB). |
keepDataInMemory |
Pokud true se celá datová sada uloží do mezipaměti. Volitelné, výchozí hodnoty .false |
frameMode |
true signalizuje čtenáři použití metody balení optimalizované pro rámy (sekvence, které obsahují pouze jednu ukázku). Volitelné, výchozí hodnoty .false |
cacheIndex |
Určuje, zda by se meta-data vytvořená během fáze předběžného zpracování měla zapsat na disk a načíst je z disku, pokud je k dispozici (true , false ). Volitelné, výchozí hodnoty .false Další podrobnosti najdete v následující části. Novinka v CNTK verze 2.1 |
Poznámka
Novinka v CNTK verze 2.1
Ukládání indexů do mezipaměti umožňuje výrazně (faktorem 2–3x) snížit časy spuštění, zejména při práci s velkými vstupními soubory. Pokud soubor mezipaměti není dostupný nebo pokud není soubor mezipaměti zastaralý (starší než vstupní soubor), nastavíte cacheIndex
příznak tak, aby true
čtečka signalizovala zápis meta-dat na disk (stejný adresář jako vstupní soubor). Psaní je nejlepší a provádí se na samostatném vlákně, aby to nemělo vliv na výkon čtenáře. Pokud soubor mezipaměti existuje a je aktuální, čtečka už nebude přeskočovat vstupní soubor k sestavení indexu, místo toho index načte ze souboru mezipaměti. Upozorňujeme, že některé parametry konfigurace čtenáře mají přímý dopad na indexování (například různé hodnoty frameMode
by mohly vést k indexům, které mají různý počet sekvencí). Z tohoto důvodu může soubor mezipaměti ignorovat čtenář s konfigurací jinou než ten, který mezipaměť vytvořil. Pokud chcete zobrazit úplnou výhodu ukládání do mezipaměti, konfigurace by se neměla upravovat při následných opakovaných spuštěních.
input
kombinuje řadu jednotlivých vstupů, každý z nich s odpovídajícím popiskem dílčího oddílu konfigurace. Všechny parametry popsané níže jsou specifické pro dílčí část vstupního názvu přidruženou k určitému vstupu.
Parametr | Popis |
---|---|
alias |
Alternativní zkrácený název (řetězec), který slouží k identifikaci vstupu v datové sadě. Volitelné |
format |
Určuje vstupní typ (dense , sparse ). Povinné. |
dim |
Dimenze (kladné celé číslo) vstupní hodnoty (tj. počet vstupních hodnot ve vzorku pro husté vstupy, horní mez rozsahu indexu pro řídký vstup). Povinné. |
definesMBSize |
Příznak (výchozí false) označující, jestli má být velikost minibatch počítána v ukázkách z tohoto konkrétního streamu Volitelné. |
V úložišti CNTK najdete kompletní definice sítě a odpovídající příklady sady dat. Tam najdete také kompletní test , který používá čtečku CNTKTextFormat.