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

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

时间: 2024-08-29 23:58:46

caffe 的layer层组织结构的相关文章

caffe中HingeLossLayer层原理以及源码分析

输入: bottom[0]: NxKx1x1维,N为样本个数,K为类别数.是预测值. bottom[1]: Nx1x1x1维, N为样本个数,类别为K时,每个元素的取值范围为[0,1,2,-,K-1].是groundTruth. 输出: top[0]: 1x1x1x1维, 求得是hingeLoss. 关于HingeLoss: p: 范数,默认是L1范数,可以在配置中设置为L1或者L2范数. :指示函数,如果第n个样本的真实label为k,则为,否则为-1. tnk: bottom[0]中第n个样

mask层--- ios开发view圆角属性的layer层的实质

今天突然领悟了之前学习的一些基础的UI属性 就是在我们设置view的圆角的时候 比方说下面的代码 UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(10, 10, 60, 60)]; button.layer.masksToBounds = YES; button.layer.cornerRadius = 30; 这里给button设置圆角属性 以前一直这么写 知道layer是view的绘制的一层 一直这么用 今天突然领悟

【iOS开发-24】导航控制器下不同视图控制器之间切换:利用CATrasition和view的layer层来实现自定义的动画效果

(1)这里的动画效果指的是界面切换的动画效果,我们常见的又淡入淡出,右出左进等等,当然还有一些高级动画,这种动画适合游戏类的,对于一般APP会显得太花哨. (2)我们在此处没有增加任何框架(QuartzCore)也没有导入什么头文件(QuartzCore.h),就可以直接用CATransiton(相当于是CAAnimation的子类)来创建一个对象,如animation1. (3)创建完之后我们就对这个动画对象进行动画设置,这里面主要是涉及到type属性,而且值有两种:一种是调用系统自带的一些效

HTML页面加载和layer层冲突问题

关于HTML页面加载完成后执行,有以下几种方式: 第一种  用js加载:window.onload 第二种 用Jquery加载 $(document).ready() 第二种方法也可以简写为下面的方式: 这样,当html页面加载成功后执行相应的动作. 在写项目的时候,我需要在页面加载完成后点击按钮弹出layer,这个动作却和上面两个方法写的html加载出现了问题. 我的主页面html加载完成会请求一些数据显示出来,而当我点击增加按钮的时候,layer层弹出,这一个动作也被认为成一个html的加载

当music-list向上滑动的时候,设置layer层,随其滚动,覆盖图片,往下滚动时候,图片随着展现出来

1.layer层代码: 1 <div class="bg-layer" ref="layer"></div> 2.在mounted()的时候,获取图片的高度,并获得其滚动最小高度,即图片的高度-预留的高度: 1 mounted(){//因为上面的背景图的高度是和宽度保持着10:7的比例,因此,不同浏览器下高度不一样,下面的song-list高度也不一样,需要计算得出: 2 this.imageHeight = this.$refs.bgIma

Caffe提取任意层特征并进行可视化

原图 conv1层可视化结果 (96个filter得到的结果) 数据模型与准备 安装好Caffe后,在examples/images文件夹下有两张示例图像,本文即在这两张图像上,用Caffe提供的预训练模型,进行特征提取,并进行可视化. 1. 进入caffe根目录,创建临时文件夹,用于存放所需要的临时文件 mkdir examples/_temp 2. 根据examples/images文件夹中的图片,创建包含图像列表的txt文件,并添加标签(0) find `pwd`/examples/ima

如何向caffe中添加层

修改caffe\src\caffe\proto\caffe.proto 在最后添加centerloss层的参数信息 message CenterLossParameter { optional uint32 num_output = 1; // The number of outputs for the layer optional FillerParameter center_filler = 2; // The filler for the centers // The first axis

caffe 最新的层都有哪些呢?

caffe不断地更新,最近又加入了prelu这种很好的功能~详见 http://research.microsoft.com/en-us/um/people/kahe/ http://arxiv.org/abs/1502.01852 更新之后每层的设置从layers变为layer,现有的层有 AbsVal,Accuracy,ArgMax,BNLL,Concat,ContrastiveLoss,Convolution,Data,Deconvolution,Dropout,DummyData,Elt

[caffe]网络各层参数设置

数据层 数据层是模型最底层,提供提供数据输入和数据从Blobs转换成别的格式进行保存输出,通常数据预处理(减去均值,放大缩小,裁剪和镜像等)也在这一层设置参数实现. 参数设置: name: 名称 type: 类型 Data: 从LMDB读取数据和标签, 转换(http://deepdish.io/2015/04/28/creating-lmdb-in-python/) 可以使用convert_imageset转换 ImageData: 直接读取图片数据 .... top: 输出数据(和下一层的b