为什么要学习Caffe呢?因为通过Caffe可以综合性的学习Deep Learning,CUDA,Spark(CaffeOnSpark),cuDNN,OpenBLAS,MKL,ATLAS,OpenCV,C++,Python,Linux等知识。安装Caffe之前主要是安装CUDA,BLAS,Boost,Google Protocol Buffer,Lmdb等,关于cuDNN和Python是可以选择的。Caffe详细的安装过程参考[1][2]。Caffe(Convolutional Architecture for Fast Feature Embedding)是什么呢?简单来说Caffe主要是一个关于CNN的深度学习框架,可以用于模式识别,图形图像,机器视觉等应用,通过Caffe::set_mode(Caffe::GPU)在CPU和GPU之间无缝切换,并且提供C++、Python和Matlab接口。

1. Caffe的目录结构

Caffe目录结构,如下所示:

(1)data:用于存放下载的训练数据。

(2)docs:帮助文档。

(3)example:一些代码样例。

(4)matlab:MATLAB接口文件。

(5)python:Python接口文件。

(6)model:一些配置好的模型参数。

(7)scripts:一些文档和数据用到的脚本。

(8)tools:保存的源码是用于生成二进制处理程序的,Caffe在训练时实际是直接调用这些二进制文件。

(9)include:Caffe的实现代码的头文件。

(10)src:实现Caffe的源文件。

说明:如果学习Caffe源码,那么主要是学习(9)和(10)。

2. Caffe常用数据集

(1)cifar10数据集 [10][11]

(2)ilsvrc12数据集 [12]

(3)mnist数据集 [13][14]

(4)ImageNet数据集 [15][16]

(5)cifar100数据集 [11]

(6)svhn数据集 [17]

说明:AlexNet是一个深度学习图像分类模型。

 

3. 运行Caffe自带的两个简单例子 [18]

(1)mnist数据集

mnist是一个手写数字库。它的数据训练样本为60000张,测试样本为10000张,每个样本为28*28大小的黑白图片,手写数字为0-9,因此分为10类。

下载该数据集,并且将其转换成为lmdb数据,如下所示:

sudo sh data/mnist/get_mnist.sh

运行成功后,便在data/mnist/目录下生成四个文件:train-images-idx3-ubyte(训练集样本9912422 bytes),train-labels-idx1-ubyte(训练集对应标注28881 bytes),t10k-images-idx3-ubyte(测试集图片1648877 bytes),t10k-labels-idx1-ubyte(测试集对应标注4542 bytes)。

sudo sh examples/mnist/create_mnist.sh

转换成功后,便会在examples/mnist/目录下生成两个文件夹,分别是mnist_train_lmdb和mnist_test_lmdb,里面存放的data.mdb和lock.mdb,就是我们需要的运行数据。

说明:但是当执行sudo sh examples/mnist/create_mnist.sh命令的时候,报错build/examples/mnist/convert_mnist_data.bin: error while loading shared libraries: libcudart.so.7.5: cannot open shared object file: No such file or directory。但是,自己已经配置过了export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH,并且在/usr/local/cuda/lib64下面也有libcudart.so.7.5。这是为什么呢?最后自己的解决方案是将/usr/local/lib,/usr/lib和/usr/local/cuda/lib64全部加入/etc/ld.so.conf,然后执行命令ldconfig即可。
接下来是根据需要修改配置文件,sudo vim examples/mnist/lenet_solver.prototxt,将最后一行solver_mode改成GPU(默认)。运行里子,如下所示:

sudo time sh examples/mnist/train_lenet.sh

说明:该程序运行时间的参考标准是CPU运行时间大约13分钟,GPU运行时间大约4分钟,GPU+cuDNN运行时候大约40秒,精度都为99%左右。

(2)cifar10数据集

cifar10数据训练样本50000张,测试样本10000张,每张为32*32的彩色三通道图片,共分为10类。下载该数据集,并且将其转换成为lmdb数据,如下所示:

sudo sh data/cifar10/get_cifar10.sh

运行成功后,便会在data/cifar10/文件夹下生成一堆bin文件。

sudo sh examples/cifar10/create_cifar10.sh

转换成功后,便会在examples/cifar10/文件夹下生成两个文件夹,分别是cifar10_train_lmdb和cifar10_test_lmdb,这里面的文件就是我们需要的文件。运行例子,如下所示:

sudo time sh examples/cifar10/train_quick.sh

说明:该程序运行时间的参考标准是GPU+cuDNN大约45秒左右,精度75%左右。


4. 关于Caffe的基本概念

(1)Caffe的网络定义

Caffe的网络是有向无环图,它的定义如下所示:

name: "dummy-net"
layers {<span><span>name: <span>"data" …</span></span></span>}
layers {<span><span>name: <span>"conv" …</span></span></span>}
layers {<span><span>name: <span>"pool" …</span></span></span>}
layers {<span><span>name: <span>"loss" …</span></span></span>}

说明:数据及其导数以blobs的形式在层间流动。

