Compartir a través de


BrainScript mediante reglas de análisis de línea de comandos

A continuación se describe la CNTK reglas de análisis de línea de comandos. CNTK consta de varios componentes para completar una tarea. La mayoría de estos componentes necesitan cierta información de configuración disponible para funcionar y estos parámetros de configuración se proporcionan a través de archivos de configuración en CNTK.

Los archivos de configuración son colecciones de pares nombre-valor. Los datos de configuración pueden ser uno de los siguientes tipos:

  • Simple: se asigna un único valor al parámetro de configuración. Por ejemplo, deviceId = "Auto".
  • Matriz: a un parámetro de configuración se le asigna una matriz de valores que no necesitan ser de un tipo uniforme. : es el separador predeterminado para las matrices. El separador se puede cambiar al incluir los valores de la matriz entre paréntesis y colocar el nuevo carácter separador inmediatamente después del paréntesis abierto. El * carácter permite repetir un valor determinado varias veces en la matriz. Por ejemplo, minibatchSize = 256:512:512:512:1024 es igual a minibatchSize = 256:512*3:1024.
  • Set: los conjuntos de parámetros contienen conjuntos de parámetros de configuración de cualquier tipo. Los conjuntos de parámetros se pueden anidar. El separador predeterminado para los conjuntos de parámetros es ; si se incluyen varios elementos en una línea. Los separadores de línea también sirven como separadores para los elementos. Por ejemplo:

block1 = [id=1;size=256]

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

En CNTK, los archivos de configuración se organizan de forma jerárquica. Los valores de datos reales no se evalúan hasta que un componente de CNTK solicita el valor. Cuando un componente solicita un valor, CNTK buscará primero dentro del bloque de componentes. Si no se encuentra el valor, seguirá buscando en el parámetro primario y abuelo establecido hasta que se encuentre el parámetro o se alcance el nivel superior de la jerarquía de configuración sin una coincidencia. Esto permite que el recurso compartido de los mismos valores de parámetro sea más fácil en distintos bloques. Como se ha explicado anteriormente, para ejecutar CNTK debe especificar el archivo de configuración en la línea de comandos, ya cntk configFile=yourExp.cntk que esto cargará el archivo de configuración solicitado y ejecutará cualquier bloque de comandos que aparezca en los parámetros de comando del archivo de configuración.

Comandos y acciones

Debe haber un parámetro de comando de nivel superior, que define los comandos (separados por :) que se ejecutarán en el archivo de configuración. Cada comando hace referencia a un bloque de comandos en el archivo, que debe contener un parámetro de acción que defina la operación que realizará el bloque. Por ejemplo, el siguiente comando ejecutará el mnistTrain bloque , que ejecuta la acción de entrenamiento, seguido del mnistTest bloque , que evalúa el modelo.

command = mnistTrain:mnistTest

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

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

Sobrecargas de configuración en la línea de comandos

Es habitual tener una configuración que se puede usar como configuración base y modificar solo algunos parámetros para cada ejecución experimental. Esto se puede hacer de varias maneras diferentes, una de las cuales es invalidar la configuración en la línea de comandos. Por ejemplo, para invalidar la ruta de acceso del archivo de modelo, puede modificar simplemente la línea de comandos de la siguiente manera:

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

Esto invalidará la configuración actual de stderr, que se define en el nivel raíz del archivo de configuración, con el nuevo valor. Si es necesario modificar un parámetro dentro de un bloque de comandos, también debe especificarse el bloque . Por ejemplo, se puede cambiar para minibatchSize un experimento en la línea de comandos como

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

o modifique el archivo de datos usado para un experimento como

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

Archivos de configuración superpuestas

En lugar de invalidar algunas partes de un archivo de configuración mediante parámetros de línea de comandos, también puede especificar varios archivos de configuración, donde los últimos archivos invalidan los anteriores. Esto permite que un usuario tenga un archivo de configuración maestro y, a continuación, especifique, en un archivo de configuración independiente, qué parámetros del patrón desea invalidar para una ejecución determinada de CNTK. Esto se puede lograr especificando una lista separada por "+" de archivos de configuración o mediante la configFile= etiqueta varias veces. Los siguientes procedimientos son equivalentes.

cntk configFile=yourExp1.cntk+yourExp2.cntk

cntk configFile=yourExp1.cntk configFile=yourExp2.cntk

Si yourExp2.cntk solo contiene la cadena mnistTrain=[reader=[file=mynewfile.txt]], ambos comandos serían equivalentes a:

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

Tenga en cuenta que el valor de una variable siempre viene determinado por la última vez que se asigna. También es posible mezclar parámetros de línea de comandos y archivos de configuración superpuestas, en combinaciones arbitrarias. Por ejemplo,

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

