caffe official tutorial: https://caffe.berkeleyvision.org/tutorial/net_layer_blob.html
blobs, Layers, and Nets: anatomy of a caffe model
深度网络是一个由多个部件组成的模型,它能表征一系列作用于一堆数据的全连接层。这个网络从输入数据到输出loss定义了整个模型的bottom-to-top结构。数据及其衍生的中间数据通过forward和backward流经整个网路, 交流以及操纵信息都是通过blobs结构。blob 是一个标准数组以及框架内统一的内存接口。layer是模型和计算的基石。net是网和网之间的连接。blob的细节部分描述了信息是如何在layers/ nets中存储并进行交流的。
solver 用于将模型与优化进行分隔, 解耦使得整个框架的面向对象属性更浓。
blob storage and communication
blob是一个caffe的数据包装器,同时保证在CPU和GPU中同步。数学上,blob是一个n维数组存储在连续空间中。
caffe存储和交流数据都是用blobs。blob提供统一的接口存储数据:图像数据,模型参数,优化超参等!
caffe中的blob可以存储图像数据,存储格式为NKHW。举个例子, 在一个四维的blob中,索引为(n,k,h,w)的数值物理上在内存中的地址为((n * K + k) * H + h) * W + w.
除了四维的图像数据,blob 还可以表征两维的全连接数据。blobs(shape(N, D)).
参数blob的维度受到层的类型type和configuration 所决定。如果是一个卷积层, 有96个filters, 每个filter的大小是11 * 11, 输入维度为3, 那么这个blob的参数个数为96 * 3 * 11 * 11。 如果是一个全连接层, 输出维度是1000, 输入维度是1024, 那么该层的blob形状为1000 * 1024.
对于自定义数据, 可能需要破解您自己的输入准备工具或者数据层,但是一旦自定义数据完成,个人的工作部分就完成了。 层的模块化会帮您完成接下来的工作。
implementation details
我们经常关心blob的梯度, 一个blob存储两块存储信息,一块是参数数据,一块是梯度。 前者是我们正常经过的参数信息,后者是网络所计算的梯度。
更进一步,实际的数值存储在CPU或者GPU上, 有两种不同的方式去获取它们,一是常数方式,不改变数值;一是可变方式。
有一段cpu gpu同步的东西没太看懂。
layer computation and connections
layer是模型的本质, 是计算的基本单元。layer 包括卷积,池化, 全连接, relu , sigmoid , eltwise,load data, 计算loss(如softmax, hinge等)。
layer 的输入时bottom, 输出是top.
每一层包括三种关键的计算:setup、forward 和 backward。
更特别地, 有两种forward和backward function需要实现,一种是cpu版本,一种是GPU版本。