当前位置: 首页 > article >正文

TInyML基础:“不用死记公式!一文讲透全连接层:它到底把神经网络‘连’成了什么样?”

大家好我是贺老师嵌入式 AI工程师《嵌入式AI让单片机学会思考》主理人专注AI在MCU上的落地实践。文章简介很多人第一次学习神经网络最先接触的往往就是 Dense也叫全连接层。它看起来很简单输入一组数字输出另一组数字。但真正到了嵌入式 AI、TinyML、模型部署、Netron 看模型结构的时候很多人又会卡住。Dense 到底在算什么为什么叫“全连接”权重和偏置在哪里Dense 的输入输出 shape 怎么看为什么 Dense 层参数量很容易变大为什么 MCU 上不能随便堆 Dense这篇文章站在嵌入式工程师能真正用起来的角度把 Dense 和数组、矩阵、参数量、模型部署联系起来。一、Dense 到底是什么1. 什么叫全连接Dense 的中文一般叫“全连接层”。所谓“全连接”意思是上一层的每一个输入都和下一层的每一个输出相连。假设输入有 3 个数字x1, x2, x3Dense 层要输出 2 个数字y1, y2那么 y1 会同时使用 x1、x2、x3y2 也会同时使用 x1、x2、x3。y1 x1 * w11 x2 * w21 x3 * w31 b1 y2 x1 * w12 x2 * w22 x3 * w32 b2这里面的w是权重b是偏置。2. Dense 的本质公式可以先把 Dense 理解成一个“可训练的多输入多输出计算模块”。它不是人工写死规则而是通过训练得到一组权重和偏置。输出 输入 × 权重矩阵 偏置如果再加上激活函数就变成输出 激活函数(输入 × 权重矩阵 偏置)比如最常见的 ReLU输出 ReLU(输入 × 权重矩阵 偏置)ReLU 的作用很简单小于 0 的值变成 0大于 0 的值保持不变。float relu(float x) { return x 0 ? x : 0; }3. 全连接结构示意二、Dense 的输入、输出和参数量怎么看1. 看 Dense先看输入长度和输出长度学习 Dense最关键的是看懂三个东西输入长度是多少输出长度是多少参数量是多少。假设有这样一层Dense(4, input_shape(3,))它表示输入是 3 个数字输出是 4 个数字。每个输出都要连接 3 个输入所以一个输出需要 3 个权重。现在有 4 个输出所以权重数量是3 × 4 12每个输出还需要一个偏置所以偏置数量是4这一层总参数量就是3 × 4 4 162. Dense 参数量公式Dense 层参数量的计算公式非常直接参数量 输入长度 × 输出长度 输出长度也可以写成参数量 (输入长度 1) × 输出长度多出来的那个 1本质上就是偏置。例子输入是长度为 128 的特征向量Dense 输出 64 个节点Dense(64, input_shape(128,)) 参数量 128 × 64 64 82563. 为什么 Dense 层很容易变大Dense 层的参数量增长非常直接。输入越长输出节点越多参数量就越大。尤其是图像类任务如果直接把图片拉平成一维再接 Dense参数量会非常大。例子一张 96×96 的灰度图如果直接 Flatten 后接 Dense(128)输入长度 96 × 96 9216 输出长度 128 参数量 9216 × 128 128 1,179,776这一层就超过 117 万个参数。哪怕是 int8 量化光权重就接近 1.18 MB。对于很多 MCU 来说这已经不现实。参数量对比表输入长度输出节点数参数量计算参数量int8 权重约占用403240 × 32 321,312约 1.3 KB12864128 × 64 648,256约 8.1 KB10241281024 × 128 128131,200约 128 KB92161289216 × 128 1281,179,776约 1.18 MB三、Dense 在神经网络里通常起什么作用1. 做特征组合假设前面已经提取出一组特征比如传感器信号经过预处理以后得到 40 个特征值feature[0] ~ feature[39]Dense 层可以把这 40 个特征重新组合成更有表达能力的中间表示Dense(32, activationrelu)这表示模型会从 40 个输入特征中学习出 32 个新的组合特征。每个输出节点都可以理解为“从所有输入特征中提取某种模式”。2. 做分类输出如果任务是三分类比如0 静止 1 走路 2 跑步最后一层通常可以写成Dense(3, activationsoftmax)输出是 3 个数字分别代表三个类别的概率倾向。比如模型输出[0.05, 0.90, 0.05]就可以理解为模型认为第 1 类“走路”的可能性最大。3. 做二分类或回归预测如果是二分类比如“正常 / 异常”也可以写成Dense(1, activationsigmoid)输出一个 0 到 1 之间的值。比如0.87可以理解为更偏向“异常”这一类。实际项目中还会设定阈值比如大于 0.7 才判定异常而不是简单用 0.5。如果模型不是输出类别而是输出一个连续数值比如温度预测、距离估计、剩余寿命估计那么最后一层常常不加 softmax也不加 sigmoid而是直接Dense(1)Dense 输出层常见写法任务类型输出层写法输出含义后处理方式二分类Dense(1, activationsigmoid)0~1 的概率倾向与阈值比较多分类Dense(N, activationsoftmax)N 个类别概率取最大概率类别回归Dense(1)连续数值直接读取或做物理量换算四、从代码和部署角度理解 Dense1. 一个简单 Dense 网络import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers model keras.Sequential([ layers.Input(shape(40,)), layers.Dense(32, activationrelu), layers.Dense(16, activationrelu), layers.Dense(3, activationsoftmax) ]) model.summary()​​​​​​​这段模型的含义很清楚输入是 40 个特征值第一层 Dense 把 40 个输入变成 32 个中间特征第二层 Dense 把 32 个中间特征变成 16 个中间特征最后一层 Dense 输出 3 个类别结果。2. 参数量估算第一层40 × 32 32 1312 第二层32 × 16 16 528 第三层16 × 3 3 51 总参数量1891​​​​​​​如果是 float32每个参数 4 字节大约需要1891 × 4 7564 字节如果量化为 int8每个参数 1 字节大约是1891 × 1 1891 字节真实部署时还要算模型结构信息、中间张量、Tensor Arena 等运行时内存但这个估算已经能让你判断模型大概是否适合 MCU。3. 从 C/C 角度看 Dense 的计算从 C/C 的角度看Dense 层核心计算可以粗略理解成下面这样void dense_layer(const float* input, const float* weights, const float* bias, float* output, int input_size, int output_size) { for (int j 0; j output_size; j) { float sum bias[j]; for (int i 0; i input_size; i) { sum input[i] * weights[i * output_size j]; } output[j] sum; } }这段代码表达的就是 Dense 层最核心的逻辑每个输出节点都要把所有输入乘以对应权重再加上偏置。​​​​​​​如果加 ReLUfor (int j 0; j output_size; j) { if (output[j] 0) { output[j] 0; } }​​​​​​​部署端最关键的判断Dense 层在 MCU 上的性能主要受输入长度 × 输出长度影响。这个值越大乘加次数越多推理时间越长。五、Dense 层在嵌入式 AI 中应该怎么用1. Dense 适合什么场景Dense 非常适合小输入、小模型、结构清晰的任务。比如下面这些场景Dense 很常见传感器特征分类把温度、电流、振动 RMS、峰值、均值、方差等特征整理成几十维向量然后用 Dense 做正常/异常判断。简单回归任务输入几个传感器特征输出一个估计值。小型动作识别任务如果前面已经把一段 IMU 数据压缩成特征向量Dense 可以作为分类器。2. Dense 不适合直接处理很大的原始输入如果输入很大比如原始图像、长音频、长时序信号直接用 Dense 往往不合适。因为它不利用局部结构每个输入都连到每个输出参数量会迅速变大。这时候更常见的做法是前面用卷积层或特征提取方法先压缩信息再接 Dense 做最后分类。图像任务通常不建议直接这样写Flatten() Dense(128) Dense(10)​​​​​​​如果图像尺寸比较大这种结构参数量很容易失控。更合理的是Conv2D(...) MaxPooling2D(...) Conv2D(...) Flatten() Dense(32) Dense(num_classes)3. MCU 项目里 Dense 的使用建议Dense 的正确使用思路是输入维度不要太大 中间节点不要盲目加宽 输出层要和任务类型匹配 部署前必须估算参数量和计算量如果是 MCU 项目建议一开始就控制 Dense 的规模。比如输入几十维隐藏层 16、32、64 都比较常见。不要一开始就上 256、512、1024 这种宽层除非目标芯片资源足够并且已经验证过推理时间和内存占用。最后给一个非常实用的判断方式当你看到一层 Dense 时马上问四个问题输入长度是多少输出节点是多少参数量是多少这一层在 MCU 上是否值得如果这四个问题回答不上来就说明你还没有真正看懂这层。总结Dense 层看起来是神经网络里最基础的一层但它并不简单。它连接着模型结构、参数量、计算量、输入输出 shape、量化部署和 MCU 资源预算。把 Dense 真正搞明白后面再看 CNN、RNN、Transformer理解难度会下降很多。因为无论模型结构多复杂最终都离不开一个核心输入数据经过一系列可训练参数的计算逐步变成我们需要的输出结果。Dense就是最直接、最基础、也最值得嵌入式工程师认真掌握的一层。

相关文章:

TInyML基础:“不用死记公式!一文讲透全连接层:它到底把神经网络‘连’成了什么样?”

大家好,我是贺老师,嵌入式 AI工程师,《嵌入式AI:让单片机学会思考》主理人,专注AI在MCU上的落地实践。文章简介很多人第一次学习神经网络,最先接触的往往就是 Dense,也叫全连接层。它看起来很简…...

轻量级进程守护工具 openclaw-keep-alive 实战指南

1. 项目概述与核心价值最近在折腾一些需要长期稳定运行的后台服务时,遇到了一个老生常谈但又非常棘手的问题:如何确保一个进程或服务在意外崩溃后能自动重启,以及在服务器重启后能自动拉起?这个问题在个人项目、小型服务器运维乃至…...

研究人工智能,何以落于上古汉语同源词意义系统

概括文章思路: ①人工智能→认知(高态信息运作过程)→意识精神(信息高级形态)→全信息→语义信息→语义系统→…… ②人工智能→意义逻辑(本体内容逻辑)→语义逻辑→语义系统→…… ③语义系…...

Mem-Oracle:本地化文档向量索引,让AI编程助手精准调用技术文档

1. 项目概述与核心价值最近在折腾AI编程助手,特别是Claude Code,发现一个痛点:虽然它能写代码,但面对复杂的项目文档、框架API或者公司内部的技术Wiki时,它经常“一问三不知”,或者给出过时、不准确的答案。…...

彻底解决Windows更新故障:Reset Windows Update Tool专业修复指南

彻底解决Windows更新故障:Reset Windows Update Tool专业修复指南 【免费下载链接】Reset-Windows-Update-Tool Troubleshooting Tool with Windows Updates (Developed in Dev-C). 项目地址: https://gitcode.com/gh_mirrors/re/Reset-Windows-Update-Tool …...

企业如何落地生成式搜索引擎优化(GEO)?技术实战方案

生成式搜索引擎优化(GEO)不是概念,而是企业必须立即执行的数字营销战略。通过结构化数据增强、内容语义优化和AI模型适配三大核心手段,企业可在ChatGPT、Bing Chat、Google SGE等生成式搜索平台中获得显著曝光提升。 一、GEO与传统SEO的本质区别 传统S…...

从‘只恐夜深花睡去’到代码注释:程序员如何用诗意对抗深夜Bug?

从‘只恐夜深花睡去’到代码注释:程序员如何用诗意对抗深夜Bug? 凌晨三点的显示器蓝光下,你盯着那段顽固的代码已经两小时。突然,控制台飘出一行苏轼的"只恐夜深花睡去",这是你上周埋在日志系统里的彩蛋。此…...

应对2026检测算法:英文论文AI率居高不下?5个降AI方法实测盘点

最近正值论文季,不少人在后台私信我诉苦。说辛辛苦苦写出的文章去检测一遍,结果AI率直接飙升到六七十甚至更高。大家都很焦虑,眼看就要提交了,这种无力感我非常懂。 现在各大检测系统不断升级,判定的标准的也是越来越…...

ComfyUI WD1.4反推插件报错?手把手教你修改wd14tagger.py解决onnxruntime-gpu加载失败

