Поделиться через


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 это загрузит запрошенный файл конфигурации и выполните любой блок команд, указанный в параметрах команды в файле конфигурации.

Команды и действия

Должен быть параметр команды верхнего уровня, который определяет команды (разделенные с :) которые будут выполняться в файле конфигурации. Каждая команда ссылается на блок команд в файле, который должен содержать параметр действия, определяющий операцию, выполняемую блоком. Например, следующая команда выполнит mnistTrain блок, который выполняет действие обучения, за которым следует mnistTest блок, который оценивает модель.

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

Если yourExp2.cntk содержит только строку mnistTrain=[reader=[file=mynewfile.txt]], обе эти команды будут эквивалентны:

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 разрешаются рекурсивно (с помощью поиска глубины), что означает, что если yourExpA.cntk включает yourExpB.cntkи yourExpB.cntk включает yourExpC.cntk, то полная цепочка будет разрешена и yourExpC.cntk будет эффективно включена в yourExpA.cntk. Если файл конфигурации включается несколько раз (например, "A" включает "B" и "C", а "B" также включает "C"), он будет эффективно включаться только при первом обнаружении.

Строковые переменные

Хотя многоуровневые файлы конфигурации позволяют пользователям повторно использовать файлы конфигурации в экспериментах, это по-прежнему может быть громоздким процессом. Для каждого эксперимента пользователю может потребоваться переопределить несколько параметров, некоторые из которых могут быть длинными путями к файлам (например, stderr, , modelPath). file Функциональные возможности stringize могут значительно упростить этот процесс. Это позволяет пользователю указать конфигурацию, как показано ниже.

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

Здесь, ,RootRunName, DataSet1_Dimи DataSet1_Features являются переменными, указанными в другой точке конфигурации (в области, видимой с точки их использования). При интерпретации этого файла конфигурации средство синтаксического анализа заменит каждую строку формы $VarName$ строкой VarValue, где VarValue представляет значение переменной, называемой VarName. Процесс разрешения переменных рекурсивный; Например, если A=$B$, B=$C$и C=HelloWorld.txt, то A будет разрешено как "HelloWorld.txt". Убедитесь, что в файле конфигурации нет ссылочного цикла. В противном случае средство синтаксического анализа перейдет в бесконечный цикл на данный момент.

Обратите внимание, что поскольку пользователь может указать значение переменной в файле конфигурации и в командной строке, значения этих переменных можно указать в любом расположении. Напомним, что значение переменной определяется при последнем назначении, будь то в файле конфигурации или в командной строке. Таким образом, если Root определен в config1.txt, но переопределен в командной строке, то значение, указанное в командной строке, будет использоваться для разрешения экземпляров $Root$ в configFile1.txt. Одна из полезных функций заключается в том, что если stderr или modelPath указать каталоги, которые не существуют, эти каталоги будут созданы CNTK; это позволяет указать что-то подобноеstderr = $Root$\$RunName$\$RunName$.log, даже если каталог $Root$\$RunName$ не существует.

Значения по умолчанию, повторяющиеся значения и примечания

Большинство параметров в файлах конфигурации имеют значение по умолчанию, которое будет использоваться, если значение конфигурации не указано. Если значение по умолчанию отсутствует и значение не удается найти в поиске, отобразится исключение, и программа завершит работу. Если имя параметра указано несколько раз, последнее значение, заданное этим значением, будет поддерживаться. Единственным исключением из этого является набор параметров, окруженный квадратными [ скобками ], в таких случаях значения внутри фигурных скобок считаются набором параметров и будут добавлены в существующий набор параметров. Пример:

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"

Ниже приведен пример значения, которое не будет интерпретироваться как комментарий. Он задает для параметра var бесконечность, так как # in 1#INF не является маркером примечания

var=1#INF