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
----完----設計