NVcaffe源码阅读——Layer

来源:互联网 发布:2016淘宝经营技巧 编辑:程序博客网 时间:2024/06/13 13:30

NVcaffe源码阅读——Layer

Layer

nvcaffe的Layer.hpp/cpp在功能上与以前的caffe相比有一些明显改变。

首先nvcaffe对Layer.hpp的代码进行了拓展,提供了很多便利的新特性:
1. 将Layer.hpp中原先对Layer进行设置的函数抽离出来,组成LayerBase类。真正的Layer类则继承LayerBase类,并只实现前后向、ToProto等少量函数。
2. 提供了获取parent_net的api(parent_net、set_parent_net以及LayerBase的构造函数等),可以在层的代码里拿到关于当前网络的指针。利用这一点便可轻松拿到当前的solver指针(parent_solver()、set_solver_rank()函数),从而进一步拿到诸如当前迭代次数等在训练中有用的信息(iter()、relative_iter()函数等)。
3. 提供了获取层的名称(prototxt中的name域,而不是type域,name()函数)。
4. 提供了net_inititialized_flag_和net_iteration0_flag_两个Flag类指针变量,用来标记层是否处于初始化状态或者尚未迭代的状态。Flag类的定义在commen.hpp中,提供了一系列互斥、带锁的标记操作。
5. nvcaffe在Layer.hpp中还有fmath和bmath这两个变量,与ftype和btype十分相似。因为layer_factor在建立新层的时候只使用了ftype和btype变量,所以暂时不清楚其功能。同时添加了诸如fm_by_user(bool val)、bm_by_user(bool val)等函数以供查询变量的设置状态。

另外一个亮点在于改变了Layer类的模板参数列表,即把过去的

template <typename Dtype>

改为了

template<typename Ftype, typename Btype>

其中Ftype代表’Forward type’,Btype同理。这样做可以将每一层前后向的数据类型隔离开来,即前后向分别使用不同的数据类型,对nvcaffe的多数据类型特性提供支持,也为每一层的构建提供了很大的灵活性。例如,在absval_layer.cpp中,前后向函数的feature的数据结构可以不同:

    // in Forward_cpu()    Ftype* top_data = top[0]->mutable_cpu_data<Ftype>();    // in Backward_cpu()    Btype* bottom_diff = bottom[0]->mutable_cpu_diff<Btype>();

而在Layer.cpp中,nvcaffe则是对Layer类的构造函数进行了拓展,功能是设置该层的前后向数据类型。在caffe.proto中,nvcaffe在LayerParameter中定义了forward/backward_type、forward/backward_math参数。同时在NetParameter中也定义了default_forward/backward_type/math,对整个网络进行默认设置。

Layer Factory

在caffe中,层的建立是通过layer_factory.hpp中的CreateLayer函数实现的。该函数接受一个layerparameter作为参数,将其直接放入对应类型的层的构造函数生成层。而在nvcaffe中,CreateLayer函数需要额外的ftype和btype作为传参。ftype和btype是从当前层的prototxt中的forward_type和backward_type得到的。因此在prototxt中修改这两个域便可设定该层计算时使用的数据类型。另外,forward_math和backward_math两个域在CreateLayer函数中仅仅用来打印信息,没有被用来建立层。