Getting started with Caffe | Caffe的安装与使用

本来第二篇可以写其他内容的,比如前端和Javascript、建筑大数据与可视化、仿生找形,但这篇怎么就写了深度学习了呢,说来话长。这学期选了HCI课,本来以为能学习UX设计,然而并没有学到,相反读了很多论文。期中研究的社交媒体中亲密关系的监控行为。期末大作业本来可以选作VR的,但是被分配了机器学习作为课程项目。就这样,接触了好多很多新奇的内容。

1. 卷积神经网络

原理

卷积神经网络是一种特殊的神经网络,可以用卷积处理二维区域的数据,尤其适合识别图像。

Fig1 卷积神经网络图示

如图1所示,神经网络输入一张图片后,一般会用卷积核对图片每一个小区域做卷积(Convolution),卷积层后面一般会有池化层(Pooling),激活层(比如ReLU),norm之类,网络最后一般有全连接层(FC)来输出分类。

图片输入时会转成一个矩阵(or 张量?,Caffe里称为blob),一张图片有3个通道RGB,宽度和高度。另外一次会学习几张图片(batch),所以输入的数据(blob)一般会是四维矩阵 batch * channel * width * height。

Fig2 卷积层示意

卷积是一种矩阵操作,使用卷积核在原始矩阵上滑动,计算出一个缩小的新的矩阵。上面这张图片很好的做了示意。池化层(Pooling)简单来说是对数据降维,ReLU层是一个激活函数。FC层做最后的分类。

效果

CNN近年来在图像识别上突飞猛进,说到此不得不提几个图像识别的比赛。
1. ImageNet,斯坦福的Li Fei-fei教授主导的,100W+的训练图片,分成1000个类别。
每年这个数据集都会做比赛,称为ISLVRC.
15年冠军MSRA,做了150层的CNN,正确率大概96%。14年的冠军是Googlenet,正确率大概93%,13年是89%,12年Alexnet是85%。可以看到提升的速度。最新的训练结果已经很惊人了,不敢说秒杀人类专家,秒杀我是肯定的了。
2. CIFAR-10,多伦多大学的训练集,80,000,000的训练图片,10个类别。现在正确率能到97%了吧。
3. MNIST,Yann LeCun教授的手写数字训练集,60k的训练图片,都是手写的0-9。现在最高的正确率是99.8%。

工具

Caffe是一个CNN框架,最开始由UCBerkerly创建。原作者之一贾扬清是贵系校友,UCB博士。它既能运行在CPU模式又可以在GPU模式。底层用C++编写,速度快。而且社区信息较多,可以用python控制,入门容易。因此课程项目选择使用这个框架。
类似的框架还有Torch, Theano, TensorFlow等等,不在此赘述。

2. Caffe安装

如果你的系统是*nix的话,请参照Caffe官网的installation章节。笔者使用的是windows系统。因为这个课程项目,笔者已经在三台电脑上配置了caffe。。。。。

深度调试
简直了。。。

windows上安装caffe请认准BVLC的windows branch. 之前github上happynear大神给过一个windows版,去年编译我还用的那版。但是现在有M$维护的caffe版啦用起来更方便。第三方依赖都是用Nuget解决的。

按照github上的指示安装就可以,先修改一下prop里的版本信息和路径,然后安装CUDA和CuDNN。有一点BVLC没说是prop里一条<CudaArchitecture>compute_50,sm_50</CudaArchitecture>,是设置自己机器CPU的计算能力。可以参考这里CUDA. 一般来说如果低于2.1就不要设置cuDNN了。

编译如果报错的话一般有两种问题:
1. 依赖路径不对。在项目->属性->配置属性->VC++目录->包含目录 和 库目录 里面添加依赖项。哪个报错就对应添加CUDA,CuDNN和Python的路径。比如笔者用的Enthought Canopy,python的路径就是C:\Users\Maajor\AppData\Local\Enthought\Canopy\User\libs,C:\Users\Maajor\AppData\Local\Enthought\Canopy\User\Lib\site-packages,C:\Users\Maajor\AppData\Local\Enthought\Canopy\User\Lib\site-packages\numpy\core\include之类,CUDA是C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\includeC:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\lib\x64
2. 警告视为错误。项目->属性->配置属性->C/C++->所有选项->讲警告视为错误 设置为否。有个段子是这么讲的:

程序员失足从悬崖上掉 下去了,因为警告牌写的是warning不是error。。。。

