
全连接网络结构简单、算子支持成熟适合低维人工特征、传感器标量组合和小型回归任务。它也是TinyML项目的有效基线训练快、资源容易计算能够判断复杂网络是否真的带来增益。Dense层让每个输入连接到每个输出。原始时间窗口很长时第一层参数会随输入维度快速增长模型无法利用时间局部性。人工特征已经把窗口压缩成几十维时Dense模型常是合理起点直接输入长波形时要先核算第一层参数。完成本篇后你应该能够计算Dense网络参数并判断输入维度对模型大小的影响。识别适合Dense的低维特征任务和不适合直接展平的长序列。训练并转换一个24维特征分类器获得可部署的INT8 TFLite文件。Dense层让每个输出神经元连接全部输入。它结构简单是TinyML项目最值得先建立的基线。一、Dense层的资源可以直接计算24维特征连接16个隐藏单元需要24×1616400个参数16个隐藏单元连接5类输出需要16×5585个参数。总计485个参数便于快速部署和检查。如果把100×6原始波形直接展平为600维第一层参数变为600×16169616个。输入时间变长时这个数字继续线性增长。计算示例24 → 16 → 5参数量 (24×1616) (16×55) 485图1先用统计特征压缩输入再建立小型Dense分类基线二、适合低维、全局关系明确的输入统计特征、电池电压、温度、转速和负载等低维输入没有明显局部空间结构Dense层可以直接学习变量组合。小型回归、状态分类和质量评分都可先用它建立基线。当输入各维度量纲不同需要固定标准化参数。特征顺序改变也会让权重含义错位部署契约必须明确。三、长波形与图像不适合直接展平展平会让不同时间位置使用独立权重无法利用相同局部模式在窗口中移动的性质。参数量上升后过拟合和Flash占用也增加。1D卷积通过参数共享处理时间序列2D卷积处理频谱或低分辨率图像。Dense层仍可放在卷积特征之后完成最终分类。表1全连接网络的适用性判断输入情况适合程度原因几十维统计特征高参数可控、全局组合清晰少量多传感器标量高无需局部卷积结构长时间原始波形低展平后参数快速增长频谱图或图像低破坏二维局部结构四、把Dense模型当作比较基准基线需要与后续模型使用相同数据划分和评价指标。若卷积网络只提升极少效果却明显增加Arena和延迟Dense方案可能更适合交付。错误分析同样重要。Dense模型在哪些类别失效可以提示人工特征是否缺少时间结构或频率信息。Python/Keras24维特征的轻量Dense基线import tensorflow as tfmodel tf.keras.Sequential([tf.keras.layers.Input(shape(24,)),tf.keras.layers.Dense(16, activationrelu),tf.keras.layers.Dense(5, activationsoftmax),])model.compile(optimizeradam,losssparse_categorical_crossentropy,metrics[accuracy],)Dense适合输入已经被压缩成全局摘要的任务24维时域或频带特征连接16个隐藏单元只需要24×1616400个参数再连接5类输出需要16×5585个参数。这样的小网络便于训练、转换和调试。若把100×6原始窗口展平为600维再连接128个单元第一层已有600×12812876928个参数还丢失了模型利用局部共享的机会。窗口加长会继续线性增加参数。Dense也是比较基线。它效果不足时通过错误分析判断缺少时序局部模式、频率信息还是数据覆盖再选择卷积或新特征。直接从复杂网络开始会失去一个可解释参照。Dense参数量 输入维度×输出维度 输出偏置数24→16→5400 85 485个参数训练完成还要验证转换后的模型训练框架模型、FP32 TFLite和INT8 TFLite是三个执行对象。转换后要用同一批输入分别推理比较类别与分数变化。代表性数据应覆盖真实特征范围否则量化尺度会偏。输入标准化参数必须随模型保存。示例使用合成特征真实项目只能用训练集计算mean与std并在固件中复现。类别顺序同样要绑定版本。板端先使用一条黄金特征向量不接传感器验证输入量化、Invoke和输出反量化随后再接入实时特征。这样能把模型部署问题与采集问题分开。Dense基线的三阶段验收阶段检查通过证据训练独立分组指标混淆矩阵与错误样本转换FP32/INT8一致性同输入输出对照MCU契约与资源黄金输入、Arena和计时动手训练、量化并检查一个24维Dense模型代码生成三类合成特征训练24→16→3网络转换为全整数INT8并用解释器推理一条样本。它提供完整链路效果只用于验证工具流程。实验环境与输入建议在虚拟环境中安装TensorFlow和NumPypython -m pip install tensorflow numpy。保存为 dense_tinyml.py 并运行。若安装失败按TensorFlow官方当前版本选择其支持的Python版本。按顺序完成实验运行代码确认生成 dense_int8.tflite。查看模型参数量、TFLite字节数和解释器输入量化参数。把隐藏单元从16改为8比较参数量与文件大小。把代表性数据生成器改成只返回全零观察量化模型输出可能变差。可执行完整链路合成数据、Dense训练、INT8转换与推理import numpy as npimport tensorflow as tfrng np.random.default_rng(18)classes, samples, features 3, 600, 24x rng.normal(0, 0.35, size(samples, features)).astype(np.float32)y np.repeat(np.arange(classes), samples//classes)for label in range(classes):x[y label, label*4:(label1)*4] 1.2model tf.keras.Sequential([tf.keras.layers.Input((features,)),tf.keras.layers.Dense(16, activationrelu),tf.keras.layers.Dense(classes, activationsoftmax),])model.compile(optimizeradam, losssparse_categorical_crossentropy, metrics[accuracy])model.fit(x, y, epochs12, batch_size32, verbose0)def representative():for row in x[:120]:yield [row[np.newaxis, :]]converter tf.lite.TFLiteConverter.from_keras_model(model)converter.optimizations [tf.lite.Optimize.DEFAULT]converter.representative_dataset representativeconverter.target_spec.supported_ops [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]converter.inference_input_type tf.int8converter.inference_output_type tf.int8tflite converter.convert()open(dense_int8.tflite, wb).write(tflite)itp tf.lite.Interpreter(model_contenttflite)itp.allocate_tensors()inp, out itp.get_input_details()[0], itp.get_output_details()[0]scale, zp inp[quantization]q np.clip(np.rint(x[0]/scale zp), -128, 127).astype(np.int8)[None, :]itp.set_tensor(inp[index], q)itp.invoke()print(params:, model.count_params(), tflite bytes:, len(tflite))print(input:, inp[shape], inp[dtype], inp[quantization])print(output int8:, itp.get_tensor(out[index]), true class:, y[0])先读懂代码中的关键路径合成数据让每个类别在不同4维特征上偏移Dense可以学习全局特征组合。代表生成器返回 [1,24] float32批次转换器据此校准各层范围。输入量化从解释器读取scale和zero point禁止硬编码假设。脚本只演示工具链真实效果必须按设备划分并保存混淆矩阵。你应该观察到什么模型参数量为45124×1616加16×33。解释器输入dtype为int8并提供非零scale。文件成功写入并能完成一次Invoke。成功标准代码在干净环境中从数据生成运行到INT8推理。量化输入使用解释器实际scale和zero point。真实项目改用按设备隔离的数据和独立测试。失败时从哪里查起Dense全链路常见故障现象原因处理转换器要求代表数据启用了全整数转换生成器每次返回真实shape的float32批次INT8输入全饱和标准化或scale错误打印量化前范围与饱和比例板端类别错位labels顺序不同保存并校验类别映射这条Dense链路应成为后续复杂模型的回归基线数据、量化和板端接口先在简单模型上跑通。把实验迁移到真实MCU项目把 dense_int8.tflite 转为C数组后先在MCU写入脚本保存的一条INT8特征向量。输出码一致后再移植24维特征计算。特征顺序是模型接口。建议生成C枚举和静态断言禁止训练端新增特征后固件仍按旧索引写入。把结果再向前推进一步将24维直接连接3类比较线性模型与隐藏层模型。记录FP32与INT8在同一测试集的混淆矩阵差异。把一条黄金特征向量转换成可嵌入C数组。收束Dense网络适合低维特征与多变量组合也是TinyML模型比较的首个基线。长波形直接展平会放大参数应优先考虑卷积结构。参考资料Google AI Edge构建并转换微控制器模型TensorFlow Lite Micro 官方代码仓库