前言
根据前一篇文章的介绍,大家已经对CNTK有所了解,并且也已经搭建好了运行环境。在前一篇文章最后的例子中,我们只是简单地运行了CNTK提供的其中一个样例。并且得到了结果。大家可能发现,在命令cntk.exe的后面,需要接一个参数用于指明配置文件。
本文中将详细的描述配置文件的各个部分,笔者会尽量的按照层次结构进行讲解。所以本文可以作为一个交流的文档,也可以当做一个参考资料以备所需。
简单的说明下CNTK配置文件
CNTK配置文件从功能的角度来说就是给大家一个地方去写明操作的逻辑。这里操作的逻辑指的是大家使用CNTK的目的。你希望CNTK去运行什么,设定模型?训练模型?还是评估测试模型?。这些都是命令,CNTK配置文件给出了一种方式去写一个文件来描述这些操作逻辑。由于机器学习中所涉及的参数很多,所以基本无法让用户直接通过命令行的方式输入。所以配置文件基本上是必须的。
其中CNTK的配置文件还有合并和覆盖等特性。cntk.exe可以同时加载多个配置文件,但是如果配置文件中数据块中有一样的项,则后面的配置文件的相应配置信息会覆盖前面的。当然,如果两个配置文件中如果数据快中的项完全不同,则取并集。
CNTK配置文件
基本语法
一切都要从基本语法说起。下面先展示一个简单的配置内容。
block2 = [
subblock = [string="hi";num=5]
value = 1e-10
array = 10:"this is a test":1.25
]
CNTK配置文件中的数据项基本上是由块状结构进行组织的,其中,同一个块中后面的项将合并或覆盖前面相同名称的数据项。在数据块中可以包含其他数据块。如果希望在一行中定义两个数据项,则需要使用“;”进行分割。最后是注释部分,注释以“#”开头
变量定义与引用
配置文件中的变量定义,可以直接写赋值语句。变量的引用则是将之前定义的变量名前后加上“$”来进行引用。下面给出示例:
RootDir = ".."
ConfigDir = "$RootDir$/Config"
DataDir = "$RootDir$/Data"
OutputDir = "$RootDir$/Output"
ModelDir = "$OutputDir$/Models"
注意一点是这样的,在一个块的外面定义的数据,是会被块内引用的。所以,大家发现一些块内本应定义的内容不存在的时候,应该考虑是否他已经在外面有所定义。块与块之间是有数据的继承关系的。
数据类型
数据项的值的数据类型可以为如下几种:
- 简单类型 (12, 1.25, 1e-10,"hi",auto)
- 块(集合)类型 (block1 = [id=1;size=256])
- 数组类型 (array=2:50:2)
简单类型: 其本质就是单独的一个值,可能是整数,浮点,字符串或者特殊的枚举类型。
块(集合)类型:其本质是一系列类型的一个集合,它可将一系列项打包在一起,可以包含其他数据块。
数组类型: 前面几种数据类型不过多的阐述了,唯一有些需要解释的是数组类型。
数组类型在定义中可能出现两种符号,分别是“:”和“*”号。
先说“:”,这个符号用于分割数组中的元素,例如array=2:50:2,所对应的是定义一个包含3个元素的数组,分别是2,50,2。
然后是“*”,这个符号并非乘法,而是表示所修饰的类型重复多少遍。例如array=50:150*2:100,这个展开后是array=50:150:150:100。
数组类型经常用于定义网络的结构。定义每层网络的神经元个数。
覆盖与合并
我们在调用cntk.exe的过程中,我们使用configFile参数来指明我们的配置文件的位置。
cntk.exe configFile=yourExp.cntk
这样我们可以加载一个单独的配置文件,但是在一些复杂的工程中,我们可能为了一些特殊的需要,不同的参数写在不同的配置文件中。这时我们可以通过“+”进行拼接使其一次性加载多个配置文件。
cntk.exe configFile=yourExp1.cntk+yourExp2.cntk
当上述的yourExp1.cntk与yourExp2.cntk中有相同的数据项导致配置冲突的情况下,最后加载的yourExp2.cntk将会覆盖前面的数据项内容。
同时cntk.exe也支持在命令行中指定局部的数据项来补充或者覆盖配置文件中的内容。
cntk.exe configFile=yourExp.cntk mnistTrain=[reader=[file=”mynewfile.txt”]]
CNTK配置文件结构
最外层结构
除了自己需要定义的一些变量以外,CNTK的配置文件的最外层我们可以定义如下结构的数据以供cntk.exe使用。
# 定义的一些配置文件内部使用的常用变量
RootDir = ".."
ConfigDir = "$RootDir$/Config"
DataDir = "$RootDir$/Data"
OutputDir = "$RootDir$/Output"
ModelDir = "$OutputDir$/Models"