在嵌入式设备上使用 Protocol Buffers (Protobuf) 进行数据序列化和解析

protobuf | nanopb 在MCU平台的移植使用(小白版) Nanopb 是 Google Protocol Buffers数据格式的纯 C 实现 。它针对 32 位微控制器,但也适用于内存限制严格( 阅读详情

在嵌入式设备上使用 Protocol Buffers (Protobuf) 进行数据序列化和解析

Protocol Buffers (Protobuf) 是 Google 开发的二进制序列化格式,适合嵌入式设备上的数据交换,因为它高效、紧凑。但在资源受限的嵌入式系统(如 ARM-based MCU)上,标准 Protobuf 库可能太大(内存占用高),推荐使用轻量版如 nanopb(C 语言实现,易移植到 C++)。如果你的设备资源充足(如运行 Linux 的嵌入式板,如 Raspberry Pi),可使用标准 Protobuf C++ 库。下面我详细介绍整个流程:从 proto 文件生成 C++ 代码,到交叉编译和移植。假设你的主机是 Linux(如 Ubuntu),目标设备是 ARM 架构(如 Cortex-M 或 Cortex-A)。如果设备是无 OS 的 MCU,优先 nanopb;否则用标准版。

1. 准备工作
  • 安装 Protobuf 工具:
    • 在主机上安装 Protobuf 编译器(protoc)。用包管理器:
      sudo apt update
      sudo apt install protobuf-compiler libprotobuf-dev  # Ubuntu/Debian
      
      或从 GitHub 下载源码编译(https://github.com/protocolbuffers/protobuf)。
  • 安装交叉编译工具链:根据目标设备架构安装 toolchain。例如,对于 ARM Cortex-A(如 Raspberry Pi):
    sudo apt install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf
    
    对于 Cortex-M(如 STM32),用 arm-none-eabi-gcc(从 ARM 官网下载)。
  • 选择 Protobuf 变体:
    • 标准 Protobuf C++:适合有 OS 的设备,功能全但体积大。
    • nanopb:推荐嵌入式无 OS 设备,轻量(几 KB),支持 C++ 包装。下载:https://github.com/nanopb/nanopb。
2. 编写 Proto 文件

创建一个 .proto 文件定义数据结构。例如,名为 message.proto:

syntax = "proto3";  // 或 proto2,根据需求

package mypackage;

message SensorData {
  int32 temperature = 1;
  float humidity = 2;
  string timestamp = 3;
  repeated uint8 raw_data = 4;  // 支持重复字段
}
  • 保存为 message.proto。这定义了一个消息结构,用于序列化/解析传感器数据。
3. 根据 Proto 文件生成 C++ 文件

使用 protoc 生成 C++ 头文件(.pb.h)和源文件(.pb.cc)。生成的代码包含序列化(Encode)和解析(Decode)函数。

  • 标准 Protobuf 生成:

    protoc --cpp_out=. message.proto
    
    • 输出:message.pb.h 和 message.pb.cc。
    • 在 C++ 代码中使用:
      #include "message.pb.h"
      #include <fstream>  // 用于文件 I/O 测试
      
      int main() {
        mypackage::SensorData data;
        data.set_temperature(25);
        data.set_humidity(60.5);
        data.set_timestamp("2026-02-05");
      
        // 序列化到字符串
        std::string serialized;
        data.SerializeToString(&serialized);
      
        // 解析回来
        mypackage::SensorData parsed;
        parsed.ParseFromString(serialized);
        // 输出 parsed.temperature() 等
        return 0;
      }
      
  • nanopb 生成(推荐嵌入式):

    1. 下载 nanopb 并解压到本地目录(如 ~/nanopb)。
    2. 用 nanopb 生成器:
      python ~/nanopb/generator/nanopb_generator.py message.proto
      
      • 输出:message.pb.h 和 message.pb.c(C 风格,但易用 C++ 包装)。
    3. 在 C++ 代码中使用(需包含 nanopb 头文件):
      #include "message.pb.h"
      #include <pb_encode.h>  // nanopb 库
      #include <pb_decode.h>
      
      int main() {
        SensorData data = SensorData_init_zero;
        data.temperature = 25;
        data.humidity = 60.5;
      
        uint8_t buffer[128];
        pb_ostream_t stream = pb_ostream_from_buffer(buffer, sizeof(buffer));
        pb_encode(&stream, SensorData_fields, &data);  // 序列化
      
        // 解析
        SensorData parsed = SensorData_init_zero;
        pb_istream_t istream = pb_istream_from_buffer(buffer, stream.bytes_written);
        pb_decode(&istream, SensorData_fields, &parsed);
        return 0;
      }
      
    • nanopb 支持选项文件(.options)自定义字段大小,优化内存。
4. 交叉编译源码

将生成的 .pb.cc/.pb.c 和你的应用代码交叉编译成目标设备的可执行文件或库。假设项目目录有 main.cpp、message.pb.h、message.pb.cc。

  • 标准 Protobuf 交叉编译:

    1. 下载 Protobuf 源码(https://github.com/protocolbuffers/protobuf),交叉编译库:
      ./configure --host=arm-linux-gnueabihf --prefix=/usr/arm-linux-gnueabihf  # 调整为你的 toolchain
      make -j4
      make install
      
    2. 编译你的应用:
      arm-linux-gnueabihf-g++ -o app main.cpp message.pb.cc -lprotobuf -pthread  # 链接 Protobuf 库
      
      • 如果是静态链接:加 -static 避免运行时依赖。
  • nanopb 交叉编译:

    1. nanopb 无需编译库(纯头文件),只需包含其源文件。
    2. 编译应用:
      arm-none-eabi-g++ -o app.elf main.cpp message.pb.c ~/nanopb/pb_encode.c ~/nanopb/pb_decode.c ~/nanopb/pb_common.c \
        -I~/nanopb -mcpu=cortex-m4 -mthumb  # 调整 CPU 架构
      
      • 对于 MCU,生成 .elf 或 .bin 文件,用于烧录。
  • 常见优化:

    • 用 -Os 优化大小,-g0 去除调试信息。
    • 处理依赖:确保 toolchain 有标准库(如 newlib for bare-metal)。
    • 测试:在主机上先用本地 g++ 编译运行,验证序列化/解析正确。
5. 移植到嵌入式设备
  • 传输文件:用 scp/rsync 或串口工具(如 minicom)将编译好的二进制(app 或 app.elf)传到设备。
    • 示例:scp app root@192.168.1.100:/usr/bin/
  • 运行:
    • 有 OS 设备:SSH 登录,./app 执行。
    • 无 OS MCU:用烧录工具(如 OpenOCD、ST-Link)上传 .bin/.hex 文件,重启设备。
  • 调试:
    • 用 GDB 交叉调试:arm-linux-gnueabihf-gdb app + target remote :3333(需 OpenOCD server)。
    • 监控内存:嵌入式上 Protobuf 序列化后数据紧凑,检查 buffer 大小避免溢出。
  • 注意事项:
    • 资源限制:标准 Protobuf 需 ~100KB+ 内存;nanopb 只需几 KB。测试动态分配(避免在 MCU 上用 new)。
    • 端序:Protobuf 是小端序,确保设备一致或用 htonl/ntohl 处理。
    • 依赖:无 OS 设备避免 STL,用纯 C。
    • 安全:序列化数据易篡改,添加校验和。
    • 如果设备是特定平台(如 ESP32),用平台 SDK 集成(如 Arduino-Protobuf)。

这个流程适用于大多数嵌入式场景。如果你的设备具体型号(如 STM32F4),或遇到错误,提供更多细节我可以细化!

嵌入式设备使用protobuf进行加密通信 C语言嵌入式设备使用protobuf进行加密通信 阅读详情

相关推荐

Protocol Buffers(协议缓冲)详解及其在嵌入式系统中的应用

通过定义消息的结构并生成对应的代码,开发者可以方便地进行消息的序列化和反序列化操作,实现跨平台的数据交换。ProtoBuf将数据结构和编码格式进行了分离,通过定义消息的结构,可以在不同的平台和语言之间进行数据交换,并且提供了高效的编解码性能。ProtoBuf提供了一种统一的数据交换格式,使得不同平台和设备之间可以方便进行数据交换,无需关注具体的平台和语言差异,大大简化了数据交互的复杂性。生成的代码包含了消息的类定义以及序列化和反序列化的方法,简化了开发者的工作。在嵌入式系统中,资源通常是有限的。

CodeMaven的博客 374

linux使用nanopb

nanopb官方github:https://github.com/nanopb/nanopb 指南上写的protoc不是google C++的protoc,而是generator里的protc python脚本 直接用指南里的这个生成C的protobuffer,会显示出错,缺少python-protobuffer python generator/nanopb_generator.py myprotocol.proto # For source checkout ...

yudelian的博客 985

protobuf-nanopb-win环境搭建使用.rar

里面提供了win环境下搭建nanopb + protobuf的全部资料,包括python安装包,还有使用说明,已经在项目中使用,很好用

Nanopb 使用

nanopb 是一个非常轻量级的 C 库,用于 Protocol Buffers 的序列化和反序列化。它专为嵌入式系统设计,可以运行在内存和存储空间有限的环境中。nanopb 支持 Protocol Buffers 2.3 和 3.0 版本的标准,因此可以用于大多数现有的 Protocol Buffers 定义文件。

lemontree1945的博客 802

Arduino-nanopb-arduino.zip

Arduino-nanopb-arduino.zip,纳米铅的Arduino流包装,Arduino是一家开源软硬件公司和制造商社区。Arduino始于21世纪初,深受电子制造商的欢迎,Arduino通过开源系统提供了很多灵活性。

nanopb-nanopb-0.3.9.2.zip

nanopb-nanopb-0.3.9.2.zip Nanopb is a small code-size Protocol Buffers implementation in ansi C. It is especially suitable for use in microcontrollers, but fits any memory restricted system.

推荐开源项目:Nanopb——嵌入式系统的协议缓冲区实现

在众多的嵌入式系统开发工具中,Nanopb作为一个小巧而高效的代码库脱颖而出。它致力于提供一套轻量级的Protocol Buffers解决方案,特别针对内存受限环境下的微控制器设备进行了优化和设计。 [Protocol Buffers](https://developers.google.com/protocol-buffers/)是Google开源的一种灵活高效的数据序列化框架,旨在帮助开发者...

gitblog_00272的博客 585

H3C无线控制器AC与第三方认证系统集成实现企业级Portal短信认证方案

本文详细阐述了如何将H3C无线控制器(AC)与第三方认证系统集成,构建企业级Portal短信认证方案。该方案通过手机号作为临时凭证,实现了访客网络的实名追溯、权限控制与专业体验。文章深入解析了方案原理、H3C AC的关键配置步骤、第三方系统对接要点及短信网关选型避坑指南,为企业提升网络安全管理与访客服务质量提供了完整、可行的实战指导。

a3b4c5的博客 195

protocol buffers (protobuf)

protobuf的介绍与在c语言中的应用。

tracy_chao的博客 344

centos7搭建LNMP环境-编译安装&yum安装-超详细

文章目录1. 首先了解编译安装和yum安装的区别。2. yum安装准备工作---切换阿里云yum源3. 编译安装lnmp4.yum安装lnmp5. lnmp一键安装6. 一些报错7. 笔记8. 参考文章 1. 首先了解编译安装和yum安装的区别。 windows下安装centos虚拟机,之前写过。传送门~~ 编译安装: 可以按需安装,想安在哪个目录下就安在哪个目录下。 可以设定参数 可安装自己想要的版本 yum安装: 安装的方便快捷 不需要考虑包的依赖 可以直接使用service nginx st

最美不过下雨天 9349

从投影到抗噪:直线拟合三大算法实战指南

本文深入解析了直线拟合的三大核心算法:常规最小二乘法(OLS)、正交回归(TLS)和RANSAC。通过对比其几何原理、代码实现与适用场景,为计算机视觉和数据分析领域的实践者提供了清晰的选型指南,帮助在抗噪、旋转不变性等不同需求下,精准选择并应用最合适的算法。

ujm567890的博客 576

在嵌入式设备上使用 Protocol Buffers (protobuf) 进行数据序列化和解析

Protocol Buffers(简称 protobuf)是 Google 开发的一种语言无关、平台无关的数据序列化协议,广泛应用于网络通信和数据存储领域。在嵌入式系统中使用 protobuf 可以实现高效的数据交换,特别是在物联网设备、传感器网络和跨平台通信场景中。

青蛙博客 826

【Linux 驱动开发】STM32MP1 LCD 显示系统完整实践指南

STM32MP1 LCD显示系统实践指南 本文全面介绍STM32MP1平台实现MIPI DSI LCD显示的完整流程,涵盖硬件连接、设备树配置、显示原理和驱动实现。主要内容包括: 硬件连接:详细说明MIPI DSI差分对、背光PWM、复位/供电管脚的连接方式 设备树配置: PWM背光控制节点设置 LTDC与DSI端口映射关系 Panel节点参数定义 显示基础:讲解LCD/OLED显示原理、常见接口类型(RGB/LVDS/MIPI/HDMI)及信号时序 驱动实现。

猫猫的小茶馆 495

20倍性能差!FlatBuffers vs Protocol Buffers深度测评:谁才是序列化之王?

你还在为序列化性能瓶颈发愁?当移动端每秒处理数万条消息时,当IoT设备在带宽限制下传输数据时,选择正确的序列化协议可能让系统性能提升一个数量级。本文将从内存占用、解析速度、兼容性三个维度,用实测数据告诉你FlatBuffers如何碾压Protocol Buffers(Protobuf),以及在什么场景下你必须选择FlatBuffers。 读完本文你将获得: - 5组关键性能指标对比(含源码级分析...

gitblog_00035的博客 896

农业生产AI决策系统架构设计解密:数据层-模型层-应用层核心逻辑

想象一下,在一个炎热的夏日,传统农田里的农民伯伯正满头大汗地检查每一株玉米是否缺水;而几公里外的智慧农场里,一位年轻农民正在空调房里滑动手机屏幕,看着AI系统自动生成的灌溉计划——这就是农业生产AI决策系统带来的改变。本文的目的,就是要揭开这个"智能农业大脑"的面纱,详细讲解它的"身体构造"(架构设计)和"工作原理"(核心逻辑)。我们将聚焦系统最核心的三个部分:数据层(收集农田信息)、模型层(分析信息并思考决策)和应用层(将决策告诉农民)。

AI智能探索者的博客 1327

Python 爬虫实战:Twitter 数据定向抓取(特定话题 + 用户推文爬取与分析)

在社交媒体研究、舆情监测和市场分析等领域,Twitter 数据具有极高的价值。本文将详细介绍如何使用 Python 构建一个完整的 Twitter 数据爬取系统,包括特定话题和用户推文的爬取与分析。我们将涵盖从认证到数据存储、清洗、分析和可视化的全流程。

u014481728的博客 1038

解密现代化医疗数据架构:Protocol Buffers如何重构医疗信息交换范式

在数字化医疗转型的浪潮中,数据交换效率已成为制约智慧医疗发展的关键瓶颈。传统医疗信息系统面临HL7 FHIR标准下XML/JSON格式带来的性能挑战——数据体积膨胀、解析延迟和系统兼容性问题。Protocol Buffers(Protobuf)作为Google的高性能数据交换格式,正以其二进制序列化优势重塑医疗数据架构,为跨系统医疗信息交换提供革命性解决方案。 ## 医疗数据交换的架构困境与技术

gitblog_00769的博客 677

【uniapp踩坑记】App Store上传失败:Invalid Swift Support错误怎么解决?

作为一个前端出身的开发者,用 uniapp 开发原生 App 已经够挑战了,打包 iOS 上传 App Store 更是处处暗雷。这次的坑虽然小,但确实容易忽略。如果你也遇到了类似的报错,希望这篇文章能帮你少踩一次坑!

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1143

protobuf-c与protoc-gen-c深度解析:理解C语言Protocol Buffers实现原理

Protocol Buffers是Google开发的高效数据序列化格式,而**protobuf-c**项目则是其C语言实现版本,为C开发者提供了强大的数据交换能力。本文将深入解析protobuf-c与protoc-gen-c的工作原理,帮助您全面理解C语言Protocol Buffers的实现机制。🚀 ## 🔍 什么是protobuf-c? **protobuf-c**是一个完整的C语言P

gitblog_00952的博客 1076

vue2 - elementUI表格table树形结构复选框勾选父子联动示例,el-table树状表格tree复选框checkbox多选框全选/反选取消children(当子级全选中,父级自动勾选)

vue2,elementui,el-table树状表格多选,树形结构结合多选框使用,实现单选父子联动全选反选,勾选联动父级勾选,表格多选check父子联动,table表格children如何嵌入复选框,el-table使用多选框与树形数据写一个有半选全选功能的表格,el-table树形表格实现复选框多选效果,表格树状结构多选,每一个row都可以选中并且联动全选按钮,table选父带子选子带父,树形数据与懒加载,Table表格树形结构多选框选中父级时会选中子级,elementUI表格里树形结构嵌套复选框全选全

✅ 精选推荐文章 1万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Protocol Buffers for Node.js 编译到 JavaScript:10个实用技巧

Protocol Buffers for Node.js 是一个强大高效的序列化库,专门为 Node.js 环境优化设计。本文将分享 10 个实用技巧,帮助你更好地使用 Protocol Buffers 进行 JavaScript 编译和开发。 ## 🚀 1. 快速安装与基本使用 首先,通过 npm 安装 protocol-buffers: ```bash npm install prot

gitblog_00414的博客 917

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

技术深度解析:lua-protobuf如何实现纯Lua的Protocol Buffers支持

lua-protobuf是一个为Lua语言提供Google Protocol Buffers完整支持的C模块与纯Lua编译器实现。该项目通过独特的架构设计,在保持高性能的同时实现了对protobuf协议版本2和3的全面支持,为Lua生态系统填补了结构化数据序列化的重要空白。其核心技术创新在于将C语言的高性能编解码能力与纯Lua实现的协议编译器相结合,提供了零外部依赖的完整解决方案。 ## 技术架

gitblog_00896的博客 218

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

FlatBuffers vs Protocol Buffers:性能对比与适用场景分析

在当今数据驱动的应用开发中,序列化(Serialization)技术扮演着至关重要的角色。FlatBuffers和Protocol Buffers(简称Protobuf)作为两大主流序列化解决方案,各自拥有独特的设计理念和优势。本文将从性能、内存效率、使用场景等多个维度进行深入对比分析,帮助开发者做出最适合的技术选择。 ## 技术架构对比 ### FlatBuffers架构特点 ```mer...

gitblog_01061的博客 1221

为什么 Protocol Buffers for Node.js 比 JSON 更快?深度性能对比分析

Protocol Buffers for Node.js 作为一款高效的数据序列化工具,在性能方面显著超越传统的JSON格式。本文将深入分析Protocol Buffers的性能优势,解释为什么它在Node.js环境中比JSON更快,并提供实用的性能对比数据。对于需要处理大量数据或追求极致性能的Node.js开发者来说,Protocol Buffers是一个值得考虑的优秀选择。 ## 🔥 Pr

gitblog_01162的博客 454

Protocol Buffers for Node.js 版本迁移指南:从 v4 到 v5 的平滑升级

🎯 **终极迁移指南**:让您的 Protocol Buffers 项目从 v4 无缝升级到 v5 版本!如果您正在使用 Protocol Buffers for Node.js 进行数据序列化,这个完整教程将帮助您轻松完成版本迁移,避免常见的兼容性问题。 Protocol Buffers for Node.js 是一个高效的数据序列化库,专为 Node.js 环境优化。在 v5 版本中,开发

gitblog_00012的博客 992

Protocol Buffers for Node.js 最佳性能配置:20个优化建议

Protocol Buffers for Node.js 是一个高效的二进制序列化库,专门为Node.js环境优化,提供比JSON更快的编码解码速度和更小的数据体积。本文将分享20个实用的性能优化建议,帮助您充分发挥Protocol Buffers在Node.js应用中的性能潜力。 ## 🚀 1. 预编译模式:告别运行时解析 使用预编译模式可以显著提升启动性能。通过CLI工具将.proto文

gitblog_01133的博客 1038
上一篇: OpenClaw 使用免费 Kimi K2.5 的主流方式(2026年2月最新情况)
下一篇: OpenClaw 部署方式对比:云端、WSL、Mac 本机、Ubuntu 虚拟机(2026年2月最新主流实践)
未来创世纪
博客等级 码龄18年 960粉丝 209原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值