Caffe | 核心积木Layer层类详解

Caffe的Layer层是构建网络的基础,包括Layer基类和多个派生类,如data_layer、neuron_layer、loss_layer、common_layer和vision_layer。Layer通过实现Forward和Backward函数完成前向传播和反向传播。data_layer负责数据输入,neuron_layer包含激活函数,loss_layer处理损失函数,common_layer涵盖各种计算操作,而vision_layer涉及图像处理。例如,data_layer的data_layer.hpp/cpp实现数据输入,SoftmaxWithLoss计算损失并提供稳定梯度,FlattenLayer将多维数据展平,Convolution层用于卷积操作。
摘要由CSDN通过智能技术生成
0.简介

Layer层类是Caffe中搭建网络的基本单元,当然也是使用Caffe训练的核心部件单元,因此我们将其称之为Caffe的核心积木。Layer基类派生出了各种不同功能的层类,Layer类派生出来的层类通过实现两个虚函数Forward()和Backward(),产生了各式各样功能的层类。Forward是从根据bottom计算top的过程进行前向计算,Backward则相反根据top计算bottom的过程进行反向传播。

1.Layer基类

layer.hpp是所有的网络层的基类,其中,定义了一些通用的接口(各个派生类中都有的操作),比如:

  • (前馈_cpu or 前馈_gpu) :通过给定的bottom blob的值计算top blob的值。需要注意某些层没有gpu版。

  • (反馈_cpu or 反馈_gpu):反馈:通过给定的top blob的误差梯度计算bottom blob的梯度值。

  • Layersetup:读取指定层类的layer param(层参数),为后续reshape做准备。

  • reshape:根据输入该层的bottom blob的形状,和改成定制化的计算策略(也就是当前层的逻辑)计算得到对应的top blob的形状,并预先分配好内存空间。

  • const LayerParameter& layer_param() const { return layer_param_; }
    用以读取protobuf文件中存储的layer参数

  • vector<share_ptr<Blob>> blobs_;
    用以存储当前层各类可学习参数

其中也定义了一些通用的字段,比如:
caffe.proto github传送门

message LayerParameter {
  optional string name = 1; // 层名
  optional string type = 2; // 层类型
  repeated string bottom = 3; // 层输入 
  repeated string top = 4; // 层输出
  optional Phase phase = 10; // Train或者Test
  repeated float loss_weight = 5; //为每个top量设定权重,通常设为0或1
  repeated ParamSpec param = 6;//指定训练参数(solver中设置的学习率乘以该参数,
                               //才为当前层的真正学习率)。
  repeated BlobProto blobs = 7;
  repeated bool propagate_down = 11;//若当前层该参数设为0,则当前层会被反向梯度传播给跳过

当然也有一些特定派生子类层才会有的参数:

optional TransformationParameter transform_param = 100;//数据预处理参数特有的参数
optional LossParameter loss_param = 101;//loss层特有的参数
......
optional ConvolutionParameter convolution_param = 106;
optional DataParameter data_param = 107;
......
optional PoolingParameter pooling_param = 121;
}

Layer.hpp是抽象出来的基类,其他的xxx_Layers.hpp都是在其基础上的继承。在Layer.hpp的基础上直接衍生出来的5种Layers:data_layer 、neuron_layer 、loss_layer 、common_layer 、vision_layer 。对整个layer层做个基本介绍:data负责输入,vision负责卷积相关的计算,neuron和common负责中间部分的数据计算,而loss是最后一部分,负责计算反向传播的误差。

Note:再重复的介绍下如何看懂Message。
Message中的filed的3种形式:
//1. Required是必须有值的,
//2. optional是可选项,
//3. repeated表示后面单元为相同类型的一组向量。
Message中的类型标识符:
//1.string/float:这些都是c/c++中固有的数据类型
//2.TransformationParameter/TransformationParameter:caffe定义的数据类型,类似与结构体类型(内部有多种类型,后续针对层进行介绍)

2.data_layer(data_layer.hpp/cpp)

