您的位置:首页 > 理论基础 > 计算机网络

caffe 卷积神经网络源码一些模糊点整理

2016-05-13 15:36 465 查看
最近在看caffe,本着 我啥也不会,别人啥都会的精神,虚心的看了好多博客,现对一些迷糊的点做一个总结,万一你也迷糊呢,是吧~

主要参考:http://blog.csdn.net/mounty_fsc/article/details/51085654

1 blob

blob类里面的 data_,diff_,count_,capacity_啥意思大家都懂,主要不懂的是它的shape_;

一般都会说shape是维度信息,但这个维度到底是啥?

a.

一般的图像数据,shape为4,分别是num,channels,height,width,这里,num=batch_size,channels=特征维度(RGB=3),blob的 维度(n*k*h*w)

k=channels,blob是row-major保存的(一行一行的),所以(n,k,h,w)位置的物理地址为((n*K+k)*H+h)*W+w.

b.

对于全连接网络,使用2D blobs (shape (N, D)),然后调用InnerProductLayer

c.

对于参数,维度根据该层的类型和配置来确定。对于有3个输入96个输出的卷积层,Filter核 11 x 11,则blob为96 x 3 x 11 x 11. 对于全连接层,1000个输出,1024个输入,则blob为1000 x 1024.

2 layer

Setup:Layer的初始化
Forward:前向传导计算,根据bottom计算top,调用了Forward_cpu(必须实现)和Forward_gpu(可选,若未实现,则调用cpu的)
Backward:反向传导计算,根据top计算bottom的梯度,其他同上

3 net

Init中,通过创建blob和layer搭建了整个网络框架,以及调用各层的SetUp函数。
blobs_存放这每一层产生的blobls的中间结果,bottom_vecs_存放每一层的bottom blobs,top_vecs_存放每一层的top blobs
<pre name="code" class="cpp">protected:
...
/// @brief The network name
string name_;
/// @brief The phase: TRAIN or TEST
Phase phase_;
/// @brief Individual layers in the net
vector<shared_ptr<Layer<Dtype> > > layers_;
/// @brief the blobs storing intermediate results between the layer.
vector<shared_ptr<Blob<Dtype> > > blobs_;
vector<vector<Blob<Dtype>*> > bottom_vecs_;
vector<vector<Blob<Dtype>*> > top_vecs_;
...
/// The root net that actually holds the shared layers in data parallelism
const Net* const root_net_;




注意这些参数的类型

最后再说一下ACCURACY layer

Accuracy Layer

Accuracy完成的任务是统计预测正确样本的个数信息。如总样本N个,正确分类n个,正确率为n/N。

主要变量:

label_axis_为标签对应的轴(对应的blob中的那个维度)
outer_num_总的来说是样本数量,详细解释见后面
inner_num_同上,总的来说是样本数量,详细解释见后面
top_k为取前k个最高评分(的预测标签)

定义中关于axis的说明:

axis指出在预测blob中,哪一维是label轴,如(N x C x H x W)的blob,axis=0,则N为label对应的维度。axis=1,则C为label对应的维度,而剩下的N为outer样本数量, H x W为inner样本数量。
由代码可知,当
axis=k
outer_num_=blob.shape[0,..,k),inner_num_=blob.shape[k+1,..,shape.size)


一般的,label blob的维度为(N x C),N为样本数量,C为标签数量(即类别个数)。axis=1,outer_num_=N,inner_num_=shape[2,2)=1(即没有inner)

<code class="language-c hljs  has-numbering">outer_num_ = bottom[<span class="hljs-number">0</span>]->count(<span class="hljs-number">0</span>, label_axis_);
inner_num_ = bottom[<span class="hljs-number">0</span>]->count(label_axis_ + <span class="hljs-number">1</span>);</code>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: