您的位置:首页 > Web前端

机器学习入门(二):caffe训练proto配置文件解析

2018-01-24 15:40 351 查看
LeNet-5 train_val.prototxt文件解释和 solver.prototxt文件解释

name: "LeNet"//网络名称
layer {//定义一个层
name: "mnist"//层的名字
type: "Data"//输入层的类型为lmdb,如果输入数据格式为图片,则此处应该是imagedata
top: "data"//输出为两层,一层是数据一层是标签
top: "label"
include {
phase: TRAIN
}
transform_param {
scale: 0.00390625
}
data_param {//数据层相关参数
source:   "examples/mnist/mnist_train_lmdb"
batch_size: 64
backend: LMDB
}
}

layer {
name: "mnist"
type: "Data"
top: "data"
top: "label"
include {
phase: TEST
}
transform_param {
scale: 0.00390625
}
data_param {
source: "examples/mnist/mnist_test_lmdb"
batch_size: 100
backend: LMDB
}
}
 关于以上相关解释:
name: 表示该层的名称,可随意取
type: 层类型,如果是Data,表示数据来源于LevelDB或LMDB。根据数据的来源不同,数据层的类型也不同(后面会详细阐述)。一般在练习的时候,我们都是采 用的LevelDB或LMDB数据,因此层类型设置为Data;如果输入图片是image,那么这里需要类型需要设置为imagedata。

topbottom: 每一层用bottom来输入数据,用top来输出数据。如果只有top没有bottom,则此层只有输出,没有输入。反之亦然。如果有多个 top或多个bottom,表示有多个blobs数据的输入和输出。
data label: 在数据层中,至少有一个命名为data的top。如果有第二个top,一般命名为label。 这种(data,label)配对是分类模型所必需的。
include: 一般训练的时候和测试的时候,模型的层是不一样的。该层(layer)是属于训练阶段的层,还是属于测试阶段的层,需要用include来指定。如果没有include参数,则表示该层既在训练模型中,又在测试模型中。
Transformations: 数据的预处理,可以将数据变换到定义的范围内。如设置scale为0.00390625,实际上就是1/255, 即将输入数据由0-255归一化到0-1之间,也可以添加均值和裁剪操作。如下:

transform_param {
scale: 0.00390625
mean_file_size: "examples/cifar10/mean.binaryproto"
# 用一个配置文件来进行均值操作
mirror: 1  # 1表示开启镜像,0表示关闭,也可用ture和false来表示
# 剪裁一个 227*227的图块,在训练阶段随机剪裁,在测试阶段从中间裁剪
crop_size: 227
}

[b][b]具体相关解释:[/b][/b]

scale:0.0039就是1/256,将所有像素值从0-256归一到0-1;

crop_size:对输入图像进行随机裁剪一个227*227大小的图片,以哪个像素为中心不确定。

mirror:从数据库中读进来的数据,是否开启随机镜像,避免训练结果过拟合,只在训练阶段有效。这里翻阅源码,注意多通道图像的保存方式为将三个通道的所有像素值组成一个大的数组,然后根据data_index和top_index两个索引完成图片的镜像,为什么是随机镜像,因为镜像是建立在crop的基础上的,而crop又是随机的,所以也是随机镜像。

[b][b]data_param[/b][/b]部分,需要根据输入数据类型的不同,进行不同的设置。具体分为以下几种情况:

(1)数据来自于数据库(如LevelDB和LMDB),上边代码给出的示例就是Data层。

层类型(layer type):Data

必须设置的参数:

  source: 包含数据库的目录名称,如examples/mnist/mnist_train_lmdb

  batch_size: 每次处理的数据个数,如64

可选的参数:
  rand_skip: 在开始的时候,路过某个数据的输入。通常对异步的SGD很有用。
  backend: 选择是采用LevelDB还是LMDB, 默认是LevelDB.

(2)数据来自于图片层类型:ImageData

