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ładminibatchSize = 256:512:512:512:1024
wartość jestminibatchSize = 256:512*3:1024
ró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 stderr
elementu , 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.cntk
element , i yourExpB.cntk
zawiera yourExpC.cntk
wartość , cały łańcuch zostanie rozwiązany i yourExpC.cntk
zostanie skutecznie uwzględniony w yourExpA.cntk
elemecie . 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_Dim
i 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$.log
do , 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