盧昆鵬,潘宏俠
(中北大學(xué) 機(jī)械與動力工程學(xué)院,太原 030051)
?
移植Libsvm軟件實現(xiàn)TMS320F28335的支持向量機(jī)
盧昆鵬,潘宏俠
(中北大學(xué) 機(jī)械與動力工程學(xué)院,太原 030051)
摘要:化簡了支持向量機(jī)算法在實際應(yīng)用中的步驟,提出了利用分解和提取代碼的方法在TMS320F28335芯片中移植Libsvm軟件,并實現(xiàn)了支持向量機(jī)。該方法解決了在C2000系列DSP芯片中實現(xiàn)支持向量機(jī)的問題,同時適用于其他型號的芯片。實驗結(jié)果表明,在保證較高的預(yù)測正確率、較快的運行速度和較大的數(shù)據(jù)量讀取的前提下,Libsvm能夠正確運行于芯片中。
關(guān)鍵詞:支持向量機(jī);Libsvm;DSP;TMS320F28335;嵌入式系統(tǒng)
引言
支持向量機(jī)在小樣本、非線性及高維模式識別中表現(xiàn)出許多特有的優(yōu)勢,并能夠推廣應(yīng)用到函數(shù)擬合等其他機(jī)器學(xué)習(xí)問題中[1-4]。目前實現(xiàn)支持向量機(jī)的方法有軟件方法(如Libsvm、Liblinear、mySVM、SVMlight等[1]),也有硬件方法(如約翰霍普金斯大學(xué)開發(fā)的Kerneltron芯片[2]),但是這兩種方法都有缺點,如成本高、體積大、耗能多、通用性差等。
TI公司應(yīng)用于控制領(lǐng)域的C2000系列芯片具有低功耗、低成本、通用性強(qiáng)和可實時控制的優(yōu)點。采用其作為運行SVM的平臺,實現(xiàn)支持向量機(jī)的實時應(yīng)用,比PC系統(tǒng)體積小,其控制能力和數(shù)據(jù)處理能力可以在滿足工作需要的同時有效控制成本。但是此類芯片具有運行頻率較低、可用內(nèi)存小的缺點,如果在其中運行大型程序或讀取大量數(shù)據(jù),會受到運行資源的限制。本文針對此問題,提出了一種解決方案。
1支持向量機(jī)的算法
支持向量機(jī)(SVM)能非常成功地處理回歸問題(時間序列分析)和模式識別(分類問題、判別分析)等諸多問題,并可推廣于預(yù)測和綜合評價等領(lǐng)域。C-支持向量分類機(jī)的算法步驟為[3]:
① 給定訓(xùn)練集
T={(x1,y1),…,(xl,yl)}∈(Rn×y)l
其中,xi∈Rn,yi∈y={1,-1},i=1,2,…,l。
② 選取適當(dāng)?shù)暮撕瘮?shù)K(x,x’)及懲罰參數(shù)C>0。
③ 構(gòu)造并求解凸二次規(guī)劃問題:
其中,0≤αi≤C,i=1,…,l,
⑤ 構(gòu)造決策函數(shù)f(x)=sgn(g(x)),其中
⑥ 通過決策函數(shù)f(x)=sgn(g(x))預(yù)測數(shù)據(jù)。
2方案的設(shè)計和實現(xiàn)
2.1代碼分解和抽取
Libsvm是臺灣大學(xué)林智仁(LinChih-Jen)教授等開發(fā)設(shè)計的一個簡單、易于使用和快速有效的SVM模式識別與回歸的開源軟件包[5]。其源代碼文件有5個:svm-train.c,svm-predict.c,svm-scale.c,svm.h和svm.cpp。其中svm-train.c是訓(xùn)練樣本工具的代碼,上述6步算法中的①~⑤都是在這個代碼文件中實現(xiàn)的;svm-predict.c是預(yù)測工具的代碼,實現(xiàn)上述算法中的第⑥步;svm-scale.c是歸一化數(shù)據(jù)工具的代碼;svm.h是頭文件;svm.cpp是類的實現(xiàn)代碼。后3個軟件分別實現(xiàn)訓(xùn)練、預(yù)測和歸一化數(shù)據(jù)的功能。代碼文件svm-train.c、svm-predict.c、svm-scale.c分別與svm.h和svm.cpp編譯就可以得到這3個軟件。Libsvm代碼結(jié)構(gòu)如圖1所示。
圖1 Libsvm代碼結(jié)構(gòu)
如果在DSP平臺上實現(xiàn)以上支持向量分類機(jī)的6步算法,不僅需要進(jìn)行大量的計算,而且實現(xiàn)起來非常麻煩。事實上,在實際應(yīng)用的過程中,只需要實現(xiàn)第6步。
Libsvm的5個文件的代碼加起來總共有四千多行,而且分為3個共用類實現(xiàn)文件和頭文件的程序,把各部合為一個程序并且移植運行于DSP平臺難度較大??紤]到以上因素,同時為了節(jié)省DSP的存儲資源和運行資源,采取了以下的移植方案:
① 訓(xùn)練數(shù)據(jù)部分在PC里實現(xiàn),訓(xùn)練完成后保存訓(xùn)練模型,然后存儲在SD卡上;
② 預(yù)測部分在DSP里實現(xiàn),即把svm-predict.c、svm.h、svm.cpp編譯運行于DSP內(nèi);
③ 預(yù)測時,利用DSP芯片上的SPI模塊和SD卡進(jìn)行通信,讀取SD卡上的模型來對存儲于卡上的數(shù)據(jù)進(jìn)行預(yù)測;
④ 預(yù)測結(jié)果存儲于SD卡內(nèi)。
實現(xiàn)方案如圖2所示。
圖2 實現(xiàn)方案
預(yù)測部分代碼的主要函數(shù)包括:
read_model_header()——讀模型的參數(shù);
svm_load_model()——載入模型;
svm_predict(),svm_predict_values()——實現(xiàn)預(yù)測功能。
類文件svm.cpp中需要提取的類成員函數(shù)包括:
k_function()——核函數(shù)的選擇函數(shù);
dot()——內(nèi)積函數(shù);
svm_get_labels()——獲取標(biāo)簽函數(shù);
powi()——冪函數(shù)。
將這些函數(shù)代碼從svm-predict.c、svm.h和svm.cpp中提取出來,整合為一個程序文件。
2.2移植
代碼移植之前需要考慮的問題有:①源代碼編譯之后的程序運行于Win32控制平臺,利用命令行輸入?yún)?shù),所以設(shè)置參數(shù)、傳遞參數(shù)的方式都與DSP程序有所不同;②在DSP運行標(biāo)準(zhǔn)輸入輸出函數(shù)會占用很多系統(tǒng)資源,使系統(tǒng)運行變慢,甚至?xí)?dǎo)致程序無法運行;③從SD卡中存儲和讀取文件,需要依賴于文件系統(tǒng)。
2.2.1參數(shù)的傳遞
源代碼編譯后的程序是從命令行讀取參數(shù)的,而DSP平臺沒有命令行,因而必須改變讀取參數(shù)方式,例如可把參數(shù)設(shè)置于文本文件中,再從文本文件中讀取參數(shù),或者在得到訓(xùn)練模型文件后,直接把參數(shù)固化于程序中。程序修改包括:
① 將read_model_header()函數(shù)中的格式化讀取函數(shù)FSCANF()用獲取字符串函數(shù)f_gets()、分解字符串函數(shù)strtok()和字符串轉(zhuǎn)浮點函數(shù)strtod()來代替,或者在read_model_header()函數(shù)中直接給模型結(jié)構(gòu)體的各個參數(shù)變量賦值;
② svm-predict.c里面main函數(shù)參數(shù)改為void,增加相應(yīng)的文件讀寫函數(shù)。
2.2.2利用文件系統(tǒng)接口函數(shù)
圖3 利用FatFS接口函數(shù) 存儲和讀取文件
從SD卡讀取文件,需要移植文件系統(tǒng),本文所采用的是FatFS文件系統(tǒng)。其次,由于在DSP中使用標(biāo)準(zhǔn)I/O函數(shù)會占用很多的運行資源,導(dǎo)致程序無法正常運行,所以必須用FatFS文件系統(tǒng)的API接口函數(shù)來代替標(biāo)準(zhǔn)I/O函數(shù),如圖3所示。
最后,還需屏蔽掉類似“fprintf(stderr,"can't open model file %s ",argv[i+1]);”的錯誤信息打印的語句,因為此類語句輸出為PC屏幕終端;或者可以把錯誤信息輸出到txt文本文件上,調(diào)取文件便可閱覽信息。
2.3優(yōu)化運行環(huán)境參數(shù)和支持向量機(jī)的參數(shù)
嵌入式平臺的運行資源相對于PC來說比較少,如果需要運行大型程序或者是讀取大量數(shù)據(jù),必須要考慮可用RAM和Flash的大小以及堆棧段的大小。DSP的.stack段也稱為系統(tǒng)棧,主要作用有:保存函數(shù)調(diào)用后的返回地址;給局部變量分配存儲空間;傳遞函數(shù)參數(shù);保存臨時結(jié)果。
圖4 讀取數(shù)據(jù)到.stack段中
TMS320F28335型數(shù)字信號處理器為TI公司的TMS320C28x系列浮點DSP控制器,頻率為150 MHz,片內(nèi)RAM大小為34 KB×16,片內(nèi)Flash大小為256 KB×16。其.stack段大小默認(rèn)為0x400,需要讀取大量數(shù)據(jù)時可能出現(xiàn).stack段空間不足的情況,造成程序運行錯誤[7]。為了正確讀取數(shù)據(jù),需要修改分配RAM空間的CMD文件,分配更大的空間給.stack段。讀取數(shù)據(jù)到.stack段中的示意圖如圖4所示。
修改后的程序主要分為3部分:初始化部分、讀取模型部分和預(yù)測部分。完成以上工作,程序便可以正常運行于DSP平臺。
Libsvm軟件包提供了支持向量機(jī)的參數(shù)優(yōu)化工具grid.py。利用多重交叉驗證的方法對C-支持向量機(jī)的參數(shù)進(jìn)行優(yōu)化,可提高預(yù)測結(jié)果的正確率。在輸入訓(xùn)練集文件之后,利用grid.py對支持向量機(jī)的參數(shù)C和gamma尋優(yōu),如圖5所示。
圖5 對支持向量機(jī)的參數(shù)尋優(yōu)
3實驗驗證與比較
訓(xùn)練集在PC中訓(xùn)練后得到的模型,參數(shù)見表1。實驗數(shù)據(jù)為具有13個特征量的132組數(shù)據(jù),轉(zhuǎn)換為Libsvm可讀取的數(shù)據(jù)類型之后,保存為data.txt文件,并存入SD卡中。利用CCS3.3軟件進(jìn)行在線仿真時,程序運行時間在5 s之內(nèi)。實驗結(jié)果如表2所列。
表1 模型參數(shù)
表2 預(yù)測結(jié)果(默認(rèn)參數(shù) 序號∶標(biāo)簽)
實驗結(jié)果表明,程序運行結(jié)果與原軟件包在PC平臺中的運行結(jié)果一致。訓(xùn)練集支持向量的數(shù)量(nr)越多,預(yù)測正確率越高;但是由于受硬件的運行資源限制,支持向量不能過多。若采用優(yōu)化過的參數(shù)和核函數(shù),預(yù)測正確率更高(見表3)。程序燒錄到芯片中運行,結(jié)果與在線仿真時一致。
表3 優(yōu)化前后的預(yù)測正確率比較
結(jié)語
經(jīng)實驗驗證,在具備較高的預(yù)測正確率、較快的運行速度和較大的數(shù)據(jù)量讀取的同時,Libsvm能夠正確運行于芯片中。DSP的低功耗、便攜性、較高的運算速度優(yōu)勢和支持向量機(jī)的算法優(yōu)越性相結(jié)合, 促進(jìn)了結(jié)合DSP的支持向量機(jī)模式識別技術(shù)在實踐中的廣泛應(yīng)用[8]。本文的方案對于支持向量機(jī)在生物識別、文本分類等領(lǐng)域的具體應(yīng)用和實現(xiàn)同樣具有借鑒意義。
參考文獻(xiàn)
[1] 鄧乃揚(yáng),田英杰.數(shù)據(jù)挖掘中的新方法—支持向量機(jī)[M].北京:科學(xué)出版社,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
文獻(xiàn)標(biāo)識碼:A