商业转载请联系作者获得授权,非商业转载请注明出处。
作者: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.h和proto.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.h
src/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 的前面作为整个网络的输入。