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信息。
其他函数成员不做赘述,其实都还很好理解。
本文深入探讨了Caffe框架中的核心组件Blob,介绍了其作为数据容器的功能,包括存储输入输出数据、权重、偏置和梯度信息。文章详细解析了Blob的内部结构,如SyncedMemory类型的数据存储方式,以及关键成员函数如ReShape、shape、num_axes、count、offset等的作用。同时,也解释了如何通过cpu_data和gpu_data获取CPU或GPU缓存中的数据指针。

390

被折叠的 条评论
为什么被折叠?



