Нейронная сеть VGGish
В этом примере используются:
Загрузите и распакуйте модель Audio Toolbox™ для VGGish.
Напечатать vggish в окне команд. Если модель Audio Toolbox для VGGish не установлена, то функция предоставляет ссылку на расположение весов сети. Чтобы загрузить модель, щелкните ссылку. Распакуйте файл в папку по пути MATLAB.
Либо выполните эти команды для загрузки и распаковки модели VGGish во временный каталог.
downloadFolder = fullfile(tempdir,'VGGishDownload'); loc = websave(downloadFolder,'https://ssd.mathworks.com/supportfiles/audio/vggish.zip'); VGGishLocation = tempdir; unzip(loc,VGGishLocation) addpath(fullfile(VGGishLocation,'vggish'))
Убедитесь, что установка выполнена успешно, введя vggish в окне команд. Если сеть установлена, то функция возвращает SeriesNetwork(Панель инструментов глубокого обучения).
vggish
ans =
SeriesNetwork with properties:
Layers: [24×1 nnet.cnn.layer.Layer]
InputNames: {'InputBatch'}
OutputNames: {'regressionoutput'}
В этом примере используются:
Загрузите предварительно обученную сверточную нейронную сеть VGGish и изучите слои и классы.
Использовать vggish для загрузки предварительно обученной сети VGGish. Продукция net является SeriesNetwork(Панель инструментов глубокого обучения).
net = vggish
net =
SeriesNetwork with properties:
Layers: [24×1 nnet.cnn.layer.Layer]
InputNames: {'InputBatch'}
OutputNames: {'regressionoutput'}
Просмотр сетевой архитектуры с помощью Layers собственность. Сеть имеет 24 уровня. Существует девять слоев с обучаемыми весами, из которых шесть являются сверточными слоями и три являются полностью соединенными слоями.
net.Layers
ans =
24×1 Layer array with layers:
1 'InputBatch' Image Input 96×64×1 images
2 'conv1' Convolution 64 3×3×1 convolutions with stride [1 1] and padding 'same'
3 'relu' ReLU ReLU
4 'pool1' Max Pooling 2×2 max pooling with stride [2 2] and padding 'same'
5 'conv2' Convolution 128 3×3×64 convolutions with stride [1 1] and padding 'same'
6 'relu2' ReLU ReLU
7 'pool2' Max Pooling 2×2 max pooling with stride [2 2] and padding 'same'
8 'conv3_1' Convolution 256 3×3×128 convolutions with stride [1 1] and padding 'same'
9 'relu3_1' ReLU ReLU
10 'conv3_2' Convolution 256 3×3×256 convolutions with stride [1 1] and padding 'same'
11 'relu3_2' ReLU ReLU
12 'pool3' Max Pooling 2×2 max pooling with stride [2 2] and padding 'same'
13 'conv4_1' Convolution 512 3×3×256 convolutions with stride [1 1] and padding 'same'
14 'relu4_1' ReLU ReLU
15 'conv4_2' Convolution 512 3×3×512 convolutions with stride [1 1] and padding 'same'
16 'relu4_2' ReLU ReLU
17 'pool4' Max Pooling 2×2 max pooling with stride [2 2] and padding 'same'
18 'fc1_1' Fully Connected 4096 fully connected layer
19 'relu5_1' ReLU ReLU
20 'fc1_2' Fully Connected 4096 fully connected layer
21 'relu5_2' ReLU ReLU
22 'fc2' Fully Connected 128 fully connected layer
23 'EmbeddingBatch' ReLU ReLU
24 'regressionoutput' Regression Output mean-squared-error
Использовать analyzeNetwork (Deep Learning Toolbox) для визуального изучения сети.
analyzeNetwork(net)