必须设置的参数:

  source: 一个文本文件的名字,每一行给定一个图片文件的名称和标签(label)

  batch_size: 每一次处理的数据个数,即图片数

可选参数:

  rand_skip: 在开始的时候,路过某个数据的输入。通常对异步的SGD很有用。

  shuffle: 随机打乱顺序,默认值为false

  new_height,new_width: 如果设置,则将图片进行resize

示例:

layer {
name: "data"
type: "ImageData"
top: "data"
top: "label"
transform_param {
mirror: false
crop_size: 227
mean_file: "data/ilsvrc12/imagenet_mean.binaryproto"
}
image_data_param {
source: "examples/_temp/file_list.txt"
batch_size: 50
new_height: 256
new_width: 256
}
}
(3)数据来源于内存



层类型:MemoryData
必须设置的参数:
batch_size:每一次处理的数据个数,比如2
channels:通道数
  height:高度
   width: 宽度
示例:
layer {
top: "data"
top: "label"
name: "memory_data"
type: "MemoryData"
memory_data_param{
batch_size: 2
height: 100
width: 100
channels: 1
}
transform_param {
scale: 0.0078125
mean_file: "mean.proto"
mirror: false
}
}
layer {
name: "conv1"
type: "Convolution"
bottom: "data"
top: "conv1"
param {
lr_mult: 1//权值学习速率倍乘因子,1倍表示与全局参数一直
}
param {
lr_mult: 2//偏倚bias的学习速率倍乘因子,2表示是全局参数的2倍
}
convolution_param {
num_output: 20//20个卷积核,输出20个feature map
kernel_size: 5
stride: 1
weight_filler {
type: "xavier"
//权值填充方式,xavier算法填充weight,根据输入和输出神经元的数量自动确定初始化的规模。具体为xavier是从[-scale, +scale]中进行均匀采样,对卷积层或全连接层中参数进行初始化的方法。其中scale = \sqrt(3 / n), n根据不同实现可设置为n=(num_in + num_out) / 2 (Understanding the difficulty of training deep feedforward neural networks ),或n=num_out (caffe最初实现方法)
}
bias_filler {
type: "constant"//bias的填充方式,常数填充器,默认为0.
}
}
}
池化层或者降采样或者汇合层比较简单,汇合层可以分为最大值池化或者平均值池化,有特征不变,特征降维,一定程度上防止过拟合的作用。这里不予解释。
非线性层也比较简单,常用的就是ReLU函数。
全连接层 原理很简单,说白了就是矩阵乘法运算。正向传导时输出数据等于输入数据 乘上权重,如果有偏置项就再加上偏置项。所以设置输出数为500时,表示全连接之后的一层会有500个节点,每个节点的计算都是所有的输入数据乘以 权重向量或者矩阵,得到每个节点的权重就会有500组,初始化方法在inner_product_param中进行了设定。
layer {
name: "ip1"
type: "InnerProduct"
bottom: "pool2"
top: "ip1"
param {
lr_mult: 1
}
param {
lr_mult: 2
}
inner_product_param {
num_output: 500
weight_filler {
type: "xavier"//权重初始化方法
}
bias_filler {
type: "constant"
}
}
}

accuracy层只在TEST阶段才有效,输入预测结果和标签,得到准确率。

layer {
name: "accuracy"
type: "Accuracy"
bottom: "ip2"
bottom: "label"
top: "accuracy"
include {
phase: TEST
}
}

loss层计算损失函数结果。用来计算损失函数的值,用来初始化ip2的gradient

layer {
name: "loss"
type: "SoftmaxWithLoss"
bottom: "ip2"//需要两个blob,一个是ip2,作为预测用
bottom: "label"//来自数据层,作为标签
top: "loss"
}

solver.prototxt文件解释

