CAFFE 学习-1:基本的CAFFE结构

CAFFE 学习-1:基本的CAFFE结构

主要参考:
甘宇飞 - https://www.zhihu.com/question/27982282
楼燚(yì)航的blog
http://www.cnblogs.com/louyihang-loves-baiyan/

CAFFE主要有四个类:Blob,Layer,Net,Solver,分为三个层次:

  • Blob:是基础的数据结构,是用来保存学习到的参数以及网络传输过程中产生数据的类。
  • Layer:是网络的基本单元,由此派生出了各种层类。修改这部分的人主要是研究特征表达方向的。
  • Net:是网络的搭建,将Layer所派生出层类组合成网络。Solver:是Net的求解,修改这部分人主要会是研究DL求解方向的。

Blob

Caffe支持CUDA加速,在数据级别上也做了一些优化。Blob为protocol buffer所定义的数据结构的继承,Caffe在尽可能小的内存占用下获得很高的效率。

Layer中的Blob用下面的形式表示学习到的参数:

vector<shared_ptr<Blob<Dtype> > > blobs_;

这里使用Blob指针向量容器,是因为某些Layer包含多种学习参数,比如多个卷积核的卷积层。
而Layer所传递的数据形式,后面也会涉及:

vector<Blob<Dtype>*> &bottom;
vector<Blob<Dtype>*> *top

Layer

Layer的类型

Caffe十分强调网络的层次性,也就是说卷积操作,非线性变换(ReLU等),Pooling,权值连接等全部都由某一种Layer来表示。
Layer有5大派生类型:

  • NeuronLayer类 定义于neuron_layers.hpp中,其派生类主要是元素级别的运算(如Dropout,ReLu,Sigmoid等),运算均使用 同址算法(in-place computation)
  • LossLayer类 定义于loss_layer.hpp中,其派生类会产生loss,只有这些层能够产生loss。
  • 数据层 定义于data_layer.hpp中,为网络的最底层
  • 特征表达层(from 甘宇飞) 定义于vision_layer.hpp,实现特征表达功能,更具体地说包含卷积极操作,Pooling操作,他们基本都会产生新的内存占用(Pooling相对较小)。
  • 网络连接层和激活函数(from 甘宇飞) 定义于common_layer.hpp,Caffe提供了单个层与多个层的链接,并在这个头文件中声明。这里还包括了常用的全连接层InnerProductLayer类。

Layer的重要成员函数

在Layer内部,数据主要有两种传递方式,正向传导和反向传导,均有CPU和GPU的两种实现。Caffe中所有的Layer都要用这两种方法传递数据

virtual void Forward(const vector<Blob<Dtype>*> &bottom,                     
                     vector<Blob<Dtype>*> *top) = 0;
virtual void Backward(const vector<Blob<Dtype>*> &top,
                      const vector<bool> &propagate_down, 
                      vector<Blob<Dtype>*> *bottom) = 0;

在网路结构定义文件(*.proto)中每一层的参数bottom和top数目就决定了vector中元素数目

Layer的重要成员变量

loss

vector<Dtype> loss_;

每一层又有一个loss_值,只有Loss_Layer才可能产生非0的loss_。

learnable parameters

vector<shared_ptr<Blob<Dtype> > > blobs_;

Layer学习到的参数

Net

Net用容器的形式将多个Layer有序地放在一起,其自身实现的功能主要是对逐层Layer进行初始化,以及提供Update( )的接口(更新网络参数),本身不能对参数进行有效地学习过程。

vector<shared_ptr<Layer<Dtype> > > layers_;

同样Net也有它自己的

vector<Blob<Dtype>*>& Forward(const vector<Blob<Dtype>* > & bottom, Dtype* loss = NULL);

void Net<Dtype>::Backward();

他们是对整个网络的前向和方向传导,各调用一次就可以计算出网络的loss了。

Solver

这个类中包含一个Net的指针,主要是实现了训练模型参数所采用的优化算法,它所派生的类就可以对整个网络进行训练了。

shared_ptr<Net<Dtype> > net_;

不同的模型训练方法通过重载函数ComputeUpdateValue( )实现计算update参数的核心功能

virtual void ComputeUpdateValue() = 0;

最后当进行整个网络训练过程(也就是你运行Caffe训练某个模型)的时候,实际上是在运行caffe.cpp中的train( )函数,而这个函数实际上是实例化一个Solver对象,初始化后调用了Solver中的Solve( )方法。而这个Solve( )函数主要就是在迭代运行下面这两个函数,就是刚才介绍的哪几个函数。

ComputeUpdateValue();
net_->Update();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值