深度网络是组合成的模块,也就意味着是在大型数据上工作的相互连接层的集合。
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定义了三个关键的计算操作:setup, forward, 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文件。