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 来定义我们的对象属性:

   

 name: "三年级23班"

 teacher {
name: "tom"
age:
work {
isworker: ;#中文
isjiaban: ;
}
} stu {
age: ;
name: "demo"; ##中文
grade: ;
} stu {
age: ;
name: "google"; ##中文
grade: ;
} stu {
age: ;
name: "snake"; ##中文
grade: ;
}; num:"127.0.0.1:1";
num:"127.0.0.1:2";
num:"127.0.0.1:3";
num:"127.0.0.1:4";

然后我们来依次解析出这个param.prototxt文件中的信息:

 //
// Created by xijun1 on 2017/12/22.
//
#include <google/protobuf/io/coded_stream.h>
#include <google/protobuf/io/zero_copy_stream_impl.h>
#include <google/protobuf/text_format.h> //反射机制
#include <google/protobuf/compiler/importer.h>
#include <google/protobuf/dynamic_message.h> #include "proto/demo.pb.h"
#include<iostream>
#include <fstream>
#include<ios>
#include <cstdlib>
#include <cstring>
#include <cstdio> #include <fcntl.h> // open
using namespace std; void InfoStudents(const caffe::Student & stu){
cout<< "student info:"<<endl;
cout<<" name: "<<stu.name()<<endl;
cout<<" age: "<<stu.age()<<endl;
cout<<" grade: "<<stu.grade()<<endl;
} void InfoTeacher(const caffe::Teacher & teacher) {
cout << "teacher info:" << endl;
cout << " name: " << teacher.name() << endl;
cout << " age: " << teacher.age() << endl;
cout<< " is worker: "<<teacher.work().isworker()<<endl;
cout<< " is jiaban: "<<teacher.work().isjiaban()<<endl;
} int main(void)
{
caffe::Class cls;
int file_desc = open("./param.prototxt",O_NDELAY); google::protobuf::io::FileInputStream fileInputStream(file_desc);
if(!google::protobuf::TextFormat::Parse(&fileInputStream,&cls)){
std::cout<<"parse failure."<<std::endl;
return -;
}
std::cout<<cls.name()<<std::endl; //按照索引进行读取
for(int i=;i<cls.GetMetadata().descriptor->field_count(); ++i){
std::cout<<cls.descriptor()->field(i)->name()<<std::endl;
//cout<<cls.descriptor()->field(i)->full_name()<<endl;
if(cls.descriptor()->field(i)->name()=="stu"){
for (auto &stu_info : cls.stu()){ InfoStudents(stu_info);
}
} if(cls.descriptor()->field(i)->name()=="teacher"){
for (auto &teacher_info : cls.teacher()){ InfoTeacher(teacher_info);
}
}
} return ;
}

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

这样之后是不是对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. 两个activity或者activity和fragment传值

    使用Fragment的时候可能需要在两个Fragment之间进行参数的传递,开始想着可以使用SharedPreferences进行处理,想想这些简单的参数没有必要使用这么麻烦的方式去实现,翻了一下Fr ...

  2. 01基于配置文件方式的SpringMVC,三种HandlerMapping,三种控制器

     1 添加Spring MVC所需的jar包. 2 创建一个以下项目结构的springmvc项目 3 web.xml的配置如下: <?xmlversion="1.0"en ...

  3. 02-Git简单使用

    Git安装(windows) https://code.google.com/p/msysgit/downloads/list 我们使用版本Git-1.7.9版本 百度网盘下载:链接:http://p ...

  4. J2EE学习从菜鸟变大鸟之六 EJB(Enterprise JavaBean)企业级Java组件

    EJB (EnterpriseJavaBean)是J2EE的一部分,定义了一个用于开发基于组件的企业多重应用程序的标准.其特点包括网络服务支持和核心开发工具(SDK).其称为Java 企业Bean,是 ...

  5. UNIX网络编程——套接字选项(SOL_SOCKET级别)

    #include <sys/socket.h> int setsockopt( int socket, int level, int option_name,const void *opt ...

  6. JSP标签JSTL(5)--常用的标签函数

    在使用JSTL的标签函数的时候请务必加上如下代码 <!-- 添加jsp标签的核心库 --> <%@ taglib uri="http://java.sun.com/jsp/ ...

  7. zookeeper学习总结

    最近一两天,一直在看zookeeper,自己也感觉头昏脑涨的. 现记录一下,最近的所得: 安装与配置: http://blog.csdn.net/morning99/article/details/4 ...

  8. Android后台消息推送-android学习之旅(71)

    建议使用第三方的sdk,比如极光推送,小米推送,百度推送

  9. (五十一)KVC与KVO详解

    KVC的全称为key value coding,它是一种使用字符串间接更改对象属性的方法. 假设有一个Person类和一个Student类,其中Person类有age.name两个属性,Student ...

  10. Git版本控制:Git冲突解决 相关错误总结

    http://blog.csdn.net/pipisorry/article/details/46958699 冲突处理 git push冲突处理 git push时出现冲突:! [rejected] ...