prototxt文件是caffe的配置文件,用于保存CNN的网络结构和配置信息。prototxt文件有三种,分别是deploy.prototxt,train_val.prototxt和solver.prototxt。
1. solver.prototxt
solver.prototxt是caffe的配置文件。里面定义了网络训练时候的各种参数,比如学习率、权重衰减、迭代次数等等。下面详细说明每一个参数所代表的意义:
- test_iter: 299
- test_interval: 224
- base_lr: 0.01
- display: 20
- max_iter: 6720
- lr_policy: "step"
- gamma: 0.1
- momentum: 0.9
- weight_decay: 0.0001
- stepsize: 2218
- snapshot: 224
- snapshot_prefix: "snapshot"
- solver_mode: GPU
- net: "train_val.prototxt"
- 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用于发布(即测试时候的网络结构)。这两个文件中内容基本一致,但是存在一些细微区别:
- 在train_val.prototx中网络结构的data层有两种,分别为TRAIN和TEST。顾名思义,TRAIN是网络训练时后的数据结构,TEST是网络做验证时候的数据结构。一般来说TRAIN中的batchSize比TEST中的要大一些。
- 在train_val.prototx中的卷积层(Convolution)中存在学习率和权重衰减的参数,而deploy.prototxt文件中则没有这些参数(有些deploy.prototxt中仍然有这些参数,但是对测试不起任何作用)。
由于train_val.prototx包含了deploy.prototxt文件中所有的参数定义,所以下面以train_val.prototx文件为例,详细说明每个参数的意义。这里以经典的AlexNet网络为例:
1.data层
- layer {
- name: "train-data"
- type: "Data"
- top: "data"
- top: "label"
- include {
- phase: TRAIN
- }
- transform_param {
- mirror: true
- crop_size: 227
- mean_file: "./mean.binaryproto"
- }
- data_param {
- source: "./train_db"
- batch_size: 128
- backend: LMDB
- }
- }
name: 这一层的名字。
type:这一层的类型。
top: 这一层所连接的上一层。注意,网络是从下往上生长的。最底层是数据层,越往上特征越抽象。
phase: TRAIN 表示这一层是训练时候网络的定义。
mirror:是否使用镜像。
crop_size:将输入数据裁剪为227。
mean_file:均值文件的路径。
source:训练集的路径。
batch_size:一次迭代输入的图片数量。
backend:数据集的格式。
2. Convolution层
- 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
- }
- }
- }
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等层。这些层参数比较少,也比较容易理解。这里就不详细介绍了。