第二课 深度学习的“hello world”——基于mnist数据集的手写数字识别

来源:互联网 发布:淘宝退货运费多少钱 编辑:程序博客网 时间:2024/06/05 16:22

1,下载mnist所需的所有数据

mnist数据集http://yann.lecun.com/exdb/mnist/,这里需要注意的是caffe并不直接通过下载得到的四个文件进行训练,而是会把它转化为lmdb或leveldb格式进行读取。lmdb是lightning(闪电的) memory-mapped database manager的缩写,能够把原始数据通过更为高效的存储方式存储,从而加快读取和训练速度(lmdb比leveldb更快,可以看看刚刚的NugetPackages文件夹,当中就包含着对应的库)。

    实现这个转化的代码是\examples\mnist的convert_mnist_data.cpp,但也没必要看,因为它的运行脚本create_mnist.sh显然是linux下的东西。想了想也可以理解,毕竟caffe本来也不支持windows,能移植过来就不错了,也不能指望大牛们把所有例子的代码都一并移植过来。目前更很好的办法就是直接网盘下载,这里分享一个

链接: https://pan.baidu.com/s/1i44s1JB 密码: ewi8


2,将下载下来的文件夹中的mnist_train_leveldb和mnist_test_leveldb两个文件夹复制到caffe-master\examples\mnist文件夹下


3,修改配置文件。

mnist目录下prototxt扩展名的都是配置文件。我们需要修改lenet_solver.prototxt,用vs2013打开,定位到最后一行:solver_mode: GPU,将GPU改为CPU。



另外需要修改 lenet_train_test.prototxt文件的第14,16,31,33行


8



4,编写bat脚本

在caffe-master根目录下新建一个train_mnist.txt并写入如下内容:

  1. .\Build\x64\Release\caffe.exe train --solver=examples/mnist/lenet_solver.prototxt  
  2. pause  
保存后,改文件后缀名为bat,双击运行,结果如下:

这里写图片描述

当迭代次数达到lenet_solver.prototxt定义的max_iter时,就可以认为训练结束了。并且最终会在目录\examples\mnist下产生训练出的模型(文件后缀名为caffemodel和solverstate),如下图所示:

12


5,用标准数据集测试模型

按上一步骤生成test_mnist.bat,内容如下:

.\Build\x64\Release\caffe.exe test--model=examples/mnist/lenet_train_test.prototxt -weights=examples\mnist\lenet_iter_10000.caffemodel 
pause

双击运行,结果如下:

这里写图片描述




6,用自己的图片测试此模型:

(1)用Windows的画图工具自己手写一张图片(需为28*28像素的灰度图像):

为了方便直接调整写的数字的大小,如果你这里不调整大小,在matlab里面有相关的resize函数,自己查询调用方法,很简单


如下所示:



(2)

查看图片属性:


可以发现,这个保存下来的是RGB图像,三通道(如果是RGB图,位深度是24;如果是灰度和索引图,位深度是8),然而我们的测试集和训练集mnist都是灰度图像,即单通道,所以要用matlab或者python进行图像二值化处理,我这里用的是matlab

image=imread('C:\Users\sun\Desktop\8.png') %载入指定路径下的图像

im=255-rgb2gray(image) %将图像二值化,彩色图像转化为灰度图像,并且将白色背景变为黑色,黑色字体变为白色,突出字体。

imwrite(uint8(im),'C:\Users\sun\Desktop\8.bmp') %以bmp格式保存图片到指定路径


(3)

将二值化后的图片保存到caffe-master\examples\mnist文件夹下,并新建一个标签文件synset_words.txt,填入数字0到9



7,计算均值文件:在.\caffe-master\Build\x64\Release目录下新建bat文件mnist_mean.bat,内容如下:

.\Build\x64\Release\compute_image_mean.exe examples/mnist/mnist_train_leveldb examples/mnist/mean.binaryproto --backend=leveldb

pause

在mnist文件夹中生成mean.binaryproto


8,生成deploy.prototxt

这里参考了苏的专栏:http://blog.csdn.net/lanxuecc/article/details/52474476

用训练好的caffemodel来测试单张图片需要一个deploy.prototxt文件来指定网络的模型构造。 
事实上deploy.prototxt文件与lenet_train_test.prototxt文件类似,只是首尾有些差别。

所以我们可以复制lenet_train_test.prototxt,粘贴到当前文件夹,即lenet_train_test.prototxt副本,将其重命名为deploy.prototxt

用vs2013打开,并修改其中三处代码:

第一:/将原来训练与测试两层数据层data部分用下边代码替换/:

layer { name: "data"

type:"Input"

top:"data"

input_param { shape: { dim:1dim:1dim:28dim:28 } }

}

总得来说,deploy.prototxt就是在lenet_train_test.prototxt的基础上稍作改动,input_param { shape: { dim: 1 dim: 1 dim: 28 dim: 28 } } 这四个dim参数分别是 : 
(1)对待识别样本图片进行数据增广的数量,一个图片会变成10个,之后输入到网络进行识别。如果不进行数据增广,可以设置成1。 
(2)图片的通道数,一般灰度图片为单通道,则值为1,如果为非灰度图3通道图片则为3。 
(3)图片的高度,单位像素。 
(4):图片的宽度,单位像素


第二:/删除了原有的测试模块的测试精度层/


第三:/*输出层的类型由SoftmaxWithLoss变成Softmax,训练是输出时是loss,应用时是prob。*/

layer{

name:"prob"

type:"Softmax"

bottom:"ip2"

top:"prob"

}


9,

在caffe-master根目录下新建mnist_class.txt,并填入下面内容:

.\Build\x64\Release\classification.exe examples/mnist/deploy.prototxt examples\mnist\lenet_iter_10000.caffemodel examples/mnist/mean.binaryproto examples/mnist/synset_words.txt examples/mnist/8.bmp  
pause

改为bat文件,双击运行,结果如下:



bingo! 大功告成!

阅读全文
0 0
原创粉丝点击