电子书

深度学习实用指南:从数据到部署

第 5 章:测试和部署深度学习模型

第 5 章

测试和部署深度学习模型


现在,您有了一个可对数据分类的模型,但深度学习工作流还没有结束。您还需要确信模型适用于陌生数据,并且能够按预期方式与其他系统组件交互。本章介绍如何将模型部署到有特定性能要求的目标设备。

节

将网络集成到其他系统逻辑并加以测试

上一章介绍了如何训练网络以识别三轴加速度数据中的击掌模式。但是,要开发一个好用的击掌计数器,该网络只是其所需逻辑的一部分。系统至少还需要能执行以下操作的逻辑:

  • 从传感器读取加速度
  • 将传感器数据预处理为尺度图
  • 将尺度图传入网络
  • 对标注的击掌动作计数(模式在尺度图中一闪而过,需要一个逻辑来确保同一击掌动作不被重复计数)
深度学习-工程师-电子书-第 5 章-击掌计数器-逻辑-Simulink

上:击掌计数器逻辑在 Simulink 中的表示。下:最上方的图显示从加速度计读取的数据,中间的线条(绿色)代表标注为击掌的尺度图,最下方的图显示击掌计数。

您一定想知道该网络和其他系统逻辑是否能正常工作,因此,这里有必要进行测试。对于这个击掌计数器,您知道网络本身在某些情况下可以正常工作,因为在训练过程中,网络使用 40 张验证图像来评估模型准确度,40 张图像中只有一张标注有误。

深度学习-工程师-电子书-第 5 章-验证-准确度

这是一个良好的开端,但即使您比较确信此模型能够较好地识别这 40 张验证图像,也未必知道它能否识别完全陌生的图像。因此,除了在训练期间使用的验证数据集之外,您通常还要准备一个测试数据集,用来确保网络准确度在整个解空间内都是可接受的。

对于这个击掌计数器,40 张图像足以在训练过程中验证该网络是否收敛,但还不足以涵盖网络实际可能遇到的所有各种手臂动作。将此网络部署到实际应用前,需要执行额外测试。在测试系统并确信它能够较好地实现后,您可以使用 Simulink Coder™ 生成嵌入式 C 代码,并将包括深度神经网络在内的所有这些逻辑部署到手臂上的设备。

测试可能需要系统化地尝试手表可能经历的所有不同的手臂动作,包括击掌动作和非击掌动作。您需要涵盖尽可能广泛的人群来构建具有代表性的训练集,并捕获整个解空间。对于系统分类错误的用户动作实例,您可以保留相应的数据,并将这些数据添加到训练集以重新训练和改进网络。

必须注意的是,只对整个解空间的一部分进行采样是无法确保网络性能完美无缺的,但网络性能确信可靠的范围增大了。对于深度神经网络,这是一种标准做法。到目前为止,还没有一个好的系统化方法可以验证深度神经网络,因此我们通常依赖蒙特卡罗方法等采样方法来提升我们对整个解空间内网络性能的信心。

您的项目很可能也需要用蒙特卡罗方法进行测试,包括寻找材料缺陷,辨别音频中的口头指令,进行射频调制方案分类,等等。您要将经过训练的神经网络集成到您的完整系统中,并在各种情形下测试它。

切记,无论您运行了多少不同的测试,始终会有部分解空间尚未测试到。

深度学习-工程师-电子书-第 5 章-蒙特卡罗

使用蒙特卡罗方法测试整个解空间。该网络已针对部分解进行了测试,但是大部分解未经测试。

此时,合成数据就能发挥巨大的作用。本书第 2 章介绍了如何合成射频数据以用于训练网络。同样,您也可以使用合成数据生成几百万个不同的测试用例,从而得到解空间的高密集采样。这可以大大提升您对系统性能的信心。

深度学习-工程师-电子书-第 5 章-蒙特卡罗-合成测试数据

使用蒙特卡罗方法测试整个解空间。借助合成的测试数据,可以快速覆盖更多解空间。

不过,对于击掌计数器,合成数据存在困难,因为难以对手臂动作的所有加速度模式进行准确建模,也难以获知其中哪些动作是击掌动作。因此,对于有些项目,对网络执行物理测试比合成测试数据更简单。

无论能否合成测试数据,我们都会希望最终能在现实世界的真实硬件上测试系统。

节

部署网络

如果您的代码在目标硬件上运行不了,那代码仿真的结果再好也无济于事。

要确保代码能在目标硬件上运行,您要做的一项工作是评估网络的大小及其执行速度。如果网络太大或执行时间太长,您可以使用较小的预训练网络作为起点。试想,对于采用 GoogLeNet(700 万个参数)的项目,如果改为基于 SqueezeNet(100 万个参数)进行迁移学习,运行效果是否一样?

深度学习-工程师-电子书-第 5 章-预训练-大小

如果网络仍然太大,与其搜寻更小的预训练网络,您不妨尝试通过剪枝或量化来缩小网络。

剪枝是删除网络中那些对您的数据分类作用不大的参数。

量化是将网络中的单精度或双精度权重和偏置量化为 8 位定标整数数据类型。通过量化,您不必使用高精度数据类型,也能获得同样的网络性能。阅读 int8 量化简介及其广泛运用于深度神经网络的原因了解更多信息。

为了通过实例让您直观感受到缩小网络的效果,以下是使用深度网络量化器将击掌网络量化为 8 位定标整数的结果。经过短短几分钟,网络被压缩了 75%,而其准确度不会受到任何实质影响。

深度学习-工程师-电子书-第 5 章-深度网络量化器

您应该能发现,借助预训练网络、迁移学习、剪枝和量化,您或许就能得到大小和效率与您的应用相适应的模型。

如果网络仍然过大,最后的方案是从头开始自行构建网络架构。该方案需要的训练数据最多、训练时间最长,因为最初网络对一切一无所知,什么都需要学习。

另一个难点在于,您必须对不同的网络架构有着极为深刻的理解,才能从头开始创建高效的网络。

节

重点小结

如果打算在您的应用中使用深度学习,您需要考虑网络的架构、训练数据的获取、是否使用仿真,以及如何提升对网络和系统整体性能的信心。

不同的项目有不同的应对方法,但我们希望本书能帮助您初步了解深度学习带来的好处和可能性。或许您手头有一个工程问题,其解决方案归结为需要有能力检测和标注数据中的复杂模式。这时,不妨考虑使用深度学习方法来解决您的问题。它或许比您想象的要简单。