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的作用就是深度神经网络训练过程中, 使得每层神经网络的输入保持同分布. 原因:随着深度神经网络层数的增加,训练越来越困难,收敛越 ...
随机推荐
- 详解EBS接口开发之采购申请导入
更多内容可以参考我的博客 详解EBS接口开发之采购订单导入 http://blog.csdn.net/cai_xingyun/article/details/17114697 /*+++++++ ...
- Centos7下Redis3.2的安装配置与JReid测试
环境 Centos7 Redis版本 3.2.0 安装目录 /usr/local/redis/redis-3.2.0 Redis的介绍 参见官网 安装 1 安装gcc与tcl # yum instal ...
- 分布式进阶(五)之JSVC配置
应用场景:在linux系统上进行项目开发,在部署java项目时,常用方法就是写一个shell脚本,但当服务器重启了,经常会忘了启动shell脚本了.所以我们需要把自己的应用变成linux的服务,当服务 ...
- 我眼中的Linux设备树(二 节点)
二 节点(node)的表示首先说节点的表示方法,除了根节点只用一个斜杠"/"表示外,其他节点的表示形式如"node-name@unit-address".@前边 ...
- 多进程log4cxx区分日志
多进程log4cxx区分日志 (金庆的专栏) 网游客户端一般会多开,多个进程会写同一个日志文件.log4cxx看来会对文件加锁,防止多进程写同一文件写乱,截止目前还没发现错乱的日志. log4cxx有 ...
- C语言中标识符的作用域、命名空间、链接属性、生命周期、存储类型
Technorati 标签: C,标识符,作用域,命名空间,链接属性,生命周期,存储类型,scope,name space,linkage,storage durations,lifetime 无论学 ...
- javascript之自定义数组工具对象
<pre name="code" class="html">/* 需求:编写一个js文件,在js文件中自定义一个数组工具对象, 该工具对象要有一个找 ...
- ubuntu更改用户密码
在安装ubuntu时使用了主目录加密的功能( 登入时需要密码并加密我的主目录), 设此时密码为abcd1234, 如果修改了用户的密码(passwd=>abcde12345),那么在下次启动时, ...
- awk字符串函数及其意义
awk字符串函数及其意义 awk提供了强大的内置字符串函数,用于实现文本的字符串替换.查找以及分隔等功能. awk字符串函数主要有:gsub.index.length.match.split.sub ...
- 11_Android中HttpClient的应用,读取网络xml及xml解析流,Handler的应用,LayoutInflater的使用,SmartImageView的使用
1 所需的web项目结构如下: 2 new.xml的文件内容如下: <?xml version="1.0" encoding="UTF-8" ?&g ...