更多内容:XiaoJ的知识星球
一、简介
.
1.CMSIS-NN库
(1)CMSIS-NN 软件库是什么?
CMSIS:是ARM公司与多家芯片和软件供应商合作定义的,提供了内核与外设、实时操作系统和中间设备之间的通用接口。
CMSIS-NN 软件库: CMSIS神经网络软件库,是高效的神经网络内核开发的集合,以最大限度地提高性能,并尽量减少神经网络在Cortex-M处理器内核上的内存占用。
.
(2)CMSIS-NN 软件库组成
CMSIS-NN库分为多个函数,每个函数涵盖一个特定类别:
-
Convolution Functions:卷积函数
-
Activation Functions:激活函数
-
Fully-connected Layer Functions:全连接层函数
-
SVDF Layer Functions:SVDF层函数
-
Pooling Functions:池化函数
-
Softmax Functions:Softmax函数
-
Basic math Functions:基本数学函数
CMSIS-NN库分为了两个部分:NNFunctions和NNSupportFunctions。
NNFunctions:包括实现流行神经网络层类型的函数,如卷积、深度可分离卷积、全连接(即内积)、池化和激活。
NNSupportFunctions:包括实用函数,例如数据转换和激活函数表。
.
(3)支持的处理器:
CMSIS-NN的目标是Cortex-M处理器,每个功能通常有三种不同的实现。每个都针对不同的处理器组。
没有SIMD功能的处理器(例如Cortex-M0)
带有DSP扩展的处理器(如Cortex-M4)
具有MVE扩展的处理器(例如Cortex-M55)通过特征标志选择正确的实现,用户通常不需要显式设置它。
.
(4)预处理宏定义:
ARM_MATH_DSP:
提供一个DSP(数字信号处理器)功能库,它包括了一系列与信号处理相关的数学函数和算法:
常用数学函数,如加法、乘法、平方、平方根、指数、对数等;
信号处理算法,如滤波器设计、傅里叶变换、快速傅里叶变换等。
ARM_MATH_DSP库可简化信号处理和数字计算任务的实现过程,并且可以提高计算效率和性能。在CMSIS-NN库中,可以使用ARM_MATH_DSP库来进行神经网络的计算优化。
ARM_MATH_MVEI:
提供的数学函数接口,用于实现多向量扩展整数运算。提供以下功能:
-
支持多种数据类型:包括整数、浮点数和固定点数。
-
并行运算:可以同时处理多个数据向量,提高运算速度。
-
优化硬件利用:对ARM Cortex-M系列处理器进行了优化,可更好利用硬件资源,提高运算效率。
-
提供数学函数接口:提供一系列的数学函数接口,包括加法、减法、乘法、除法等。
在CMSIS-NN库中使用ARM_MATH_MVEI接口,可以更高效地实现神经网络的计算,提高模型的推理速度和性能。
ARM_MATH_AUTOVECTORIZE
代表了自动向量化的功能。
CMSIS-NN库中的函数在运行时自动判断是否可以使用向量化的方式进行计算,从而在满足条件的情况下,提高计算性能。
使用时,需要确保硬件平台和编译器支持向量化的计算方式,并且需要进行相应的配置和优化。
ARM_MATH_BIG_ENDIAN:
支持大端字节序(Big-Endian)。即在内存中,最高位字节会被存储在最低地址,而最低位字节会被存储在最高地址。
CMSIS-NN库可利用这个属性,正确地安排数据的存储位置。这有助于确保数据的正确性和一致性,避免由于字节序问题导致的错误。
ARM_NN_TRUNCATE:
用于进行数值截断操作。它可将浮点数截断为指定精度的整数。
ARM_NN_TRUNCATE在处理浮点数运算时非常有用,可以避免浮点数运算的精度损失和溢出问题,同时保证计算结果的准确性。
.
2.特定类别函数
(1)Convolution Functions:卷积函数
卷积函数是一种数学运算,可以理解为两个函数重叠区域的加权求和,其中权重取决于重叠的程度。在图像处理中,卷积函数通常用于处理图像像素值,通过将一个点的像素值替换为其周围点的像素值的加权平均,从而改变图像的外观。
(2)Activation Functions:激活函数
激活函数是神经网络中在神经元输入和输出之间提供非线性映射的重要元素,使神经网络能够学习和执行复杂的任务。常见的激活函数包括Sigmoid函数、Tanh函数和ReLU函数。
(3)Fully-connected Layer Functions:全连接层函数
全连接层可以视为一种特殊的卷积层,对输入数据进行逐点乘积累加的操作。全连接层一般被置于深度学习模型的最后几层,用于进行最后的决策或预测。
(4)SVDF Layer Functions:SVDF层函数
SVDF Layer Functions(Sparse Vector Dense Feature)是利用稀疏编码和低秩分解来提取和存储特征。它可以将输入数据转换为低维度的稀疏向量,并保留重要特征,同时减少计算量和存储需求。SVDF层可以用于深度神经网络中,作为特征提取器和降维器,帮助改进模型的性能和效率。
(5)Pooling Functions:池化函数
池化函数常位于卷积函数的下一层,用于降低特征图的维度。具体来说,池化操作是利用一个矩阵窗口在张量上进行扫描,将每个矩阵中的元素通过取最大值或者平均值等方式来减少元素的个数。
(6)Softmax Functions:Softmax函数
可以将一组数值转换成一个概率分布。给定一个实数向量z,Softmax函数将其转换成一个概率分布σ(z),其中每个元素的范围都在(0,1)之间,并且所有元素的和为1。
(7)Basic math Functions:基本数学函数
包括乘法、加法、减法、除法等。此外,还有一些更高级的数学函数,如平方、平方根、指数、对数等。
.
3.定点量化
传统神经网络使用32位浮点数据训练,但低精度定点数据也可良好运行。因此在CMSIS-NN库中采用定点量化的方式,开发了对8位和16位数据的的低精度支持。
量化采用2次幂的定点格式,即a × 2^n,a为整数值,n为表示基数点位置的整数。
(1)定点数-Q格式
Q格式是二进制的定点数格式,指定了相应的小数位数和整数位数,Q格式表示为:
Qm.n
数据表示:m+n+1位的数据,m比特表示整数部分,n比特表示小数部分,多余的一位作符合位。
目的:在没有浮点运算的平台上,更快的处理浮点数据。
Q格式数据转换:
整数A->Qx值化:Qx = A * 2^x;
#define IQ7(A) ((int16_t)((A)*128))
小数A->Qx值化:Qx = A * 2^x;
#define FQ7(A) ((int16_t)((A)*128.0f))
Qx->A整数化:I(A) = A>>x;
#define Q7I(A) ((int16_t)((A)>>7))
Qx->A小数化:F(A) = A * ( (1/2)^x );
#define Q7F(A) ((A)*(1/2)^7)
Q格式的运算
-
定点加减法:须转换成相同的Q格式才能加减
-
定点乘法:不同Q格式的数据相乘,相当于Q值相加,即Q15数据乘以Q10数据后的结果是Q25格式的数据
-
定点除法:不同Q格式的数据相除,相当于Q值相减
-
定点左移:左移相当于Q值增加
-
定点右移:右移相当于Q减少
.
声明:资源可能存在第三方来源,若有侵权请联系删除!