caffe源码追踪-- Google Protocol Buffer

来源:互联网 发布:社交网络电影图解 编辑:程序博客网 时间:2024/05/18 00:59

我们采用从宏观到微观的思路来梳理caffe源码.
很多会使用caffe框架的人都知道,当在caffe中添加新层时,我们需要在caffe.proto文件中添加新层的定义操作;或是拿到一个网络模型文件deploy.prototxt,caffe框架能够识别这个由基本键值对构成的网络描述方式,并将参数给到特定层,这些实现都离不开 Protocol Buffer.因此我们把 Protocol Buffer放到最开始来讲.
Protocol Buffers 是一种轻便高效的结构化数据存储格式.所谓结构化数据就是能够用统一的结构来表示的数据,比如文字,符号;非结构化数据则如全文文本、图象、声音、影视、超媒体等.
简单讲一下怎么使用:
首先编写little.sun.proto文件,来定义需要进行处理的结构化数据:

package little;  message sun  {     required string    str = 1;  // str     optional int32     opt = 2;  //optional field  }

Protocol Buffers的对数据结构定义类似与C++语言.package类似与C++的命名空间(namespace),message类似于C++的类.message中的每一个字段需要一个属性说明(required,optional或者repeated)和类型说明(string,int32,enum等),字段等号右侧的数字可以理解为其在二进制编码中所对应的键值,通常为了节省存储空间,将常用字段的键值定义为较小的数字(比如0-15),非常用的字段则会使用较大的数值。required的字段要求必须存在,可以出现0或多次,而optional的字段则可以不存在。optional属性对Protocol Buffer新旧版本的兼容性问题提供了很好的解决,比如新版本的message中新加了一个字段,只要将其属性设置为optional,就可以保证新版本的代码读取旧版本的数据也不会出错,新版本只会认为旧版本的数据没有提供这个optional 字段。
接着用protoc编译little.sun.proto文件,编译过后会产生little.sun.pb.h和little.sun.pb.cc两个文件,前者包含sun类的头文件,后者是一些类相关标准化操作的实现文件;
然后就可以编写自己的处理程序来调用sun类.
知道了Protocol Buffer,我们再来看看caffe.proto文件(位于caffe/src/caffe/proto文件夹):
这里写图片描述
这里随手截取了文件里的一个message定义.编译caffe.proto同样会生成caffe.pb.h和caffe.pb.cc文件(位于caffe/build/src/caffe/proto文件夹).caffe.pb.h中是关于一些类的定义,caffe.pb.cc是一些相关的一些标准化操作,比如使用者可以利用这些操作的接口函数来获取和改变某个字段的值.