Layer:Caffe 实现了一个基础的层级类 Layer,对于一些特殊种类还会有自
己的抽象类(比如 base_conv_layer),这些类主要采用了模板的设计模式
(Template),也就是说一些必须的代码在基类写好,一些具体的内容在子类中
实现。比方说在 Layer 的 Setup 中,函数中包括 Setup 的几个步骤,其中的一
些步骤由基类完成,一些步骤由子类完成。还有十分重要的 Forward 和 Backward,
基类实现了其中需要的一些逻辑,但是真正的运算部分则交给了子类。这样当我
们需要实现一个新的层时,我们不需要管理琐碎的事物,只要管理好层的初始化
和前后向即可。
Net:Net 将数据和层组合起来做进一步的封装,对外暴露了初始化和前后
向的接口,使得整体看上去和一个层的功能类似,但内部的组合可以是多种多样。
同时值得一提的是,每一层的输入输出数据统一保存在 Net 中,同时每个层内的
参数指针也保存在 Net 中,不同的层可以通过 WeightShare 共享相同的参数,
Solver:有了 Net 我们实际上就可以进行网络的前向后向计算了,但是关
于网络的学习训练的功能还有些缺乏,于是在此之上,Solver 类进一步封装了训
练和预测相关的一些功能。与此同时,它还开放了两类接口:一个是更新参数的
接口,继承 Solver 可以实现不同的参数更新方法,如大家喜闻乐见的 Momentum,
Nesterov,Adagrad 等。这样使得不同的优化算法能够应用其中。另外一个是训
练过程中每一轮特定状态下的可注入的一些回调函数,在代码中这个回调点的直
接使用者就是多卡训练算法。
IO:有了上面的东西就够了?还不够,我们还需要输入数据和参数,正所谓
巧妇难为无米之炊,没有数据都是白搭。DataReader 和 DataTransformer 帮助
准备输入数据,Filler 对参数进行初始化。一些 Snapshot 方法帮助模型的持久
化,这样模型和数据的 IO 问题也解决了。
多卡:对于单 GPU 训练来说,基本的层次关系到这里也就结束了,如果要
进行多 GPU 训练,那么上层还会有 InternalThread 和 P2PSync 两个类,这两
个类属于最上层的类了,而他们所调用的也只有 Solver 和一些参数类。
我们可以画一张图把 Caffe 的整体层次关系展示出来:
评论1
最新资源