Caffe框架下OPenMV的机器学习(六)训练神经网络

1. 准备prototxt文件

第一章中我们谈到,我们可以借助OPenMV的源码来进一步学习OPenMV神经网络的训练方法

我们打开OPenMV源码的文件夹(没有下载的小伙伴请点击 这里)

cd openmv-master\ml\cmsisnn\models\lenet

进入lenet文件夹,可以看到该文件夹下有五个文件,分别为:

lenet.network (适用于OPenMV的神经网络,是一个二进制文件)

lenet_solver.prototxt (供Caffe使用的配置训练参数的文件)

lenet_train_test.prototxt (网络各层训练和测试的参数)

test.sh (Linux脚本文件,用于测试模型)

train.sh(Linux脚本文件,用于训练模型)

 

我们把后四个文件拷贝到要网络的根目录下备用

 

2.  修改训练参数

步骤说明:

1、进入网络的根目录下

2、打开lenet_solver.prototxt文件

Caffe框架下OPenMV的机器学习(六)训练神经网络_第1张图片

修改红圈的几处地方:

第一处:net: "[lenet_train_test.prototxt文件的存放路径]"

第二处:test_iter: [该数值表示测试每次数据的量]=测试数据总量/batch_size

比如我们有150个测试数据,每次测试10个就只需要测试15次,修改test_iter:15

第三处:最大迭代次数(根据数据集大小设定) 过小精度低,过大会导致震荡

第四处:快照次数,根据训练数据集大小设定

第五处:快照保存的地址

3、打开lenet_train_test.prototxt文件 

下面有注释的地方为应修改处,prototxt文件在执行前删除注释

name: "LeNet"
layer {
  name: "data"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TRAIN
  }
  transform_param {
    scale: 0.00390625
	mean_file: "mean.binaryproto"    //没有均值文件的删除该行
  }
  data_param {
    source: "train_lmdb"             //训练用lmdb文件夹的相对地址
    batch_size: 32                   //训练间隔,一般为64,我的数据集小,使用32
    backend: LMDB
  }
}
layer {
  name: "data"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TEST
  }
  transform_param {
    scale: 0.00390625
	mean_file: "mean.binaryproto"   //没有均值文件的删除该行
  }
  data_param {
    source: "test_lmdb"            //测试用lmdb文件夹的相对地址
    batch_size: 10   //测试间隔,与前一个文件中的test_iter有对应关系 10*15=150(测试数量)
    backend: LMDB    //数据集存储结构
  }
}
layer {
  name: "conv1"
  type: "Convolution"
  bottom: "data"
  top: "conv1"
  param {
    lr_mult: 1
  }
  param {
    lr_mult: 2
  }
  convolution_param {
    num_output: 20
    kernel_size: 5          //如果图片规格小,可以适当减小卷积核的大小
    stride: 1
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
    }
  }
}
layer {
  name: "pool1"
  type: "Pooling"
  bottom: "conv1"
  top: "pool1"
  pooling_param {
    pool: MAX
    kernel_size: 2
    stride: 2
  }
}
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"
    }
  }
}
layer {
  name: "pool2"
  type: "Pooling"
  bottom: "conv2"
  top: "pool2"
  pooling_param {
    pool: MAX
    kernel_size: 2
    stride: 2
  }
}
layer {
  name: "ip1"
  type: "InnerProduct"
  bottom: "pool2"
  top: "ip1"
  param {
    lr_mult: 1
  }
  param {
    lr_mult: 2
  }
  inner_product_param {
    num_output: 100
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
    }
  }
}
layer {
  name: "relu1"
  type: "ReLU"
  bottom: "ip1"
  top: "ip1"
}
layer {
  name: "ip2"
  type: "InnerProduct"
  bottom: "ip1"
  top: "ip2"
  param {
    lr_mult: 1
  }
  param {
    lr_mult: 2
  }
  inner_product_param {
    num_output: 10
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
    }
  }
}
layer {
  name: "accuracy"
  type: "Accuracy"
  bottom: "ip2"
  bottom: "label"
  top: "accuracy"
  include {
    phase: TEST
  }
}
layer {
  name: "loss"
  type: "SoftmaxWithLoss"
  bottom: "ip2"
  bottom: "label"
  top: "loss"
}

 

3.  进行训练

*****.sh 是Linux下的批处理文件,我们首先需要将它修改为windows下的批处理文件:

编写 train.bat : 

caffe train --solver=lenet_solver.prototxt 
pause

参数说明:

- -solver= 训练配置文件

编写 test.bat:

caffe test --model=D:/OPenMV_Network/lenet_train_test.prototxt --weights=D:/OPenMV_Network/print_numbers_iter_1000.caffemodel
pause 

参数说明:

- - model= 指定模型的描述文件

- -weight= 模型训练好的权制文件

 

然后可以运行train.bat对网络进行训练了,训练结果如下:

Caffe框架下OPenMV的机器学习(六)训练神经网络_第2张图片

最后我们生成了四个输出文件:

得到 ******.model 模型文件后,我们就能对图片进行识别和预测了

运行test.bat :

Caffe框架下OPenMV的机器学习(六)训练神经网络_第3张图片

可以看到,所训练模型的准确率有81.8%,因为我们的数据集较小,准确率有所折损

下一章,我们进行神经网络的量化和转换工作,最终要得到兼容OPenMV使用的 ***.network 二进制文件

 

参考资料:

Caffe学习系列(12):训练和测试自己的图片

你可能感兴趣的:(Deep,Learning)