Class_3 Caffe之blob(数据容器)
1. 概述
Blob是caffe中使用的一个数据容器,几乎每一个网络层都有自己的blob(继承自层基类layer的“vector<shared_ptr<Blob<Dtype> > > blobs_”)。
各层在前向传播和反向传播过程中,主要就是改变相应blob中的存储值。
2. 数据
Blob中保存SyncedMemory类型的数据,SyncedMemory数据是更底层的缓存形式,直接控制指针,在此不做细致讲解了。
Blob中的数据如下:
data_: 存储各层输入和输出数据、weights和bias等;
diff_: 存储梯度信息;
shape_: 是一个vector,存储的是数据的shape信息;
count_: Blob中存储的数据总数
capacity_: 当前Blob的容量,可以动态的控制增减;
3. 函数成员
1. ReShape()
ReShape都是用来控制数据的shape信息,主要是控制的shape_成员取值。
2. shape()
shape()成员是用来获取数据的shape信息,与ReShape是因果关系成员。
3. num_axes
num_axes函数比较有用,是为了获取当前数据的数据轴数量,就是shape数量。如caffe中数据通常以NCHW形式存在,那么num_axes一般表示数据的时候,取值就是4。
4. count
count主要是为了获取数据量。
count()有些是获取全部的数据量。
count(int start_axis, int end_axis)是获取指定起始轴和结束轴的数据量。
5. CanonicalAxisIndex
CanonicalAxisIndex是为了能够获取正向索引和反向索引,如轴索引为-1,则取倒数第一个轴,针对NCHW,就是去W这个轴并做进一步分析。
6. num(), channels(), height(), width()
分别获取数据的batch_size, 通道数,高,宽信息。
7. offst
offset是计算数据偏移量,遵循NCHW形式,偏移量计算公式为((n∗C+c)∗H+h)∗W+w。其中小写的n、c、h、w分别是batch_size, channel, height, width。
8. cpu_data和gpu_data
是为了分别获取存储在cpu或者gpu缓存中的数据指针。
9. asum_data, asum_diff, sumsq_data, sumsq_diff
分别用于计算L1和L2信息。
其他函数成员不做赘述,其实都还很好理解。