명령줄 구문 분석 규칙을 통한 BrainScript

아래에서는 CNTK 명령줄 구문 분석 규칙을 설명합니다. CNTK 작업을 완료하는 여러 구성 요소로 구성됩니다. 이러한 구성 요소의 대부분은 작동하기 위해 사용할 수 있는 몇 가지 구성 정보가 필요하며, 이러한 구성 매개 변수는 CNTK 구성 파일을 통해 제공됩니다.

구성 파일은 이름-값 쌍의 컬렉션입니다. 구성 데이터는 다음 유형 중 하나일 수 있습니다.

  • 단순: 단일 값이 구성 매개 변수에 할당됩니다. 예: deviceId = "Auto".
  • 배열: 구성 매개 변수에는 균일한 형식이 아니어야 하는 값 배열이 할당됩니다. : 는 배열의 기본 구분 기호입니다. 배열 값을 괄호로 묶고 열린 괄호 바로 다음에 새 구분 기호 문자를 배치하여 구분 기호를 변경할 수 있습니다. 이 * 문자를 사용하면 배열에서 특정 값을 여러 번 반복할 수 있습니다. 예를 들어 minibatchSize = 256:512:512:512:1024 같음.minibatchSize = 256:512*3:1024
  • Set: 매개 변수 집합에는 모든 형식의 구성 매개 변수 집합이 포함됩니다. 매개 변수 집합은 중첩될 수 있습니다. 매개 변수 집합의 기본 구분 기호는 여러 항목이 한 줄에 포함되는 경우입니다 ; . 줄 구분 기호는 항목의 구분 기호로도 사용할 수 있습니다. 예를 들면 다음과 같습니다.

block1 = [id=1;size=256]

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

CNTK 구성 파일은 계층 구조 방식으로 구성됩니다. 실제 데이터 값은 CNTK 구성 요소가 값을 요청할 때까지 평가되지 않습니다. 구성 요소에서 값을 요청하면 CNTK 먼저 구성 요소 블록 내에서 검색합니다. 값을 찾을 수 없는 경우 매개 변수를 찾을 때까지 부모 및 조부모 매개 변수 집합을 계속 확인하거나 일치 없이 구성 계층의 최상위 수준에 도달합니다. 이렇게 하면 여러 블록에서 동일한 매개 변수 값의 공유가 더 쉬워질 수 있습니다. 앞에서 설명한 대로 CNTK 실행하려면 요청된 구성 파일을 로드하고 구성 파일의 명령 매개 변수에 나열된 명령 블록을 실행하므로 명령줄 cntk configFile=yourExp.cntk 에서 구성 파일을 지정해야 합니다.

명령 및 작업

구성 파일에서 실행될 명령을 정의하는 최상위 명령 :매개 변수가 있어야 합니다. 각 명령은 파일의 명령 블록을 참조합니다. 이 명령은 블록이 수행할 작업을 정의하는 작업 매개 변수를 포함해야 합니다. 예를 들어 다음 명령은 모델을 평가하는 블록 뒤에 mnistTest 학습 작업을 실행하는 블록을 실행 mnistTrain 합니다.

command = mnistTrain:mnistTest

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

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

명령줄의 구성 오버로드

기본 구성으로 사용할 수 있는 구성을 가지는 것이 일반적이며 각 실험적 실행에 대해 몇 가지 매개 변수만 수정합니다. 이 작업은 몇 가지 다른 방법으로 수행할 수 있으며, 그 중 하나는 명령줄의 설정을 재정의하는 것입니다. 예를 들어 모델 파일 경로를 재정의하려면 명령줄을 다음과 같이 수정하기만 하면 됩니다.

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

그러면 구성 파일의 루트 수준에서 정의된 현재 설정 stderr이 새 값으로 재정의됩니다. 명령 블록 내의 매개 변수를 수정해야 하는 경우 블록을 지정해야 합니다. 예를 들어 명령줄에서 실험의 minibatchSize 경우를 다음과 같이 변경할 수 있습니다.

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

또는 실험에 사용되는 데이터 파일을 로 수정합니다.

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

계층화된 구성 파일

명령줄 매개 변수를 사용하여 구성 파일의 일부 부분을 재정의하는 대신 여러 구성 파일을 지정할 수도 있습니다. 여기서 후자의 파일은 이전 파일을 재정의합니다. 이렇게 하면 사용자가 마스터 구성 파일을 갖고 지정된 CNTK 실행에 대해 재정의하려는 마스터의 매개 변수를 별도의 구성 파일에 지정할 수 있습니다. 이 작업은 구성 파일의 '+' 구분 목록을 지정하거나 태그를 여러 번 사용하여 configFile= 수행할 수 있습니다. 다음 두 줄은 동일한 의미를 갖습니다.

cntk configFile=yourExp1.cntk+yourExp2.cntk

cntk configFile=yourExp1.cntk configFile=yourExp2.cntk

문자열mnistTrain=[reader=[file=mynewfile.txt]]만 포함하는 경우 yourExp2.cntk 다음 두 명령은 모두 다음과 같습니다.

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

변수의 값은 항상 마지막으로 할당된 시간에 따라 결정됩니다. 명령줄 매개 변수와 계층화된 구성 파일을 임의의 조합으로 혼합할 수도 있습니다. 예를 들면 다음과 같습니다.

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

