MATLAB使用后期融合实现声音场景识别(四)——训练与评估集成分类器

    科技2022-07-10  115

    本文是对MATLAB官网文档Acoustic Scene Recognition Using Late Fusion中训练集成分类器部分的翻译与解析,请参考原网页进行理解。

    目录

    Feature Extraction for Ensemble Classifier集成分类器的特征提取Define and Train Ensemble Classifier定义和训练集成分类器Evaluate Ensemble Classifier评估集成分类器Apply Late Fusion使用后期融合Evaluate Late Fusion评估后期融合Close the parallel pool结束并行计算

    Feature Extraction for Ensemble Classifier集成分类器的特征提取

    [4]中显示小波散射可以很好地表示声学场景。定义一个waveletScattering(小波工具箱)对象。通过反复试验确定不变性量表和品质因数。

    sf = waveletScattering('SignalLength',size(data,1), ...% 针对一个样本 'SamplingFrequency',fs, ... 'InvarianceScale',0.75, ... 'QualityFactors',[4 1]); % 得到一个小波时间散射对象

    将音频信号转换为单声道,然后调用featureMatrix(小波工具箱)以返回散射分解框架sf的散射系数。

    dataMono = mean(data,2);% 得到样本每一行的平均值 scatteringCoeffients = featureMatrix(sf,dataMono,'Transform','log');% 得到散射特征矩阵 featureVector = mean(scatteringCoeffients,2);%10秒音频片段上的散射系数求平均值 fprintf('Number of wavelet features per 10-second clip = %d\n',numel(featureVector))%10秒剪辑的小波特征数量

    对全部样本,辅助函数HelperWaveletFeatureVector执行上述步骤。辅助函数HelperWaveletFeatureVector执行上述步骤。使用带有cellfun和HelperWaveletFeatureVector的tall数组来并行化特征提取。提取训练集和测试集的小波特征向量。

    scatteringTrain = cellfun(@(x)HelperWaveletFeatureVector(x,sf),train_set_tall,'UniformOutput',false); xTrain = gather(scatteringTrain); xTrain = cell2mat(xTrain')'; scatteringTest = cellfun(@(x)HelperWaveletFeatureVector(x,sf),test_set_tall,'UniformOutput',false); xTest = gather(scatteringTest); xTest = cell2mat(xTest')';

    Define and Train Ensemble Classifier定义和训练集成分类器

    使用fitcensemble创建训练有素的分类集成模型(ClassificationEnsemble)。

    subspaceDimension = min(150,size(xTrain,2) - 1); numLearningCycles = 30; classificationEnsemble = fitcensemble(xTrain,adsTrain.Labels, ... 'Method','Subspace', ... 'NumLearningCycles',numLearningCycles, ... 'Learners','discriminant', ... 'NPredToSample',subspaceDimension, ... 'ClassNames',removecats(unique(adsTrain.Labels)));

    Evaluate Ensemble Classifier评估集成分类器

    对于每个10秒钟的音频剪辑,调用预测以返回标签和权重,然后将其映射到相应的预测位置。调用混淆图以可视化测试集的准确性,并打印平均值。

    [waveletPredictedLabels,waveletResponses] = predict(classificationEnsemble,xTest); figure cm = confusionchart(adsTest.Labels,waveletPredictedLabels,'title','Test Accuracy - Wavelet Scattering'); cm.ColumnSummary = 'column-normalized'; cm.RowSummary = 'row-normalized'; fprintf('Average accuracy of classifier = %0.2f\n',mean(adsTest.Labels==waveletPredictedLabels)*100)

    Apply Late Fusion使用后期融合

    对于每个10秒的剪辑,在小波分类器上调用预测,然后CNN返回一个向量,该向量指示对其决策的相对置信度。将waveletResponses与cnnResponses相乘以创建后期融合系统。

    fused = waveletResponses .* cnnResponses; [~,classIdx] = max(fused,[],2); predictedLabels = classes(classIdx);

    Evaluate Late Fusion评估后期融合

    调用混淆图以可视化融合的分类准确性,将平均精度打印到命令窗口。

    figure cm = confusionchart(adsTest.Labels,predictedLabels,'title','Test Accuracy - Fusion'); cm.ColumnSummary = 'column-normalized'; cm.RowSummary = 'row-normalized'; fprintf('Average accuracy of fused models = %0.2f\n',mean(adsTest.Labels==predictedLabels)*100)

    Close the parallel pool结束并行计算

    delete(pp)
    Processed: 0.010, SQL: 8