Caffe网络结构层参数详解

一、简介

       prototxt 文件是 Caffe 的配置文件,用于保存CNN的网络结构和配置信息。prototxt文件有三种,分别是deploy.prototxt,train_val.prototxt和solver.prototxt。

 

二 、solver.prototxt 文件

      solver.prototxt是 Caffe的配置文件,里面定义了网络训练时候的各种参数,比如学习率、权重衰减、迭代次数等等。solver.prototxt文件只在网络进行训练的时候需要载入,是网络训练的一个整体的参数配置文件。

      参数说明:

#网络模型描述文件,也可以用train_net和test_net来对训练模型和测试模型分别设定
#train_net: "xxxxxxxxxx"
#test_net: "xxxxxxxxxx"
net: "E:/Caffe/examples/mnist/lenet_train_test.prototxt"
#这个参数要跟test_layer结合起来考虑,在test_layer中一个batch是100,而总共的测试图片是10000张
#所以这个参数就是10000/100=100
test_iter: 100
#每迭代500次进行一次测试
test_interval: 500
#学习率
base_lr: 0.01
#动力
momentum: 0.9
#type:SGD #优化算法的选择。这一行可以省略,因为默认值就是SGD,Caffe中一共有6中优化算法可以选择
#Stochastic Gradient Descent (type: "SGD"), 在Caffe中SGD其实应该是Momentum
#AdaDelta (type: "AdaDelta"),
#Adaptive Gradient (type: "AdaGrad"),
#Adam (type: "Adam"),
#Nesterov’s Accelerated Gradient (type: "Nesterov")
#RMSprop (type: "RMSProp")
#权重衰减项,其实也就是正则化项。作用是防止过拟合
weight_decay: 0.0005
#学习率调整策略
#如果设置为inv,还需要设置一个power, 返回base_lr * (1 + gamma * iter) ^ (- power),其中iter表示当前的迭代次数
lr_policy: "inv"
gamma: 0.0001
power: 0.75
#每训练100次屏幕上显示一次,如果设置为0则不显示
display: 100
#最大迭代次数
max_iter: 2000
#快照。可以把训练的model和solver的状态进行保存。每迭代5000次保存一次,如果设置为0则不保存
snapshot: 5000
snapshot_prefix: "E:/Caffe/examples/mnist/models"
#选择运行模式
solver_mode: GPU

   

test_iter:表示网络的测试迭代次数。网络一次迭代将一个batchSize的图片进行测试,所以为了能将validation集中所有图片都测试一次,这个参数乘以TEST的batchSize应该等于validation集中图片总数量。即test_iter*batchSize=val_num。
test_interval:表示网络迭代多少次进行一次测试。一次迭代即一个batchSize的图片通过网络正向传播和反向传播的整个过程。比如这里设置的是224,即网络每迭代224次即对网络的准确率进行一次验证。一般来说,我们需要将训练集中所有图片都跑一编,再对网络的准确率进行测试,整个参数乘以网络data层(TRAIN)中batchSize参数应该等于训练集中图片总数量。即test_interval * batchSize=train_num。
base_lr:表示网络的基础学习率。学习率过高可能导致loss无法收敛等等问题。过低的学习率会使网络收敛慢,也有可能导致梯度损失。一般我们设置为0.01。
display: 每多少次显示在窗口一次。
max_iter: 网络的最大迭代次数。训练集中的图片要反复多次的进行训练,所以这个参数应该要大一些。
lr_policy: 学习率变化。
gamma: 学习率变化比率。一般不改。
momentum: 学习的参数。一般不改。
weight_decay: 学习的参数。一般不改。
stepsize: 每多少次学习率递减。这里是迭代2218次学习率递减。
snapshot: 每多少次保存一次学习的结果。即caffemodel。
solver_mode: 设置使用GPU还是CPU进行学习训练。
net:  网络结构的文件路径。 
solver_type: 优化算法的选择,一共有六种可选:SGD、AdaDelta、AdaGrad、Adam、Nesterov和RMSProp。默认为SGD。

 

三、deploy.prototxt 文件和 train_val.prototxt 文件

      deploy.prototxt 文件和 train_val.prototxt 文件是 Caffe 的网络结构文件。train_val.prototx是训练时候的网络结构,deploy.prototxt用于发布(即测试时候的网络结构)。这两个文件中内容基本一致,但是存在一些细微区别:1.  在train_val.prototx中网络结构的data层有两种,分别为TRAIN和TEST。顾名思义,TRAIN是网络训练时后的数据结构,TEST是网络做验证时候的数据结构。一般来说TRAIN中的batchSize比TEST中的要大一些。2.在train_val.prototx中的卷积层(Convolution)中存在学习率和权重衰减的参数,而deploy.prototxt文件中则没有这些参数。

      由于train_val.prototx包含了deploy.prototxt文件中所有的参数定义,所以下面以train_val.prototx文件为例,详细说明每个参数的意义。以经典的AlexNet网络为例:

      data层:

layer {
  name: "train-data"        # 这一层的名字
  type: "Data"              # 这一层的类型       
  top: "data"               # 这一层所连接上一层。注意网络是从下往上生长的,最底层是数据层。
  top: "label"
  include {
    phase: TRAIN            # TRIAN 表示这一层是训练时候网络的定义
  }
  transform_param {
    mirror: true            # 是否使用镜像
    crop_size: 227          # 将输入数据裁剪为227
    mean_file: "./mean.binaryproto"   #均值文件的路径
  }
  data_param {
    source: "./train_db"    # 训练集路径
    batch_size: 128         # 一次迭代输入图片的数量
    backend: LMDB           # 数据集的格式
  }
}

       convolution层:

layer {
  name: "conv1"
  type: "Convolution"
  bottom: "data"
  top: "conv1"
  param {
    lr_mult: 1.0        # 学习率。这里有两个学习率,分别是 filter 和 bias 的学习率
    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
    }     # 整个参数是表示使用高斯方法初始化滤波器参数。这里使用均值为0,方差为0.01的高斯核
    bias_filler {
      type: "constant"
      value: 0.0
    }     # 整个参数表示使用 constant 方法初始化偏置,即初始偏置为0
  }
}

 

四、生成 caffemode 和 solverstate 文件

      在caffe训练完网络之后,会生成两个文件一个caffemodel和solberstate,caffemodel是各层的参数,也就是训练之后的网络模型最重要的文件,而 solverstate则是快照,就是可以通过该文件继续进行迭代。这两个文件的位置在训练网络的 solver.prototxt文件定义,这里面的 snapshot_prefix 字段里写了文件生成的位置。

 

 

 

你可能感兴趣的:(深度学习)