2.1 ProtoBuffer
ProtoBuffer是由 google 开发的一种可以实现内存与非易失性存储介质(如硬盘文件)交换的协议接口。Caffe 源码中大量使用了 Protobuffer 作为权值和模型参数的载体。
ProtoBuffer 工具完美地解决了“不一致的参数管理”这个问题,用户只需建立统一的参数描述文件(proto),然后利用 proto 编译就能让协议细节等关键部分代码自动生成,节省了大量的开发、调试时间。
使用 ProtoBuffer 还可以跨语言(C++/Java/Python)传递相同的数据结构。
solver.prototxt 文件中记录了一些模型训练所需的超参数(Hyper-Parameter),用 Caffe 训练时会首先读取该文件,获得其中特定字段的数值,并据此设置内存中模型训练时的超参数设置值,从文件读取到内存的过程就是由 ProtoBuffer 工具协助完成。
caffe.pb.h 和 caffe.pb.cc 就是用于解析 Caffe 参数配置文件、将模型权值序列化/反序列化到磁盘的协议接口。
2.2 Boost
Caffe 中主要使用了 Boost 中的智能指针,其自带引用计数功能,可避免共享指针时造成内存泄漏或多次释放。
另外,pycaffe 使用 Boost Python 实现 C/C++ 和 Python 语言的连接,方便 Python 调用 C/C++ 设计的模块。
2.3 GFLAGS
GFLAGS 在 caffe 中主要起到命令行参数解析的作用,这与 ProtoBuffer 功能类似,