caffe源码解析-开篇

阅读 195
收藏 2
2017-07-04
原文链接:zhuanlan.zhihu.com

年前有一段时间在阅读caffe源码,近日又重新拾起。 目前发现了很多优秀的博客,例如: Caffe Source Code AnalysisCaffe代码解析(1) 。尤其是Ldy 整理了一个开源项目BUPTLdy/Caffe_Code_Analysis 把一部分caffe源码分析的资料做了总结,还提供了带注释源码。

我个人学习知识的习惯是必须要写出来 书写是为了更好的思考,能教会别人才是真正的理解。 所以打算写一个caffe源码解析系列。很多内容都是引用自各位博主的文章,加上自己的理解和补充。如有不当,可私信交涉。


先说说caffe框架的整体结构:

摘自:Caffe Source Code Analysis

一般在介绍Caffe代码结构的时候,大家都会说Caffe主要由Blob Layer Net 和 Solver这几个部分组成。

  • Blob 主要用来表示网络中的数据,包括训练数据,网络各层自身的参数(包括权值、偏置以及它们的梯度),网络之间传递的数据都是通过 Blob 来实现的,同时 Blob 数据也支持在 CPU 与 GPU 上存储,能够在两者之间做同步。
  • Layer 是对神经网络中各种层的一个抽象,包括我们熟知的卷积层和下采样层,还有全连接层和各种激活函数层等等。同时每种 Layer 都实现了前向传播和反向传播,并通过 Blob 来传递数据。
  • Net 是对整个网络的表示,由各种 Layer 前后连接组合而成,也是我们所构建的网络模型。
  • Solver 定义了针对 Net 网络模型的求解方法,记录网络的训练过程,保存网络模型参数,中断并恢复网络的训练过程。自定义 Solver 能够实现不同的网络求解方式。

我的计划是按照 alanse7en在 Caffe代码解析(1) 中的思路

从外部接口逐渐深入,首先学习caffe的主函数的接口,然后是Solver特别是默认使用的SGDSolver的具体实现,调用了哪些Net的接口等;接下来学习和了解Net是如何封装各个Layer来组成一个整体的网络,还有就是Net中如何利用Layer的接口完成数据的forward和backward的传导;最后具体了解不同的Layer如何实现自定义的forward()和backward()接口,完成最重要的计算。虽然目前Caffe已经实现了多GPU并行化的功能,但是在这个学习的过程中,我将暂时忽略这一部分的代码,而集中注意力到前面所述的这几部分内容上。

所以目录大概会是:


1. 辅助库:Google Protocol Buffer , Google Flags,math_function 等
2. 命令行接口
3. solver
4. net
5. layer
6. blob

目前已经完成如下:



本篇将作为本系列文章的目录持续更新。


书写是为了更好的思考,能教会别人才是真正的理解。


参考:




评论