(2)Blob

Blob是用于存储数据的4维数组,如下所示:

对于数据:Number*Channel*Height*Width

对于卷积权重:Output*Input*Height*Width

对于卷积偏置:Output*1*1*1

(3)Caffe各层定义

Caffe层的定义由2部分组成,分别是层属性与层参数,如下所示:

name:"conv1"
type:CONVOLUTION
bottom:"data"
top:"conv1"
convolution_param{
    num_output:20
    kernel_size:5
    stride:1
    weight_filler{
        type: "xavier"
    }
}

说明:上述配置文件的前4行是层属性,分别定义了层名称、层类型以及层连接结构(输入blob和输出blob),而后半部分是各种层参数设置。

(3)Caffe的优势

上手快:模型与相应优化都是以文本形式而非代码形式给出。Caffe给出了模型的定义、最优化设置以及预训练的权重,方便立即上手。
速度快:能够运行最棒的模型与海量的数据。Caffe与cuDNN结合使用,测试AlexNet模型,在K40上处理每张图片只需要1.17ms。
模块化:方便扩展到新的任务和设置上。可以使用Caffe提供的各层类型来定义自己的模型。
开放性:公开的代码和参考模型用于再现。
社区好:可以通过BSD-2参与开发与讨论。

(4)Caffe生成的数据格式

Caffe生成的数据格式有2种,分别是Lmdb和Leveldb。如下所示:

它们都是键/值对(Key/Value Pair)嵌入式数据库管理系统编程库。虽然lmdb的内存消耗是leveldb的1.1倍,但是lmdb的速度比leveldb快10%至15%,更重要的是lmdb允许多种训练模型同时读取同一组数据集。因此,lmdb取代了leveldb成为Caffe默认的数据集生成格式。
(5)Google Protocol Buffers

Google Protocol Buffers用来序列化结构化的数据,支持C++、Java和Python语言。该技术最大的特点是节省空间、速度快和灵活性。编写该应用需要三个步骤,如下所示:

1)定义消息格式文件,最好以proto作为后缀名。

2)使用Google提供的protocol buffers编译器来生成代码文件,一般为.h和.cc文件,主要是对消息格式以特定的语言方式描述。

3)使用protocol buffers库提供的API编写应用程序。

说明:关于protobuf和lmdb的安装,请参考文献[6]。要解析一个protobuf类型数据,首先你要告诉计算机这个protobuf数据内部格式(即有哪些项,这些项各是什么数据类型的决定了占用多少字节,这些项可否重复,重复几次),安装protobuf这个module就可以使用protobuf专用的语法来定义这些格式,然后用protoc来编译这个.proto文件就可以生成你需要的目标文件。

编译.proto文件,如下所示:

protoc --proto_path=IMPORT_PATH --cpp_out=DST_DIR --java_out=DST_DIR --python_out=DST_DIR IMPORT_PATH/file.proto

解析:

1)--proto_path:它也可以简写成-I,是.proto所在的目录。

2)--cpp_out:生成C++可用的头文件的目录,包含***.pb.h(包含申明类),***.pb.cc(包含可执行类),使用的时候只要include "***.pb.h"即可。

3)--java_out:生成Java可用的头文件的目录。

4)--python_out:生成Python可用的头文件的目录,包含**_pb2.py,使用的时候import **_pb2.py即可。

5)IMPORT_PATH/file.proto:你的.proto文件完整路径。

(6)Decaf,Glog,lebeldbCBLAS library,CUBLAS library

解析:

1)Decaf是Caffe的CPU版本。

2)Google Logging library (Glog):一个C++语言的应用级日志记录框架,提供了C++风格的流操作和各种助手宏。

3)leveldb (数据存储):一个Google实现的非常高效的kv数据库,单进程操作。

4)CBLAS library:CPU版本的矩阵操作。

5)CUBLAS library:GPU版本的矩阵操作。


5. Caffe的架构

1)预处理图像的leveldb构建
输入:一批图像和label (2和3)
输出:leveldb (4)
指令里包含信息,如下所示:

  1. conver_imageset (构建leveldb的可运行程序)。
  2. train/ (此目录放处理的jpg或者其他格式的图像)。
  3. label.txt (图像文件名及其label信息)。
  4. 输出的leveldb文件夹的名字。
  5. CPU/GPU (指定是在cpu上还是在gpu上运行代码)。

2)CNN网络配置文件

  1. Imagenet_solver.prototxt (包含全局参数的配置的文件)。
  2. Imagenet.prototxt (包含训练网络的配置的文件)。
  3. Imagenet_val.prototxt (包含测试网络的配置文件。

说明:

(1)Deep Learning使用Rectified Linear Units (ReLUs)无需pretraining。(激励层)[23]

(2)LRN全称为Local Response Normalization,即局部响应归一化层。它的具体实现在CAFFE_ROOT/src/caffe/layers/lrn_layer.cpp和同一目录下的lrn_layer.cu中。


6. 图像分类模型AlexNet解读

Alex提出的AlexNet网络模型在2012界的ImageNet图像分类Challenge上取得冠军。因此,要研究CNN类型Deep Learning网络模型在图像分类上的应用,就逃不开研究AlexNet这个经典的模型。同样,Caffe也给出了AlexNet的开源实现,具体配置文件参考train_val.prototxtAlexNet各层详细解读,如下所示:

1)conv1阶段DFD(data flow diagram),如下所示:

