C++,Lua,python3

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="?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的源码分析定位可以快速入手。

版权声明:本文为博主原创文章,未经博主允许不得转载。

一个人的期望值越大,心理承受力就会越小,就越经受不住失败的打击,

C++,Lua,python3

相关文章:

你感兴趣的文章:

标签云: