caffe study - 数据结构(1)

来源:互联网 发布:蓄水池抽样算法 编辑:程序博客网 时间:2024/06/05 10:57

【原文:http://blog.sina.com.cn/s/blog_eb3aea990102v2oq.html】

以下主要是对于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,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文档中指出 blobdimensions vary according to the type and configuration of the layersN代表的含义在不同的层中是不一样的,在输入的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后边再分析)中进行最终的学习。

0 0
原创粉丝点击