Caffe中Layer和Net细解

Caffe中Layer和Net细解

    • Layer 
      Layer是Caffe的基本计算单元,至少有一个输入Blob(Bottom Blob)和一个输出Blob(Top Blob),部分Layer带有权值(Weight)和偏置(Bias),有两个运算方向:前向传播(Forward)和反向传播(Backward),其中前向传播计算会对输入Blob进行某种处理(权值和偏置)得到输出Blob;而反向传播计算则对输出Blob的diff进行某种处理(权值和偏置)得到输入Blob的diff。 
      所有的Pooling,Convolution,Nonlinear等操作都在这里实现。在Layer中input data用bottom表示output data用top表示。每一层定义了三种操作setup(Layer初始化), forward(正向传导,根据input计算output), backward(反向传导计算,根据output计算input的梯度)。forward和backward有GPU和CPU两个版本的实现。 
      Layer类是一个虚基类,不能直接创建对象。Layer类中大部分函数并没有实现,只有虚函数,真正的实现都在派生类中。 
      如果增加一个新的LayerParameter域,一定要更新下一个可用ID。 
      Layer的重要成员变量: vector loss_ 。每一层又有一个loss值,只不多大多数Layer都是0,只有LossLayer才可能产生非0的loss。计算loss是会把所有层的loss_相加。

    • Net 
      Net在Caffe中代表一个完整的CNN模型,它包含若干Layer实例。Net是一张图纸,对应的描述文件为*.prototxt。Net中既包含Layer对象,也包含Blob对象,其中Blob对象用于存放每个Layer输入/输出中间结果,Layer则根据Net描述对指定的输入Blob进行某些计算处理(卷积、下采样、全连接、非线性变换、计算代价函数等),输出结果放到指定的输出Blob中。输入Blob和输出Blob可能为同一个。所有的Layer和Blob对象都用名字区分,同名的Blob表示同一个Blob对象,同名的Layer表示同一个Layer对象,而Blob和Layer同名则不代表其之间有直接的关系。 
      可以通过has_blob()、has_layer()函数来查询当前Net对象是否包含指定名字的Blob或者Layer对象,如果返回值为真,则可以进一步调用blob_by_name()、layer_by_name()函数直接获取对应的Blob或Layer指针,进行提取某层计算输出特征或者某个Blob中的权值。 
      模型初始化Net::Init()会产生blob和layer并调用Layer::SetUp。在此过程中Net会报告初始化进程。这里的初始化与设备无关,在初始化之后通过Caffe::set_mode()设置Caffe::mode()来选择运行平台CPU或GPU,结果是相同的。 
      Net用容器的形式将多个Layer有序地放在一起,其自身实现的功能主要是对逐层Layer进行初始化,以及提供Update( )的接口(更新网络参数),本身不能对参数进行有效地学习过程。 
      重要成员变量:vector<shared_ptr<Layer<Dtype> > > layers_。 
      成员函数: 
      vector<Blob<Dtype>*>& Forward(const vector<Blob<Dtype>* > & bottom, Dtype* loss = NULL); 
      void Net<Dtype>::Backward(); 
      对整个网络的前向和方向传导,各调用一次就可以计算出网络的loss了。

posted @ 2017-07-10 22:14  菜鸡一枚  阅读(747)  评论(0编辑  收藏  举报