Udostępnij za pośrednictwem


BrainScript za pomocą reguł analizowania wiersza polecenia

Poniżej opisano reguły analizowania CNTK wiersza polecenia. CNTK składa się z wielu składników do wykonania zadania. Większość z tych składników wymaga pewnych informacji o konfiguracji dostępnych do działania, a te parametry konfiguracji są udostępniane za pośrednictwem plików konfiguracji w CNTK.

Pliki konfiguracji to kolekcje par nazwa-wartość. Dane konfiguracji mogą być jednym z następujących typów:

  • Proste: pojedyncza wartość jest przypisywana do parametru konfiguracji. Na przykład deviceId = "Auto".
  • Tablica: do parametru konfiguracji jest przypisana tablica wartości, które nie muszą być jednolite. : jest separatorem domyślnym dla tablic. Separator może zostać zmieniony przez umieszczenie wartości tablicy w nawiasie i umieszczenie nowego znaku separatora bezpośrednio po otwartym nawiasie. Znak * umożliwia wielokrotne powtarzanie określonej wartości w tablicy. Na przykład minibatchSize = 256:512:512:512:1024 wartość jest minibatchSize = 256:512*3:1024równa .
  • Zestaw: zestawy parametrów zawierają zestawy parametrów konfiguracji dowolnego typu. Zestawy parametrów można zagnieżdżać. Domyślnym separatorem zestawów parametrów jest ; , jeśli wiele elementów jest uwzględnionych w jednym wierszu. Separatory wierszy służą również jako separatory elementów. Przykład:

block1 = [id=1;size=256]

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

W CNTK pliki konfiguracji są zorganizowane w sposób hierarchiczny. Rzeczywiste wartości danych nie są oceniane, dopóki składnik CNTK nie zażąda wartości. Gdy składnik zażąda wartości, CNTK najpierw przeszuka wewnątrz bloku składnika. Jeśli wartość nie zostanie znaleziona, będzie ona nadal wyszukiwać w parametrze nadrzędnym i dziadka ustawionym do momentu znalezienia parametru lub osiągnięcia najwyższego poziomu hierarchii konfiguracji bez dopasowania. Dzięki temu udział tych samych wartości parametrów jest łatwiejszy w różnych blokach. Jak wspomniano wcześniej, aby uruchomić CNTK należy określić plik konfiguracji w wierszu polecenia, ponieważ cntk configFile=yourExp.cntk spowoduje to załadowanie żądanego pliku konfiguracji i wykonanie dowolnego bloku polecenia wymienionego w parametrach polecenia w pliku konfiguracji.

Polecenia i akcje

Musi istnieć parametr polecenia najwyższego poziomu, który definiuje polecenia (oddzielone ciągiem :) wykonywane w pliku konfiguracji. Każde polecenie odwołuje się do bloku poleceń w pliku, który musi zawierać parametr akcji definiujący operację, która zostanie wykonana przez blok. Na przykład następujące polecenie spowoduje wykonanie mnistTrain bloku, który wykonuje akcję trenowania, a następnie mnistTest blok, który ocenia model.

command = mnistTrain:mnistTest

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

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

Przeciążenia konfiguracji w wierszu polecenia

Typową konfiguracją jest konfiguracja, która może być używana jako konfiguracja podstawowa, i modyfikowanie tylko kilku parametrów dla każdego przebiegu eksperymentalnego. Można to zrobić na kilka różnych sposobów, z których jednym jest zastąpienie ustawień w wierszu polecenia. Aby na przykład zastąpić ścieżkę pliku modelu, można po prostu zmodyfikować wiersz polecenia w następujący sposób:

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

Spowoduje to zastąpienie bieżącego ustawienia dla stderrelementu , które jest zdefiniowane na poziomie głównym pliku konfiguracji z nową wartością. Jeśli należy zmodyfikować parametr wewnątrz bloku poleceń, należy również określić blok. Na przykład można zmienić minibatchSize element dla eksperymentu w wierszu polecenia jako

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

lub zmodyfikuj plik danych używany do eksperymentu jako

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

Pliki konfiguracji warstwowej

Zamiast zastępować niektóre części pliku konfiguracji przy użyciu parametrów wiersza polecenia, można również określić wiele plików konfiguracji, gdzie te ostatnie pliki zastępują wcześniejsze. Dzięki temu użytkownik może mieć główny plik konfiguracji, a następnie określić w osobnym pliku konfiguracji parametry wzorca, które mają zostać zastąpione dla danego przebiegu CNTK. Można to zrobić, określając rozdzielaną listę plików konfiguracji "+" lub używając tagu configFile= wiele razy. Poniżej przedstawiono odpowiedniki.

cntk configFile=yourExp1.cntk+yourExp2.cntk

cntk configFile=yourExp1.cntk configFile=yourExp2.cntk

Jeśli yourExp2.cntk tylko zawiera ciąg mnistTrain=[reader=[file=mynewfile.txt]], oba te polecenia byłyby równoważne:

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

Należy pamiętać, że wartość zmiennej jest zawsze określana przez czas ostatniego przypisania. Istnieje również możliwość łączenia parametrów wiersza polecenia i plików konfiguracji warstwowych w dowolnych kombinacjach. Na przykład

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

te parametry konfiguracji są przetwarzane w kolejności, w jakiej są wyświetlane w wierszu polecenia, a niezależnie od wartości przypisanej ostatnio jest używana wartość.