ComfyUI WD1.4反推插件报错?手把手教你修改wd14tagger.py解决onnxruntime-gpu加载失败 最近在折腾ComfyUI的WD1.4反推插件时,遇到了一个让人头疼的问题——onnxruntime-gpu加载失败。这个问题看似复杂,其实解决起来并不难。今天我就来分享一下…...

从混乱到专业:5分钟用LaTeX的booktabs和multirow打造期刊级三线表与复杂表格

从混乱到专业:5分钟用LaTeX的booktabs和multirow打造期刊级三线表与复杂表格 在学术写作和技术文档中,表格不仅是数据的容器,更是专业性的直观体现。一篇发表在Nature期刊的研究显示,超过70%的审稿人会特别关注论文中表格的规范性…...

CSS魔法光标实现:提升Web交互体验的发光拖尾效果

1. 项目概述与核心价值最近在做一个需要提升用户交互体验的Web项目,一直在琢磨怎么让鼠标光标这个最基础的交互元素变得更有趣、更“有存在感”。毕竟,在大多数网页里,鼠标指针要么是默认的箭头,要么是简单的手型,存在…...

开源主动安全监控框架OpenClaw Sentinel:插件化架构与规则引擎实践

1. 项目概述:从“OpenClaw Sentinel”看开源安全监控的演进最近在梳理一些开源安全工具时,又看到了dazeb/openclaw-sentinel这个项目。这个名字本身就很有意思,“OpenClaw”直译是“开放的爪子”,而“Sentinel”意为“哨兵”。组合…...

Godot插件管理革命:用gd-plug实现声明式依赖管理

1. 项目概述:为什么Godot需要一个插件管理器?如果你在Godot引擎里做过几个项目,尤其是规模稍大一点的,肯定会遇到一个头疼的问题:插件管理。今天想试试那个很酷的UI工具,从AssetLib下载下来,解压…...

多模态大语言模型跨模态不一致性分析与优化

1. 项目背景与核心问题去年我在参与一个智能客服系统升级项目时,遇到了一个有趣的现象:当用户同时发送文字"这个产品很糟糕"和一张竖起大拇指的图片时,系统竟然给出了"感谢您的积极反馈"的响应。这个看似滑稽的错误&…...

LLM增强文生图:Think-Then-Generate方法解析与实践

1. 项目背景与核心思路去年在做一个文创类AI项目时,我遇到了一个典型问题:用常规文生图模型生成的插画,总会出现逻辑错乱——比如要求"穿红裙子的女孩在图书馆看书",结果不是裙子颜色不对,就是人物出现在户外…...

Windows光标自定义实战:基于.NET 8与WPF的系统级个性化工具开发

1. 项目概述:给你的鼠标一点“态度” 如果你和我一样,是个在电脑前度过大半时光的人,可能会觉得默认的白色箭头光标有点……太平淡了。它精准、高效,但毫无个性。今天要聊的这个项目, GTACursor ,就是给…...

别再手动调参了!用BrainGB一站式搞定脑网络GNN基准测试(附实战代码)

别再手动调参了!用BrainGB一站式搞定脑网络GNN基准测试(附实战代码) 神经科学研究与机器学习领域的交叉点正在催生前所未有的创新,而脑网络分析作为这一交叉领域的核心课题,正面临数据处理复杂、模型选择困难、实验可复…...

3分钟搞定视频字幕:VideoSrt开源工具完全指南

3分钟搞定视频字幕:VideoSrt开源工具完全指南 【免费下载链接】video-srt-windows 这是一个可以识别视频语音自动生成字幕SRT文件的开源 Windows-GUI 软件工具。 项目地址: https://gitcode.com/gh_mirrors/vi/video-srt-windows 你是否曾经为了给视频添加字…...

MCP协议:构建AI智能体与外部工具的安全标准化桥梁

1. 项目概述:MCP——连接AI与数字世界的“万能适配器” 如果你最近在折腾AI应用开发,特别是想让大语言模型(LLM)能像人类一样操作电脑、读取文件、调用API,那你大概率已经听说过“MCP”这个词了。 isteamhq/mcp 这个…...

从VGG、ResNet到DenseNet:在FER2013上跑个分,聊聊我为什么最终选了它

