caffe中网络结构参数详解

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

1. solver.prototxt

solver.prototxt是caffe的配置文件。里面定义了网络训练时候的各种参数,比如学习率、权重衰减、迭代次数等等。下面详细说明每一个参数所代表的意义:

[html] view plain copy

  1. test_iter: 299  
  2. test_interval: 224  
  3. base_lr: 0.01  
  4. display: 20  
  5. max_iter: 6720  
  6. lr_policy: "step"  
  7. gamma: 0.1  
  8. momentum: 0.9  
  9. weight_decay: 0.0001  
  10. stepsize: 2218  
  11. snapshot: 224  
  12. snapshot_prefix: "snapshot"  
  13. solver_mode: GPU  
  14. net: "train_val.prototxt"  
  15. solver_type: SGD  


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持续86.33333,也可能导致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。

solver.prototxt文件只在网络进行训练的时候需要载入。是网络训练的一个整体的参数配置文件。

2. deploy.prototxt和train_val.prototx

这两个文件是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文件中则没有这些参数(有些deploy.prototxt中仍然有这些参数,但是对测试不起任何作用)。

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

1.data层

[html] view plain copy

  1. layer {  
  2.   name: "train-data"  
  3.   type: "Data"  
  4.   top: "data"  
  5.   top: "label"  
  6.   include {  
  7.     phase: TRAIN  
  8.   }  
  9.   transform_param {  
  10.     mirror: true  
  11.     crop_size: 227  
  12.     mean_file: "./mean.binaryproto"  
  13.   }  
  14.   data_param {  
  15.     source: "./train_db"  
  16.     batch_size: 128  
  17.     backend: LMDB  
  18.   }  
  19. }  


name: 这一层的名字。

type:这一层的类型。

top: 这一层所连接的上一层。注意,网络是从下往上生长的。最底层是数据层,越往上特征越抽象。

phase: TRAIN 表示这一层是训练时候网络的定义。

mirror:是否使用镜像。

crop_size:将输入数据裁剪为227。

mean_file:均值文件的路径。

source:训练集的路径。

batch_size:一次迭代输入的图片数量。

backend:数据集的格式。

2. Convolution层

[html] view plain copy

  1. layer {  
  2.   name: "conv1"  
  3.   type: "Convolution"  
  4.   bottom: "data"  
  5.   top: "conv1"  
  6.   param {  
  7.     lr_mult: 1.0  
  8.     decay_mult: 1.0  
  9.   }  
  10.   param {  
  11.     lr_mult: 2.0  
  12.     decay_mult: 0.0  
  13.   }  
  14.   convolution_param {  
  15.     num_output: 96  
  16.     kernel_size: 11  
  17.     stride: 4  
  18.     weight_filler {  
  19.       type: "gaussian"  
  20.       std: 0.01  
  21.     }  
  22.     bias_filler {  
  23.       type: "constant"  
  24.       value: 0.0  
  25.     }  
  26.   }  
  27. }  

lr_mult: 学习率。这里有两个学习率,分别是filter和bias的学习率。

decay_mult::衰减系数。同样有两个,与学习率对应。

num_output::这一层输出的特征图个数。即改成用多少个卷积核去对输入做卷积操作。

kernel_size:卷积核的尺寸。

stride:卷积的步长。

weight_filler {
      type: "gaussian"
      std: 0.01
    }

整个参数是表示使用高斯方法初始化滤波器参数。这里是使用均值为0,方差为0.01的高斯核。

bias_filler {
      type: "constant"
      value: 0.0
    }

整个参数表示使用constant方法初始化偏置。即初始偏置设置为0。

caffe中还有RELU,pooling,LRN,SoftMax,IP,FC等层。这些层参数比较少,也比较容易理解。这里就不详细介绍了。

猜你喜欢

转载自blog.csdn.net/liu_xiao_cheng/article/details/82385077
今日推荐