Caffe-Windows手写数字识别训练记录

版权声明:Houiin https://blog.csdn.net/w670165403/article/details/81779571

经过一天的捣腾,caffe CPU和GPU版都编译完成了,开始动手尝试对手写数字0~9的识别,当然这个网上有很多教程…介于我自己不太喜欢循规蹈矩,希望把文件夹分类合理一点,于是自己改配置文件…又遇到了一堆问题…..


[目录]

需要准备的东西

  1. 编译好的caffe
  2. 手写数字训练集
  3. 一个称手的文本编辑器

我的目录分配及文件介绍

|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
也就是说,我们需要 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.prototxtlenet_train_test.prototxt\data
这个位置可以自己决定,这两个文件训练的时候要用到

训练数据.bat
@echo off
title 训练数据
echo 按任意键开始训练...
pause>null
gpu\caffe.exe train --solver=.\data\lenet_solver.prototxt
pause 

当然,lenet_solver.prototxtlenet_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会提示找不到路径…..我自己在这个地方困住了好久….竟然是这种问题…[(┬_┬)]


采坑记录

  1. 编写bat的时候要注意是否有\,caffe对参数对准确表达要求很高,有些地方不同于日常Windows批处理路径编写格式
  2. 产生均值文件的时候路径参数不需要制定到mdb文件,填写mdb文件所在的目录即可

参考资料

从一到二:利用mnist训练集生成的caffemodel对mnist测试集与自己手写的数字进行测试

猜你喜欢

转载自blog.csdn.net/w670165403/article/details/81779571