从零到一:caffe-windows(CPU)配置与利用mnist数据集训练第一个caffemodel

1、前言linux

    本文会详细地阐述caffe-windows的配置教程。因为博主本身也只是个在校学生,目前也写不了太深刻的东西,因此准备从最基础的开始一步步来。我的的计划是分红配置和运行官方教程,利用本身的数据集进行训练和利用caffe来实现别人论文中的模型(目前在尝试的是轻量级的SqueezeNet)三步走。不求深度,但求详细。由于说实话caffe-windows的配置当初花了挺多时间的,目前貌似还真没有从头开始一步步讲起的教程,因此博主就争取试着每一步都讲清楚吧。ios

    这里说些题外话:之因此选择SqueezeNet是由于相比于目前互联网行业深度学习应用的火热,移动设备端的深度学习应用实在少得可怜。若是我没记错地话,苹果在2016年9月7日发布会中提到了机器学习两次,其中ios10的一个亮点就是利用深度学习技术实现照片中人脸的自动识别归类,私下里测试了下效果很不错。固然缺点也显而易见:因为须要大量的计算,目前只在用户接通电源的状况下才会去识别。个人师兄们也尝试过用深度学习作移动设备端应用的开发,不过最后因为花费时间太长改为了上传到服务器端完成。因此计算量大应该算是深度学习应用向移动设备端转移的一个很大问题。不过,有理由相信从此移动设备端的深度学习应用会变得愈来愈多,也会是一个前景广阔的市场。git

2、环境github

    系统版本:Windows 10 专业版 64位windows

    Visual Studio版本:Visual Studio Ultimate 2013服务器

    均可以从itellyou上下载到,强烈推荐使用上述版本的Visual Studio(如下简称VS)。网络

3、详细步骤app

caffe-windows配置部分机器学习

(1)确保正确安装了VS后首先下载caffe-windows源代码,网址以下:学习

      https://github.com/BVLC/caffe/tree/windows

   我下载获得的caffe-windows.zip的MD5值为:8F2804014EF395094584230A4A9EE8A6,不排除后续源代码更新致使本教程失效的可能,所以保险的话能够校验一下。

(2)解压后进入以下路径:\caffe-windows\windows(以后路径均默认在caffe-windows文件夹下,所以都省略\caffe-windows)

   在\windows目录下复制文件 CommonSettings.props.example(应该会以副本形式出现CommonSettings.props - 副本.example),并将该副本更名为CommonSettings.props。(请确认显示文件扩展名这个选项已生效)

(3)用VS打开CommonSettings.props,进行以下两个更改后保存退出。

   1.第7行的false改为true;2.第8行的true改为false;更改后效果以下:

1

   若是是像我同样的初学者不推荐一开始就配置GPU版本的caffe,由于又会有不少问题出现,容易打消积极性,更应该先利用CPU版本初步掌握caffe后再进一步研究GPU版本。

(4)用VS打开\windows下的Caffe.sln,加载完成后右键点击解决方案资源管理器中的解决方案Caffe,选择启用NuGet程序包还原(VS会自动地将caffe要用到的第三方库下载完成,就功能来讲仍是很方便的,有点相似linux的apt-get,还不用担忧版本问题。不过就caffe实际用这个还原第三方库的体验来讲真不咋的),以下图所示:

2    接下来的过程十分漫长,还有可能出现未响应或下载中断的状况。

    我想了一种可取且可行的方案:在第四步打开Caffe.sln以前先下载别人已经下载好的NugetPackages文件夹,并放到和caffe-windows文件夹的同级目录下。这样以后再打开Caffe.sln时可以自动识别出来(亲自试了一下是可行的)。提供一个NugetPackages文件夹的压缩包:http://pan.baidu.com/s/1qYpg3bY,提取码f2zx。

    若是本身能够下载,那下载完成后会在caffe-windows文件同级目录下出现一个新的NugetPackages文件夹(里面有16个子文件夹,都是caffe须要用到的库,以后会结合实际运行结果简单介绍下这些库)。若是点击上图中的管理解决方案的NuGet程序包(G)还能够看到这些库的简要信息,以下图所示:

3

(5)以后点击项目-属性(或直接右击解决方案Caffe选择属性),把配置修改为Release x64,并将生成所有勾上,以下图所示。最后就能够点生成解决方案了,而后又是较长的等待。。

4

    这里会出现一个问题,单独说明下:

    报出相似下面的错误:

     error LNK1104:没法打开文件“libcaffe.lib

    网上的解决方案是对libcaffe单独从新生成,以下图所示:

15

    但这样的话会出现另一个错误:

    error C2220:警告被视为错误-没有生成“object”文件

    若是出现这样的错误,请打开项目-属性按照下图进行更改:

16

    以后再对libcaffe从新生成应该就能够成功经过。

    最后再点击生成-生成解决方案应该就能够生成成功了。至此caffe-windows配置完成。进入目录\caffe-windows\Build\x64\Debug里面众多的可执行文件都会在以后用到。

    其实Debug也是能够的,可是这样的话以后每次都要打开VS,总以为有点不方便,因此后面仍是经过本身写bat文件调用caffe。Debug的方法能够参考这篇文章[2]。

    到了这一步恭喜你配置已经完成了。接下来就能够用mnist数据集生成模型了。

mnist数据集测试部分

  这部分原本应该分开来写的,但因为完成了caffe-windows配置部分也不知道到底配置得正不正确,因此仍是一气呵成地用机器学习的Hello World程序:mnist手写数字数据集来测试下。

(1)首先下载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,能移植过来就不错了,也不能期望大牛们把全部例子的代码都一并移植过来。后续教程会专门介绍如何实现本身的数据集向lmdb和leveldb转换。目前更很好的办法就是直接网盘下载,这里分享一个http://pan.baidu.com/s/1c2G9qyk 提取码xama。

    里面是已经通过转换的leveldb格式的训练集和测试集,把这两个文件夹直接放到\examples\mnist目录下,以下图所示:

6

(2)在正式运行前还有几个文件中须要进行改动,首先用VS打开\examples\mnist目录下的lenet_solver.prototxt,将最后一行改为CPU:

7

   能够看到,这个文件是对网络训练参数进行指定:max_iter指定了最大迭代次数,snapshot是输出中间结果。上图中的参数已经修改过,初始的max_itersnapshot是10000和5000。

   接着再用VS打开\examples\mnist目录下的lenet_train_test.prototxt,作以下修改以正确指定训练集和测试集。

8

    这里额外介绍下caffe-windows采用的LeNet-5模型,也就是上图中layer的定义方式。因为以后本身写代码实现模型时确定须要对LeNet-5模型有了解,因此提供该模型的原始资料以供参考。

http://yann.lecun.com/exdb/publis/pdf/lecun-01a.pdf

   其实平时看些别人论文中提供的代码,上述两个文件也算是论文和代码的核心所在。基本都是提供本身编写的上述两个文件,再加上最终训练出来的caffemodel,日志和几张效果图。好比下图就是SqueezeNet提供的的:

13

(3)完成上述工做后就能够编写bat脚本进行正式训练了。回到caffe-windows的根目录下新建一个run.txt并写入如下内容(本身敲一遍感受效果更佳,特别是像我同样以前对bat文件彻底不懂的人):

14

    将后缀名改为bat后双击运行,不出意料,应该会出现相似以下的训练过程:

9

4、mnist运行结果

    我清除解决方案后按照上述步骤从新试了一次,没有出现问题。固然也仍是不能保证100%能运行,因此若是出现任何错误的话欢迎交流。

    下面就对运行的结果进行一些简单的解释:

    最前面的部分是打印各类信息(包括是用CPU仍是GPU、训练参数、网络参数等等),相似下图内容:

10

    以后即为和下图同样的正式训练过程,能够看到打印信息的格式也是有规律的:

11

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

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

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

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

12

    分别是训练至一半和训练最终完成后的模型。接下来能够用这模型对mnist的测试集和本身手写的数字进行测试(见下篇教程)。

5、结语

    也许到目前为止你仍是感受caffe像个黑盒同样,没法洞悉它的具体工做过程。但至少到这一步为止你已经完成了最初的caffe配置过程并成功利用mnist数据训练出了第一个caffemodel。以后的东西虽然不能说简单,但并无这最初的一步来得意义重大。完成了Step ZERO to ONE,就能饱含信心的继续下去,进一步探究caffe(好像鸡汤了?)。在接下来的教程中会用到该模型对mnist数据集以及你本身手写的图片进行测试。后者仍是颇有趣的。

6、参考

[1]深度学习21天实战Caffe 赵永科 电子工业出版社

(虽然这本书因为大量地贴代码,评价不是太好,但对初学者仍是有不少可取之处的)

[2]http://m.blog.csdn.net/article/details?id=51355143

[3]Caffe官方教程中译本 社区预览版