windows下caffe+CPUOnly实现MNIST手写分类

 

工具下载

微软官方移植的Caffe:https://github.com/Microsoft/caffe

对属性表的操作

需要把实例属性表的后缀改成vs可用的.props

打开同一个文件夹下的Caffe.sln,查看其中的属性表

<CpuOnlyBuild>true</CpuOnlyBuild>

       <UseCuDNN>false</UseCuDNN>

分别指的是只利用CPU的环境和利用GPU进行CUDA编程,只能二选一,保持一个为true。

如果想进行CUDA编程首先要确保自己的GPU是英伟达NVIDIA的,然后在https://developer.nvidia.com/cudnn下载cuDNN(CUDA Deep Neural Network library),一个专门为深度神经网络提供GPU加速的库。下载好解压缩之后,

 <!-- CuDNN 4 and 5 are supported -->

       <CuDnnPath></CuDnnPath>

要填写cuDNN的路径。

解决方案

可以看到,解决方案中有16个项目(不用数,有显示)。我们最关注的是caffe和libcaffe。

对caffe:

右击“解决方案‘Caffe’”,选择“属性”,将“配置属性”-“配置”修改成Release和x64

(这一步是使用Release来进行编译,若用Debug,则之后每次都要打开vs,会不方便)

注意:在上图顶部工具栏中的“解决方案配置”和“解决方案平台”框,若你的vs2013中将这两个框在工具栏中显示,则要在工具栏中将配置改成Release和x64,否则直接右击“解决方案Caffe”来更改配置是无效的。

对libcaffe:

右击解决方案中的libcaffe项目,选择“属性”,在打开的属性页中选择“C/C++”-“常规”,将“将警告视为错误”设为“否。然后右击libcaffe项目,生成。期间会利用NuGet对caffe的一些依赖文件进行自动还原。同时会在caffe-master的同级目录生成文件夹NugetPackages。里面是一些依赖库(包括OpenCV),这也是选择windows版caffe的好处。

这时候就可以生成解决方案了。但是打开解决方法的属性可以看到默认的是只编译libcaffe。我们可以选择编译其他项目。

此时在\caffe-master目录下会生成Build文件夹,即为我们编译成功的文件夹,而\caffe-master\Build\x64\Release目录下则会有我们编译出的caffe.exe执行文件。

MINIST下载、转换和训练

这是一个手写数字数据集,有60,000个训练样本,10,000个测试样本,测试集和训练集是没有交集的。数字尺寸都已经标准化,并且保证数字在图像中心。数字是20x20像素的,图像是28x28像素大小。

下载地址:http://yann.lecun.com/exdb/mnist/

train-images-idx3-ubyte.gz:  training set images (9912422 bytes)

train-labels-idx1-ubyte.gz:  training set labels (28881 bytes)

t10k-images-idx3-ubyte.gz:   test set images (1648877 bytes)

t10k-labels-idx1-ubyte.gz:   test set labels (4542 bytes)

图像是以矩阵在一个特殊的格式中存储的,所以是无法直接打开查看的。若发现下载的文件比官方给出的大,则说明浏览器已经自动解压缩了。这个时候只需要重命名就可以移除.gz文件了。

这四个文件不能直接用于caffe的训练和测试。需要利用生成的Release中的convert_mnist_data.exe把四个文件转换为caffe所支持的leveldb或lmdb文件。lmdb是lightning(闪电的) memory-mapped database manager的缩写,能够把原始数据通过更为高效的存储方式存储,从而加快读取和训练速度(lmdb比leveldb更快,可以看看刚刚的NugetPackages文件夹,当中就包含着对应的库)。具体转换方法如下:

a)      四个文件放到 . \examples\mnist\mnist_data文件夹下。

b)      在caffe-windows安装的根目录下,新建一个convert-mnist-data-train.bat文件转换为训练数据,并在文件中添加代码:

Build\x64\Release\convert_mnist_data.exe--backend=lmdbexamples\mnist\mnist_data\train-images.idx3-ubyteexamples\mnist\mnist_data\train-labels.idx1-ubyteexamples\mnist\mnist_data\mnist_train_lmdb 

Pause

再新建一个convert-mnist-data-test.bat转换测试数据,代码为:

Build\x64\Release\convert_mnist_data.exe--backend=lmdb examples\mnist\mnist_data\t10k-images.idx3-ubyteexamples\mnist\mnist_data\t10k-labels.idx1-ubyteexamples\mnist\mnist_data\mnist_test_lmdb 

