caffe中是如何運用protobuf構建神經網絡的?

 caffe這個框架設計的比較小巧精妙,它採用了protobuf來做爲交互的媒介,避免了繁重的去設計各個語言的接口,開發者能夠使用任意語言經過這個protobuf這個媒介,來運行這個框架.ios

  咱們這裏不過多的去闡述caffe的過往以及將來,只是簡單的描述一下,caffe框架中的protobuf的做用,以及它的背後原理. 通常來講cafe.proto中有對應的solve,solve中悠悠Layer,經過prototxt解析生成一個大對象sovle,而後solve底下有一個Layer數組對象,咱們所定義的網絡就是Layer數組,經過解析Layer數組,反射到對應layer對應的,遍歷Layer數組的過程也就是勾結神經網絡的過程,遍歷完成以後,也就構成了一張神經網絡圖,而後就是執行這個圖,也就是依據這個對象數組一步步的,喂數據,forward操做,和backward操做,計算loss,等. 咱們能夠這樣類比,咱們能夠模仿這個原理簡單的設計一個框架,這裏先不考慮C++的反射機制問題,這裏只討論如何將prototxt文件解析出來,至於如何反射到實際的類上,下次有時間能夠在記錄一個備忘錄.git

  好比,咱們設計一個這樣的demo.proto 來定義咱們的對象屬性:github

   

 1 name: "三年級23班"
 2 
 3 teacher {
 4   name: "tom"
 5   age: 17
 6   work {
 7     isworker: 1 ;#中文
 8     isjiaban: 1;
 9    }
10 }
11 
12 stu {
13     age: 19;
14     name: "demo"; ##中文
15     grade: 134;
16 }
17 
18 stu {
19     age: 19;
20     name: "google"; ##中文
21     grade: 134;
22 }
23 
24 stu {
25     age: 19;
26     name: "snake"; ##中文
27     grade: 134;
28 };
29 
30 num:"127.0.0.1:1";
31 num:"127.0.0.1:2";
32 num:"127.0.0.1:3";
33 num:"127.0.0.1:4";

 

 

而後咱們來依次解析出這個param.prototxt文件中的信息:數組

 1 //
 2 // Created by xijun1 on 2017/12/22.
 3 //
 4 #include <google/protobuf/io/coded_stream.h>
 5 #include <google/protobuf/io/zero_copy_stream_impl.h>
 6 #include <google/protobuf/text_format.h>
 7 
 8 //反射機制
 9 #include <google/protobuf/compiler/importer.h>
10 #include <google/protobuf/dynamic_message.h>
11 
12 #include "proto/demo.pb.h"
13 #include<iostream>
14 #include <fstream>
15 #include<ios>
16 #include <cstdlib>
17 #include <cstring>
18 #include <cstdio>
19 
20 #include <fcntl.h>   // open
21 using namespace std;
22 
23 void InfoStudents(const caffe::Student & stu){
24     cout<< "student info:"<<endl;
25     cout<<"     name: "<<stu.name()<<endl;
26     cout<<"     age: "<<stu.age()<<endl;
27     cout<<"     grade: "<<stu.grade()<<endl;
28 }
29 
30 void InfoTeacher(const caffe::Teacher & teacher) {
31     cout << "teacher info:" << endl;
32     cout << "       name: " << teacher.name() << endl;
33     cout << "       age: " << teacher.age() << endl;
34     cout<< "            is worker: "<<teacher.work().isworker()<<endl;
35     cout<< "            is jiaban: "<<teacher.work().isjiaban()<<endl;
36 }
37 
38 
39 int main(void)
40 {
41     caffe::Class cls;
42     int file_desc = open("./param.prototxt",O_NDELAY);
43 
44     google::protobuf::io::FileInputStream fileInputStream(file_desc);
45     if(!google::protobuf::TextFormat::Parse(&fileInputStream,&cls)){
46         std::cout<<"parse failure."<<std::endl;
47         return -1;
48     }
49     std::cout<<cls.name()<<std::endl;
50 
51 
52     //按照索引進行讀取
53     for(int i=1;i<cls.GetMetadata().descriptor->field_count(); ++i){
54         std::cout<<cls.descriptor()->field(i)->name()<<std::endl;
55         //cout<<cls.descriptor()->field(i)->full_name()<<endl;
56         if(cls.descriptor()->field(i)->name()=="stu"){
57             for (auto &stu_info : cls.stu()){
58 
59                  InfoStudents(stu_info);
60             }
61         }
62 
63         if(cls.descriptor()->field(i)->name()=="teacher"){
64             for (auto &teacher_info : cls.teacher()){
65 
66                 InfoTeacher(teacher_info);
67             }
68         }
69     }
70 
71     return 0;
72 }

 

咱們試着運行一下,會看到這個結果:網絡

 

這樣以後是否是對caffe有了很直觀的認識了呢.....框架

詳細的代碼,我放到github上了,附上地址:google

https://github.com/gongxijun/protocspa

----完----設計

相關文章
相關標籤/搜索