diff core/magnatagatune/MTTMixedFeatureSlaney08GenreBasicSmRBM.m @ 0:e9a9cd732c1e tip

first hg version after svn
author wolffd
date Tue, 10 Feb 2015 15:05:51 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/magnatagatune/MTTMixedFeatureSlaney08GenreBasicSmRBM.m	Tue Feb 10 15:05:51 2015 +0000
@@ -0,0 +1,263 @@
+% --
+% This class loads and hanles the aufdio features included with the MTT
+% Library
+% 
+% Features are extracted and then porcessed by son's RBM toolbox
+% --- 
+classdef MTTMixedFeatureSlaney08GenreBasicSmRBM < MTTAudioFeature & handle
+    
+    properties(Constant = true)
+        
+        my_revision = str2double(substr('$Rev: 457 $',  5, -1));
+    end
+    
+    properties
+        
+        % ---
+        % Set default parameters
+        % ---
+        my_basetype = 'MTTMixedFeatureSlaney08GenreBasicSm';
+        
+        my_params = MTTAudioFeature.inherited_params(...
+            'MTTMixedFeatureSlaney08GenreBasicSm', ...
+            ... % --- 
+            ... % Following: RBM params
+            ... % ---
+            'norm_pre_rbm', 0, ... % norm before RBM?
+            'norm_post_rbm', 0, ... % norm before RBM?
+            'rbm_hidNum',200, ...   % number of hidden units
+            'rbm_eNum', 100, ...
+            'rbm_bNum', 1, ...
+            'rbm_gNum', 1, ...
+            'rbm_lrate1' , 0.05, ... % initial learning rate
+            'rbm_lrate2', 0.1, ... %  learning rate
+            'rbm_momentum', 0.5, ...
+            'rbm_cost', 0.00002, ... % cost function
+            'rbm_N', 50, ...
+            'rbm_MAX_INC', 10 ...
+        );
+    end
+    % ---
+    % member functions
+    % ---
+    methods
+        
+        % ---
+        % constructor: pointer to feature in database
+        % ---
+        function feature = MTTMixedFeatureSlaney08GenreBasicSmRBM(varargin)
+
+            feature = feature@MTTAudioFeature(varargin{:});
+        end
+        
+        % ---
+        % load feature data from xml file
+        % ---
+        function data = extract(feature, clip)
+        % load feature data by parsing xml
+            
+            global globalvars;
+            
+            % ---
+            % we extract the base features, and save 
+            % the pointers to these.
+            % the main work is then done in the define_global_transf
+            % and finalise functions.
+            % ---
+            data.basefeat = clip.features(feature.my_basetype,...
+                feature.my_params); 
+
+            % save info data
+            data.info.type = class(feature);
+            data.info.owner = clip;
+            data.info.owner_id = clip.id;
+            data.info.creatorrev = feature.my_revision;
+            
+            % save param data
+            data.info.params = feature.my_params;
+            
+            % prepare field for final features
+            data.final.vector = [];
+            data.final.dim = 0;
+            data.final.vector_info.labels = {};
+        end
+        
+        function define_global_transform(features)
+            
+            if numel(features) == 1
+                error ('Insert feature array for this method');
+            end
+            
+            % ---
+            % We collect all the relevant genretag 
+            % features and get the transform on this basis.
+            % ---
+            for i = 1:numel(features)
+            	basef(i) = features(i).data.basefeat;
+            end
+            
+            % call the features own transsform function
+            basef.define_global_transform();
+            
+            % ---
+            % finalise the basic features, and 
+            % get the feature vectors;
+            % ---
+            X = basef.vector();
+            
+            % check dataset dimension
+            if numel(features) < basef.dim;
+                
+                error ('Not enough feature vectors for RBM calculation. need %d samples', ...
+                    basef.dim);
+            end
+            
+            % ---
+            % NOTE: should the data be normalised and scaled to -1:1 
+            % instead of being in a range of 0-1 AND max-min = 1
+            % --- 
+            if features(1).my_params.norm_pre_rbm == 1
+                                
+                [X, pstd] = mapminmax(X,-1,1);
+                common.rbm.pre_norm = pstd;
+            elseif features(1).my_params.norm_pre_rbm == 2
+                
+                [X, pstd] = mapstd(X,0,1);
+                common.rbm.pre_norm = pstd;
+            end
+
+            
+            % ---
+            % TRAIN RBM
+            % ---
+            conf.sNum   = size(X,2);
+            conf.eNum   = features(1).my_params.rbm_eNum;
+            conf.bNum   = features(1).my_params.rbm_bNum;
+            conf.gNum   = features(1).my_params.rbm_gNum;
+            conf.hidNum   = features(1).my_params.rbm_hidNum;
+            conf.MAX_INC   = features(1).my_params.rbm_MAX_INC;
+            conf.N   = features(1).my_params.rbm_N;
+            conf.params = [ features(1).my_params.rbm_lrate1 features(1).my_params.rbm_lrate2 ...
+                           features(1).my_params.rbm_momentum features(1).my_params.rbm_cost];          
+            W1 = zeros(0,0);
+            [common.rbm.W1 common.rbm.vB1 common.rbm.hB1] = training_rbm_(conf,W1,X');
+            
+            % ---
+            % This transforms the features using the learnt RBM
+            % ---
+            Y = logistic(X' * common.rbm.W1 + repmat(common.rbm.hB1,conf.sNum,1))';
+
+            
+            % normalise values after processing
+            if features(1).my_params.norm_post_rbm
+                
+                [Y,pmm] = mapminmax(Y,0,1);
+                common.rbm.post_norm = pmm;
+            end
+            
+            % ---
+            % set common feature values for mixed features
+            % ---
+            features(1).my_db.set_common(common);            
+            
+            % save the transformed features straight away!
+            features.finalise(Y);
+        end
+        
+        function finalise(feature, final)
+        % applies a final transformation and
+        % collects the information of this feature within a single vector
+        % see info for types in specific dimensions
+        
+            max_size = feature(1).my_params.rbm_hidNum;
+
+            % prepare information
+            info = {'RBM'};
+            info(2:max_size) = num2cell(2:max_size);
+        
+            % check if features have been finalised already
+            if nargin == 2 && isempty(final)
+                
+                % the final vector etc already are set to zero;
+                return;
+                
+            elseif nargin == 2 && (numel(feature) == size(final, 2))
+                    
+                for i = 1:numel(feature)
+                    
+                    % save final vector and description
+                    feature(i).data.final.vector = final(:,i);
+                    feature(i).data.final.dim = max_size;
+                    feature(i).data.final.vector_info.labels = info;
+                end
+                
+            else
+            % features have to be transformed first
+            % ---
+            % TODO: this code remains untested
+            % ---
+            
+            % check for neccesary parameters
+                if isempty(feature(1).my_db.commondb)
+
+                    error('Define the global transformation first')
+                    return;
+                end
+             
+
+                for i = 1:numel(feature)
+
+                    % check for neccesary parameters
+                    if isempty(feature(i).my_db.commondb)
+
+                        error('Define the global transformation first')
+                    end
+                    
+                    % ---
+                    % get feature vector and apply transformation
+                    % ---
+                    X = feature(i).data.basefeat.vector();
+                    
+                    % ---
+                    % apply normalisation used for removing mean 
+                    % in training data
+                    % ---
+                    if feature(1).my_params.norm_pre_rbm == 1
+                                
+                        X = mapminmax('apply', X, feature(1).common.rbm.pre_norm);
+                    elseif feature(1).my_params.norm_pre_rbm == 2
+
+                        X = mapstd('apply', X, feature(1).common.rbm.pre_norm);
+                    end
+            
+                    % ---
+                    % RBM: This transforms the features using the learnt RBM
+                    % ---
+                    conf.sNum = size(X,1);
+                    vec = logistic(X * common.rbm.W1 + repmat(common.rbm.hB1,conf.sNum,1));
+
+                    
+                    % normalise pca values after transformation
+                    if feature(1).my_params.norm_post_rbm
+
+                        vec = mapminmax('apply', vec,...
+                            feature(1).common.rbm.post_norm);
+                    end
+                    
+                    % ---
+                    % cut vector to final size. 
+                    % NOTE: this should be done before
+                    % transformation to reduce computation time
+                    % ---
+                    vec = vec(1:max_size);
+                    
+                    % save final vector and description
+                    feature(i).data.final.vector = vec;
+                    feature(i).data.final.dim = numel(vec);
+                    feature(i).data.final.vector_info.labels = info;
+                end
+            end
+        end
+        
+    end
+end
\ No newline at end of file