Caffe学习日记1
为什么要学习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是可以选择的
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,lebeldb,CBLAS 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)
指令里包含信息,如下所示:
- conver_imageset (构建leveldb的可运行程序)。
- train/ (此目录放处理的jpg或者其他格式的图像)。
- label.txt (图像文件名及其label信息)。
- 输出的leveldb文件夹的名字。
- CPU/GPU (指定是在cpu上还是在gpu上运行代码)。
2)CNN网络配置文件
- Imagenet_solver.prototxt (包含全局参数的配置的文件)。
- Imagenet.prototxt (包含训练网络的配置的文件)。
- 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.prototxt。AlexNet各层详细解读,如下所示:
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张测试集。如下所示:
(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
更多推荐
所有评论(0)