Johanna Pingel, MathWorks
艾米丽·安德森,MathWorks
深度学习网络被证明是一种多功能工具。它们最初用于图像分类,现在越来越多地应用于各种其他数据类型。在本次网络研讨会中,我们将探讨深度学习的基础知识,为理解和使用深度神经网络处理信号数据提供基础。通过两个示例,您将看到深度学习的实际应用,提供了对大型数据集执行复杂分析的能力,而无需成为领域专家。
探索MATLAB如何解决使用cnn和LSTMs创建信号和声音系统时遇到的常见挑战,并了解信号数据深度学习的新功能。
我们将演示深度学习去噪语音信号和生成音乐曲调。您将看到如何使用MATLAB来:
艾米丽·安德森是MathWorks的应用工程师,专注于MATLAB应用,如数据分析、机器学习和深度学习。在她的职位上,她支持客户在整个数金宝app据分析工作流程中适应MATLAB产品。下载188bet金宝搏她在MathWorks工作了2年,拥有隆德大学(Lund University)图像分析和信号处理硕士学位。
Johanna Pingel于2013年加入MathWorks团队,专注于图像处理和MATLAB计算机视觉应用。她拥有伦斯勒理工学院的硕士学位和卡内基梅隆大学的文学学士学位。她在计算机视觉应用领域工作了5年多,专注于目标检测和跟踪。
记录日期:2018年12月6日
欢迎来到信号和声音的深度学习。我是产品营销部的Johanna Pingel,和我一起的是应用工程部的emily Andersson。今天,我们将介绍何时以及为什么可以将深度学习用于信号和音频数据,当然,还将通过两个新示例向您展示如何实现。
当涉及到深度学习和机器学习时,工程师需要处理不同类型的数据。大多数数据类型是表格数据、时间序列数据或图像数据中的一种。深度学习在历史上一直被用于图像数据,这是该技术首次起飞并获得非常有前景的结果。深度学习现在也成为了其他类型数据的工具。本次研讨会将重点讨论中间部分——信号和音频类型数据的深度学习。
所以你有信号和/或音频数据。你应该使用深度学习,还是传统的机器学习?这是一个经常出现的问题。每个人都在谈论深度学习,但它真的对信号和音频数据有好处吗?什么时候应该使用机器学习而不是深度学习?在回答这个问题之前,让我花30秒来定义一下两者的区别。我们将深度学习定义为机器学习的一个子集,在机器学习中还有经典机器学习。在这两种情况下,我们都有输入数据,我们想要一个算法来学习识别信号之间的独特品质。你有输入数据,你想让算法从数据中产生一个输出。
让我们从经典的机器学习开始,手动从数据中提取相关特征。这些特征被添加到机器学习模型中进行分类,然后产生输出。通过深度学习,你可以将原始数据直接输入一个自动学习特征的深度神经网络。深度学习通常使用神经网络架构实现,我们将通过示例更详细地解释。这是机器学习和深度学习之间的一个很大的区别。但问题是,我该用哪一个呢?
答案是,视情况而定。也许这就是你的情况。我有很多数据,但不知道这些数据意味着什么。如果是这样的话,你应该尝试深度学习。由于模型学习了自己的特征,作为工程师的您不需要了解太多的数据,更多的数据可能意味着更好的模型。也许你的数据集比较小。你还能使用深度学习吗?答案是,当然,去试试吧。但机器学习模型可能会给你更好的结果。在经典的机器学习中,您可以利用关于数据的知识,提取最佳特征和适当数量的特征。
你可能会问,我不能尝试两种方法——深度学习和机器学习——并比较结果吗?答案是,是的,你可以两者都试一试。这些方法可以很容易地通过观察精度来进行比较。你可以在MATLAB环境中创建机器学习和深度学习模型。在这个研讨会上,我们将只讨论深度学习方法。但在研讨会结束时,您将找到有关如何使用机器学习做类似事情的资源。最好的部分是,在MATLAB中,你不必是一个信号处理工程师来处理信号数据,你也不必是一个数据科学家来处理机器学习和深度学习。
让我们开始吧。无论你的具体深度学习问题是什么,你都很可能从遵循典型的深度学习工作流程中受益。首先,您需要从任何地方访问音频和信号数据文件——无论是MP3文件、数据库中的历史数据还是实时流数据。然后你需要大量的标记数据。你需要输入数据来给神经网络大量的例子,这样它就可以学习和理解特征来做出决定。所有这些数据使得网络训练的计算强度相当大。为了能够更快地进行这些计算,您可以并且应该使用gpu,这可以大大加快训练速度。
一旦你有了一个训练有素的模型,你很可能想把它合并到一个更大的系统中,要么允许用户通过应用程序调用模型,要么将模型导出到外部硬件。您可能正在考虑以嵌入式GPU为目标,MATLAB提供了从您的模型自动生成CUDA代码的产品。下载188bet金宝搏正如你所知道的,深度学习是一个迭代的过程,出于各种原因,你很可能需要在这些步骤之间来回多次——可能是为了引入更多的数据来提高模型的准确性,或者在部署之前改变模型的参数。好消息是,MATLAB提供了在这些步骤之间来回执行的所有工具。
所以,遵循标准的工作流程,我们今天将看两个演示,它们都将展示不同的深度学习技术,你可以在你的数据上尝试。第一个演示是使用LSTM网络架构的音乐生成。艾米丽将介绍如何设计一个可以生成旋律的网络,所以最后,通过播放一个简短的介绍广告歌,网络将能够根据已经播放的内容继续这首歌。第二个演示是关于严重背景噪声下的语音去噪,它将使用带有图像的CNN。我们将训练一个网络,使它能够从输入中去除或减少噪声,留下一个干净的语音信号。
现在,我将把它交给艾米丽,她将带你们看两个例子。
谢谢,汉娜。让我们从第一个演示开始,音乐生成。我们用来训练网络的数据是一组古老的民歌旋律的数据集。我们将使用的网络类型称为lstm。它代表长短期记忆。顾名思义,该网络具有先天记忆,与几乎所有其他类型的神经网络相比,它们没有时间记忆。这个铁路网将被称为民间网。然后,我们将通过播放一首短歌来使用folkNet,并让它跟着播放。创造一个后续旋律。
让我们仔细看看这些网络是如何工作的。“我出生在瑞典。我说——”根据上下文,我知道缺失的单词是瑞典语。lstm是一种递归神经网络。而循环神经网络在进行预测时,会及时考虑之前的数据。这些类型的网络特别适合于信号、音频、文本和时间序列数据。信息可以通过发送回网络来保存,这些循环可以展开,以便更容易地可视化。
让我们回到这个例子,“我出生在瑞典”,然后我们可以有,比方说,五页的文本。要把瑞典留在这个背景下,需要比秩序大得多的记忆。所以,长短期记忆网络在这方面非常擅长,因为它们在整个过程中都携带着一个记忆单元。在我的演示中,我将向你们展示在MATLAB中创建这种网络是多么简单。
所以,我们将从看看我们最终可以用这个训练过的神经网络创造什么开始。这里有一架钢琴,像这样。这个应用程序是用MATLAB创建的,在这里,我可以录制一个曲调。这个曲调或旋律将被用来生成一个更长的后续旋律。我可以改变这里的温度。在这种情况下,温度是一个技术术语,描述未来的曲调与我演奏的音符有多相似。因此,较低的温度意味着曲调将与我演奏的音符相似,而较高的温度意味着曲调将与原始音符变化更大。让我们就此打住。我按下娱乐键,开始播放“老麦克唐纳有一个农场”。
现在我按下“给我一个曲调!”,我们可以看到它开始产生一个神经旋律。y轴上是音高,或者说音符。在x轴上,我们用节拍表示时间。红色的是我们刚刚播放的曲调,蓝色的是新生成的曲调。让我们来演奏这首曲子。
我在这里暂停一下。所以为什么开头听起来不像我们习惯的一个原因是当我演奏几个曲调时音符被拉长了。所以我一开始弹了三个g,它们变成了一个长音,而不是三个拍。但是很酷。这是一首电脑生成的歌。
让我们看一下训练用于生成音乐的网络的脚本。我们在这个脚本中要做的是训练一个步进预测网络,这个网络可以在给定当前音符时预测下一个音符。总而言之,网络将学习35个不同的音符。我将从旋律文件夹中的民歌数据开始阅读。如果我转到文件夹,我们可以看到数据是MIDI格式的。这是一种在秩序和音乐之间交流的格式。基本上,这些文件就是数据。所以不是录音。但是计算机可以使用这些数据,比如音符来播放歌曲。
让我们在MATLAB之外播放一段旋律,让Windows Media Player将MIDI数据转换为声音。
这些都是网络将被训练的音调。你可能会从我们看到的应用程序中生成的音调中认出它的声音。
在下一节中,我们将为从媒体数据中获得的每个数据矩阵制作一个旋律向量。我们还将删除包含和声片段的文件,并删除一些较长的歌曲。总而言之,我们从1034个旋律变成了985个。现在我们有了旋律向量,但没有模型的预测器或响应。
在本节中,我们将通过将985个旋律中的每个旋律中的35个不同音符转换为分类数据类型来创建响应变量。我们将通过为每个音符取一个虚拟变量来创建预测器,这也是处理分类数据的一种方式,但保持它为数值数据类型。在本节中,我们还将在响应数据旋律的末尾添加一个结束标记。在这种情况下,我们用最高的音加1,也就是89。这给了我们一个非常有趣的特征。现在,火车网络可以自己决定何时生成曲调。通过在每首曲子中添加结束标记,我们基本上是在告诉网络音乐何时结束。
下一节将预测器和响应中的数据划分为训练数据和验证数据。通过这里的设置,我们留出10%的数据用于测试。所以训练数据将用于训练网络,测试数据将用于检查网络在新数据上的准确性。在这里,我们可以检测数据是否过度拟合到训练集。
现在,我们终于到了设计这个超前LSTM预测器的架构的部分。网络的第一层是序列输入层。这里,我们有数字35,这是我们的旋律中有多少个音符。在输入层之后,我们将使用两个LSTM层,每个层有250个隐藏单元。这是一个相当武断的选择。然而,我们希望通过包含两个LSTM层和适量的隐藏单元,网络将能够学习足够复杂的行为来学习音乐关系。每个LSTM层之后的dropout层提供了防止过拟合的保护。
在这些层之后,我们有一个完全连接的层,顾名思义,它确保该层有和类数量一样多的音符。在这个例子中,我们有数字35,因为我们有35个课程。这些softmax层——下一个——输出35个值,它确保值在0到1之间。我们可以认为这是不同类别的概率分布。最后,我们有一个分类层,它只输出概率最高的类。
在下一节中,我们将选择用于训练网络的训练选项。选择Adam优化算法和梯度阈值1来稳定训练过程。如果你不熟悉图层选项和训练选项,你可以在MATLAB文档中学习所有关于图层和训练选项的知识。
现在我们已经到了最后一部分,我们在这里进行网络的训练。我们只需要添加x-train和y-train数据,以及我们在层中设置的架构和我们选择的训练选项。作为输出,我们将有网络folkNet。这里,我们可以看到网络训练的进度,蓝色的是精确度,幸运的是,它在上升。下面红色的部分,是多重分类的交叉熵损失,它在下降。这也是个好消息。我们希望损失趋近于0。黑色的是验证数据结果。使用这个,我们可以看到模型是否开始过度拟合训练数据。
所以你现在看到的训练实际上已经加快了好几倍。在现实中运行需要更长的时间。你可以看到训练集上的表现随着时间的推移在提高。如果我们允许训练继续下去,表现可能会更好。但这并不能保证我们能得到一个能产生美妙音乐的网络。相反,更有可能的是,我们训练了一个网络,它非常模仿训练集。
在大约20个时代,我们在验证精度上有一个转折点。我把这解释为网络最普遍的一点,所以网络可以很好地预测看不见的作品的音乐性。在这个角落里,我们有一个步进按钮。如果我按下这个,我将得到在我停止训练的那一刻的网络权重。
这就是结果。它看起来不太准确,但在这种情况下,我们并不介意。我们的目标不是训练一个能完美地再现训练数据的LSTM。相反,我们的目标是训练一个LSTM来生成合理的声音片段。现在,我们已经完成了训练,这是已经放入我们的音乐生成钢琴应用程序中的网络。所以,在这里,我们已经看到了一个使用深度学习通过超前一步预测生成新数据的例子。
接下来我们要做的是研究如何使用深度学习来去噪已经存在的信号。在这个演示中,我们不使用lstm,而是使用卷积神经网络(cnn),这正是你在图像上训练网络的方式。在这个例子中,我们有人们谈话的音频数据。每个序列的持续时间大约是一个句子的长度。为了训练降噪模型,我们将洗衣机噪声添加到清洁语音数据中。被噪声干扰的语音数据将是预测器,而我们现在拥有的干净语音数据将是响应。通过这些知识,网络将学习如何去噪受干扰的信号。
因此,正如我所说,我们将使用为图像输入数据构造的网络类型。但是现在,我们有音频数据。让我们使用一种常用的技术从信号数据中创建图像,称为光谱图。我们将把干净的数据和有噪声的数据都转换成频谱图图像。频谱图是对短段数据的傅里叶变换,也称为短时间傅里叶变换。它在一个轴上输出频率,在另一个轴上输出时间。我们将获取每个噪声音频的频谱图,并将其向后移动,以便我们最终得到八个连续的频谱图。我们将使用基于这些频谱图的图像来训练网络。基本上,这些8乘129的图像是连续8次的8个频率向量。预测或估计将基于最新的时间频率向量。
在我们再次进入MATLAB之前,让我们简单地看看cnn是如何工作的。在一个非常高的水平上,卷积神经网络的工作方式就像我们在这张图中看到的那样。我们有多层,在很多步骤中,我们用不同大小的滤波器进行卷积。第一层过滤器学习识别低级特征,例如颜色和非常简单的形状。后面的层将学习识别更高级的功能。
让我们回到MATLAB。我先给你们看一个例子看看我们最后用这个去噪网络能得到什么。这是一个应用程序,我可以在上面选择听哪个信号。让我们从将噪声作为信号开始。
这就是噪声信号的声音。它的信噪比为0分贝,这是对原始信号非常严重的失真。让我们听一下去噪后的信号——记住,我们试图去除的是洗衣机的噪音。
如果第二张弓的红色落在第一张弓的绿色上,结果就是一张宽得不正常的弓
所以这里发生的是有噪声的信号已经通过了网络,这里我们有网络的输出。我们可以听到洗衣机的噪音几乎完全消失了。让我们播放干净的音频数据。
关于彩虹已经形成了许多复杂的观点。
这是原始的声音,我们将使用作为基础真理。我将转到我们训练网络执行去噪的脚本。要进行深度学习,我们需要一个相当大的数据集。在声音数据文件夹中,我们有121,000个MP3格式的声音文件。为了方便地处理这些文件,我们将创建一个数据存储,它基本上是指向数据的指针。数据存储对象非常小——如图所示,只有8个字节。具体来说,这是一个音频数据存储,具有特定于音频的功能。
接下来,我将选择要处理的数据子集,也就是1000个文件。当然,最好使用更大的数据集,但为了节省时间,我们现在将使用1000个数据集。让我们读入数据存储中1,000个文件中的一个,并将其命名为cleanAudio。
这个数据是48千赫兹,但8千赫兹就足够了。我们创建一个采样率转换器对象,然后我将对干净的音频文件进行采样,以减少一些计算负载。我们将在这个信号中加入一些噪声。在这种情况下,就会是洗衣机的噪音。我们在噪声文件中随机选择一个位置,然后计算噪声功率和语音功率,使噪声音频的信噪比为0分贝。正如我之前所说,这是一个相当严重的失真的原始信号,所以干净的音频几乎是难以区分的。我们来听听这是什么声音。
我将继续画出我们现在得到的两个信号。我们可以在这里看到信号的巨大差异。神经网络的目标是输入有噪声的音频,并输出一些尽可能接近干净音频的东西。我在幻灯片中提到过我们将使用一种叫做短时傅里叶变换的技术,也被称为频谱图,从音频信号中生成这些图像。让我们定义做光谱图所需的参数。我们将使用长度为256的汉明窗口,重叠部分为窗口长度的75%。在此之后,我们通过使用我们刚刚定义的所有参数对干净数据和有噪声数据进行频谱图来创建短时傅里叶变换。
我们还没有八段频率矩阵。我们来创建它。就像我在幻灯片中展示的,我们只创建了8个频谱图的副本,每一个都平移一个频谱图时间步。这就是我们创建目标和预测器的方法。
尽管我们在一段时间前创建了数据存储,但我们仍然没有使用所有数据。现在让我们开始处理我们选择保留的所有1000个文件。为此,我们将数据存储转换为一个高数组。什么是高数组?高数组是指拥有比实际内存容量更多行的数组——非常适合大数据集。当我在tall数组上执行一组命令时,在调用gather函数之前,它们将保持未计算状态。这种延迟计算使我们能够快速处理大型数据集。当我们最终使用gather请求输出时,MATLAB在可能的情况下组合队列计算,并对数据进行最少的遍历次数。如果你的电脑有多个核,这也可以并行执行。
在下一节中,我们将在这个helper函数的一行中完成对那个文件所做的整个过程——从读取它,到获取目标和预测器。直到我们运行gather命令,函数才真正开始运行。我们可以看到MATLAB已经确定我们只需要做一次数据传递就可以在辅助函数中进行计算。现在我们只需要规范化预测器和目标数据,这在深度学习中是非常标准的过程。在我们开始训练网络之前,让我们留出数据进行验证,以便能够发现过拟合。
那么,现在我们已经了解了网络架构。正如我前面提到的,我们将创建图像输入数据,以便我们可以利用图像可用的网络类型。让我们开始设计一个卷积神经网络。我可以像这里一样用代码来写,但我也可以在一个叫做深度网络设计器的应用程序中快速设计它。在这个应用程序中,我可以拖放我感兴趣的图层。我将从一个图像输入层开始,它的大小如下——特征的数量,即频率分辨率,为129,时间段的数量,即8。之后,我抓取一个卷积层,并添加一些过滤器设置,如过滤器大小和过滤器数量。欺骗层之后是规范化层,然后是激活层。
我们有一个重复的con层,我可以继续复制粘贴那些应该是相同的。如果我数到最后,我们总共有16个骗局层。
我们将以回归层结束。这就计算了半均方误差损失。我可以按下外范围键,这样图层就会整齐地对齐,然后我将按下分析键,看看架构中是否有任何错误。我得到三个错误,它们说“缺少输入”和“缺少输出”。我可以看到它们就在网络的开始。如果我回到图中,我可以看到我忘记连接第一层了。我把它们连接起来,再次分析,这一次,一切正常。
这个网络总共有48层。为了利用我在这里设计的这个架构,我只需要点击导出。就像在前面的例子中一样,我们将设置一些关于如何训练这个模型的训练选项。我们设置epoch,以便对数据进行三次遍历,因此每批处理由128张图像组成。在这之后,我们只需要做训练。我将插入训练数据、层和选项。由于这是一个回归问题,我们用蓝色表示均方根误差,而不是准确度上升。我们可以看到误差在稳步下降,然后在略低于4的误差处趋于平缓。黑色的验证数据表明模型没有过拟合。
现在我们有了一个可以接受新数据的火车网络。因此,让我们读入一个新文件,给它添加一些噪声,并在网络中运行它。让我们把干净的语音、有噪声的语音和去噪的语音画出来。我们可以看到,去噪后的语音的外观更接近于清晰语音,而不是噪声语音。如果我们播放它,我们可以听到它听起来就像在应用程序中一样。
这就是一个用卷积神经网络创建去噪网络的例子。这就是我的全部。
我们希望你觉得这次网络研讨会对你有用,我们的网站上还有更多的例子供你探索。有关信号数据深度学习的更多信息,以及尝试示例,可以访问我们的文档页面。你可以通过这些链接了解更多关于MATLAB中的机器学习和深度学习解决方案。金宝搏官方网站谢谢收听。
您也可以从以下列表中选择一个网站:
选择中国站点(中文或英文)以获得最佳站点性能。其他MathWorks国家站点没有针对您所在位置的访问进行优化。