Caffe学习系列——1介绍与安装过程

Contents

  1. 1. 在Ubuntu上安装caffe
    1. 1.1. 1.安装依赖
    2. 1.2. 2.安装Caffe
    3. 1.3. 3.编译
    4. 1.4. 4.使用Caffe测试MINST
    5. 1.5. 5.安装过程问题记录及其解决方法
  2. 2. Caffe结构
    1. 2.1. 1.Caffe目录结构:
    2. 2.2. 2.Caffe的三级结构

Caffe是一个高效,模块化的深度学习框架,其作者是毕业于UC Berkeley的博士贾扬清。Cafe是纯粹的C++/CUDA架构,支持命令行、Python和MATLAB接口;可以在CPU和GPU(CPU与GPU的区别)之间无缝切换。
Caffe的优势:

  1. 上手快:模型与相应优化都是以文本形式标示,方便立即上手以及调参
  2. 速度快:能够运行最优化的模型与海量数据
  3. 模块化:方便扩展到新的任务和设置上。可以使用Caffe提供的各层类型来定义自己的模型
  4. 开放性:可以基于公开的代码和参考模型实现自己的模型
  5. 社区好:可以通过BSD-2参与开发与讨论

学习Caffe可以看看网提供的两个文档:一个是DIY Deep Learning for Vision with Caffe,这是伯克利介绍caffe的PPT,可以快速的了解什么是Caffe。还有一个是Model Zoo,这是目前基于Caffe上实现的模型与深度学习例子,可以大致浏览一下。
本文主要分三个部分:第一个部分是参照官网进行的安装过程,包括安装过程中遇到的问题及解决方法,第二个部分是对Caffe整个结构的介绍。

在Ubuntu上安装caffe

1.安装依赖

1
2
3
sudo apt-get install libatlas-base-dev
sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev
sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev protobuf-compiler

2.安装Caffe

从github上下载下来

git clone https://github.com/BVLC/caffe.git

进入caffe目录,复制Makefile.config,这是用来配置caffe的

1
2
cd caffe
cp Makefile.config.example Makefile.config

根据需要情况修改Makefile.config
vi Makefile.config

  1. 假如你没有使用GPU来进行运算的话,需要将CPU_ONLY := 1注释去掉
  2. 去掉BLAS:=open 注释
  3. 设置MATLAB和Python接口

假如你安装了matlab,需要将matlab的安装目录写到MATLAB_DIR中,python可以选择是使用Ubuntu自带的python,或者安装Anaconda。若使用Anaconda,则需注意安装的路径并进行相应的更改:
去掉PYTHON_LIB := /usr/lib注释
如果后续需要用Python编写层,则需要将WITH_PYTHON_LAYER := 2注释去掉,也可以先暂时不用去,要用到的时候再修改,然后重新编译即可。
这两个配置注释也需要去掉
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib

3.编译

1
2
make all
make pycaffe

如果安装了matlab的话:
make matcaffe
编译过程不应该报错,若报错,修改完错误,需要make clean一下,然后重新编译。编译完后需要测试一下

1
2
make test
make runtest

4.使用Caffe测试MINST

1
2
3
4
5
cd caffe
sh data/mnist/get_mnist.sh
sh examples/mnist/create_mnist.sh
vi examples/mnist/lenet_solver.prototxt
# 若你的服务器不是使用GPU,则需修改 solver_mode 为 CPU

5.安装过程问题记录及其解决方法

  1. import caffe 报错:no module name _caffe
    解决方法:
    (1).python调用ceffe接口,需要确保已经 make pycaffe
    (2).在本地环境变量中export PYTHONPATH
    export PYTHONPATH=/home/linbiyuan/caffe/python:$PYTHONPATH
  2. import caffe 报错

    import caffe
    Traceback (most recent call last):
    File ““, line 1, in
    File “/home/linbiyuan/caffe/python/caffe/init.py”, line 1, in
    from .pycaffe import Net, SGDSolver, NesterovSolver, AdaGradSolver, RMSPropSolver, AdaDeltaSolver, AdamSolver
    File “/home/linbiyuan/caffe/python/caffe/pycaffe.py”, line 15, in
    import caffe.io
    File “/home/linbiyuan/caffe/python/caffe/io.py”, line 8, in
    from caffe.proto import caffe_pb2
    File “/home/linbiyuan/caffe/python/caffe/proto/caffe_pb2.py”, line 4, in
    from google.protobuf.internal import enum_type_wrapper
    ImportError: No module named google.protobuf.internal
    解决方法:重新安装protobuf:
    (1)普通安装pip install protobuf
    (2)用anaconda安装 /home/linbiyuan/anaconda2/bin/pip install protobuf

  3. TypeError:constructor returned NULL

    这个问题是由matplotlib引起的,你可以在每一个python脚本的头部加上这两行。这个会迫使matplotlib不会尝试加载GTK。
    1
    2
    import matplotlib 
    matplotlib.use('Agg')

Caffe结构

1.Caffe目录结构:

主要文件夹:
data:存放下砸的训练数据等
docs:帮助文档
example:代码样例
matlab:Matlab接口文件
python:python接口文件
model:一些配置好的模型参数
scripts:一些文档和数据会用到的脚本
核心代码文件夹:
tools:用于生产二进制处理程序的源码,Caffe在训练时直接调用这些二进制文件
include:caffe实现代码的头文件
src:caffe的源文件

2.Caffe的三级结构

根据Caffe官方文档介绍,Caffe可以大致分为三层结构blob,layer,net。
Blob:Caffe的基本数据结构,用于数据的保存,交换以及操作,可以保存学习到的参数以及网络传输过程中产生数据的类。
Layer:网络的基本单元,由此派生出各种层类。
Net:整合并连接Layer组合成网络。Solver是Net的求解,包括一些训练的参数。

1. Blob
Caffe使用blobs来存储和转换数据,具有CPU和GPU之间同步的能力。Blob提供了一个统一的内存接口来保存数据,例如批量图片,模型参数等。对于批处理图片数据,传统的blob数据维度为 number N x channel K x height H x width W,在内存上是以行进行存储的,因此在 (n, k, h, w)位置的blob的物理位置为((n K + k) H + h) W + w,其中Number N是batch size。channel K是特征维度。由于Caffe支持CUDA,所以在数据级别上进行了优化,可以在尽可能小的内存占用下获得很高的效率。
2. Layer
Caffe十分强调网络的层次性。layer实现了卷及操作,非线性变换(ReLu),Pooling,权值连接等操作。

在Layerz中,input data用bottom表示;output data用top表示。每一层定义了三种操作setup(Layer初始化),forword(正向传导,根据input计算output梯度),backward(反向传导计算,根据output计算input梯度)forward和backward都有GPU和CPU两个版本的实现。
*3. Net

Net用容器的形式将多个Layer有序地放在一起,其自身实现的功能主要是对逐层Layer进行初始化,以及提供Update( )的接口(更新网络参数),本身不能对参数进行有效地学习过程。 他们是对整个网络的前向和反向传导,各调用一次就可以计算出网络的loss了。
Solver类中包含一个Net的指针,主要是实现了训练模型参数所采用的优化算法,它所派生的类就可以对整个网络进行训练了。