你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

通过命令行分析规则的 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 语句的位置。 使用深度优先搜索) 以递归方式解析 include 语句 (,这意味着,如果包含和包含,则将解析完整链,并yourExpC.cntk有效地包含在内yourExpA.cntkyourExpB.cntkyourExpC.cntkyourExpB.cntkyourExpA.cntk 如果配置文件包含多次 (,例如“A”包括“B”和“C”,而“B”还包括“C”) ,则只会在首次遇到配置文件时有效包含该文件。

字符串化变量

虽然分层配置文件允许用户跨试验重复使用配置文件,但这仍然是一个繁琐的过程。 对于每个试验,用户可能必须重写多个参数,其中一些参数可能是长文件路径 (,例如, stderrmodelPathfile) 。 “stringize”功能可以使此过程更容易。 它允许用户指定如下所示的配置:

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

此处、RootRunNameDataSet1_DimDataSet1_Features 是配置 (中其他位置指定的变量,其范围在使用) 时可见。 解释此配置文件时,分析器会将表单 $VarName$ 的每个字符串替换为字符串 VarValue,其中 VarValue 表示调用 VarName的变量的值。 变量解析过程是递归的;例如,如果 A=$B$、B=$C$和 C=HelloWorld.txt,则 A 将解析为“HelloWorld.txt”。 请确保配置文件中没有引用循环。 否则,分析器此时将进入无限循环。

请注意,由于用户等效于在配置文件中指定变量的值,因此可以在任一位置指定这些变量的值。 回想一下,变量的值是由上次分配变量时确定的,无论是在配置文件中还是命令行中。 因此,如果在 Root config1.txt中定义,但在命令行中重写,则命令行中指定的值将是用于解析 $Root$ configFile1.txt实例的值。 一个有用的功能是,如果stderrmodelPath指向不存在的目录,这些目录将由CNTK创建;这样,即使目录$Root$\$RunName$不存在,也可以指定类似stderr = $Root$\$RunName$\$RunName$.log内容。

默认值、重复值和注释

配置文件中的大多数参数都具有默认值,如果未指定配置值,将使用该值。 如果没有默认值,并且无法在搜索中找到该值,则会显示异常,并且程序将退出。 如果多次指定参数名称,则设置为该值的最后一个值是将维护的值。 唯一的例外是参数集(用 [ 方括号括起来),在这种情况下,大括号 ]中的值被视为参数集,并将添加到当前现有参数集。 例如:

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