В этом примере используются:
Сеть VGGish требует предварительной обработки и извлечения функций из аудиосигналов путем преобразования их в частоту выборки, на которой была обучена сеть, а затем извлечения логарифмических спектрограмм. В этом примере рассматривается требуемая предварительная обработка и извлечение элементов в соответствии с предварительной обработкой и извлечением элементов, используемыми для обучения VGGish. vggishFeatures функция выполняет эти шаги для вас.
Считывание аудиосигнала для классификации. Выполните повторную выборку звукового сигнала до 16 кГц, а затем преобразуйте его в единичную точность.
[audioIn,fs0] = audioread(
'Ambiance-16-44p1-mono-12secs.wav');
fs = 16e3;
audioIn = resample(audioIn,fs,fs0);
audioIn = single(audioIn);Определите параметры спектрограммы mel и извлеките элементы с помощью melSpectrogram функция.
FFTLength = 512; numBands = 64; frequencyRange = [125 7500]; windowLength = 0.025*fs; overlapLength = 0.015*fs; melSpect = melSpectrogram(audioIn,fs, ... 'Window',hann(windowLength,'periodic'), ... 'OverlapLength',overlapLength, ... 'FFTLength',FFTLength, ... 'FrequencyRange',frequencyRange, ... 'NumBands',numBands, ... 'FilterBankNormalization','none', ... 'WindowNormalization',false, ... 'SpectrumType','magnitude', ... 'FilterBankDesignDomain','warped');
Преобразование спектрограммы в логарифмическую шкалу.
melSpect = log(melSpect + single(0.001));
Переориентируйте спектрограмму mel так, чтобы время было вдоль первого размера в виде строк.
melSpect = melSpect.'; [numSTFTWindows,numBands] = size(melSpect)
numSTFTWindows = 1222
numBands = 64
Разбейте спектрограмму на кадры длиной 96 с перекрытием 48. Разместите рамки вдоль четвертого размера.
frameWindowLength = 96; frameOverlapLength = 48; hopLength = frameWindowLength - frameOverlapLength; numHops = floor((numSTFTWindows - frameWindowLength)/hopLength) + 1; frames = zeros(frameWindowLength,numBands,1,numHops,'like',melSpect); for hop = 1:numHops range = 1 + hopLength*(hop-1):hopLength*(hop - 1) + frameWindowLength; frames(:,:,1,hop) = melSpect(range,:); end
Создайте сеть VGGish.
net = vggish;
Звонить predict для извлечения вложенных элементов из изображений спектрограммы. Вложение элемента возвращается как numFrames-by-128 матрица, где numFrames - количество отдельных спектрограмм, а 128 - число элементов в каждом векторе признаков.
features = predict(net,frames); [numFrames,numFeatures] = size(features)
numFrames = 24
numFeatures = 128
Сравните визуализации спектрограммы mel и встраивания функций VGGish.
melSpectrogram(audioIn,fs, ... 'Window',hann(windowLength,'periodic'), ... 'OverlapLength',overlapLength, ... 'FFTLength',FFTLength, ... 'FrequencyRange',frequencyRange, ... 'NumBands',numBands, ... 'FilterBankNormalization','none', ... 'WindowNormalization',false, ... 'SpectrumType','magnitude', ... 'FilterBankDesignDomain','warped');

surf(features,'EdgeColor','none') view([90,-90]) axis([1 numFeatures 1 numFrames]) xlabel('Feature') ylabel('Frame') title('VGGish Feature Embeddings')

В этом примере используются:
В этом примере выполняется перенос обучения в регрессионной модели VGGish в задачу классификации звука.
Загрузите и распакуйте набор данных классификации экологического звука. Этот набор данных состоит из записей, помеченных как один из 10 различных классов звука (ESC-10).
url = 'http://ssd.mathworks.com/supportfiles/audio/ESC-10.zip'; downloadFolder = fullfile(tempdir,'ESC-10'); datasetLocation = tempdir; if ~exist(fullfile(tempdir,'ESC-10'),'dir') loc = websave(downloadFolder,url); unzip(loc,fullfile(tempdir,'ESC-10')) end
Создание audioDatastore объект для управления данными и их разделения на группы и наборы проверки. Звонить countEachLabel для отображения распределения классов звука и количества уникальных меток.
ads = audioDatastore(downloadFolder,'IncludeSubfolders',true,'LabelSource','foldernames'); labelTable = countEachLabel(ads)
labelTable=10×2 table
Label Count
______________ _____
chainsaw 40
clock_tick 40
crackling_fire 40
crying_baby 40
dog 40
helicopter 40
rain 40
rooster 38
sea_waves 40
sneezing 40
Определите общее количество классов.
numClasses = size(labelTable,1);
Звонить splitEachLabel для разделения набора данных на наборы обучения и проверки. Проверьте распределение меток в наборах обучения и проверки.
[adsTrain, adsValidation] = splitEachLabel(ads,0.8); countEachLabel(adsTrain)
ans=10×2 table
Label Count
______________ _____
chainsaw 32
clock_tick 32
crackling_fire 32
crying_baby 32
dog 32
helicopter 32
rain 32
rooster 30
sea_waves 32
sneezing 32
countEachLabel(adsValidation)
ans=10×2 table
Label Count
______________ _____
chainsaw 8
clock_tick 8
crackling_fire 8
crying_baby 8
dog 8
helicopter 8
rain 8
rooster 8
sea_waves 8
sneezing 8
Сеть VGGish ожидает предварительной обработки звука в спектрограммах log mel. Вспомогательная функция vggishPreprocess принимает audioDatastore объект и процент перекрытия между логарифмическими спектрограммами в качестве входных данных и возвращает матрицы предикторов и откликов, подходящие в качестве входных данных для сети VGGish.
overlapPercentage =
75;
[trainFeatures,trainLabels] = vggishPreprocess(adsTrain,overlapPercentage);
[validationFeatures,validationLabels,segmentsPerFile] = vggishPreprocess(adsValidation,overlapPercentage);Загрузите модель VGGish и преобразуйте ее в layerGraph(Панель инструментов глубокого обучения).
net = vggish; lgraph = layerGraph(net.Layers);
Использовать removeLayers (Deep Learning Toolbox) для удаления конечного выходного слоя регрессии из графика. После удаления регрессионного слоя новым конечным слоем графа является слой ReLU с именем 'EmbeddingBatch'.
lgraph = removeLayers(lgraph,'regressionoutput');
lgraph.Layers(end)ans =
ReLULayer with properties:
Name: 'EmbeddingBatch'
Использовать addLayers(Панель инструментов глубокого обучения) для добавления fullyConnectedLayer (инструментарий глубокого обучения), softmaxLayer (инструментарий глубокого обучения) и classificationLayer (Deep Learning Toolbox) на графике.
lgraph = addLayers(lgraph,fullyConnectedLayer(numClasses,'Name','FCFinal')); lgraph = addLayers(lgraph,softmaxLayer('Name','softmax')); lgraph = addLayers(lgraph,classificationLayer('Name','classOut'));
Использовать connectLayers (Deep Learning Toolbox) для добавления к графу слоев полностью соединенных слоев, слоев softmax и слоев классификации.
lgraph = connectLayers(lgraph,'EmbeddingBatch','FCFinal'); lgraph = connectLayers(lgraph,'FCFinal','softmax'); lgraph = connectLayers(lgraph,'softmax','classOut');
Для определения вариантов обучения используйте trainingOptions (инструментарий глубокого обучения).
miniBatchSize = 128; options = trainingOptions('adam', ... 'MaxEpochs',5, ... 'MiniBatchSize',miniBatchSize, ... 'Shuffle','every-epoch', ... 'ValidationData',{validationFeatures,validationLabels}, ... 'ValidationFrequency',50, ... 'LearnRateSchedule','piecewise', ... 'LearnRateDropFactor',0.5, ... 'LearnRateDropPeriod',2);
Для обучения сети используйте trainNetwork (инструментарий глубокого обучения).
[trainedNet, netInfo] = trainNetwork(trainFeatures,trainLabels,lgraph,options);
Training on single GPU. |======================================================================================================================| | Epoch | Iteration | Time Elapsed | Mini-batch | Validation | Mini-batch | Validation | Base Learning | | | | (hh:mm:ss) | Accuracy | Accuracy | Loss | Loss | Rate | |======================================================================================================================| | 1 | 1 | 00:00:00 | 10.94% | 26.03% | 2.2253 | 2.0317 | 0.0010 | | 2 | 50 | 00:00:05 | 93.75% | 83.75% | 0.1884 | 0.7001 | 0.0010 | | 3 | 100 | 00:00:10 | 96.88% | 80.07% | 0.1150 | 0.7838 | 0.0005 | | 4 | 150 | 00:00:15 | 92.97% | 81.99% | 0.1656 | 0.7612 | 0.0005 | | 5 | 200 | 00:00:20 | 92.19% | 79.04% | 0.1738 | 0.8192 | 0.0003 | | 5 | 210 | 00:00:21 | 95.31% | 80.15% | 0.1389 | 0.8581 | 0.0003 | |======================================================================================================================|
Каждый аудиофайл был разделён на несколько сегментов для подачи в сеть VGGish. Объедините прогнозы для каждого файла в наборе проверки с помощью решения мажоритарного правила.
validationPredictions = classify(trainedNet,validationFeatures); idx = 1; validationPredictionsPerFile = categorical; for ii = 1:numel(adsValidation.Files) validationPredictionsPerFile(ii,1) = mode(validationPredictions(idx:idx+segmentsPerFile(ii)-1)); idx = idx + segmentsPerFile(ii); end
Использовать confusionchart (Deep Learning Toolbox) для оценки производительности сети в наборе проверки.
figure('Units','normalized','Position',[0.2 0.2 0.5 0.5]); cm = confusionchart(adsValidation.Labels,validationPredictionsPerFile); cm.Title = sprintf('Confusion Matrix for Validation Data \nAccuracy = %0.2f %%',mean(validationPredictionsPerFile==adsValidation.Labels)*100); cm.ColumnSummary = 'column-normalized'; cm.RowSummary = 'row-normalized';

