深度网络是组合成的模块,也就意味着是在大型数据上工作的相互连接层的集合。

caffe用它自己的模块方式定义层挨着层的网络。

这个网络定义从bottom到top的整个模型,从input data到loss。

data 和 derivatives在网络中流经前向传播和后向传播,Caffe存储,交流,操作的信息称为Blobs。

Blob在框架中是标准的序列和统一的内存接口,是model和computation的基础。

网络作为Layer的集合和连接。

Blob的详细信息描述了信息在Layer和Net中如何存储和传输。

 

Solving:单独配置以解耦建模和优化。

 

Blob存储和通信

  Blob是Caffe处理和传递的实际数据的封装,并且还提供CPU和GPU之间的同步功能。 在数学上,blob是以C连续方式存储的N维数组。

  Caffe使用blob存储和传输数据。 Blob提供了保存数据的统一的内存接口; 例如批量的图像,模型参数和用于优化的导数。

  用于批量图像数据的常规Blob尺寸是数量N×通道K×高度H×宽度W。 NxKxHxW

  参数blob尺寸根据图层的类型和配置而有所不同。 对于具有11×11核和3个输入的96个滤波器的卷积层,blob为96×3×11×11。对于具有1000个输出通道和1024个输入通道的内积/完全连接层,参数blob为1000×1024。

 

实施细节

  由于我们通常对Blob的值和梯度感兴趣,Blob存储了两块大小的内存,数据和梯度。 前者是我们传递的正常数据,后者是网络计算的梯度。

  此外,由于实际值可以存储在CPU和GPU上,因此有两种不同的访问方式:不改变值的const方式和改变值的易变方式:

  const Dtype* cpu_data() const;
  Dtype* mutable_cpu_data();
  这种设计的原因在于,Blob使用SyncedMem类来同步CPU和GPU之间的值,以隐藏同步细节并最大限度地减少数据传输。
  


Layer 计算和连接

  Layer是model和计算的基本单元。

  Layer 通过底部连接获取输入,并通过顶部连接进行输出。

  每个Layer定义了三个关键的计算操作:setupforward, and backward.

    Setup: initialize the layer and its connections once at model initialization.

    Forward: given input from bottom compute the output and send to the top.

    Backward: given the gradient w.r.t. the top output compute the gradient w.r.t. to the input and send to the bottom. A layer with parameters computes the gradient w.r.t. to its parameters and stores it internally.

 

Net 的定义和操作

  Net在计算图层中是一系列Layer的组合,一个有向无环图(DGA), Caffe完成所有DAG层的簿记工作,以确保向前和向后传球的正确性。

   一个典型的网络始于一个数据层,该数据层从磁盘加载并以 Loss Layer 结束,该层计算诸如分类或重建之类的任务的目标。

 

模型NET在prototxt中定义,训练后的模型被序列化为二进制协议缓冲区(binaryproto).caffemodel文件。