从一到二:利用mnist训练集生成的caffemodel对mnist测试集与自己手写的数字进行测试
通过从零到一的教程,我们已经得到了通过mnist训练集生成的caffemodel,主要包含下面四个文件:

接下来就可以利用模型进行测试了。关于测试方法按照上篇教程还是选择bat文件,当然python、matlab更为方便,比如可以迅速把识别错误的图片显示出来。
一、均值文件mean.binaryproto
在进行分类之前首先需要产生所有图片的平均值图片,真正分类时的每个图片都会先减去这张平均值图片再进行分类。这样的处理方式能够提升分类的准确率。
产生均值文件的方法是利用解决方案中的compute_image_mean.exe,位于目录\caffe-windows\Build\x64\Release下。回到caffe-windows根目录下创建一个mnist_mean.txt,写入如下内容:

将后缀名改为bat后双击运行(其实写了那么多bat文件也应该有体会了,只要指定的路径正确就行,不一定非要放在caffe-windows根目录下)。正确运行的话会在根目录下产生一个mean.binaryproto,也就是我们所需要的均值文件。接着为了使用均值文件需要稍微修改下层的定义。所以打开\examples\mnist\lenet_train_test.prototxt,做如下修改:

到此为止,均值文件的预处理部分处理完毕,下面就可以进行测试了。
二、利用mnist测试集进行测试
这部分比较简单,因为之前生成的Caffe.exe就可以直接用来进行测试。同样地在caffe-windows目录下新建mnist_test.txt,并写入如下内容(其中的间断处都为一个空格)。

意思也显而易见,首先指定为测试模式,随后指定模型和训练出来的参数。
将后缀名改为bat后双击运行,结果如下所示:
左侧的内容依旧是GLOG的记录日志,右侧中的Batch需要和网络参数初始中的batch_size一起理解。每个Batch中包含了batch_size张测试图片,所以每个Batch的准确率是对这batch_size张测试图片整体而言的。而不是像我最初一样先入为主地以为准确率应该是对每张测试图片而言,故只有0和1两种情况。
这边个人也有个小问题,Batch之所以为0-49共50个是由caffe.cpp中一个叫做FLAGS_iterations的变量指定的,但是找来找去实在无法确定这个变量是否是由网络参数确定的,之后再好好看一下代码。
这个准确率不能说特别好,因为我有空也尝试过Tensorflow,Tensorflow官方文档中的一个多层卷积网络对mnist测试集的准确率为99.2%左右。不过到此为止我们已经完成了mnist测试集在caffe上的运行和测试。
三、利用自己的手写数字进行测试
主要参考了http://blog.csdn.net/zb1165048017/article/details/52217772这篇文章,不过还是有些细节需要更改。
(1)首先可以按照上面网址教程中的第六和第七步在\examples\mnist目录下生成手写的一个28*28像素数字的bmp文件和一个标签文件label.txt。比如我手写的数字如下图所示:
这里需要注意的是上述教程中的matlab代码最后一句需要更改。例如我已经将matlab的工作目录设为\caffe-windows\examples\mnist,就可以直接输入(test1为我的手写数字文件名):

(2)之后就可以调用之前生成的classification.exe进行分类。同样的在caffe-windows目录下新建test_personaldig.txt并写入如下内容:

中间的三行其实是每个加一个空格后跟在examples\mnist\lenet.prototxt的后面,这里为了显示地更加清楚而进行了换行。更改后缀为bat后就可以双击运行,会出现类似下面的内容:

可见分类结果正确。让我们再来测试一个下图写得一个比较飘逸的5。

分类结果还是正确的。