Вспомогательные функции
function [predictor,response,segmentsPerFile] = vggishPreprocess(ads,overlap) % This function is for example purposes only and may be changed or removed % in a future release. % Create filter bank FFTLength = 512; numBands = 64; fs0 = 16e3; filterBank = designAuditoryFilterBank(fs0, ... 'FrequencyScale','mel', ... 'FFTLength',FFTLength, ... 'FrequencyRange',[125 7500], ... 'NumBands',numBands, ... 'Normalization','none', ... 'FilterBankDesignDomain','warped'); % Define STFT parameters windowLength = 0.025 * fs0; hopLength = 0.01 * fs0; win = hann(windowLength,'periodic'); % Define spectrogram segmentation parameters segmentDuration = 0.96; % seconds segmentRate = 100; % hertz segmentLength = segmentDuration*segmentRate; % Number of spectrums per auditory spectrograms segmentHopDuration = (100-overlap) * segmentDuration / 100; % Duration (s) advanced between auditory spectrograms segmentHopLength = round(segmentHopDuration * segmentRate); % Number of spectrums advanced between auditory spectrograms % Preallocate cell arrays for the predictors and responses numFiles = numel(ads.Files); predictor = cell(numFiles,1); response = predictor; segmentsPerFile = zeros(numFiles,1); % Extract predictors and responses for each file for ii = 1:numFiles [audioIn,info] = read(ads); x = single(resample(audioIn,fs0,info.SampleRate)); Y = stft(x, ... 'Window',win, ... 'OverlapLength',windowLength-hopLength, ... 'FFTLength',FFTLength, ... 'FrequencyRange','onesided'); Y = abs(Y); logMelSpectrogram = log(filterBank*Y + single(0.01))'; % Segment log-mel spectrogram numHops = floor((size(Y,2)-segmentLength)/segmentHopLength) + 1; segmentedLogMelSpectrogram = zeros(segmentLength,numBands,1,numHops); for hop = 1:numHops segmentedLogMelSpectrogram(:,:,1,hop) = logMelSpectrogram(1+segmentHopLength*(hop-1):segmentLength+segmentHopLength*(hop-1),:); end predictor{ii} = segmentedLogMelSpectrogram; response{ii} = repelem(info.Label,numHops); segmentsPerFile(ii) = numHops; end % Concatenate predictors and responses into arrays predictor = cat(4,predictor{:}); response = cat(2,response{:}); end
net - Предварительно обученная нейронная сеть VGGishSeriesNetwork объектПодготовленная нейронная сеть VGGish, возвращенная в качестве SeriesNetwork(Панель инструментов глубокого обучения).
[1] Геммеке, Йорт Ф., Даниэль В. Эллис, Дилан Фридман, Арен Янсен, Уэйд Лоуренс, Р. Ченнинг Мур, Манодж Плакал и Марвин Риттер. 2017. «Аудиозапись: онтология и набор данных, помеченных человеком, для аудиовыходов». В 2017 году IEEE Международная конференция по акустике, обработке речи и сигналов (ICASSP), 776-80. Новый Орлеан, ЛА: IEEE. https://doi.org/10.1109/ICASSP.2017.7952261.
[2] Херши, Шон, Суриш Чаудхури, Даниэль В. Эллис, Йорт Ф. Геммеке, Арен Янсен, Р. Ченнинг Мур, Манодж Плакал и др. 2017. «Архитектуры CNN для крупномасштабной классификации звука». В 2017 году IEEE Международная конференция по акустике, обработке речи и сигналов (ICASSP), 131-35. Новый Орлеан, ЛА: IEEE. https://doi.org/10.1109/ICASSP.2017.7952132.
Примечания и ограничения по использованию:
Только activations и predict поддерживаются функции объекта.
Создание SeriesNetwork для создания кода см. раздел Загрузка предварительно подготовленных сетей для создания кода (кодер MATLAB).
Примечания и ограничения по использованию:
Только activations, classify, predict, predictAndUpdateState, и resetState поддерживаются функции объекта.
Создание SeriesNetwork для создания кода см. раздел Загрузка предварительно подготовленных сетей для создания кода (кодер GPU).
audioFeatureExtractor | classifySound | melSpectrogram | vggishFeatures | vggishPreprocess
Имеется измененная версия этого примера. Открыть этот пример с помощью изменений?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.