caffe 之 protobuf

来源:互联网 发布:淘宝商品有质量问题 编辑:程序博客网 时间:2024/05/29 03:02
著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:Vinjn张静
链接:http://zhuanlan.zhihu.com/hacker-and-painter/20435591
来源:知乎

Protobuf 定义

Protobuf 是google开源的一个序列化协议,可以通过在proto文件中定义结构化类型,生成平台无关的C++、Java、Python等多种语言的序列化,反序列化源码。比如我们定义

enum Phase {    TRAIN = 0;    TEST = 1;}message NetState {    optional Phase phase = 1 [default = TEST];}

保存成proto.txt,运行 protoc--cpp_out=. proto.txt,生成proto.txt.pb.hproto.txt.pb.cpp,从中可以看到类NetState的定义

enum Phase {   TRAIN = 0,   TEST = 1};class NetState : public ::google::protobuf::Message {     ……     ::Phase phase() const;     void set_phase(::Phase value);     ……};

简单的5句话就可以实现NetState的反序列化:

NetState state;int fd = open(filename, O_RDONLY);ZeroCopyInputStream* raw_input = new FileInputStream(fd);CodedInputStream* coded_input = new CodedInputStream(raw_input);bool success = state->ParseFromCodedStream(coded_input);


著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:Vinjn张静
链接:http://zhuanlan.zhihu.com/hacker-and-painter/20435591
来源:知乎

Caffe 中的 Protobuf

了解 Protobuf 原理后,我们再来看caffe的结构,协议定义在caffe/src/caffe/proto/caffe.proto,通过makefile调用protoc,将C++代码生成在

src/caffe/proto/caffe.pb.hsrc/caffe/proto/caffe.pb.cc

Python代码生成在

install/python/caffe/proto/caffe_pb2.py

接下来我们从caffe的使用来看看用户配置了哪些文件,来回推 Protobuf 的协议以及它是怎么样加载进去的。

examples/mnist 为例,我们使用最简单的命令来训练网络

Build/tools/caffe train -solver= lenet_solver.prototxt

看看lenet_solver.prototxt的内容,包含了learningrate, learning policy, test interval,最重要的一行是

net:"examples/mnist/lenet_train_test.prototxt"

可以知道 lenet_train_test.prototxt 定义了train/test时候的网络结构,打开文件我们可以看到定义的不同layer,这里以第一个datalayer为例,

layers {  name: "mnist"  type: DATA  top: "data"  top: "label"  data_param {    source:"examples/mnist/mnist_train_lmdb"    backend: LMDB    batch_size:64  }  transform_param {    scale: 0.00390625  }  include: {    phase: TRAIN  }}

两个 top 告诉我们,当前这个 layer 接到 data 和 label 的前面作为整个网络的输入。


0 0
原创粉丝点击