Pause

运行

a)      转换好的训练\测试数据集(mnist_train_lmdb\ mnist_train_lmdb或mnist_train_leveldb\mnist_train_leveldb)文件夹放在.\examples\mnist中。

b)      修改lenet_solver.prototxt 中solver_mode: CPU;修改lenet_train_test.prototxt中

source:"examples/mnist/mnist_train_lmdb"

source:"examples/mnist/mnist_test_lmdb"

backend: LMDB

保证训练集和测试集的路径正确。

c)      在caffe-windows根目录下新建一个run.bat,文件中代码:

Build\x64\Release\caffe.exe  train--solver=examples/mnist/lenet_solver.prototxt 

Pause

d)      保存并双击运行run.bat,会开始打印一些日志文件。当迭代次数达到lenet_solver.prototxt定义的max_iter时,就可以认为训练结束了。训练完成后会在examples/mnist生成 .caffemodel 文件和 .solverstate 文件。分别是训练一半和训练结束的结果。

Ps:lenet_solver.prototxt是examples/mnist下的.prototxt文件。定义了网络的结构。可以用vs打开。

solver.prototxt是solver配置文件,规定了如何优化求解loss function(非凸函数没有解析解)。比如最常用的方法是Stochastic Gradient Descent (type:"SGD")。

这两个文件很重要,因为它们决定了网络是如何设计的,可以自己设计网络,从而生成自己的.caffemodel 文件

Ps: 官方文档Lenet NIST tutorial 给出的方法:在Linux下,直接利用

./data/mnist/get_mnist.sh
./examples/mnist/create_mnist.sh
得到MNIST文件并且转换为Lmdb格式。.sh是Linux下的脚本文件

测试

虽然之前的步骤应该都成功了,但是没有结果感觉还是不踏实。现在终于可以开始测试了。测试手写数字就是机器学习中的hello world,还有点小兴奋呢。

训练集图片均值文件

第一步,仍然要通过一个根目录下的bat文件利用release下面的compute_image_mean.exe。

bat命令:Build\x64\Release\compute_image_mean.exeexamples\mnist\mnist_train_lmdb mean.binaryproto --backend=lmdb

然后就可以得到一个mean.binaryproto文件。含义是图片减去均值后的残差图片。

然后我们需要修改\examples\mnist\lenet_train_test.prototxt。预处理transform_param中要添加mean_file文件。如下图:

开始mnist测试

依然是通过bat,利用的是caffe.exe。

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

Pause

批处理文件一不小心写错了好几回。在这里我们指定了测试模式,随后指定模型和训练出来的参数。

 

可以看到前面是时间和日期。测试是以batch为单位进行的,从0~49一共50个batch。分别给出了每个batch的accuracy和loss。准确率在99%左右。

问题1:但是重新保存修改之后的\examples\mnist\lenet_train_test.prototxt预处理transform_param,即使用减去均值的残差图像,准确率反而下降了。如上图,准确率只有92%。

连接https://blog.csdn.net/swj110119/article/details/53423957的测试结果和我一样。他认为是均值预处理之后相对于均值滤波,图像变模糊了。这里其实有两个问题,一个是都说利用均值文件是为了提高准确率,但是这里却下降了;一个是预处理是简单地对测试图像进行图像相减呢,还是会重新调整网络权重,生成一个新的网络?

问题2:50个batch是由上面决定的呢?:”从一到二”博客里面说是caffe.cpp中一个叫做FLAGS_iterations的变量指定的。但是看了一下代码也没有什么宏定义直接显示50

自己手写数据测试

刚才是以batch测试的,还是没有直观的感受。

1.画图和准备标签

开启画图,调整到像素大小为28x28.然后手写0~9的数字,保存为bmp格式。这里有一个问题,虽然利用classification.exe不再需要转换成lmdb格式,但是也要求是单通道的。

Ps:如果保存的格式为单色位图bmp格式,它与单通道有什么关系呢?单色位图是黑白二值图像;单通道是只有一个通道,灰度图,图像的色阶是0~255的。

事实证明是没什么关系的。完全是对图像的两个角度的衡量。三通道当然可以生成二值图像。只不过当imread以参数为0读入图像时就无需转换成gray了。

把转换好的单通道bmp图像放在\examples\mnist目录下。同时准备一个标签文件label.txt,里面是0~9的数字。

2. 通过test_personal.bat利用classification.exe去识别某张图片

Build\x64\Release\classification.exeexamples\mnist\lenet.prototxt examples\mnist\lenet_iter_10000.caffemodelmean.binaryproto examples\mnist\label.txt examples\mnist\8.bmp

Pause

下图是对“8”的识别情况


可惜“9”识别错了


Reference:

1.      Caffe编译https://blog.csdn.net/xierhacker/article/details/51834563

2.      Mnist转换https://blog.csdn.net/foreyang00/article/details/71122866

3.      prototxt文件的设置解读https://blog.csdn.net/u014696921/article/details/52166015

4.      从零到一http://www.cnblogs.com/yixuan-xu/p/5858595.html

5.      从一到二http://www.cnblogs.com/yixuan-xu/p/5862657.html

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/493723.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Yann LeCun专访:我不觉得自己有天分,但是我一直往聪明人堆里钻

来源&#xff1a;AI 科技评论摘要&#xff1a;纽约大学教授、Facebook 副总裁与首席 AI 科学家 Yann LeCun 由于对深度学习的突出贡献&#xff0c;被誉为深度学习的「三驾马车」之一&#xff0c;更被称为「CNN」之父。Yann LeCun 也一直非常活跃&#xff0c;发论文、教学、创立…

任务分配调整

在经过新一轮分工讨论后&#xff0c;我们将我们最初的分工做了一次更新。截图于此。但是同样&#xff0c;基于敏捷开发的原则&#xff0c;任务将会在过程中为适应遇到的情况而不断更新。 请大家及时完成各自任务&#xff0c;并每天22点之前在tfs上更新完毕&#xff0c;同时将当…

以LeNet-5为例理解CNN

在用caffe实现对MNIST手写数字分类的过程中发现利用的网络是LetNet-5.决定从这个网络入手好好认识一下CNN。 LeNet-5早在1998年就出现了&#xff08;5表示5层模型&#xff09;&#xff0c;标志着CNN的诞生。以其作者YannLeCun的名字命名。但是却没有得到广泛的应用&#xff0c;…

设置IE默认文本模式的方法

设置IE默认文本模式的方法 <meta http-equiv"X-UA-Compatible" content"IE8" /> IE5、6、7等都可以&#xff0c; 如果要让IE浏览器默认以最高级别文本模式显示&#xff0c;设置 IEedge 转载于:https://www.cnblogs.com/wshiqtb/p/3393653.html

任正非最新谈话:直到2006年,我才真正抛弃自杀的念头

来源&#xff1a;世界科技创新论坛摘要&#xff1a;日前&#xff0c;一份任正非会见索尼CEO吉田宪一郎会谈纪要流出&#xff0c;这份纪要以吉田宪一郎发问任正非的视角&#xff0c;揭开了不少华为鲜为人知的故事&#xff0c;其中涉及华为的管理、创业之初的故事&#xff0c;还有…

LeNet网络配置文件 lenet_train_test.prototxt

.prototxt文件 定义了网络的结构&#xff0c;我们可以通过它了解网络是如何设计的&#xff0c;也可以建立属于自己的网络。这种格式来源于Google的Protocol Buffers&#xff0c;后来被开源&#xff0c;主要用于海量数据存储、传输协议格式等场合。https://blog.csdn.net/liuyuz…

现有代码移植到Metro App

现有代码移植到Metro App 一&#xff1a;工程配置 配置WinRT工程时要注意以下几点&#xff1a; 静态库工程General里的“Windows Store App Support”设成trueC\General下面的“Consume Windows Runtime Extension”设成Yes&#xff0c;设置该选项的目的是&#xff1a;引入Micr…

前沿 | 历时十二年!曼彻斯特百万级神经元的类脑超算终开启

具有百万处理器内核的「脉冲神经网络架构」或 SpiNNaker&#xff0c;每秒能完成约 200 兆次运算。来源&#xff1a;机器之心摘要&#xff1a;这台世界最大的神经形态超级计算机由曼彻斯特大学计算机科学学院设计和制造&#xff0c;它被设计和制造成与人脑相同的工作方式&#x…

Caffe中的卷积实现

https://www.zhihu.com/question/28385679 https://github.com/Yangqing/caffe/wiki/Convolution-in-Caffe:-a-memo 作者贾扬清亲自解释了这个问题。Caffe框架是他在研究生毕业毕业前两个月的时间写的&#xff0c;自然有一些缺点&#xff08;占用内存方面&#xff09;。其实卷积…

Oracle使用goldengate分别向Oracle和mysql双路的单向复制

一.Oracle分别向Oracle和mysql双路的单向复制是在&#xff1a; ORACLE-mysql的单向复制基础上做的。http://blog.csdn.net/q947817003/article/details/13294937 二.分别再在ORACLE主库及ORACLE目标库上增加相应进程 ORACLE源端增加&#xff1a; 1.增加配置extract进程 按顺序…

小程序创业:新金矿、野望与焦虑

来源&#xff1a;视觉中国摘要&#xff1a;小程序正在带来新的红利&#xff0c;互联网上的生意可以再做一遍&#xff1f;张远想要尽可能地保持低调&#xff0c;但现在这个愿望正在变得越来越难。在最近几个月阿拉丁小程序排行榜上&#xff0c;糖豆广场舞、糖豆爱生活、糖豆每日…

三个数据集与deploy.prototxt

神经网络中经常会出现三种数据集&#xff1a;训练数据集train set、验证数据集validation set、测试数据集test set。对每个训练数据&#xff0c;计算得到准确性&#xff0c;在网络中后向传播误差&#xff0c;从而调整权重weights。对每一个验证数据&#xff0c;也会计算准确性…

网络编程套接字socket

哈哈哈&#xff0c;之前的保存成草稿忘了发 目录 一 . 先回顾一下网络初始中的相关概念&#xff1a; 1.网络通信&#xff1a; 2.局域网&#xff1a; 3.广域网&#xff1a; 4.IP地址&#xff1a; 5.端口&#xff1a; 概念 格式 6.协议&#xff1a; 7.五元组&#xff1a; 8.分层…

增长率高达40%!物联网平台如何拉动产业马车飞速狂奔

来源&#xff1a; 联动原素、安信通信研究、IoT Analytics物联网智库 整理发布物联网的低准入门槛造就了这个内容庞大的产业生态&#xff0c;致使更多的企业融入进来。伴随物联网大规模发展&#xff0c;物联网平台在其中的作用越加凸显&#xff0c;新一轮资本涌入、技术开发、业…

Java小对象的解决之道——对象池(Object Pool)的设计与应用

一、概述 面向对象编程是软件开发中的一项利器&#xff0c;现已经成为大多数编程人员的编程思路。很多高级计算机语言也对这种编程模式提供了很好的支持&#xff0c;例如C、Object Pascal、Java等。曾经有大量的软件工程师使用C语言作为他们的谋生工具&#xff0c;随着面向对象…

中国代表性Fintech企业动态观察

来源&#xff1a;全球高科技联盟阿里巴巴系企业一、阿里巴巴金融科技和区块链总体布局揭开面纱9月28日&#xff0c;阿里达摩院官网正式上线&#xff0c;公开5 大研究领域、14 个实验室&#xff0c;从中可一探阿里在金融科技和区块链领域的总体技术布局。阿里金融科技领域致力于…

新建WindowsPhone项目时提示未将对象引用设置到对象的实例

问题&#xff1a; 安装好新系统之后&#xff08;只有Windows8 专业版和企业版支持hyper-v&#xff09;&#xff0c;然后安装vs2012&#xff0c;再安装Wp8 Sdk&#xff0c;安装完毕后新建Windows Phone项目&#xff0c;会提示未将对象引用设置到对象的实例。 解决方案&#xff1…

windows+caffe下对CIFAR训练

CIFAR是什么 CIFAR-10和CIFAR-100都是带标签的大小为8000万小图数据集的子集。其中CIFAR-10有10类&#xff0c;每类6000个大小为32x32的图像。其中训练图像和测试图像的比例是5:1&#xff0c;对每类图像&#xff0c;随机选择1000个测试图像&#xff0c;剩下的就是训练图像。注意…

BAT看上了产业互联网

来源&#xff1a;《中国经济周刊》2018年 第 43 期摘要&#xff1a;互联网浪潮正从过去的消费互联网向产业互联网转移&#xff0c;巨头们正在把“矛头”从C(消费者)端转向B(企业)端&#xff0c;他们希望越来越多的企业接入互联网&#xff0c;进行数字化和智能化改造&#xff0c…

hdu 1165 坑爹找规律题

http://acm.hdu.edu.cn/showproblem.php?pid1165 不看题解&#xff0c;使劲找规律&#xff0c;应该是可以找到的&#xff0c;就是费时间&#xff01; Problem DescriptionAs is known, Ackermann function plays an important role in the sphere of theoretical computer sci…