Caffe代码导读(0):路线图

【Caffe是什么?】

Caffe是一个深度学习框架,以代码整洁、可读性强、运行速度快著称。代码地址为:https://github.com/BVLC/caffe

【博客目的】

从接触Caffe、编译运行、阅读代码、修改代码一路走来,学习到不少内容,包括深度学习理论,卷积神经网络算法实现,数学库MKL,计算机视觉库OpenCV,C++模板类使用,CUDA程序编写……

本博客目的是为初学者清除代码阅读中的障碍,结合官网文档、融入个人理解、注重动手实践。

【如何开始】

在开始阅读Caffe代码之前,应该做好下面几件事:

(1)下载Caffe源码;

(2)配置开发环境(安装CUDA、OpenCV、boost、leveldb、lmdb、Python等,安装步骤参考http://tutorial.caffe.berkeleyvision.org/installation.html);

(3)编译;

(4)运行例子(如MNIST、CIFAR10、ImageNet等);

【路线图】

(1)Caffe源码阅读路线图应该是从CAFFE_ROOT/src/caffe/proto/caffe.proto开始,了解各类数据结构,主要是内存对象和序列化磁盘文件的一一对应关系,知道如何从磁盘Load一个对象到内存,以及如何将内存对象Save到磁盘,中间的过程实现都是由Protobuf自动完成的。

(2)第二步就是看头文件,不用急于去看cpp文件,先理解整个框架。Caffe中类数目众多,但脉络十分清晰。在Testing时,最外层的类是Caffe::Net,包含了多个Caffe::Layer对象,而Layer对象派生出神经网络多种不同层的类(DataLayer, ConvolutionLayer, InnerProductionLayer, AccurancyLayer等),每层会有相应的输入输出(Blob对象)以及层的参数(可选,Blob对象);Blob中包括了SyncedMemory对象,统一了CPU和GPU存储器。自顶向下去看这些类,结合理论知识很容易掌握使用方法。

(3)第三步就是有针对性地去看cpp和cu文件了。一般而言,Caffe框架不需要修改,只需要增加新的层实现即可。例如你想自己实现卷积层,只需从ConvolutionLayer派生一个新类MyConvolutionLayer,然后将几个虚函数改成自己的实现即可。所以这一阶段关注点在算法上,而不是源码本身。

(4)第四步就很自由了,可以编写各类工具,集成到Caffe内部。在CAFFE_ROOT/tools/下面有很多实用工具,可以根据需要修改。例如从训练好的模型中抽取参数进行可视化可以用Python结合matplot实现。

(5)接下来,如果想更深层次学习,最好是自己重新写一遍Caffe(时间充裕的情况)。跳出现有的框架,重新构建自己的框架,通过对比就能学到更多内容。

时间: 2024-10-06 00:18:33

Caffe代码导读(0):路线图的相关文章

Caffe代码导读(4):数据集准备

Caffe上面有两个比较简单的例子:MNIST和CIFAR-10,前者是用于手写数字识别的,后者用于小图片分类.这两个数据集可以在Caffe源码框架中用脚本(CAFFE_ROOT/data/mnist/get_mnist.sh和CAFFE_ROOT/data/cifar10/get_cifar10.sh)下载,如下图所示: $ ./get_cifar10.sh Downloading... --2014-12-02 01:20:12--  http://www.cs.toronto.edu/~k

Caffe代码导读(1):Protobuf例子

Protobuf是一种可以实现内存与外存交换的协议接口.这是由谷歌开发的开源工具,目前研究Caffe源码时用到. 一个软件项目 = 数据结构 + 算法 + 参数,对于数据结构和算法我们都已经有较多研究,但不同开发者对参数管理却各有千秋.有人喜欢TXT格式化的参数文件,有人喜欢BIN简单高效,也有人喜欢图形化界面的直观.不一致的参数管理带来很多问题,例如一个项目组内不同成员必须约定一套统一的参数方案,或者称为通信协议,这样便于模块集成.而Protobuf工具就完美解决了这个问题,关键部分代码自动生

Caffe代码导读(5):对数据集进行Testing

上一篇介绍了如何准备数据集,做好准备之后我们先看怎样对训练好的模型进行Testing. 先用手写体识别例子,MNIST是数据集(包括训练数据和测试数据),深度学习模型采用LeNet(具体介绍见http://yann.lecun.com/exdb/lenet/),由Yann LeCun教授提出. 如果你编译好了Caffe,那么在CAFFE_ROOT下运行如下命令: $ ./build/tools/caffe.bin test -model=examples/mnist/lenet_train_te

Caffe代码导读(3):LevelDB例程

Caffe自带例子Cifar10中使用leveldb存储输入数据,为此我们研究一下怎样使用它.安装步骤可以参考http://blog.csdn.net/kangqing2003/article/details/6658345 Leveldb库提供了一种持续的键值对存储方式.键和值可以为任意字节数组.键存储顺序可由用户定义的比较函数决定. 打开一个数据库 Leveldb数据库有个与文件系统目录相对应的名字.数据库的所有内容都保存在这个目录中.下面例子展示了怎样打开一个数据库,必要时创建它: #in

Caffe代码导读(2):LMDB简介

闪电般的内存映射型数据库管理(LMDB) 简介 LMDB是基于二叉树的数据库管理库,建模基于伯克利数据库的应用程序接口,但做了大幅精简.整个数据库都是内存映射型的,所有数据获取返回数据都是直接从映射的内存中返回,所以获取数据时没有malloc或memcpy发生.因此该数据库仍是非常简单的,因为它不需要自己的页面缓存层,并且非常高效.省内存.它在语义上完全符合ACID(原子性.一致性.隔离性.持久性).当内存映射为只读时,数据库完整性不会被应用程序的迷失指针写破坏.   该库也是线程可见的,支持来

AS代码2.0:新的语言元素

Flash的ActionScript(简称AS)代码控制是Flash实现交互性的重要组成部分,也是区别于其他动画软件的看家本领.今年新发布的Flash MX Professional 2004的动作脚本语言已经升级到2.0,它是一种面向对象的脚本语言,执行ECMA-262脚本语言规范,支持继承.强类型和事件模型.使用动作脚本语言2.0可以编写出更加稳健的脚本. 动作脚本语言2.0的新特性包括:新的语言元素.改进的编辑和调试工具.引入更多.的面向对象编程模型. 本系列文章将向大家详细介绍AS代码2

gcc vc++6.0-同样代码VC6.0结果正确,GCC编译运行结果不正确,原因是什么呢?谢谢!

问题描述 同样代码VC6.0结果正确,GCC编译运行结果不正确,原因是什么呢?谢谢! #include int main() { char deno[1000]={''},num,i=0,remain=0; scanf("%s %d",deno,&num); //获取被除数.除数 if(!num) return (-1); while(deno[i]!='') deno[i++]-='0'; //转换成数字 deno[i]='#'; //结束标志 i=0; while(deno

AS代码2.0:针对Flash Player 7

如果你现有的脚本是针对Flash 6或更早版本的播放器编写的,但又想针对 Flash 7播放器发布,你可能需要修改你的脚本,以便它们符合 Flash 7播放器的执行要求并能按设计思路工作.下面我们就介绍这些相关知识. Flash Player 7比以前的Flash播放器支持更多的动作脚本命令,可以使用这些命令来编写更稳健的脚本.不过,如果在现有的脚本中使用了这些命令,并针对Flash 7播放器发布该脚本,它也许不能正确工作.例如,如果你有一个脚本,其中有一个函数名使用了Error,该脚本也许可以

AS代码2.0:脚本编辑和调试

脚本 Flash MX Professional 2004的动作脚本语言已经升级到2.0,它的编辑和调试工具也有一些改进,下面我们就来看看动作脚本编辑器的变化和代码调试的变化 . 一.动作脚本编辑器的变化 Flash MX Professional 2004动作脚本编辑器在很多方面已经更新,更加稳健和容易使用.主要的变化和功能改进如下: 字绕排 可以使用脚本窗口.调试器面板和输出面板的Options(选项)弹出菜单启用或禁用字绕排.你也可以使用动作面板的弹出菜单锁定字绕排.键盘快捷键是Contr