前言
在上一篇文章中,已经说明过CNTK的工程中涉及的代码实现的共有三部分(CNTK Core、Extensibility扩展性、 Reader Plugins),并且已经针对第一部分的CNTK Core 做了一些介绍,本篇文章将针对剩余的两部分Extensibility和Reader Plugins的工程结构进行说明。
Extensibility扩展性
Extensibility在这里解读为扩展性,CNTK作为C++工程,在目前主流通过Python、.Net等更高级语言平台下的数据分析略显得有些不方便。毕竟目前做数据的主流还在R语言以及Python上。Extensibility这部分主要其实是实现了一个Wrapper的库将C++的EvalDll通过C++\CLI封装成.Net的Assembly。之后CSEvalClient其实是一个通过C#集成CNTK的一个例子。
Extensibility目前只是做了一些简单封装。封装的本质是将CNTK Core中的EvalDLL做一些包装使其将IEvaluateModel<ElemType>
接口暴露出来供第三方调用而已。这里官方给出了针对.Net的封装,也是抛砖引玉的过程,证明其可扩展。需要调用或者封装的接口如下:
// IEvaluateModel - interface used by decoders and other components that need just evaluator functionality in DLL form
template <class ElemType>
class IEvaluateModel // Evaluate Model Interface
{
public:
virtual void Init(const std::string& config) = 0;
virtual void Destroy() = 0;
virtual void CreateNetwork(const std::string& networkDescription) = 0;
virtual void GetNodeDimensions(std::map<std::wstring, size_t>& dimensions, NodeGroup nodeGroup) = 0;
virtual void StartEvaluateMinibatchLoop(const std::wstring& outputNodeName) = 0;
virtual void Evaluate(std::map<std::wstring, std::vector<ElemType>*>& inputs, std::map<std::wstring, std::vector<ElemType>*>& outputs) = 0;
virtual void Evaluate(std::map<std::wstring, std::vector<ElemType>*>& outputs) = 0;
virtual void ResetState() = 0;
};
通过调用GetEvalF
或者是GetEvalD
即可获得上述描述接口的一个实例,然后通过配置文件的内容加载网络模型后,调用Evaluate方法即可。下面的内容指出获得IEvaluateModel
实例的接口:
// GetEval - get a