Browse Source

added multicore training

Christoph Kaeding 9 years ago
parent
commit
0e156724a2
1 changed files with 82 additions and 0 deletions
  1. 82 0
      liblinear_train_multicore.m

+ 82 - 0
liblinear_train_multicore.m

@@ -0,0 +1,82 @@
+function svmmodel = liblinear_train_multicore ( labels, feat, settings )
+%
+% BRIEF
+%   A simple wrapper to provide training of 1-vs-all-classification for LIBLINEAR. No
+%   further settings are adjustable currently.
+% 
+% INPUT
+%  labels   -- multi-class labels (#sample x 1)
+%  feat     -- features for training images (#samples x # dimensions)
+%  settings -- struct for configuring the svm model training, e.g., via
+%              'b_verbose', 'f_svm_C', ...
+% 
+% OUTPUT:
+%  svmmodel -- cell ( #classes x 1 ), every model entry is obtained via
+%              svmtrain of the corresponding 1-vs-all-problem
+%
+% date: 30-04-2014 ( dd-mm-yyyy )
+% author: Alexander Freytag
+
+    if ( nargin < 3 ) 
+        settings = [];
+    end
+    
+    
+    libsvm_options = '';
+    
+    % outputs for training
+    if ( ~ getFieldWithDefault ( settings, 'b_verbose', false ) )
+        libsvm_options = sprintf('%s -q', libsvm_options);
+    end
+    
+    % cost parameter
+    f_svm_C = getFieldWithDefault ( settings, 'f_svm_C', 1);
+    libsvm_options = sprintf('%s -c %f', libsvm_options, f_svm_C);    
+    
+    % do we want to use an offset for the hyperplane?
+    if ( getFieldWithDefault ( settings, 'b_addOffset', false) )
+        libsvm_options = sprintf('%s -B 1', libsvm_options);    
+    end
+    
+    % which solver to use
+    % copied from the liblinear manual:
+%       for multi-class classification
+%          0 -- L2-regularized logistic regression (primal)
+%          2 -- L2-regularized L2-loss support vector classification (primal)
+%          11 -- l2-loss SVR
+    i_svmSolver = getFieldWithDefault ( settings, 'i_svmSolver', 2);
+    i_numThreads = getFieldWithDefault ( settings, 'i_numThreads', 2);
+    libsvm_options = sprintf('%s -s %d -n %d', libsvm_options, i_svmSolver, i_numThreads);    
+
+    
+    % increase penalty for positive samples according to invers ratio of
+    % their number, i.e., if 1/3 is ratio of positive to negative samples, then
+    % impact of positives is 3 the times of negatives
+    % 
+    b_weightBalancing = getFieldWithDefault ( settings, 'b_weightBalancing', false);
+    
+    
+  
+    uniqueLabels = unique ( labels );
+    i_numClasses = size ( uniqueLabels,1);
+    
+	
+    %# train one-against-all models
+    
+    if ( ~b_weightBalancing)    
+        svmmodel = train( labels, feat, libsvm_options );
+    else
+        svmmodel = cell( i_numClasses,1);
+        for k=1:i_numClasses
+            yBin        = 2*double( labels == uniqueLabels( k ) )-1;
+            
+            fraction = double(sum(yBin==1))/double(numel(yBin));
+            libsvm_optionsLocal = sprintf('%s -w1 %f', libsvm_options, 1.0/fraction);
+            svmmodel{ k } = train( yBin, feat, libsvm_optionsLocal );
+            
+            %store the unique class label for later evaluations.
+            svmmodel{ k }.uniqueLabel = uniqueLabels( k );
+        end         
+    end
+    
+end