rmeddis@38
|
1 function Exp_Tutorial_1(isMasterNode)
|
rmeddis@38
|
2
|
rmeddis@38
|
3 % Some description of the experiment goes here
|
rmeddis@38
|
4
|
rmeddis@38
|
5 %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
rmeddis@38
|
6 % Set up the basic folders
|
rmeddis@38
|
7 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
rmeddis@38
|
8 expName = 'Tutorial';
|
rmeddis@38
|
9 dataFolderPrefix = 'featR';
|
rmeddis@38
|
10 if isunix
|
rmeddis@38
|
11 expFolderPrefix = '/scratch/nrclark/exps/';
|
rmeddis@38
|
12 else
|
rmeddis@38
|
13 expFolderPrefix = 'D:\Exps';
|
rmeddis@38
|
14 end
|
rmeddis@38
|
15
|
rmeddis@38
|
16 expFolder = fullfile(expFolderPrefix,expName);
|
rmeddis@38
|
17 hmmFolder = fullfile(expFolder,'hmm');
|
rmeddis@38
|
18
|
rmeddis@38
|
19 %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
rmeddis@38
|
20 % Sort out the training (LEARNING) condition
|
rmeddis@38
|
21 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
rmeddis@38
|
22 learnFolder = fullfile(expFolder,'featL');
|
rmeddis@38
|
23
|
rmeddis@38
|
24 xL = cJob('L', learnFolder);
|
rmeddis@38
|
25
|
rmeddis@38
|
26 xL.participant = 'Normal';
|
rmeddis@38
|
27 xL.MAPparamChanges= {'DRNLParams.rateToAttenuationFactorProb=0;', 'OMEParams.rateToAttenuationFactorProb=0;' };
|
rmeddis@38
|
28
|
rmeddis@38
|
29 xL.noiseLevToUse = -200;
|
rmeddis@38
|
30 xL.speechLevToUse = 60;
|
rmeddis@38
|
31
|
rmeddis@38
|
32 xL.MAPopHSR = 1;
|
rmeddis@38
|
33 xL.MAPopMSR = 0;
|
rmeddis@38
|
34 xL.MAPopLSR = 0;
|
rmeddis@38
|
35
|
rmeddis@38
|
36
|
rmeddis@38
|
37 xL.numCoeff = 14;
|
rmeddis@38
|
38 xL.removeEnergyStatic = 0;
|
rmeddis@38
|
39
|
rmeddis@38
|
40 %%%%% Group of params that will influence simulation run time %%%%%%%
|
rmeddis@38
|
41 xL.numWavs = 12; %MAX=8440
|
rmeddis@38
|
42 testWavs = 6; %MAX = 358
|
rmeddis@38
|
43 nzLevel = [-200 40:10:70];
|
rmeddis@38
|
44 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
rmeddis@38
|
45
|
rmeddis@38
|
46 xL.noisePreDur = 1;
|
rmeddis@38
|
47 xL.noisePostDur = 0.1;
|
rmeddis@38
|
48 xL.truncateDur = xL.noisePreDur-0.1;
|
rmeddis@38
|
49
|
rmeddis@38
|
50 xL.noiseName = 'pink_demo';
|
rmeddis@38
|
51
|
rmeddis@38
|
52 if isMasterNode && ~isdir(xL.opFolder)
|
rmeddis@38
|
53 mkdir(xL.opFolder);
|
rmeddis@38
|
54 xL = xL.assignFiles;
|
rmeddis@38
|
55 xL.storeSelf; % This is a call to a member function and is not a pointless line of code!
|
rmeddis@38
|
56 end
|
rmeddis@38
|
57
|
rmeddis@38
|
58
|
rmeddis@38
|
59 %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
rmeddis@38
|
60 % Sort out the testing (RECOGNITION) conditions
|
rmeddis@38
|
61 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
rmeddis@38
|
62 recConditions = numel(nzLevel);
|
rmeddis@38
|
63
|
rmeddis@38
|
64 tmpIdx=0;
|
rmeddis@38
|
65 for nn = 0*recConditions+1:1*recConditions
|
rmeddis@38
|
66 tmpIdx=tmpIdx+1;
|
rmeddis@38
|
67 xR{nn} = xL; %simply copy the "Learn" object and change it a bit below
|
rmeddis@38
|
68 recFolder = fullfile(expFolder,[dataFolderPrefix num2str(nn)]);
|
rmeddis@38
|
69 xR{nn}.opFolder = recFolder;
|
rmeddis@38
|
70
|
rmeddis@38
|
71 %These are the interesting differences between training and testing
|
rmeddis@38
|
72 xR{nn}.numWavs = testWavs; %MAX = 358
|
rmeddis@38
|
73 xR{nn}.noiseLevToUse = nzLevel(tmpIdx);
|
rmeddis@38
|
74 xR{nn}.MAPparamChanges= {'DRNLParams.rateToAttenuationFactorProb=0;'};
|
rmeddis@38
|
75
|
rmeddis@38
|
76 %Now just to wrap it up ready for processing
|
rmeddis@38
|
77 if isMasterNode && ~isdir(xR{nn}.opFolder)
|
rmeddis@38
|
78 mkdir(xR{nn}.opFolder);
|
rmeddis@38
|
79 xR{nn} = xR{nn}.assignWavPaths('R');
|
rmeddis@38
|
80 xR{nn} = xR{nn}.assignFiles;
|
rmeddis@38
|
81 xR{nn}.storeSelf;
|
rmeddis@38
|
82 end
|
rmeddis@38
|
83 end
|
rmeddis@38
|
84
|
rmeddis@38
|
85 tmpIdx=0;
|
rmeddis@38
|
86 for nn = 1*recConditions+1:2*recConditions
|
rmeddis@38
|
87 tmpIdx=tmpIdx+1;
|
rmeddis@38
|
88 xR{nn} = xL; %simply copy the "Learn" object and change it a bit below
|
rmeddis@38
|
89 recFolder = fullfile(expFolder,[dataFolderPrefix num2str(nn)]);
|
rmeddis@38
|
90 xR{nn}.opFolder = recFolder;
|
rmeddis@38
|
91
|
rmeddis@38
|
92 %These are the interesting differences between training and testing
|
rmeddis@38
|
93 xR{nn}.numWavs = testWavs; %MAX = 358
|
rmeddis@38
|
94 xR{nn}.noiseLevToUse = nzLevel(tmpIdx);
|
rmeddis@38
|
95 xR{nn}.MAPparamChanges= {'DRNLParams.rateToAttenuationFactorProb=-10^(-10/20);'};
|
rmeddis@38
|
96
|
rmeddis@38
|
97
|
rmeddis@38
|
98 %Now just to wrap it up ready for processing
|
rmeddis@38
|
99 if isMasterNode && ~isdir(xR{nn}.opFolder)
|
rmeddis@38
|
100 mkdir(xR{nn}.opFolder);
|
rmeddis@38
|
101 xR{nn} = xR{nn}.assignWavPaths('R');
|
rmeddis@38
|
102 xR{nn} = xR{nn}.assignFiles;
|
rmeddis@38
|
103 xR{nn}.storeSelf;
|
rmeddis@38
|
104 end
|
rmeddis@38
|
105 end
|
rmeddis@38
|
106
|
rmeddis@38
|
107
|
rmeddis@38
|
108 %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
rmeddis@38
|
109 % ** Generate features **
|
rmeddis@38
|
110 % This is the time consuming, processing intensive portion of the program.
|
rmeddis@38
|
111 % Nodes that are not the master node are only interested in the opFolder
|
rmeddis@38
|
112 % member of the jobjects.
|
rmeddis@38
|
113 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
rmeddis@38
|
114 worker(xL.opFolder);
|
rmeddis@38
|
115 maxConds = nn;
|
rmeddis@38
|
116 if ~isMasterNode %dont bother wasting master node effort on generating testing features (for now)
|
rmeddis@38
|
117 for nn = 1:maxConds
|
rmeddis@38
|
118 worker(xR{nn}.opFolder);
|
rmeddis@38
|
119 end
|
rmeddis@38
|
120 end
|
rmeddis@38
|
121
|
rmeddis@38
|
122 %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
rmeddis@38
|
123 % Train and test the recogniser - a job for the master node only
|
rmeddis@38
|
124 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
rmeddis@38
|
125 if isMasterNode
|
rmeddis@38
|
126 while(~all(xL.todoStatus==2))
|
rmeddis@38
|
127 disp('Waiting on straggler nodes to complete their jobs before HMM is trained . . .')
|
rmeddis@38
|
128 pause(30); %Wait for 30 seconds before looking again
|
rmeddis@38
|
129 xL.lockJobList;
|
rmeddis@38
|
130 xL = xL.loadSelf; %Reload incase changed
|
rmeddis@38
|
131 xL.unlockJobList;
|
rmeddis@38
|
132 end
|
rmeddis@38
|
133 y = cHMM(hmmFolder);
|
rmeddis@38
|
134 y.numCoeff = (xL.numCoeff-logical(xL.removeEnergyStatic)) * 3;
|
rmeddis@38
|
135 y.createSCP(xL.opFolder)
|
rmeddis@38
|
136 y.createMLF(xL.opFolder)
|
rmeddis@38
|
137 y.train(xL.opFolder) %This node can be busy training, even if other jobs are being processed for testing
|
rmeddis@38
|
138
|
rmeddis@38
|
139 % ALLOW MASTER NODE TO MUCK IN WITH GENERATING TESTING FEATURES ONCE
|
rmeddis@38
|
140 % HMM HAS BEEN TRAINED
|
rmeddis@38
|
141 for nn = 1:maxConds
|
rmeddis@38
|
142 worker(xR{nn}.opFolder);
|
rmeddis@38
|
143 end
|
rmeddis@38
|
144
|
rmeddis@38
|
145 xR{end}.lockJobList;
|
rmeddis@38
|
146 xR{end} = xR{end}.loadSelf; %Reload changes
|
rmeddis@38
|
147 xR{end}.unlockJobList;
|
rmeddis@38
|
148 while(~all(xR{end}.todoStatus==2))
|
rmeddis@38
|
149 disp('Waiting on straggler nodes to complete their jobs before HMM is tested . . .')
|
rmeddis@38
|
150 pause(30); %Wait for 30 seconds before looking again
|
rmeddis@38
|
151 xR{end}.lockJobList;
|
rmeddis@38
|
152 xR{end} = xR{end}.loadSelf; %Reload incase changed
|
rmeddis@38
|
153 xR{end}.unlockJobList;
|
rmeddis@38
|
154 end
|
rmeddis@38
|
155
|
rmeddis@38
|
156 for nn = 1:maxConds
|
rmeddis@38
|
157 y.createSCP(xR{nn}.opFolder);
|
rmeddis@38
|
158 y.test(xR{nn}.opFolder);
|
rmeddis@38
|
159 end
|
rmeddis@38
|
160
|
rmeddis@38
|
161 %Show all of the scores in the command window at the end
|
rmeddis@38
|
162 for nn = 1:maxConds
|
rmeddis@38
|
163 y.score(xR{nn}.opFolder);
|
rmeddis@38
|
164 end
|
rmeddis@38
|
165 end
|