您的位置:首页 > 理论基础 > 数据结构算法

caffe study (1) - 数据结构(1)

2015-07-14 09:37 525 查看
以下主要是对于Caffe主页文档的总结

1. 结构的生成:caffe的基本结构是采用google的proto库自动生成的,基本流程就是定义一个配置文件,扩展名为proto,调用proto库的编译器编译这个文件可以生成相应的类的c++的代码。具体的可以参见proto库的介绍。

下面来介绍caffe中用到的一些结构

2.Blob结构:

a. blob是一个标准的Array,主要负责caffe中数据的存储(stores)、关联(communicates)、以及数据的操作(manipulates)。数据在网络结构中要经过正向以及反向转播的过程,在这个过程中要对于数据进行存储、数据之间的通讯、以及数据的操作,blob就是负责这个工作的。

在具体的形式上blob是一个4-D结构的array,是按照(Num,Channels,Height and Width)的顺序存储的,这里的Num相当于minibatch SGD中的batch这样一个概念。此处据作者的解释是应为legacy
reason。

b. blob中数据的dimentions为Num N*channel K * Height H * Width W.内存是行优先的(row-major)。访问数据的时候按照如下的规则来访问index(n,k,h,w) 在物理上位于index((n*K
+ k) *H + h)*W + w. 这里要注意,index(n,k,h,w)实际上访问的是内存中(n+1,k+1,h+1,w+1)位置的数据,这是因为索引是从0开始的。

N是batch size of data,在ImageNet中这个值是256(即为batch的大小,一种情况,即输入中一次可以批处理的图像的数目),Channls是feature
dimention对于RGB图像来说K = 3. blob的维度是根据layer的type和configuration不同计算不同的,对于一个有96个filter,11*11的spatialdimension,3个input的blob的conv layer来说,其dimention为96*3*11*11,对于一个有1000个ouput channel以及1024个input channnels的 fully-connected layer来说blob的维度为1*1*1000*4096。

(@Leo_Shaw指出此处的Num应该是filter的数目,这是我看文档不严谨的地方,非常感谢@Leo_Shaw指出这个问题。上面的解释不完全错,但是只说明了一个方面,此处做一个小的修正:

在caffe文档中指出 blob的dimensions vary according to the type and configuration of the layers,N代表的含义在不同的层中是不一样的,在输入的Data层中,N代表了mini batch size,也就是一次可以处理的图像的数目,在conv层中,N确实代表了filter的数目,这是代码结构定义方面的问题,和算法本身没有关系。)

c.blob中的数据访问方法:const方式以及mutable方式,前者访问不能改变数据,后者访问可以改变数据。这种设计主要为了cpu和gpu之间数据的同步,具体的还要深入研究一下。这个有GPU和CPU两个版本。

d.blob中数据分为两个chunks一个是data一个是diff,前者是正常的的传递的数据,后者是网络计算的gradient。

3. Layer结构:

a. Layer是一个核心的结构,它主要定义了基本的计算单元,也就是每一层的具体形式。这个层包括convolve filter、pools、inner products、loss等不同定义

b. 每一个Layer定义了三个核心的计算:

1)Setup:初始化layer和its connections

2)Forward:根据从bottom来的输入计算输出送到top

3)Backward:根据top output的gradient计算input的gradient,然后输送到bottom。同时还会计算相对于parameters的gradient,并在内部存储

4. Net结构:

a.Net是一个DAG/directed acyclic graph,其节点就是一个个的Layer结构,net从data layer开始,以loss layer结束。

b.通过调用Net::Init()来初始化net,初始化做了两个工作,一个是创建blobs和layers,调用layer::setup(),一个是做一些bookkeeping的事情,比如验证网络结构的有效性,输出一些log等。在net创建后,则根据Caffe::mode()使用cpu或者gpu进行计算。

5. 总结

在caffe里面这几个关键的结构中,blob负责的是数据的存储,Layer负责了数据计算的传输,而net则将前两者又包了一层,net将会扔到slover(关于slover后边再分析)中进行最终的学习。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: