一、mnist数据集

mnist是一个手写数字数据库,由Google实验室的Corinna Cortes和纽约大学柯朗研究院的Yann LeCun等人建立,它有60000个训练样本集和10000个测试样本集。mnist数据库官方网址为:http://yann.lecun.com/exdb/mnist/ 。可直接下载四个解压文件,分别对应:训练集样本、训练集标签、测试集样本和测试集标签。解压缩之后发现,其是在一个文件中包含了所有图像。

二、caffe支持的数据格式:Lmdb和Leveldb

  • 它们都是键/值对(Key/Value Pair)嵌入式数据库管理系统编程库。
  • 虽然lmdb的内存消耗是leveldb的1.1倍,但是lmdb的速度比leveldb快10%至15%,更重要的是lmdb允许多种训练模型同时读取同一组数据集。
  • 因此lmdb取代了leveldb成为Caffe默认的数据集生成格式。

三、mnist数据集的处理

caffe并不能直接使用下载得到的四个文件进行训练,而是会把它转化为lmdb或leveldb格式进行读取。目前我使用的是leveldb格式。由于还没有具体研究如何将数据集向lmdb或leveldb格式转化,所以目前使用的是网盘下载的资源,链接如下:

http://pan.baidu.com/s/1c2G9qyk  提取码:xama。里面是已经经过转换的leveldb格式的训练集和测试集,将这两个文件夹直接放到\examples\mnist目录下,如下图所示:

四、训练caffe模型

训练caffe模型需要用到几个文件,首先是train_lenet.bat,打开看到其内容如下:

即该文件指定要使用lenet_solver.prototxt文件,那我们就看看该文件吧!

将最后一行solver_mode改为CPU;(为什么我不用GPU呢?后面再解释!)可以看出,这个文件是对网络训练参数进行指定:max_iter指定了最大迭代次数,默认为10000次,snapshot是输出中间结果,默认为迭代到5000次时输出中间结果。

文件的开头也指明了,使用lenet_train_test.prototxt文件指定的网络进行训练和测试。

打开lenet_train_test.prototxt,做如下修改以正确指定训练集和测试集。

其中source指定了mnist的训练集和测试集的文件夹所在路径,注意,此处是相对路径,这个很关键,原因后面再提!

backend指定了数据集的格式,使用的是leveldb

之后,点击examples/mnist目录下的train_lenet.bat批处理文件,即可实现对mnist数据集的训练,train_lenet.bat文件内容为:

cd ../../
"caffe/bin/caffe.exe" train --solver=examples/mnist/lenet_solver.prototxt pause

意思为使用编译生成的caffe.exe进行训练,训练使用的解决策略由lenet_solver.prototxt来指定。

如果不出意外,等待一段时间后,即可得到如下界面:

可以看到,打印信息的格式是有规律的,

左侧是caffe采用的GLOG库内方法打印的信息,这个库主要起记录日志的功能,方便出现问题时查找根源,具体格式为:

[日期] [时间] [进程号] [文件名] [行号]

往右即为当前迭代次数以及损失值(训练过程不输出准确率accuracy)。

当看到Optimization Done字样时,说明模型训练完成。训练得到的模型存储在目录\examples\mnist下(后缀名为caffemodel和solverstate),如下图所示:

分别是训练至一半和训练最终完成后的模型。接下来即可用这模型对mnist的测试集进行测试。

五、mnist数据集的测试

编译生成的caffe.exe可以直接用于测试。在目录\examples\mnist下新建mnist_test.bat批处理文件,并写入如下内容:

cd ../../
caffe\bin\caffe.exe test --model=examples\mnist\lenet_train_test.prototxt -weights=examples\mnist\lenet_iter_10000.caffemodel
pause

意思是,首先是找到caffe.exe并运行->指定为测试模式->指定网络测试参数->指定模型。

运行mnist_test.bat,结果显示如下:

左侧的内容依旧是GLOG的记录日志,右侧中的Batch需要和网络参数初始中的batch_size一起理解。每个Batch中包含了batch_size张测试图片,所以每个Batch的准确率是对这batch_size张测试图片整体而言的。而不是对每张测试图片而言的。

六、遇到的问题

前面有提到两点,当时说在后面会解释。现在在该部分展开说明。

1、为什么我在解决策略文件lenet_solver.prototxt中,要将solver_mode改为CPU呢?

答:因为在我的机器中,solver_mode使用GPU的话,训练时出错,错误的提示如下:

Check failed: error == cudaSuccess < vs. > invalid argument

网上查了一下这个错误,给的最多的解释是:该错误是由显卡的计算能力不足导致的。

遇到这个问题的网友还是有的,但给出的解决方案我没有看懂,github上https://github.com/rbgirshick/rcnn/issues/28有一个解决方案:

I added the following lines to commands using multiple “arch” flags in Nvidia's NVCC compiler, and the error does not occur anymore.

-gencode=arch=compute_20,code=\"sm_20,compute_20\" -gencode=arch=compute_30,code=\"sm_30,compute_30\" -gencode=arch=compute_35,code=\"sm_35,compute_35\" -gencode=arch=compute_50,code=\"sm_50,compute_50\" 

网友说亲测能解决

但我不知道如何修改。

还有的网友说是要设置显卡的计算能力http://www.cnblogs.com/yymn/articles/5389904.html ,但我也不知道如何设置。

所以这个问题,暂时放在这里,待日后找到解决方法后再回来更新!

2、第二个问题之前的描述如下:

这个“相对路径”是相对于哪里呢?就是相对于你运行caffe.exe后,所处在的路径位置!再来回看一下我的mnist_test.bat内容吧

我在运行目录caffe\bin下的caffe.exe应用程序之前,已经执行了cd../../将我目前的路径返回上上层目录,我的目录结构如下图所示:

执行cd../../后,我来到了F:\caffe\目录下,此时,我在我的mnist_test.bat内能通过相对路径 examples\mnist\lenet_train_test.prototxt 找到网络参数描述文件,而且也能在lenet_train_test.prototxt中的source处指定的相对路径处,找到mnist测试集的文件夹所在位置:

这样来看,调用caffe.exe完成mnist数据集的测试过程中,其如何去找相关文件就很清楚了!

我犯的错误是:我之前在mnist_test.bat批处理文件写入的内容是:

可以看到,所有的路径我都是使用绝对路径,这是我为了防止调用错误特地难为自己的。但lenet_train_test.prototxt中,我在source指定的还是相对路径:

source:"examples\mnist\mnist_test_leveldb"

当时没想过会出错,可当我执行mnist_test.bat时,出现了

错误描述为:

Check failed: status.ok() Failed to open leveldb examples/mnist/mnist_test_leveldb
Invalid argument: examples/mnist/mnist_test_leveldb: does not exist (create_if_missing is false)

当时我在检查错误的时候,完全没想过是由于相对路径设置得不对导致的,一直在检查是不是我在mnist_test.bat中设置的路径有误,浪费了很多时间。

后面我无意打开lenet_train_test.prototxt 才发现,source指定的是相对路径,那这个相对路径是相对于哪个位置的呢?因为我的测试集所在路径为:

source中为 那么我所处的位置应该要在F:\caffe\,这样我才能根据source找到测试集文件夹mnist_test_leveldb

而我在mnist_test.bat中,并没有将我的位置定位到F:\caffe\ ,因为mnist_test.bat是在F:\caffe\examples\mnist\下的,若不将路径定位到F:\caffe\ ,则程序会根据source指定的相对路径,在F:\caffe\examples\mnist\下寻找

 ,而F:\caffe\examples\mnist\下根本不存在这个路径,所以就会出现找不到文件夹mnist_test_leveldb的情况!

当然,如果在source中使用绝对路径来指定mnist_test_leveldb,即

再运行这个mnist_test.bat批处理文件:

就不会出错了!

运行的结果如下:

 小结:

可能是我对文件路径的理解程度和敏感程度不够,常常会在路径问题上出错,或许在别人看来,这根本不是什么值得拿出来提及的问题,但于我而言,真的是浪费了很多时间在指定文件路径上。这一次使用caffe来测试mnist数据集,又一次浪费了很多时间在这个问题上!真是无语-。-|||

七、总结

虽然一路艰辛,但总算是把caffe用起来了!通篇下来,你会发现,我完全没有提及任何枯燥乏味的理论知识,连深度学习中最重要的卷积神经网络我也只字未提,可见caffe的确可以让一个完全不懂卷及神经网络原理的人通过不断手动调整参数完成学习,实现分类等目标,且取得的效果还不错。

当然这只是对于那些想试试caffe威力的人而言,真正要将caffe用于你的应用项目中,需要看懂caffe的每个模板,而之要求我们必须了解深度学习的理论知识。所以,要想取得实质性的突破,还有很长的路要走!

以上。

