Нейронная сеть YAMNet
В этом примере используются:
Загрузите и распакуйте модель Audio Toolbox™ для YAMNet.
Напечатать yamnet в окне команд. Если модель Audio Toolbox для YAMNet не установлена, то функция предоставляет ссылку на расположение весов сети. Чтобы загрузить модель, щелкните ссылку. Распакуйте файл в папку по пути MATLAB.
Либо выполните следующие команды для загрузки и распаковки модели YAMNet во временную папку.
downloadFolder = fullfile(tempdir,'YAMNetDownload'); loc = websave(downloadFolder,'https://ssd.mathworks.com/supportfiles/audio/yamnet.zip'); YAMNetLocation = tempdir; unzip(loc,YAMNetLocation) addpath(fullfile(YAMNetLocation,'yamnet'))
Убедитесь, что установка выполнена успешно, введя yamnet в окне команд. Если сеть установлена, то функция возвращает SeriesNetwork(Панель инструментов глубокого обучения).
yamnet
ans =
SeriesNetwork with properties:
Layers: [86×1 nnet.cnn.layer.Layer]
InputNames: {'input_1'}
OutputNames: {'Sound'}
В этом примере используются:
Загрузите предварительно обученную сверточную нейронную сеть YAMNet и изучите слои и классы.
Использовать yamnet для загрузки предварительно обученной сети YAMNet. Выходная сетка представляет собой SeriesNetwork(Панель инструментов глубокого обучения).
net = yamnet
net =
SeriesNetwork with properties:
Layers: [86×1 nnet.cnn.layer.Layer]
InputNames: {'input_1'}
OutputNames: {'Sound'}
Просмотр сетевой архитектуры с помощью Layers собственность. Сеть насчитывает 86 уровней. Существует 28 слоев с обучаемыми весами: 27 сверточных слоев и 1 полностью связанный слой.
net.Layers
ans =
86x1 Layer array with layers:
1 'input_1' Image Input 96×64×1 images
2 'conv2d' Convolution 32 3×3×1 convolutions with stride [2 2] and padding 'same'
3 'b' Batch Normalization Batch normalization with 32 channels
4 'activation' ReLU ReLU
5 'depthwise_conv2d' Grouped Convolution 32 groups of 1 3×3×1 convolutions with stride [1 1] and padding 'same'
6 'L11' Batch Normalization Batch normalization with 32 channels
7 'activation_1' ReLU ReLU
8 'conv2d_1' Convolution 64 1×1×32 convolutions with stride [1 1] and padding 'same'
9 'L12' Batch Normalization Batch normalization with 64 channels
10 'activation_2' ReLU ReLU
11 'depthwise_conv2d_1' Grouped Convolution 64 groups of 1 3×3×1 convolutions with stride [2 2] and padding 'same'
12 'L21' Batch Normalization Batch normalization with 64 channels
13 'activation_3' ReLU ReLU
14 'conv2d_2' Convolution 128 1×1×64 convolutions with stride [1 1] and padding 'same'
15 'L22' Batch Normalization Batch normalization with 128 channels
16 'activation_4' ReLU ReLU
17 'depthwise_conv2d_2' Grouped Convolution 128 groups of 1 3×3×1 convolutions with stride [1 1] and padding 'same'
18 'L31' Batch Normalization Batch normalization with 128 channels
19 'activation_5' ReLU ReLU
20 'conv2d_3' Convolution 128 1×1×128 convolutions with stride [1 1] and padding 'same'
21 'L32' Batch Normalization Batch normalization with 128 channels
22 'activation_6' ReLU ReLU
23 'depthwise_conv2d_3' Grouped Convolution 128 groups of 1 3×3×1 convolutions with stride [2 2] and padding 'same'
24 'L41' Batch Normalization Batch normalization with 128 channels
25 'activation_7' ReLU ReLU
26 'conv2d_4' Convolution 256 1×1×128 convolutions with stride [1 1] and padding 'same'
27 'L42' Batch Normalization Batch normalization with 256 channels
28 'activation_8' ReLU ReLU
29 'depthwise_conv2d_4' Grouped Convolution 256 groups of 1 3×3×1 convolutions with stride [1 1] and padding 'same'
30 'L51' Batch Normalization Batch normalization with 256 channels
31 'activation_9' ReLU ReLU
32 'conv2d_5' Convolution 256 1×1×256 convolutions with stride [1 1] and padding 'same'
33 'L52' Batch Normalization Batch normalization with 256 channels
34 'activation_10' ReLU ReLU
35 'depthwise_conv2d_5' Grouped Convolution 256 groups of 1 3×3×1 convolutions with stride [2 2] and padding 'same'
36 'L61' Batch Normalization Batch normalization with 256 channels
37 'activation_11' ReLU ReLU
38 'conv2d_6' Convolution 512 1×1×256 convolutions with stride [1 1] and padding 'same'
39 'L62' Batch Normalization Batch normalization with 512 channels
40 'activation_12' ReLU ReLU
41 'depthwise_conv2d_6' Grouped Convolution 512 groups of 1 3×3×1 convolutions with stride [1 1] and padding 'same'
42 'L71' Batch Normalization Batch normalization with 512 channels
43 'activation_13' ReLU ReLU
44 'conv2d_7' Convolution 512 1×1×512 convolutions with stride [1 1] and padding 'same'
45 'L72' Batch Normalization Batch normalization with 512 channels
46 'activation_14' ReLU ReLU
47 'depthwise_conv2d_7' Grouped Convolution 512 groups of 1 3×3×1 convolutions with stride [1 1] and padding 'same'
48 'L81' Batch Normalization Batch normalization with 512 channels
49 'activation_15' ReLU ReLU
50 'conv2d_8' Convolution 512 1×1×512 convolutions with stride [1 1] and padding 'same'
51 'L82' Batch Normalization Batch normalization with 512 channels
52 'activation_16' ReLU ReLU
53 'depthwise_conv2d_8' Grouped Convolution 512 groups of 1 3×3×1 convolutions with stride [1 1] and padding 'same'
54 'L91' Batch Normalization Batch normalization with 512 channels
55 'activation_17' ReLU ReLU
56 'conv2d_9' Convolution 512 1×1×512 convolutions with stride [1 1] and padding 'same'
57 'L92' Batch Normalization Batch normalization with 512 channels
58 'activation_18' ReLU ReLU
59 'depthwise_conv2d_9' Grouped Convolution 512 groups of 1 3×3×1 convolutions with stride [1 1] and padding 'same'
60 'L101' Batch Normalization Batch normalization with 512 channels
61 'activation_19' ReLU ReLU
62 'conv2d_10' Convolution 512 1×1×512 convolutions with stride [1 1] and padding 'same'
63 'L102' Batch Normalization Batch normalization with 512 channels
64 'activation_20' ReLU ReLU
65 'depthwise_conv2d_10' Grouped Convolution 512 groups of 1 3×3×1 convolutions with stride [1 1] and padding 'same'
66 'L111' Batch Normalization Batch normalization with 512 channels
67 'activation_21' ReLU ReLU
68 'conv2d_11' Convolution 512 1×1×512 convolutions with stride [1 1] and padding 'same'
69 'L112' Batch Normalization Batch normalization with 512 channels
70 'activation_22' ReLU ReLU
71 'depthwise_conv2d_11' Grouped Convolution 512 groups of 1 3×3×1 convolutions with stride [2 2] and padding 'same'
72 'L121' Batch Normalization Batch normalization with 512 channels
73 'activation_23' ReLU ReLU
74 'conv2d_12' Convolution 1024 1×1×512 convolutions with stride [1 1] and padding 'same'
75 'L122' Batch Normalization Batch normalization with 1024 channels
76 'activation_24' ReLU ReLU
77 'depthwise_conv2d_12' Grouped Convolution 1024 groups of 1 3×3×1 convolutions with stride [1 1] and padding 'same'
78 'L131' Batch Normalization Batch normalization with 1024 channels
79 'activation_25' ReLU ReLU
80 'conv2d_13' Convolution 1024 1×1×1024 convolutions with stride [1 1] and padding 'same'
81 'L132' Batch Normalization Batch normalization with 1024 channels
82 'activation_26' ReLU ReLU
83 'global_average_pooling2d' Global Average Pooling Global average pooling
84 'dense' Fully Connected 521 fully connected layer
85 'softmax' Softmax softmax
86 'Sound' Classification Output crossentropyex with 'Speech' and 520 other classes
Для просмотра имен классов, полученных сетью, можно просмотреть Classes свойство выходного уровня классификации (конечный уровень). Просмотрите первые 10 классов, указав первые 10 элементов.
net.Layers(end).Classes(1:10)
ans = 10×1 categorical
Speech
Child speech, kid speaking
Conversation
Narration, monologue
Babbling
Speech synthesizer
Shout
Bellow
Whoop
Yell
Использовать analyzeNetwork (Deep Learning Toolbox) для визуального изучения сети.
analyzeNetwork(net)

YAMNet был выпущен с соответствующей онтологией звукового класса, которую можно исследовать с помощью yamnetGraph объект.
ygraph = yamnetGraph;
p = plot(ygraph);
layout(p,'layered')
Граф онтологии строит график всех 521 возможных классов звука. Постройте подграф звуков, связанных с дыхательными звуками.
allRespiratorySounds = dfsearch(ygraph,"Respiratory sounds");
ygraphSpeech = subgraph(ygraph,allRespiratorySounds);
plot(ygraphSpeech)
В этом примере используются:
Сеть YAMNet требует предварительной обработки и извлечения функций из аудиосигналов путем преобразования их в частоту выборки, на которой была обучена сеть, а затем извлечения перекрывающихся спектрограмм log-mel. В этом примере рассматривается требуемая предварительная обработка и извлечение элементов, необходимые для соответствия предварительной обработке и извлечению элементов, используемых для обучения YAMNet. classifySound функция выполняет эти шаги для вас.
Считывайте звуковой сигнал для его классификации. Выполните повторную выборку звукового сигнала до 16 кГц, а затем преобразуйте его в единичную точность.
[audioIn,fs0] = audioread('Counting-16-44p1-mono-15secs.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 = 1551
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
Создайте сеть YAMNet.
net = yamnet();
Классифицируйте изображения спектрограммы.
classes = classify(net,frames);
Классифицируйте звуковой сигнал как наиболее часто встречающийся звук.
mySound = mode(classes)
mySound = categorical
Speech
В этом примере используются:
Загрузите и распакуйте набор данных воздушного компрессора [1]. Этот набор данных состоит из записей с воздушных компрессоров в исправном состоянии или из 7 неисправных состояний.
url = 'https://www.mathworks.com/supportfiles/audio/AirCompressorDataset/AirCompressorDataset.zip'; downloadFolder = fullfile(tempdir,'aircompressordataset'); datasetLocation = tempdir; if ~exist(fullfile(tempdir,'AirCompressorDataSet'),'dir') loc = websave(downloadFolder,url); unzip(loc,fullfile(tempdir,'AirCompressorDataSet')) end
Создание audioDatastore объект для управления данными и их разделения на группы и наборы проверки.
ads = audioDatastore(downloadFolder,'IncludeSubfolders',true,'LabelSource','foldernames'); [adsTrain,adsValidation] = splitEachLabel(ads,0.8,0.2);
Прочитайте аудиофайл из хранилища данных и сохраните частоту дискретизации для последующего использования. Сбросьте хранилище данных, чтобы вернуть указатель чтения в начало набора данных. Прослушайте звуковой сигнал и постройте график сигнала во временной области.
[x,fileInfo] = read(adsTrain); fs = fileInfo.SampleRate; reset(adsTrain) sound(x,fs) figure t = (0:size(x,1)-1)/fs; plot(t,x) xlabel('Time (s)') title('State = ' + string(fileInfo.Label)) axis tight

Создание audioFeatureExtractor изобретение позволяет извлечь спектр Барка из звуковых сигналов. Используйте то же окно, длину перекрытия, диапазон частот и количество полос, на которых обучался YAMNet. В зависимости от задачи обучения трансферу, вы можете изменить функции ввода более или менее из функций ввода, на которых был обучен YAMNet.
afe = audioFeatureExtractor('SampleRate',fs, ... 'Window',hann(0.025*fs,'periodic'), ... 'OverlapLength',round(0.015*fs), ... 'barkSpectrum',true); setExtractorParams(afe,'barkSpectrum','NumBands',64);
Извлеките спектрограммы Барка из состава поезда. Для каждого звукового сигнала имеется несколько спектрограмм Барка. Реплицируйте метки так, чтобы они соответствовали спектрограммам один к одному.
numSpectrumsPerSpectrogram = 96; numSpectrumsOverlapBetweenSpectrograms = 48; numSpectrumsHopBetweenSpectrograms = numSpectrumsPerSpectrogram - numSpectrumsOverlapBetweenSpectrograms; emptyLabelVector = adsTrain.Labels; emptyLabelVector(:) = []; trainFeatures = []; trainLabels = emptyLabelVector; while hasdata(adsTrain) [audioIn,fileInfo] = read(adsTrain); features = extract(afe,audioIn); features = log10(features + single(0.001)); [numSpectrums,numBands] = size(features); numSpectrograms = floor((numSpectrums - numSpectrumsPerSpectrogram)/numSpectrumsHopBetweenSpectrograms) + 1; for hop = 1:numSpectrograms range = 1 + numSpectrumsHopBetweenSpectrograms*(hop-1):numSpectrumsHopBetweenSpectrograms*(hop-1) + numSpectrumsPerSpectrogram; trainFeatures = cat(4,trainFeatures,features(range,:)); trainLabels = cat(1,trainLabels,fileInfo.Label); end end
Извлеките элементы из набора проверки и реплицируйте метки.
validationFeatures = []; validationLabels = emptyLabelVector; while hasdata(adsValidation) [audioIn,fileInfo] = read(adsValidation); features = extract(afe,audioIn); features = log10(features + single(0.001)); [numSpectrums,numBands] = size(features); numSpectrograms = floor((numSpectrums - numSpectrumsPerSpectrogram)/numSpectrumsHopBetweenSpectrograms) + 1; for hop = 1:numSpectrograms range = 1 + numSpectrumsHopBetweenSpectrograms*(hop-1):numSpectrumsHopBetweenSpectrograms*(hop-1) + numSpectrumsPerSpectrogram; validationFeatures = cat(4,validationFeatures,features(range,:)); validationLabels = cat(1,validationLabels,fileInfo.Label); end end
Набор данных воздушного компрессора имеет только восемь классов. Прочитайте в YAMNet, преобразуйте его в layerGraph (Deep Learning Toolbox), а затем замените окончательный вариант fullyConnectedLayer (Deep Learning Toolbox) и окончательный вариант classificationLayer (Deep Learning Toolbox) для отражения новой задачи.
uniqueLabels = unique(adsTrain.Labels); numLabels = numel(uniqueLabels); net = yamnet; lgraph = layerGraph(net.Layers); newDenseLayer = fullyConnectedLayer(numLabels,"Name","dense"); lgraph = replaceLayer(lgraph,"dense",newDenseLayer); newClassificationLayer = classificationLayer("Name","Sounds","Classes",uniqueLabels); lgraph = replaceLayer(lgraph,"Sound",newClassificationLayer);
Для определения вариантов обучения используйте trainingOptions (инструментарий глубокого обучения).
miniBatchSize = 128; validationFrequency = floor(numel(trainLabels)/miniBatchSize); options = trainingOptions('adam', ... 'InitialLearnRate',3e-4, ... 'MaxEpochs',2, ... 'MiniBatchSize',miniBatchSize, ... 'Shuffle','every-epoch', ... 'Plots','training-progress', ... 'Verbose',false, ... 'ValidationData',{single(validationFeatures),validationLabels}, ... 'ValidationFrequency',validationFrequency);
Для обучения сети используйте trainNetwork (инструментарий глубокого обучения).
trainNetwork(single(trainFeatures),trainLabels,lgraph,options);

Ссылки
[1] Верма, Nishal K., et al. «Интеллектуальный мониторинг состояния с использованием акустических сигналов для воздушных компрессоров». Сделки IEEE по надежности, том 65, № 1, март 2016 г., стр. 291-309. DOI.org (Crossref), doi:10.1109/TR.2015.2459684.
net - Предварительно обученная нейронная сеть YAMNetSeriesNetwork объектПредварительно обученная нейронная сеть YAMNet, возвращенная в качестве SeriesNetwork(Панель инструментов глубокого обучения).
[1] Gemmeke, Джорт Ф., и др. 2017 IEEE Международная конференция по акустике, обработке речи и сигналов (ICASSP), IEEE, 2017, стр. 776-80. DOI.org (Crossref), doi:10.1109/ICASSP.2017.7952261.
[2] Херши, Шон и др. Международная конференция IEEE 2017 по акустике, обработке речи и сигналов (ICASSP), IEEE, 2017, стр. 131-35. DOI.org (Crossref), doi:10.1109/ICASSP.2017.7952132.
Примечания и ограничения по использованию:
Только activations и predict поддерживаются функции объекта.
Создание SeriesNetwork для создания кода см. раздел Загрузка предварительно подготовленных сетей для создания кода (кодер MATLAB).
Примечания и ограничения по использованию:
Только activations, classify, predict, predictAndUpdateState, и resetState поддерживаются функции объекта.
Создание SeriesNetwork для создания кода см. раздел Загрузка предварительно подготовленных сетей для создания кода (кодер GPU).
audioFeatureExtractor | classifySound | designAuditoryFilterBank | melSpectrogram | vggish | yamnetGraph | yamnetPreprocess
Имеется измененная версия этого примера. Открыть этот пример с помощью изменений?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.