caffe教程
1 caffe简介
Caffe是一个深度学习框架,本教程解释了它的理念,体系结构和用法。这是一本实用指南和框架介绍,所以深入学习的全部前沿,背景和历史不能在这里介绍。尽可能给出解释,机器学习和神经网络的背景是有帮助的。
2 Caffe特点
- 表达式:模型和优化定义为明文模式而不是代码。
- 速度:对于研究和行业来说,速度对于最先进的模型和海量数据至关重要。
- 模块化:新的任务和设置需要灵活性和扩展性。
- 开放性:科学和应用进展需要共同的代码,参考模型和可重复性。
- 社区:学术研究,启动原型和工业应用都通过在BSD-2项目中进行联合讨论和开发来共享优势。
3 caffe组成
Blob,Layer,Net,Solver
Blob:是基础的数据结构,是用来保存学习到的参数以及网络传输过程中产生数据的类。
Layer:是网络的基本单元,由此派生出了各种层类。修改这部分的人主要是研究特征表达方向的。
Net:是网络的搭建,将Layer所派生出层类组合成网络。
Solver:是Net的求解,修改这部分人主要会是研究DL求解方向的。
3.1blob
Caffe支持CUDA,在数据级别上也做了一些优化,这部分最重要的是知道它主要是对protocol buffer所定义的数据结构的继承,Caffe也因此可以在尽可能小的内存占用下获得很高的效率。(追求性能的同时Caffe也牺牲了一些代码可读性)
在更高一级的Layer中Blob用下面的形式表示学习到的参数:
vector<shared_ptr<Blob<Dtype> > > blobs_;
这里使用的是一个Blob的容器是因为某些Layer包含多组学习参数,比如多个卷积核的卷积层。
以及Layer所传递的数据形式,后面还会涉及到这里:
vector<Blob<Dtype>*> ⊥
vector<Blob<Dtype>*> *top
3.2 Layer
5大Layer派生类型
Caffe十分强调网络的层次性,也就是说卷积操作,非线性变换(ReLU等),Pooling,权值连接等全部都由某一种Layer来表示。具体来说分为5大类Layer
1 NeuronLayer类 定义于neuron_layers.hpp中,其派生类主要是元素级别的运算(比如Dropout运算,激活函数ReLu,Sigmoid等),运算均为同址计算(in-place computation,返回值覆盖原值而占用新的内存)。
2 LossLayer类 定义于loss_layers.hpp中,其派生类会产生loss,只有这些层能够产生loss。
3 数据层 定义于data_layer.hpp中,作为网络的最底层,主要实现数据格式的转换。
4 特征表达层(我自己分的类)定义于vision_layers.hpp(为什么叫vision这个名字,我目前还不清楚),实现特征表达功能,更具体地说包含卷积操作,Pooling操作,他们基本都会产生新的内存占用(Pooling相对较小)。
5 网络连接层和激活函数(我自己分的类)定义于common_layers.hpp,Caffe提供了单个层与多个层的连接,并在这个头文件中声明。这里还包括了常用的全连接层InnerProductLayer类。
Layer的重要成员函数
在Layer内部,数据主要有两种传递方式,正向传导(Forward)和反向传导(Backward)。Forward和Backward有CPU和GPU(部分有)两种实现。Caffe中所有的Layer都要用这两种方法传递数据。
未完待续……………………