caffe中是如何运用protobuf构建神经网络的?
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构建神经网络的?的更多相关文章
- caffe中google protobuf使用问题
之前caffe中protobuf的版本是3.5.0,可在ternimal下执行:protoc --version 查看当前protobuf版本. 由于另外安装了Tensorflow之后(也有可能是安装 ...
- 【神经网络与深度学习】如何在Caffe中配置每一个层的结构
如何在Caffe中配置每一个层的结构 最近刚在电脑上装好Caffe,由于神经网络中有不同的层结构,不同类型的层又有不同的参数,所有就根据Caffe官网的说明文档做了一个简单的总结. 1. Vision ...
- 使用Sybmol模块来构建神经网络
符号编程 在之前的文章,我们介绍了NDArray模块,它是MXNet中处理数据的核心模块,我们可以使用NDArray完成非常丰富的数学运算.实际上,我们完全可以使用NDArray来定义神经网络,这种方 ...
- caffe中权值初始化方法
首先说明:在caffe/include/caffe中的 filer.hpp文件中有它的源文件,如果想看,可以看看哦,反正我是不想看,代码细节吧,现在不想知道太多,有个宏观的idea就可以啦,如果想看代 ...
- CAFFE中训练与使用阶段网络设计的不同
神经网络中,我们通过最小化神经网络来训练网络,所以在训练时最后一层是损失函数层(LOSS), 在测试时我们通过准确率来评价该网络的优劣,因此最后一层是准确率层(ACCURACY). 但是当我们真正要使 ...
- TensorFlow与caffe中卷积层feature map大小计算
刚刚接触Tensorflow,由于是做图像处理,因此接触比较多的还是卷及神经网络,其中会涉及到在经过卷积层或者pooling层之后,图像Feature map的大小计算,之前一直以为是与caffe相同 ...
- 解决import caffe 时no module named protobuf的报错
ProtoBuf是Google开发的可以实现内存与非易失存储介质(硬盘文件等等)交换时的协议接口.Caffe源码中大量使用了ProtoBuf作为权值和模型参数的载体. 在Anaconda下打开Anac ...
- caffe中关于(ReLU层,Dropout层,BatchNorm层,Scale层)输入输出层一致的问题
在卷积神经网络中.常见到的激活函数有Relu层 layer { name: "relu1" type: "ReLU" bottom: "pool1&q ...
- Batch Normalization 与 Caffe中的 相关layer
在机器学习领域,通常假设训练数据与测试数据是同分布的,BatchNorm的作用就是深度神经网络训练过程中, 使得每层神经网络的输入保持同分布. 原因:随着深度神经网络层数的增加,训练越来越困难,收敛越 ...
随机推荐
- FFmpeg源代码简单分析:avio_open2()
===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...
- 18 Loader代码案例
目录结构: MainActivity.java 代码: package com.qf.day18_loader_demo2; import android.app.Activity; import a ...
- EBS财务模块表结构
gl_code_combinations:科目组合 字段名 含义 备注 code_combination_id 主键,科目编码ID,自动编号 segment1 分行代码 setgment2 是受 ...
- EBS的性能调优
metalink Tuning performance on eBusiness suite (Doc ID 744143.1) 这篇文档描述了如何调查电子商务套件的整体性能下降. ...
- JQuery纵向下拉菜单实现心得
jquery库给我们带来了许多便利,不愧是轻量级的DOM框架,在前面的博文中小编分别对jquery的基础知识以及jquery的一些小demo有一系列的简单介绍,期待各位小伙伴的指导.使用jquery实 ...
- gradle2.0笔记——让项目升级到gradle2.0
昨晚看到QQ群消息说gradle2.0发布了,今天去看了一下,确实是昨天发布的,为rc版本:Gradle 2.0-rc-2.于是决定试一下. gradle可以在官网上下载,地址如下:http://ww ...
- DB2数据库常用命令
--创建数据库 CREATE DATABASE example AUTOMATIC STORAGE YES --自动存储 ON 'D:\' DBPATH ON'D:\' --指定数据库控制文件的存储路 ...
- UNIX网络编程——ICMP报文分析:端口不可达
ICMP的一个规则是,ICMP差错报文必须包括生成该差错报文的数据报IP首部(包含任何选项),还必须至少包括跟在该IP首部后面的前8个字节(包含源端口和目的端口).在我们的例子中,跟在IP首部后面的前 ...
- UNIX环境高级编程——信号说明列表
$ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGK ...
- Oracle EBS R12多组织(多OU)访问架构
Oracle EBS R12多组织访问架构 多组织架构实现了经营单位(OU)的数据安全性,在底层数据表中有一列ORG_ID来记录数据所属的经营单一,所有多OU的基表都是以"_ALL" ...