卢昆鹏,潘宏侠
(中北大学 机械与动力工程学院,太原 030051)
移植Libsvm软件实现TMS320F28335的支持向量机
卢昆鹏,潘宏侠
(中北大学 机械与动力工程学院,太原 030051)
摘要:化简了支持向量机算法在实际应用中的步骤,提出了利用分解和提取代码的方法在TMS320F28335芯片中移植Libsvm软件,并实现了支持向量机。该方法解决了在C2000系列DSP芯片中实现支持向量机的问题,同时适用于其他型号的芯片。实验结果表明,在保证较高的预测正确率、较快的运行速度和较大的数据量读取的前提下,Libsvm能够正确运行于芯片中。
关键词:支持向量机;Libsvm;DSP;TMS320F28335;嵌入式系统
引言
支持向量机在小样本、非线性及高维模式识别中表现出许多特有的优势,并能够推广应用到函数拟合等其他机器学习问题中[1-4]。目前实现支持向量机的方法有软件方法(如Libsvm、Liblinear、mySVM、SVMlight等[1]),也有硬件方法(如约翰霍普金斯大学开发的Kerneltron芯片[2]),但是这两种方法都有缺点,如成本高、体积大、耗能多、通用性差等。
TI公司应用于控制领域的C2000系列芯片具有低功耗、低成本、通用性强和可实时控制的优点。采用其作为运行SVM的平台,实现支持向量机的实时应用,比PC系统体积小,其控制能力和数据处理能力可以在满足工作需要的同时有效控制成本。但是此类芯片具有运行频率较低、可用内存小的缺点,如果在其中运行大型程序或读取大量数据,会受到运行资源的限制。本文针对此问题,提出了一种解决方案。
1支持向量机的算法
支持向量机(SVM)能非常成功地处理回归问题(时间序列分析)和模式识别(分类问题、判别分析)等诸多问题,并可推广于预测和综合评价等领域。C-支持向量分类机的算法步骤为[3]:
① 给定训练集
T={(x1,y1),…,(xl,yl)}∈(Rn×y)l
其中,xi∈Rn,yi∈y={1,-1},i=1,2,…,l。
② 选取适当的核函数K(x,x’)及惩罚参数C>0。
③ 构造并求解凸二次规划问题:
其中,0≤αi≤C,i=1,…,l,
⑤ 构造决策函数f(x)=sgn(g(x)),其中
⑥ 通过决策函数f(x)=sgn(g(x))预测数据。
2方案的设计和实现
2.1代码分解和抽取
Libsvm是台湾大学林智仁(LinChih-Jen)教授等开发设计的一个简单、易于使用和快速有效的SVM模式识别与回归的开源软件包[5]。其源代码文件有5个:svm-train.c,svm-predict.c,svm-scale.c,svm.h和svm.cpp。其中svm-train.c是训练样本工具的代码,上述6步算法中的①~⑤都是在这个代码文件中实现的;svm-predict.c是预测工具的代码,实现上述算法中的第⑥步;svm-scale.c是归一化数据工具的代码;svm.h是头文件;svm.cpp是类的实现代码。后3个软件分别实现训练、预测和归一化数据的功能。代码文件svm-train.c、svm-predict.c、svm-scale.c分别与svm.h和svm.cpp编译就可以得到这3个软件。Libsvm代码结构如图1所示。
图1 Libsvm代码结构
如果在DSP平台上实现以上支持向量分类机的6步算法,不仅需要进行大量的计算,而且实现起来非常麻烦。事实上,在实际应用的过程中,只需要实现第6步。
Libsvm的5个文件的代码加起来总共有四千多行,而且分为3个共用类实现文件和头文件的程序,把各部合为一个程序并且移植运行于DSP平台难度较大。考虑到以上因素,同时为了节省DSP的存储资源和运行资源,采取了以下的移植方案:
① 训练数据部分在PC里实现,训练完成后保存训练模型,然后存储在SD卡上;
② 预测部分在DSP里实现,即把svm-predict.c、svm.h、svm.cpp编译运行于DSP内;
③ 预测时,利用DSP芯片上的SPI模块和SD卡进行通信,读取SD卡上的模型来对存储于卡上的数据进行预测;
④ 预测结果存储于SD卡内。
实现方案如图2所示。
图2 实现方案
预测部分代码的主要函数包括:
read_model_header()——读模型的参数;
svm_load_model()——载入模型;
svm_predict(),svm_predict_values()——实现预测功能。
类文件svm.cpp中需要提取的类成员函数包括:
k_function()——核函数的选择函数;
dot()——内积函数;
svm_get_labels()——获取标签函数;
powi()——幂函数。
将这些函数代码从svm-predict.c、svm.h和svm.cpp中提取出来,整合为一个程序文件。
2.2移植
代码移植之前需要考虑的问题有:①源代码编译之后的程序运行于Win32控制平台,利用命令行输入参数,所以设置参数、传递参数的方式都与DSP程序有所不同;②在DSP运行标准输入输出函数会占用很多系统资源,使系统运行变慢,甚至会导致程序无法运行;③从SD卡中存储和读取文件,需要依赖于文件系统。
2.2.1参数的传递
源代码编译后的程序是从命令行读取参数的,而DSP平台没有命令行,因而必须改变读取参数方式,例如可把参数设置于文本文件中,再从文本文件中读取参数,或者在得到训练模型文件后,直接把参数固化于程序中。程序修改包括:
① 将read_model_header()函数中的格式化读取函数FSCANF()用获取字符串函数f_gets()、分解字符串函数strtok()和字符串转浮点函数strtod()来代替,或者在read_model_header()函数中直接给模型结构体的各个参数变量赋值;
② svm-predict.c里面main函数参数改为void,增加相应的文件读写函数。
2.2.2利用文件系统接口函数
图3 利用FatFS接口函数 存储和读取文件
从SD卡读取文件,需要移植文件系统,本文所采用的是FatFS文件系统。其次,由于在DSP中使用标准I/O函数会占用很多的运行资源,导致程序无法正常运行,所以必须用FatFS文件系统的API接口函数来代替标准I/O函数,如图3所示。
最后,还需屏蔽掉类似“fprintf(stderr,"can't open model file %s ",argv[i+1]);”的错误信息打印的语句,因为此类语句输出为PC屏幕终端;或者可以把错误信息输出到txt文本文件上,调取文件便可阅览信息。
2.3优化运行环境参数和支持向量机的参数
嵌入式平台的运行资源相对于PC来说比较少,如果需要运行大型程序或者是读取大量数据,必须要考虑可用RAM和Flash的大小以及堆栈段的大小。DSP的.stack段也称为系统栈,主要作用有:保存函数调用后的返回地址;给局部变量分配存储空间;传递函数参数;保存临时结果。
图4 读取数据到.stack段中
TMS320F28335型数字信号处理器为TI公司的TMS320C28x系列浮点DSP控制器,频率为150 MHz,片内RAM大小为34 KB×16,片内Flash大小为256 KB×16。其.stack段大小默认为0x400,需要读取大量数据时可能出现.stack段空间不足的情况,造成程序运行错误[7]。为了正确读取数据,需要修改分配RAM空间的CMD文件,分配更大的空间给.stack段。读取数据到.stack段中的示意图如图4所示。
修改后的程序主要分为3部分:初始化部分、读取模型部分和预测部分。完成以上工作,程序便可以正常运行于DSP平台。
Libsvm软件包提供了支持向量机的参数优化工具grid.py。利用多重交叉验证的方法对C-支持向量机的参数进行优化,可提高预测结果的正确率。在输入训练集文件之后,利用grid.py对支持向量机的参数C和gamma寻优,如图5所示。
图5 对支持向量机的参数寻优
3实验验证与比较
训练集在PC中训练后得到的模型,参数见表1。实验数据为具有13个特征量的132组数据,转换为Libsvm可读取的数据类型之后,保存为data.txt文件,并存入SD卡中。利用CCS3.3软件进行在线仿真时,程序运行时间在5 s之内。实验结果如表2所列。
表1 模型参数
表2 预测结果(默认参数 序号∶标签)
实验结果表明,程序运行结果与原软件包在PC平台中的运行结果一致。训练集支持向量的数量(nr)越多,预测正确率越高;但是由于受硬件的运行资源限制,支持向量不能过多。若采用优化过的参数和核函数,预测正确率更高(见表3)。程序烧录到芯片中运行,结果与在线仿真时一致。
表3 优化前后的预测正确率比较
结语
经实验验证,在具备较高的预测正确率、较快的运行速度和较大的数据量读取的同时,Libsvm能够正确运行于芯片中。DSP的低功耗、便携性、较高的运算速度优势和支持向量机的算法优越性相结合, 促进了结合DSP的支持向量机模式识别技术在实践中的广泛应用[8]。本文的方案对于支持向量机在生物识别、文本分类等领域的具体应用和实现同样具有借鉴意义。
参考文献
[1] 邓乃扬,田英杰.数据挖掘中的新方法—支持向量机[M].北京:科学出版社,2004.
Realization of TMS320F28335 Support Vector Machine Through Porting Libsvm
Lu Kunpeng,Pan Hongxia
(School of Mechanical and Power Engineering,North University of China,Taiyuan 030051,China)
Abstract:The steps in the practical application of support vector machine algorithm are simplified.The method of decomposing and extracting code in TMS320F28335 chip is proposed to realize support vector machine.The method solves the realization problem of support vector machine in C2000 series DSP chip,and it is suitable for other types of chip.The experiment results show that Libsvm can run on the chip properly under the premise of high prediction accuracy,fast running speed and large amount of data reading.
Key words:support vector machine;Libsvm;DSP;TMS320F28335;embedded system
中图分类号:TP391.43
文献标识码:A