caffe 的layer层组织结构

caffe的layer层是靠INSTANTIATE_CLASS和REGISTER_LAYER_CLASS来进行对各个层类进行处理的。每一个layer都是继承基类Layer的,其中BaseDataLayer是输入数据的基类,从这个类继承的主要是:

这个图可以很好的看到这些layer的继承关系,整个layer层的结构非常清晰,使用抽象工厂的方式构建整个layer层,然后刚才的宏将layer注册成抽象的服务类,然后再使用的时候再向服务器提供者申请调用各个类,这样就可以把proto文件作为个各类的配置文件进行调用,这点和java的spring框架很像,使用的是SOA方式。

当你了解这一结构之后 ,进行对caffe layer层进行分析的时候相信大多数人会清晰很多,只不过大多数传统的c++或者java使用这种动态创建类的时候使用的是xml语言进行描述的,而caffe这个东西使用proto这种自定义的非主流的方式进行了描述。在进行整个caffe剖析的时候要将layer和其他结构独立出来进行分析。(废话:看来多学习学习设计模式等还是非常有用的。)这种设计方式的有点和缺点都很明显,可以让编译型语言在运行时有一部分灵活性,但是依然无法彻底解决灵活性问题,不过对于算法来说这个灵活性够了,也类似Strategy模式,在选择进行数据变换的时候这个数据可以有多种变换方式。而这种变换方式刚好是一种变换策略,因为网上很多人分析caffe的层,每种层的梯度如何下降,这样下降的优缺点如何太多了,我这里就不班门弄斧了,不说这些被很多人说过的东西,我只说caffe的整个工程架构。以及我们可以如何进行修改来满足我们自己的需求。

这样我们顺便看看caffe的是如何进行结构组织的,io方面使用的opencv leveldb lmdb来进行数据读取和存储。Solver这个类是最终执行所有层组合出求解过程的组合。

整个caffe的代码核心部分就在layer里面,每个layer对应一个函数的梯度下降方式,理解这些函数需要数学和传统机器学习的基础,没法短时间速成所以这里我也就不进行胡扯了。这个留作以后慢慢给大家分享,争取每周分享一个层的剖析。

这个就是整个架构的初始化各个类的宏模板函数。

 #define INSTANTIATE_CLASS(classname) \
  char gInstantiationGuard##classname; \
  template class classname<float>; \
  template class classname<double>
这个下面就是典型的SOA方式注册每个class,以及存放这些class的容器,<img src="https://img-blog.csdn.net/20150703111208565?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3BhcmVudA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />当然这是一种简单粗暴的写法。再加上一堆模板和宏搞的整个系统看起来很高大上,其实只要对c++模板和宏熟悉,这些利器会让你的开发更轻松。
template <typename Dtype>
class LayerRegisterer {
 public:
  LayerRegisterer(const string& type,
                  shared_ptr<Layer<Dtype> > (*creator)(const LayerParameter&)) {
    // LOG(INFO) << "Registering layer type: " << type;
    LayerRegistry<Dtype>::AddCreator(type, creator);
  }
};


#define REGISTER_LAYER_CREATOR(type, creator)                                  \
  static LayerRegisterer<float> g_creator_f_##type(#type, creator<float>);     \
  static LayerRegisterer<double> g_creator_d_##type(#type, creator<double>)    \

#define REGISTER_LAYER_CLASS(type)                                             \
  template <typename Dtype>                                                    \
  shared_ptr<Layer<Dtype> > Creator_##type##Layer(const LayerParameter& param) \
  {                                                                            \
    return shared_ptr<Layer<Dtype> >(new type##Layer<Dtype>(param));           \
  }                                                                            \
  REGISTER_LAYER_CREATOR(type, Creator_##type##Layer)

}  // namespace caffe

看完这些相信大家对caffe的源码分析定位可以快速入手。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值