는 명령줄에 표시되는 순서대로 이러한 구성 매개 변수를 처리하고 마지막으로 할당된 값은 사용된 값입니다.

명령줄에서 여러 구성 파일을 지정할 수 있을 뿐만 아니라 사용자는 한 구성 파일을 다른 구성 파일에 포함할 수 있습니다. 예를 들어 첫 줄 yourExp2.cntk

include=yourExp1.cntk

그런 다음 간단히 실행

cntk configFile=yourExp2.cntk

는 실행과 동일합니다.

cntk configFile=yourExp1.cntk+yourExp2.cntk

이 후자의 경우 yourExp2.cntk include 문이 포함되지 않습니다. 이러한 include 문은 구성 파일 내의 아무 곳에나 나타날 수 있습니다. include 문이 나타나면 지정된 구성 파일이 포함되는 위치입니다. 구성 파일을 포함하는 것은 해당 파일의 내용을 include 문의 위치에 붙여넣는 것과 같습니다. Include 문은 깊이 우선 검색을 사용하여 재귀적으로 확인됩니다. 즉, 포함yourExpB.cntk되는 yourExpC.cntkyourExpB.cntk 경우 yourExpA.cntk 전체 체인이 해결되고 yourExpC.cntk 효과적으로 포함yourExpA.cntk됩니다. 구성 파일이 여러 번 포함되는 경우(예: 'A'에는 'B' 및 'C'가 포함되고 'B'에는 'C'도 포함됨). 이 파일은 처음 발견될 때만 효과적으로 포함됩니다.

변수 문자열화

계층화된 구성 파일을 사용하면 사용자가 실험에서 구성 파일을 다시 사용할 수 있지만 여전히 번거로운 프로세스일 수 있습니다. 각 실험에 대해 사용자는 여러 매개 변수를 재정의해야 할 수 있으며, 그 중 일부는 긴 파일 경로(예: stderr, , modelPathfile)일 수 있습니다. "stringize" 기능을 사용하면 이 프로세스를 훨씬 쉽게 만들 수 있습니다. 사용자가 다음과 같은 구성을 지정할 수 있습니다.

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

Root여기서는 구성RunNameDataSet1_Dim의 다른 위치에서 지정된 변수(DataSet1_Features사용되는 지점에서 볼 수 있는 범위)입니다. 이 구성 파일을 해석할 때 파서는 폼 $VarName$ 의 모든 문자열을 문자열VarValue로 바꿉니다. 여기서 호출VarNameVarValue 변수의 값을 나타냅니다. 변수 확인 프로세스는 재귀적입니다. 예를 들어 A=$B$, B=$C$, C=HelloWorld.txt 경우 A는 "HelloWorld.txt"로 확인됩니다. 구성 파일에 참조 루프가 없는지 확인하세요. 그렇지 않으면 파서가 현재 무한 루프로 이동합니다.

사용자가 구성 파일의 변수 값을 지정하는 것과 명령줄에서 동일한 값을 지정하는 것과 동일하기 때문에 이러한 변수의 값은 어느 위치에서나 지정할 수 있습니다. 변수의 값은 마지막으로 할당된 시간, 구성 파일 또는 명령줄에 있는지 여부에 따라 결정됩니다. 따라서 config1.txt 정의되었지만 명령줄에서 재정의 $Root$ 된 경우 Root 명령줄에 지정된 값은 configFile1.txt 인스턴스를 확인하는 데 사용되는 값입니다. 한 가지 유용한 기능은 존재하지 않는 디렉터리를 가리키거나 가리키면 stderr 이러한 디렉터리가 CNTK 생성된다는 것입니다. 이렇게 하면 디렉터리가 $Root$\$RunName$ 없는 경우에도 같은 stderr = $Root$\$RunName$\$RunName$.log것을 지정할 수 modelPath 있습니다.

기본값, 반복 값 및 주석

구성 파일의 대부분의 매개 변수에는 구성 값이 지정되지 않은 경우 사용되는 기본값이 있습니다. 기본값이 없고 검색에서 값을 찾을 수 없는 경우 예외가 표시되고 프로그램이 종료됩니다. 매개 변수 이름을 두 번 이상 지정하면 해당 값으로 설정된 마지막 값은 유지 관리되는 값입니다. 유일한 예외는 정사각형 중괄호로 [ 둘러싸인 매개 변수 집합에 있습니다. 이러한 경우 중괄호 ]내의 값은 매개 변수 집합으로 간주되며 현재 기존 매개 변수 집합에 추가됩니다. 예를 들면 다음과 같습니다.

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

은 다음과 같습니다.

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

이 추가 처리는 배열 요소에 사용되지 않으며, 배열이 여러 번 설정되면 전체 배열이 대체됩니다. 이 문자는 # 주석의 시작을 의미하며, 이 문자는 무시된 후에 # 발생하는 모든 것을 의미합니다. # 공백 앞에 오거나 줄의 시작 부분에 있어야 주석으로 해석됩니다. 다음은 유효한 주석입니다.

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

다음은 주석으로 해석되지 않는 값의 예입니다. in이 주석 표식이 아니기 때문에 매개 변수 var#1#INF 무한대로 설정합니다.

var=1#INF