Caffe中Layer和Net细解

版权声明:本文为博主原创文章,转载请给出出处。如果错误,请指正! https://blog.csdn.net/wuqingshan2010/article/details/71082772
  • 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了。

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页