经过一天的捣腾,caffe CPU和GPU版都编译完成了,开始动手尝试对手写数字0~9的识别,当然这个网上有很多教程…介于我自己不太喜欢循规蹈矩,希望把文件夹分类合理一点,于是自己改配置文件…又遇到了一堆问题…..
[目录]
需要准备的东西
- 编译好的caffe
- 手写数字训练集
- 一个称手的文本编辑器
我的目录分配及文件介绍
|Caffe_release 本次操作的文件夹
|-CPU 编译好的CPU版本caffe
|-GPU 编译好的GPU版本caffe
|-data 存放各种数据
|-original 下载的手写mnist数据
|-mdb_data 转换为lmdb后存放的位置
|-train 所需训练数据的mdb文件存放
|-test 检验训练数据所需的mdb文件存放
|-model_data 存放训练后产生的model文件
下载数据
mnist手写数据下载地址 [地址]
- train-images-idx3-ubyte.gz: 用于训练的图像 (9912422 bytes)
- train-labels-idx1-ubyte.gz: 训练标记的标签 (28881 bytes)
- t10k-images-idx3-ubyte.gz: 检验图像 (1648877 bytes)
- t10k-labels-idx1-ubyte.gz: 检验标签 (4542 bytes)
下载后解压,得到4个idx3-ubyte
文件
开始训练
生成mdb训练数据
convert_mnist_data.exe
的使用方法我们可以在cmd
下运行convert_mnist_data.exe
看到
也就是说,我们需要 convert_mnist_data.exe 图像数据
标签数据
生成mdb的存放路径
生成mdb训练数据.bat
@echo off
title 生成lmdb训练数据.bat
rem 生成lmdb训练数据.bat
gpu\convert_mnist_data.exe data\original\train-images.idx3-ubyte data\original\train-labels.idx1-ubyte data\mdb_data\train
echo 训练数据完成
gpu\convert_mnist_data.exe data\original\t10k-images.idx3-ubyte data\original\t10k-labels.idx1-ubyte data\mdb_data\test
echo 测试数据完成
pause
*注意:运行之前要确保生成mdb文件目录是不存在的,否则会爆错。
*训练数据和测试数据要放到不同文件夹下,因为转换出来的文件名都是data.mdb
,会出现数据被覆盖或无法写入的问题。
双击运行,得到mdb
文件和一个lock
文件
如果lmdb文件转换失败的话可以下载我转换好的 [百度云]
不过还是要自己动手尝试才好…
使用mdb开始训练
复制 caffe-master\examples\mnist
目录中的 lenet_solver.prototxt
和 lenet_train_test.prototxt
到 \data
这个位置可以自己决定,这两个文件训练的时候要用到
训练数据.bat
@echo off
title 训练数据
echo 按任意键开始训练...
pause>null
gpu\caffe.exe train --solver=.\data\lenet_solver.prototxt
pause
当然,lenet_solver.prototxt
和lenet_train_test.prototxt
包含了训练参数,我们需要改一改
lenet_solver.prototxt :
# 下面要填入lenet_train_test存放的位置
net: "data/lenet_train_test.prototxt"
#中间的一部分可以不管
# test_iter specifies how many forward passes the test should carry out.
# In the case of MNIST, we have test batch size 100 and 100 test iterations,
# covering the full 10,000 testing images.
test_iter: 100
# Carry out testing every 500 training iterations.
test_interval: 500
# The base learning rate, momentum and the weight decay of the network.
base_lr: 0.01
momentum: 0.9
weight_decay: 0.0005
# The learning rate policy
lr_policy: "inv"
gamma: 0.0001
power: 0.75
# Display every 100 iterations
display: 100
# The maximum number of iterations
max_iter: 10000
# snapshot intermediate results
snapshot: 5000
#snapshot_prefix说的是训练结果model以及训练过程中快照文件的存放位置
#-----注意:data/model_files/mnist意思是生成在model_files下,文件前缀为mnist
snapshot_prefix: "data/model_files/mnist"
# solver mode: CPU or GPU,我这里使用GPU训练
solver_mode: GPU
lenet_train_test.prototxt :
双击训练数据.bat
,开始训练,GPU跑起来还是很快的
任务管理器里也能看到GPU跑起来了
在生成了model
模型文件和solverstate
快照文件
训练过程及结果:
I0817 17:36:24.566505 29404 solver.cpp:228] Iteration 9900, loss = 0.00333216
I0817 17:36:24.566505 29404 solver.cpp:244] Train net output #0: loss = 0.00333178 (* 1 = 0.00333178 loss)
I0817 17:36:24.567502 29404 sgd_solver.cpp:106] Iteration 9900, lr = 0.00596843
I0817 17:36:25.081128 29404 solver.cpp:454] Snapshotting to binary proto file data/model_files/mnist_iter_10000.caffemodel
I0817 17:36:25.095091 29404 sgd_solver.cpp:273] Snapshotting solver state to binary proto file data/model_files/mnist_iter_10000.solverstate
I0817 17:36:25.101075 29404 solver.cpp:317] Iteration 10000, loss = 0.00350113
I0817 17:36:25.101075 29404 solver.cpp:337] Iteration 10000, Testing net (#0)
I0817 17:36:25.292563 29404 solver.cpp:404] Test net output #0: accuracy = 0.9919
I0817 17:36:25.293560 29404 solver.cpp:404] Test net output #1: loss = 0.027295 (* 1 = 0.027295 loss)
I0817 17:36:25.293560 29404 solver.cpp:322] Optimization Done.
I0817 17:36:25.293560 29404 caffe.cpp:255] Optimization Done.
loss
代表的是丢失量,随着训练内容的增多,这个值会逐渐减小
最终的准确率是0.9919,十分不错
识别自己手写的内容
关于测试方法按照还是选择bat文件,当然python、matlab更为方便,比如可以迅速把识别错误的图片显示出来。但是当时编译caffe的时候并没有启用Python和MATLAB支持,所以还是用bat
首先我们需要考虑怎样让图片分类更加准确。
一、生成均值文件mean.binaryproto(可选)
在进行分类之前首先需要产生所有图片的平均值图片,真正分类时的每个图片都会先减去这张平均值图片再进行分类。这样的处理方式能够提升分类的准确率。
在生成的解决方案中有一个compute_image_mean.exe
,利用该文件可以生成均值文件
先来看看compute_image_mean.exe
的使用方法
compute_image_mean.exe 训练生成的mdb文件 输出均值文件
均值文件mean.binaryproto生成.bat
@echo off
title 生成均值文件
echo 按任意键生成均值文件mean.binaryproto
pause>NUL
gpu\compute_image_mean.exe data\mdb_data\train \mean.binaryproto --backend=lmdb
pause
--backend=lmdb
意思是我们用的数据集是lmdb
类型,如果你的数据集类型是leveldb
,则需要更改为--backend=leveldb
注意:指定*.mdb路径不需要写上mdb文件的文件名,如果gpu\compute_image_mean.exe data\mdb_data\train\data.mdb
会提示找不到路径…..我自己在这个地方困住了好久….竟然是这种问题…[(┬_┬)]
采坑记录
- 编写bat的时候要注意是否有
\
,caffe对参数对准确表达要求很高,有些地方不同于日常Windows批处理路径编写格式 - 产生均值文件的时候路径参数不需要制定到mdb文件,填写mdb文件所在的目录即可