Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Op deze pagina wordt de CNTKTextFormatReader vanuit het oogpunt van BrainScript gedocumenteerd, maar Python gebruikers kunnen ook leren door dit document te lezen- de concepten, parameters en patronen zijn allemaal hetzelfde.
CNTKTextFormatReader (later gewoon CTF Reader) is ontworpen om invoertekstgegevens te gebruiken die zijn opgemaakt volgens de onderstaande specificatie. Het ondersteunt de volgende hoofdfuncties:
- Meerdere invoerstromen (invoer) per bestand
- Zowel sparse als dichte invoer
- Variabele lengtereeksen
CNTK Tekstopmaak (CTF)
Elke regel in het invoerbestand bevat één voorbeeld voor een of meer invoerwaarden. Aangezien (expliciet of impliciet) elke regel ook aan een reeks is gekoppeld, definieert deze een of meer <reeksen, invoer, voorbeeldrelaties> . Elke invoerregel moet als volgt worden opgemaakt:
[Sequence_Id](Sample or Comment)+
waar
Sample=|Input_Name (Value )*
Comment=|# some content
- Elke regel begint met een reeks-id en bevat een of meer steekproeven (met andere woorden, elke regel is een niet-geordende verzameling voorbeelden).
- De reeks-id is een getal. Dit kan worden weggelaten. In dat geval wordt het regelnummer gebruikt als de reeks-id.
- Elk voorbeeld is effectief een sleutel-waardepaar dat bestaat uit een invoernaam en de bijbehorende waardevector (toewijzing aan hogere dimensies wordt uitgevoerd als onderdeel van het netwerk zelf).
- Elk voorbeeld begint met een pijpsymbool (
|) gevolgd door de invoernaam (geen spaties), gevolgd door een witruimtescheidingsteken en vervolgens een lijst met waarden. - Elke waarde is een getal of een geïndexeerd getal voor parseringsinvoer.
- Tabs en spaties kunnen door elkaar worden gebruikt als scheidingstekens.
- Een opmerking begint met een pijp direct gevolgd door een hash-symbool:
|#, gevolgd door de inhoud (hoofdtekst) van de opmerking. De hoofdtekst kan tekens bevatten, maar een pijpsymbool in de hoofdtekst moet worden ontsnapt door het hash-symbool eraan toe te voegen (zie het onderstaande voorbeeld). De hoofdtekst van een opmerking gaat door tot het einde van de regel of de volgende niet-escape-pijp, afhankelijk van wat het eerst komt.
Eenvoudig voorbeeld
Dit voorbeeld is gebaseerd op een minimale set parameters en opmaakopties.
Als u de CTF-lezer wilt gebruiken, stelt u het readerTypeCNTKTextFormatReader in de sectie Lezer van uw CNTK-configuratie in:
...
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 ...
(Dit fragment en andere NDL-voorbeelden in dit document bevatten alleen reader sectie, waarbij de rest van de configuratie van de CNTK weglaat; zie het einde van deze pagina voor aanwijzers naar een set volledige voorbeeldnetwerken en de bijbehorende gegevenssets)
Voor de CTF-lezer zijn de volgende set parameters vereist:
file- pad naar het bestand met de gegevensset.input- subsectie waarin invoer wordt gedefinieerd die zijn geïdentificeerd door invoernamen (ABenCin het bovenstaande voorbeeld). Binnen elke invoer moeten de volgende vereiste parameters worden opgegeven:format- geeft het invoertype op. Moet zijndenseofsparsedim- geeft de dimensie van de invoerwaardevector op (voor dichte invoer komt dit rechtstreeks overeen met het aantal waarden in elke steekproef, voor parseren dit vertegenwoordigt de bovengrens van het bereik van mogelijke indexwaarden).
De invoergegevens die overeenkomen met de configuratie van de lezer hierboven, moeten er ongeveer als volgt uitzien:
|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
Let op het volgende over de invoerindeling:
|Input_Nameidentificeert het begin van elk invoervoorbeeld. Dit element is verplicht en wordt gevolgd door de correspondentwaardevector.- Dense vector is slechts een lijst met drijvendekommawaarden; sparse vector is een lijst met
index:valuetuples. - Zowel tabs als spaties zijn toegestaan als waardescheidingstekens (binnen invoervectoren) en invoerscheidingstekens (tussen invoerinvoer).
- Elke afzonderlijke regel vormt een 'reeks' van lengte 1 ('reële' reeksen met variabele lengte, wordt uitgelegd in het uitgebreide voorbeeld hieronder).
- Elke invoer-id kan slechts eenmaal op één regel worden weergegeven (wat wordt omgezet in één voorbeeld per invoer per regelvereiste ).
- De volgorde van invoervoorbeelden binnen een lijn is NIET belangrijk (conceptueel is elke regel een niet-geordende verzameling sleutel-waardeparen)
- Elke goed gevormde lijn moet eindigen met de symbolen Regelinvoer
\nof Regelterugloop, Regelinvoer\r\n.
Uitgebreid voorbeeld
Dit voorbeeld bevat alle mogelijke configuratieparameters en toont verschillende opties voor invoerindeling. Raadpleeg de onderstaande tabellen voor de volledige beschrijving van de configuratieparameters die in dit voorbeeld worden gebruikt.
...
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 ...
Met een samengestelde lezer wilt u het volgende:
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"}
}
})
}
Het bijbehorende invoerbestand kan er ongeveer als volgt uitzien:
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
Alle opties die in het bovenstaande voorbeeld worden besproken, zijn hier nog steeds van toepassing. Daarnaast hebben we twee extra functies geïntroduceerd:
Invoernaamaliassen
Invoernamen kunnen willekeurig lang zijn en deze dus herhalen in het invoerbestand is mogelijk niet ruimte-efficiënt. Om dit te verhelpen, kan de gegevensset aliassen gebruiken in plaats van volledige invoernamen. Aliassen moeten vervolgens worden opgegeven binnen elke subsectie van invoer. In ons voorbeeld maakt de gegevensset gebruik van aliassen a en b, die respectievelijk zijn toegewezen aan 'Some_very_long_input_name' en 'Some_other_also_very_long_input_name' in de sectie lezerconfiguratie.
Reeks-id's
Zoals al vermeld, vertegenwoordigt elke afzonderlijke regel in het invoerbestand een reeks met één voorbeeld voor elke invoer. Als een regel echter wordt voorafgegaan door een niet-negatief getal, wordt het getal gebruikt als de bijbehorende reeks-id. Alle volgende regels die dezelfde reeks-id delen, worden samengevoegd om deel uit te maken van dezelfde reeks. Als u daarom hetzelfde numerieke voorvoegsel voor N-regels herhaalt, kunt u een reeks met meerdere steekproeven samenstellen, waarbij elke invoer tussen 1 en N steekproeven bevat. Het weglaten van het volgordevoorvoegsel op de tweede regel en de volgende regels hebben hetzelfde effect. De bovenstaande voorbeeldgegevensset definieert dus vijf reeksen met id's 100, 200en 333400500.
Als skipSequenceIds u de parameter instelt in de sectie trueLezer, dwingt u de lezer om alle expliciete reeks-id's in de gegevensset te negeren en afzonderlijke regels als afzonderlijke reeksen te behandelen. Het weglaten van de reeks-id op de eerste regel in de gegevensset heeft ook hetzelfde effect: alle volgende reeks-id's worden genegeerd, regels die worden behandeld als afzonderlijke reeksen, zoals in dit voorbeeld:
|a 1 2 3 |b 100 200
100 |a 4 5 6 |b 101 201
200 |b 102983 14532 |a 7 8 9
Een paar laatste aandachtspunten bij het gebruik van reeksen:
- Reeks-id's moeten uniek zijn.
- Id-voorvoegsels kunnen alleen worden herhaald voor opeenvolgende regels.
- De lengte van de reeks in regels (dat wil gezegd, het aantal regels dat hetzelfde id-voorvoegsel deelt) mag niet groter zijn dan de maximale invoerlengte in steekproeven (het aantal steekproeven in een invoer) in deze reeks.
De volgende gegevenssets zijn bijvoorbeeld ongeldig:
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
Enkele Real-World voorbeelden
- Classificatie: elke regel bevat een voorbeeld, bestaande uit een label en functies. Er is geen reeks-id nodig, omdat elke regel een eigen 'reeks' van lengte 1 is.
|class 23:1 |features 2 3 4 5 6
|class 13:1 |features 1 2 0 2 3
...
- DSSM: Elke regel bevat een brondocumentpaar, uitgedrukt via een zak woorden, gecodeerd als sparse vectoren.
|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
- Part-of-speech tagging: Reeksen die elk element toewijzen aan een bijbehorend label. De reeksen worden verticaal uitgelijnd (één woord + tag per regel).
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
...
- Reeksclassificatie: Reeksen die zijn toegewezen aan één label. Reeksen worden verticaal uitgelijnd; Het label 'klasse' kan optreden op elke regel met dezelfde sequenceId.
Notitie
Op dit moment mag het aantal regels niet groter zijn dan de lengte van de langste reeks. Dit betekent dat het label niet zelfstandig op een regel kan worden weergegeven. Dit is een implementatiedetail dat in de toekomst zal worden opgeheven.
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
- Volgorde van volgorde: een bronreeks toewijzen aan een doelreeks. De twee reeksen worden verticaal uitgelijnd en, in het eenvoudigste geval, net na een andere afgedrukt. Ze worden samengevoegd door dezelfde algemene 'reeks-id' te hebben (die vervolgens een 'werkeenheid-id' wordt in dit geval).
Notitie
Op dit moment mag het aantal regels niet groter zijn dan de lengte van de langste reeks. Dit betekent dat reeksen horizontaal moeten worden uitgelijnd. Dit is een implementatiedetail dat in de toekomst zal worden opgeheven.
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
...
- Learning om te rangschikken: een 'reeks' vertegenwoordigt een query, elk voorbeeld van een document met een handgelabelde classificatie. In dit geval is de 'reeks' slechts een multiset die (in de context van een leer-naar-rang verliesfunctie) geen volgorde heeft.
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
...
Configuratieparameters
| Parameter | Beschrijving |
|---|---|
precision |
Hiermee geeft u de drijvendekommaprecisie (double of float) van de invoerwaarden op. Optioneel, standaard ingesteld op float. |
reader Sectie
| Parameter | Beschrijving |
|---|---|
readerType |
Hiermee geeft u een van de ondersteunde CNTK lezers te laden (bijvoorbeeld CNTKTextFormatReader). Vereist. |
file |
Pad naar het bestand met de invoergegevensset (Windows of Linux-stijl). Vereist. |
randomize |
Hiermee geeft u op of de invoer moet worden gerandomiseerd (true, false). Optioneel, standaard ingesteld op true. |
randomizationSeed |
Initialization seed value (incremented every sweep when the input data is re-randomized). Optioneel, standaard ingesteld op 0. |
randomizationWindow |
Hiermee geeft u de grootte (positief geheel getal) van het randomisatievenster (bijvoorbeeld randomisatiebereik). Deze parameter is van invloed op hoeveel van de gegevensset in het geheugen tegelijk moet worden opgeslagen. Optioneel, afhankelijk van de sampleBasedRandomizationWindow waarde, wordt standaard ingesteld op de grootte van de hele gegevensset in steekproeven (de invoer wordt gerandomiseerd in de hele gegevensset) of 4 GB schijfruimte aan segmenten ( 128 bijvoorbeeld wanneer de segmentgrootte gelijk is aan 32 MB). Deze parameter wordt genegeerd wanneer randomize dit is false. |
sampleBasedRandomizationWindow |
Als truede grootte van het randomisatievenster wordt geïnterpreteerd als een bepaald aantal steekproeven, anders als een aantal segmenten. Optioneel, standaard ingesteld op false. Op dezelfde manier randomizationWindowwordt deze parameter genegeerd, wanneer randomize dit is false. |
skipSequenceIds |
Als true, de lezer negeert reeks-id's in het invoerbestand, waarbij elke afzonderlijke regel wordt geïnterpreteerd als een onafhankelijke reeks van grootte 1 (zie de sectie over de reeks-id's). Optioneel, standaard ingesteld op false. |
maxErrors |
Aantal invoerfouten waarna een uitzondering moet worden gegenereerd. Optioneel, standaard ingesteld 0op, wat betekent dat de eerste onjuiste waarde een uitzondering activeert. |
traceLevel |
Uitgebreidheidsniveau van uitvoer. 0 - alleen fouten weergeven; 1 - fouten en waarschuwingen weergeven; 2 - alle uitvoer weergeven. Optioneel, standaard ingesteld op 1. |
chunkSizeInBytes |
Het aantal opeenvolgende bytes dat van de schijf moet worden gelezen in één leesbewerking. Optioneel, standaard ingesteld 33554432 op (32 MB). |
keepDataInMemory |
Als truede hele gegevensset in de cache wordt opgeslagen in het geheugen. Optioneel, standaard ingesteld op false. |
frameMode |
true geeft de lezer een verpakkingsmethode te gebruiken die is geoptimaliseerd voor frames (reeksen die slechts één steekproef bevatten). Optioneel, standaard ingesteld op false. |
cacheIndex |
Hiermee geeft u op of de metagegevens die tijdens de voorverwerkingsfase zijn gebouwd, moeten worden weggeschreven naar de schijf en moeten worden geladen vanaf schijf indien beschikbaar (true, ). false Optioneel, standaard ingesteld op false. Zie de onderstaande sectie voor meer informatie. Nieuw in CNTK versie 2.1. |
Indexcaching
Notitie
Nieuw in CNTK versie 2.1.
Met indexcaching kunt u (met een factor van 2-3x) opstarttijden aanzienlijk verminderen, met name wanneer u met grote invoerbestanden werkt. Als u de cacheIndex vlag instelt zodat true de lezer de indexeringsmetagegevens naar de schijf schrijft (dezelfde map als het invoerbestand) als het cachebestand niet beschikbaar is of als het verouderd is (ouder dan het invoerbestand). Het schrijven is het beste werk en wordt uitgevoerd op een afzonderlijke thread om de prestaties van de lezer niet te beïnvloeden. Als het cachebestand aanwezig is en up-to-date is, wordt het invoerbestand niet meer door de lezer overgeslagen om de index te bouwen. In plaats daarvan wordt de index uit het cachebestand geladen. Houd er rekening mee dat bepaalde configuratieparameters van de lezer een directe invloed hebben op indexering (bijvoorbeeld verschillende waarden van frameMode kunnen leiden tot indexen met een ander aantal reeksen). Daarom kan een cachebestand worden genegeerd door een lezer met een andere configuratie dan het bestand dat de cache heeft geproduceerd. Als u het volledige voordeel van caching wilt zien, moet de configuratie niet worden gewijzigd bij volgende nieuwe uitvoeringen.
input subsectie
input combineert een aantal afzonderlijke invoergegevens, elk met een juist gelabelde configuratiesubsectie. Alle hieronder beschreven parameters zijn specifiek voor een subsectie invoernaam die is gekoppeld aan een bepaalde invoer.
| Parameter | Beschrijving |
|---|---|
alias |
Een alternatieve afkorting (tekenreeks) die wordt gebruikt om de invoer in de gegevensset te identificeren. Optioneel |
format |
Hiermee geeft u het invoertype (dense, sparse). Vereist. |
dim |
Dimensie (positief geheel getal) van de invoerwaarde (bijvoorbeeld het aantal invoerwaarden in een steekproef voor dichte invoer, de bovengrens van het indexbereik voor sparse-invoer ). Vereist. |
definesMBSize |
Vlag (standaard onwaar), waarmee wordt aangegeven of de minibatchgrootte moet worden geteld in steekproeven uit deze specifieke stroom Optioneel. |
U vindt volledige netwerkdefinities en de bijbehorende voorbeelden van gegevenssets in de CNTK Opslagplaats. Daar vindt u ook een End-to-End-test die gebruikmaakt van de CNTKTextFormat-lezer.