深度学习实用指南:从数据到部署
第 5 章
测试和部署深度学习模型
现在,您有了一个可对数据分类的模型,但深度学习工作流还没有结束。您还需要确信模型适用于陌生数据,并且能够按预期方式与其他系统组件交互。本章介绍如何将模型部署到有特定性能要求的目标设备。
![深度学习-工程师-电子书-第 5 章-击掌计数器-逻辑-Simulink](https://ww2.mathworks.cn/campaigns/offers/next/practical-guide-to-deep-learning/testing-deployment/_jcr_content/mainParsys/band_2102914970/mainParsys/lockedsubnav/mainParsys/image_copy_copy_copy.adapt.full.medium.jpg/1713344894647.jpg)
上:击掌计数器逻辑在 Simulink 中的表示。下:最上方的图显示从加速度计读取的数据,中间的线条(绿色)代表标注为击掌的尺度图,最下方的图显示击掌计数。
您一定想知道该网络和其他系统逻辑是否能正常工作,因此,这里有必要进行测试。对于这个击掌计数器,您知道网络本身在某些情况下可以正常工作,因为在训练过程中,网络使用 40 张验证图像来评估模型准确度,40 张图像中只有一张标注有误。
![深度学习-工程师-电子书-第 5 章-验证-准确度](https://ww2.mathworks.cn/campaigns/offers/next/practical-guide-to-deep-learning/testing-deployment/_jcr_content/mainParsys/band_2102914970/mainParsys/lockedsubnav/mainParsys/image_copy_copy_copy_938227591.adapt.full.medium.jpg/1713344894674.jpg)
这是一个良好的开端,但即使您比较确信此模型能够较好地识别这 40 张验证图像,也未必知道它能否识别完全陌生的图像。因此,除了在训练期间使用的验证数据集之外,您通常还要准备一个测试数据集,用来确保网络准确度在整个解空间内都是可接受的。
对于这个击掌计数器,40 张图像足以在训练过程中验证该网络是否收敛,但还不足以涵盖网络实际可能遇到的所有各种手臂动作。将此网络部署到实际应用前,需要执行额外测试。在测试系统并确信它能够较好地实现后,您可以使用 Simulink Coder™ 生成嵌入式 C 代码,并将包括深度神经网络在内的所有这些逻辑部署到手臂上的设备。
测试可能需要系统化地尝试手表可能经历的所有不同的手臂动作,包括击掌动作和非击掌动作。您需要涵盖尽可能广泛的人群来构建具有代表性的训练集,并捕获整个解空间。对于系统分类错误的用户动作实例,您可以保留相应的数据,并将这些数据添加到训练集以重新训练和改进网络。
必须注意的是,只对整个解空间的一部分进行采样是无法确保网络性能完美无缺的,但网络性能确信可靠的范围增大了。对于深度神经网络,这是一种标准做法。到目前为止,还没有一个好的系统化方法可以验证深度神经网络,因此我们通常依赖蒙特卡罗方法等采样方法来提升我们对整个解空间内网络性能的信心。
您的项目很可能也需要用蒙特卡罗方法进行测试,包括寻找材料缺陷,辨别音频中的口头指令,进行射频调制方案分类,等等。您要将经过训练的神经网络集成到您的完整系统中,并在各种情形下测试它。
切记,无论您运行了多少不同的测试,始终会有部分解空间尚未测试到。
![深度学习-工程师-电子书-第 5 章-蒙特卡罗](https://ww2.mathworks.cn/campaigns/offers/next/practical-guide-to-deep-learning/testing-deployment/_jcr_content/mainParsys/band_2102914970/mainParsys/lockedsubnav/mainParsys/image_copy_copy_copy_627278874.adapt.full.medium.jpg/1713344894700.jpg)
使用蒙特卡罗方法测试整个解空间。该网络已针对部分解进行了测试,但是大部分解未经测试。
此时,合成数据就能发挥巨大的作用。本书第 2 章介绍了如何合成射频数据以用于训练网络。同样,您也可以使用合成数据生成几百万个不同的测试用例,从而得到解空间的高密集采样。这可以大大提升您对系统性能的信心。
![深度学习-工程师-电子书-第 5 章-蒙特卡罗-合成测试数据](https://ww2.mathworks.cn/campaigns/offers/next/practical-guide-to-deep-learning/testing-deployment/_jcr_content/mainParsys/band_2102914970/mainParsys/lockedsubnav/mainParsys/image_copy_copy_copy_2021759508.adapt.full.medium.jpg/1713344894728.jpg)
使用蒙特卡罗方法测试整个解空间。借助合成的测试数据,可以快速覆盖更多解空间。
不过,对于击掌计数器,合成数据存在困难,因为难以对手臂动作的所有加速度模式进行准确建模,也难以获知其中哪些动作是击掌动作。因此,对于有些项目,对网络执行物理测试比合成测试数据更简单。
无论能否合成测试数据,我们都会希望最终能在现实世界的真实硬件上测试系统。
![深度学习-工程师-电子书-第 5 章-预训练-大小](https://ww2.mathworks.cn/campaigns/offers/next/practical-guide-to-deep-learning/testing-deployment/_jcr_content/mainParsys/band_2102914970/mainParsys/lockedsubnav/mainParsys/image_copy_copy_copy_1682318301.adapt.full.medium.jpg/1713344894779.jpg)
如果网络仍然太大,与其搜寻更小的预训练网络,您不妨尝试通过剪枝或量化来缩小网络。
剪枝是删除网络中那些对您的数据分类作用不大的参数。
量化是将网络中的单精度或双精度权重和偏置量化为 8 位定标整数数据类型。通过量化,您不必使用高精度数据类型,也能获得同样的网络性能。阅读 int8 量化简介及其广泛运用于深度神经网络的原因了解更多信息。
为了通过实例让您直观感受到缩小网络的效果,以下是使用深度网络量化器将击掌网络量化为 8 位定标整数的结果。经过短短几分钟,网络被压缩了 75%,而其准确度不会受到任何实质影响。
![深度学习-工程师-电子书-第 5 章-深度网络量化器](https://ww2.mathworks.cn/campaigns/offers/next/practical-guide-to-deep-learning/testing-deployment/_jcr_content/mainParsys/band_2102914970/mainParsys/lockedsubnav/mainParsys/image_copy_copy_copy_172989705.adapt.full.medium.jpg/1713344894804.jpg)
您应该能发现,借助预训练网络、迁移学习、剪枝和量化,您或许就能得到大小和效率与您的应用相适应的模型。
如果网络仍然过大,最后的方案是从头开始自行构建网络架构。该方案需要的训练数据最多、训练时间最长,因为最初网络对一切一无所知,什么都需要学习。
另一个难点在于,您必须对不同的网络架构有着极为深刻的理解,才能从头开始创建高效的网络。
您也可以从以下列表中选择网站:
如何获得最佳网站性能
选择中国网站(中文或英文)以获得最佳网站性能。其他 MathWorks 国家/地区网站并未针对您所在位置的访问进行优化。
美洲
- América Latina (Español)
- Canada (English)
- United States (English)
欧洲
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)
亚太
- Australia (English)
- India (English)
- New Zealand (English)
- 中国
- 日本Japanese (日本語)
- 한국Korean (한국어)