工程师深度学习,第5部分:部署深度学习模型
从系列:面向工程师的深度学习
布莱恩•道格拉斯
一旦你有了一个深度神经网络来分类你的数据,你就可以把它合并到一个更大的设计中。本视频涵盖了额外的工作和注意事项,以帮助您获得信心,相信模型将工作在不可见的数据上,并与其他系统组件按预期进行交互。您还可以将深度神经网络部署到需要特定性能特征的目标设备上。
在上一集视频中,我展示了如何通过重新训练现有的深度神经网络来构建击掌计数器。我从基本上什么都没有到大约2小时就能跑完,这真是太棒了!
但是,简单地获得一个可以对数据进行分类的模型并不是深度学习工作流程的终点。我们需要考虑的其他一些事情是,经过训练的网络通常是更大系统的一部分,我们希望能够将其纳入到完整的设计中。我们还希望对模型能够处理不可见的数据有一定的信心,并且它能够与其他系统组件进行预期的交互。最终,我们希望将它部署到需要特定性能特性的目标设备上。在上一节的基础上每一项都需要额外的工作和考虑。这就是我们现在要讨论的。我希望你能留下来看。我是Brian,欢迎来到MATLAB技术讲座。
我们可以用一个问题来总结这个视频。我有一个训练有素的网络,下一步是什么?在我们开始之前,我想重申我一贯的警告,这个视频并不是要涵盖所有内容。我只是想介绍一些概念让你们思考整个问题。我在描述中留下了更深入的资源链接。
好了,我们开始吧。
在上一集视频的最后,我们剩下了一个经过重新训练的GoogleNet模型它可以识别两种模式,它在寻找这些粉色的火山并将它们分类为击掌而我们通过网络发送的任何其他东西都被分类为不击掌。所以,接下来是什么?嗯,我认为想知道网络是否有效是有道理的。现在,我们知道它以某种方式工作,因为在训练过程中,它使用了40张验证图像来评估模型的准确性,它只在40张图像中错误标记了一张。
这当然很棒,但有两件事我想指出。首先,尽管我们有信心这个模型对40张验证图像有效,但我们不一定知道它对尚未见过的图像是否有效。现在,如果这40个验证图像很好地覆盖了整个解决方案空间,那么我们可以确信,网络只会遇到与这些图像之一相似的情况。然而,在这种情况下,40张图像已经足够为我正在制作的视频增加信心,但我不认为这足以覆盖网络可能在现实生活中看到的所有可能的手臂运动,所以如果我们要将这个网络部署到现场,我们要做一些额外的测试。
关于这个模型,我想指出的第二件事是我们用彼此不相关的尺度图图像来验证它。我的意思是每一个都来自于它自己独立的手臂运动,但我使用这个网络的方式不是这样的。记住,我要传递的是一个连续的标量图我要计算数据中击掌的次数。这意味着,当数据穿过窗口时,我将传递多个包含相同击掌的帧,我的网络将连续多次返回击掌标签。由于网络中的错误-它错过了1 / 40 -这些帧中的一些将被错误标记。这两种情况都会导致计数器关闭如果我假设每个标记为击掌的标量图实际上是它自己独特的运动。
所以,神经网络只是我的计数器所需要的整体逻辑的一部分。这几乎肯定是所有深度神经网络解决方案的情况。你要开发一个可以对数据进行分类的模型,显然你想知道它是否有效,但除此之外,还有其他逻辑使网络成为实际产品,重要的是系统作为一个整体也能正常工作。
现在,我的项目相当简单,如果它不能正确地工作,风险也非常低,但让我介绍一下我构建其余击掌计数逻辑的方法。我编写了一个MATLAB脚本,可以读取加速数据,并将最新的1.4秒数据保存在缓冲区中。然后每隔3个采样时间,将缓冲后的数据预处理成一个尺度图,确保没有大于1的像素值,然后用分类函数将其在经过训练的网络中运行。然后,如果距离上次击掌超过1.4秒,我才会计算新的击掌。这就是我如何确保我只计算每个击掌一次,因为它将完全离开缓冲区之前,我寻找一个新的。我是用MATLAB做的,因为我只需要几行代码就可以完成这个项目,但这整个东西也可以在Simulink中开发。
事实上,这是我击掌计数器的Simulink版本。嗯,几乎一模一样。不同之处在于,我没有实时读取加速度计,而是选择读取我之前保存的5秒加速配置文件。我的想法是,我可以收集这些5秒的片段,我知道在数据中有多少个击掌,然后在我更新网络或其他逻辑时,在回归测试中使用它们。
除此之外,这个逻辑的其余部分是做同样的事情。我在更新加速缓冲区,把它预处理成一个标量图,用我训练过的网络对它进行分类,然后计算击掌的次数。让我们打开作用域并运行它,这样您就可以看到它的实际运行情况。
最上面的图表显示的是在加速文件中有一个单独的击掌,就在开始。计数器只记录了一个击掌,正如预期的那样,即使你可以看到几个刻度图被标记为击掌,因为粉红色的火山在图像上划过。另一件需要注意的事情是实际击掌和计算击掌之间的延迟。这是因为我的网络训练有素,能够在击掌动作出现在图片中间的时候,或者击掌动作发生后大约零点几秒的时候识别出击掌动作。
好的,关于Simulink的好处是,我现在可以把这个逻辑打包到它自己的子系统中,并且可以把它作为一个更大的系统的一部分使用。例如,这个模型展示了作用在机械臂上的多回路PI控制器的实现。如果我愿意的话,我可以用我的新子系统来确定这个机械臂是否做过类似击掌的动作。而且,一旦我对这个实现感到满意,我就可以使用Simulink编码器来构建嵌入式C代码,并将所有这些逻辑,包括我的深度神经网络部署到手臂本身。
现在我不打算做更多的东西因为我只是做一个视频来演示一些东西,但如果我真的想继续这个项目,我的下一步是系统地尝试所有我能想到的不同的手臂动作,包括击掌和非击掌的动作。我甚至可能会让来自不同文化背景的人尝试一下。每一个用户动作被系统错误分类的实例,我都会保存这些数据,并将其添加到我的训练数据集中,以重新训练和改进网络。
现在,通过这种方式,我不能保证有一个完美运行的网络,但我正在增加解决方案空间,我相信它将在此基础上运行。这是深度神经网络的标准方法。我们还没有一个很好的系统的方法来验证它们,所以我们依赖这些抽样方法,比如蒙特卡洛方法来获得整个解空间中网络的信心。这很可能也是你的项目的情况,无论你是在寻找材料缺陷,挑选音频中的口头命令,还是分类射频调制方案。你要把经过训练的神经网络集成到你的整个系统中,并在各种情况下对它进行测试。
但是正如您所看到的,无论我运行了多少个不同的测试,总是会有解决方案空间中没有经过测试的部分。
这就是合成数据的强大之处。还记得在第二集视频中,我们合成了射频数据,我们的想法是用它来训练网络吗?现在我们可以使用它来生成数百万个不同的测试用例,并生成解决方案空间的一个非常密集的抽样。这会让我们对这个系统有很大的信心只要合成的数据反映了现实。现在,我不能在我的击掌项目中这么做,因为我对击掌可能产生的加速度模式没有很好的理解,因此不能很容易地合成它。对于我的项目来说,物理测试比综合测试数据更容易。
但是不管您是否可以合成测试数据,您都希望在真实的硬件上对系统进行最终测试。这就引出了我想讨论的另一件事,即将网络和其他代码部署到目标计算机上。
部署是重要的,因为你的代码是否工作并不重要,如果它不能在它应该运行的硬件上工作。我在描述中链接了一堆很好的信息,直接从MATLAB和Simulink为嵌入式gpu、cpu和fpga生成优化的深度学习网络代码。这里我就不细讲了。相反,我想用最后几分钟的时间专门谈谈这个训练有素的网络的规模和速度。
对于要部署在手表上的嵌入式CPU上的击掌计数器,重要的是要考虑到网络的大小。我从GoogleNet开始,如果我打开深度网络设计器,我可以很快得到这个网络的大小。这个神经网络有七百万个参数。这对于一个简单的击掌计数程序来说是相当大的。
如果内存空间或执行速度是一个问题,那么我将不得不找到一个方法使它更小。有几种选择。首先,我可以从一个较小的预先训练的网络开始——像Squeezenet这样只有100多万个参数的网络,然后再次使用迁移学习来重新训练它来击掌。我的想法是,也许我不需要更大的GoogleNet提供的准确性或功能细节。在这里,我做了和上一集视频中相同的转移学习步骤并重新训练了Squeezenet。对于这些特定的参数,这个网络至少有90%的准确率。所以,比GoogleNet稍微不准确。现在我可以将重新训练的SqueezeNet导出到工作空间,并在我的MATLAB或Simulink仿真中运行它。但是看看这个,我们可以看到这个百万参数的网络仍然有3兆字节。
现在,如果这个大小仍然是一个问题,我可以尝试通过修剪或量化来减小网络的大小,而不是找到一个更小的相关网络。修剪就是删除网络中对特定数据分类没有多大帮助的一些参数。量化意味着将网络中的单精度或双精度权重和偏差量化为8位缩放的整数数据类型。我们的想法是,我们仍然可以从网络获得相同的性能,而不必使用高精度的数据类型。
为了让你们对简化网络有个概念在一个例子中,让我给你们展示量化训练过的网络的结果。我正在使用深度网络量化器应用程序拉入我训练的模型,并将其量化为8位缩放整数。这花费了我几分钟的时间,但这里的重要指标是网络被压缩了75%,这对其准确性没有可测量的影响。
所以,它有相同数量的参数,但是它的内存大小是四分之一。除此之外,我还可以尝试修剪网络以减少参数的数量,这也不会影响准确性,但我现在将让这个模型保持原样。
希望您可以看到,通过预先训练的网络、迁移学习、修剪和量化,您可能能够得到一个对您的应用程序具有足够规模和效率的模型。
但是如果你不能,那么最后一个选择就是从头开始构建你自己的网络架构。这个选项需要最多的训练数据和最多的训练时间,因为在一开始网络没有任何概念,所以它必须学习所有的东西。
另一个缺点是需要很好地理解不同的网络架构,才能从头创建一个高效的网络架构。但是,这就是需要权衡的地方。您需要从头开始进行多少专门的开发,以及您需要的体系结构有多高效和快。
我的击掌计数器可能会从一个更小、更专业的架构中受益,因为它必须部署在手表上的嵌入式处理器上,而一个寻找材料缺陷的系统可以运行在带有GPU的专用桌面计算机上。如果不需要获得即时结果,它甚至可能不需要实时运行。
所以,我想让你们从中学到的是关于深度学习,你们需要考虑一些事情。其中一些问题是网络需要有多深才能找到数据中的模式并对其进行分类?你能通过一个相关的网络和迁移学习吗?你将如何访问标记的训练数据,你将如何确保数据覆盖整个解决方案空间?一般来说,您需要更多的训练数据来训练更大的网络,并从头开始训练网络。你将如何获得对你的网络和整个系统的信心?你能合成数据吗,你能运行模拟吗,还是所有的测试都需要在现场完成?
每个项目都没有统一的答案,但希望你能开始看到深度学习的好处和可能性。也许您正在处理一个工程问题,解决方案归结为能够检测和标记数据中的复杂模式。如果是这样的话,深度学习是你可能想要考虑作为你职业研究的一部分的一种方法。这可能比你想象的要简单。
这节课就讲到这里。不要忘记查看我在视频描述中留下的参考资料。那里有很多好东西。如果你不想错过其他Tech Talk视频,不要忘记订阅这个频道。另外,如果你想查看我的频道,控制系统讲座,我也在那里涵盖了更多的控制主题。感谢收看,我们下期见。
相关产品2022世界杯八强谁会赢?
了解更多
您也可以从以下列表中选择网站:
如何获得最佳的网站性能
选择中国网站(中文或英文)以获得最佳的网站表现。其他MathWorks国家网站没有针对从您的位置访问进行优化。