主要内容

vggish

VGGish神经网络

    语法

    描述

    例子

    = vggish返回一个预先训练的VGGish模型。

    此功能需要音频工具箱™和深度学习工具箱™。

    例子

    全部折叠

    下载并解压VGGish的Audio Toolbox™模型。

    类型vggish在命令窗口。如果没有安装VGGish的Audio Toolbox模型,那么该函数将提供到网络权重位置的链接。要下载模型,请单击链接。解压文件到MATLAB路径上的一个位置。

    或者,执行这些命令将VGGish模型下载并解压到临时目录。

    downloadFolder = fullfile (tempdir,“VGGishDownload”);loc = websave (downloadFolder,“https://ssd.mathworks.com/金宝appsupportfiles/audio/vggish.zip”);VGGishLocation = tempdir;VGGishLocation解压(loc)目录(fullfile (VGGishLocation,“vggish”))

    输入以下命令,检查安装是否成功vggish在命令窗口。如果网络已安装,则该函数返回aSeriesNetwork(深度学习工具箱)对象。

    vggish
    ans = SeriesNetwork with properties: Layers: [24×1 net.cnn.layer. layer] InputNames: {'InputBatch'} OutputNames: {'regressionoutput'}

    加载一个预先训练的VGGish卷积神经网络并检查层和类。

    使用vggish加载预训练的VGGish网络。输出是一个SeriesNetwork(深度学习工具箱)对象。

    网= vggish
    [24×1 nnet.cnn.layer.Layer] InputNames: {'InputBatch'} OutputNames: {'regressionoutput'}

    使用命令查看网络架构财产。网络有24层。有9个具有可学习权值的层,其中6个是卷积层,3个是完全连接层。

    网。层
    ans = 24×1 Layer array with layers: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”ReLU ReLU conv3_2的卷积256 3×3×256旋转步[1]和填充“相同”11的relu3_2 ReLU ReLU 12“pool3”马克斯池2×2马克斯池步(2 - 2)和填充“相同”13conv4_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' Fully Connected 4096 Fully Connected layer 21 'relu5_2' ReLU ReLU 22 'fc2' Fully Connected 128 Fully Connected layer 23 ' embedingbatch ' ReLU ReLU 24 'regressionoutput' Regression Output ' Regression Output均方误差

    使用analyzeNetwork(深度学习工具箱)可视化地探索网络。

    analyzeNetwork(净)

    VGGish网络需要你对音频信号进行预处理和提取特征,将它们转换成网络训练的采样率,然后提取log mel谱图。本示例演示了所需的预处理和特征提取,以匹配用于训练VGGish的预处理和特征提取。的vggishFeatures函数为您执行这些步骤。

    读入音频信号进行分类。重新采样音频信号到16千赫,然后将其转换为单一精度。

    [audioIn, fs0] = audioread (“Ambiance-16-44p1-mono-12secs.wav”);fs = 16 e3;audioIn =重新取样(fs, audioIn fs0);audioIn =单(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));

    重新定位mel谱图,使时间以行的形式沿第一个维度排列。

    melSpect = melSpect。”;[numSTFTWindows, numBands] =大小(melSpect)
    numSTFTWindows = 1222
    numBands = 64

    将声谱图分成长度为96、重叠48的帧。沿着第四维度放置框架。

    frameWindowLength = 96;frameOverlapLength = 48;hopLength = frameWindowLength - frameOverlapLength;numHops = floor((numSTFTWindows - frameWindowLength)/hopLength) + 1;帧= 0 (numHops frameWindowLength numBands 1,“喜欢”, melSpect);hop = 1:numHops range = 1 + hopLength*(hop-1):hopLength*(hop -1) + frameWindowLength;跳帧(::1)= melSpect(范围:);结束

    创建VGGish网络。

    网= vggish;

    调用预测从谱图图像中提取特征嵌入。特征嵌入被返回为numFrames128年——矩阵,numFrames为单个谱图的个数,128为每个特征向量中元素的个数。

    特点=预测(净、帧);[numFrames, numFeatures] =大小(特性)
    numFrames = 24
    numFeatures = 128

    比较mel谱图的可视化和VGGish特征嵌入。

    melSpectrogram (audioIn fs,...“窗口”损害(windowLength“周期”),...“OverlapLength”overlapLength,...“FFTLength”FFTLength,...“FrequencyRange”frequencyRange,...“NumBands”numBands,...“FilterBankNormalization”“没有”...“WindowNormalization”假的,...“SpectrumType”“级”...“FilterBankDesignDomain”“扭曲”);

    冲浪(特性,“EdgeColor”“没有”)视图([90,-90])轴([1 numFeatures 1 numFrames]) xlabel(“功能”) ylabel (“帧”)标题(“VGGish功能嵌入”)

    在本例中,您将VGGish回归模型中的学习转移到音频分类任务中。

    下载并解压环境声音分类数据集。该数据集由标记为10个不同音频声音类(ESC-10)之一的录音组成。

    url =“http://ssd.mathworks.com/金宝appsupportfiles/audio/esc - 10. - zip”;downloadFolder = fullfile (tempdir,“ESC-10”);datasetLocation = tempdir;如果~ (fullfile (tempdir,存在“ESC-10”),“dir”) loc = websave(downloadFolder,url);解压缩(loc fullfile (tempdir“ESC-10”))结束

    创建一个audioDatastore对象来管理数据,并将其分解为训练集和验证集。调用countEachLabel显示声音类的分布和独特标签的数量。

    广告= audioDatastore (downloadFolder,“IncludeSubfolders”,真的,“LabelSource”“foldernames”);labelTable = countEachLabel(广告)
    labelTable =10×2表标签数______________ _____链锯40时钟40噼啪火40哭泣的婴儿40狗40直升机40雨40公鸡38海浪40打喷嚏40

    确定类的总数。

    numClasses =大小(labelTable, 1);

    调用splitEachLabel将数据集分割为训练集和验证集。检查培训和验证集中标签的分发情况。

    [adsTrain, adsValidation] = splitEachLabel(ads,0.8);countEachLabel (adsTrain)
    ans =10×2表标签数______________ _____链锯32 clock_tick 32 crackling_fire 32啼哭的婴儿32狗32直升机32雨32公鸡30海浪32打喷嚏32
    countEachLabel (adsValidation)
    ans =10×2表标签数______________ _____链锯8发条8噼啪8火8啼哭8婴儿8狗8直升机8雨8公鸡8海浪8打喷嚏8

    VGGish网络期望音频被预处理成日志mel谱图。支持函数金宝appvggishPreprocess以一个audioDatastore对象和logmel谱图的重叠百分比作为输入,并返回适合作为VGGish网络输入的预测器和响应矩阵。

    overlapPercentage =75;[trainFeatures, trainLabels] = vggishPreprocess (adsTrain overlapPercentage);[validationFeatures, validationLabels segmentsPerFile] = vggishPreprocess (adsValidation overlapPercentage);

    加载VGGish模型并将其转换为layerGraph(深度学习工具箱)对象。

    网= vggish;lgraph = layerGraph (net.Layers);

    使用removeLayers(深度学习工具箱)将最终的回归输出层从图中移除。在移除回归层之后,图的最后一层是一个名为ReLU的层“EmbeddingBatch”

    lgraph = removeLayers (lgraph,“regressionoutput”);lgraph.Layers(结束)
    ans = ReLULayer with properties: Name: ' embedingbatch '

    使用addLayers(深度学习工具箱)添加一个fullyConnectedLayer(深度学习工具箱),一个softmaxLayer(深度学习工具箱)和一个classificationLayer(深度学习工具箱)图。

    lgraph = addLayers (lgraph fullyConnectedLayer (numClasses“名字”“FCFinal”));lgraph = addLayers (lgraph softmaxLayer (“名字”“softmax”));lgraph = addLayers (lgraph classificationLayer (“名字”“classOut”));

    使用connectLayers(深度学习工具箱)将全连接层、softmax层和分类层附加到层图中。

    lgraph = connectLayers (lgraph,“EmbeddingBatch”“FCFinal”);lgraph = connectLayers (lgraph,“FCFinal”“softmax”);lgraph = connectLayers (lgraph,“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网络。使用多数规则决策组合验证集中每个文件的预测。

    validationPredictions =分类(trainedNet validationFeatures);idx = 1;validationPredictionsPerFile =分类;ii = 1:numel(adsvalidate . files) validationPredictionsPerFile(ii,1) = mode(validationPredictions(idx:idx+segmentsPerFile(ii)-1));idx = idx + segmentsPerFile(ii);结束

    使用confusionchart(深度学习工具箱)评估网络在验证集上的性能。

    图(“单位”“归一化”“位置”,[0.2 0.2 0.5 0.5]);厘米= confusionchart (adsValidation.Labels validationPredictionsPerFile);厘米。标题= sprintf ('验证数据混淆矩阵\nAccuracy = %0.2f %%',意味着(validationPredictionsPerFile = = adsValidation.Labels) * 100);厘米。ColumnSummary =“column-normalized”;厘米。RowSummary =“row-normalized”

    金宝app支持功能

    函数(预测、响应segmentsPerFile) = vggishPreprocess(广告,重叠)%此函数仅供示例使用,可以更改或删除%在未来的版本中。创建过滤器组FFTLength = 512;numBands = 64;fs0 = 16 e3;filterBank = designAuditoryFilterBank (fs0,...“FrequencyScale”“梅尔”...“FFTLength”FFTLength,...“FrequencyRange”(125 7500),...“NumBands”numBands,...“归一化”“没有”...“FilterBankDesignDomain”“扭曲”);%定义STFT参数窗口长度= 0.025 * fs0;hopLength = 0.01 * fs0;赢得=损害(windowLength,“周期”);%定义谱图分割参数segmentDuration = 0.96;%秒segmentRate = 100;%赫兹segmentLength = segmentDuration * segmentRate;%每个听觉声谱图的频谱数segmentHopDuration = (100-overlap) * segmentDuration / 100;%听觉频谱图之间的持续时间(s)segmentHopLength = round(segmentHopDuration * segmentRate);%在听觉光谱图之间先进的光谱数量为预测器和响应预分配单元格数组numFiles =元素个数(ads.Files);预测=细胞(numFiles, 1);响应=预测;segmentsPerFile = 0 (numFiles, 1);提取每个文件的预测器和响应ii = 1:numFiles [audioIn,info] = read(ads);x =单(重新取样(audioIn、fs0 info.SampleRate));Y = stft (x,...“窗口”,赢了,...“OverlapLength”windowLength-hopLength,...“FFTLength”FFTLength,...“FrequencyRange”“单向的”);Y = abs (Y);logMelSpectrogram = log(filterBank*Y + single(0.01))';%段log-mel谱图numHops = floor((size(Y,2)-segmentLength)/segmentHopLength) + 1;segmentedLogMelSpectrogram = 0 (segmentLength numBands 1, numHops);segmentedLogMelSpectrogram(:,:,1,hop) = logMelSpectrogram(1+segmentHopLength*(hop-1):segmentLength+segmentHopLength*(hop-1),:);结束预测{2}= segmentedLogMelSpectrogram;响应{2}= repelem (info.Label numHops);segmentsPerFile (ii) = numHops;结束将预测器和响应连接到数组中预测预测=猫(4日{:});响应=猫(2、响应{:});结束

    输出参数

    全部折叠

    预训练的VGGish神经网络,返回为SeriesNetwork(深度学习工具箱)对象。

    参考文献

    Gemmeke, Jort F., Daniel P. W. Ellis, Dylan Freedman, Aren Jansen, Wade Lawrence, R. Channing Moore, Manoj Plakal, and Marvin Ritter. 2017。音频集:用于音频事件的本体和人类标记的数据集。在2017 IEEE声学、语音和信号处理国际会议(ICASSP), 776 - 80。新奥尔良,洛杉矶:IEEE。https://doi.org/10.1109/ICASSP.2017.7952261。

    Hershey, Shawn, Sourish Chaudhuri, Daniel P. W. Ellis, Jort F. Gemmeke, Aren Jansen, R. Channing Moore, Manoj Plakal, et al. 2017。CNN大规模音频分类架构在2017 IEEE声学、语音和信号处理国际会议(ICASSP)131 - 35。新奥尔良,洛杉矶:IEEE。https://doi.org/10.1109/ICASSP.2017.7952132。

    扩展功能

    介绍了R2020b