Caffe源码解读之Layer(三)

机器学习 2017-01-14

  Layer涉及到的代码较多。   在Layer中,所有的Pooling,Convolve,apply nonlinearities等操作都在这里实现。在Layer中input data用bottom表示output data用top表示。每一层定义了三种操作setup(Layer初始化), forward(正向传导,根据input计算output), backward(反向传导计算,根据output计算input的梯度)。forward和backward有GPU和CPU两个版本的实现(.cu即GPU版本的实现)。

  Layer又细分成了5种,分别是data_layer,neuron_layer,loss_layer,common_layer ,vision_layer,下面一一介绍。   1.data_layer主要包含与数据有关的文件。在官方文档中指出data是caffe数据的入口是网络的最低层,并且支持多种格式,在这之中又有5种LayerType:   DATA 用于LevelDB或LMDB数据格式的输入的类型,输入参数有source, batch_size, (rand_skip), (backend)。后两个是可选。   MEMORY_DATA 这种类型可以直接从内存读取数据使用时需要调用 MemoryDataLayer::Reset,输入参数有batch_size, channels, height, width。   HDF5_DATA HDF5数据格式输入的类型,输入参数有source, batch_size。   HDF5_OUTPUT HDF5数据格式输出的类型,输入参数有file_name。   IMAGE_DATA 图像格式数据输入的类型,输入参数有source, batch_size,(rand_skip), (shuffle), (new_height), (new_width)。   其实还有两种WINDOW_DATA, DUMMY_DATA用于测试和预留的接口,不重要。

  2.activation/neuron_layer

  同样是数据的操作层,neuron_layer实现里大量激活函数,主要是元素级别的操作,具有相同的bottom,top size。   Caffe中实现了大量激活函数GPU和CPU的都有很多。它们的父类都是NeuronLayer。

  template <typename Dtype>
  class NeuronLayer : public Layer<Dtype>

  一般的参数设置格式如下(以relu_layer为例):

layers {
  name: "relu1"
  type: RELU
  bottom: "conv1"
  top: "conv1"
}

  3.loss_layer是Loss层计算网络误差,loss_layer.hpp头文件调用情况:

#include "caffe/blob.hpp"
#include "caffe/layer.hpp"
#include "caffe/proto/caffe.pb.h"

  一般来说Loss放在最后一层。caffe实现了大量loss function,它们的父类都是LossLayer。

template <typename Dtype>
class LossLayer : public Layer<Dtype>

  4.common_layer这一层主要进行的是vision_layer的连接,源码在。声明了9个类型的common_layer,部分有GPU实现:

InnerProductLayer 常常用来作为全连接层
SplitLayer 用于一输入对多输出的场合(对blob)
FlattenLayer 将n * c * h * w变成向量的格式n * ( c * h * w ) * 1 * 1
ConcatLayer 用于多输入一输出的场合
SilenceLayer 用于一输入对多输出的场合(对layer)
(Elementwise Operations) 这里面是我们常说的激活函数层Activation Layers。
EltwiseLayer
SoftmaxLayer
ArgMaxLayer
MVNLayer

  5.vision_layer主要是实现Convolution和Pooling操作, 主要有以下几个类:

  ConvolutionLayer 最常用的卷积操作   Im2colLayer 与MATLAB里面的im2col类似,即image-to-column transformation, 转换后方便卷积计算   LRNLayer 全称local response normalization layer,在Hinton论文中有详细介绍ImageNet Classification with Deep Convolutional Neural Networks 。   PoolingLayer Pooling操作

  注意,由于Layer定义的类型很多,所以以上的activation/neuron_layer,common_layer和vision_layer等是一类Layer的集合,并不是特指。例如vision_layer包含了convolution_layer,pooling_layer,lrn_layer。具体参考官方Layer文档


本文由 Tony 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

赏个馒头吧