Oprócz możliwości określenia wielu plików konfiguracji w wierszu polecenia użytkownik może uwzględnić jeden plik konfiguracji w innym. Jeśli na przykład pierwszy wiersz elementu yourExp2.cntk to

include=yourExp1.cntk

następnie po prostu uruchomiono

cntk configFile=yourExp2.cntk

byłoby równoważne uruchamianiu

cntk configFile=yourExp1.cntk+yourExp2.cntk

w tym ostatnim przypadku yourExp2.cntk nie zawiera instrukcji include. Należy pamiętać, że instrukcje dołączania mogą pojawiać się w dowolnym miejscu w pliku konfiguracji; wszędzie tam, gdzie pojawi się instrukcja include, w którym zostanie uwzględniony określony plik konfiguracji. Dołączenie pliku konfiguracji jest równoważne wklejeniu zawartości tego pliku w lokalizacji instrukcji include. Instrukcje dołączania są rozwiązywane rekursywnie (przy użyciu wyszukiwania szczegółowego), co oznacza, że jeśli yourExpA.cntk zawiera yourExpB.cntkelement , i yourExpB.cntk zawiera yourExpC.cntkwartość , cały łańcuch zostanie rozwiązany i yourExpC.cntk zostanie skutecznie uwzględniony w yourExpA.cntkelemecie . Jeśli plik konfiguracji jest dołączany wiele razy (np. "A" zawiera "B" i "C", a także "B", również "C"), będzie on skutecznie uwzględniany tylko przy pierwszym napotkaniu.

Ciągizowanie zmiennych

Chociaż pliki konfiguracji warstwowej umożliwiają użytkownikom ponowne używanie plików konfiguracji w eksperymentach, nadal może to być uciążliwy proces. W przypadku każdego eksperymentu użytkownik może być musiał zastąpić kilka parametrów, z których niektóre mogą być długimi ścieżkami plików (np. stderr, modelPath, file). Funkcja "stringize" może znacznie ułatwić ten proces. Umożliwia użytkownikowi określenie konfiguracji w następujący sposób:

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

Tutaj zmienne Root,RunName , DataSet1_Dimi DataSet1_Features są określone w innym miejscu w konfiguracji (w zakresie widocznym od momentu, w którym są używane). Podczas interpretowania tego pliku konfiguracji analizator zastąpi każdy ciąg formularza $VarName$ ciągiem VarValue, gdzie VarValue reprezentuje wartość zmiennej o nazwie VarName. Proces rozpoznawania zmiennych jest rekursywny; na przykład jeśli A=$B$, B=$C$i C=HelloWorld.txt, zostanie rozpoznana wartość A jako "HelloWorld.txt". Upewnij się, że w pliku konfiguracji nie ma pętli odwołania. W przeciwnym razie analizator przejdzie w nieskończoną pętlę w tej chwili.

Zwróć uwagę, że ponieważ jest on odpowiednikiem dla użytkownika w celu określenia wartości zmiennej w pliku konfiguracji w porównaniu z wierszem polecenia, wartości tych zmiennych można określić w obu lokalizacjach. Pamiętaj, że wartość zmiennej jest określana przez czas ostatniego przypisania, niezależnie od tego, czy ma to miejsce w pliku konfiguracji, czy w wierszu polecenia. W związku z tym, jeśli Root jest zdefiniowany w config1.txt, ale przesłonięte w wierszu polecenia, wartość określona w wierszu polecenia będzie używana do rozpoznawania wystąpień $Root$ w configFile1.txt. Jedną z przydatnych funkcji jest to, że jeśli stderr katalogi nie istnieją lub modelPath wskazują, te katalogi zostaną utworzone przez CNTK. Pozwala to określić coś podobnego stderr = $Root$\$RunName$\$RunName$.logdo , nawet jeśli katalog $Root$\$RunName$ nie istnieje.

Domyślne, powtarzające się wartości i komentarze

Większość parametrów w plikach konfiguracji ma wartość domyślną, która będzie używana, jeśli nie określono żadnej wartości konfiguracji. Jeśli nie ma wartości domyślnej i nie można odnaleźć wartości w wyszukiwaniu, zostanie wyświetlony wyjątek, a program zakończy działanie. Jeśli nazwa parametru jest określona więcej niż raz, ostatnia wartość ustawiona na tę wartość jest tą, która zostanie zachowana. Jedynym wyjątkiem od tego jest zestaw parametrów, które są otoczone [ nawiasami ]kwadratowymi , w tych przypadkach wartości wewnątrz nawiasów klamrowych są uważane za zestaw parametrów i zostaną dodane do aktualnie istniejącego zestawu parametrów. Przykład:

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

jest skutecznie równe:

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

Pamiętaj, że to przetwarzanie dołączania NIE jest używane dla elementów tablicy, a cała tablica zostanie zamieniona, jeśli zostanie ustawiona wiele razy. Znak # oznacza początek komentarza— wszystko, co następuje po zignorowaniu # . # Znak musi być poprzedzony białym znakiem lub na początku wiersza, który ma być interpretowany jako komentarz. Poniższy komentarz jest prawidłowy

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

Poniżej przedstawiono przykład wartości, która nie zostanie zinterpretowana jako komentarz. Ustawia parametr var nieskończoności, ponieważ znak # in 1#INF nie jest znacznikiem komentarza

var=1#INF