一、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 <11 vs. 0> 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的每个模板,而之要求我们必须了解深度学习的理论知识。所以,要想取得实质性的突破,还有很长的路要走!
以上。