caffe这个框架设计的比较小巧精妙,它采用了protobuf来作为交互的媒介,避免了繁重的去设计各个语言的接口,开发者可以使用任意语言通过这个protobuf这个媒介,来运行这个框架.

  我们这里不过多的去阐述caffe的过往以及未来,只是简单的描述一下,caffe框架中的protobuf的作用,以及它的背后原理. 一般来说cafe.proto中有对应的solve,solve中悠悠Layer,通过prototxt解析生成一个大对象sovle,然后solve底下有一个Layer数组对象,我们所定义的网络就是Layer数组,通过解析Layer数组,反射到对应layer对应的,遍历Layer数组的过程也就是勾结神经网络的过程,遍历完成之后,也就构成了一张神经网络图,然后就是执行这个图,也就是依据这个对象数组一步步的,喂数据,forward操作,和backward操作,计算loss,等. 我们可以这样类比,我们可以模仿这个原理简单的设计一个框架,这里先不考虑C++的反射机制问题,这里只讨论如何将prototxt文件解析出来,至于如何反射到实际的类上,下次有时间可以在记录一个备忘录.

  比如,我们设计一个这样的demo.proto 来定义我们的对象属性:

   

  1. name: "三年级23班"
  2.  
  3. teacher {
  4. name: "tom"
  5. age:
  6. work {
  7. isworker: ;#中文
  8. isjiaban: ;
  9. }
  10. }
  11.  
  12. stu {
  13. age: ;
  14. name: "demo"; ##中文
  15. grade: ;
  16. }
  17.  
  18. stu {
  19. age: ;
  20. name: "google"; ##中文
  21. grade: ;
  22. }
  23.  
  24. stu {
  25. age: ;
  26. name: "snake"; ##中文
  27. grade: ;
  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. int main(void)
  39. {
  40. caffe::Class cls;
  41. int file_desc = open("./param.prototxt",O_NDELAY);
  42.  
  43. google::protobuf::io::FileInputStream fileInputStream(file_desc);
  44. if(!google::protobuf::TextFormat::Parse(&fileInputStream,&cls)){
  45. std::cout<<"parse failure."<<std::endl;
  46. return -;
  47. }
  48. std::cout<<cls.name()<<std::endl;
  49.  
  50. //按照索引进行读取
  51. for(int i=;i<cls.GetMetadata().descriptor->field_count(); ++i){
  52. std::cout<<cls.descriptor()->field(i)->name()<<std::endl;
  53. //cout<<cls.descriptor()->field(i)->full_name()<<endl;
  54. if(cls.descriptor()->field(i)->name()=="stu"){
  55. for (auto &stu_info : cls.stu()){
  56.  
  57. InfoStudents(stu_info);
  58. }
  59. }
  60.  
  61. if(cls.descriptor()->field(i)->name()=="teacher"){
  62. for (auto &teacher_info : cls.teacher()){
  63.  
  64. InfoTeacher(teacher_info);
  65. }
  66. }
  67. }
  68.  
  69. return ;
  70. }

我们试着运行一下,会看到这个结果:

这样之后是不是对caffe有了很直观的认识了呢.....

详细的代码,我放到github上了,附上地址:

https://github.com/gongxijun/protoc

----完----

caffe中是如何运用protobuf构建神经网络的?的更多相关文章

  1. caffe中google protobuf使用问题

    之前caffe中protobuf的版本是3.5.0,可在ternimal下执行:protoc --version 查看当前protobuf版本. 由于另外安装了Tensorflow之后(也有可能是安装 ...

  2. 【神经网络与深度学习】如何在Caffe中配置每一个层的结构

    如何在Caffe中配置每一个层的结构 最近刚在电脑上装好Caffe,由于神经网络中有不同的层结构,不同类型的层又有不同的参数,所有就根据Caffe官网的说明文档做了一个简单的总结. 1. Vision ...

  3. 使用Sybmol模块来构建神经网络

    符号编程 在之前的文章,我们介绍了NDArray模块,它是MXNet中处理数据的核心模块,我们可以使用NDArray完成非常丰富的数学运算.实际上,我们完全可以使用NDArray来定义神经网络,这种方 ...

  4. caffe中权值初始化方法

    首先说明:在caffe/include/caffe中的 filer.hpp文件中有它的源文件,如果想看,可以看看哦,反正我是不想看,代码细节吧,现在不想知道太多,有个宏观的idea就可以啦,如果想看代 ...

  5. CAFFE中训练与使用阶段网络设计的不同

    神经网络中,我们通过最小化神经网络来训练网络,所以在训练时最后一层是损失函数层(LOSS), 在测试时我们通过准确率来评价该网络的优劣,因此最后一层是准确率层(ACCURACY). 但是当我们真正要使 ...

  6. TensorFlow与caffe中卷积层feature map大小计算

    刚刚接触Tensorflow,由于是做图像处理,因此接触比较多的还是卷及神经网络,其中会涉及到在经过卷积层或者pooling层之后,图像Feature map的大小计算,之前一直以为是与caffe相同 ...

  7. 解决import caffe 时no module named protobuf的报错

    ProtoBuf是Google开发的可以实现内存与非易失存储介质(硬盘文件等等)交换时的协议接口.Caffe源码中大量使用了ProtoBuf作为权值和模型参数的载体. 在Anaconda下打开Anac ...

  8. caffe中关于(ReLU层,Dropout层,BatchNorm层,Scale层)输入输出层一致的问题

    在卷积神经网络中.常见到的激活函数有Relu层 layer { name: "relu1" type: "ReLU" bottom: "pool1&q ...

  9. Batch Normalization 与 Caffe中的 相关layer

    在机器学习领域,通常假设训练数据与测试数据是同分布的,BatchNorm的作用就是深度神经网络训练过程中, 使得每层神经网络的输入保持同分布. 原因:随着深度神经网络层数的增加,训练越来越困难,收敛越 ...

随机推荐

  1. FFmpeg源代码简单分析:avio_open2()

    ===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...

  2. 18 Loader代码案例

    目录结构: MainActivity.java 代码: package com.qf.day18_loader_demo2; import android.app.Activity; import a ...

  3. EBS财务模块表结构

     gl_code_combinations:科目组合 字段名 含义 备注 code_combination_id 主键,科目编码ID,自动编号 segment1 分行代码 setgment2 是受 ...

  4. EBS的性能调优

         metalink    Tuning performance on eBusiness suite (Doc ID 744143.1) 这篇文档描述了如何调查电子商务套件的整体性能下降. ...

  5. JQuery纵向下拉菜单实现心得

    jquery库给我们带来了许多便利,不愧是轻量级的DOM框架,在前面的博文中小编分别对jquery的基础知识以及jquery的一些小demo有一系列的简单介绍,期待各位小伙伴的指导.使用jquery实 ...

  6. gradle2.0笔记——让项目升级到gradle2.0

    昨晚看到QQ群消息说gradle2.0发布了,今天去看了一下,确实是昨天发布的,为rc版本:Gradle 2.0-rc-2.于是决定试一下. gradle可以在官网上下载,地址如下:http://ww ...

  7. DB2数据库常用命令

    --创建数据库 CREATE DATABASE example AUTOMATIC STORAGE YES --自动存储 ON 'D:\' DBPATH ON'D:\' --指定数据库控制文件的存储路 ...

  8. UNIX网络编程——ICMP报文分析:端口不可达

    ICMP的一个规则是,ICMP差错报文必须包括生成该差错报文的数据报IP首部(包含任何选项),还必须至少包括跟在该IP首部后面的前8个字节(包含源端口和目的端口).在我们的例子中,跟在IP首部后面的前 ...

  9. UNIX环境高级编程——信号说明列表

    $ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGK ...

  10. Oracle EBS R12多组织(多OU)访问架构

    Oracle EBS R12多组织访问架构 多组织架构实现了经营单位(OU)的数据安全性,在底层数据表中有一列ORG_ID来记录数据所属的经营单一,所有多OU的基表都是以"_ALL" ...