编译大概要几十分钟,视机器的情况而定。编译好要手动安一下python wrapper,把目录<caffe_root>\Build\x64\Release\pycaffe\caffe 拷贝到 <python_root>\lib\site-packages

编译好的文件都在<caffe_root>\Build\x64\Release,最主要的就是那个caffe.exe啦.

3. 使用方法

Berkely的这个PPT很好的解释了怎么使用caffe,caffe可以用在什么情况。

笔者的使用场景非常简单,就是要finetune别人训练好的模型来识别风格。
别人训练好的模型都在Model Zoo,用pre-trained model的好处是可以使用一部分别人的权值,能较好提高训练的准确率。笔者finetune了bvlc_reference_caffenet和bvlc_googlenet.

finetune和non-finetune笔者的测试如下:

finetune对比
finetune VS non-finetune

具体来说有这么几步:
1. 设置数据集。有两种。
* lmdb/leveldb,可以参考这篇。lmdb是一种key-value数据库,存完的数据key是序号,value是类型为caffe.proto.caffe_pb2.Datum的数据,value.data就是图片矩阵的数据啦,value.label是标签。
* imagedata,比如官方范例finetune_flickr_style就用的这种。可以直接输入图片,caffe自己把图片剪裁和转换成它需要的数据。需要一个文档里面写了每一个图片的地址和标签号,比如

C:\DeepLearningLib\caffe-windows-master\data/flickr_style\images\12730422735_c9fac1b01e.jpg 18
C:\DeepLearningLib\caffe-windows-master\data/flickr_style\images\12926517013_e666095b3d.jpg 15
C:\DeepLearningLib\caffe-windows-master\data/flickr_style\images\9179196830_c801119016.jpg 1
C:\DeepLearningLib\caffe-windows-master\data/flickr_style\images\6087419770_d29d81ce75.jpg 7

之后在net定义的文件里面把data层的type改成Imagedata,然后image_data_param的source改成这个文档的地址。直接输入的图片最好自己预处理一下,比如对ImageNet类的网络要剪裁256*256。避免caffe读取大图片或者读取gif文件失败。

2 修改网络定义,一般叫train_val.prototxt。除了上面说的data要改,最后classifier的num_output也要改,参考finetune_flickr_style就好啦

3 改solver,一般叫solver.prototxt。base_lr一般改成原来的1/10,这在finetune_flickr_style也讲到了。

4 Train!可以写一个sh脚本,然后用Cygwin运行(可能要自己装一下,安装服务器选ustc的)。或者直接在命令行里train。基本语法是<cafferoot>/Build/x64/Release/caffe train -solver <yoursolver.prototxt> -weights <yourpretrainedmodel.caffemodel> -gpu 0 2>&1 | tee <yourlog>solver变量是自己的solver,weight变量是别人训练好的模型,gpu变量是说用gpu训练,没有的话就把它去掉。2>&1| tee是记录日志的一个命令,方便以后画图。比如我的train.sh是这么写的:

#train.sh
C:/caffe-windows/Build/x64/Release/caffe train -solver solver_caffenet_artist.prototxt -weights bvlc_reference_caffenet.caffemodel -gpu 0 2>&1 | tee log/train-caffenet-artist.log

蓝后在cygwin里 先把工作目录放到自己的项目里,然后运行下面就可以啦

sh train.sh

当然也可以直接在命令行里运行

C:/caffe-windows/Build/x64/Release/caffe train -solver solver_caffenet_artist.prototxt -weights bvlc_reference_caffenet.caffemodel -gpu 0 2>&1 | tee log/train-caffenet-artist.log

5 看它慢慢训练。。。
6 调参数重新训练。。。。

4. 相关工具

Caffe根目录下有好几个文件夹:
* ./models是一堆模型,有一个脚本用来下模型./scripts/download_model_binary.py
* ./examples是一些示例
* ./data是数据集,刚下载下来的时候这里没啥东西,都要用每个示例里的脚本下数据。
* ./python里有一个draw_net.py可以画网络结构图
* ./tools/extra里有一些小工具,比如parse_log.py可以把训练的日志转成类似csv的格式,然后就能用python读取直接画图了。

my caffenet
draw_net.py画的我修改的caffenet

参考文献

http://caffe.berkeleyvision.org/
https://github.com/BVLC/caffe/tree/windows
http://blog.csdn.net/stdcoutzyx/article/details/41596663
http://deepdish.io/2015/04/28/creating-lmdb-in-python/

706 views

发表评论

电子邮件地址不会被公开。 必填项已用*标注