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也是一样的