Caffe初试(二)windows下的cafee训练和测试mnist数据集的更多相关文章

  1. windows下使用caffe测试mnist数据集

    在win10机子上装了caffe,感谢大神们的帖子,要入坑caffe-windows的朋友们看这里,还有这里,安装下来基本没什么问题. 好了,本博文写一下使用caffe测试mnist数据集的步骤. 1 ...

  2. coreseek实战(一):windows下coreseek的安装与测试

    coreseek实战(一):windows下coreseek的安装与测试 网上关于 coreseek 在 windows 下安装与使用的教程有很多,官方也有详细的教程,这里我也只是按着官方提供的教程详 ...

  3. windows+caffe(四)——创建模型并编写配置文件+训练和测试

    1.模型就用程序自带的caffenet模型,位置在 models/bvlc_reference_caffenet/文件夹下, 将需要的两个配置文件,复制到myfile文件夹内 2. 修改solver. ...

  4. (二)windows下安装PHPCMS V9

    一.准备工作 搭建环境 :参考:Windows下搭建PHP开发环境及相关注意事项 PHPCMS V9 :下载适合自己 PHPCMS V9 版本到本地或服务器,下载地址:http://www.phpcm ...

  5. caffe搭建以及初步学习--win7-vs2013-gtx650tiboost-cuda8.0-cifar10训练和测试-2-快速解决方案cifar10_quick_solver.prototxt

    首先安装好显卡----已经装好了?喜大普奔!没装好?那就用cpu,也是一样的. 拷贝cudnn v5.0 头文件和库文件以及执行文件到cuda8中 -------------------------- ...

  6. caffe学习系列(2):训练和测试自己的图片

    参考:http://www.cnblogs.com/denny402/p/5083300.html 上述主要介绍的是从自己的原始图片转为lmdb数据,再到训练.测试的整个流程(另外可参考薛开宇的笔记) ...

  7. Windows下的Memcache安装与测试教程

    Windows下的Memcache安装 1.下载memcache for windows. 下载地址:http://splinedancer.com/memcached-win32/,推荐下载bina ...

  8. windows下fitness python版本安装测试

    FitNesse介绍¶ FitNesse是一套软件开发协作工具. 伟大的软件需要协作和交流,FitNesse可以帮助大家加强软件开发过程中的协作.能够让客户.测试人员和开发人员了解软件要做成什么样,自 ...

  9. caffe搭建以及初步学习--win7-vs2013-gtx650tiboost-cuda8.0-cifar10训练和测试-2-完整解决方案cifar10_full_solver.prototxt

    首先总结前一节的内容. 简单的讲,就是训练并测试了快速解决方案. 转换数据格式: convert_cifar_data.exe data/cifar10 examples/cifar10 lmdb 计 ...

随机推荐

  1. lvs/dr配置

    lvs/dr Director server : DIP:192.168.1.100/24  eth0 VIP:192.168.1.101/24  eth0:0 Real server: Real1: ...

  2. Matplotlib 学习笔记

    注:该文是上了开智学堂数据科学基础班的课后做的笔记,主讲人是肖凯老师. 数据绘图 数据可视化的原则 为什么要做数据可视化? 为什么要做数据可视化?因为可视化后获取信息的效率高.为什么可视化后获取信息的 ...

  3. mysql返回最后一列数据

    获取MySQL的表中每个userid最后一条记录的方法,并且针对userid不唯一的情况,需要的朋友可以参考下 表结构 CREATE TABLE `t1` ( `userid` int(11) DEF ...

  4. 教你一招:解决安装或卸载office时 提示错误2503 2502 发生了内部错误

    问题重现: 解决办法:使用软件卸载工具 Uninstall Tool 3.5.1 中文破解版强制删除文件,非常暴力,完美解决. 解决过程一览: 工具下载地址: 软件卸载工具 Uninstall Too ...

  5. 【Alpha】阶段汇总

    [项目文档&API文档] PhyLab2.0需求与功能分析改进文档(NABCD) PhyLab2.0设计分析阶段任务大纲(α) 团队个人贡献分分配规则 功能规格说明书 [Phylab2.0]A ...

  6. json使用

    json是存储和交换文本信息的语法,类似 XML,比 XML 更小.更快,更易解析 json 可通过 JavaScript 进行解析 json 数据可使用 AJAX 进行传输 //读取var JSON ...

  7. <<< javascript地址栏,代码

    不伤及服务器,可以用来测试项目效果 修改网页.不修改服务器端任何网页页面 javascript:document.body.contentEditable='true';document.design ...

  8. Hibernate的关联映射关系

    一:多对一 <many-to-one 1.name:当前类的属性名(关联映射的类) 2.column:属性多对应的类的对应的表的外键(连接条件) 3.class:属性所对应的类的权限定名 4.n ...

  9. linux 命令行 光标移动技巧

    linux 命令行 光标移动技巧 看一个真正的专家操作命令行绝对是一种很好的体验-光标在单词之间来回穿梭,命令行不同的滚动.在这里强烈建立适应GUI节目的开发者尝试一下在提示符下面工作.但是事情也不是 ...

  10. JDK Collection 源码分析(1)—— Collection

    JDK Collection   JDK Collection作为一个最顶层的接口(root interface),JDK并不提供该接口的直接实现,而是通过更加具体的子接口(sub interface ...