Caffe中的Layer是如何工作的?

原创 2016年05月30日 12:24:38

关于Layers的一些概述

  • Layers是Caffe中最复杂、承担的工作量最大的一类组件。从数据的载入(Input layer), 卷积的计算(Conv layer),对feature map的下采样(pooling layer),网络非线性的引入(ReLU layer,Sigmoid layer)还是概率(softmax layer)与损失的计算(softmax loss layer),上述种种复杂的工作都由Layers来完成。
  • Layers是Caffe中基本的计算单元,除了输入层,其余的层可以看作接受一个输入,经过计算后给出输出的函数
    layer接受一个输入,给出一个输出
    如上图所示,conv layer接受bottom blob作为输入,经过卷积运算后给出输出top blob。
  • 每个层定义三个重要的函数——setup(), forward()和backward()。
    setup()负责按照网络定义对layer进行初始化,forward()负责进行前向传播,backward负责进行后向传播,所谓后向传播就是将在layer top的梯度传播到layer的bottom,如果layer本身有可学习的参数(例如卷积层、全连接层),那么还要计算并保存相对于参数的梯度以进行后续的梯度下降。
  • 所有的layers都有派生自一个共同的基类——layer
    layer作为基类,定义了所有类共有的接口——setup, forward和backward。派生类通过重载基类中的若干虚函数来实现specific的功能。

如何添加自己的layer?

关于如何添加自己的layer,这边博文叙述十分详细,我不再赘述。
Making a Caffe Layer

一个layer是如何被创建的?

Caffe中使用简单工厂模式来创建不同的layer。

  • 具体负责这个任务的是类LayerRegistry,这个类使用static变量g_registry_来记录layer的名称与其对应的创建layer的函数。
  • 创建layer的函数既可以是layer本身的构造函数,也可以是另外指定的函数,只要这个函数返回的是指向类实例的指针就可以,可以参见layer_factory.cpp中创建conv layer实例的函数代码
  • g_registry_的类型是std::map<string, Creator>,Creator是指向函数的指针,具体为typedef shared_ptr<Layer<Dtype> > (*Creator)(const LayerParameter&)
  • 使用宏REGISTER_LAYER_CLASS(LayerName)直接使用layer的构造函数作为创建layer的函数,使用宏REGISTER_LAYER_CREATOR(LayerName, LayerCreator)
    *
    可以指定用来创建layer的函数。

Net类通过调用静态函数LayerRegistry<Dtype>::CreateLayer(layer_param)实例化layer

CreateLayer的代码非常容易理解

static shared_ptr<Layer<Dtype> > CreateLayer(const LayerParameter& param) {
    if (Caffe::root_solver()) {
      LOG(INFO) << "Creating layer " << param.name();
    }
    const string& type = param.type();
    CreatorRegistry& registry = Registry();//registry是std::map<string, Creator>类型
    CHECK_EQ(registry.count(type), 1) << "Unknown layer type: " << type
        << " (known types: " << LayerTypeListString() << ")";
    return registry[type](param);
  }

梳理caffe代码layer_factory(六)

因为前一篇描述的是layer层,其实应该先学习工厂模式,最早我也学习过了23中模式设计,不熟悉这个模式的可以看一下下面这段代码。 #include "stdafx.h" #include #incl...
  • langb2014
  • langb2014
  • 2016年03月27日 15:00
  • 5984

caffe代码layer_factory梳理分析

因为前一篇描述的是layer层,其实应该先学习工厂模式,最早我也学习过了23中模式设计,不熟悉这个模式的可以看一下下面这段代码。   ? 1 2 ...
  • ZhikangFu
  • ZhikangFu
  • 2016年11月10日 16:57
  • 426

Caffe源码中layer文件分析

Caffe源码中layer文件分析
  • fengbingchun
  • fengbingchun
  • 2017年03月08日 14:11
  • 856

caffe源码追踪--layer_factory

关于怎么注册层,caffe提供了两种方式: (1)只有一个构造函数时,在cpp文件最后加上 REGISTER_LAYER_CLASS(MyAwesome); 即可 (2)若是还有如下形...
  • little_sun_123
  • little_sun_123
  • 2017年08月09日 15:35
  • 130

Caffe中Layer_factory详解

Layer_factory.hppLayer_factory的主要作用是负责Layer的注册,已经注册完事的Layer在运行时可以通过传递一个 LayerParameter 给 CreaterLaye...
  • JWMNEU
  • JWMNEU
  • 2015年12月21日 17:54
  • 4249

Caffe中Layer和Net细解

Caffe中Layer和Net细解
  • wuqingshan2010
  • wuqingshan2010
  • 2017年05月02日 16:31
  • 372

梳理caffe代码layer(五)

caffe中的layer层代码比较多,各种抽象。layer这个类可以说是里面最终的一个基本类了,深度网络呢就是一层一层的layer,相互之间通过blob传输数据连接起来。 我们先看一张图: 首先l...
  • langb2014
  • langb2014
  • 2016年03月27日 12:20
  • 16089

[新手学Caffe之三]如何在Caffe中加入新的layer并利用Matlab进行调试

如何在Caffe中加入新的layer并利用Matlab进行调试 Caffe当中已经实现了很多常用的layer,但是在有些时候,通过单独使用或者组合这些已有的layer并没法实现我们想要的功能,这时便...
  • qq_30040223
  • qq_30040223
  • 2016年01月25日 18:14
  • 2925

caffe编译出现的一些错误及解决方法(仅供参考)

1、make pytest时,出现layer_factory.hpp:77 ] Check failed: registry..... 解决方法:打开caffe目录下的Makefile.config文...
  • zhouchao_fight
  • zhouchao_fight
  • 2015年04月22日 09:59
  • 1784

caffe 的layer的参数说明

最近在学习caffe做实验 今天就记录一下layer的参数及这些常用的参数的解释吧主要还是参考官方网站 http://caffe.berkeleyvision.org/tutorial/laye...
  • Losteng
  • Losteng
  • 2016年03月08日 15:31
  • 7027
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Caffe中的Layer是如何工作的?
举报原因:
原因补充:

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