数据的输入层类,处于整个网络的最底层,它可以从数据库leveldb、lmdb中读取数据,也可以直接从内存中读取,还可以从hdf5,甚至是原始的图像读入数据。作为网络的最底层,主要实现数据格式的转换。由于支持不同格式的输入,因此基于该类又往下派生出了二级子类,主要有(详细介绍一种,其余可类比):
(1):Date

  • Layer type: Date //需要注意的是该参数可以从对应的cpp文件最后找到~
  • 头文件位置:./include/caffe/layers/data_layer.hpp
  • CPU 执行源文件位置:./src/caffe/layers/data_layer.cpp
  • Date层的功能:读取LevelDB,LMDB,并进行一系列前处理。
optional DataParameter data_param = 11;
optional TransformationParameter transform_param = 100;



message DataParameter {
  enum DB {
    LEVELDB = 0;
    LMDB = 1;
  }
  optional string source = 1;
  optional uint32 batch_size = 4;//批处理尺寸
  optional uint32 rand_skip = 7 [default = 0];//在开头跳过这个数量的输入; 对异步sgd很有用
  optional DB backend = 8 [default = LEVELDB];//LMDB或LEVELDB
  optional float scale = 2 [default = 1];//数据比例缩放,用于减均值操作之后
  optional string mean_file = 3;//已经弃用,被挪到transform参数中
  optional uint32 crop_size = 5 [default = 0];//已经弃用,被挪到transform参数中
  optional bool mirror = 6 [default = false];//已经弃用,被挪到transform参数中
  optional bool force_encoded_color = 9 [default = false];//强制图像具有3个通道
  optional uint32 prefetch = 10 [default = 4];
}

//在数据层中都会用到的图像预处理参数
message TransformationParameter {
  optional float scale = 1 [default = 1];//归一化操作,主要要在取均值后才能用
  optional bool mirror = 2 [default = false];//对输入数据做随机水平镜像
  optional uint32 crop_size = 3 [default = 0];
  optional string mean_file = 4;//指定均值文件(和mean_value不同用法同样效果)
  repeated float mean_value = 5;//mean_file和mean_value不能共存
  optional bool force_color = 6 [default = false];//强制3通道
  optional bool force_gray = 7 [default = false];//强制灰度图
}

使用例子:

layer {
  name: "cifar"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TRAIN
  }

  transform_param {
    scale:0.0078125
    mirror:true
    crop_size:32
    mean_value: 128
    mean_value: 128
    mean_value: 128
  }
  data_param {
    source: "examples/cifar10/cifar10_train_lmdb"
    batch_size: 32
    backend: LMDB
  }
}

Note:从下述的代码可以看出,如果我们输入的图片尺寸大于crop_size,那么图片会被裁剪。当 phase 模式为 TRAIN 时,裁剪是随机进行裁剪,而当为TEST 模式时,其裁剪方式则只是裁剪图像的中间区域。


//We only do random crop when we do training.
    if (phase_ == TRAIN) {
      h_off = Rand(datum_height - crop_size + 1);
      w_off = Rand(datum_width - crop_size + 1);
    } else {
      h_off = (datum_height - crop_size) / 2;
      w_off = (datum_width - crop_size) / 2;
    }
  }

(2)MEMORY_DATA dummy_data_layer.hpp

optional DummyDataParameter dummy_data_param = 109;

message DummyDataParameter {
  // This layer produces N >= 1 top blobs.  DummyDataParameter must specify 1 or N
  // shape fields, and 0, 1 or N data_fillers.
  //
  // If 0 data_fillers are specified, ConstantFiller with a value of 0 is used.
  // If 1 data_filler is specified, it is applied to all top blobs.  If N are
  // specified, the ith is applied to the ith top blob.
  repeated FillerParameter data_filler = 1;
  repeated BlobShape shape = 6;

  // 4D dimensions -- deprecated.  Use "shape" instead.
  repeated uint32 num = 2;
  repeated uint32 channels = 3;
  repeated uint32 height = 4;
  repeated uint32 width = 5;
}

(3)HDF5_DATA hdf5_data_layer.hpp

optional HDF5DataParameter hdf5_data_param = 112;

// Message that stores parameters used by HDF5DataLayer
message HDF5DataParameter {
  // Specify the data source.
  optional string source = 1;
  // Specify the batch size.
  optional uint32 batch_size = 2;

  // Specify whether to shuffle the da
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yuanCruise

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值