caffe 之 protobuf

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值