Freigeben über


BrainScript über Befehlszeilenanalyseregeln

Unten beschreiben wir die CNTK Befehlszeilenanalyseregeln. CNTK besteht aus einer Reihe von Komponenten, um einen Vorgang abzuschließen. Die meisten dieser Komponenten benötigen einige Konfigurationsinformationen, die zur Funktion verfügbar sind, und diese Konfigurationsparameter werden über Konfigurationsdateien in CNTK bereitgestellt.

Konfigurationsdateien sind Sammlungen von Namenswertpaaren. Die Konfigurationsdaten können eine der folgenden Typen sein:

  • Einfach: Ein einzelner Wert wird dem Konfigurationsparameter zugewiesen. Beispiel: deviceId = "Auto".
  • Array: Ein Konfigurationsparameter wird einem Array von Werten zugewiesen, die nicht ein einheitlicher Typ sein müssen. : ist das Standardtrennzeichen für Arrays. Das Trennzeichen kann geändert werden, indem die Arraywerte in Klammern eingeschlossen und das neue Trennzeichen unmittelbar nach der geöffneten Klammer platziert wird. Mit * dem Zeichen kann ein bestimmter Wert mehrmals im Array wiederholt werden. Beispiel: minibatchSize = 256:512:512:512:1024 Gleich minibatchSize = 256:512*3:1024.
  • Set: Parametersätze enthalten Sätze von Konfigurationsparametern eines beliebigen Typs. Parametersätze können geschachtelt werden. Das Standardtrennzeichen für Parametersätze ist ; , wenn mehrere Elemente in einer Zeile enthalten sind. Zeilentrennzeichen dienen auch als Trennzeichen für Elemente. Beispiel:

block1 = [id=1;size=256]

block2 = [
    subblock = [string="hi";num=5]
    value = 1e-10
    array = 10:"this is a test":1.25
]

In CNTK werden Konfigurationsdateien in hierarchischer Weise organisiert. Die tatsächlichen Datenwerte werden erst ausgewertet, wenn eine CNTK Komponente den Wert anfordert. Wenn ein Wert von einer Komponente angefordert wird, sucht CNTK zuerst innerhalb des Komponentenblocks. Wenn der Wert nicht gefunden wird, wird es weiterhin im übergeordneten und großelternparameter festgelegt, bis der Parameter gefunden wird, oder die oberste Ebene der Konfigurationshierarchie ohne Übereinstimmung erreicht wird. Dies ermöglicht die Freigabe derselben Parameterwerte, die in verschiedenen Blöcken einfacher sind. Wie zuvor beschrieben, müssen Sie CNTK angeben, dass Sie die Konfigurationsdatei in der Befehlszeile angeben müssen, da cntk configFile=yourExp.cntk Dies die angeforderte Konfigurationsdatei lädt, und führen Sie jeden Befehlsblock aus, der in den Befehlsparametern in der Konfigurationsdatei aufgeführt ist.

Befehle und Aktionen

Es muss ein Befehlsparameter auf oberster Ebene vorhanden sein, der die Befehle (getrennt mit :) definiert, die in der Konfigurationsdatei ausgeführt werden. Jeder Befehl verweist auf einen Befehlsblock in der Datei, der einen Aktionsparameter enthält, der den Vorgang definiert, den der Block ausführt. Der folgende Befehl führt z. B. den mnistTrain Block aus, der die Zugaktion ausführt, gefolgt vom mnistTest Block, der das Modell auswertet.

command = mnistTrain:mnistTest

mnistTrain = [
    action = "train"
    ...
]

mnistTest = [
    action = "eval"
    ...
]

Konfigurationsüberladungen in der Befehlszeile

Es ist üblich, eine Konfiguration zu haben, die als Basiskonfiguration verwendet werden kann, und nur einige Parameter für jede experimentelle Ausführung ändern. Dies kann auf einige verschiedene Arten erfolgen, eine davon besteht darin, Einstellungen in der Befehlszeile außer Kraft zu setzen. Um beispielsweise den Modelldateipfad außer Kraft zu setzen, kann man einfach die Befehlszeile wie folgt ändern:

cntk configFile=yourExp.cntk stderr="c:\temp\newpath"

