wolffd@0
|
1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
wolffd@0
|
2 % Experiment with gradient ascent %
|
wolffd@0
|
3 % Project: sub-euclidean distance for music similarity %
|
wolffd@0
|
4 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
wolffd@0
|
5 %% Load features
|
wolffd@0
|
6 %feature_file = 'rel_music_raw_features.mat';
|
wolffd@0
|
7 feature_file = 'rel_music_raw_features+simdata_ISMIR12.mat';
|
wolffd@0
|
8
|
wolffd@0
|
9 vars = whos('-file', feature_file);
|
wolffd@0
|
10 A = load(feature_file,vars(1).name,vars(2).name,vars(3).name,vars(4).name);
|
wolffd@0
|
11 raw_features = A.(vars(1).name);
|
wolffd@0
|
12 indices = A.(vars(2).name);
|
wolffd@0
|
13 tst_inx = A.(vars(3).name);
|
wolffd@0
|
14 trn_inx = A.(vars(4).name);
|
wolffd@0
|
15 %% Params setting
|
wolffd@0
|
16 dmr = [0 5 10 20 30 50]; % dimension reduction by PCA
|
wolffd@0
|
17 ws = [0 5 10 20 30 50 70]; % window size
|
wolffd@0
|
18 % parameters of rbm (if it is used for extraction)
|
wolffd@0
|
19 hidNum = 0;
|
wolffd@0
|
20 lr_1 = 0;
|
wolffd@0
|
21 lr_2 = 0;
|
wolffd@0
|
22 mmt = 0;
|
wolffd@0
|
23 cost = 0;
|
wolffd@0
|
24 %% Select parameters (if grid-search is not applied)
|
wolffd@0
|
25 di = 1;
|
wolffd@0
|
26
|
wolffd@0
|
27 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
wolffd@0
|
28 % If grid search is define
|
wolffd@0
|
29 % Define directory to save parameters & results
|
wolffd@0
|
30 if ~isempty(findstr('WIN',computer()))
|
wolffd@0
|
31 dir = 'C:\Pros\Experiments\ISMIR_2013\grad\'; % In windows platform
|
wolffd@0
|
32 dlm = '\';
|
wolffd@0
|
33 elseif ~isempty(findstr('linux',computer())) || ~isempty(findstr('LNX',computer()))
|
wolffd@0
|
34 dir = '/home/funzi/Documents/Experiments/ISMIR_2013/grad/'; % In lunix platform
|
wolffd@0
|
35 dlm = '/';
|
wolffd@0
|
36 end
|
wolffd@0
|
37
|
wolffd@0
|
38 EXT_TYPE = 2;
|
wolffd@0
|
39 switch (EXT_TYPE)
|
wolffd@0
|
40 case 1
|
wolffd@0
|
41 dir = strcat(dir,'pca',dlm);
|
wolffd@0
|
42 case 2
|
wolffd@0
|
43 dir = strcat(dir,'rbm',dlm);
|
wolffd@0
|
44
|
wolffd@0
|
45 hidNum = [100 500 1000 1200];
|
wolffd@0
|
46 lr_1 = [0.5 0.7];
|
wolffd@0
|
47 lr_2 = [0.7];
|
wolffd@0
|
48 mmt = [0.1];
|
wolffd@0
|
49 cost = [0.00002];
|
wolffd@0
|
50 otherwise
|
wolffd@0
|
51 dir = strcat(dir,'none',dlm);
|
wolffd@0
|
52 end
|
wolffd@0
|
53
|
wolffd@0
|
54 w_num = size(ws,2);
|
wolffd@0
|
55
|
wolffd@0
|
56 for iiii = 1:200 % set the higher range to search for better features in case of ext using rbm
|
wolffd@0
|
57 log_file = strcat(dir,'exp',num2str(iiii),'.mat')
|
wolffd@0
|
58 inx = resume_from_grid(log_file,8 + w_num);
|
wolffd@0
|
59 if inx(end-w_num+1:end)==ones(1,w_num)
|
wolffd@0
|
60 max_= zeros(1,w_num);
|
wolffd@0
|
61 else
|
wolffd@0
|
62 max_ = inx(end-w_num+1:end);
|
wolffd@0
|
63 end
|
wolffd@0
|
64
|
wolffd@0
|
65 results = zeros(1,w_num);
|
wolffd@0
|
66 W_max = cell(1,w_num);
|
wolffd@0
|
67 vB_max = cell(1,w_num);
|
wolffd@0
|
68 hB_max = cell(1,w_num);
|
wolffd@0
|
69 Ws_max = cell(1,w_num);
|
wolffd@0
|
70
|
wolffd@0
|
71 for hi = inx(1):size(hidNum,2)
|
wolffd@0
|
72 for l1i = inx(2):size(lr_1,2)
|
wolffd@0
|
73 % for l1i = inx(3):size(lr_2,2)
|
wolffd@0
|
74 for mi = inx(4):size(mmt,2)
|
wolffd@0
|
75 for ci = inx(5):size(cost,2)
|
wolffd@0
|
76 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
wolffd@0
|
77 %% Feature extraction
|
wolffd@0
|
78 features = raw_features;
|
wolffd@0
|
79 switch (EXT_TYPE)
|
wolffd@0
|
80 case 1 % Using PCA
|
wolffd@0
|
81 assert(~exist('OCTAVE_VERSION'),'This script cannot run in octave');
|
wolffd@0
|
82 coeff = princomp(raw_features);
|
wolffd@0
|
83 coeff = coeff(:,1:6); % best = 6
|
wolffd@0
|
84 features = raw_features*coeff;
|
wolffd@0
|
85 % normalizing
|
wolffd@0
|
86 mm = minmax(features')';
|
wolffd@0
|
87 inn= (find(mm(1,:)~=mm(2,:)));
|
wolffd@0
|
88 mm = mm(:,inn);
|
wolffd@0
|
89 features = features(:,inn);
|
wolffd@0
|
90 features = (features-repmat(mm(1,:),size(features,1),1))./(repmat(mm(2,:),size(features,1),1)-repmat(mm(1,:),size(features,1),1));
|
wolffd@0
|
91 case 2 % Using rbm
|
wolffd@0
|
92 conf.hidNum = hidNum(hi);
|
wolffd@0
|
93 conf.eNum = 100;
|
wolffd@0
|
94 conf.sNum = size(raw_features,1);
|
wolffd@0
|
95 conf.bNum = 1;
|
wolffd@0
|
96 conf.gNum = 1;
|
wolffd@0
|
97 conf.params = [lr_1(l1i) lr_1(l1i) mmt(mi) cost(ci)];
|
wolffd@0
|
98 conf.N = 50;
|
wolffd@0
|
99 conf.MAX_INC = 10;
|
wolffd@0
|
100 W1 = zeros(0,0);
|
wolffd@0
|
101 [W1 vB1 hB1] = training_rbm_(conf,W1,raw_features);
|
wolffd@0
|
102 features = logistic(raw_features*W1 + repmat(hB1,conf.sNum,1));
|
wolffd@0
|
103 otherwise
|
wolffd@0
|
104 % normalizing
|
wolffd@0
|
105 % mm = minmax(features')';
|
wolffd@0
|
106 % inn= (find(mm(1,:)~=mm(2,:)));
|
wolffd@0
|
107 % mm = mm(:,inn);
|
wolffd@0
|
108 % features = features(:,inn);
|
wolffd@0
|
109 % features = (features-repmat(mm(1,:),size(features,1),1))./(repmat(mm(2,:),size(features,1),1)-repmat(mm(1,:),size(features,1),1));
|
wolffd@0
|
110 end
|
wolffd@0
|
111
|
wolffd@0
|
112 for wi = inx(6):w_num
|
wolffd@0
|
113 %% Sub-euclidean computation
|
wolffd@0
|
114 w = ws(wi); % w = subspace window size
|
wolffd@0
|
115 num_case = size(trn_inx,1);
|
wolffd@0
|
116 [trnd_12 trnd_13] = subspace_distances(trn_inx,features,indices,w,0);
|
wolffd@0
|
117 [tstd_12 tstd_13] = subspace_distances(tst_inx,features,indices,w,0);
|
wolffd@0
|
118 cr_ = 0; % correct rate for training
|
wolffd@0
|
119 cr = 0; % correct rate for testing
|
wolffd@0
|
120 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
wolffd@0
|
121 %% CODE HERE %%
|
wolffd@0
|
122 [Ws cr_] = gradient_ascent(trnd_12,trnd_13,0.1,0.1,0.00002);
|
wolffd@0
|
123
|
wolffd@0
|
124 for i = 1:num_case
|
wolffd@0
|
125 cr = cr + sum((tstd_13{i}-tstd_12{i})*Ws{i}' > 0, 1)/size(tstd_12{i},1);
|
wolffd@0
|
126 end
|
wolffd@0
|
127 cr = cr/num_case;
|
wolffd@0
|
128 if cr_>max_(wi)
|
wolffd@0
|
129 max_(wi) = cr_;
|
wolffd@0
|
130 results(wi) = cr;
|
wolffd@0
|
131 if EXT_TYPE==2
|
wolffd@0
|
132 W_max{wi} = W1;
|
wolffd@0
|
133 vB_max{wi} = vB1;
|
wolffd@0
|
134 hB_max{wi} = hB1;
|
wolffd@0
|
135 Ws_max{wi} = Ws;
|
wolffd@0
|
136 end
|
wolffd@0
|
137 end
|
wolffd@0
|
138
|
wolffd@0
|
139 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
wolffd@0
|
140 fprintf('[window|train|test]= %2d |%f |%f\n',w,cr_,cr);
|
wolffd@0
|
141 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
wolffd@0
|
142 % Using the logging function to save paramters
|
wolffd@0
|
143 % and the result for plotting or in grid search
|
wolffd@0
|
144 switch EXT_TYPE
|
wolffd@0
|
145 case 1
|
wolffd@0
|
146 % logging(log_file,[100 100 100 100 100 wi cr_ cr max_]);
|
wolffd@0
|
147 case 2
|
wolffd@0
|
148 logging(log_file,[hi l1i l1i mi ci wi cr_ cr max_ conf.hidNum conf.eNum conf.params]);
|
wolffd@0
|
149 otherwise
|
wolffd@0
|
150 logging(log_file,[100 100 100 100 100 wi cr_ cr max_]);
|
wolffd@0
|
151 end
|
wolffd@0
|
152 end
|
wolffd@0
|
153 inx(6)=1;
|
wolffd@0
|
154 end
|
wolffd@0
|
155 inx(5) = 1;
|
wolffd@0
|
156 end
|
wolffd@0
|
157 inx(4) = 1;
|
wolffd@0
|
158 end
|
wolffd@0
|
159 inx(2) = 1;
|
wolffd@0
|
160 end
|
wolffd@0
|
161 inx(1) = 1;
|
wolffd@0
|
162 %% Test on best features
|
wolffd@0
|
163
|
wolffd@0
|
164 save(strcat(dir,'res_',num2str(iiii),'.mat'),'max_','results','W_max','vB_max','hB_max','Ws_max','ws');
|
wolffd@0
|
165 [dummy pos] = max(max_);
|
wolffd@0
|
166 fprintf('Accuracy (RBM best fts): w = %d train = %f test = %f\n',ws(pos),max_(pos),results(pos));
|
wolffd@0
|
167 clc;
|
wolffd@0
|
168 end
|
wolffd@0
|
169 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
wolffd@0
|
170 clear;
|