caffe代码


* tree -d:查看代码目录结构

* 源码目录:include/ src/ tools/ls


1 blob

https://imbinwang.github.io/research/inside-caffe-code-blob

* blob的包含数据

* 基本元素

Blob是一个N维连续数组。批处理图像数据时通常使用4维Blob,Blob的维度可以表示为(N, K, H, W),每个维度的意思分别是:

N: 数据的个数,例如SGD时一次mini-batch的图像个数。 K: 如果是图像,可以理解为通道数量;如果是网络中间结果,就是feature map的数量。 H, W: 如果是图像数据,可以理解为图像的高度和宽度;如果是参数数据,可以理解为滤波核的高度和宽度。


num: 图像数量
channel:通道数量
width:图像宽度
height:图像高度

Caffe中通常只使用4维Blob完成图像应用,但是Blob完全可以合理地被用来存储任何数据,例如,

  • 1000幅640*480 RGBD图像数据,其Blob形状为(1000, 4, 480, 640)。
  • 96个大小11*11的滤波核,处理16通道的输入数据,其参数Blob的形状为(96,16,11,11)。
  • 1000个输出,1024个输入的全连接层,其参数Blob的形状为(1000,1024)。

Blob作为Caffe的四大模块之一,负责完成CPU/GPU存储申请、同步和数据持久化映射。Caffe内部数据存储和通讯都是通过Blob来完成,Blob提供统一的存储操作接口,可用来保存训练数据、模型参数等。

(1)data,前向传播所用到的数据 (2)diff,反向传播所用到的数据 (3)shape,解释data和diff的shape数据


2. layer

  • layer是caffe的基本计算单元,至少有一个输入blob和输出blob,部分的layer带有权值和偏置项
  • Layers可以进行filters的卷积、池化(pool)、inner product操作、非线性激活函数(rectified-linear和sigmoid)以及一些元素级的变换、正则化、数据加载和损失计算(softmax和hinge)。

* 每个Layer定义了三种关键的计算:Setup、Forward和Backward。

  • Setup:在模型初始化时对Layer及其相关连接进行初始化。
  • Forward:给定bottom端的输入计算输出并发送给top端。
  • Backward:给定top输出端计算的梯度计算其输入端的梯度并发送到bottom,Layer计算其参数相关的梯度并存储到内存。
  • Caffe实现了两个Forward和Backward函数,一个CPU的和一个GPU的。如果没有实现GPU版本的函数,则退回到CPU函数并做备份。这种操作很方便进行快速实验,尽管可能需要额外的数据传输消耗(输入数据需要从GPU复制到CPU,而输出又需要从CPU复制回GPU)。

  • Layers对于整个网络的操作有两个关键的职责:前向传导(Forward Pass)接受输入并计算输出,后向传导(Backward Pass)接受关于输出的梯度并计算相关参数的梯度并逐步将梯度后向传播至之前的Layers。

  • 自定义Layers只需要很少的工作就可以完成,这得意于网络结构的复合性和代码的模块化。定义好Layer的Setup、Forward和Backward就可以应用于Net中了。

* 5类layer

  • NeuronLayer类 定义于neuron_layers.hpp中,其派生类主要是元素级别的运算(比如Dropout运算,激活函数ReLu,Sigmoid等),运算均为同址计算(in-place computation,返回值覆盖原值而占用新的内存)。
  • LossLayer类 定义于loss_layers.hpp中,其派生类会产生loss,只有这些层能够产生loss。
  • 数据层 定义于data_layer.hpp中,作为网络的最底层,主要实现数据格式的转换。
  • 特征表达层(我自己分的类)定义于vision_layers.hpp(为什么叫vision这个名字,我目前还不清楚),实现特征表达功能,更具体地说包含卷积操作,Pooling操作,他们基本都会产生新的内存占用(Pooling相对较小)。
  • 网络连接层和激活函数(我自己分的类)定义于common_layers.hpp,Caffe提供了单个层与多个层的连接,并在这个头文件中声明。这里还包括了常用的全连接层InnerProductLayer类。

* 碎碎念

  • layer大部分函数并没有真正的实现,只有虚函数,真正的实现都在派生类中

* 虚基类

  • 当在多条继承路径上有一个公共的基类,在这些路径的某几条汇合处,这个公共的基类就会产生多个实例(或多个副本),若只想保存这个基类的一个实例,可以将这个公共基类说明为虚基类、

(1):虚基类构造函数的参数必须由最新派生出来的类负责初始化(即使不是直接继承).

(2)虚基类的构造函数先于非虚基类的构造函数执行。


3. net

  • Net在caffe中表示一个完整的CNN模型,包含若干layer的实例
  • Net对应的描述文件是*.portotxt

* Net的结构

  • Net既包括layer对象,也包括blob对象  blob对象用于存储每个layer的输入/输出中间结果  layer则根据Net描述对指定的输入blob进行某些计算(卷积,下采样,全连接,非线性变换,计算代价函数)
  • 输出的结果放到指定的blob

results matching ""

    No results matching ""