後期融合を使用した音響シーン認識
この例では、音響シーン認識のためのマルチモデル後期融合システムを作成する方法を説明します。この例では、メル スペクトログラムと、ウェーブレット散乱によるアンサンブル分類器を使用して、畳み込みニューラル ネットワーク (CNN) に学習させます。ここでは TUT データセットを使用して学習と評価を行います [1]。
はじめに
音響シーン分類 (ASC) は、環境が発している音に基づいて環境を分類するタスクです。ASC は、デバイス、ロボット、その他さまざまなアプリケーションのコンテキスト アウェアネスの基礎となる汎用の分類問題です [1]。ASC の初期の試みでは、メル周波数ケプストラム係数 (mfcc
(Audio Toolbox)) と混合ガウス モデル (GMM) を使用して統計分布が記述されていました。ASC で使用されているその他の良く知られた特徴として、ゼロクロッシング率、スペクトル重心 (spectralCentroid
(Audio Toolbox))、スペクトル ロールオフ (spectralRolloffPoint
(Audio Toolbox))、スペクトル フラックス (spectralFlux
(Audio Toolbox))、および線形予測係数 (lpc
(Signal Processing Toolbox)) があります [5]。GMM の時間的発展を記述するため、隠れマルコフ モデル (HMM) に学習させていました。最近の性能が最も優れたシステムでは、深層学習 (通常は CNN) や、複数のモデルの融合が使用されてきました。DCASE 2017 コンテストで上位にランクされたシステムで最もよく使われた特徴は、メル スペクトログラム (melSpectrogram
(Audio Toolbox)) でした。このチャレンジで上位にランクしたシステムは、後期融合とデータ拡張を使用してシステムを一般化しています。
この例では、妥当な結果を生成する簡単な方法を説明するために、メル スペクトログラムと、ウェーブレット散乱によるアンサンブル分類器を使用して、CNN に学習させます。CNN とアンサンブル分類器は、全体の精度はほぼ同じですが、区別の対象となる音響シーンによってそれぞれ性能が異なります。全体的な精度を向上させるには、後期融合を使用して CNN の結果とアンサンブル分類器の結果をマージします。
音響シーン認識用のデータセットの読み込み
この例を実行するには、まず、データ セットをダウンロードしなければなりません [1]。このデータセット全体は約 15.5 GB です。お使いのマシンとインターネット接続によっては、データのダウンロードに約 4 時間かかることがあります。
downloadFolder = tempdir; dataset = fullfile(downloadFolder,"TUT-acoustic-scenes-2017"); if ~datasetExists(dataset) disp("Downloading TUT-acoustic-scenes-2017 (15.5 GB) ...") HelperDownload_TUT_acoustic_scenes_2017(dataset); end
開発セットのメタデータを table として読み取ります。table 変数は FileName
、AcousticScene
、および SpecificLocation
という名前にします。
trainMetaData = readtable(fullfile(dataset,"TUT-acoustic-scenes-2017-development","meta"), ... Delimiter={'\t'}, ... ReadVariableNames=false); trainMetaData.Properties.VariableNames = ["FileName","AcousticScene","SpecificLocation"]; head(trainMetaData)
ans=8×3 table
FileName AcousticScene SpecificLocation
__________________________ _____________ ________________
{'audio/b020_90_100.wav' } {'beach'} {'b020'}
{'audio/b020_110_120.wav'} {'beach'} {'b020'}
{'audio/b020_100_110.wav'} {'beach'} {'b020'}
{'audio/b020_40_50.wav' } {'beach'} {'b020'}
{'audio/b020_50_60.wav' } {'beach'} {'b020'}
{'audio/b020_30_40.wav' } {'beach'} {'b020'}
{'audio/b020_160_170.wav'} {'beach'} {'b020'}
{'audio/b020_170_180.wav'} {'beach'} {'b020'}
testMetaData = readtable(fullfile(dataset,"TUT-acoustic-scenes-2017-evaluation","meta"), ... Delimiter={'\t'}, ... ReadVariableNames=false); testMetaData.Properties.VariableNames = ["FileName","AcousticScene","SpecificLocation"]; head(testMetaData)
ans=8×3 table
FileName AcousticScene SpecificLocation
__________________ _____________ ________________
{'audio/1245.wav'} {'beach'} {'b174'}
{'audio/1456.wav'} {'beach'} {'b174'}
{'audio/1318.wav'} {'beach'} {'b174'}
{'audio/967.wav' } {'beach'} {'b174'}
{'audio/203.wav' } {'beach'} {'b174'}
{'audio/777.wav' } {'beach'} {'b174'}
{'audio/231.wav' } {'beach'} {'b174'}
{'audio/768.wav' } {'beach'} {'b174'}
テスト セット内の特定の録音位置は、開発セット内の録音位置と交差しないことに注意してください。これにより、学習済みのモデルを実世界のシナリオに一般化できるかどうかを検証しやすくなります。
sharedRecordingLocations = intersect(testMetaData.SpecificLocation,trainMetaData.SpecificLocation);
disp("Number of specific recording locations in both train and test sets = " + numel(sharedRecordingLocations))
Number of specific recording locations in both train and test sets = 0
メタデータ テーブルの最初の変数には、ファイル名が含まれています。ファイル名とファイル パスを連結します。
trainFilePaths = fullfile(dataset,"TUT-acoustic-scenes-2017-development",trainMetaData.FileName); testFilePaths = fullfile(dataset,"TUT-acoustic-scenes-2017-evaluation",testMetaData.FileName);
データ セット内に存在しないファイルがメタデータにリストされている場合があります。存在しないファイルに対応するファイルパスと音響シーン ラベルを削除します。
ads = audioDatastore(dataset,IncludeSubfolders=true); allFiles = ads.Files; trainIdxToRemove = ~ismember(trainFilePaths,allFiles); trainFilePaths(trainIdxToRemove) = []; trainLabels = categorical(trainMetaData.AcousticScene); trainLabels(trainIdxToRemove) = []; testIdxToRemove = ~ismember(testFilePaths,allFiles); testFilePaths(testIdxToRemove) = []; testLabels = categorical(testMetaData.AcousticScene); testLabels(testIdxToRemove) = [];
学習セットとテスト セットのためのオーディオ データストアを作成します。audioDatastore
(Audio Toolbox)の Labels
プロパティを音響シーンに設定します。countEachLabel
(Audio Toolbox)を呼び出して、学習セットとテスト セット両方のラベルが均等に分布していることを確認します。
adsTrain = audioDatastore(trainFilePaths, ... Labels=trainLabels, ... IncludeSubfolders=true); display(countEachLabel(adsTrain))
15×2 table Label Count ________________ _____ beach 312 bus 312 cafe/restaurant 312 car 312 city_center 312 forest_path 312 grocery_store 312 home 312 library 312 metro_station 312 office 312 park 312 residential_area 312 train 312 tram 312
adsTest = audioDatastore(testFilePaths, ... Labels=categorical(testMetaData.AcousticScene), ... IncludeSubfolders=true); display(countEachLabel(adsTest))
15×2 table Label Count ________________ _____ beach 108 bus 108 cafe/restaurant 108 car 108 city_center 108 forest_path 108 grocery_store 108 home 108 library 108 metro_station 108 office 108 park 108 residential_area 108 train 108 tram 108
この例で使用されているデータセットを小さくすると、性能は低下しますが、速度を上げることができます。一般に、開発とデバッグではデータセットを小さくすることをお勧めします。speedupExample
を true
に設定してデータ セットを小さくします。
speedupExample =false; if speedupExample adsTrain = splitEachLabel(adsTrain,20); adsTest = splitEachLabel(adsTest,10); end
read
(Audio Toolbox)を呼び出して、学習セットからファイルのデータとサンプル レートを取得します。データベースに含まれるオーディオは、一貫したサンプル レートと再生時間をもちます。オーディオを正規化して再生します。対応するラベルを表示します。
[data,adsInfo] = read(adsTrain); data = data./max(data,[],"all"); fs = adsInfo.SampleRate; sound(data,fs) disp("Acoustic scene = " + string(adsTrain.Labels(1)))
Acoustic scene = beach
reset
(Audio Toolbox)を呼び出して、データストアを初期状態に戻します。
reset(adsTrain)
CNN の特徴抽出
データセット内のオーディオ クリップは、それぞれ 10 秒間のステレオ (左右) オーディオで構成されています。この例の特徴抽出パイプラインと CNN アーキテクチャは、[3] に基づいています。特徴抽出のハイパーパラメーター、CNN アーキテクチャ、および学習オプションは、体系的なハイパーパラメーター最適化ワークフローを使用して、元の論文から変更されています。
最初に、オーディオをミッドサイド符号化に変換します。[3] では、ミッドサイド符号化で処理したデータはより優れた空間情報を提供することが示されており、CNN は、この情報を使用して移動するソース (音響シーンを横切る列車など) を特定することができます。
dataMidSide = [sum(data,2),data(:,1)-data(:,2)];
信号を、オーバーラップする 1 秒間のセグメントに分割します。最終的なシステムでは、1 秒間のセグメントに対して確率加重平均を適用し、テスト セットに含まれる 10 秒間の各オーディオ クリップのシーンを予測します。オーディオ クリップを 1 秒間のセグメントに分割することで、ネットワークに学習させやすくなり、学習セットに含まれる特定の音響イベントへの過適合を防ぐことができます。オーバーラップによって、相互に関連がある特徴のすべての組み合わせを学習データに確実に取り込むことができます。また、これにより、システムに追加のデータが提供されます。追加のデータは拡張時に一意に混合することができます。
segmentLength = 1; segmentOverlap = 0.5; [dataBufferedMid,~] = buffer(dataMidSide(:,1),round(segmentLength*fs),round(segmentOverlap*fs),"nodelay"); [dataBufferedSide,~] = buffer(dataMidSide(:,2),round(segmentLength*fs),round(segmentOverlap*fs),"nodelay"); dataBuffered = zeros(size(dataBufferedMid,1),size(dataBufferedMid,2)+size(dataBufferedSide,2)); dataBuffered(:,1:2:end) = dataBufferedMid; dataBuffered(:,2:2:end) = dataBufferedSide;
melSpectrogram
(Audio Toolbox)を使用して、データをコンパクトな周波数領域の表現に変換します。[3] で示されているように、メル スペクトログラムのパラメーターを定義します。
windowLength = 2048; samplesPerHop = 1024; samplesOverlap = windowLength - samplesPerHop; fftLength = 2*windowLength; numBands = 128;
melSpectrogram
は、チャネルごとに独立して作用します。処理時間を最適化するために、バッファーされた信号全体を渡して melSpectrogram
を呼び出します。
spec = melSpectrogram(dataBuffered,fs, ... Window=hamming(windowLength,"periodic"), ... OverlapLength=samplesOverlap, ... FFTLength=fftLength, ... NumBands=numBands);
メル スペクトログラムを対数スケールに変換します。
spec = log10(spec+eps);
この配列を、(帯域数) x (ホップ数) x (チャネル数) x (セグメント数) の次元に形状変換します。ニューラル ネットワークにイメージを入力すると、最初の 2 つの次元はイメージの高さと幅、3 つ目の次元はチャネル、4 つ目の次元は各イメージの区切りになります。
X = reshape(spec,size(spec,1),size(spec,2),size(data,2),[]);
melSpectrogram
を出力引数なしで呼び出し、1 秒のインクリメントの最初の 6 つについて中間チャネルのメル スペクトログラムをプロットします。
tiledlayout(3,2) for channel = 1:2:11 nexttile melSpectrogram(dataBuffered(:,channel),fs, ... Window=hamming(windowLength,"periodic"), ... OverlapLength=samplesOverlap, ... FFTLength=fftLength, ... NumBands=numBands); title("Segment " + ceil(channel/2)) end
補助関数 HelperSegmentedMelSpectrograms
は、前述の特徴抽出手順を実行します。
処理を高速化するために、配列tall
を使用してデータストアに含まれるすべてのオーディオ ファイルのメル スペクトログラムを抽出します。インメモリ配列とは異なり、tall 配列は、関数gather
を使用して計算するよう要求するまで未評価のままになります。この延期された評価によって、大容量のデータセットを高速で処理することができます。gather
を使用して出力を最終的に要求するときに、MATLAB は、可能であればキューに入っている計算を結合して、データからパスの最小数を受け取ります。Parallel Computing Toolbox™ がある場合、ローカルの MATLAB セッションまたはローカルの並列プールで tall 配列を使用することができます。MATLAB® Parallel Server™ をインストールしている場合は、クラスター上で tall 配列の計算を実行することもできます。
Parallel Computing Toolbox™ がない場合でも、この例のコードは実行されます。
train_set_tall = tall(adsTrain); xTrain = cellfun(@(x)HelperSegmentedMelSpectrograms(x,fs, ... SegmentLength=segmentLength, ... SegmentOverlap=segmentOverlap, ... WindowLength=windowLength, ... HopLength=samplesPerHop, ... NumBands=numBands, ... FFTLength=fftLength), ... train_set_tall, ... UniformOutput=false); xTrain = gather(xTrain);
Evaluating tall expression using the Parallel Pool 'local': - Pass 1 of 1: 0% complete Evaluation 0% complete - Pass 1 of 1: Completed in 3 min 56 sec Evaluation completed in 3 min 56 sec
xTrain = cat(4,xTrain{:}); test_set_tall = tall(adsTest); xTest = cellfun(@(x)HelperSegmentedMelSpectrograms(x,fs, ... SegmentLength=segmentLength, ... SegmentOverlap=segmentOverlap, ... WindowLength=windowLength, ... HopLength=samplesPerHop, ... NumBands=numBands, ... FFTLength=fftLength), ... test_set_tall, ... UniformOutput=false); xTest = gather(xTest);
Evaluating tall expression using the Parallel Pool 'local': - Pass 1 of 1: Completed in 1 min 26 sec Evaluation completed in 1 min 26 sec
xTest = cat(4,xTest{:});
セグメントと 1 対 1 で対応するように、学習セットとテスト セットのラベルを複製します。
numSegmentsPer10seconds = size(dataBuffered,2)/2; yTrain = repmat(adsTrain.Labels,1,numSegmentsPer10seconds)'; yTrain = yTrain(:); yTest = repmat(adsTest.Labels,1,numSegmentsPer10seconds)'; yTest = yTest(:);
CNN 用のデータ拡張
DCASE 2017 データセットには、このタスク用に比較的少量の音響記録が含まれており、開発セットと評価セットはそれぞれ異なる特定の場所で録音されたものです。そのため、学習中にデータへの過適合が生じやすくなります。過適合を減らすためによく使われる方法の 1 つに、mixup があります。mixup では、2 つの異なるクラスの特徴を混合してデータセットを拡張します。特徴を混合する場合、それと同じ比率でラベルを混合します。次のようになります。
[2] では、mixup は混合されたラベルではなく、確率分布から抽出されたラベルとして再定式化されています。この例で使用する mixup の実装は、簡略化されたバージョンの mixup です。ここでは各スペクトログラムが異なるラベルをもつスペクトログラムと混合され、ラムダは 0.5 に設定されています。元のデータセットと混合されたデータセットが学習用に結合されます。
xTrainExtra = xTrain; yTrainExtra = yTrain; lambda = 0.5; for ii = 1:size(xTrain,4) % Find all available spectrograms with different labels. availableSpectrograms = find(yTrain~=yTrain(ii)); % Randomly choose one of the available spectrograms with a different label. numAvailableSpectrograms = numel(availableSpectrograms); idx = randi([1,numAvailableSpectrograms]); % Mix. xTrainExtra(:,:,:,ii) = lambda*xTrain(:,:,:,ii) + (1-lambda)*xTrain(:,:,:,availableSpectrograms(idx)); % Specify the label as randomly set by lambda. if rand > lambda yTrainExtra(ii) = yTrain(availableSpectrograms(idx)); end end xTrain = cat(4,xTrain,xTrainExtra); yTrain = [yTrain;yTrainExtra];
summary
を呼び出して、拡張された学習セットのラベルの分布を表示します。
summary(yTrain)
beach 11769 bus 11904 cafe/restaurant 11873 car 11820 city_center 11886 forest_path 11936 grocery_store 11914 home 11923 library 11817 metro_station 11804 office 11922 park 11871 residential_area 11704 train 11773 tram 11924
CNN の定義と学習
CNN アーキテクチャを定義します。このアーキテクチャは [1] に基づいており、試行錯誤によって変更が加えられます。MATLAB® で使用可能な深層学習層の詳細については、深層学習層の一覧を参照してください。
imgSize = [size(xTrain,1),size(xTrain,2),size(xTrain,3)]; numF = 32; layers = [ ... imageInputLayer(imgSize) batchNormalizationLayer convolution2dLayer(3,numF,Padding="same") batchNormalizationLayer reluLayer convolution2dLayer(3,numF,Padding="same") batchNormalizationLayer reluLayer maxPooling2dLayer(3,Stride=2,Padding="same") convolution2dLayer(3,2*numF,Padding="same") batchNormalizationLayer reluLayer convolution2dLayer(3,2*numF,Padding="same") batchNormalizationLayer reluLayer maxPooling2dLayer(3,Stride=2,Padding="same") convolution2dLayer(3,4*numF,Padding="same") batchNormalizationLayer reluLayer convolution2dLayer(3,4*numF,Padding="same") batchNormalizationLayer reluLayer maxPooling2dLayer(3,Stride=2,Padding="same") convolution2dLayer(3,8*numF,Padding="same") batchNormalizationLayer reluLayer convolution2dLayer(3,8*numF,Padding="same") batchNormalizationLayer reluLayer globalAveragePooling2dLayer dropoutLayer(0.5) fullyConnectedLayer(15) softmaxLayer classificationLayer];
CNN 用のtrainingOptions
を定義します。これらのオプションは [3] に基づいており、体系的なハイパーパラメーター最適化ワークフローによって変更が加えられます。
miniBatchSize = 128; tuneme = 128; lr = 0.05*miniBatchSize/tuneme; options = trainingOptions( ... "sgdm", ... Momentum=0.9, ... L2Regularization=0.005, ... ... MiniBatchSize=miniBatchSize, ... MaxEpochs=8, ... Shuffle="every-epoch", ... ... Plots="training-progress", ... Verbose=false, ... ... InitialLearnRate=lr, ... LearnRateSchedule="piecewise", ... LearnRateDropPeriod=2, ... LearnRateDropFactor=0.2, ... ... ValidationData={xTest,yTest}, ... ValidationFrequency=floor(size(xTrain,4)/miniBatchSize));
trainNetwork
を呼び出してネットワークに学習させます。
trainedNet = trainNetwork(xTrain,yTrain,layers,options);
CNN の評価
predict
を呼び出し、ホールドアウトされたテスト セットを使用して学習済みネットワークの応答を予測します。
cnnResponsesPerSegment = predict(trainedNet,xTest);
10 秒間の各オーディオ クリップにわたる応答を平均化します。
classes = trainedNet.Layers(end).Classes; numFiles = numel(adsTest.Files); counter = 1; cnnResponses = zeros(numFiles,numel(classes)); for channel = 1:numFiles cnnResponses(channel,:) = sum(cnnResponsesPerSegment(counter:counter+numSegmentsPer10seconds-1,:),1)/numSegmentsPer10seconds; counter = counter + numSegmentsPer10seconds; end
10 秒間の各オーディオ クリップについて、予測の最大値を選択し、対応する予測位置にマッピングします。
[~,classIdx] = max(cnnResponses,[],2); cnnPredictedLabels = classes(classIdx);
confusionchart
を呼び出して、テスト セットの精度を可視化します。
figure(Units="normalized",Position=[0.2 0.2 0.5 0.5]) confusionchart(adsTest.Labels,cnnPredictedLabels, ... title=["Test Accuracy - CNN","Average Accuracy = " + mean(adsTest.Labels==cnnPredictedLabels)*100], ... ColumnSummary="column-normalized",RowSummary="row-normalized");
アンサンブル分類器の特徴抽出
[4] では、ウェーブレット散乱が音響シーンの表現に優れていることが示されています。waveletScattering
(Wavelet Toolbox)オブジェクトを定義します。不変スケールと品質係数は、試行錯誤によって決定されています。
sf = waveletScattering(SignalLength=size(data,1), ... SamplingFrequency=fs, ... InvarianceScale=0.75, ... QualityFactors=[4 1]);
オーディオ信号をモノラルに変換します。次にfeatureMatrix
(Wavelet Toolbox)を呼び出して、散乱分解フレームワーク sf
の散乱係数を返します。
dataMono = mean(data,2);
scatteringCoeffients = featureMatrix(sf,dataMono,Transform="log");
10 秒間のオーディオ クリップにわたる散乱係数を平均化します。
featureVector = mean(scatteringCoeffients,2);
disp("Number of wavelet features per 10-second clip = " + numel(featureVector));
Number of wavelet features per 10-second clip = 286
補助関数 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')';
アンサンブル分類器の定義と学習
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)));
アンサンブル分類器の評価
10 秒間の各オーディオ クリップについて、predict
を呼び出してラベルと重みを返し、これを対応する予測位置にマッピングします。confusionchart
を呼び出して、テスト セットの精度を可視化します。
[waveletPredictedLabels,waveletResponses] = predict(classificationEnsemble,xTest); figure(Units="normalized",Position=[0.2 0.2 0.5 0.5]) confusionchart(adsTest.Labels,waveletPredictedLabels, ... title=["Test Accuracy - Wavelet Scattering","Average Accuracy = " + mean(adsTest.Labels==waveletPredictedLabels)*100], ... ColumnSummary="column-normalized",RowSummary="row-normalized");
fprintf('Average accuracy of classifier = %0.2f\n',mean(adsTest.Labels==waveletPredictedLabels)*100)
Average accuracy of classifier = 75.74
後期融合の適用
10 秒間の各クリップについて、ウェーブレット分類器と CNN に対して predict
を呼び出すと、その判定の相対的な信頼度を表すベクトルが返されます。waveletResponses
と cnnResponses
を乗算し、後期融合システムを作成します。
fused = waveletResponses.*cnnResponses; [~,classIdx] = max(fused,[],2); predictedLabels = classes(classIdx);
後期融合の評価
confusionchart
を呼び出して、融合された分類の精度を可視化します。
figure(Units="normalized",Position=[0.2 0.2 0.5 0.5]) confusionchart(adsTest.Labels,predictedLabels, ... Title=["Test Accuracy - Fusion","Average Accuracy = " + mean(adsTest.Labels==predictedLabels)*100], ... ColumnSummary="column-normalized",RowSummary="row-normalized");
サポート関数
HelperSegmentedMelSpectrograms
function X = HelperSegmentedMelSpectrograms(x,fs,varargin) % Copyright 2019-2021 The MathWorks, Inc. p = inputParser; addParameter(p,WindowLength=1024); addParameter(p,HopLength=512); addParameter(p,NumBands=128); addParameter(p,SegmentLength=1); addParameter(p,SegmentOverlap=0); addParameter(p,FFTLength=1024); parse(p,varargin{:}) params = p.Results; x = [sum(x,2),x(:,1)-x(:,2)]; x = x./max(max(x)); [xb_m,~] = buffer(x(:,1),round(params.SegmentLength*fs),round(params.SegmentOverlap*fs),"nodelay"); [xb_s,~] = buffer(x(:,2),round(params.SegmentLength*fs),round(params.SegmentOverlap*fs),"nodelay"); xb = zeros(size(xb_m,1),size(xb_m,2)+size(xb_s,2)); xb(:,1:2:end) = xb_m; xb(:,2:2:end) = xb_s; spec = melSpectrogram(xb,fs, ... Window=hamming(params.WindowLength,"periodic"), ... OverlapLength=params.WindowLength - params.HopLength, ... FFTLength=params.FFTLength, ... NumBands=params.NumBands, ... FrequencyRange=[0,floor(fs/2)]); spec = log10(spec+eps); X = reshape(spec,size(spec,1),size(spec,2),size(x,2),[]); end
HelperWaveletFeatureExtractor
function features = HelperWaveletFeatureVector(x,sf) % Copyright 2019-2021 The MathWorks, Inc. x = mean(x,2); features = featureMatrix(sf,x,Transform="log"); features = mean(features,2); end
参考文献
[1] A. Mesaros, T. Heittola, and T. Virtanen. Acoustic Scene Classification: an Overview of DCASE 2017 Challenge Entries. In proc. International Workshop on Acoustic Signal Enhancement, 2018.
[2] Huszar, Ferenc. "Mixup: Data-Dependent Data Augmentation." InFERENCe. November 03, 2017.Accessed January 15, 2019. https://www.inference.vc/mixup-data-dependent-data-augmentation/.
[3] Han, Yoonchang, Jeongsoo Park, and Kyogu Lee. "Convolutional neural networks with binaural representations and background subtraction for acoustic scene classification." the Detection and Classification of Acoustic Scenes and Events (DCASE) (2017): 1-5.
[4] Lostanlen, Vincent, and Joakim Anden. Binaural scene classification with wavelet scattering. Technical Report, DCASE2016 Challenge, 2016.
[5] A. J. Eronen, V. T. Peltonen, J. T. Tuomi, A. P. Klapuri, S. Fagerlund, T. Sorsa, G. Lorho, and J. Huopaniemi, "Audio-based context recognition," IEEE Trans. on Audio, Speech, and Language Processing, vol 14, no. 1, pp. 321-329, Jan 2006.
参考
trainNetwork
| trainingOptions
| classify
| layerGraph
| batchNormalizationLayer
| convolution2dLayer