Deep Learning -- Caffe学习

来源:互联网 发布:c语言最大公倍数 编辑:程序博客网 时间:2024/05/16 06:49

Step 1 -- 了解Caffe:

    把网页http://caffe.berkeleyvision.org看一遍。


Step2 -- 下载源码:

    最好Windows版和Linux版结合使用,感觉能更快上手,我是以Windows版为主,弄不清楚的地方就去Linux下看看。

    源码下载地址:https://github.com/BVLC/caffe,Windows版下载地址:https://github.com/BVLC/caffe/tree/windows。


Step3 -- 工程编译:

    最好Win7以上OS,Visual Studio 2013,CUDA 7.5,cuDNN v4,其他的依赖库在编译时会通过Nuget包管理器自动下载。

    编译前复制CommonSettings.props.example并改名为CommonSettings.props,该工程的基本配置都在该文件中,可以好好看下。

    打开解决方案Caffe.sln,在CommonSettings.props中配置好是否使用GPU、cuDNN以及cuDNN的路径等等,配好后编译libcaffe工程,编译通过就ok啦。

    遇到问题1:Error MSB3073:vcend with code 1,提示信息大概说BinplaceCudaDependencies.cmd里有错,打开发现命令的意思是要将CUDA和cuDNN的.dll文件拷贝到程序运行目录下结果找不到。

    解决方法:问题出在我手欠将cuDNN下载下来时的“cuda”目录给删了,因为强迫症不喜欢无缘无故多一层看起来没什么用的目录,所以%CUDNN_PATH%\cuda\bin\cudnn*.dll改为%CUDNN_PATH%\bin\cudnn*.dll就好了。


Step4 -- 准备数据:

    先以最简单的mnist为例,mnist最大的好处就是简单易懂,并且cuDNN的sample也是以此为例,学习素材丰富。

    训练的话首先要有数据,可以从网站http://yann.lecun.com/exdb/mnist上下载。需要的数据分别是训练集图片train-images.idx3-ubyte、训练集标签train-labels.idx1-ubyte、测试集图片t10k-images.idx3-ubyte、测试集标签t10k-labels.idx1-ubyte。

    下载好后需要将数据转换为lmdb(或者leveldb)格式,默认为lmdb,如果想用leveldb可以在代码中修改,或者用命令--backend=leveldb来修改。把数据放到caffe-windows\data\mnist目录下吧,将convert_mnist_data工程设置为启动项,工作目录配置为$(ProjectDir)..\..\data\mnist\。转换训练集的命令参数为train-images.idx3-ubyte train-labels.idx1-ubyte mnist_train_lmdb,转换测试集的命令参数为t10k-images.idx3-ubyte t10k-labels.idx1-ubyte mnist_test_lmdb。

    这时可以编译运行程序了,但是很可能会崩溃报错。

    这是我遇到的问题2:如果崩在CHECK_EQ(mdb_env_set_mapsize(mdb_env, 1099511627776), MDB_SUCCESS)  // 1TB这句,一般情况是申请的空间不够。

    解决办法:改成CHECK_EQ(mdb_env_set_mapsize(mdb_env, 107374182), MDB_SUCCESS)  // 100MB即可运行成功,得到训练集和测试集。(最新的代码好像没有这段了?)


Step5 -- 开始训练:

    训练可以选择仅仅使用CPU,或者使用GPU,选择使用GPU的基础上可以选择是否使用cuDNN库进行加速。CPU/GPU的选择需要在CommonSettings.props和solver.prototxt中同时设置,务必一致。

    将上一步转换好的数据拷贝到caffe_windows\examples\mnist路径下会更方便。将caffe工程设为启动项,训练的solver选择example中的lenet_solver.prototxt,工作目录$(SolutionDir)..\,命令参数train --solver=examples/mnist/lenet_solver.prototxt --gpu=0。

    运行程序训练开始,结束后可得到lenet_iter_5000.caffemodel和lenet_iter_10000.caffemodel两个文件。


Step6 -- 测试一下:

    网络模型的定义文件lenet_train_test.prototxt中输入数据层同时定义了TRAIN跟TEST情况下的输入文件,所以不需要做什么修改。仅仅将命令参数替换为test --model=examples\mnist\lenet_train_test.prototxt --weights=examples\mnist\lenet_iter_10000.caffemodel --gpu=0即可。

    可以看到测试结果:accuracy=0.9866,loss=0.0410526。


Step7 -- 实际使用:

    如果我们对训练结果的accuracy和loss感到满意的话,就可以将训练好的数据投入实际使用,找几张真实的手写字符(数字0~9)来测试了。我的测试图片是从cuDNN的sample程序mnistCUDNN中找来的,one_28x28.pgm、three_28x28.pgm和five_28x28.pgm。

    如果要利用解决方案自带的classification工程进行测试,要对代码稍做一些修改,因为原工程的流程与mnist的不同,多了减均值等操作。需要修改的地方包括入参检查、输入文件路径、SetMean、check labels_.size()、Preprocess和结果的呈现等。

    修改好后运行可以看到,输入图片five_28x28.pgm,则10分类中5对应的score是最大的,其他都很小,说明分类器认为这张图片上最可能写的是“5”!



小小总结一下:

    基本上经过上面这一轮的学习,对Windows版的Caffe工程就比较熟悉了,可以开始用来干活了。可以将faster-rcnn、SSD加进来,丰富这个解决方案,也可以将自己的工程加到当前解决方案下,像caffe或者classification工程一样调用libcaffe,实现自己的深度学习demo。关于工程配置可能会遇到很多坑,所以最好不要自己添加新工程,而是直接拷贝现有工程,需要的地方稍作修改,会轻松很多。

1 0
原创粉丝点击