Layers
欲创建一个Caffe模型,你需要在一个协议文件(prototxt)中定义你的模型结构
caffe的层级及其参数又定义在了官方的协议文件caffe.proto中
数据集准备
将自己的训练集转换为LMDB的caffe支持数据库格式;
不难理解,这一步就是将你庞杂的图像训练集整合到一个数据库文件中,具体操作是将每一个需要用到的图像的路径 以及它的分类标签按照:
路径 + 空格 + 分类号
的格式整合在一个train.txt文本文件中。如果数据分散在不同的文件夹中,也大可使用绝对路径,因为生成了LMDB文件后将不再需要用到这些文件的实体,仅仅在生成的过程时要保证路径的正确性。
- 怎样来生成这样一个txt文件?
可以利用高级语言(python、c++、java等 我用的是python 可以根据自己的需求对症下药)的文件读写操作读取文件列表信息并按照格式写入train.txt,这件事情其实很简单。
如果数据通道统一:
#!/usr/bin/env sh (linux下包含sh)
# 包含训练和验证图像的文件夹
TRAIN_DATA_ROOT=/path/to/training/images
# 包含具有训练图像名称文件的文件夹
DATA=/path/to/file
# lmdb数据设定文件夹
OUTPUT=/path/to/output/directory
TOOLS=/path/to/caffe/build/tools
# 将图像设置为指定大小(px)
RESIZE_HEIGHT=256
RESIZE_WIDTH=256
echo "Creating train lmdb..."
# 如果不需要打乱顺序则注释shuffle行
GLOG_logtostderr=1 $TOOLS/convert_imageset
--resize_height=$RESIZE_HEIGHT
--resize_width=$RESIZE_WIDTH
--shuffle
$TRAIN_DATA_ROOT/
$DATA/train.txt
$OUTPUT/mydataset_train_lmdb
echo "Done."
训练
训练要求:
train_val.prototxt
:定义网络架构、初始化参数和本地学习速度solver.prototxt
:定义优化/训练参数,并作为调用的实际文件来训练深度网络deploy.prototxt
:仅在测试中使用。必须与train_val.prototxt
完全相同,输入层、损失层和权重初始化(例如weight_filler
)除外,因为后两个在deploy.prototxt
中不存在。
name
和
top
通常是相同的。
以LeNet为例:
solver.prototxt
# 训练/验证网络协议--训练框架
net:"examples/mnist/lenet_train_test.prototxt"
# batch_size = 1 : 在一次批处理中向前传播遍历所有图片
# 每500次训练迭代 验证1次
test_interval:500
# test_iter指定了需要执行多少次向前传播的验证测试
# 推荐填写num_val_imgs 或 batch_size (batch_size的数值在测试阶段数据层中的train_test.prototxt里)
test_iter:100
# 网络的学习率, 学习参数和权重衰减.
base_lr:0.01
momentum:0.9
weight_decay:0.0005
# 最初会迅速的靠近局部最小值,然后会在很接近时放慢速度
# 之后,有多种学习策略可供选择:
# fixed: 总是返回 base_lr.
# step: 返回 base_lr * gamma ^ (floor(iter / step))
# exp: 返回 base_lr * gamma ^ iter
# inv: 返回 base_lr * (1 + gamma * iter) ^ (- power)
# multistep: 和step法差不多但是允许不均匀的步长值定义
# poly: 遵循一个衰减多项式的有效学习率(从0到max_iter): return base_lr (1 - iter/max_iter) ^ (power)
# sigmoid: 遵循sigmod衰变: 返回base_lr * ( 1/(1 + exp(-gamma * (iter - stepsize))))
lr_policy:"step"
gamma:0.1
stepsize:10000 # 步长:根据一个γ因子,每stepsize次迭代降低学习率
# 每100次迭代提示一次
display:100
# 最大迭代数
max_iter:10000
# 中间结果的快照,也就是每5000次迭代会存储一份权值快照
snapshot:5000
snapshot_prefix:"examples/mnist/lenet_multistep" #保存快照的路径
# solver mode:CPU 或 GPU
solver_mode:CPU
划几个重点:
- batch_size过小,造成效率低下,过大则达到同样精度时间过长,batch_size的选择并没有一个准绳
- 可以在快照snapshot的基础上继续训练,记得要保存snapshot,如果遇到断电什么的不要着急
- 可在几次训练后适当降低学习率base_lr