標籤:機器學習 shark boost
Shark是一個快速、模組化、功能豐富且開源的C++機器學習庫。它實現了線性和非線性最佳化、基於核函數的學習演算法、神經網路等多種機器學習演算法。Shark依賴於CMake和Boost,與Windows、Solaris、MacOS X和Linux相容。當前最新的官方版本為Shark 3.0,可以從該項目的SVN上擷取源碼(點擊開啟連結)
本文描述了Windows 7(64位)上基於Visual Studio 2008編譯Shark 3.0源碼並安裝的完整過程,同時對安裝過程中產生的問題進行說明。該過程依賴於CMake 3.2.1(點擊開啟連結)和Boost 1.57.0(點擊開啟連結)。
首先利用Visual Studio 2008中編譯安裝Boost。開啟Visual Studio Tools目錄下的Visual Studio 2008 Command Prompt,進入Boost所在目錄(這裡為D:\code\boost_1_57_0),輸入以下命令:
bootstrap --prefix="C:\Program Files\boost_1_57_0"
運行結果如所示:
booststrap會在目前的目錄中產生b2.exe和bjam.exe,如所示。b2是整個Boost.Build構建系統的引擎,在Boost的早期版本中,該功能由bjam實現;從Boost 1.47.0開始,官方將bjam改名為b2,考慮到相容問題,仍然保留了bjam。
在目前的目錄中執行以下命令:
b2 --build-type=complete --toolset=msvc-9.0 --layout=versioned --prefix="C:\Program Files\boost_1_57_0" --without-mpi install
其中,參數“--build-type=complete”使得Boost.Build建立庫所支援的所有版本;“--toolset=msvc-9.0”表示用於編譯Boost的工具集是msvc 9.0工具集,該工具集對應於Visual Studio 2008。“--layout=versioned”表示Boost.Build產生的庫檔案名稱應當包含Boost版本號碼,編譯器名稱及版本號碼,以及一些其他的構建屬性;“--prefix=C:\Program Files\boost_1_57_0”指定了Boost標頭檔及產生庫的存放目錄;“--without-mpi”要求Boost.Build不構建MPI庫(Message Passing Interface,一種用於在高效能並行計算中進行訊息傳遞的庫。在某些版本的Boost中,產生MPI庫可能會出現“dumplicate name”錯誤)。上述過程完成後(大約30分鐘,具體時間因機器而異),將在指定目錄(此處為C:\Program Files\boost_1_57_0)中產生include和lib兩個目錄,至此完成boost的編譯和構建,接下來的過程為Shark的編譯和構建。
然後開啟CMake,將源碼目錄和構建目錄均設為Shark根目錄(此處為D:\code\Shark),如所示:
點擊“Add Entry”為CMake設定緩衝條目(也可以用命令列方式進行,具體可參考CMake官方文檔)。首先添加BOOL型參數Boost_NO_SYSTEM_PATHS,如所示(注意勾選Value複選框,表示將此BOOL值設定為真):
然後添加Path型參數BOOST_ROOT,該參數用於指定Boost庫所在目錄(此處為C:\Program Files\boost_1_57_0),如所示:
完成參數設定後,點擊“Configure”按鈕,選擇構造器“Visual Studio 9 2008”,如所示:
完成上述配置後,Configure過程開始,該過程產生一系列configure檔案。運行成功後再點擊“Generate”按鈕,產生相應的Visual Studio工程檔案(.vcproj)和解決方案檔案(.sln)。
執行Generate後,在Shark根目錄下產生shark.sln檔案,用Visual Studio 2008開啟可以看到所有的240個工程,如所示:
修改include/shark/Algorithms/Trainers/RFTrainer.h檔案,添加如下代碼:
#include <set>
分別在debug和release模式下構建整個shark解決方案,忽略所有警告,即可得到相應的庫檔案。
在編譯安裝Shark的過程中可能遇到的一些錯誤:
1. 用CMake進行Configure的過程中,出現如下錯誤資訊:
CMake Error at C:/Program Files (x86)/CMake/share/cmake-3.2/Modules/FindBoost.cmake:1182 (message): Unable to find the requested Boost libraries. Boost version: 1.57.0 Boost include path: C:/Program Files/boost_1_57_0/include/boost-1_57 Could not find the following static Boost libraries: boost_system boost_date_time boost_filesystem boost_program_options boost_serialization boost_thread boost_unit_test_framework No Boost libraries were found. You may need to set BOOST_LIBRARYDIR to the directory containing Boost libraries or BOOST_ROOT to the location of Boost.Call Stack (most recent call first): CMakeLists.txt:168 (FIND_PACKAGE)
可能原因:BOOST_ROOT設定錯誤,導致CMake無法找到Boost安裝目錄;執行b2時,工具集未選擇或選擇錯誤,導致產生的Boost庫檔案名稱未包含或錯誤地包含了編譯器名稱和版本資訊。
2. 編譯連結shark.sln過程中,出現如下編譯錯誤:
Shark\include\shark/Algorithms/Trainers/RFTrainer.h(168) : error C2976: 'std::set' : too few template arguments
可能原因:RFTrainer.h檔案未包含set標頭檔。
3. 編譯連結shark.sln過程中,出現如下(或類似)連結錯誤:
LINK : fatal error LNK1104: cannot open file 'libboost_serialization-vc90-mt-gd-1_57.lib'
可能原因:BOOST_ROOT設定錯誤,導致CMake無法找到Boost安裝目錄;執行b2時,layout參數未設定為versioned,導致產生的Boost庫檔案名稱未包含編譯器名稱和版本資訊。
4. 部分工程出現如下(或類似)編譯錯誤:
Shark\include\shark/Models/Kernels/MultiTaskKernel.h(100) : error C2529: 'abstract declarator' : reference to reference is illegal
可能原因:引用之引用非法。Shark 3.0中大量使用C++模板技術,時常出現雙重引用的情況。可能的解決方案是利用Boost提供的Call Trait機制,將模板類中某些成員函數的參數替換為call_traits中的等價運算式,或更換至更新版本的編譯器。
Visual Studio 2008編譯機器學習演算法庫Shark