Caffe网络模型详解-常用的Layer

要运行Caffe,首先需要创建一个Model,如常用的Lenet、AlexNet等。一个Model由多个Layer构成,每个Layer又由许多参数构成,层之间的数据流动是以Blobs的方式进行。所有的参数均定义在caffe.proto文件中,熟练使用Caffe的前提是学会配置文件prototxt的编写。

数据层


数据层是Model的最低层,是Model的入口,不仅提供数据的输入,也提供数据从Blobs转换成别的格式保存输出。数据的预处理(减去均值、放大缩小、裁剪和镜像等),也是在这一层设置参数实现。
示列:

layer {
  name: "train-data"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TRAIN
  }
  transform_param {
    scale = 0.00390625
    mean_flie_size = "name"
    mirror: true
    crop_size: 227
  }
  data_param {
    source: ".../lmdb"
    batch_size: 100
    backend: LMDB
  }
}
  • name:表示该层的名称,随意取
  • type:层类型,如果是Data类型,表示数据来源于LevelDB或LMDB。数据来源不同,type层类型也不同。
  • top和bottom:用bottom输入数据,用top输出数据。
  • data和label:在数据层中,至少有一个命名为data的top,如果有第二个top,一般命名为label,这种(data,label)配对是分类模型所必需的。
  • include:一般训练和测试时,模型的层是不一样的,该layer是属于训练阶段的层,还是测试阶段的层,需要用include来指定。如果没有include参数,则表示该层既在训练又在测试中。
  • transform_param:数据的预处理,将数据变换到定义的范围内。
  • scale: 如设置scale为0.00390625(1/255),即将输入数据由0-255归一化到0-1。
  • mean_flie_size:“文件名”:用一个配置文件来进行均值操作。
  • mirror:1表示开启镜像,0表示关闭,也可用true和false表示。
  • crop_size = 227:剪裁一个227*227的图块,在训练阶段随机剪裁,在测试阶段从中间剪裁
  • source:包含数据库的目录名称
  • batch_size:每次处理的数据个数
  • backend:选择是采用LevelDB还是LMDB。

这里仅例举了数据来源于数据库(LevelDB还是LMDB)的情况,另数据来源于内存、HDF5、图片、Windows未一一列举。

视觉层

1. 卷积(Convolution)层

卷积层是卷积神经网络(CNN)的核心层
示例:

layer {
  name: "conv1"
  type: "Convolution"
  bottom: "data"
  top: "conv1"
  param {
    lr_mult: 1.0
    decay_mult: 1.0
  }
  param {
    lr_mult: 2.0
    decay_mult: 0.0
  }
  convolution_param {
    num_output: 96
    kernel_size: 11
    stride: 4
    weight_filler {
      type: "gaussian"
      std: 0.01
    }
    bias_filler {
      type: "constant"
      value: 0.0
    }
  }
}
  • type:层类型Convolution
  • lr_mult:学习率的系数,最终的学习率是lr_mult乘以solver.prototxt配置文件中的base_lr。如果有两个lr_mult,则第一个表示权值的学习率,第二个表示偏置项的学习率。一般偏置项的学习率是权值学习率的两倍。
  • decay_mult:正则项的权重,防止过拟合。为了防止模型参数太复杂导致过拟合,一般在目标函数计算的时候加入了正则项,所谓的weight_decay其实就是正则项前面的那个权值,设置偏大的可以令模型在学习过程中约束参数的复杂程度降低。
  • convolution_param :在这里设定卷积层的特有参数
  • num_output:卷积核(filter)的个数
  • kernel_size:卷积核的大小。如果卷积核的长和宽不等,需要用kernel_h和kernel_w分别设定。
  • stride:卷积核的步长,默认为1。也可以用stride_h和stride_w来设置。
  • pad:扩充边缘,默认为0,不扩充。扩充的时候是左右、上下对称的,比如卷积核的大小为5*5,pad=2时,图像的四个边缘都扩充2个像素,即宽度和高度都扩充了4个像素,这样卷积运算之后的特征图就不会变小。也可以通过pad_h和pad_w来分别设定。
  • weight_filter:权值初始化。默认为“constant”,值全为0,很多时候我们用“xavier”算法来进行初始化,也可以设置为“gaussian”。
  • bias_filter:偏置项的初始化,一般设置为“constant”,值全为0。
  • bias_term:是否开启偏置项,默认为true,开启。
  • group:分组,默认为1组。如果大于1,我们限制卷积的连接操作在一个子集内。如果我们根据图像的通道来分组,那么第i个输出分组只能与第i个输入分组进行连接。

