当前位置: 代码迷 >> 综合 >> Caffe源码解读(Layer)
  详细解决方案

Caffe源码解读(Layer)

热度:28   发布时间:2023-12-18 11:02:25.0

Layer

Layer类是caffe中所有类的基类,定义了层的基本操作,定义新的层需要override前传反传这些纯虚函数.。

先看层的数据成员:

1)LayerParameter layer_param_;

这是存储在proto中的层的超参数

2)Phase phase_;

层的工作状态:TRAIN or TEST

3)vector<shared_ptr<Blob<Dtype> > > blobs_;

blobs_存储层的所有可学习参数,是一些列blob的指针

4)vector<bool> param_propagate_down_;

propagate_down是bool值集合,一一对应每个参数blob是否需要计算梯度

5)vector<Dtype> loss_;

有些时候除了计算top,前传还要计算loss,这个vector存储各个blob对于loss的权重

 

 

自己重写的函数

1)LayerSetUp(const vector<Blob<Dtype>*>& bottom,const vector<Blob<Dtype>*>& top)

从layer_param_读取参数并将输出数据和学习参数的blob置为合适的形状

2)virtual void Reshape(const vector<Blob<Dtype>*>& bottom,const vector<Blob<Dtype>*>& top) ;

根据层的具体操作与输入blobs的形状重置中间参数与输出数据的形状

3)Backward_cpu()&&Backward_gpu()&&Forward_cpu()&&Forward_gpu()

具体的前传反传计算引擎,通过Forward()和Backward()函数调用

如果loss_不全是0,Forward()函数会先跑前传(Forward_cpu()),再根据data和diff的值计算loss,而前传本身不涉及loss

4)char* type() const { return ""; } 返回层的类型

5)假设对输入数据(bottom blobs)的blobs数量有具体要求,可重写以下函数:

int ExactNumBottomBlobs() const { return -1; } Bottom必需是指定数目

int MinBottomBlobs() const { return -1; } bottom数目至少...

int MaxBottomBlobs() const { return -1; } bottom数目至多...

对于top blobs也是一样的

 

  相关解决方案