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自己把图片剪裁和转换成它需要的数据。需要一个文档里面写了每一个图片的地址和标签号,比如

之后在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是这么写的:

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

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

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/

6,016 次浏览

One thought on “Getting started with Caffe | Caffe的安装与使用

  1. sidney说道:

    I’m an expert writer who loves to bring smiles to people’s face.

    Writing is what I do for a living and I am so passionate about this. I have worked with several organizations whose mission is to help people solve writing problems.
    I love traveling and have visited several places in the past few years.
    I’m happy to have written several books that have contributed positively to the lives of many. My books are available in several parts of the world. And I’m currently working with companies that help people save energy. Being a part of this team has open more opportunities for me to excel as a writer. I have worked with different people and met many clients as a writer.
    I can handle any kind of writing project and provide nothing but the best. People come to me all the time to ask if I can solve their assignment problems and I accept. I find pleasure in helping them to solve their problems as a professional.

    Professional Writer – Sidney – Natalie Crawford Corp

发表评论

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