VGGish神经网络
下载并解压缩VGGish的Audio Toolbox™模型。
类型vggish
在命令窗口。如果没有安装VGGish的Audio Toolbox模型,则该函数将提供到网络权重位置的链接。要下载模型,请单击链接。将文件解压缩到MATLAB路径上的某个位置。
或者,执行这些命令下载VGGish模型并解压缩到临时目录。
下载文件夹= fullfile(tempdir,“VGGishDownload”);loc = websave(下载文件夹,“https://ssd.mathworks.com/金宝appsupportfiles/audio/vggish.zip”);VGGishLocation = tempdir;VGGishLocation解压(loc)目录(fullfile (VGGishLocation,“vggish”))
通过输入检查安装是否成功vggish
在命令窗口。如果已安装网络,则该函数返回SeriesNetwork
(深度学习工具箱)对象。
vggish
ans = SeriesNetwork with properties: Layers: [24×1 nnet.cnn.layer.Layer] InputNames: {'InputBatch'} OutputNames: {'regressionoutput'}
加载一个预先训练好的VGGish卷积神经网络,并检查层和类。
使用vggish
加载预先训练好的VGGish网络。输出网
是一个SeriesNetwork
(深度学习工具箱)对象。
Net = vggish
net = SeriesNetwork with properties: Layers: [24×1 nnet.cnn.layer.Layer] InputNames: {'InputBatch'} OutputNames: {'regressionoutput'}
命令查看网络结构层
财产。网络有24层。有9个具有可学习权重的层,其中6个是卷积层,3个是全连接层。
网层
ans = 24×1带有图层的图层数组:1“InputBatch”图像输入96×64×1图片2 conv1卷积64 3×3×1旋转步[1]和填充“相同”3“relu”relu relu 4“pool1”马克斯池2×2马克斯池步(2 - 2)和填充“相同”5 conv2卷积128 3×3×64旋转步[1]和填充“相同”6“relu2”relu relu 7“pool2”马克斯池2×2马克斯池步(2 - 2)和填充“相同”256“conv3_1”卷积3×3×128旋转步[1]和填充“相同”9 relu3_1 reluReLU conv3_2的卷积256 3×3×256旋转步[1]和填充“相同”11的relu3_2 ReLU ReLU 12“pool3”马克斯池2×2马克斯池步(2 - 2)和填充“相同”13 conv4_1卷积512 3×3×256旋转步[1]和填充“相同”14的relu4_1 ReLU ReLU 15 conv4_2卷积512 3×3×512旋转步[1]和填充“相同”16的relu4_2 ReLU ReLU 17“pool4”马克斯池2×2马克斯池步(2 - 2)和填充“相同”18“fc1_1”全连接4096全连接层19 'relu5_1' ReLU ReLU 20 'fc1_2'全连接4096全连接层21 'relu5_2' ReLU ReLU 22 'fc2'全连接128全连接层23 'EmbeddingBatch' ReLU ReLU 24 'regressionoutput'回归输出均方误差
使用analyzeNetwork
(深度学习工具箱)为了直观地探索网络。
analyzeNetwork(净)
VGGish网络要求您通过将音频信号转换为网络训练的采样率来预处理和提取音频信号的特征,然后提取log mel谱图。本例详细介绍了所需的预处理和特征提取,以匹配用于训练VGGish的预处理和特征提取。的vggishFeatures
函数为您执行这些步骤。
读入音频信号进行分类。将音频信号重新采样到16 kHz,然后将其转换为单精度。
[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,...“窗口”损害(windowLength“周期”),...“OverlapLength”overlapLength,...“FFTLength”FFTLength,...“FrequencyRange”frequencyRange,...“NumBands”numBands,...“FilterBankNormalization”,“没有”,...“WindowNormalization”假的,...“SpectrumType”,“级”,...“FilterBankDesignDomain”,“扭曲”);
将mel谱图转换为对数刻度。
melSpect = log(melSpect + single(0.001));
重新定位梅尔谱图,使时间沿第一维度为行。
melSpect = melSpect.';[numstftwinwindows,numBands] = size(melSpect)
numstfwindows = 1222
numBands = 64
将频谱图划分为长度为96的帧,重叠为48帧。沿着第四维空间放置框架。
frameWindowLength = 96;frameOverlapLength = 48;hopLength = frameWindowLength - frameOverlapLength;numHops = floor((numSTFTWindows - frameWindowLength)/hopLength) + 1;帧= 0 (frameWindowLength,numBands,1,numHops,“喜欢”, melSpect);为hop = 1:numHops range = 1 + hopLength*(hop-1):hopLength*(hop -1) + frameWindowLength;frames(:,:,1,hop) = melSpect(range,:);结束
创建VGGish网络。
Net = vggish;
调用预测
从光谱图图像中提取特征嵌入。特性嵌入作为a返回numFrames
-by-128矩阵,其中numFrames
是单个谱图的数量,128是每个特征向量中的元素数量。
特征=预测(网,帧);[numFrames,numFeatures] = size(features)
numFrames = 24
numFeatures = 128
比较mel谱图的可视化和VGGish特征嵌入。
melSpectrogram (audioIn fs,...“窗口”损害(windowLength“周期”),...“OverlapLength”overlapLength,...“FFTLength”FFTLength,...“FrequencyRange”frequencyRange,...“NumBands”numBands,...“FilterBankNormalization”,“没有”,...“WindowNormalization”假的,...“SpectrumType”,“级”,...“FilterBankDesignDomain”,“扭曲”);
冲浪(特性,“EdgeColor”,“没有”view([90,-90]) axis([1 numFeatures 1 numFrames]) xlabel(“功能”) ylabel (“帧”)标题(“VGGish特征嵌入”)
在本例中,您将VGGish回归模型中的学习转移到音频分类任务中。
下载并解压缩环境声音分类数据集。该数据集由标记为10种不同音频声音类别之一的录音组成(ESC-10)。
url =“http://ssd.mathworks.com/金宝appsupportfiles/audio/esc - 10. - zip”;下载文件夹= fullfile(tempdir,“ESC-10”);datasetLocation = tempdir;如果~ (fullfile (tempdir,存在“ESC-10”),“dir”) loc = websave(下载文件夹,url);解压缩(loc fullfile (tempdir“ESC-10”))结束
创建一个audioDatastore
对象来管理数据并将其分割为训练集和验证集。调用countEachLabel
显示声音类别的分布和唯一标签的数量。
ads = audioDatastore(下载文件夹,“IncludeSubfolders”,真的,“LabelSource”,“foldernames”);labelTable = countEachLabel(广告)
labelTable =10×2表标签计数______________ _____链锯40时钟滴答40噼里啪啦火40哭泣的婴儿40狗40直升机40雨40公鸡38海浪40打喷嚏40
确定类的总数。
numClasses = size(labelTable,1);
调用splitEachLabel
将数据集分成训练集和验证集。检查训练集和验证集中标签的分布。
[adsTrain, adsValidation] = splitEachLabel(ads,0.8);countEachLabel (adsTrain)
ans =10×2表标签计数______________ _____电锯32时钟滴答32噼里啪啦火32哭泣的婴儿32狗32直升机32雨32公鸡30海浪32打喷嚏32
countEachLabel (adsValidation)
ans =10×2表标签计数______________ _____链锯8时钟滴答8噼里啪啦火8哭泣的婴儿8狗8直升机8雨8公鸡8海浪8打喷嚏8
VGGish网络期望将音频预处理成log mel谱图。支持函数金宝appvggishPreprocess
以一个audioDatastore
对象和log mel谱图之间的重叠百分比作为输入,并返回适合作为输入的VGGish网络的预测器和响应矩阵。
overlapPercentage =75;[trainFeatures,trainLabels] = vggishPreprocess(adsTrain,overlapPercentage);[validationFeatures,validationLabels,segmentsPerFile] = vggishPreprocess(adsValidation,overlapPercentage);
加载VGGish模型并将其转换为layerGraph
(深度学习工具箱)对象。
Net = vggish;lgraph = layerGraph(net.Layers);
使用removeLayers
(深度学习工具箱)从图中删除最后的回归输出层。在删除回归层之后,图形的新最终层是一个名为ReLU的层“EmbeddingBatch”
.
lgraph = removeLayers(“regressionoutput”);lgraph.Layers(结束)
ans = ReLULayer属性:名称:` EmbeddingBatch `
使用addLayers
(深度学习工具箱)要添加fullyConnectedLayer
(深度学习工具箱),一个softmaxLayer
(深度学习工具箱),以及classificationLayer
(深度学习工具箱)到图上。
lgraph = addLayers(lgraph,fullyConnectedLayer(numClasses,“名字”,“FCFinal”));lgraph = addLayers(lgraph,softmaxLayer(“名字”,“softmax”));lgraph = addLayers(lgraph,classificationLayer“名字”,“classOut”));
使用connectLayers
(深度学习工具箱)将全连通层、softmax层和分类层附加到层图中。
lgraph = connectLayers(“EmbeddingBatch”,“FCFinal”);lgraph = connectLayers(“FCFinal”,“softmax”);lgraph = connectLayers(“softmax”,“classOut”);
要定义培训选项,请使用trainingOptions
(深度学习工具箱).
miniBatchSize = 128;选项= trainingOptions(“亚当”,...“MaxEpochs”5,...“MiniBatchSize”miniBatchSize,...“洗牌”,“every-epoch”,...“ValidationData”{validationFeatures, validationLabels},...“ValidationFrequency”, 50岁,...“LearnRateSchedule”,“分段”,...“LearnRateDropFactor”, 0.5,...“LearnRateDropPeriod”2);
为了训练网络,使用trainNetwork
(深度学习工具箱).
[trainedNet, netInfo] = trainNetwork(trainFeatures,trainLabels,lgraph,options);
单GPU训练。|======================================================================================================================| | 时代| |迭代时间| Mini-batch | |验证Mini-batch | |验证基地学习 | | | | ( hh: mm: ss) | | | | |损失损失精度精度 | |======================================================================================================================| | 1 | 1 |就是| | 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 | | 150 | | 00:00:15 | | 92.97% 81.99% | 0.1656 | 0.7612 | 0.0005 | | 200 | | 00:00:20 | | 92.19% 79.04% | 0.1738 | 0.8192 | 0.0003 | | 210 | | 00:00:21 95.31% | | | 0.1389 | 0.8581 | 0.0003 80.15% | |======================================================================================================================|
每个音频文件被分割成几个片段,馈送到VGGish网络。使用多数规则决策组合验证集中每个文件的预测。
validationforecasts = classification (trainedNet,validationFeatures);Idx = 1;validationPredictionsPerFile = category;为ii = 1:numel(adsValidation.Files) validationPredictionsPerFile(ii,1) = mode(validationPredictions(idx:idx+segmentsPerFile(ii)-1));idx = idx + segmentsPerFile(ii);结束
使用confusionchart
(深度学习工具箱)在验证集上评估网络的性能。
图(“单位”,“归一化”,“位置”,[0.2 0.2 0.5 0.5]);cm = confusionchart(adsValidation.Labels,validationPredictionsPerFile);厘米。标题= sprintf('验证数据的混淆矩阵\nAccuracy = %0.2f %%',意味着(validationPredictionsPerFile = = adsValidation.Labels) * 100);厘米。ColumnSummary =“column-normalized”;厘米。RowSummary =“row-normalized”;
金宝app支持功能
函数[predictor,response,segmentsPerFile] = vggishPreprocess(ads,overlap)此函数仅供举例,可以更改或删除%在将来的版本中。%创建过滤器组FFTLength = 512;numBands = 64;Fs0 = 16e3;filterBank = designAuditoryFilterBank(fs0,...“FrequencyScale”,“梅尔”,...“FFTLength”FFTLength,...“FrequencyRange”(125 7500),...“NumBands”numBands,...“归一化”,“没有”,...“FilterBankDesignDomain”,“扭曲”);定义STFT参数windowLength = 0.025 * fs0;hopLength = 0.01 * fs0;win = hann(windowLength,“周期”);定义谱图分割参数segmentDuration = 0.96;%秒segmentRate = 100;%赫兹segmentLength = segmentDuration* segtrate;%每个听觉谱图的谱数segmentHopDuration = (100-overlap) * segmentDuration / 100;%听觉频谱图之间的持续时间(s)segmentHopLength = round(segmenthoplduration * segtrate);%听觉谱图之间前进的谱数为预测器和响应预分配单元格数组numFiles = nummel (ads.Files);预测器= cell(numFiles,1);响应=预测器;segmentsPerFile = 0 (numFiles,1);为每个文件提取预测器和响应为ii = 1:numFiles [audioIn,info] = read(ads);x = single(resample(audioIn,fs0,info.SampleRate));Y = stft(x,...“窗口”,赢了,...“OverlapLength”windowLength-hopLength,...“FFTLength”FFTLength,...“FrequencyRange”,“单向的”);Y = abs(Y);logMelSpectrogram = log(filterBank*Y + single(0.01))';分段对数-mel谱图numHops = floor((size(Y,2)-segmentLength)/segmentHopLength) + 1;segmentedLogMelSpectrogram = 0 (segmentLength,numBands,1,numHops);为hop = 1:numHops segmentedLogMelSpectrogram(:,:,1,hop) = logMelSpectrogram(1+segmentHopLength*(hop-1):segmentLength+segmentHopLength*(hop-1),:);结束predictor{ii} = segmentedLogMelSpectrogram;response{ii} = repelem(info.Label,numHops);segmentsPerFile(ii) = numHops;结束将预测器和响应连接到数组中预测器= cat(4,预测器{:});Response = cat(2, Response {:});结束
网
-预训练VGGish神经网络SeriesNetwork
对象预训练的VGGish神经网络,返回为SeriesNetwork
(深度学习工具箱)对象。
[1] Gemmeke, Jort F., Daniel P. W. Ellis, Dylan Freedman, Aren Jansen, Wade Lawrence, R. Channing Moore, Manoj Plakal, Marvin Ritter。2017。音频集:音频事件的本体和人类标记数据集在2017 IEEE声学、语音和信号处理国际会议(ICASSP), 776 - 80。新奥尔良,洛杉矶:IEEE。https://doi.org/10.1109/ICASSP.2017.7952261。
[2] Hershey, Shawn, Sourish Chaudhuri, Daniel P. W. Ellis, Jort F. Gemmeke, Aren Jansen, R. Channing Moore, Manoj Plakal,等2017。“大规模音频分类的CNN架构。”在2017 IEEE声学、语音和信号处理国际会议(ICASSP)131 - 35。新奥尔良,洛杉矶:IEEE。https://doi.org/10.1109/ICASSP.2017.7952132。
使用注意事项和限制:
只有激活
而且预测
支持对象函数。金宝app
要创建SeriesNetwork
对象进行代码生成,请参见为代码生成加载预训练的网络(MATLAB编码器).
使用注意事项和限制:
只有激活
,分类
,预测
,predictAndUpdateState
,resetState
支持对象函数。金宝app
要创建SeriesNetwork
对象进行代码生成,请参见为代码生成加载预训练的网络(GPU编码器).
你点击了一个对应于这个MATLAB命令的链接:
在MATLAB命令窗口中输入该命令来运行该命令。Web浏览器不支持MATLAB命令。金宝app
您也可以从以下列表中选择一个网站:
选择中国站点(中文或英文)以获得最佳站点性能。其他MathWorks国家站点没有针对您所在位置的访问进行优化。