【caffe源码】caffe.proto

2024-03-26 16:38
文章标签 源码 proto caffe

本文主要是介绍【caffe源码】caffe.proto,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

跟着m哥调了了一段时间代码,断断续续地初步用了一下caffe,但是始终有点若即若离的感觉,偶然看到了知乎的一个回答 https://www.zhihu.com/question/27982282/answer/80242005 ,决定开始系统地看一下caffe的源码,在此稍作整理备忘及供有缘人参考。今后的几篇源码系列的文章大概以这篇文章为框架陆续写下去。

我们知道caffe中的网络和优化器都是以proto协议的文件储存的。简单来说proto可看作用于数据收发的、一种优化版的xml。官网见此处,科普见此处。

Play with proto

首先从 https://www.cnblogs.com/gongxijun/p/7010641.html 中的一个例子开始吧。
编写caffe.proto文件,这个文件相当于制定了一种传输数据的协议,供发送端和接收端使用:

//caffe.proto
syntax = "proto2";		//指定协议proto2或proto3
package caffe;message student
{required int32 age = 1; 	//ID required 表示必要字段required string name = 2; 	//str 必要字段optional int32 grade = 3; 	//optional field 可选字段,可以有无,最多b   
}

将proto转为cpp代码供收发端调用:

protoc -I=. --cpp_out=. ./caffe.proto

运行后可以看到生成caffe.pb.h和caffe.pb.cc编写读写文件caffeRead.cpp:

//caffeRead.cpp
#include"caffe.pb.h"
#include<iostream>
#include<ios>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;
}int main(void)
{caffe::student stu;stu.set_age(18);stu.set_name("gongxijun");stu.set_grade(146);InfoStudents(stu);return 0;
}

编译cc文件并执行:

g++ caffeRead.cpp -o caffeReader caffe.pb.cc -I /usr/local/protobuf/include -L /usr/local/protobuf/lib -lprotobuf -pthread 

看到输出:

student info:
name: gongxijun
age: 18
grade: 146

如果加入socket等收发机制,将写过程和读过程分离,则可以实现设备间的通信。

proto语法

同样基于以上的例子,首先syntax指定了语法标准,caffe是基于proto2的,后面我们默认以proto2为准。根据这里,package的作用是指定class的namespace,防止class名的冲突。后面每个message相当于一个class,proto文件里面可以同时有多个message(但是官方不推荐包含太多,因为会造成dependency bloat)。上面的student message中有3个fields(key-value对),每个field有rule、type、name和unique number。

  1. rule有3中形式,required表示每条打包后的信息(message实例)必须包含1个此类field,0/1个optional,若干个(包括0)repeated。
  2. type是一些可以和c++(或其他调用接口语言)中的数据类型相转化的数据类型,如int32等,具体见这里,也可以是某个message的type,或者预定义枚举类型enum中的一个。
  3. unique number(ID)可选范围是 [ 1 , 2 29 − 1 ] [1, 2^{29}-1] [1,2291],其中 [ 1 , 15 ] [1,15] [1,15]占用1个字节, [ 16 , 2047 ] [16, 2047] [16,2047]占用2个字节,以此类推。所以应该将常用的field编成短码,用于在二进制数据中作为key,具体的value采用了msb标记扩展字节,官方文档详细介绍了译码方式,好奇心重的读者可以推一下,这部分内容不详细了解也不影响基本使用,所以这里不再赘述了。(doc已经很详细了,但是这篇文章大看一眼也还不错,我没仔细看,仅供参考吧。)

caffe.proto的组成

数据协议

message BlobShape {
message BlobProto {
message BlobProtoVector {
message Datum {

其中V1LayerParameter和V0LayerParameter用于旧版,现在已经弃用,故后文不再赘述。
其他message的一些调用结构如下所示:

message SolverState {
message SolverParameter {|---message NetParameter {|		 \|		message NetState {|		/|---LayerParameter {|-message NetStateRule {|-message ParamSpec {|-其他用于layer的 message|-message FillerParameter {(初始化赋值)

具体的message的用途到后面变用边学吧,目前可以参考 https://blog.csdn.net/weixin_39970417/article/details/80825601

这篇关于【caffe源码】caffe.proto的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/849142

相关文章

Java汇编源码如何查看环境搭建

《Java汇编源码如何查看环境搭建》:本文主要介绍如何在IntelliJIDEA开发环境中搭建字节码和汇编环境,以便更好地进行代码调优和JVM学习,首先,介绍了如何配置IntelliJIDEA以方... 目录一、简介二、在IDEA开发环境中搭建汇编环境2.1 在IDEA中搭建字节码查看环境2.1.1 搭建步

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

kubelet组件的启动流程源码分析

概述 摘要: 本文将总结kubelet的作用以及原理,在有一定基础认识的前提下,通过阅读kubelet源码,对kubelet组件的启动流程进行分析。 正文 kubelet的作用 这里对kubelet的作用做一个简单总结。 节点管理 节点的注册 节点状态更新 容器管理(pod生命周期管理) 监听apiserver的容器事件 容器的创建、删除(CRI) 容器的网络的创建与删除

red5-server源码

red5-server源码:https://github.com/Red5/red5-server

TL-Tomcat中长连接的底层源码原理实现

长连接:浏览器告诉tomcat不要将请求关掉。  如果不是长连接,tomcat响应后会告诉浏览器把这个连接关掉。    tomcat中有一个缓冲区  如果发送大批量数据后 又不处理  那么会堆积缓冲区 后面的请求会越来越慢。