开源机器学习C++库Shark的编译与开发环境搭建

来源:互联网 发布:阿里云centos搭建php 编辑:程序博客网 时间:2024/04/30 06:05

        Shark是一个快速、模块化、功能丰富的开源C++机器学习库,提供了各种机器学习相关技术,比如线性/非线性优化、基于内核学习算法、神经网络等。

Shark:强大的开源C++机器学习库(转) - wuli2496 - 游侠

 

        机器学习(MachineLearning)是一门多领域交叉学科,专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。它是人工智能的核心,是使计算机具有智能的根本途径,其应用遍及人工智能的各个领域。 

    详细介绍请见http://image.diku.dk/shark/sphinx_pages/build/html/index.html

 

   说明:

  • shark2.3.4版本是可以从sourceForge直接下载得到的,有编译好的Windows安装包和源代码,但是现在shark的官方网站已经使用了shark3.0的版本,这个版本中做了很多改变,包括源代码的目录结构,因此如果你用的是2.3.4的版本,而又参照现有的官网上的教程来操作的话,你会出现无法打开头文件的错误,当然,你改变一下路径某些情况下是可以的,但是3.0增加了一些头文件,比如官网第一个教程的Csv.h这个文件,2.3.4的版本是没有的。
  • 另外,2.3.4版本没有用到boost库,所以如果你用那个版本可以不用担心boost库的问题。但是在Windows系统下开发2.3.4有个问题,2.3.4版本的Array在初始化的时候是设定的默认值为0,但是在Windows下创建一个Array对象,它的默认值并不会等于零,这就会造成某些莫名其妙的逻辑错误。

     所以,奉劝各位还是用3.0版本的吧。本文也只关注3.0版本的编译与开发环境搭建。

 

    首先,用svn或者Git,在  https://svn.code.sf.net/p/shark-project/code/trunk/Shark 这个路径下获取最新的源代码包。(注意:如果是Git,需要用git svn clone命令。)由于3.0的版本是基于boost库的,那么在编译之前自然要装上boost库,这个安装方法很多地方都有,我就不啰嗦了。需要注意的是,如果没有安装在默认的路径,而是自行配置的别的boost路径,后面需要多设置一个sharkCMake参数,不然编译会出错,提示找不到boost库。

 

    好,假设你已经正确安装上了boost库,现在我们来编译shark。如果你的boost库是在自定义的路径,那么用记事本打开shark源代码包的CMakeList.txt文件。

计算机生成了可选文字: 刻录新建文件夹名称如。ontrib如debian如doc如examples如;nclude如outPUt如,rc如Test口·9itignore口。m。ke_un;n,tall.cma卜e.;n匾CMakeL'",·城口cop竹NG口cop竹NG.L〔55〔R口makea,勿le圈R〔AoM〔.txt口sharkCon6g.cmake.in口sharkcon6gversion.cma眨e.in修改日期类型大小2014/8/2014:02文件夹2014/8/2014:02文件夹2014/8/2014:02文件夹2014/8/2014:02文件夹2014/8/2014:02文件夹2014/8/2017:37文件夹2014/8/2014:02文件夹2014/8/2014:02文件夹2014/8/2013:50GmGNORE文件8KB2014/8/2013:50IN文件2KB201刁5/2014:24Notepad++Doc…19KB{2014/8/2013:50文件35KB2014/8/2013:50LESSER文件8KB2014/8/2013:50文件1KB2014/8/2013:50Notepad++Doc…9KB2014/8/2013:50IN文件1KB2014/8/2013:50IN文件1KB

找到Boost库的配置相关代码。