procesaría estos parámetros de configuración en el orden en que aparecen en la línea de comandos y cualquier valor asignado en último lugar es el valor utilizado.

Además de poder especificar varios archivos de configuración en la línea de comandos, un usuario puede incluir un archivo de configuración dentro de otro. Por ejemplo, si la primera línea de yourExp2.cntk era

include=yourExp1.cntk

después, simplemente en ejecución

cntk configFile=yourExp2.cntk

sería equivalente a ejecutar

cntk configFile=yourExp1.cntk+yourExp2.cntk

donde en este último caso, yourExp2.cntk no contiene la instrucción include. Tenga en cuenta que estas instrucciones include pueden aparecer en cualquier lugar dentro de un archivo de configuración; donde aparezca la instrucción include, es decir, donde se incluirá el archivo de configuración especificado. Incluir un archivo de configuración equivale a pegar el contenido de ese archivo en la ubicación de la instrucción include. Las instrucciones include se resuelven de forma recursiva (mediante una búsqueda de profundidad inicial), lo que significa que si yourExpA.cntk incluye , e yourExpB.cntk incluye yourExpC.cntkyourExpB.cntk, se resolverá la cadena completa y yourExpC.cntk se incluirá de forma eficaz en yourExpA.cntk. Si se incluye un archivo de configuración varias veces (por ejemplo, "A" incluye "B" y "C", y "B" también incluye "C", entonces solo se incluirá la primera vez que se encuentre).

Stringize Variables

Aunque los archivos de configuración superpuestas permiten a los usuarios reutilizar los archivos de configuración entre experimentos, esto puede ser un proceso complicado. Para cada experimento, es posible que un usuario tenga que invalidar varios parámetros, algunos de los cuales pueden ser rutas de acceso de archivo largas (por ejemplo, stderr, modelPath, ). file La funcionalidad "stringize" puede facilitar mucho este proceso. Permite a un usuario especificar la configuración como la siguiente:

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

Aquí, , RootRunName, DataSet1_Dimy DataSet1_Features son variables especificadas en otra parte de la configuración (en un ámbito visible desde el punto en el que se usan). Al interpretar este archivo de configuración, el analizador reemplazaría todas las cadenas del formulario $VarName$ por la cadena VarValue, donde VarValue representa el valor de la variable denominada VarName. El proceso de resolución de variables es recursivo; por ejemplo, si A=$B$, B=$C$y C=HelloWorld.txt, A se resolvería como "HelloWorld.txt". Asegúrese de que no hay ningún bucle de referencia en el archivo de configuración. De lo contrario, el analizador entrará en bucle infinito en este momento.

Observe que dado que es equivalente a que un usuario especifique el valor de una variable en un archivo de configuración frente a en la línea de comandos, los valores de estas variables se pueden especificar en cualquier ubicación. Recuerde que el valor de una variable viene determinado por la última vez que se asigna, si eso sucede en un archivo de configuración o en la línea de comandos. Por lo tanto, si Root se define en config1.txt, pero se invalida en la línea de comandos, el valor especificado en la línea de comandos sería el que se usa para resolver instancias de $Root$ en configFile1.txt. Una característica útil es que, si stderr o modelPath apuntan a directorios que no existen, estos directorios se crearán mediante CNTK; esto le permite especificar algo parecido stderr = $Root$\$RunName$\$RunName$.loga , incluso si el directorio $Root$\$RunName$ no existe.

Valores predeterminados, valores repetidos y comentarios

La mayoría de los parámetros de los archivos de configuración tienen un valor predeterminado que se usará si no se especifica ningún valor de configuración. Si no hay ningún valor predeterminado y el valor no se encuentra en una búsqueda, se mostrará una excepción y se cerrará el programa. Si se especifica un nombre de parámetro más de una vez, el último valor establecido en ese valor es el que se mantendrá. La única excepción a esto es en conjuntos de parámetros, que están rodeados de [ llaves cuadradas ], en estos casos los valores dentro de las llaves se consideran un conjunto de parámetros y se agregarán al conjunto de parámetros existente actualmente. Por ejemplo:

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

es efectivamente igual a:

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

Tenga en cuenta que este procesamiento de anexos NO se usa para los elementos de matriz, y toda la matriz se reemplazará si se establece varias veces. El # carácter significa el principio de un comentario, todo lo que se produce después # de que se omita . Debe # ir precedido por un espacio en blanco o estar al principio de la línea que se va a interpretar como comentario. A continuación se muestra un comentario válido.

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

A continuación se muestra un ejemplo de un valor que no se interpretará como comentario. Establece un parámetro var en infinity, ya # que en 1#INF no es un marcador de comentario.

var=1#INF