2. 池化(Pooling)层
为了减少运算量和数据维度而设置的一种层。
示例:

layer {
  name: "pool1"
  type: "Pooling"
  bottom: "norm1"
  top: "pool1"
  pooling_param {
    pool: MAX
    kernel_size: 3
    stride: 2
  }
}
  • kernel_size:池化核的大小,也可用kernel_h和kernel_w分别设定。
  • pooling:池化方法,默认为MAX目前可用的方法有MAX,AVE或STOCHASTIC
  • pad:默认为0,边缘扩充。
  • stride:池化的步长,默认为1。一般我们设置为2,即不重叠(步长=窗口大小)。也可以用stride_h和stride_w来设置。

3. Local Response Normalization(LRN)层

对一个输入的局部区域进行归一化,达到“侧抑制”的效果。AlexNet和GoogleNet就用到了这个功能。

layer {
  name: "norm2"
  type: "LRN"
  bottom: "conv2"
  top: "norm2"
  lrn_param {
    local_size: 5
    alpha: 0.0001
    beta: 0.75
  }
}
  • local_size: 默认为5,如果是跨通道,LRN表示求和的通道数。如果是在通道内LRN则表示求和的正方形区域长度。
  • alpha:默认为1,归一化公式中的参数。
  • beta:默认为5,归一化公式中的参数。
  • norm_region:默认为ACROSS_CHANNELS。有两个选择,ACROSS_CHANNELS表示在相邻通道间求和归一化;WITHIN_CHANNEL表示在一个通道内部特定的区域内进行求和归一化。与前面的local_size相对应。

4. im2col层
im2col是指将一个大矩阵,重叠地划分为多个子矩阵,对每个子矩阵序列化成向量,最后得到另外一个矩阵(详情见matlab)。在Caffe中,卷积运算就是先对数据进行im2col操作,再进行内积运算(inner product)。这样做比原始速度更快。

激活层


在激活层中,对输入数据进行激活操作(实际上是一种函数变换),是逐元素进行运算的。从bottom输入Blob数据,从top输出Blob数据。在运算过程中,没有改变数据的大小,即输入和输出的数据大小是相等的。

  1. Sigmoid
  2. ReLU
    目前使用最多的激活函数,主要因为其收敛速度更快,并能保持同样效果。
    可选参数negative_slope:默认为0。对标准的ReLU函数进行变化,如果设置了这个值,那么数据为复数时,就不再设置为0,而是用原始数据乘以该参数。ReLU层支持in-place运算,这意味着bottom的输出和输入相同以避免内存的消耗。
  3. TanH
    利用双曲正切函数对数据进行变换。
  4. Absolute Val(AbsVal)
    求每个输入数据的绝对值
  5. Power
    对每个输入数据进行幂运算。
    可选参数:
    power:默认为1
    scale:默认为1
    shift:默认为0
  6. BNLL
    binomial normal log likehood的简称

其他常用层

  1. Softmax-loss
    Softmax-loss层和Softmax层计算大致相同。Softmax是一个分类器,计算的是类别的概率,是Logistic Regression的一种推广。Logistic Regression只能用于二分类,而Softmax可用于多分类。

  2. Inner Product全连接层
    把输入当作一个向量,输出也是一个简单向量(把输入数据Blobs的width和height全变为1)
    全连接层实际上也是一种卷积层,只是它的卷积核大小和原数据大小一致。因此它的参数基本和卷积层的参数一样。
    示例:

layer {
  name: "fc6"
  type: "InnerProduct"
  bottom: "pool5"
  top: "fc6"
  param {
    lr_mult: 1.0
    decay_mult: 1.0
  }
  param {
    lr_mult: 2.0
    decay_mult: 0.0
  }
  inner_product_param {
    num_output: 4096
    weight_filler {
      type: "gaussian"
      std: 0.005
    }
    bias_filler {
      type: "constant"
      value: 0.1
    }
  }
}
  1. Accuracy
    输出分类(预测)精确度,只有test阶段才有,因此需要加入include参数。
    示例:
    layer {
    name: “accuracy”
    type: “Accuracy”
    bottom: “fc8”
    bottom: “label”
    top: “accuracy”
    include {
    phase: TEST
    }

  2. Reshape
    在不改变数据的情况下,改变输入的维度。
    有一个可选的参数组shape,用于指定Blob数据的各维的值,dim:0表示维度不变;dim=-1表示由系统自动计算维度。

  3. Dropout
    防止过拟合,随机让网络某些隐含层节点的权重不工作,只需设置一个dropout_ratio。

感谢


https://max.book118.com/html/2020/0715/6055121213002220.shtm

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值