计算机生成了可选文字: #######莽#########################希################莽###################B00s七configura七ion#################################奔#######希###########################sET(soostusEMULT工TH咫ADEDoN)月DDDEFINITIONS(一DBOOSTPARAHETERHAXARITY=15一DBOOSTFILESYSTEMVERSION=3)F工M七PACKAGE(B。。s七1.48.0COMPONENTSsys七emda七e_七imefilesystemproqram‘。p七ionSsignalsSerializa七ioninClude一direCtories(${BOOSt_INCLUDE_DIR})#cl:ChanqedBOOSt_INcLUDE_DIRStoBOOSt_INcLUDE_DIRIF(WIN32)linkdirectories(${BoostLIBRARYDIR})ELSE(WIN32)Fl加一LIBRARY(pTHREAD--LIBRARYpthread)SET(LINKLIBRARIES${BoostLIBRAR工ES)S{PTHREADL工BRARY)七hreaduni七七es七frameworkREQU工REDhope七ha七七his15alwaysworks曰丁―---.)ENDIF(markasWIN32)advanced(BOOStDIRpTHREADL工BRARYl---L

增加两句代码,后面的路径分别是boost库的includelib的相应安装路径。保存后关闭文件,这样后面就不会出错了。

计算机生成了可选文字: SET(BoostUSEMULTITHREADEDON)ET(cMAKE_1NcLUDE_pATHS{cMAKE_INcLUDE_pATH}"D,/3rd--Party/bOO5tET(cHAKEL工sRARYPATH${cHAKEL工BRARYpATH}"D:/3rdParty/boost1551550/include")0/lib")l八DDDEFINITIONS一DBOOSTPARAMETERHAXA只ITY=15一DBOOSTFILESYSTEHVERSION=3

现在,打开CMake,填写相应的参数如下,第一个是shark的源代码包路径,第二个是CMake生成的工程路径。

计算机生成了可选文字: ^CMake3.0.1一E:lgourceCodFileToolsoption,HelpWherei:the:ourcecode:E:/SourceCode/SharkWheretobuildthebinarie,:E:/SourceCode/Shar对outFutSearch:一」GrouPed}Advan己ed医。dd:nt创瘫蜘·〕v。丽寿叶ValueFres:Config犷eto即date权ddi:pl好rlewvalues1nred,thenpressGenerateto名enerateselectedbuildfiles{;。nf',·】{。一,·…Curr一,G一,。·NOn·

设置好路径点击Configure,弹出如下所示提示框,选择正确的IDE版本。

计算机生成了可选文字: 香{.诬、.。Specifyt五e'eneratorforthisprojectIV',u"Stud、o,020:o‘修U,edefa公tnativecompiler写巴specifynativ。。。mpiier:0sp。。ifyt。。1。haiofiiefor。r。,,一。。。piiin'0specifyoption,forcr。,s一。。。pili。‘勺r

应该不会有错误的,然后点击Generate,就会在刚刚设置的路径下生成sharkVS工程文件了。

 

打开这个shark.sln文件,在VS里面加载进入工程之后,直接全部生成,就OK了。

计算机生成了可选文字: ‘芬pACKAGE·vcxproj.user加RuN一ESTS.vcxproj加RUN一Es丁s.vcxproj.6lter,SharkCon右g.cmakeSharkCon石gVersion.cmakeSharkTargets.cmakeuninstall.vcxprojunin,tall.vcxproj.石Iters2014/8/2014:262014/8/2014:252014/8/2014:252014/8/2014:262014/8/2014:252014/8/2015:礴42014/8/2014:242014/8/2014:032014/8/2014:252014/8/2014:252014/8/2014:25Visual{VC++lVC++lVisual{M;crosXML文CMAKECMAKECMAKEVC++lVC++l}口口口刀子---―引到―--―一!-

 

这时,你把shark源代码包根目录下的include文件夹拷贝出去,再把编译生成的lib文件shark_debug.lib拷贝出去,就可以作为开发库了。

计算机生成了可选文字: ,!}~、‘旨凹工具田包含到库中帮助但),共享,亥」录新建文件夹名称人人人习OUnDnD汽On口no汽Dno汽OKKKKKKKKK8丹乙OJ亡JS'10砂J上j工‘工泛〕卜困一口口目]口口圃口口contribdebiandoc糕黔一一上SFCTest·9itignorecmakeuninstall.cmake.inCMakeLists·tXtCOpYINGCOpyING.LESSERmakeastyleREADME.txtS卜arkCon6g.cmake.inSharkCon石gversion.cmake.in修改日期类型大小2014/8/2014:02文件夹2014/8/2014:02文件夹2014/8/2014:02文件夹2014/8/2014:02文件夹2014/8/2014:02文件夹2014/8/2017:37文件夹2014/8/2014:02文件夹2014/8/2014:02文件夹2014/8/2013:50GmGNORE文件2014/8/2013:50IN文件2014/8/2014:24NotePad++Doc…2014/812013:50文件2014/8/2013:50LESSER文件2014/8/2013:50文件2014/8/2013:50Notepad++Doc…2014/8/2013:50IN文件2014/8/2013:50IN文件

 

计算机生成了可选文字: 名称鉴s卜。rk--deb。g.lib修改日期2014/812015:55

 

或者你在VS理单独编译一个叫INSTALL的项目,就会在刚才CMake配置的路径下生成一个shark的开发包文件,当然这个路径是可以自己修改的。多了几个文件夹,不过也就用到includelib做开发。

计算机生成了可选文字: 飞~.,.护气口飞L飞州尹飞矛飞.‘护悦卜刁J.,.压.、JIJ'.、“‘户弓JLM,U','J以I丫,U,'J占,仙VU,'1JIVVU呀口甘以IVVU.,JUOCMAKEINSTALLpRERXOpTCOMpILEDOCUMEN刀订IONC:/programFIleS/shark

 

计算机生成了可选文字: 名称修改日期继型大小}}一}l}}山山.bln.CMakel一eXamp'e,include1ib2014/8/2016:242014/8/2016:24201418/2016:242014/8/2016:242014/8/2016:24

 

