Caffe中Layer和Net细解

原创 2017年05月02日 16:31:30
  • 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了。

版权声明:本文为博主原创文章,转载请给出出处。如果错误,请指正!

Caffe中的Layer是如何工作的?

关于Layers的一些概述 Layers是Caffe中最复杂、承担的工作量最大的一类组件。从数据的载入(Input layer), 卷积的计算(Conv layer),对feature map的下采样...
  • withwsf
  • withwsf
  • 2016年05月30日 12:24
  • 1257

(15)caffe总结之自定义Layer的实现

自定义一个计算层,实现y = x^power + b的功能。 自定义神经层具体可以分成5个步: 1.创建定义的头文件include/caffe/layers/my_neuron_layer.hpp...
  • u013289254
  • u013289254
  • 2017年04月22日 11:22
  • 398

Caffe框架初步理解

当前最火无非就是深度学习了。搞了大半年的机器人相关视觉东西,用的最多的也是Caffe。看网上有形形色色的Deeplearning的net,但是他们背后到底是什么样子的?这么说吧!这里我们把Caffe比...
  • xygl2009
  • xygl2009
  • 2017年09月04日 00:30
  • 342

caffe添加新层windows

参考博客: http://46aae4d1e2371e4aa769798941cef698.devproxy.yunshipei.com/kkk584520/article/details/527...
  • junxiacaocao
  • junxiacaocao
  • 2017年02月04日 17:12
  • 540

windows-caffe添加新层

参考博客: http://46aae4d1e2371e4aa769798941cef698.devproxy.yunshipei.com/kkk584520/article/details/5272...
  • u014565333
  • u014565333
  • 2017年01月04日 11:03
  • 921

使用Caffe 增加自定义 Layer 及其 ProtoBuffer 参数

在使用 Caffe 过程中经常会有这样的需求:已有 Layer 不符合我的应用场景;我需要这样这样的功能,原版代码没有实现;或者已经实现但效率太低,我有更好的实现。 方案一:简单粗暴...
  • king16304
  • king16304
  • 2016年10月09日 09:46
  • 3469

caffe添加新层教程

时间节点2016.04,即caffe重大更新后(每一种层都对应一个同名cpp和hpp文件)。描述一下本次要实现层的功能:正向直接copy传播,反向时将梯度放缩指定倍。这个层对一些特定的网络结构有很重要...
  • shuzfan
  • shuzfan
  • 2016年05月05日 15:00
  • 22863

为caffe添加最简单的全通层AllPassLayer

参考赵永科的博客,这里我们实现一个新 Layer,名称为 AllPassLayer,顾名思义就是全通 Layer,“全通”借鉴于信号处理中的全通滤波器,将信号无失真地从输入转到输出。虽然这个 Laye...
  • Scythe666
  • Scythe666
  • 2017年10月06日 09:54
  • 352

DeepLabv2 caffe创建可编译环境

参考博文:http://blog.csdn.net/tianrolin/article/details/71246472 Makefile 181行 # LIBRARIES += g...
  • u014176855
  • u014176855
  • 2017年11月17日 10:36
  • 78

caffe网络配置文件中layer和layers的区别

最近使用vggface模型训练自己的人脸库,根据网上的代码把数据层加入到自己的文件中,训练时报错,大概意思是layer和layers只能使用一个。仔细看了一下,vggface的模型用的层的定义都是la...
  • wo4691205
  • wo4691205
  • 2017年04月19日 21:45
  • 1075
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Caffe中Layer和Net细解
举报原因:
原因补充:

(最多只允许输入30个字)