How do I use fscmrmr with the outputs from the MATLAB example titled "Classify Sound Using Deep Learning"?
1 Ansicht (letzte 30 Tage)
Ältere Kommentare anzeigen
Nicholas Pulsone
am 17 Jan. 2024
Kommentiert: Nicholas Pulsone
am 22 Jan. 2024
I want to assess the importance of the featuers used in the MATLB example "Classify Soound Using Deep Learning". I am new to AI/ML and learned about the function fscmrmr. How do I use this function with the variables contained the in the MATLAB code below?
I tried entering [idx,scores] = fscmrmr(featuresTrain,labelsTrain); and received the following error...
Error using classreg.learning.classif.FullClassificationModel.prepareData
X must be a numeric matrix.
Error in fscmrmr (line 119)
classreg.learning.classif.FullClassificationModel.prepareData(...
Please note, the code below was copied directly from the online MATLAB example that shows how to classify a sound by using deep learning processes.
fs = 44.1e3;
duration = 0.5;
N = duration*fs;
wNoise = 2*rand([N,1000]) - 1;
wLabels = repelem(categorical("white"),1000,1);
bNoise = filter(1,[1,-0.999],wNoise);
bNoise = bNoise./max(abs(bNoise),[],'all');
bLabels = repelem(categorical("brown"),1000,1);
pNoise = pinknoise([N,1000]);
pLabels = repelem(categorical("pink"),1000,1);
sound(wNoise(:,1),fs)
melSpectrogram(wNoise(:,1),fs)
title('White Noise')
sound(bNoise(:,1),fs)
melSpectrogram(bNoise(:,1),fs)
title('Brown Noise')
sound(pNoise(:,1),fs)
melSpectrogram(pNoise(:,1),fs)
title('Pink Noise')
audioTrain = [wNoise(:,1:800),bNoise(:,1:800),pNoise(:,1:800)];
labelsTrain = [wLabels(1:800);bLabels(1:800);pLabels(1:800)];
audioValidation = [wNoise(:,801:end),bNoise(:,801:end),pNoise(:,801:end)];
labelsValidation = [wLabels(801:end);bLabels(801:end);pLabels(801:end)];
aFE = audioFeatureExtractor("SampleRate",fs, ...
"SpectralDescriptorInput","melSpectrum", ...
"spectralCentroid",true, ...
"spectralSlope",true);
featuresTrain = extract(aFE,audioTrain);
[numHopsPerSequence,numFeatures,numSignals] = size(featuresTrain)
featuresTrain = permute(featuresTrain,[2,1,3]);
featuresTrain = squeeze(num2cell(featuresTrain,[1,2]));
numSignals = numel(featuresTrain)
[numFeatures,numHopsPerSequence] = size(featuresTrain{1})
featuresValidation = extract(aFE,audioValidation);
featuresValidation = permute(featuresValidation,[2,1,3]);
featuresValidation = squeeze(num2cell(featuresValidation,[1,2]));
layers = [ ...
sequenceInputLayer(numFeatures)
lstmLayer(50,"OutputMode","last")
fullyConnectedLayer(numel(unique(labelsTrain)))
softmaxLayer
classificationLayer];
options = trainingOptions("adam", ...
"Shuffle","every-epoch", ...
"ValidationData",{featuresValidation,labelsValidation}, ...
"Plots","training-progress", ...
"Verbose",false);
net = trainNetwork(featuresTrain,labelsTrain,layers,options);
wNoiseTest = 2*rand([N,1]) - 1;
classify(net,extract(aFE,wNoiseTest)')
bNoiseTest = filter(1,[1,-0.999],wNoiseTest);
bNoiseTest= bNoiseTest./max(abs(bNoiseTest),[],'all');
classify(net,extract(aFE,bNoiseTest)')
pNoiseTest = pinknoise(N);
classify(net,extract(aFE,pNoiseTest)')
0 Kommentare
Akzeptierte Antwort
Brian Hemmat
am 19 Jan. 2024
Bearbeitet: Brian Hemmat
am 19 Jan. 2024
fscmrmr doesn't have any concept of time/continuity over time. To use it, consider each time step separately. For that reason, it may not be the best feature selection tool to use with an RNN network, which considers how features change over time.
However, I think this is what you want:
% Convert train features to matrix. Rows correspond to observations
X = cat(2,featuresTrain{:})';
% Replicate labels so they are in one-to-one correspondance with features.
Y = repelem(labelsTrain,size(featuresTrain{1},2),1);
[featureSelectionIdx,featureSelectionScores] = fscmrmr(X,Y);
figure
bar(featureSelectionScores)
ylabel("Feature Score")
xlabel("Feature Matrix Column")
% You can map the Feature Matrix Column back to the feature using info:
info(aFE)
See this example for a more robust way of doing this:
So, based on fscmrmr, it looks like the spectralSlope is actually the best of the two features. But again, this type of feature selection might not be optimal for an RNN. A more involved approach might be sequential feature selection, which is done in this example:
Weitere Antworten (0)
Siehe auch
Kategorien
Mehr zu Image Data Workflows finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!