从VGG到DenseNet:FER2013表情识别实战中的模型选型思考 当面对4848像素的灰度人脸表情图片时,选择哪个深度学习架构才能达到最佳识别效果?这个问题困扰了我整整两周。FER2013数据集虽然规模不大,但包含了从愤怒到惊喜的七种微妙表…...

仅限持牌机构获取:Docker金融调试私有镜像仓库调试协议(含FIPS 140-2加密组件验证流程、国密SM4容器化调试实录)

更多请点击: https://intelliparadigm.com 第一章:Docker金融调试的合规性边界与持牌准入机制 在金融行业,容器化调试环境(如基于 Docker 的本地沙箱)并非技术中立工具,其部署、镜像构建与运行时行为直接受…...

VTC-R1视觉化压缩技术解决长文本理解瓶颈

1. 项目背景与核心价值去年在处理一批医疗影像报告时,我发现一个棘手问题:当需要同时分析患者的CT扫描描述、病理报告和病史记录时,传统文本处理模型会因为上下文过长而丢失关键细节。这种长文本理解瓶颈在金融合同解析、法律文书分析等场景同…...

基于 GitHub Actions 端到端工程化落地——AI全栈项目实战案例

AI全栈项目实战案例一:基于 GitHub Actions 端到端工程化落地 案例定位 项目名称:AI Chat 全栈应用(前端 ViteVue3 后端 Node.js AI 大模型接口调用 Docker 容器化 GitHub CI/CD 全自动流水线) 项目架构:前后端分离…...

5分钟掌握AI视频分析:本地化智能处理完整教程

5分钟掌握AI视频分析:本地化智能处理完整教程 【免费下载链接】video-analyzer Analyze videos using LLMs, Computer Vision and Automatic Speech Recognition 项目地址: https://gitcode.com/gh_mirrors/vi/video-analyzer 面对数小时的视频素材&#xff…...

LinkSwift 技术架构深度解析:八大网盘直链下载助手的实现原理与实战指南

LinkSwift 技术架构深度解析:八大网盘直链下载助手的实现原理与实战指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中…...

Anolis OS 8.8 服务器环境搭建:从零搞定Nginx、Redis、JDK8和Tomcat9(附依赖包安装避坑指南)

Anolis OS 8.8 企业级环境部署实战:NginxRedisJDK8Tomcat9全栈指南 当一台全新的Anolis OS 8.8服务器摆在面前时,如何快速搭建稳定可靠的生产环境?作为国产操作系统的代表,Anolis OS在性能优化和安全性方面有着独特优势&#xff0…...

告别电脑格式化:在STM32F407上深度玩转FATFS的f_mkfs,实现SD卡自定义格式化

在STM32F407上精通FATFS的f_mkfs:从底层原理到SD卡性能调优 当你的嵌入式设备需要处理大量数据时,SD卡往往成为首选的存储介质。但你是否遇到过这样的困扰:随着使用时间的增长,SD卡的读写速度明显下降,甚至出现数据紊乱…...

终极解决方案:用easy-topo免费创建专业级网络拓扑图

终极解决方案:用easy-topo免费创建专业级网络拓扑图 【免费下载链接】easy-topo vuesvgelement-ui 快捷画出网络拓扑图 项目地址: https://gitcode.com/gh_mirrors/ea/easy-topo 还在为复杂的网络架构图而头疼吗?easy-topo是一款基于VueSVGElemen…...

从Web到桌面:用Electron+Vue3给你的网页套个“原生壳”,进程通信到底怎么玩?

从Web到桌面:ElectronVue3进程通信深度实战指南 1. 理解Electron的进程架构 Electron应用的核心在于其独特的进程模型设计。与传统的Web应用不同,Electron将Chromium的渲染进程和Node.js的主进程分离,这种架构既带来了强大的桌面集成能力&…...

AI驱动的代码库测绘工具Recon:为大型项目构建智能架构地图

1. 项目概述:AI驱动的代码库测绘工具如果你和我一样,每天都要面对动辄几千甚至上万个文件的代码库,那你肯定也经历过那种“迷失”的感觉。想了解一个模块的职责,得翻遍十几个目录;想重构一个功能,却不知道动…...