环境:
Win10+python3.5+CUDA8.0+Caffe1+GTX1060 3G
首先,环境搭建.
- 默认已装好cuda8.0+cuDNN6.0.
- caffe的安装参考我上一篇博文.
第二,数据准备.
- 准备好trainlmg和testlmg文件.
- 计算均值
第三,微调网络结构
- github上https://github.com/shicai/MobileNet-Caffe下载模型和.protutxt.
- 复制mobilenet_deploy.prototxt,命名为train.prototxt,修改如下
- 这里把第一层给换为了两层,
name: "MOBILENET"
layer {
name: "data_train"
type: "ImageData"
top: "data"
top: "label"
include {
phase: TRAIN # TRAIN,表示训练时使用
}
transform_param {
scale: 0.00390625 # 1/255,图像归一化
mirror: true # 是否镜像,视情况而定
crop_size: 224 # 输入到网络的图像的尺寸
mean_value: [112.24, 115.46, 117.84] # 训练集的图像的三个通道的均值
}
image_data_param {
source: "train_txt.txt" # 你的trainImg.txt,形如 0\0.jpg 0
0\1.jpg 0
0\10.jpg 0
0\100.jpg 0
0\1000.jpg 0
0\1001.jpg 0
batch_size: 10 # 你的batc size
new_height: 224 # 如果设置了,就是把原始的输入图像resize成new_*的尺寸,前面的crop_size是随机采集的尺寸
new_width: 224
shuffle:true # 是否打散数据
root_folder: "D:\\work\\data-backandcard\\trainImg\\" # 你训练图像的地址的前半段,
# 其实某个图像的地址就是 root_folder + trainImg.txt,
# 注意两个\\,或者一个/
}
}
layer {
name: "data_test"
type: "ImageData"
top: "data"
top: "label"
include {
phase: TEST # TEST,表示测试时使用
}
transform_param {
scale: 0.00390625
mirror: true
crop_size: 224
mean_value: [112.24, 115.46, 117.84]
}
image_data_param {
source: "test_txt.txt"
batch_size: 10
new_height: 224
new_width: 224
shuffle:true
root_folder: "D:\\work\\data-backandcard\\testImg\\"
}
}
- 针对最后一层
layer {
name: "myfc7" # 原本是"fc7",最好改一下新的,有人说如果不改,可能不会改变模型结构
type: "Convolution"
bottom: "pool6"
top: "myfc7" # 所有的"fc7"均改为新的,例如我的"myfc7"
param {
lr_mult: 10 # 把学习率调高,加速收敛
decay_mult: 1
}
param {
lr_mult: 20 # 把学习率调高,加速收敛
decay_mult: 0
}
convolution_param {
num_output: 13 # 修改你的输出类别数
kernel_size: 1
weight_filler {
type: "msra"
}
bias_filler {
type: "constant"
value: 0
}
}
}
layer {
name: "loss"
type: "SoftmaxWithLoss"
bottom: "myfc7" # 这里改
bottom: "label"
top: "loss"
}
layer {
name: "top1/acc"
type: "Accuracy"
bottom: "myfc7" # 这里
bottom: "label"
top: "top1/acc"
include {
phase: TEST
}
accuracy_param {
top_k: 1
}
}
layer {
name: "top5/acc"
type: "Accuracy"
bottom: "myfc7" # 这里
bottom: "label"
top: "top5/acc"
include {
phase: TEST
}
accuracy_param {
top_k: 5
}
}
- 修改solver.prototxt, 用于定义训练的参数
net: "train.prototxt" # train.prototxt的路径,最好写绝对路径
test_iter: 170 # 你的 总测试样本数 / batchsize ,大约是这样,一个整数
test_interval: 2000 # 你的 总训练样本数 /batchsize
base_lr: 0.0001 # 初试学习率,对训练影响巨大,如果你的loss一直=87.3...,很可能是这个原因
lr_policy: "step" # 梯度下降的方式
gamma: 0.1 # 一般是这个值
stepsize: 1999 # 每多少的iter下降一次学习率
display: 10 # 每多少iter打印一下loss
max_iter: 10000 # 最大迭代次数,一般是test_interval的3-6倍
momentum: 0.9 # 一般是这个
weight_decay: 0.0005 # 一般是这个
snapshot: 5000 # 每多少次iter保存一下caffe的model,同时也会打印top1 和 top5 准确率,如果你的硬盘空间充足可以设小一点,反正MobileNet很小,20M不到
snapshot_prefix: "./model/mobilenet" # caffemodel的保存路径和保存名称,如"model"文件夹下记得要新建,他的名字是mobilenet_iter_1000.caffemodel
solver_mode: GPU # 使用GPU训练
- 训练,cmd下输入如下,回车
具体的路径依自己的而定D:\caffe\bin\caffe.exe train -solver .\solver.prototxt -weights D:\caffe\models\MobileNet\Mobilenet.caffemodel -gpu all
- 下一篇将介绍如何将caffe的模型与Opencv的Dnn模块结合起来使用