前面实战训练都已经准备好lmdb格式了,现在开始跑模型了
正常跑模型需要三个基本的train.prototxt和test.prototxt一般这两个网络都是写在一起的,然后还需要solver.prototxt配置文件,关于这三个文件具体的解释这篇博主解释的很好
http://www.cnblogs.com/denny402/tag/caffe/
首先看我们的train_val.prototxt文件这篇博客很详细http://blog.csdn.net/maweifei/article/details/52965523?locationNum=4&fps=1
- //***********************************************************************************************
- name: "LeNet" //[1]网络(Net)的名称为:LeNet
- /***********************************************************************************************
- *模块1:
- * 1--数据层----Data Layer
- * 2--该数据层只在[训练]阶段有效
- ***********************************************************************************************/
- layer { /****[1]定义一个数据层****/
- name: "mnist" //[1]数据层的名字为--mnist
- type: "Data" //[2]层的层类型:Data(数据层)(数据库作为输入)
- top: "data" //[3]数据层的输出blob有两个:data,label(对应生成的CNN图看)
- top: "label"
- include { //[4]include里面的数据说明,该层只在训练阶段有效
- phase: TRAIN
- }
- transform_param { //[5]数据预处理,转换参数的定义
- scale: 0.00390625 //[5]特征归一化系数,将范围为[0,255]的MNIST数据归一化为[0,1]
- }
- data_param { //[6]数据层的参数
- source: "examples/mnist/mnist_train_lmdb"//[1]由于该数据层的数据来源是数据库(由层类型Data指定),
- // 因此,source对应的就是数据库LMDB的路径,也就是训练
- // 数据和测试数据的path
- batch_size: 64 //[2]批量数目,表示caffe一次从数据库LMDB读入的图片的数量
- backend: LMDB //[3]数据库的类型说明区别于LevelDB数据库
- }
- }
- /***********************************************************************************************
- *模块2:
- * 1--数据层----Data Layer
- * 2--一个新的数据层,名字也叫做mnist,输出的blob也是data和label,但是这个数据层只在分类阶段有效,Test
- * 3--图片大小28*28
- ***********************************************************************************************/
- 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
- }
- }
- /***********************************************************************************************
- *模块3:
- * 1--第一个卷积层---Convolution
- * 2--定义一个新的卷积层,卷积层的输入blob为data;输出blob为conv1
- * 3--Convolution层,使用一系列可训练的卷积核(相当于空间滤波的滤波算子)对输入图像进行卷积操作,每组
- * 卷积核生成输出图像中的一个特征图(相当于对输入图像,使用20个不同的滤波算子(卷积)进行20次卷积
- * 之后生成的20张经过滤波的特征图)
- * 4--输出图片大小:(28+2*0-5)/1+1=(img_h+2*pad_h-kernel_h)/stride_h+1======24*24
- ***********************************************************************************************/
- layer {
- name: "conv1"
- type: "Convolution"
- bottom: "data" //[1]卷积层的输入blob为data
- top: "conv1" //[2]卷积层的输出blob为conv1
- param { //[3]卷积层的:权值学习速率倍乘因子,1表示,保持与全局参数一致
- lr_mult: 1
- }
- param { //[4]卷积层的:偏置项的学习速率倍乘因子,是全局参数的2倍
- lr_mult: 2
- }
- convolution_param { //[5]卷积层的计算参数
- num_output: 20 //[1]输出feature map的数目为20,对应的也就是卷积核的数量
- kernel_size: 5 //[2]卷积核的尺寸为:5*5
- stride: 1 //[3]卷积核在输入图片上滑动的步长为:1
- weight_filler { //[6]指定权值的初始化方案为:xavier
- type: "xavier"
- }
- bias_filler { //[7]偏执项的初始化方案为:constant,默认为0
- type: "constant"
- }
- }
- }
- /***********************************************************************************************
- *模块4:
- * 1--第一个池化层---pool1
- * 2--定义一个下采样层(池化层),这个池化层的输入blob为conv1,输出blob为pool1
- * 3--输出图片的大小===12*12
- ***********************************************************************************************/
- layer {
- name: "pool1"
- type: "Pooling"
- bottom: "conv1"
- top: "pool1"
- pooling_param { //[1]池化层(下采样)的参数
- pool: MAX //[1]目前提供了三种池化的方法:最大值池化,均值池化,随机池化
- // 很明显,该池化层使用了最大值池化MAX
- kernel_size: 2 //[2]指定池化窗口的宽度和高度:2*2
- stride: 2 //[3]指定池化窗口在输入数据上滑动的步长为:2
- }
- }
- /***********************************************************************************************
- *模块5:
- * 1--第二个卷积层:conv2
- * 2--该卷积层的输入blob为pool1,输出blob为conv2
- * 3--注意:该卷积层输出的feature map(特征图的数量)为:50
- * 4--输出图片的大小为:(12-2*0-5)/1+1=======8*8
- ***********************************************************************************************/
- layer {
- name: "conv2"
- type: "Convolution"
- bottom: "pool1"
- top: "conv2"
- param {
- lr_mult: 1
- }
- param {
- lr_mult: 2
- }
- convolution_param {
- num_output: 50
- kernel_size: 5
- stride: 1
- weight_filler {
- type: "xavier"
- }
- bias_filler {
- type: "constant"
- }
- }
- }
- /***********************************************************************************************
- *模块6:
- * 1--第二个池化层:pool2
- * 2--该池化层的输入blob为conv2,输出blob为pool2
- ***********************************************************************************************/
- layer {
- name: "pool2"
- type: "Pooling"
- bottom: "conv2"
- top: "pool2"
- pooling_param {
- pool: MAX
- kernel_size: 2
- stride: 2
- }
- }
- /***********************************************************************************************
- *模块7:
- * 1--第一个全连接层
- * 2--该层的输入blob为:pool2,输出blob为iP1
- * 3--注意:全连接层的的输出节点数(num_output==500)可以理解为滤波器的个数(滤波算子的个数),对应的也
- * 就是输出特征图的个数
- ***********************************************************************************************/
- layer {
- name: "ip1"
- type: "InnerProduct"
- bottom: "pool2"
- top: "ip1"
- param {
- lr_mult: 1
- }
- param {
- lr_mult: 2
- }
- inner_product_param { //[1]全连接层的参数:
- num_output: 500 //[1]该层的输出元素的个数为:500
- weight_filler { //[2]指定全连接层的初始化方案:xavier
- type: "xavier"
- }
- bias_filler {
- type: "constant"
- }
- }
- }
- /***********************************************************************************************
- *模块8:
- * 1--新的非线性层(激活函数)(规整化线性单元),此激活层采用的激活函数为:RELU
- * 2--该激活层的输入blob为iP1,输出blob也为iP1
- * 3--该(规整化线性单元)激活层的作用为:对全连接层的每一个输出数据进行判断,当x>0时,RELU的输出为x,
- * 根据X的大小,说明这个单元的激活程度(兴奋程度);如果x<=0,则这个信号(特征图)被完全抑制
- ***********************************************************************************************/
- layer {
- name: "relu1"
- type: "ReLU"
- bottom: "ip1"
- top: "ip1"
- }
- /***********************************************************************************************
- *模块9:
- * 1--第二个全连接层InnerProduct
- * 2--该层的输入blob为iP1,输出blob为ip2
- ***********************************************************************************************/
- layer {
- name: "ip2"
- type: "InnerProduct"
- bottom: "ip1"
- top: "ip2"
- param {
- lr_mult: 1
- }
- param {
- lr_mult: 2
- }
- inner_product_param { //[1]全连接层的计算参数
- num_output: 10 //[1]该层的输出为10个特征,对应0--9这10类数字
- weight_filler { //[2]该层在网络初始化的初始化方案为:xavier
- type: "xavier"
- }
- bias_filler { //[3]给该层添加偏置项,偏置项网络的初始化方案为:constant
- type: "constant"
- }
- }
- }
- /***********************************************************************************************
- *模块10:
- * 1--Accuracy---分类准确率层
- * 2--Accuracy层的作用:该层用来计算网络输出相对于目标值的准确率
- * 3--该层的输入blob为iP2和label,输出blob为accuracy
- * 4--注意:记住该层只在Test(测试)阶段有效,并且,它并不是一个Loss层,所以这次没有BP操作
- ***********************************************************************************************/
- layer {
- name: "accuracy"
- type: "Accuracy"
- bottom: "ip2"
- bottom: "label"
- top: "accuracy"
- include {
- phase: TEST
- }
- }
- /***********************************************************************************************
- *模块11:
- * 1--Loss层,损失层
- * 2--层类型:SoftnaxWithLoss---softmax损失层一般用于计算[多分类问题]的损失,在概念上等同于softmax
- * 层后面跟一个多变量的logistic回归损失层,但能提供更稳定的梯度
- ***********************************************************************************************/
- layer {
- name: "loss"
- type: "SoftmaxWithLoss"
- bottom: "ip2"
- bottom: "label"
- top: "loss"
- }
net: "/home/xhj/hjxu-code/matlabcode/MNIST-TEST/mnist/profile/pro/train_val.prototxt"
test_iter: 100
test_interval: 500
base_lr: 0.01
display: 20
max_iter: 10000
lr_policy: "inv"
gamma: 0.01
momentum: 0.9
weight_decay: 0.0005
stepsize: 5000
snapshot: 5000
snapshot_prefix: "/home/xhj/hjxu-code/matlabcode/MNIST-TEST/mnist/model/caffe_model_mnist"
solver_mode: GPU
type: "SGD"
得到这两个prototxt文件后现在要跑代码,需要调用caffe中的train函数
可以写个sh脚本
#!/usr/bin/env sh
./build/tools/caffe train --solver=examples/mnist/lenet_solver.prototxt $@
或者也可以在终端直接调用,在终端输入
sudo /home/xhj/caffe/build/tools/caffe train -solver /home/xhj/hjxu-code/matlabcode/MNIST-TEST/mnist/profile/solver.prototxt
然后就可以愉快的等模型了