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