diff --git a/doc_attachments/2024-05-08T03-27-13-238Z.png b/doc_attachments/2024-05-08T03-27-13-238Z.png new file mode 100644 index 0000000..f496e78 Binary files /dev/null and b/doc_attachments/2024-05-08T03-27-13-238Z.png differ diff --git a/main.adoc b/main.adoc index 5a3cac0..1518810 100644 --- a/main.adoc +++ b/main.adoc @@ -434,12 +434,84 @@ x^*=(x - \overline{x})/\sigma 处理后的数据需要进行划分,本设计中将处理后的数据划分为训练集和验证集,其中训练集占比 80%,测试集为 20%。划分完成后需要保证每种标签数据占比均匀。 //骨干网络设计 -=== 骨干网络设计 +=== 神经网络结构层次 ==== 卷积层 +在卷积神经网络(CNN)中,卷积层是核心组成部分,它负责从输入数据中提取关键特征。卷积层通过使用一组可学习的卷积核(或称为滤波器)来扫描输入数据(如图像)的局部区域,并在每个位置上执行卷积操作,从而生成特征图(feature maps)。这些特征图捕获了输入数据在不同空间层次上的局部信息,为后续的网络层提供了有用的表示。卷积层中的每个卷积核都具有一定的尺寸和深度,它们沿着输入数据的宽度和高度方向滑动,并在每个位置上与输入数据进行点积运算,然后加上一个偏置项,最后通过激活函数(如 ReLU)得到输出特征图上的一个值。由于卷积核的权值是共享的,这使得卷积层能够学习到输入数据中的平移不变性特征,并且显著减少了网络中的参数数量,降低了过拟合的风险。 + +//待验证公式 +二维卷积的过程为 stem:[Y(i, j) = \sum_{m=0}^{h-1} \sum_{n=0}^{k-1} X(i+m, j+n) \cdot K(m, n)] + +其中,stem:[0 \leq i < H-h+1 ] ,stem:[ 0 \leq j < W-k+1 ]。stem:[ X(i+m, j+n) ] 是输入 X 在位置 stem:[(i+m, j+n)] 的值,stem:[K(m, n)] 是卷积核 K 在位置 stem:[(m, n)] 的值。 + +//选取怎样的卷积核大小和 + ==== 池化层 +池化层(Pooling Layer)的主要作用是对卷积层的输出进行降采样操作,减小输入数据的空间尺寸,降低模型的计算复杂度,减少过拟合,并在一定程度上提取输入数据的重要特征。池化层的操作过程可以看作是卷积操作的一种特殊情况,但通常不使用权重参数,而是使用预定义的池化函数(如最大值、平均值等)来聚合输入数据。常用池化层类型有最大池化层(Max Pooling)、平均池化层(Average Pooling)和自适应池化层(Adaptive Pooling)等。 + +本设计中,输入为三轴加速度计在时域上平铺的二维单通道图像,存在一定的纹理特征,所以选用最大池化层以保留纹理特征并增强泛化能力。 + ==== 全连接层 +全连接层(Fully Connected Layer),也被称为密集连接层(Dense Layer)或内积层(Inner Product Layer),是神经网络中常见的一种层级结构,尤其在卷积神经网络(Convolutional Neural Networks, CNNs)的尾部经常出现。全连接层的主要作用是对前一层(可能是卷积层、池化层、或其他类型的全连接层)的输出进行加权求和,并通过激活函数产生非线性特性,从而得到网络的最终输出。 + +//全连接层激活函数 ReLU + +本设计中神经网络输出为故障类型分类的置信度,故在最后一层全连接层中使用 softmax 作为激活函数。softmax 函数将神经网络的输出转换为概率分布。给定一个长度为 K 的向量 z(其中 K 是类别的数量),softmax 函数的第 i 个输出是: +//待验证公式 +[stem] +++++ +\text{softmax}(z)i = \frac{e^{z_i}}{\sum{j=1}^{K} e^{z_j}} +++++ + +softmax 确保输出的概率分布在 [0, 1] 之间,并且所有类别的概率之和为 1。 + +当使用 softmax 作为分类网络的最后一层时,通常会使用交叉熵损失函数(cross-entropy loss)来度量模型预测的概率分布与真实标签之间的差异。交叉熵损失函数能够很好地与 softmax 函数一起工作,因为它直接度量了预测概率分布与真实概率分布之间的“距离”。本设计中也使用该损失函数。 + + + +==== 超参数设计 //超参数设计,学习率、损失函数 +在设计 CNN(卷积神经网络)中的超参数时,需要考虑多个方面以确保模型能够高效、准确地执行特定任务。以下是一些关键的超参数及其设计考虑因素: + +1. 学习率(Learning Rate): +学习率决定了模型在训练过程中权重更新的步长。 +如果学习率太高,模型可能无法收敛;如果太低,训练可能会非常慢。 +可以使用学习率衰减策略,如轮数减缓(step decay)、指数减缓(exponential decay)或分数减缓(1/t decay),来随着训练的进行逐渐减小学习率。 +通常建议从较小的值(如 0.01 或 0.001)开始,并根据训练情况进行调整。 + +2. 批次大小(Batch Size): +批次大小决定了在一次权重更新中使用的样本数量。 +较大的批次大小可以加速训练,但可能需要更多的内存;较小的批次大小可能会导致训练不稳定,但可能有助于泛化。 +通常,批次大小设置为 2 的幂次(如 32、64、128 等)可以提高计算效率。 + +3. 卷积层参数: +卷积核大小(Kernel Size):决定了感受野的大小,通常使用 3x3 或 5x5 的小卷积核。 +步长(Stride):决定了卷积核在输入特征图上滑动的步长,默认为 1。 +填充(Padding):用于在输入特征图的边界周围添加额外的像素,以保持输出特征图的空间尺寸。常用的填充方式有'valid'(不填充)和'same'(填充后输出与输入尺寸相同)。 +卷积核数量(Number of Filters/Channels):决定了输出特征图的深度,通常根据任务和数据集的特性进行设置。 + +4. 池化层参数: +池化类型:常用的有最大池化(Max Pooling)和平均池化(Average Pooling)。最大池化能够提取最显著的特征,而平均池化则能够保留更多全局信息。 +池化窗口大小:决定了池化操作的感受野大小,通常为 2x2。 +步长:决定了池化窗口在输入特征图上滑动的步长,与池化窗口大小通常设置为相同值。 + +5. 全连接层参数: +神经元数量:决定了全连接层的宽度,通常根据任务和数据集的特性进行设置。过多的神经元可能导致过拟合,而过少的神经元可能无法充分学习数据的特征。 +激活函数:如 ReLU、Sigmoid、Tanh 等,用于引入非线性特性。ReLU 在深度学习中广泛使用,因为它能够有效缓解梯度消失问题。 + +6. 优化器(Optimizer): +常用的优化器有 SGD(随机梯度下降)、Adam、RMSprop 等。不同的优化器具有不同的特性和适用场景,需要根据具体情况进行选择。 + +7. 损失函数(Loss Function): +对于分类任务,常用的损失函数有交叉熵损失(Cross-Entropy Loss);对于回归任务,常用的有均方误差(Mean Squared Error, MSE)等。损失函数的选择应基于任务的需求和数据的特点。 + +8. 正则化(Regularization): +为了防止过拟合,可以使用正则化技术如 L1 正则化、L2 正则化(也称为权重衰减)、Dropout 等。这些技术可以限制模型的复杂度,提高模型的泛化能力。 + +9. 迭代次数(Epochs): +迭代次数决定了模型在训练集上完整的遍历次数。过多的迭代次数可能导致过拟合,而过少的迭代次数可能导致模型未能充分学习数据的特征。通常需要通过验证集的性能来选择合适的迭代次数。 + +//本设计中 //导出 h5fd @@ -526,7 +598,28 @@ X[k+N/2]=A[k]-W_{N}^{k}B[k],k=0,1,\ldots,\frac{N}{2}-1 由于采用的主控带有数字信号处理模块 (DSP),所以程序中不需要自行实现。采集到足够点数的时域数据后传入处理函数即可。 -==== 基于 Cube-AI 的推理模型转化和部署 +==== 基于 X-Cube-AI 的推理模型转化和部署 + +由于本设计中采用边缘计算形式,选用的主控受成本和功耗限制,运算能力和存储空间均受较大限制。在本地计算机中使用较小规模的网络所训练的模型,其大小也达到数兆字节 (MByte),而所选用的 GD32F405RGT6 所采用的高速嵌入式存储器仅有 1 兆字节 (Mbyte) 闪存和 192 千字节 (KB) 随机存储器 (SRAM),显然难以直接使用原始模型进行推理。 + +目前的解决方案主要是通过对模型进行量化剪裁等操作,以及根据微控制器进行针对性的加速优化,减少模型尺寸和推理资源占用。由于使用的微控制器为基于 Cortex-M4F 内核的 GD/STM32F405,可以使用 CMSIS-NN 神经网络库。该库/框架优化了各种常见的神经网络层,如卷积层、全连接层等,确保了在微控制器上的运行效率。而基于 CMSIS-NN 框架,又产生了抽象程度更高,直接面向用户的高级应用层框架和辅助工具包,如独立开发者 Jianjia Ma 开发的 NNoM、Google 的用于微控制器的 TensorFlow Lite、意法半导体的 X-CUBE-AI、瑞萨电子的 e-Ai 解决方案等。这些方案普遍支持将使用特定框架训练的模型文件转化为适合部署于单片机上的形式的 c 库,并提供了模型推理的应用层接口,不需要用户手动维护底层结构。 + +本设计中由于使用意法半导体提供的 hal 库进行编程,并且使用意法半导体的 STM32CubeMX 工具生成项目,为了简化开发流程,直接使用了 STM32CubeMX 可嵌入的 X-CUBE-AI 工具包构建单片机上的推理框架。 + +===== X-CUBE-AI 简介 + +// 该段引用自意法半导体 X-CUBE-AI 手册,确认是否需要添加参考 +X-CUBE-AI 通过提供在计算和存储器(RAM 和闪存)方面均已优化的自动神经网络库生成器扩展 STM32CubeMX,该生成器将预训练的神经网络从最常用的 DL 框架(如 Caffe、Keras、Lasagne 和 ConvnetJS)转换为自动集成到最终用户项目的库。项目自动完成设置,准备好在 STM32 微控制器上进行编译和执行。 + +X-CUBE-AI 内核引擎,是 X-CUBE-AI 扩展包的一部分。它提供一个自动且先进的 NN 映射工具,利用有限并受约束的硬件资源为嵌入式系统的预训练神经网络(DL 模型)生成并部署优化且稳定的 C 模型。生成的 STM32 NN 库(专用和通用部分)可直接集成到 IDE 项目或者基于 makefile 的构建系统。还可导出定义明确且特定的推理客户端 API,用于开发客户端基于 AI 的应用程序。支持各种用于深入学习的框架(DL 工具箱)和层。 + +image::doc_attachments/2024-05-08T03-27-13-238Z.png[x-cube-ai 内核引擎] + +根据官方说明,X-CUBE-AI 主要采用权重/偏差压缩和操作融合的方式进行 flash 和 ram 空间上的优化,通过设置不同的压缩等级和优化参数,可以取得推理精度和空间以及运行速度的均衡。 + +===== X-CUBE-AI 模型转化和部署流程 + + ==== 基于 Modbus 总线协议的程序设计