工程师深度学习,第4部分:使用迁移学习
从系列中:面向工程师的深度学习
布莱恩•道格拉斯
这个视频向你展示如何使用转移学习修改现有的深度网络架构,并重新训练它来完成您的任务,而不是它原来的任务。观看一个关于如何使用迁移学习来识别加速数据中的击掌动作的例子。
在本系列的第一个视频中,我谈到了我们如何使用深度学习来识别数据中的复杂模式,我开玩笑地说,一个例子可以是使用加速计来识别和计数击掌。事实证明这并不是一个笑话因为这是我在一个我刚刚训练的网络上测试的结果。而且效果非常好。在这个视频中,我想谈谈这是如何完成的,我所做的数据预处理以及为什么转移倾斜能让我在短短几个小时内解决这个问题。我希望你能留下来看。我是Brian,欢迎来到MATLAB技术讲座。
对于这个项目,我使用一个简单的MEMS加速度计,它连接到Arduino上。Arduino读取传感器并将测量结果打印到串行总线上,然后通过USB连接到我的电脑上。我正在用MATLAB读取串行总线,并在屏幕上绘制最后一秒半的数据。你可以看到,当我移动加速度计时,它是如何相应地改变图形的。现在,这只是一种随机的运动,但我真正想要的是可以识别一个非常特定的加速序列的东西。击掌。当然,这是一种简单的击掌动作因为我使用的电缆很短,但这将是我要教一个深度神经网络学习的动作你们只要想象一下这是一个完整的击掌动作在所有的荣耀中。
这就是我要找的加速度模式。我解决这个问题的一般方法是把这个三维信号变成图像,我可以用它来训练一个深度神经网络。这和我们在上一集视频中所做的类似我们用短时间傅里叶变换预处理音频信号来创建频谱图。
我在这里也可以这样做它可能会很好,但我要做的是使用连续小波变换来创建一个尺度图。尺度图是信号的另一种时频表示,但它与光谱图的不同之处在于它更适合于存在于多个尺度的信号。这是一种低频信号,变化缓慢,但偶尔会被高频瞬变干扰。它们对心电图等具有这种特殊心跳模式的信号很有用,事实证明,它们对偶尔与移动缓慢的手击掌也很有用。
在这个视频中我不打算深入讨论标量图的细节,因为我还有很多其他的东西要讲,但是我在描述中留下了一些很好的资源,如果你想了解它是什么以及如何在MATLAB中创建它,你应该去看看。
好的,我想指出的第一件事是我们需要3张图片来表示击掌,因此,我必须将3张图片输入到我的网络架构中。幸运的是,许多体系结构已经设置为可以输入具有红色、蓝色和绿色通道的彩色图像。因此,为了适应现有的架构,我所做的是将x尺度图分配给红色通道,y分配给绿色通道,z分配给蓝色通道,然后将它们组合起来创建一个单一的彩色图像。这种粉红色的火山,山顶冒出一些烟,这就是击掌的尺度图。
这个图像看起来很酷,我觉得但如果我们看看实时加速度流的尺度图会更酷。每次采样时,我从传感器接收一个新的测量值,我更新最近几秒数据的缓冲区,然后创建尺度图。当我移动传感器时,你可以看到图案和颜色的变化。真正酷的是,你可能不知道我是不是在击掌庆祝通过原始加速数据流,但我敢肯定,你可以看到特色的粉红色火山划过每隔一段时间。这是一个非常明显的模式。现在我们可以用这些处理过的数据训练一个深度神经网络来找到那个明显的模式。
为了做到这一点,我至少还需要两样东西——我需要一些带有标记的击掌标量图的训练数据,以及一些没有击掌的训练数据。我需要一个架构。
让我们先谈谈架构。而不是完全从头开始设计和训练一个架构,我们可以建立在已经存在的转移学习的基础上。迁移学习是修改一个现有的架构,然后再训练它来完成您的任务,而不是最初训练它的任务。
为了理解这意味着什么,让我们回顾一下我们在第一个视频中讨论的内容,对这些基于图像的体系结构进行了非常基本的描述。他们在数据中寻找模式,或者在这种情况下,在图像中寻找模式。它通过在早期的图层中寻找像斑点、边缘和颜色这样的原始特征来实现这一点,然后随着你在图层中的进展,它将它们组合成更复杂的特征,然后最终将它们组合成可以标记的最终模式。
再说一次,这是对这些网络的过度简化,但这是描述迁移学习有用的过度简化。让我们假设这是一个经过充分训练的网络,可以识别图像中的花朵。
不明显,一个被训练来识别花朵的网络不会很好地在我们的尺度图中分类击掌模式。但是,有趣的是,斑点、颜色、循环、线条,以及类似的特征存在于几乎所有的图像中,包括我们的尺度图。只有网络中的最后几层才能结合这些特征,并根据你想分类的图像类型进行最终分类。
所以,我们可以把经过训练的图像分类网络的第一部分看作是一个通用的特征识别器,因此,保留它们,砍掉负责特定分类的最后几层,然后用新的层替换它们,这些层可以输出我们想要分类的标签。
现在,理论上训练这个网络应该快得多,需要的数据也少得多,因为网络需要学习的东西少得多。它不需要学习如何识别原始特征,只需要学习如何将它们组合起来以识别您正在寻找的更大的模式。
这很好,因为大多数图像网络需要数以百万计的训练图像和数周的时间使用几个高端GPU进行训练。我没有时间,没有硬件,也没有足够的臂力来创建数百万个击掌训练图像,然后训练一个巨大的网络。
这就是我要做的。我将从一个现有的网络开始,修改最后几层,然后用少量的训练数据对它进行再训练。所以,让我们开始吧。
我可以从许多不同的预先训练过的图像分类网络开始。它们都有自己的执行速度、数据库大小和预测精度。我将在这个项目中使用GoogleNet,但我保证这个选择不会归结为任何逻辑推理,这只是因为我的项目基于的MATLAB示例使用了GoogleNet和转移学习来识别心电图信号的模式。为了和这个例子保持一致,我做了同样的操作。
我们可以在深度网络设计器应用中打开它,直观地看到所有层以及它们是如何连接的。看看这个建筑!它有144层。在这个架构中有很多不同的东西。在开始时有一些卷积层,然后是一系列并行的初始层,并且有许多这样的分组,一个接一个。幸运的是,在我们的迁移学习示例中,我们不需要真正关注这些层中的大多数。重要的在最后。这一层是完全连接层,这意味着每个输入,有1024个,连接到每个输出,有1000个。简单地说,我们可以这样想:这个网络已经学习了1024个不同的复杂特征,它使用这些特征的组合来分类1000个不同的对象。所以,这个层的输出值最大的那个就会被分配到与那个特定神经元相关的标签。 And it finds the maximum values with this probability layer and then determines the label with this output layer. You can see the labels here, tench, goldfish, great white shark and 997 others.
因此,对于这个项目,我们只需要更换两个层;全连接层和输出层。我可以拖拽一个完全连接的新层到我们的网络中,然后点击它,我可以改变它的参数。我希望将输出大小设置为2,这实际上意味着我们希望这一层组合1024个输入特征,以仅识别两种主要模式。由于这一层根本没有经过训练,我将把权重和偏见学习率因子增加到5。这将允许该层在每个训练周期中进行更大的更改。
我们需要替换的第二层是最后的输出层,这样它只有两个标签,击掌和不击掌。它会从训练数据中自动确定这些标签是什么,我们不需要在这里指定它们。就这样,我们将使用剩下的网络!
现在我们几乎已经准备好开始训练了,但首先我们需要创建我们的训练数据。
ECG示例使用了大约160个图像进行训练验证,所以为了保持与这个数量级一致,我选择记录100个击掌图像和100个非击掌图像。我创建了一个循环100次的脚本,每次循环记录1.5秒的加速数据,并将标量图保存在一个数据文件夹中。我很擅长安排我的击掌时间,这样我就可以在靠近窗口中间的地方击掌,但我必须浏览完整的图片列表,并删除那些看起来不太好的图片。我不想让那些不好的形象影响训练。但总的来说,你可以清楚地看到粉色的火山。
我也为另一家厂牌做了同样的事,没有击掌。在这里,我只是记录了各种各样的事情,比如没有运动,轻微的随机运动,以及其他类似于击掌但不完全是击掌的更快的运动。
就是这样。创建好训练数据并准备修改GoogleNet之后,我就可以开始训练了。
让我们回到MATLAB中的deepNetworkDesigner应用。在data选项卡下,我们可以导入刚刚创建的所有训练数据。我的所有数据都存在于data文件夹和high_five和no_high_five子文件夹中。子文件夹的名称是它提取标签的地方。如果我愿意,我也可以通过缩放,平移或旋转来扩大所有这些数据以覆盖所有可能的解条件,但我将保持原样。最后,我将让它随机选择20%的数据用于验证。
这是我训练数据的一个快照,我们有80个击掌的例子和80个不击掌的例子。在培训选项卡上,我现在可以设置我的培训选项。在这里,我对如何训练这个网络做了一些调整。我只是改变它们来匹配我之前给你们看的MATLAB例子中的训练参数。这个例子的链接在视频描述中,如果你想看的话。它非常详细地介绍了所有这些内容。好的,设置好选项后,我们就可以开始训练这个网络了。
让我们开始吧。
现在,在我们等待它训练的同时让我们谈谈我们为达到这一目标所采取的步骤。我们使用了一个被训练来识别像金鱼和鲨鱼这样的物体的网络,并将其用于在三维加速度数据中寻找模式。虽然我用它创建了一些相当愚蠢的东西,但这个过程可以用于在任何数据中查找模式。GoogleNet,尤其需要一个彩色图像作为输入,所以只要你能将数据格式化为图像,你就可以使用这个迁移学习过程。
你可以用它来进行物体检测,比如行人或街道标志,你可以用它来进行预测性维护,在数据中找到指示组件何时会失效的模式,你可以用它来寻找材料中的缺陷,你可以用它来从可穿戴电子设备的数据中找到模式,比如确定一个人是在走还是在跑,或者他们的头部是否受到了太大的冲击。这方面有上百万个用例。
也有一些网络专门用于分类声音,比如VGGish网络。我们也可以用它进行迁移学习让它在音频信号中对我们自己的声音进行分类。
这整件事真正有趣的地方在于你能多快地建立并运行一个训练有素的网络。我开始这个项目跟随一个现有的MATLAB示例,但我基本上从什么都没有到一个训练过的网络在大约2小时。这是一个CPU。现在,您的项目可能需要比我使用的更多的训练数据,可能需要一个GPU在合理的时间内进行训练,但从现有的网络开始几乎肯定比从头开始需要更少的时间和数据。从一个已有的MATLAB例子开始,有很多这样的例子,你可以更快地进入这类问题。我在描述中留下了这个示例列表的链接。
好了,我们现在已经有了一个训练有素的网络,训练大约需要4分钟。此外,这个网络使用的准确率是97%,至少使用了我们预留用于验证的20%的数据。所以它错过了40张图片中的一张。还不错!
现在,这把我们带回到我给你们看的最初的视频我在加速数据流上测试训练过的网络。每次采样时,我都会根据最新的加速度数据对尺度图进行修改,然后将图像输入到分类函数中,并让它返回一个标签。如果标签返回为击掌,我就显示它并增加击掌计数器。差不多就是这样了。结果比我预期的要简单,整个击掌计数器实际上运行起来非常令人满意。所以,我希望这能帮助你理解迁移学习的好处,也许能让你思考你的特定模式识别问题,以及像这样的技术是否能帮助你分类。
这节课就讲到这里。在下一集视频中,我想谈谈对这些训练有素的网络的验证以及我们如何才能确信它们能够工作。所以,如果你不想错过这个视频或任何其他Tech Talk视频,不要忘记订阅这个频道。另外,如果你想查看我的频道,控制系统讲座,我也在那里涵盖了更多的控制主题。感谢收看,我们下期见。
相关产品下载188bet金宝搏
了解更多
您也可以从以下列表中选择网站:
如何获得最佳的网站性能
选择中国网站(中文或英文)以获得最佳的网站表现。其他MathWorks国家网站没有针对从您的位置访问进行优化。