caffe源码解析之layer

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yudiemiaomiao/article/details/77477198

Layer:网络的基础单元
Layer 是对神经网络中各种层的一个抽象,包括我们熟知的卷积层和下采样层,还有全连接层和各种激活函数层等等。同时每种 Layer 都实现了前向传播和反向传播,并通过 Blob 来传递数据。
Layer是网络模型和计算的核心,在数据存储上,主要分成bottom_vecs、top_vecs、weights&bias三个部分;在数据传递上,也主要分为LayerSetUp、Reshape、Forward、Backward四个过程,符合直观上对层与层之间连接的理解,贴切自然。

Layer的重要成员变量

LayerParameter layer_param_;//protobuf文件中存储的layer参数
/** The phase: TRAIN or TEST */
Phase phase_;
// blobs_是一个vector容器,其元素是指向Blob的shared_ptr指针,将可学习的参数存在一组Blob类内
vector<shared_ptr<Blob<Dtype> > > blobs_; //存储layer的参数,在程序中用的,layer学习到的参数
/** Vector indicating whether to compute the diff of each param blob. */
vector<bool> param_propagate_down_; //这个bool表示是否计算各个blob参数的diff,即传播误差
// 表明在目标函数计算中,该层的每个top blob是否有非零的权值,也就是是否参与到目标函数的计算
vector<Dtype> loss_;//每一层都会有一个loss值,但只有LossLayer才会产生非0的loss

Layer的重要成员函数
Layer类的构建函数explicit Layer(const LayerParameter& param) : layer_param_(param)会尝试从protobuf文件读取参数。其三个主要接口如下:

virtual void SetUp(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top)
inline Dtype Forward(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top);
inline void Backward(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, const <Blob<Dtype>*>* bottom);

SetUp函数包括InitMutex(初始化Mutex),CheckBlobCounts(检查blob个数是否符合条件),LayerSetUp(调用子类也就是具体的层的设置函数完成具体层的设置),Reshape(reshape top blobs,内部buffer和其他必要的东西符合bottom blobs的形状信息),SetLossWeights(设置top blobs在计算loss时对应的参数);
Forward函数给定bottom blobs计算top blobs和loss,具体实现时定义自己的cpu和gpu版本的,然后会被这个函数调用;
Backward函数给定top blobs的error diff计算bottom blobs的error diff,存到bottom blobs中的diff中,其中Backward里面有个propagate_down参数,用来表示该Layer是否反向传播参数。
在Forward和Backward的具体实现里,会根据Caffe::mode()进行对应的操作,即使用cpu或者gpu进行计算,两个都实现了对应的接口Forward_cpu、Forward_gpu和Backward_cpu、Backward_gpu,这些接口都是virtual,具体还是要根据layer的类型进行对应的计算(注意:有些layer并没有GPU计算的实现,所以封装时加入了CPU的计算作为后备)。另外,还实现了ToProto的接口,将Layer的参数写入到protocol buffer文件中。

void Layer<Dtype>::ToProto(LayerParameter* param, bool write_diff)

猜你喜欢

转载自blog.csdn.net/yudiemiaomiao/article/details/77477198