Contents
Caffe是一个高效,模块化的深度学习框架,其作者是毕业于UC Berkeley的博士贾扬清。Cafe是纯粹的C++/CUDA架构,支持命令行、Python和MATLAB接口;可以在CPU和GPU(CPU与GPU的区别)之间无缝切换。
Caffe的优势:
- 上手快:模型与相应优化都是以文本形式标示,方便立即上手以及调参
- 速度快:能够运行最优化的模型与海量数据
- 模块化:方便扩展到新的任务和设置上。可以使用Caffe提供的各层类型来定义自己的模型
- 开放性:可以基于公开的代码和参考模型实现自己的模型
- 社区好:可以通过BSD-2参与开发与讨论
学习Caffe可以看看网提供的两个文档:一个是DIY Deep Learning for Vision with Caffe,这是伯克利介绍caffe的PPT,可以快速的了解什么是Caffe。还有一个是Model Zoo,这是目前基于Caffe上实现的模型与深度学习例子,可以大致浏览一下。
本文主要分三个部分:第一个部分是参照官网进行的安装过程,包括安装过程中遇到的问题及解决方法,第二个部分是对Caffe整个结构的介绍。
在Ubuntu上安装caffe
1.安装依赖
1 | sudo apt-get install libatlas-base-dev |
2.安装Caffe
从github上下载下来
git clone https://github.com/BVLC/caffe.git
进入caffe目录,复制Makefile.config,这是用来配置caffe的1
2cd caffe
cp Makefile.config.example Makefile.config
根据需要情况修改Makefile.config
vi Makefile.config
- 假如你没有使用GPU来进行运算的话,需要将CPU_ONLY := 1注释去掉
- 去掉BLAS:=open 注释
- 设置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 | make all |
如果安装了matlab的话:
make matcaffe
编译过程不应该报错,若报错,修改完错误,需要make clean一下,然后重新编译。编译完后需要测试一下1
2make test
make runtest
4.使用Caffe测试MINST
1 | cd caffe |
5.安装过程问题记录及其解决方法
- import caffe 报错:no module name _caffe
解决方法:
(1).python调用ceffe接口,需要确保已经 make pycaffe
(2).在本地环境变量中export PYTHONPATH
export PYTHONPATH=/home/linbiyuan/caffe/python:$PYTHONPATH - 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 - TypeError:constructor returned NULL
这个问题是由matplotlib引起的,你可以在每一个python脚本的头部加上这两行。这个会迫使matplotlib不会尝试加载GTK。1
2import 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的指针,主要是实现了训练模型参数所采用的优化算法,它所派生的类就可以对整个网络进行训练了。