什么是Caffe
Caffe是一种开源软件框架,内部提供了一套基本的模板框架,用以实现GPU并行架构下的深度卷积神经网络、Deep Learning等算法。我们可以按照框架定义各种各样的卷积神经网络的结构,并且可以在此框架下增加自己的代码,设计新的算法。该框架的一个问题就是,只能够使用卷积网络,所有框架都是再基于卷积神经网路的模型上进行的。而Tensorflow能够完成更多的深度学习算法,比如RNN、LSTM等。
caffe的基本原子结构
原子结构不能随意更改,Caffe的编程框架就是在这三个原子结构下实现的,分别是Blobs、Layers和Nets。
- Blobs:是一个包装器,在Caffe这个流程中,所有的数据都要包装成Blob格式,在Caffe架构下进行编程和处理。Caffe本身提供了众多设计好的函数和类,不可随意更改数据包转换器,否则可能无法使用其中的函数,导致无法在Caffe框架下设计深度神经网络。Blob的格式为(Number,Channel,Height,Width),将数据B按照四元组的方式存储。这里的数据是处理的图片,所以后面的三维代表图像的数据格式,Channel代表图像的通道数,如灰度图是1通道,RGB图像是3通道,Height和Width分别是图像的长和宽。Number代表batch,由于内存有限,只能分批进行训练,这里还为每个Batch设置了一个标识号,使用SGD(随机梯度下降法)对模型训练,则需要使用到Batch。Blob不仅只用来保存深度网络进行前向过程的数据,还用来保存后向求梯度过程时的梯度数据。
具体使用方式:
const Dtype* cpu_data() const; //数据的固态模式
Dtype* mutable_cpu_data(); //数据的自由模式
Blob具有CPU的数据保存和GPU的数据保存,同时Blob将数据在CPU和GPU之间的交换封装起来,并做了同步处理,因此我们不需要理会GPU和CPU之间的数据交互。
- Layers: 是组成网络结构的单位,接受下层的数据作为输入,通过内部的运算输出。Caffe中网络层的使用定义,和一般的深度学习库类似,都有三个步骤。建立层(包括建立联系关系、初始化一些变量)、前向计算过程(接受数据并计算出输出)、后向过程(进行反向梯度的计算,并把梯度保存在层结构中)。
- Nets:由Layers组成,定义了输入输出以及网络各层。可以使用Net::Init()对定义的网络进行初始化和检查,初始化包括对一些变量权值的初始化,检查包括对网络的结构正确性检查,因为涉及到网络的上下层连接关系的匹配和耦合连接。
数据层
Caffe通过数据层获取数据,数据的来源可以是多种形式,例如:
- LevelDB,LMDB(这两种键值对嵌入式数据库管理系统编程库,一般LMDB比LevelDB存取速度快,所以Caffe默认的是LMDB)
- 直接从内存读取
- HDF5文件
- 原始图片
卷积层
卷积层定义了图像的卷积操作(即特征抽象),参数设置在prototxt中。
受限线性单元
受限线性单元实际上就是激活函数max(0,x)。
池化层
池化层定义了对对象的降维操作,参数设置prototxt中。
局部响应归一化层
LRN全称是Local Response Normalization,相关的类定义在lrn_layer.cpp中,其参数定义在prototxt中。局部响应归一化层完成一种“临近抑制”操作,对局部输入区域进行归一化。本质上是防止激活函数饱和,能提升网络的泛化能力,将错误率降低。
全连接层
参数定义在prototxt中
Dropout层
它的作用是防止过拟合和降低计算复杂度。
输出层
输出分类
感谢
https://blog.csdn.net/xiaoyang19910623/article/details/52595714
https://blog.csdn.net/songguangfan/article/details/99436777