В этом примере показано, как классифицировать звук с помощью процессов глубокого обучения.
Генерирует 1000 сигналов белого шума, 1000 сигналов коричневого шума и 1000 сигналов розового шума. Каждый сигнал представляет длительность 0,5 секунды, принимая частоту дискретизации 44,1 кГц.
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);
Прослушайте белый сигнал шума и визуализируйте его с помощью melSpectrogram
function
.
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')
Создайте набор обучающих данных, которая состоит из 800 сигналов белого шума, 800 сигналов коричневого шума и 800 сигналов розового шума.
audioTrain = [wNoise(:,1:800),bNoise(:,1:800),pNoise(:,1:800)]; labelsTrain = [wLabels(1:800);bLabels(1:800);pLabels(1:800)];
Создайте набор валидации, используя оставшиеся 200 сигналов белого шума, 200 сигналов коричневого шума и 200 сигналов розового шума.
audioValidation = [wNoise(:,801:end),bNoise(:,801:end),pNoise(:,801:end)]; labelsValidation = [wLabels(801:end);bLabels(801:end);pLabels(801:end)];
Аудио данных имеет высокую размерность и обычно содержит избыточную информацию. Можно уменьшить размерность, сначала извлечение функции, а затем обучив модель с помощью извлечённых функций. Создайте audioFeatureExtractor
объект для извлечения центроида и наклона мел спектра с течением времени.
aFE = audioFeatureExtractor("SampleRate",fs, ... "SpectralDescriptorInput","melSpectrum", ... "spectralCentroid",true, ... "spectralSlope",true);
Вызов извлечения, чтобы извлечь функции из аудио обучающих данных.
featuresTrain = extract(aFE,audioTrain); [numHopsPerSequence,numFeatures,numSignals] = size(featuresTrain)
numHopsPerSequence = 42
numFeatures = 2
numSignals = 2400
На следующем этапе вы будете обрабатывать извлечённые функции как последовательности и использовать sequenceInputLayer
как первый слой вашей модели глубокого обучения. Когда вы используете sequenceInputLayer
как первый слой в сети, trainNetwork
ожидает, что данные обучения и валидации будут форматированы в массивах ячеек последовательностей, где каждая последовательность со временем состоит из векторов функций. sequenceInputLayer
требуется время, размерность вдоль второго измерения.
featuresTrain = permute(featuresTrain,[2,1,3]); featuresTrain = squeeze(num2cell(featuresTrain,[1,2])); numSignals = numel(featuresTrain)
numSignals = 2400
[numFeatures,numHopsPerSequence] = size(featuresTrain{1})
numFeatures = 2
numHopsPerSequence = 42
Извлеките функции валидации.
featuresValidation = extract(aFE,audioValidation); featuresValidation = permute(featuresValidation,[2,1,3]); featuresValidation = squeeze(num2cell(featuresValidation,[1,2]));
Определите сетевую архитектуру. Для получения дополнительной информации смотрите Список слоев глубокого обучения (Deep Learning Toolbox).
layers = [ ... sequenceInputLayer(numFeatures) lstmLayer(50,"OutputMode","last") fullyConnectedLayer(numel(unique(labelsTrain))) softmaxLayer classificationLayer];
Чтобы определить опции обучения, используйте trainingOptions
(Deep Learning Toolbox).
options = trainingOptions("adam", ... "Shuffle","every-epoch", ... "ValidationData",{featuresValidation,labelsValidation}, ... "Plots","training-progress", ... "Verbose",false);
Для обучения сети используйте trainNetwork
(Deep Learning Toolbox).
net = trainNetwork(featuresTrain,labelsTrain,layers,options);
Используйте обученную сеть для классификации новых сигналов белого шума, коричневого шума и розового шума.
wNoiseTest = 2*rand([N,1]) - 1; classify(net,extract(aFE,wNoiseTest)')
ans = categorical
white
bNoiseTest = filter(1,[1,-0.999],wNoiseTest);
bNoiseTest= bNoiseTest./max(abs(bNoiseTest),[],'all');
classify(net,extract(aFE,bNoiseTest)')
ans = categorical
brown
pNoiseTest = pinknoise(N); classify(net,extract(aFE,pNoiseTest)')
ans = categorical
pink
Audio Labeler | audioDataAugmenter
| audioDatastore
| audioFeatureExtractor