Dadurch wird die aktuelle Einstellung für , die auf der Stammebene der Konfigurationsdatei definiert ist, mit dem neuen Wert außer Kraft stderrsetzen. Wenn ein Parameter innerhalb eines Befehlsblocks geändert werden muss, muss der Block auch angegeben werden. Beispielsweise kann man das minibatchSize Beispiel für ein Experiment in der Befehlszeile ändern als

cntk configFile=yourExp.cntk mnistTrain=[minibatchSize=256]

oder ändern Sie die Für ein Experiment verwendete Datendatei als

cntk configFile=yourExp.cntk mnistTrain=[reader=[file="mynewfile.txt"]]

Ebenenkonfigurationsdateien

Anstatt einige Teile einer Konfigurationsdatei mithilfe von Befehlszeilenparametern außer Kraft zu setzen, kann man auch mehrere Konfigurationsdateien angeben, wobei die letzteren Dateien die früheren außer Kraft setzen. Dadurch kann ein Benutzer über eine Masterkonfigurationsdatei verfügen und dann in einer separaten Konfigurationsdatei angeben, welche Parameter des Mastermasters sie für eine bestimmte Ausführung von CNTK außer Kraft setzen möchten. Dies kann erreicht werden, indem Sie entweder eine getrennte Liste von Konfigurationsdateien angeben oder das Tag mehrmals verwenden configFile= . Die folgenden Werte sind äquivalent.

cntk configFile=yourExp1.cntk+yourExp2.cntk

cntk configFile=yourExp1.cntk configFile=yourExp2.cntk

Wenn yourExp2.cntk nur die Zeichenfolge mnistTrain=[reader=[file=mynewfile.txt]]enthalten ist, würden beide befehle gleich:

cntk configFile=yourExp1.cntk mnistTrain=[reader=[file="mynewfile.txt"]]

Beachten Sie, dass der Wert einer Variable immer durch das letzte Zugewiesene bestimmt wird. Es ist auch möglich, Befehlszeilenparameter und Schichtkonfigurationsdateien in beliebigen Kombinationen zu kombinieren. Beispiel:

cntk configFile=yourExp1.cntk+yourExp2.cntk var1=value configFile=yourExp3.cntk

würde diese Konfigurationsparameter in der Reihenfolge verarbeiten, in der sie in der Befehlszeile angezeigt werden, und jeder zuletzt zugewiesene Wert ist der verwendete Wert.

Darüber hinaus können Sie mehrere Konfigurationsdateien an der Befehlszeile angeben, kann ein Benutzer eine Konfigurationsdatei in eine andere einschließen. Wenn z. B. die erste Zeile von yourExp2.cntk war

include=yourExp1.cntk

Dann einfach ausführen

cntk configFile=yourExp2.cntk

würde dem Ausführen entsprechen

cntk configFile=yourExp1.cntk+yourExp2.cntk

in diesem Fall yourExp2.cntk enthält die Include-Anweisung nicht. Beachten Sie, dass diese Einschließen-Anweisungen überall in einer Konfigurationsdatei angezeigt werden können; überall, wo die Include-Anweisung angezeigt wird, ist die angegebene Konfigurationsdatei enthalten. Das Einschließen einer Konfigurationsdatei entspricht dem Einfügen des Inhalts dieser Datei am Speicherort der Include-Anweisung. Include-Anweisungen werden rekursiv aufgelöst (mithilfe einer tiefen ersten Suche), d. h. wenn yourExpA.cntk sie enthalten yourExpB.cntkist und enthältyourExpC.cntk, yourExpC.cntk wird die vollständige Kette aufgelöst und yourExpB.cntk effektiv in .yourExpA.cntk Wenn eine Konfigurationsdatei mehrmals enthalten ist (z. B. "A" enthält "B" und "C", und "B" enthält auch "C"), dann wird es nur dann wirksam eingeschlossen, wenn sie zum ersten Mal aufgetreten ist.

Zeichenfolgenvariablen

Während schichtige Konfigurationsdateien Benutzern das Wiederverwenden von Konfigurationsdateien über Experimente ermöglichen, kann dies immer noch ein schwerer Prozess sein. Für jedes Experiment muss ein Benutzer möglicherweise mehrere Parameter außer Kraft setzen, von denen einige möglicherweise lange Dateipfade (z. B. , stderrmodelPathfile, ). Die Funktionalität "stringize" kann diesen Prozess wesentlich einfacher machen. Es ermöglicht einem Benutzer, die Konfiguration wie folgt anzugeben:

command = SpeechTrain
stderr = "$Root$\$RunName$.log"
speechTrain = [
    modelPath = "$Root$\$RunName$.cn"
    SGD = [
        reader = [
            features = [
                type = "real"
                dim = "$DataSet1_Dim$"
                file = "$DataSet1_Features$"
            ]
        ]
    ]
]

Hier, Root,RunName, DataSet1_Dim, und DataSet1_Features sind Variablen, die an anderer Stelle in der Konfiguration angegeben werden (an einem Bereich sichtbar aus dem Punkt, an dem sie verwendet werden). Bei der Interpretation dieser Konfigurationsdatei ersetzt der Parser jede Zeichenfolge des Formulars $VarName$ durch die Zeichenfolge VarValue, wobei VarValue der Wert der Variablen namens dargestellt VarNamewird. Der Prozess der Variablenauflösung ist rekursiv; Wenn z. B. A=$B$, B=$C$, und C=HelloWorld.txt, wird A als "HelloWorld.txt" aufgelöst. Stellen Sie sicher, dass in Ihrer Konfigurationsdatei keine Referenzschleife vorhanden ist. Andernfalls wird der Parser zu einer unendlichen Schleife in diesem Moment wechseln.

Beachten Sie, dass ein Benutzer den Wert einer Variable in einer Konfigurationsdatei im Vergleich zur Befehlszeile angibt, die Werte für diese Variablen können an beiden Speicherorten angegeben werden. Erinnern Sie sich daran, dass der Wert einer Variable durch das letzte Zugewiesene bestimmt wird, unabhängig davon, ob dies in einer Konfigurationsdatei oder in der Befehlszeile geschieht. Wenn Root sie in config1.txt definiert ist, aber in der Befehlszeile außer Kraft gesetzt wird, wäre der wert, der in der Befehlszeile angegeben ist, der zum Auflösen von $Root$ Instanzen in configFile1.txt verwendet wird. Ein nützliches Feature ist, wenn stderr oder modelPath auf Verzeichnisse verweist, die nicht vorhanden sind, werden diese Verzeichnisse von CNTK erstellt. Dadurch können Sie etwas wie stderr = $Root$\$RunName$\$RunName$.log, auch wenn das Verzeichnis $Root$\$RunName$ nicht vorhanden ist, angeben.

Standard-, wiederholte Werte und Kommentare

Die meisten Parameter in Konfigurationsdateien verfügen über einen Standardwert, der verwendet wird, wenn kein Konfigurationswert angegeben wird. Wenn kein Standardwert vorhanden ist und der Wert in einer Suche nicht gefunden werden kann, wird eine Ausnahme angezeigt, und das Programm wird beendet. Wenn ein Parametername mehr als einmal angegeben wird, ist der letzte Wert, der auf diesen Wert festgelegt ist, der beibehalten wird. Die einzige Ausnahme hierfür ist in Parametersätzen, die durch [ quadratische Klammern ]umgeben sind, in diesen Fällen werden die Werte innerhalb der Klammern als Parametersatz betrachtet und dem aktuell vorhandenen Parametersatz hinzugefügt. Beispiel:

params=[a=1;b=2;c=3]
params=[c=5;d=6;e=7]

ist effektiv gleich:

params=[a=1;b=2;c=5;d=6;e=7]

Beachten Sie, dass diese Anfügeverarbeitung NICHT für Arrayelemente verwendet wird, und das gesamte Array wird ersetzt, wenn sie mehrmals festgelegt wird. Das # Zeichen kennzeichnet den Anfang eines Kommentars, alles, das nach der # Ignorierten auftritt. Dies # muss vor Leerzeichen erfolgen oder am Anfang der Zeile als Kommentar interpretiert werden. Der folgende Kommentar ist gültig.

stderr="c:\cntk\log\cntk" # "_mnistTrain_mnistTest.log"

Im Folgenden finden Sie ein Beispiel für einen Wert, der nicht als Kommentar interpretiert wird. Es legt einen Parameter var auf Unendlichkeit fest, da das # In 1#INF keine Kommentarmarkierung ist

var=1#INF