好,开发包有了,我们还是来示例一个程序吧,看能否顺利运行。

新建项目,并添加一个新的cpp文件。在项目属性里,填写附加包含目录。分别是boost库的头文件目录和shark的头文件目录。

计算机生成了可选文字: m刃e女属性贝月....曰口尸........配置(C):}活动(oebug)一平台(P):l活动阴in32)日1.。器(o):卜通用属性。配置属性常规调试附加包含目录D:\3rd_Party\boo"t_1_55_O\include\boost一1一55:D:\3rd一Pa肉-一一了盲石蔺曰飞娜口脚刁―卜清单工具卜XML文档生成器卜义览信息卜生成事牛卜自定义生成步骤卜代码分析黔撬恨J调试信息格式公共语言运行时支持盯肖显于启动版权标志警告等级将警告视为错误多处理器编译为亏F编程序歹1轰伸用Unicode回从父级或项目默认设置生迷承任.…宏。》·}…“」;,肖】

链接器中同样加入boostsharklib路径。

计算机生成了可选文字: VC++目录卜C/C++只久日目皿匕尹J习下门州J川又1万.1公、记丁忽略导入库沌册输出又住以l、口L口。口)D:\,rd_Pa勺协hark\lib:D:\3rd_P"rty\boost_1_55_o\lib:q〕(Ad是否清单文件调试系统优化嵌入的IDL高级命令行卜清单工具卜XML文档生成器卜浏览信息卜生成事牛卜自定义生成步骤卜代码分析链接库依蔽项使用库依赖项输入链接状态阴止Dll绑定将链接器警告视为畏勃吴强制文件输出创建可热修补映像指定节特性附加库目录D:\3rd_paD:\3rd_party\向Xs卜ark\libboost--1_SSeso\lib111继承的值:附加库目录允许用户重写歹境库路径伊UBpA丁H:fold匕l宏‘》·}一.]l,'}而受,自r,i…一

在链接器的输入选项中,输入sharklib文件名称。

