caffe 网络设计 设计自己的小网络

在caffe/src/caffe/proto/caffe.proto中有详细讲述网络参数的意义。这个proto文件用的protobuf写的,关于protobuf可参考 Google protobuf使用之proto文件编写规则

理解了caffe.prtoto文件后,就能仿照Alexnet等Prototxt文件写自己的小网络了。

下面仿照AlexNet写自己的小网络。

train_val.prototxt

以Alexnet为例讲述prototxt中参数的意义:
layer {
name: "conv1"
type: "Convolution"
bottom: "data"
top: "conv1"
param {
lr_mult: 1 #第一个是权值的学习率
decay_mult: 1 #权值衰减系数
}
param {
lr_mult: 2 #第二个是偏置的学习率
decay_mult: 0 #没意义
}
convolution_param {
num_output: 96
kernel_size: 11
stride: 4
weight_filler { #权值初始化
type: "gaussian"
std: 0.01
}
bias_filler { #偏置初始化
type: "constant"
value: 0
}
}
}

lr_mult
学习率,但是最终的学习率需要乘以 solver.prototxt 配置文件中的 base_lr .

如果有两个 lr_mult, 则第一个表示 weight 的学习率,第二个表示 bias 的学习率
一般 bias 的学习率是 weight 学习率的2倍’

decay_mult
权值衰减,为了避免模型的over-fitting,需要对cost function加入规范项。

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_filler
权值初始化。 默认为“constant”,值全为0.
很多时候我们用”xavier”算法来进行初始化,也可以设置为”gaussian”

bias_filler
偏置项的初始化。一般设置为”constant”, 值全为0。

bias_term

是否开启偏置项,默认为true, 开启

group
分组,默认为1组。如果大于1,我们限制卷积的连接操作在一个子集内。
卷积分组可以减少网络的参数,至于是否还有其他的作用就不清楚了。

每个input是需要和每一个kernel都进行连接的,但是由于分组的原因其只是与部分的kernel进行连接的
如: 我们根据图像的通道来分组,那么第i个输出分组只能与第i个输入分组进行连接。

pool
池化方法,默认为MAX。目前可用的方法有 MAX, AVE, 或 STOCHASTIC

dropout_ratio
丢弃数据的概率

solver.prototxt

在我们就来准备训练参数文件,在./caffe/forkrecognition/目录下面新建一个名为solver的prototxt文件,并在里面撰写如下代码:

net: "/home/meng/caffe/examples/imagenet/myself/train_val.prototxt" #这个要改成自己的目录
test_iter: 1000
test_interval: 200
base_lr: 0.01
lr_policy: "step"
gamma: 0.1
stepsize: 2000
display: 20
max_iter: 10000
momentum: 0.9
weight_decay: 0.0005
snapshot: 1000
snapshot_prefix: "/home/meng/caffe/examples/imagnet/myself/alexnet_train" #这个也要改成自己的目录
solver_mode: GPU

test_iter
在测试的时候,需要迭代的次数,即test_iter* batchsize(测试集的)=测试集的大小,测试集的 batchsize可以在prototx文件里设置。

test_interval
训练的时候,每迭代test_interval次就进行一次测试。

momentum
灵感来自于牛顿第一定律,基本思路是为寻优加入了“惯性”的影响,这样一来,当误差曲面中存在平坦区的时候,SGD可以更快的速度学习。

train_caffenet.sh

在myself下新建train_caffenet.sh,然后写入:

!/usr/bin/env sh

set -e

/home/meng/caffe/build/tools/caffe train
--solver=/home/meng/caffe/examples/imagenet/myself/solver.prototxt $@

在终端写./train_caffenet.sh就可以训练了

参考:
以AlexNet为例讲述如何设计自己的网络,讲如何写train_val.prototxt
接上一个参考博客,讲如何写solver.prototxt

posted on 2017-10-24 23:12  MissSimple  阅读(1020)  评论(0编辑  收藏  举报

导航