# The train/test net protocol buffer definition
net: "examples/mnist/lenet_train_test.prototxt"
# test_iter specifies how many forward passes the test should carry out.
# In the case of MNIST, we have test batch size 100 and 100 test iterations,
# covering the full 10,000 testing images.
test_iter: 100
# Carry out testing every 500 training iterations.
test_interval: 500
# The base learning rate, momentum and the weight decay of the network.
base_lr: 0.01
momentum: 0.9
weight_decay: 0.0005
# The learning rate policy
lr_policy: "inv"
gamma: 0.0001
power: 0.75
# Display every 100 iterations
display: 100
# The maximum number of iterations
max_iter: 10000
# snapshot intermediate results
snapshot: 5000
snapshot_prefix: "examples/mnist/lenet"
# solver mode: CPU or GPU
solver_mode: GPU
test_iter: 100   mnist数据中测试样本总数为10000,一次性执行全部数据效率很低,因此我们将测试数据分成几个批次来执行,每个批次的数量就是batch_size。假设我们设置batch_size为100,则需要迭代100次才能将10000个数据全部执行完。因此test_iter设置为100。执行完一次全部数据,称之为一个epoch。
test_interval: 500  也就是每训练500次,才进行一次测试。

base_lr: 0.01 表示基本学习率

weight_decay: 0.0005

# The learning rate policy

lr_policy: "inv"

gamma: 0.0001

power: 0.75

这几个参数是学习率的设置策略。其中lr_policy可以设置为下面这些值,相应的学习率的计算为:

- fixed:   保持base_lr不变.
- step:    如果设置为step,则还需要设置一个stepsize,  返回 base_lr * gamma ^ (floor(iter / stepsize)),其中iter表示当前的迭代次数
- exp:     返回base_lr * gamma ^ iter, iter为当前迭代次数
- inv:      如果设置为inv,还需要设置一个power, 返回base_lr * (1 + gamma * iter) ^ (- power)
- multistep: 如果设置为multistep,则还需要设置一个stepvalue。这个参数和step很相似,step是均匀等间隔变化,而multistep则是根据                                 stepvalue值变化
- poly:     学习率进行多项式误差, 返回 base_lr (1 - iter/max_iter) ^ (power)
- sigmoid: 学习率进行sigmod衰减,返回 base_lr ( 1/(1 + exp(-gamma * (iter - stepsize))))

各种类型的学习率函数图形如下:







举例如下:
(1)deepid中学习策略的设置。可以根据以上公式计算得到实时的速率。

base_lr: 0.001

lr_policy: "step"

gamma: 0.95

stepsize:  10000

momentum: 0.9

weight_decay: 0.0005

(2)multistep模式时

base_lr: 0.01
momentum: 0.9
weight_decay: 0.0005
# The learning rate policy
lr_policy: "multistep"
gamma: 0.9
stepvalue: 5000
stepvalue: 7000
stepvalue: 8000
stepvalue: 9000
stepvalue: 9500
momentum: 0.9  表示 上一次梯度更新的权重。一般取值在0.5--0.99之间。
momentum 可以让使用SGD的深度学习方法更加稳定以及快速。

具体和随机梯度下降有关,可以查看http://www.cnblogs.com/denny402/p/5074212.html 有相关介绍。

type: SGD

优化算法选择。这一行可以省掉,因为默认值就是SGD。总共有六种方法可选择,相关解释看 http://www.cnblogs.com/denny402/p/5074212.html ,对各种算法进行了解释。

Stochastic Gradient Descent (
type: "SGD"
),
AdaDelta (
type: "AdaDelta"
),
Adaptive Gradient (
type: "AdaGrad"
),
Adam (
type: "Adam"
),
Nesterov’s Accelerated Gradient (
type: "Nesterov"
) and
RMSprop (
type: "RMSProp"
)

weight_decay: 0.0005


权重衰减项,防止过拟合的一个参数。
# Display every 100 iterations
display: 100
# The maximum number of iterations
max_iter: 10000
# snapshot intermediate results
snapshot: 5000
snapshot_prefix: "examples/mnist/lenet"
# solver mode: CPU or GPU
solver_mode: GPU
这些项目比较简单不需要再解释。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