欢迎访问 生活随笔!

凯发k8官方网

当前位置: 凯发k8官方网 > 人工智能 > caffe >内容正文

caffe

caffe学习(十)protobuf及caffe.proto解析 -凯发k8官方网

发布时间:2024/9/21 caffe 13 豆豆
凯发k8官方网 收集整理的这篇文章主要介绍了 caffe学习(十)protobuf及caffe.proto解析 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

一个好的软件框架应该要有明确的输入和输出,对于cnn网络而言,其主要有两部分组成:网络具体结构和网络的具体优化算法及参数。对于框架的使用者而言,用户只需输入两个描述文件即可得到对该网络的优化结果,这无疑是非常方便的。

caffe框架选择使用谷歌的开源protobuf工具对这两部分进行描述,解析和存储,这一部分为caffe的实现节省了大量的代码。

如前面讲述的目标检测demo,py-faster-rcnn,其主要分为训练和测试两个过程,两个过程的核心文件都是prototxt格式的文本文件。
如训练过程
输入:
(1)slover.prototxt。描述网络训练时的各种参数文件,如训练的策略,学习率的变化率,模型保存的频率等参数
(2)train.prototxt。描述训练网络的网络结构文件。
(3)test.prototxt。描述测试网络的网络结构文件。
输出:
vgg16.caffemodel:保存的训练好的网络参数文件。

protobuf工具主要是数据序列化存储和解析。在实际使用的时候主要是作为一个代码自动生成工具来使用,通过生成对所定义的数据结构的标准读写代码,用户可以通过标准的读写接口从文件中进行数据的读取,解析和存储。
目前proto支持c ,python,java等语言,这里主要演示caffe中使用的c 调用。
主要使用过程为:
(1)编写xxx.proto文件。该文件里主要定义了各种数据结构及对应的数据类型,如int,string等。
(2)使用protoc对xxx.proto文件进行编译,生成对应的数据结构文件的读取和写入程序,程序接口都是标准化的。生成的文件一般名为xxx.pb.cc和xxx.pb.h。
(3)在新程序中使用xxx.pb.c和xxx.pb.h提供的代码。

为了后面更加清楚的理解protobuf工具,这里一个简单的caffe.proto为例进行solver.prototxt和train.prototxt的解析

caffe.proto文件编写:

syntax = "proto2";package caffe;//c namespacemessage netparameter {optional string name = 1; // consider giving the network a namerepeated layerparameter layer = 2; // id 100 so layers are printed last. }message solverparameter {optional string train_net = 1;optional float base_lr = 2;optional string lr_policy = 3;optional netparameter net_param = 4; }message paramspec {optional string name = 1;optional float lr_mult = 3 [default = 1.0];optional float decay_mult = 4 [default = 1.0]; } // layerparameter next available layer-specific id: 147 (last added: recurrent_param) message layerparameter {optional string name = 1; // the layer nameoptional string type = 2; // the layer typerepeated string bottom = 3; // the name of each bottom blobrepeated string top = 4; // the name of each top blobrepeated paramspec param = 6;// layer type-specific parameters.optional convolutionparameter convolution_param = 106;optional pythonparameter python_param = 130; }message convolutionparameter {optional uint32 num_output = 1; // the number of outputs for the layer// pad, kernel size, and stride are all given as a single value for equal// dimensions in all spatial dimensions, or once per spatial dimension.repeated uint32 pad = 3; // the padding size; defaults to 0repeated uint32 kernel_size = 4; // the kernel sizerepeated uint32 stride = 6; // the stride; defaults to 1 }message pythonparameter {optional string module = 1;optional string layer = 2;// this value is set to the attribute `param_str` of the `pythonlayer` object// in python before calling the `setup()` method. this could be a number,// string, dictionary in python dict format, json, etc. you may parse this// string in `setup` method and use it in `forward` and `backward`.optional string param_str = 3 [default = '']; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52

编译生成caffe.pb.cc与caffe.pb.h文件

protoc caffe.proto --cpp_out=.//在当前目录生成cpp文件及头文件
  • 1

编写测试文件main.cpp

#include #include #include #include #include #include #include #include "caffe.pb.h" using namespace caffe; using namespace std;using google::protobuf::io::fileinputstream; using google::protobuf::message; bool readprotofromtextfile(const char* filename, message* proto) {int fd = open(filename, o_rdonly);fileinputstream* input = new fileinputstream(fd);bool success = google::protobuf::textformat::parse(input, proto);delete input;close(fd);return success; }int main() {solverparameter sgd;if(!readprotofromtextfile("solver.prototxt", &sgd)){cout<<"error opening file"<return -1;}cout<<"hello,world"<cout<cout<cout<if(!readprotofromtextfile("train.prototxt", &vgg16)){cout<<"error opening file"<return -1;}cout<return 0; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49

编写solver与train网络描述文件

solver.prototxt内容

train_net: "/home/bryant/cuda-test/train.prototxt" base_lr: 0.001 lr_policy: "step"
  • 1
  • 2
  • 3

train.prototxt内容:

name: "vgg_ilsvrc_16_layers" layer {name: 'input-data'type: 'python'top: 'data'top: 'im_info'top: 'gt_boxes'python_param {module: 'roi_data_layer.layer'layer: 'roidatalayer'param_str: "'num_classes': 2"} }layer {name: "conv1_1"type: "convolution"bottom: "data"top: "conv1_1"param {lr_mult: 0decay_mult: 0}param {lr_mult: 0decay_mult: 0}convolution_param {num_output: 64pad: 1kernel_size: 3} }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

编译链接,生成main

g caffe.pb.cc main.cpp -o main -lprotobuf
  • 1

运行结果

bryant@bryant:~/cuda-test/src$ ./main hello,world /home/bryant/cuda-test/train.prototxt 0.001 step vgg_ilsvrc_16_layers bryant@bryant:~/cuda-test/src$

总结

以上是凯发k8官方网为你收集整理的caffe学习(十)protobuf及caffe.proto解析的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得凯发k8官方网网站内容还不错,欢迎将凯发k8官方网推荐给好友。

  • 上一篇:
  • 下一篇:
网站地图