spams----稀疏建模工具箱在MATLAB下的安裝編譯

SPAMS 是一個爲解決各種稀疏估計問題的開源優化工具箱,http://spamsdevel.gforge.inria.fr/index.html ,簡單介紹下功能:字典學習與矩陣分解,解決稀疏分解,解決結構化稀疏分解問題。

由於這個工具箱給出的是c++代碼,所以需要編譯才能最終使用。也正因爲如此,這個工具箱實現的算法在執行時是很快的,而且可以移植到各種平臺使用。這個工具箱網上很多人有提到,都說編譯時出現問題,我的電腦也不例外,下面稍微總結一下它的安裝及使用情況。

我的電腦環境:win7 64位,matlab2012b,VS2013

對於安裝,下載安裝包,解壓到一個文件夾,如下圖,解壓後有不少文件、文件夾,其中的doc_spams.pdf是一個詳盡的使用說明,介紹了各個函數接口如何使用(每個函數都有一個測試文件供測試,在test_release文件夾中)。在HOW_TO_INSTALL.txt中有簡單說明,囉嗦了半天就是說使用compile.m進行文件編譯,對於不同的計算機,配置都在這個文件中調整,所以使用matlab打開compile.m文件前130行是用來做配置的,作者也很貼心啊,第131、132行有如下提示,意思就是130行以後,不懂不要亂動。

第一步:導入matlab—set path 
執行命令:mex -setup 

第二步:修改compile.m

以下是截圖,大家對應自己的來。


保存compile.m文件。

按上面的過程配置好後,運行compile.m,執行編譯。編譯過程順利完成,那恭喜你有一臺好電腦;如果出錯,也恭喜你,和我的情況一樣。我的出錯提示是說mexStochasticProx.cpp文件編譯時失敗,然後是給出失敗的各種錯誤用法。對此網上找了半天沒找到好的解決辦法,所以折中的辦法就是不編譯這些不知道哪裏出問題的文件,其實這些文件也不常用(因爲對我而言,根本不知道這個函數是幹啥的)。個人感覺這個工具箱好的地方也在此,一個文件對應一個函數接口,一個文件不編譯,對其他函數接口無影響(貌似是這樣)。如何不編譯呢?就是在compile.m中找到相應行註釋掉,如我的電腦上mexStochasticProx.cpp編譯失敗,那就把它註釋掉。另外還出錯了這三個,也註釋掉。

%     '-I./linalg/ -I./prox/ prox/mex/mexGroupStructOfString.cpp',

%     '-I./linalg/ -I./prox/ prox/mex/mexReadGroupStruct.cpp',

%    '-I./linalg/ -I./prox/ prox/mex/mexSimpleGroupTree.cpp',

編譯完沒再出錯,就可以使用了。 另外,真正使用時,調用工具箱函數可能會報錯,說函數無法執行之類,這是因爲,compile.m文件的最後把src_release文件夾中各函數接口的幫助文件(與函數同名,裏面全是註釋,作爲幫助信息)也拷貝到了build文件夾中,由於.m文件和.mexw32同名,matlab可能去執行.m文件去了(一般是優先執行.mexw32文件的,可能跟matlab版本有關,執行優先級不同)。所以報錯就可以把build文件夾中與.mexw32同名的.m文件直接刪掉,沒報則不用管。

測試

% test_TrainDL_GJ.m:測試mexTrainDL函數
clc
clear
close all
I=double(imread('./data/lena.png'))/255;
I = imresize(I, 0.25); % 圖片太大,運行時間過長,所以縮放一下
X=im2col(I,[8 8],'sliding'); % extract 8 x 8 patches
X=X-repmat(mean(X),[size(X,1) 1]); % 減均值
X=X ./ repmat(sqrt(sum(X.^2)),[size(X,1) 1]); % 標準化
param.K=256;  % learns a dictionary with 100 elements
param.lambda=0.15;
param.numThreads=-1; % number of threads
param.batchsize=400;
param.verbose=false;
param.iter=100;  % 迭代次數,原始是1000,效果好但時間過長,這裏減爲100
tic
D = mexTrainDL(X,param);
t=toc;
fprintf('time of computation for Dictionary Learning: %f\n',t);
fprintf('Evaluating cost function...\n');
alpha=mexLasso(X,D,param);
R=mean(0.5*sum((X-D*alpha).^2)+param.lambda*sum(abs(alpha)));
ImD=displayPatches(D);
imagesc(ImD);
colormap('gray');
fprintf('objective function: %f\n',R);
此測試又是對lena做處理,實現字典學習,結果如下





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章