2)conv2阶段DFD(data flow diagram),如下所示:

3)conv3阶段DFD(data flow diagram),如下所示:

4)conv4阶段DFD(data flow diagram),如下所示:

5)conv5阶段DFD(data flow diagram),如下所示:

6)fc6阶段DFD(data flow diagram),如下所示:

7)fc7阶段DFD(data flow diagram),如下所示:

8)fc8阶段DFD(data flow diagram),如下所示:

说明:Caffe中各种layer的operation更多解释可以参考Caffe Layer Catalogue


7. CIFAR-10在Caffe上进行训练与学习

(1)数据库CIFAR-10

该数据库包含60000张32X32彩色图像10类,50000张训练集,10000张测试集。如下所示:

CIFAR-10

(2)准备

执行命令,如下所示:

cd $CAFFE_ROOT/data/cifar10
./get_cifar10.sh
cd $CAFFE_ROOT/examples/cifar10
./create_cifar10.sh

说明:执行命令结束后,将会在$caffe/examples/cifar10中出现数据库文件cifar10_train_lmdb和cifar10_test_lmdb和数据库图像均值二进制文件mean.binaryproto。

(3)模型

该CNN由卷积层,POOLing层,非线性变换层,在顶端的局部对比归一化线性分类器组成。该模型的定义在CAFFE_ROOT/examples/cifar10目录的cifar10_quick_train_test.prototxt文件中,并且可以对其进行修改。需要说明的是后缀为prototxt的文件都是配置文件。

(4)训练和测试

当我们设置好参数文件cifar10_quick_solver.prototxt和定义的文件cifar10_quick_train_test.prototxt和cifar10_quick_test.prototxt后。如下所示:

cd $CAFFE_ROOT/examples/cifar10
./train_quick.sh

说明:

每100次迭代显示一次lr(learning rate)和loss(训练损失函数)。每500次测试一次,输出score #0(准确率)和score #1(测试损失函数)。当5000次迭代结束后,正确率约为75%,模型的参数存储在二进制protobuf格式的cifar10_quick_iter_5000文件中。然后,这个模型就可以在新的数据集上面做分类了。


参考文献:

[1] Setting up a Deep Learning Machine from Scratch (Software):https://github.com/saiprashanths/dl-setup#caffe

[2] Caffe:http://caffe.berkeleyvision.org/

[3] Caffe:https://github.com/BVLC/caffe

[4] 知乎Caffe:http://www.zhihu.com/search?type=content&q=Caffe

[5] Caffe —— Deep learning in Practice:http://blog.csdn.net/abcjennifer/article/details/46424949

[6] Caffe深度学习框架上手教程:http://www.csdn.net/article/2015-01-22/2823663

[7] Caffe Demos:http://demo.caffe.berkeleyvision.org/

[8] Yangqing Jia (贾扬清):http://daggerfs.com/

[9] Caffe目录结构:http://blog.csdn.net/mounty_fsc/article/details/51034732

[10] CIFAR-10 - Object Recognition in Images:https://www.kaggle.com/c/cifar-10/

[11] CIFAR:http://www.cs.toronto.edu/~kriz/cifar.html

[12] ILSVRC2012:http://www.image-net.org/challenges/LSVRC/2012/results.html

[13] THE MNIST DATABASE of handwritten digits:http://yann.lecun.com/exdb/mnist/

[14] LeNet-5, convolutional neural networks:http://yann.lecun.com/exdb/lenet/

[15] ImageNet:http://www.image-net.org/

[16] ImageNet挑战赛中超越人类的计算机视觉系统:http://www.csdn.net/article/2015-02-11/2823929-microsoft-in-imagenet-challenges

[17] The Street View House Numbers (SVHN) Dataset:http://ufldl.stanford.edu/housenumbers/

[18] 运行Caffe自带的两个简单例子:http://www.mamicode.com/info-detail-1160346.html

[19] 深度学习Imagenet caffe AlexNet实验步骤:http://blog.csdn.net/drdeep/article/details/50835974

[20] Caffe——Mnist数据集创建lmdb或leveldb类型的数据:blog.csdn.net/whiteinblue/article/details/45330801

[21] Google Protocol Buffers浅析:http://www.cnblogs.com/royenhome/archive/2010/10/29/1864860.html

[22] Caffe源码导读:http://blog.csdn.net/column/details/caffe-source-clue.html

[23] ReLU (Rectified Linear Units)激活函数:http://www.mamicode.com/info-detail-873243.html

Logo

更多推荐