让我们实际启动该流程,看看会发生什么。我们使用健康数据执行两轮训练,最后将测试数据生成器切换为破坏状态。使用正常数据训练一段时间后突然采用未知数据时,我们看到神经网络遇到的所谓重构误差会有很大不同。
首先,按照设置开发环境部分的描述,再次运行
类。您会看到类似 图 3 的输出。
- Run.scala
点击查看大图
此输出意味着神经网络已在本地实例化,正等待数据实时从 IBM Watson IoT Platform MQTT 消息代理传入。
接下来,切换回运行测试数据生成器的 Node-RED 实例的浏览器窗口。单击 Reset 按钮启动测试数据生成器,以生成一些数据。
备注:尽管 Lorenz Attractor 模型不断生成数据(就像一个附加到轴承上的真实加速计传感器),但只在我们按下 Reset 按钮时,它才会将另外 30 秒的数据发布到 IBM Watson IoT Platform MQTT 消息代理;这可以预防本地运行的神经网络丢弃数据。
可以在 Node-RED 调试窗格中观察到数据是如何传输到消息代理的,因为该流包含订阅和调试 图 4 中所示的完全相同的数据流的节点。
点击查看大图
最后,切换回运行我们的神经网络的 Eclipse。可以在 图 5 中的控制台中看到一些表明数据正在传入的调试消息。我们等待填满一个基于计数的轮转窗口,使它包含 30 秒的数据。我们将把每个轮转窗口提交到神经网络。
图 6 显示了神经网络在训练期间,在收到第一个可供处理的轮转窗口后的输出。它输出实际的训练迭代和当前的重构误差。重要的是,该数字在一段时间后收敛为一个局部最小值,而且重构误差会在一段时间后显著减少。
点击查看大图
在 图 7 中,我们从迭代 0 开始,初始重构误差为 392314.67211754626。这是由于对神经网络权重参数的随机初始化所导致的。
点击查看大图
备注:我们每次运行此示例时,都会获得稍有不同的数字。
在 图 8 中,我们在迭代 999 时得到了重构误差 372.6741075529085,它比迭代 0 时的 392314.67211754626 小得多。
点击查看大图
在 图 9 中,经过第二轮训练并处理第二个轮转计数窗口后 - 我们最终在迭代 1999 时得到了重构误差 77.8737141122287。
备注:可以看到迭代 1999 时的分数比迭代 1969 时要高。这是由于振动,但并不意味着存在问题,除非您将收敛于一个很小的值。
点击查看大图
在 图 10 中可以看到,现在我们将异常数据传入神经网络中,并可以明确看到迭代 2999 时的重构误差 11091.125671441947 比 图 8 和 图 9 中高得多。
点击查看大图
备注:我在 HadoopSummit 17 大会上演示了这个端到端场景,可以在这个视频中观看该场景(我是在这个时长 34:47 的视频中的 25:06 处开始演示的)。
我们的第一篇针对 IoT 时序数据的深度学习教程到此就结束了。如您所见,在 DeepLearning4J 中定义和运行深度神经网络很简单。DeepLearning4j 框架负责了并行神经网络训练中涉及的所有复杂数学运算。在 Apache Spark 上运行它,是在弹性 Apache Spark 云环境中构建高度可扩展的认知 IoT 解决方案的理想选择,比如 IBM Cloud Data Science Experience 平台附加了它的可扩展弹性 Apache Spark“即服务”产品。此外,您不会绑定到特定的云提供商,甚至可能在您自己的私有云或传统数据中心内运行此系统。
在接下来的两篇文章中,我们将处理生成的相同测试数据,但采用两个不同的深度学习框架:ApacheSystemML 和 TensorFlow (TensorSpark)。
来源: http://www.ibm.com/developerworks/cn/analytics/library/iot-deep-learning-anomaly-detection-2/index.html