前言
CNTK对于使用者来说是用于神经网络的一套平台工具,但是对于程序员来说,更多的可拓展性以及定制性才能将CNTK使用在各种应用场合中。本文将针对CNTK的工程结构做一些研究,并根据官方给出的一些资料对其目前可以进行修改的地方进行初探。
工程
大家通过Visual Studio打开CNTK工程后,可发现解决方案视图中主要分为了几个部分,
1. CNTK Core
2. Extensibility
3. Reader Plugins
4. Documentation
5. Examples
6. Tests
7. Tools
通过名字已经知道每个部分的功能和存在的意义,本文只讲针对代码部分进行讲解,所以,只会针对前三部分进行简单的探究性说明。
CNTK Core
CNTK Core部分包含了8个项目,其中CNTK就是大家之前调用cntk.exe的入口工程。但是其本身为一个空的盒子(其实也实际包含了些内容)只是对其他项目的一个调用入口。下面将一一进行介绍。
CNTK
标题的名字看起来略微显得有点大,但是这部分只是cntk.exe部分,但是在这个子工程中,其的确扮演者很重要的角色(不仅仅是因为他是入口exe)。
通过工程文件可以看出,CNTK工程中,包含了3个主要的部分,
1. Common
2. Model Editing
3. BrainScript
Common
首先是Common这部分(笔者暂且将cntk.cpp也包括在内),首先第一部分是是包包括了配置文件的解析(Config.cpp)、DataReader、DataWriter等基础接口。
CNTK中基于数据块的配置文件就是有Config.cpp这部分进行解析的,当然,cntk.exe调用时传入的参数也由其一并处理。
DataReader和DataWritter这两部分主要是定义了CNTK中的Data Reader和Writer的接口,前面有提到过CNTK支持第三方通过插件的方式实现其自定义的Data Reader,这部分其实本质就是实现一个集成自IDataReader的类去实现这部分功能。
// Data Reader interface
// implemented by DataReader and underlying classes
class DATAREADER_API IDataReader
// Data Writer interface
// implemented by some DataWriters
class DATAWRITER_API IDataWriter
其他的在Common部分的文件包括File、fileutil、TimerUtility之类的这些的都是一些一些便捷工具相关的类,这里特别的推荐大家留意一下ExceptionWithCallStack有关异常处理的一个类,十分简单,但是也十分的实用,CNTK是MIT License的项目,所以日后在一些自己的工程中,完全可以借鉴其实现方法。
/// <summary>This function collects the stack tracke and writes it through the provided write function
/// <param name="write">Function for writing the text associated to a the callstack</param>