В этом примере показано, как классифицировать звук при помощи процессов глубокого обучения.
Сгенерируйте 1 000 белых шумовых сигналов, 1 000 коричневых шумовых сигналов и 1 000 розовых шумовых сигналов. Каждый сигнал представляет длительность 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
возразите, чтобы извлекать центроид и наклон mel спектра в зависимости от времени.
aFE = audioFeatureExtractor("SampleRate",fs, ... "SpectralDescriptorInput","melSpectrum", ... "spectralCentroid",true, ... "spectralSlope",true);
Вызовите extract
извлекать функции из аудио обучающих данных.
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
.
options = trainingOptions("adam", ... "Shuffle","every-epoch", ... "ValidationData",{featuresValidation,labelsValidation}, ... "Plots","training-progress", ... "Verbose",false);
Чтобы обучить сеть, используйте trainNetwork
.
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