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