四、后记
到此为止我们已经完成了利用mnist测试集对生成的模型进行准确率测试,并成功对自己手写的数字进行了识别,总之效果还不差。然而至此教程甚至根本没有提及过卷积神经网络,可见caffe的确可以让一个完全不懂卷积神经网络原理的人通过不断手动调整参数完成学习,实现分类等目标,甚至还能取得非常不错的效果。就像程序员和数学的关系一样,知晓了卷积神经网络的详细原理对我们使用caffe只有好处没有坏处,并且要真正做到看懂caffe的每个模块必须了解卷积神经网络。博主自己也正在深入学习卷积神经网络,这里推荐一个非常好的入门资料CS231n Convolutional Neural Networks for Visual Recognition
http://cs231n.github.io/convolutional-networks/
上面网址中的教程对卷积神经网络的基础知识讲述得非常透彻清楚。但如果想继续了解其中的数学推导的话,建议再看下面这篇文章:
Notes on Convolutional Neural Networks, Jake Bouvrie
从一到二:利用mnist训练集生成的caffemodel对mnist测试集与自己手写的数字进行测试的更多相关文章
- 利用mnist训练集生成的caffemodel对mnist测试集与自己手写的数字进行测试
从一到二:利用mnist训练集生成的caffemodel对mnist测试集与自己手写的数字进行测试 通过从零到一的教程,我们已经得到了通过mnist训练集生成的caffemodel,主要包含下面四个文 ...
- TensorFlow下利用MNIST训练模型并识别自己手写的数字
最近一直在学习李宏毅老师的机器学习视频教程,学到和神经网络那一块知识的时候,我觉得单纯的学习理论知识过于枯燥,就想着自己动手实现一些简单的Demo,毕竟实践是检验真理的唯一标准!!!但是网上很多的与t ...
- 利用TensorFlow识别手写的数字---基于两层卷积网络
1 为什么使用卷积神经网络 Softmax回归是一个比较简单的模型,预测的准确率在91%左右,而使用卷积神经网络将预测的准确率提高到99%. 2 卷积网络的流程 3 代码展示 # -*- coding ...
- 利用TensorFlow识别手写的数字---基于Softmax回归
1 MNIST数据集 MNIST数据集主要由一些手写数字的图片和相应的标签组成,图片一共有10类,分别对应从0-9,共10个阿拉伯数字.原始的MNIST数据库一共包含下面4个文件,见下表. 训练图像一 ...
- 使用Tensorflow和MNIST识别自己手写的数字
#!/usr/bin/env python3 from tensorflow.examples.tutorials.mnist import input_data mnist = input_data ...
- 基于tensorflow的MNIST手写数字识别(二)--入门篇
http://www.jianshu.com/p/4195577585e6 基于tensorflow的MNIST手写字识别(一)--白话卷积神经网络模型 基于tensorflow的MNIST手写数字识 ...
- 数据挖掘入门系列教程(八)之使用神经网络(基于pybrain)识别数字手写集MNIST
目录 数据挖掘入门系列教程(八)之使用神经网络(基于pybrain)识别数字手写集MNIST 下载数据集 加载数据集 构建神经网络 反向传播(BP)算法 进行预测 F1验证 总结 参考 数据挖掘入门系 ...
- Tensorflow实现MNIST手写数字识别
之前我们讲了神经网络的起源.单层神经网络.多层神经网络的搭建过程.搭建时要注意到的具体问题.以及解决这些问题的具体方法.本文将通过一个经典的案例:MNIST手写数字识别,以代码的形式来为大家梳理一遍神 ...
- TensorFlow 入门之手写识别(MNIST) 数据处理 一
TensorFlow 入门之手写识别(MNIST) 数据处理 一 MNIST Fly softmax回归 准备数据 解压 与 重构 手写识别入门 MNIST手写数据集 图片以及标签的数据格式处理 准备 ...
随机推荐
- Eclipse下Tomcat常用设置
Eclipse下Tomcat常用设置 1,Eclipse建立Tomcat服务 1.1 新建Server 首先这里是指,jee版的Eclipse.Eclipse是没有像MyEclipse那样集成Tomc ...
- 你能在windows上创建一个叫做AUX的文件夹吗?
Windows的文件名不能有如下这些特殊符号,这个大家都比较熟悉了. < (less than) > (greater than) : (colon) " (double quo ...
- 【Android - V】之ViewPager的使用
ViewPager是Android V4包中的一个控件,常常用来作为首页的滚动广告,也常常结合Fragment来实现页面的切换效果. ViewPager和ListView有很多相似的地方,都是适配器控 ...
- 开发期间的GWT设置---加快编译速度
随着项目功能的完善,GWT模块(Module)越来越多,当要以web模式编译给测试组使用时,编译的总时间越来越多,我的机器编译完8个模块,需要10分钟左右. 抽空研究了一下GWT的编译参数和GWT编译 ...
- SpringMVC ModelAndView方法与模板传参接收不到问题
最近在使用Spring MVC做项目时,碰到一个问题,就是通过ModelAndView与前端模板页面通信时,一直无法在模板中显示出来传过去的参数值. 在网上也查了好久,就是不知道是啥问题,很是郁闷. ...
- 熟练掌握HDFS的Java API接口访问
HDFS设计的主要目的是对海量数据进行存储,也就是说在其上能够存储很大量文件(可以存储TB级的文件).HDFS将这些文件分割之后,存储在不同的DataNode上, HDFS 提供了两种访问接口:She ...
- [转] JavaScript中的属性:如何遍历属性
在JavaScript中,遍历一个对象的属性往往没有在其他语言中遍历一个哈希(有些语言称为字典)的键那么简单.这主要有两个方面的原因:一个是,JavaScript中的对象通常都处在某个原型链中,它会从 ...
- Call Directory Extension 初探
推荐序 本文介绍了 iOS 10 中的 Call Directory Extension 特性,并且最终 Demo 出一个来电黑名单的 App. 作者:余龙泽,哈工大软件工程大四学生,之前在美图公司实 ...
- RxJava使用场景小结
一.Scheduler线程切换 这种场景经常会在“后台线程取数据,主线程展示”的模式中看见 Observable.just(1, 2, 3, 4) .subscribeOn(Schedulers.io ...
- 修改android应用包名 分类: android 学习笔记 2015-07-16 22:48 4人阅读 评论(0) 收藏
由于项目需要,要修改已经开发好的应用包名,这本身很简单,但是如果你没找到门道,可能会白白浪费许多时间. 修改包名有三个地方要改,这三个地方的修改一定要按顺序来,否则你可能会遇到许多不必要的麻烦. 1. ...