Caffe的项目架构和源码解析

Caffe是一个基于c++/cuda语言的深度学习框架,开发者能够利用它自由的组成自己想要的网络。目前支持卷积神经网络和全连接神经网络(人工神经网络)。Linux上,c++可以通过命令行来操作接口,matlab、Python有专门的接口,运算支持gpu也支持cpu,目前版本能够支持多gpu,但是分布式多机版本仍在开发中。大量的研究者都在采用caffe的架构,并且也得到了很多有效的成果。2013年9月-12月,贾扬清在伯克利大学准备毕业论文的时候开发了caffe最初的版本,后期有其他的牛人加入之后,近两年的不断优化,到现在成了最受欢迎的深度学习框架。近期,caffe2也开源了,但是仍旧在开发。本文主要主要基于源代码的层面来对caffe进行解读,并且给出了几个自己在测试的过程中感兴趣的东西。

Ubuntu 16.04下Matlab2014a+Anaconda2+OpenCV3.1+Caffe安装

Ubuntu 16.04系统下CUDA7.5配置Caffe教程

Caffe在Ubuntu 14.04 64bit 下的安装

Caffe + Ubuntu 14.04 64bit + CUDA 6.5 配置说明 

1.如何调试

为了能够调试,首先要在makefile的配置文件中将DEBUG选项设置为1,这步谨慎选择,debug版本会在打印输出的时候输出大量的每个阶段耗时,也可直接从整个项目的caffe.cpp入手来查看源文件。编译好可调试的版本之后,执行下面的指令可以启动调试。

gdb --args ./build/tools/caffe train –solver=examples/cifar10/cifar10_full_solver.prototxt

调试过程中需要注意的一个问题是,源码中使用了函数指针,执行下一步很容易就跳过了,所以要在合适的时机使用s来进入函数。

2.第三方库 gflags

gflags是Google出的一个能够简化命令行参数处理的工具,在c++代码中定义实际意义,在命令行中将参数传进去。例如下面的例子中,c++的代码中声明这样的内容,DEFINE_string是一个string类型,括号内的solver就是一个flag,这个flag从命令行中读取的参数就会解析成string,存在FLAGS_solver中,使用时当成正常的string使用即可。在命令行调用时(参见调试部分举出的例子),用-solver=xxxxx,将实际的值给传递进去。这里的string可以替换成int32/int64/bool等。

DEFINE_string(solver, “”, “The solver definition protocol buffer text file.”);

需要注意的时,这个定义过程只能在一个文件中定义一次,其他文件要是想用的话可以有两种选择,一种是直接在需要的文件中declare,一种方式在一个头文件中declare,其他文件要用就直接include。声明方式如下:

DECLARE_bool(solver);

假如需要设置bool变量为false,一个简便的方法是在变量前面加上no,即变成-nosolver。此外,–会导致解析停止,例如下面的式子中,f1是flag,它的值为1,但是f2并不是2。

foo -f1 1 – -f2 2

Protobuf

Google Protocol Buffer(简称Protobuf)是Google公司内部的混合语言数据标准,目前已经正在使用的有超过48,162种报文格式定义和超过12,183个.proto文件。它是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化、序列化结构数据,自己定义一次数据如何结构化,目前提供了c++、java、python三种语言的API。相对于xml优点在于简单、体积小、读取处理时间快、更少产生歧义、更容易产生易于编程的类。

就caffe而言,这个工具的用处体现在生成caffe所需的参数类,这些类能从以.prototxt结尾的文件中解析参数,然后对应生成Net、Layer的参数。自己定义序列化文件a.proto,文件内容如图1,以关键词message来定义一个类,本图中它是卷积层的参数类,这个类的成员类型有bool和uint32等,也可用自己定义的类型。等号后面的数字是一个唯一的编号tag,来区分这些不同参数,在官方文档中这些称为field。可以在一个.proto中定义多个message,注释风格与c/c++一致。定义好的proto进行编译后生成.h和.cc对应c++的头文件和源文件。

1

图1 自定义proto

图2是编译后自动生成的文件,可以看到生成了ConvolutionalParameter类。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/2b8e84b5eaf465290a3430aeec0151c3.html