计算机生成了可选文字: ,(c〕:…活动(Debug)平台(P):…活动阴‘n32,,1一””器(o)通用属性shark--debug.lib:%(AdditionalDependencies)常规调试VC++目录C/C++‘链接器忽略特定默认库模块定义文件将模块添加到程序嵌入托管资源文件强制符号引用延迈功口裁的OLL程序集链接资源s卜ark-debug.lib继承的值:kerne}32.libuser32.llbgdi32.libwin,pool.libcomdlg32.lib之勺11切贬六告〔日l二亩.1,、自曰-州白甲翻胃CJ日L已、i之尸飞“.资少尸尹.才.、1

OK,现在从shark的源代码包中,找到示例的数据,如下图所示的路径和所需文件。

计算机生成了可选文字: IRSA(E:)SourceCode卜Shark*examples*Supervised*data甲同.{些少竺-乙工具田,共享,帮助坦〕刻录新建文件夹声名称口〕B口目no口曰KKKKK448jll人亡J2jlC.CSVd;日betes.csvquickstartData.csv四围臀类型大小013:50Microso几Excel二,013:50MicrosoRExce}…013:50MicrosoftExce!…013:50Microso代Excel…013:SOM;crosoftExce!…

    我们这个例子是官网的第二个线性回归分析的例子,(为什么不用第一个呢?Hello World的例子需要运行程序时传入命令行参数,好吧,又有很多朋友要头疼了,Windows下怎么带参数运行程序??所以……我们直接用第二个例子吧!),现在把下面的代码复制到你新建的那个cpp文件中,更改掉loadData函数的参数为相应的文件路径,并运行程序。

#include <shark/Data/Csv.h>#include <shark/Algorithms/GradientDescent/CG.h>#include <shark/ObjectiveFunctions/ErrorFunction.h>#include <shark/ObjectiveFunctions/Loss/SquaredLoss.h>#include <shark/Models/LinearModel.h>#include <string>using namespace std;using namespace shark;RegressionDataset loadData( const string& dataFile, const string& labelFile ){    Data<RealVector> inputs;    Data<RealVector> label;    try    {        importCSV( inputs, dataFile, ' ' );        importCSV( label, labelFile, ' ' );    }    catch ( ... )    {        cerr << "Unable to open file " <<  dataFile << " and/or " << labelFile << ". Check paths!" << endl;        exit( EXIT_FAILURE );    }    RegressionDataset data( inputs, label );    return data;}void main(){//一定要更改这行代码中的两个文件路径,否则这里会出错!    RegressionDataset data = loadData( "E:\\SourceCode\\Shark\\examples\\Supervised\\data\\regressionInputs.csv", "E:\\SourceCode\\Shark\\examples\\Supervised\\data\\regressionLabels.csv" );    RegressionDataset test = splitAtElement( data, static_cast<std::size_t>( 0.8 * data.numberOfElements() ) );        LinearModel<> model( inputDimension( data ), labelDimension( data ) );        SquaredLoss<> loss;    ErrorFunction<RealVector, RealVector> errorFunction( data, &model, &loss );        CG optimazer;    optimazer.init( errorFunction );    for ( int i = 0; i < 100; i++ )    {        optimazer.step( errorFunction );    }        double trainingError = optimazer.solution().value;        model.setParameterVector( optimazer.solution().point );    Data<RealVector> prediction = model( test.inputs() );    double testError = loss.eval( test.labels(), prediction );        cout << "RESULTS: " << endl;    cout << "======== \n" << endl;    cout << "training error " << trainingError << endl;    cout << "test error: " << testError << endl;        getchar();}


               运行程序后,如果正确的话,会得到如下的结果。


计算机生成了可选文字: 乙E:劝aco砂礴斌乳贝盯est\Debug\myTest·ex,-口口一.二习―-―〕一二~FSULTSainingerroro。日525,39sterror:日。151367

     这样就说明你的开发库没有问题了。后面就可以跟着官方上面的例子一步一步的学习这个强大的机器学习库了!

1 0
原创粉丝点击