Классифицируйте звук Используя глубокое обучение

В этом примере показано, как классифицировать звук при помощи процессов глубокого обучения.

Создайте набор данных

Сгенерируйте 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);

Вызовите извлечение, чтобы извлечь функции из аудио обучающих данных.

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 

Смотрите также

| | |

Похожие темы