Нейронная сеть 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 Объект (Deep Learning Toolbox).
yamnet
ans =
SeriesNetwork with properties:
Layers: [86×1 nnet.cnn.layer.Layer]
InputNames: {'input_1'}
OutputNames: {'Sound'}
Загрузите предварительно обученную сверточную нейронную сеть YAMNet и исследуйте слои и классы.
Используйте yamnet загружать предварительно обученную сеть YAMNet. Сетевым выходом является SeriesNetwork Объект (Deep Learning Toolbox).
net = yamnet
net =
SeriesNetwork with properties:
Layers: [86×1 nnet.cnn.layer.Layer]
InputNames: {'input_1'}
OutputNames: {'Sound'}
Просмотрите сетевую архитектуру с помощью Layers свойство. Сеть имеет 86 слоев. Существует 28 слоев с learnable весами: 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 требует, чтобы вы предварительно обработали и извлекли функции из звуковых сигналов путем преобразования их в частоту дискретизации, сеть была обучена на, и затем извлекающий перекрывающий логарифмические-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');
Преобразуйте mel спектрограмму в логарифмическую шкалу.
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);
Считайте звуковой файл из datastore и сохраните частоту дискретизации для дальнейшего использования. Сбросьте datastore, чтобы возвратить указатель чтения на начало набора данных. Слушайте звуковой сигнал и постройте сигнал во временном интервале.
[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 (Deep Learning Toolbox).
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 (Deep Learning Toolbox).
trainNetwork(single(trainFeatures),trainLabels,lgraph,options);

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