物联网的深度学习使用指南-全-

物联网的深度学习使用指南(全)

原文:annas-archive.org/md5/9eb464a9230fb72e00ae7e4b2cf3c73a

译者:飞龙

协议:CC BY-NC-SA 4.0

前言

物联网IoT)时代,大量感应设备随着时间的推移收集和生成各种感知数据,应用范围广泛。这些数据主要由基于应用的大规模、高速、实时数据流组成。与这些大数据或数据流相关的分析至关重要,它有助于学习新信息、预测未来的洞察,并做出明智决策,这使得物联网成为一个值得关注的商业范式和改善生活质量的技术。

本书将为你提供有关一类先进机器学习技术——深度学习DL)的全面概述,旨在促进各种物联网应用中的分析与学习。通过实践概览,你将了解每个过程的具体内容,包括数据收集、分析、建模、模型性能评估,以及各种物联网应用和部署设置。

你将学习如何训练卷积神经网络CNN)以开发用于基于图像的道路故障检测和智能垃圾分类的应用,接着实现由循环神经网络RNN)驱动的语音启动智能灯光控制和家庭访问机制。

你将掌握用于室内定位、预测性维护以及利用自动编码器、DeepFi 和 LSTM 网络在大型医院中定位设备的物联网应用。此外,你还将学习增强物联网安全的健康护理物联网应用开发。阅读本书后,你将能够在物联网设备上开发更复杂的深度学习应用,迈出良好的起步。

最后但同样重要的是,本书并非需要从头到尾阅读。你可以直接翻到一个看起来符合你需求或激发你兴趣的章节。如果你发现任何错误或明显的遗漏,最好提一个勘误表,而不是什么都不做,或者告诉我们,或在本书的 GitHub 仓库提交问题。谢谢!祝你阅读愉快!

本书适合谁阅读

本书面向任何希望利用深度学习(DL)技术,通过 TensorFlow、Keras 和 Chainer 分析和理解物联网生成的大规模实时数据流的人。如果你想构建自己的物联网应用,且能够预测未来的智能决策,那么本书正是你所需要的!因此,本书特别适合物联网应用开发者、数据分析师或对深度学习有兴趣的读者,这些人可能没有复杂数值计算的背景,但他们希望了解深度学习到底是什么。

本书内容

第一章,物联网的端到端生命周期,讨论了物联网的端到端生命周期及其相关概念和组件,以及物联网数据的关键特性和问题,这些问题要求在物联网中使用深度学习(DL)。此外,本章还涵盖了物联网中分析的重要性以及在数据分析中使用深度学习的动机。

第二章,物联网的深度学习架构,提供了深度学习架构和平台的基本概念,这些概念将在后续的所有章节中使用。我们将从简要介绍机器学习(ML)开始,然后进入深度学习(DL),这是机器学习的一个分支,基于一组算法,旨在对数据中的高层次抽象进行建模。我们将简要讨论一些最著名和广泛使用的神经网络架构。最后,我们将讨论深度学习框架和库的各种特性,这些将用于在物联网设备上开发深度学习应用。

第三章,物联网中的图像识别,介绍了物联网中图像数据处理应用开发的实践操作。首先,它简要描述了不同的物联网应用及其基于图像检测的决策制定。本章还简要讨论了两个物联网应用及其在实际场景中的图像检测实现。在本章的第二部分,我们将展示一个基于深度学习算法的应用图像检测实现。

第四章,物联网中的音频/语音识别,简要描述了不同的物联网应用及其基于语音/音频识别的决策制定。此外,还将简要讨论两个物联网应用及其在实际场景中基于语音/音频识别的实现。在本章的第二部分,我们将展示一个基于深度学习算法的应用语音/音频检测实现。

第五章,物联网中的室内定位,讨论了如何在物联网应用中使用深度学习技术进行室内定位,并通过实践示例进行演示。将讨论如何收集来自这些设备和技术的数据,例如,通过使用深度学习模型分析 Wi-Fi 指纹数据来预测设备或用户在室内环境中的位置。我们还将讨论一些在物联网环境中部署室内定位服务的设置。

第六章,物联网中的生理和心理状态检测,介绍了基于深度学习的物联网应用中的人体生理和心理状态检测技术。本章的第一部分将简要描述不同的物联网应用及其基于生理和心理状态检测的决策能力。此外,还将简要讨论两个物联网应用及其在实际场景中基于生理和心理状态检测的实现。在本章的第二部分,我们将展示一个基于深度学习算法的应用生理和心理状态检测实现。

第七章,物联网安全,介绍了基于深度学习(DL)的网络和设备行为数据分析,以及用于物联网应用的安全事件检测技术。 本章的第一部分将简要描述不同的物联网安全攻击及其潜在的检测技术,包括基于 DL/ML 的方法。此外,还将简要讨论两个物联网应用场景,在这些场景中,可以通过基于 DL 的异常检测智能且自动地检测安全攻击(如 DoS 攻击和 DDoS 攻击)。本章的第二部分,我们将展示一个基于 DL 的安全事件检测实现的实操示例。

第八章,物联网的预测性维护,介绍了如何使用涡扇发动机退化模拟数据集为物联网开发预测性维护的 DL 解决方案。预测性维护的核心思想是判断是否可以预测各种类型的故障模式。我们还将讨论如何从物联网设备收集数据,以实现预测性维护。

第九章,深度学习在医疗物联网中的应用,介绍了基于深度学习的医疗物联网解决方案。本章的第一部分将概述物联网在医疗领域的不同应用,接着简要讨论两个通过支持良好的物联网解决方案可以改善和/或自动化医疗服务的用例。在本章的第二部分,我们将展示这两个用例中基于深度学习的医疗事件和/或疾病检测的实操经验。

第十章,接下来是什么——总结与未来方向,总结了前几章的内容,并讨论了现有深度学习技术在资源受限和嵌入式物联网环境中的发展和实施面临的主要挑战,并通过实例加以说明。最后,我们总结了若干现有的解决方案,并指出了一些可能的解决方向,以填补基于 DL 的物联网分析中的现有空白。

为了最大化本书的价值

读者需要以下硬件配置:配备 Intel Xenon CPU E5-1650 v3@3.5 GHz、32 GB RAM、GPU 支持和 Raspberry Pi 3。此外,掌握一些 Python 及其库(如 pandas、NumPy、Keras、TensorFlow、scikit-learn、Matplotlib、Seaborn、OpenCV 和 Beautiful Soup 4)的基础知识,将有助于理解本书章节中的概念。

下载示例代码文件

您可以从您的帐户下载本书的示例代码文件,网址是www.packt.com。如果您是在其他地方购买本书,可以访问www.packt.com/support并注册,以便将文件直接通过电子邮件发送给您。您可以按照以下步骤下载代码文件:

  1. www.packt.com登录或注册。

  2. 选择“支持”标签。

  3. 点击“代码下载 & 勘误”。

  4. 在“搜索”框中输入书名,并按照屏幕上的指示操作。

下载文件后,请确保使用以下最新版本解压或提取文件夹:

  • WinRAR/7-Zip for Windows

  • Zipeg/iZip/UnRarX for Mac

  • 7-Zip/PeaZip for Linux

本书的代码包也托管在 GitHub 上:github.com/PacktPublishing/Hands-On-Deep-Learning-for-IoT。如果代码有更新,它会在现有的 GitHub 仓库中更新。我们还提供了来自我们丰富的书籍和视频目录中的其他代码包,访问地址是github.com/PacktPublishing/。快去看看吧!

下载彩色图像

我们还提供了一份 PDF 文件,其中包含本书中使用的截图/图表的彩色图像。你可以在这里下载:www.packtpub.com/sites/default/files/downloads/9781789616132_ColorImages.pdf

使用的约定

本书中使用了一些文本约定。CodeInText:表示文本中的代码词、数据库表名、文件夹名称、文件名、文件扩展名、路径名、虚拟 URL、用户输入和 Twitter 用户名。以下是一个示例:“为了进行探索,我们可以按如下方式在数据集上运行image_explorer.py。”

代码块的格式如下所示:

# Import the required modules
import urllib
from bs4 import BeautifulSoup
from selenium import webdriver
import os, os.path
import simplejson

当我们希望引起你注意某个代码块的特定部分时,相关的行或项目将被加粗显示:

import pandas as pd
import numpy as np
import tensorflow as tf
from sklearn.preprocessing import scale
from keras.models import Sequential

任何命令行输入或输出的格式如下所示:

$ mkdir css
$ cd css

加粗:表示一个新术语、一个重要的词或你在屏幕上看到的词。例如,菜单或对话框中的词会以这种形式出现在文本中。以下是一个示例:“Google Chrome | 更多工具 | 开发者工具(在 Windows 操作系统中)。

警告或重要提示将以这种形式出现。

提示和技巧将以这种形式出现。

联系我们

我们始终欢迎读者的反馈。

一般反馈:如果你对本书的任何方面有疑问,请在邮件主题中提及书名,并通过customercare@packtpub.com联系我们。

勘误:尽管我们已尽最大努力确保内容的准确性,但错误是难以避免的。如果你在本书中发现了错误,我们非常感激你能向我们报告。请访问www.packt.com/submit-errata,选择你的书籍,点击“勘误提交表单”链接,并输入相关细节。

盗版:如果你在互联网上发现我们的作品有任何非法复制形式,请提供该位置地址或网站名称,我们将不胜感激。请通过copyright@packt.com与我们联系,附上相关链接。

如果您有兴趣成为作者:如果您在某个领域有专长,且有兴趣撰写或参与书籍的创作,请访问authors.packtpub.com

评价

请留下评价。阅读并使用本书后,为什么不在您购买书籍的网站上留下评价呢?潜在读者可以看到并参考您的公正意见来做出购买决定,我们在 Packt 能够了解您对我们产品的看法,作者们也能看到您对他们书籍的反馈。谢谢!

欲了解更多关于 Packt 的信息,请访问packt.com

第一部分:物联网生态系统、深度学习技术和框架

在本节中,我们将概述物联网生态系统、物联网数据的关键特征(即实时大数据)。我们解释了为什么数据分析是必要的,以及为什么深度学习 (DL) 对于分析至关重要。我们还将探讨各种技术、它们的模型和架构,以及它们在物联网应用领域的适用性。

本节包含以下章节:

  • 第一章,物联网的端到端生命周期

  • 第二章,物联网的深度学习架构

第一章:物联网的端到端生命周期

通过使人们能够轻松访问并与各种物理设备及其环境互动,物联网IoT)将促进各个领域应用的开发,如健康医疗、智能能源管理和智能电网、交通、交通管理等。这些应用将产生大量实时/流数据,需要大数据分析工具,包括先进的机器学习,即深度学习DL),以提取有用信息并做出明智决策。为了能够在物联网应用生成的数据上应用先进的机器学习技术,我们需要了解物联网的端到端E2E)生命周期及其不同组件。

在本章中,我们将讨论物联网的 E2E 生命周期及其相关概念和组件。我们将探讨其关键特性以及物联网数据问题,这些问题要求在物联网中使用深度学习(DL)。我们将涵盖以下主题:

  • 物联网的 E2E 生命周期:

    • IoT 应用领域:

      • 分析在物联网中的重要性

      • 使用深度学习(DL)进行物联网数据分析的动机

  • 物联网数据的关键特性和需求

物联网的 E2E 生命周期

不同的组织和行业对物联网有不同的描述。一种简单且直观的定义方法是将物联网视为一个智能物体网络,连接物理世界与数字世界。研究物联网解决方案的 E2E 生命周期,或更一般地说,研究物联网生态系统的生命周期,有助于我们更好地理解它,并展示它如何与机器学习和深度学习相关联。

与物联网的定义类似,关于 E2E 生命周期或物联网架构,并没有达成全球统一的共识。不同的研究者提出了不同的架构或层次。最常见的提议是三层和五层生命周期或架构,如下图所示:

在前面的图示中,(a) 展示了三层物联网生命周期或架构,(b) 展示了五层物联网生命周期或架构。

三层 E2E 物联网生命周期

这是物联网解决方案中最基本且广泛使用的 E2E 生命周期。它由三个层次组成:感知层、网络层和应用层。它们可以如下描述:

  • 感知层:这是物理层或传感层,包括具有传感器的物体或设备,用于收集它们周围环境的信息。如以下图示所示,医疗保健领域的物联网 E2E 生命周期的感知层由配备传感器的患者、病床和轮椅组成。

  • 网络层:网络负责连接其他智能设备、网络设备和服务器。它还负责传输和处理传感器数据。

  • 应用层:该层负责根据传感器数据为用户提供特定应用的服务。它定义了物联网可以部署的各种应用,例如智能家居、智慧城市和健康连接。

下图展示了医疗健康领域的三层端到端物联网生命周期:

三层端到端物联网生命周期或架构定义了物联网的关键理念,但对于研发而言可能不足够,因为这些通常涉及物联网的更细微方面。这就是为什么提出了其他生命周期或架构,例如五层生命周期。

五层物联网端到端生命周期

五层物联网生命周期由感知、传输、处理、应用和业务层组成。感知层和应用层的作用与三层架构中的相同。我们简要概述剩余三层的功能如下:

  • 传输层:这类似于三层生命周期中的网络层。它通过无线、3G、局域网、蓝牙、RFID 和 NFC 等网络将感知层收集到的数据传输到处理层,反之亦然。

  • 处理层:这也被称为中间件层。它存储、分析和处理来自传输层的大量数据,并可以管理并为下层提供各种服务。它采用许多技术,如数据库、云计算和大数据处理模块。

  • 业务层:该层管理整个物联网系统,包括应用程序、商业和利润模型以及用户隐私。

物联网系统架构

了解物联网系统的架构对于开发应用程序至关重要。同时,在不同的计算平台层次(包括雾层和云层)中考虑我们的数据处理需求也同样重要。考虑到许多物联网应用(如前图所示的医疗健康领域的物联网解决方案)的关键性和延迟敏感性,雾计算对于这些应用至关重要。下图简要展示了雾计算的工作原理:

如前图所示,在雾计算中,物体(如汽车)的数据不会移动到云端进行处理。通过这种方式,雾计算解决了云计算在物联网中面临的许多挑战(如高延迟、停机时间、安全性、隐私和信任),并提供了许多好处,如位置感知、低延迟、对移动性的支持、实时互动、可扩展性和业务敏捷性。下图展示了雾计算的协议层次架构:

如前图所示,雾计算或与物联网结合的雾计算架构由六层组成:物理和虚拟化、监控、预处理、临时存储、安全和传输。特别是,预处理层通过分析、过滤和修剪来自物理或虚拟传感器的收集数据,执行数据管理任务。

物联网应用领域

通过使各种物理设备或物品(如车辆、机器、医疗传感器等)的便捷访问和交互成为可能,物联网促进了许多不同领域应用的开发。以下图表突出了物联网的关键应用领域:

这些应用包括医疗保健、工业自动化(即工业 4.0)、能源管理和智能电网、交通运输、智能基础设施(如智能家居和智能城市)、零售以及许多其他将改善我们生活和社会的领域。这些应用到 2025 年将产生每年 4 万亿到 11 万亿美元的全球经济影响。此项资金的主要贡献者(按预计贡献的顺序)包括:

  • 工厂或工业,包括运营管理和预测性维护

  • 城市,包括公共安全、健康、交通控制和资源管理

  • 医疗保健,包括监控和管理疾病以及改善健康

  • 零售,包括自助结账和库存管理

  • 能源,包括智能电网

这些应用程序的巨大需求意味着物联网(IoT)服务及其生成的大数据的惊人且迅猛的增长。

物联网中分析的重要性

物联网在各个应用领域的使用只有在这些应用能够从物联网设备生成和收集的数据中提取一些商业价值时才会有效。在这种背景下,物联网数据的分析在物联网解决方案中至关重要。Gartner 将物联网分析视为物联网中使用的两大核心技术之一。

物联网分析是将数据分析工具和程序应用于从物联网设备生成的大量数据中提取见解。物联网分析对于从物联网设备或物品生成的数据中提取洞察至关重要。更具体地说,物联网商业模型通过多种方式分析物品生成和收集的信息——例如,用于理解客户行为、提供服务、改善产品和服务以及识别和拦截商业时机。大多数物联网商业模型或应用程序在理解数据时的主要元素是智能学习或机器学习机制,用于预测、数据挖掘和模式识别。传统的机器学习机制或技术在处理结构化数据时效果很好,但在处理非结构化数据时则存在困难。

一个例子是谷歌的 Nest 智能学习温控器,它以结构化的方式记录温度数据,然后应用机器学习算法来理解用户的温度偏好和日程模式。然而,它无法理解非结构化数据,如多媒体数据,包括音频信号和视觉图像。此外,传统机器学习算法的训练依赖于手工制作的特征集,这在许多物联网应用中可能不容易实现,因为这些应用涉及到异构性和动态性。例如,在工厂中,故障可能是随机的,特征集可能无法用于分类。因此,物联网需要新的分析方法,包括深度学习(DL)。

在物联网数据分析中使用深度学习的动机

近年来,许多物联网应用积极采用复杂的深度学习技术,这些技术利用神经网络捕捉和理解环境。例如,亚马逊 Echo 被认为是一个物联网应用,它通过深度学习技术连接物理世界和人类世界与数字世界;它能够通过深度学习理解人类的语音命令。

此外,微软的 Windows 面部识别安全系统(一个物联网应用)利用深度学习技术执行任务,如在识别到用户面部时解锁门。深度学习和物联网是 2017 年三大战略技术趋势之一,并在 2016 年 Gartner Symposium/ITxpo 大会上宣布。深度学习的广泛宣传是因为传统机器学习算法未能满足物联网系统日益增长的分析需求。相反,深度学习算法或模型相比传统的机器学习方法,带来了两个重要的改进。首先,它们减少了使用手工制作的特征集来训练模型的需求。因此,物联网应用中的一些特征,即使人类难以察觉,也可以通过深度学习模型轻松提取。此外,深度学习模型还提高了预测准确性。

然而,在物联网应用中,尤其是在边缘计算设备、雾计算设备和终端设备中启用深度学习是困难的,因为这些设备资源有限。此外,物联网数据与一般的大数据有所不同。我们需要探讨物联网数据的特性以及它们与一般大数据的不同之处,以更好地理解物联网数据分析的需求。

物联网数据的关键特征和需求

物联网应用的数据展现出两个需要不同处理的特点。许多物联网应用,如远程病人监控或自动驾驶汽车,持续生成数据流,这会导致大量持续的数据。许多其他应用程序,如用于营销的消费者产品分析或森林或水下的居民监测,生成的数据会积累成为大数据的来源。流数据是在短时间间隔内生成或捕获的,需要快速分析以提取即时的、有用的洞察并做出快速决策。

相反,大数据一词指的是常用硬件和软件平台无法存储、管理、处理和分析的庞大数据集。这两种数据需要不同的处理方式,因为它们对分析响应的要求不同。

大数据分析的结果,例如商业智能和交易分析,可能需要几天的数据生成才能交付,但流数据分析的结果应该在几百毫秒到几秒钟内准备好。例如,在无人驾驶汽车中,紧急刹车情况下的响应时间需要大约 100 毫秒。以下图表突出显示了物联网数据的关键特征及其分析需求:

许多物联网(IoT)应用程序,例如用于监控实时平均温度的应用程序,依赖于多个数据源。数据融合、聚合和共享在这些应用中起着至关重要的作用。对于时间敏感的物联网应用,诸如远程病人监控或无人驾驶汽车等,数据的及时聚合至关重要,这有助于将所有数据汇聚在一起进行分析,并随后提供可靠、准确的可操作洞察。

一般来说,即使在高性能计算系统或云平台中,流数据的分析也是一项挑战。流数据分析的潜在解决方案是基于数据并行性和增量处理的框架。尽管这些技术可以减少时间延迟并从流数据分析框架中返回响应,但它们并不是实时物联网应用的最佳解决方案。在这种情况下,更好的方法是将流数据分析带到数据源的更接近位置,通过物联网设备或边缘设备,并借助雾计算或边缘计算的支持。然而,将数据分析添加到物联网设备或物体中会引入新的挑战,如数据源的计算、存储和电力资源的限制。

物联网通过将数十亿个智能设备连接起来,并频繁收集设备及其环境的状态数据,负责生成大数据。从原始传感器获得的海量数据中识别并挖掘有意义的模式是物联网应用中大数据分析的核心功能,因为它为决策制定和趋势预测提供了进一步的洞察。通过提取这些洞察,物联网大数据对许多企业具有极大的重要性,因为它使企业能够在竞争中占得先机。以下图表突出展示了物联网大数据的特点,使用了六个 V6Vs):

现实生活中快速流动的物联网数据实例

远程病人监测是物联网在医疗健康领域最明显且最受欢迎的应用之一。通过这一应用,有时也称为远程健康,病人将与护理提供者连接,必要时可获得实时反馈。此应用所产生的数据,如心率或血压的变化,是流数据,需要快速处理,以便护理提供者能及时回应病人的情况。

以下图表展示了一个市售的远程病人监测系统的快照:

物联网大数据的现实生活实例

智能电网是物联网大数据的重要来源。智能电表在智能电网系统中发挥着重要作用,它通过精确测量用户的能源消耗来生成和收集数据。目前,许多国家的能源供应商对学习本地能源消耗模式、预测客户需求并根据实时分析做出适当决策非常感兴趣。

物联网大数据的另一个例子是智能设备生成的数据。以下图表展示了使用物联网数据进行消费者产品分析和营销的过程:

如前图所示,支持物联网的远程病人监测系统可以生成大量数据,这些数据需要被处理、存储和分析。然而,智能设备,如智能咖啡机、智能冰箱和智能售货机,也能生成大数据,这些数据可用于消费者产品分析。

总结

在本章中,我们展示了物联网(IoT)端到端生命周期的两种不同层次视图。我们还探讨了物联网系统架构以及物联网的关键应用领域。接着,我们定义了物联网分析的含义及其在物联网应用中的重要性,特别强调了深度学习(DL)。我们讨论了物联网的关键特性及其在分析中的相应需求。最后,我们展示了一些真实的物联网示例,这些示例生成快速流式数据和大数据。在下一章中,您将了解几种常见的深度学习模型以及近年来出现的最前沿架构,并学习它们如何在分析物联网流数据和大数据中发挥作用。

要在不同的物联网应用中使用深度学习模型,了解不同深度学习模型的基础知识以及它们的不同实现框架至关重要。在下一章中,我们将介绍一些流行的深度学习模型,包括卷积神经网络、长短期记忆网络和自编码器。除此之外,我们还将讨论一些流行的深度学习开发框架,包括 TensorFlow 和 Keras。

参考文献

第二章:物联网的深度学习架构

物联网IoT)时代,来自众多传感设备的大量感知数据正被生成和收集,这些数据涵盖了广泛的领域和应用。对这些数据流进行分析,发现新信息、预测未来洞察并做出控制决策,是一项具有挑战性的任务,这使得物联网成为商业智能和提高生活质量技术的一个有价值的范式。然而,在物联网启用的设备上进行分析需要一个平台,该平台包括机器学习ML)和深度学习DL)框架、软件堆栈和硬件(例如,图形处理单元GPU)和张量处理单元TPU))。

本章将讨论一些深度学习(DL)架构和平台的基本概念,这些概念将在后续章节中使用。我们将从简要介绍机器学习(ML)开始。然后,我们将转向深度学习,深度学习是机器学习的一个分支,它基于一组算法,旨在对数据中的高级抽象进行建模。我们将简要讨论一些最著名且广泛使用的神经网络架构。接着,我们将探讨用于在物联网(IoT)设备上开发深度学习应用的各种深度学习框架和库的特性。简而言之,以下主题将被涵盖:

  • 机器学习的软介绍

  • 人工神经网络

  • 深度神经网络架构

  • 深度学习框架

机器学习的软介绍

机器学习方法基于一组统计和数学算法,执行分类、回归分析、概念学习、预测建模、聚类和有用模式挖掘等任务。通过使用机器学习,我们旨在自动改进整个学习过程,从而不再需要完全依赖人工干预,或者至少能够尽可能减少这种干预。

学习算法的工作原理

Tom M. Mitchell 从计算机科学的角度解释了学习的真正含义:

“一个计算机程序如果在某类任务 T 和性能衡量 P 下,随着经验 E 的积累,其在任务 T 上的表现(由 P 衡量)得到改进,则该程序被认为从经验 E 中学习。”

根据这一定义,我们可以得出结论,一个计算机程序或机器可以做到以下几点:

  • 从数据和历史中学习

  • 随经验改进

  • 迭代地增强一个可用于预测问题结果的模型

由于前述要点是预测分析的核心,几乎我们使用的每个机器学习算法都可以视为一个优化问题。这涉及到寻找最小化目标函数的参数;例如,两个项的加权和,如代价函数和正则化。通常,目标函数有两个组成部分:

  • 控制模型复杂度的正则化器

  • 衡量模型在训练数据上误差的损失函数

另一方面,正则化参数定义了在最小化训练误差和模型复杂度之间的权衡,以避免过拟合问题。如果这两个组件都是凸的,那么它们的和也是凸的。因此,在使用机器学习算法时,目标是获得最佳超参数,使得在进行预测时返回最小误差。因此,通过使用凸优化技术,我们可以最小化该函数,直到它收敛到最小误差。

假设一个问题是凸的,通常更容易分析算法的渐进行为,这表明随着模型观察到越来越多的训练数据,它的收敛速度如何。机器学习的任务是训练一个模型,使其能够从给定的输入数据中识别复杂的模式,并以自动化的方式做出决策。因此,进行预测的关键是将模型应用于新的(即未观察到的)数据,并评估模型本身的性能。然而,在整个过程中,为了使预测模型成为成功的,数据在所有机器学习任务中都扮演着第一类公民的角色。实际上,我们馈送给机器学习系统的数据必须由数学对象组成,如向量,以便它们可以处理这些数据。

根据可用数据和特征类型,预测模型的性能可能会发生剧烈波动。因此,选择正确的特征是模型评估前最重要的步骤之一。这被称为特征工程,其中使用与数据相关的领域知识来创建仅对模型有用的选择性特征,以帮助准备特征向量供机器学习算法使用。

例如,比较酒店是相当困难的,除非我们已经有多次住酒店的个人经验。然而,在一个已经通过成千上万的评论和特征(例如酒店的星级、房间大小、位置、客房服务等)训练好的机器学习模型的帮助下,这变得相当可行。我们将在各章中看到几个例子。然而,在开发这样一个机器学习模型之前,了解一些机器学习概念也是很重要的。

通用机器学习经验法则

通用的机器学习经验法则是,数据越多,预测模型越好。然而,拥有更多特征往往会制造混乱,甚至会严重降低性能,特别是在数据集是多维的情况下。整个学习过程需要将输入数据集拆分为三种类型(或者已经提供为这种类型):

  • 训练集是来自历史或实时数据的知识库,用于拟合机器学习算法的参数。在训练阶段,机器学习模型利用训练集找到网络的最优权重,并通过最小化训练误差来达到目标函数。在这里,反向传播规则或优化算法被用来训练模型,但所有超参数必须在学习过程开始之前设置好。

  • 验证集是一组用于调整机器学习模型参数的示例。它确保模型训练得当,并且能够避免过拟合。一些机器学习实践者也将其称为开发集(dev 集)。

  • 测试集用于评估训练好的模型在未见数据上的表现。这个步骤也被称为模型推理。在测试集上评估最终模型之后(即,当我们完全满意模型的表现时),我们不再需要调整模型,训练好的模型可以部署到生产环境中。

一种常见的做法是将输入数据(经过必要的预处理和特征工程后)分为 60%用于训练,10%用于验证,20%用于测试,但这实际上取决于具体的使用场景。有时,我们还需要根据数据集的可用性和质量对数据进行上采样或下采样。这种关于不同类型训练集的经验法则在不同的机器学习任务中可能会有所不同,我们将在下一节讨论这一点。然而,在此之前,让我们快速回顾一下机器学习中的一些常见现象。

机器学习模型中的常见问题

当我们使用这些输入数据进行训练、验证和测试时,通常学习算法无法做到 100%准确,这涉及训练、验证和测试误差(或损失)。在机器学习模型中,你可能会遇到两种类型的误差:

  • 不可约误差

  • 可约误差

不可约误差即使使用最强大、最复杂的模型也无法减少。然而,可约误差有两个组成部分,分别称为偏差和方差,它们是可以减少的。因此,为了理解模型(即预测误差),我们需要专注于偏差和方差。偏差是指预测值与实际值之间的距离。通常,如果平均预测值与实际值(标签)之间的差距很大,则偏差较高。

一个机器学习模型可能会有较高的偏差,因为它无法建模输入和输出变量之间的关系(无法很好地捕捉数据的复杂性),因此变得非常简单。因此,一个过于简单且具有高方差的模型会导致数据的欠拟合。下图提供了一些高级的见解,并展示了一个恰到好处的拟合模型应该是什么样子:

方差表示预测值与实际值之间的变动性(它们的分散程度)。如果模型的训练误差很高,而且验证误差或测试误差与训练误差相同,则模型有很高的偏差。另一方面,如果模型的训练误差较低,但验证误差或测试误差较高,则模型具有较高的方差。一个机器学习模型通常在训练集上表现得非常好,但在测试集上表现不佳(因为错误率很高)。最终,这会导致欠拟合的模型。我们可以再次回顾过拟合和欠拟合:

  • 欠拟合:如果你的训练误差和验证误差都相对较高且非常相似,那么你的模型很可能是在欠拟合你的训练数据。

  • 过拟合:如果你的训练误差很低,而验证误差很高,那么你的模型很可能是在过拟合你的训练数据。恰到好处的拟合模型不仅能很好地学习,而且在未见过的数据上也表现更好。

偏差-方差权衡:高偏差和高方差问题通常被称为偏差-方差权衡,因为一个模型不能同时过于复杂或过于简单。理想情况下,我们努力寻找一个具有低偏差和低方差的最佳模型。

现在我们知道了机器学习(ML)算法的基本工作原理。然而,根据问题的类型和解决问题的方法,机器学习任务可能有所不同;例如,有监督学习、无监督学习和强化学习。我们将在下一节中更详细地讨论这些学习任务。

机器学习任务

尽管每个机器学习问题或多或少都是一个优化问题,但解决这些问题的方法可能有所不同。事实上,学习任务可以分为三种类型:有监督学习、无监督学习和强化学习。

有监督学习

有监督学习是最简单且最知名的自动学习任务。它基于一组预定义的示例,其中每个输入应属于的类别已经知道,如下图所示:

上面的图示展示了有监督学习的典型工作流程。一个执行者(例如,数据科学家或数据工程师)执行提取转换加载ETL)以及必要的特征工程(包括特征提取、选择等),以获取包含特征和标签的适当数据,这样数据就可以被输入到模型中。然后,他们将数据分为训练集、开发集和测试集。训练集用于训练机器学习模型,验证集用于验证训练过程中的过拟合问题和正则化,然后执行者会评估模型在测试集(即未见过的数据)上的表现。

然而,如果性能不尽如人意,执行者可以通过超参数优化进行额外的调整,以获得最佳模型。最终,他们会将最佳模型部署到生产环境中。在整个生命周期中,可能会涉及许多执行者(例如,数据工程师、数据科学家或机器学习工程师),每个人独立或协作地执行每一步。监督学习的背景包括分类和回归任务;分类用于预测一个数据点属于哪个类别(离散值),也用于预测类别属性的标签。下图简要总结了这些步骤:

另一方面,回归用于预测连续值,并对类别属性进行数值预测。在监督学习的背景下,输入数据集的学习过程通常会随机划分成三个子集;例如,60% 用于训练集,10% 用于验证集,剩下的 30% 用于测试集。

无监督学习

如果没有给定标签,你将如何总结和归类一个数据集?你可能会通过找到数据集的潜在结构,并衡量其统计特性,如频率分布、均值和标准差来回答这个问题。如果问题是如何有效地以压缩格式表示数据,你可能会回答说你会使用某些软件进行压缩,尽管你可能不知道这些软件是如何实现压缩的。下图展示了一个典型的无监督学习任务的工作流程:

这正是无监督学习的两个主要目标,它在很大程度上是一个数据驱动的过程。我们称这种学习方式为无监督,因为你将不得不处理无标签数据。以下引述来自 AI 研究负责人 Yann LeCun(来源:预测学习,NIPS 2016,Yann LeCun,Facebook 研究):

"大多数人类和动物的学习都是无监督学习。如果智力是一块蛋糕,那么无监督学习就是蛋糕本身,监督学习是蛋糕上的糖霜,强化学习则是蛋糕上的樱桃。我们知道如何制作糖霜和樱桃,但我们不知道如何做蛋糕。在我们甚至开始考虑实现真正的人工智能之前,我们需要解决无监督学习的问题。"

一些最广泛使用的无监督学习任务包括以下内容:

  • 聚类:根据相似性(或统计特性)将数据点分组,例如,像 Airbnb 这样的公司通常会将其公寓和房屋按邻里分组,以便客户更容易地浏览列出的房源

  • 降维:尽可能保留数据的结构和统计特性来压缩数据,例如,通常需要减少数据集的维度以便进行建模和可视化

  • 异常检测:在多个应用中非常有用,例如识别信用卡欺诈、在工业工程过程中识别故障硬件以及识别大规模数据集中的异常值

  • 关联规则挖掘:通常用于市场篮子分析,例如,询问哪些商品经常一起购买

强化学习

强化学习是一种人工智能方法,专注于通过与环境的互动来学习。在强化学习中,系统的参数会根据从环境中获得的反馈进行调整,而环境会根据系统做出的决策提供反馈。下面的图示展示了一个人为了到达目的地而做出决策的过程。让我们举一个你从家到公司通勤路线的例子:

我们可以通过一个建模象棋选手的系统来再举一个例子。为了提高其表现,系统会利用之前行动的结果;这样的系统被称为通过强化学习的系统。在这种情况下,你每天都走相同的路线去上班。然而,有一天,你突然产生了好奇心,决定尝试一条不同的路线,目的是找到最短的路径。类似地,基于你在不同路线上的经验和所花的时间,你会决定是否应该更频繁地走这条特定路线。我们可以再举一个关于建模象棋选手的系统的例子。

到目前为止,我们已经学习了机器学习的基本工作原理以及不同的学习任务。接下来,让我们通过一些示例用例来看看每个学习任务。

带应用的学习类型

我们已经了解了机器学习算法的基本工作原理,知道了基本的机器学习任务是什么,并且它们是如何构建领域特定问题的。然而,每个学习任务都可以通过不同的算法来解决。下面的图示给我们提供了一个简要的了解:

然而,上述图示仅列出了使用不同机器学习任务的一些用例和应用。实际上,机器学习在众多用例和应用中都有广泛的使用。我们将在本书中尽力覆盖其中的一些。

深入了解深度学习

在常规数据分析中使用的简单机器学习方法已经不再有效,应当用更强大的机器学习方法来替代。尽管经典的机器学习技术能够帮助研究者识别相关变量的组或簇,但随着数据量增大和维度增多,这些方法的准确性和有效性会降低。

深度学习是如何将机器学习提升到一个新水平的?

在小规模数据分析中使用的简单机器学习方法,在处理大规模和高维数据集时并不有效。然而,深度学习(DL)作为机器学习的一个分支,基于一组算法,试图对数据进行高层次抽象建模,能够解决这一问题。Ian Goodfellow 在他的书《深度学习,MIT 出版社,2016 年》中是这样定义深度学习的:

“深度学习是一种特殊的机器学习方式,通过学习将世界表示为概念的嵌套层次结构,每个概念是相对于更简单的概念来定义的,更抽象的表示通过更不抽象的表示来计算,从而实现了强大的能力和灵活性。”

与机器学习模型类似,深度学习模型也接受一个输入X,并从中学习高层次的抽象或模式,从而预测输出Y。例如,基于过去一周的股价,深度学习模型可以预测下一天的股价。当在这样的历史股数据上进行训练时,深度学习模型会尽量减少预测值和实际值之间的差异。通过这种方式,深度学习模型尝试对之前未见过的输入进行泛化,并对测试数据做出预测。

现在你可能会想,如果机器学习模型可以完成相同的任务,为什么我们还需要深度学习呢?其实,深度学习模型在处理大量数据时表现得很好,而传统的机器学习模型在达到某个点后就不再改进。深度学习的核心概念,受到大脑结构和功能的启发,被称为人工神经网络ANNs)。

在深度学习的核心,人工神经网络(ANNs)帮助你学习输入和输出之间的关联,从而做出更强大、更准确的预测。然而,深度学习不仅限于人工神经网络;随着理论的进步、软件堆栈的完善和硬件的改进,深度学习已经普及到大众中。让我们来看一个例子,假设我们要开发一个预测分析模型,比如一个动物识别器,我们的系统必须解决两个问题:

  • 判断一张图片是猫还是狗

  • 对猫狗图片进行聚类。

如果我们使用典型的机器学习方法来解决第一个问题,我们必须定义面部特征(耳朵、眼睛、胡须等),并编写方法来识别哪些特征(通常是非线性的)在分类特定动物时更为重要。然而,同时我们无法解决第二个问题,因为经典的机器学习聚类算法(如 k-means)无法处理非线性特征。看看下面的图示,它展示了我们在分类给定图像是否为猫时需要遵循的工作流程:

DL 算法将这两个问题进一步推进,最重要的特征将在确定哪些特征对分类或聚类最为重要后自动提取。相比之下,使用经典的机器学习算法时,我们必须手动提供特征。而 DL 算法则采取更复杂的步骤。例如,首先,它识别出在聚类猫或狗时最相关的边缘。然后,它尝试以层次结构的方式找到各种形状和边缘的组合,这被称为 ETL。

然后,在经过几次迭代后,它进行复杂概念和特征的层次化识别。接着,基于已识别的特征,DL 算法将决定哪些特征对分类动物最为重要。这个步骤被称为特征提取。最后,它提取出标签列,并使用自编码器AEs)进行无监督训练,提取潜在特征,然后将其重新分配给 k-means 进行聚类。接着,聚类分配硬化损失CAH 损失)和重建损失被共同优化,以达到最佳的聚类分配。

然而,在实际应用中,DL 算法接收到的是原始图像表示,这并不像我们看到的图像那样理解图像,因为它只知道每个像素的位置和颜色。图像被分解成多个分析层次。例如,在较低层次,软件会分析一小块像素网格,任务是检测某种颜色或各种细微的色调变化。如果检测到某些信息,它会通知下一层,此时这一层检查该颜色是否属于更大的形态,如一条线。这个过程一直持续到更高层次,直到算法理解以下图所示的内容:

虽然区分狗与猫是一个非常简单的分类器示例,但能够做这些事情的软件现在已经广泛应用,并且出现在面部识别系统中,或例如在 Google 上搜索图像的系统中。这类软件是基于 DL 算法的。相反,如果我们使用线性机器学习算法,就无法构建这样的应用,因为这些算法无法处理非线性的图像特征。

此外,使用机器学习方法时,我们通常只需处理少量的超参数。然而,当神经网络介入时,情况变得非常复杂。每一层中都有成千上万甚至数十亿个超参数需要调整——如此之多,以至于成本函数变得非凸。另一个原因是,隐藏层中使用的激活函数是非线性的,因此成本也是非凸的。我们将在后面的章节中更详细地讨论这一现象,但现在先简要看看人工神经网络(ANNs)。

人工神经网络

人工神经网络(ANNs)受到人类大脑工作方式的启发,构成了深度学习(DL)的核心及其真正实现。今天围绕深度学习的革命,如果没有 ANNs,是不可能发生的。因此,要理解深度学习,我们需要理解神经网络的工作原理。

人工神经网络与人类大脑

人工神经网络代表了人类神经系统的一个方面,神经系统由大量相互沟通的神经元组成,神经元通过轴突进行信息传递。感受器接收来自内外部世界的刺激,然后将这些信息传递给生物神经元进行进一步处理。除了轴突,还有许多树突存在。在轴突的末端,有一些微小结构叫做突触末端,用来将一个神经元与其他神经元的树突连接起来。生物神经元接收到来自其他神经元的短电流脉冲,称为信号,作为回应,它们会触发自己的信号。

因此,我们可以总结出,神经元由一个细胞体(也称为体 soma)、一个或多个树突用于接收来自其他神经元的信号,以及一个轴突用于传递神经元生成的信号。当神经元向其他神经元发送信号时,它处于活动状态。然而,当它接收来自其他神经元的信号时,它处于非活动状态。在空闲状态下,神经元会积累接收到的所有信号,直到达到某个激活阈值。这个过程促使研究人员测试人工神经网络(ANNs)。

人工神经网络的简史

受生物神经元工作原理的启发,沃伦·麦卡洛克(Warren McCulloch)和沃尔特·皮茨(Walter Pitts)于 1943 年提出了第一个人工神经元模型,这一模型是神经活动的计算模型。这个简单的生物神经元模型,也被称为人工神经元AN),具有一个或多个二进制(开/关)输入和仅一个输出。当超过某个数量的输入处于活动状态时,人工神经元便激活其输出。

这个例子听起来太简单,但即便是这样一个简化模型,也能构建起人工神经元网络。然而,这些网络也可以组合起来计算复杂的逻辑表达式。这个简化模型激发了约翰·冯·诺依曼(John von Neumann)、马文·明斯基(Marvin Minsky)、弗兰克·罗斯恩布拉特(Frank Rosenblatt)等人,于 1957 年提出了另一个模型——感知器perceptron)。感知器是过去 60 年我们看到的最简单的人工神经网络架构之一。它基于一个略有不同的人工神经元,叫做线性阈值单元LTU)。唯一的区别是,输入和输出现在是数字,而非二进制的开/关值。每个输入连接都关联一个权重。LTU 计算其输入的加权和,然后将一个阶跃函数(类似于激活函数的作用)应用于该和,并输出结果。

感知机的一个缺点是它的决策边界是线性的。因此,它们无法学习复杂的模式,也无法解决一些简单的问题,如异或XOR)问题。然而,后来通过堆叠多个感知机,称为MLP,在一定程度上克服了感知机的局限性。因此,ANNs 和深度学习(DL)领域的最重要进展可以通过以下时间线来描述。我们已经讨论过,人工神经元和感知机分别为 1943 年和 1958 年提供了基础。1969 年,Marvin Minsky 和 Seymour Papert 将 XOR 问题定义为一个线性不可分的问题,随后在 1974 年,Paul Werbos 展示了用于训练感知机的反向传播算法。

然而,最重要的进展发生在 1982 年,当时 John Hopfield 提出了 Hopfield 网络。随后,神经网络和深度学习的奠基人之一——Hinton 及其团队——在 1985 年提出了 Boltzmann 机。1986 年,Geoffrey Hinton 成功地训练了 MLP,而 Jordan M.I.提出了 RNN。同年,Paul Smolensky 还提出了 Boltzmann 机的改进版——限制玻尔兹曼机RBM)。接着,1990 年,Lecun 等人提出了 LeNet,这是一种深度神经网络架构。以下是简要概览,请参阅下图:

90 年代最重要的一年是 1997 年,当时 Jordan 等人提出了递归神经网络RNN)。同年,Schuster 等人提出了长短期记忆LSTM)的改进版,并提出了原始 RNN 的改进版本——双向 RNN。

尽管计算机技术取得了显著进展,但从 1997 年到 2005 年,我们并未看到太多进展。直到 2006 年,Hinton再次带来了突破,他和他的团队通过堆叠多个 RBM 提出了深度置信网络DBN)。随后,在 2012 年,Hinton 发明了 dropout 技术,显著改善了深度神经网络中的正则化和过拟合问题。之后,Ian Goodfellow 等人介绍了 GANs——这是图像识别领域的一个重大里程碑。2017 年,Hinton 提出了 CapsNet,旨在克服传统 CNN 的局限性,这至今仍是一个非常重要的里程碑。我们将在本章后续部分讨论这些架构。

神经网络是如何学习的?

基于生物神经元的概念,人工神经网络(ANN)的术语和理念应运而生。与生物神经元类似,人工神经元由以下几个部分组成:

  • 一个或多个输入连接,用于聚合来自其他神经元的信号

  • 一个或多个输出连接,用于将信号传递到其他神经元

  • 激活函数,决定输出信号的数值

除了神经元的状态,还考虑了突触权重,它影响网络中的连接。每个权重都有一个数值,表示为W[ij],它是连接神经元i和神经元j的突触权重。现在,对于每个神经元i,输入

向量可以定义为x[i] = (x[1],x[2],...x[n]),权重向量可以定义为w[i] = (w[i1],x[i2],...x[in])。现在,根据神经元的位置,权重和输出函数决定了单个神经元的行为。然后,在前向传播过程中,隐含层中的每个单元接收到以下信号:

然而,在权重中,还有一种特殊类型的权重,称为偏置单元,b。从技术上讲,偏置单元没有连接到任何先前的层,因此它们没有真正的活动。但仍然,偏置b值使神经网络能够将激活函数向左或向右移动。考虑到偏置单元后,修改后的网络输出公式如下:

上述方程表示,每个隐含单元接收输入的总和,并乘以相应的权重——这被称为求和结点。然后,求和结点中的输出通过激活函数,该函数压缩输出,如下图所示:

然而,实际的神经网络架构由输入层、隐含层和输出层组成,这些层由节点组成,形成一个网络结构。它仍然遵循人工神经元模型的工作原理,如上图所示。输入层只接收数值数据,例如实数特征和具有像素值的图像。下图展示了一个用于解决多类分类问题(即 10 个类别)的神经网络架构,数据具有 784 个特征:

一个具有一个输入层、三个隐含层和一个输出层的神经网络

在这里,隐含层执行大部分计算以学习模式,网络评估其预测与实际输出相比的准确性,使用一种称为损失函数的特殊数学函数。它可以是一个复杂的函数,也可以是一个非常简单的均方误差,定义如下:

在上述方程中,是网络做出的预测,而Y表示实际或预期的输出。最后,当误差不再减少时,神经网络收敛,并通过输出层进行预测。

训练神经网络

神经网络的学习过程被配置为一个权重优化的迭代过程。每个 epoch 都会更新权重。一旦训练开始,目标就是通过最小化损失函数来生成预测。然后,网络的性能会在测试集上进行评估。我们已经了解了人工神经元的简单概念。然而,仅生成一些人工信号不足以学习复杂任务。因此,常用的监督学习算法是反向传播算法,它通常用于训练复杂的人工神经网络(ANN)。

最终,训练这样的神经网络也是一个优化问题,我们通过反向传播和梯度下降GD)来迭代地调整网络的权重和偏置,以最小化误差。该方法迫使网络通过其所有层回溯,以更新跨节点的权重和偏置,方向与损失函数相反。

然而,使用梯度下降(GD)进行的这个过程并不能保证达到全局最小值。隐藏单元的存在和输出函数的非线性意味着误差的行为非常复杂,并且有许多局部最小值。这个反向传播步骤通常会执行成千上万次甚至数百万次,使用许多训练批次,直到模型参数收敛到最小化成本函数的值。当验证集上的误差开始增加时,训练过程结束,因为这可能标志着过拟合阶段的开始:

在寻找误差函数 E 的最小值时,我们沿着误差函数 E 的梯度 G 最小的方向前进

使用梯度下降(GD)的缺点是它收敛的时间太长,这使得无法满足处理大规模训练数据的需求。因此,提出了一种更快的梯度下降算法,称为随机梯度下降SGD),它也是深度神经网络训练中广泛使用的优化器。在 SGD 中,我们每次迭代只使用训练集中的一个训练样本来更新网络参数,这是对真实成本梯度的随机近似。

现在有其他先进的优化器,如 Adam、RMSProp、ADAGrad 和 Momentum。它们中的每一个都是 SGD 的直接或间接优化版本。

权重和偏置初始化

现在,有一个棘手的问题:我们如何初始化权重呢?好吧,如果我们将所有权重初始化为相同的值(例如 0 或 1),那么每个隐藏神经元将获得相同的信号。让我们尝试分解这个问题:

  • 如果所有权重初始化为 1,那么每个单元将获得等于输入总和的信号。

  • 如果所有的权重都为 0,这甚至更糟,那么每个隐藏层中的神经元将会得到零信号。

对于网络权重初始化,Xavier 初始化方法被广泛使用。它与随机初始化类似,但通常效果更好,因为它可以根据默认的输入和输出神经元的总数来确定初始化速率。你可能会想,在训练常规 DNN 时,是否能够摆脱随机初始化。

近期,一些研究者讨论了随机正交矩阵初始化方法,它比普通的随机初始化方法在训练 DNN 时表现更好。至于偏置的初始化,我们可以将其初始化为零。但是,将偏置设置为一个小常数值,例如将所有偏置设为 0.01,能确保所有修正线性单元ReLU)能够传播梯度。然而,这种方法既表现不佳,也没有持续的改善。因此,推荐坚持使用零值。

激活函数

为了让神经网络能够学习复杂的决策边界,我们对其部分层应用非线性激活函数。常用的激活函数包括 Tanh、ReLU、softmax 及其变种。从技术上讲,每个神经元接收来自与之相连的神经元的突触权重和激活值的加权总和作为输入。为此目的,最常用的函数之一是所谓的 Sigmoid 逻辑函数,其定义如下:

该函数的定义域包括所有实数,而共域为 (0, 1)。这意味着从神经元输出的任何值(根据其激活状态的计算)都将始终介于零和一之间。Sigmoid 函数如

下图所示,提供了神经元饱和度的解释,从不激活(等于 0)到完全饱和,这发生在预定的最大值(等于 1)时:

Sigmoid 与 Tanh 激活函数

另一方面,双曲正切(Tanh)是另一种形式的激活函数。Tanh 将实数值压缩到 -11 之间。前图展示了 TanhSigmoid 激活函数的区别。特别地,从数学角度讲,tanh 激活函数可以表示如下:

一般来说,在前馈神经网络FFNN)的最后一层,应用 softmax 函数作为决策边界。这是一个常见的情况,特别是在解决分类问题时。softmax 函数用于多类分类问题中可能类别的概率分布。总之,选择合适的激活函数和网络权重初始化是使网络表现最佳并帮助获得良好训练的两个关键问题。现在我们已经了解了神经网络的简要历史,接下来我们将深入探讨不同的架构,这将帮助我们理解它们的使用场景。

神经网络架构

到目前为止,已经提出并应用了许多神经网络架构。然而,或多或少,所有这些架构都基于少数几个核心神经网络架构。我们可以将深度学习(DL)架构分为四类:

  • 深度神经网络(Deep neural networks)

  • 卷积神经网络(Convolutional neural networks)

  • 循环神经网络(Recurrent neural networks)

  • 新兴架构(Emergent architectures)

然而,DNN、CNN 和 RNN 都有许多改进的变种。虽然大多数变种是为了应对特定领域的研究问题而提出或开发的,但其基本工作原理仍然遵循原始的 DNN、CNN 和 RNN 架构。接下来的小节将简要介绍这些架构。

深度神经网络(Deep neural networks)

DNN 是具有复杂和深层架构的神经网络,每一层有大量神经元,并且层与层之间有许多连接。虽然 DNN 通常指的是非常深的网络,但为了简单起见,我们将 MLP、堆叠自编码器SAE)和深度置信网络DBNs)视为 DNN 架构。这些架构大多作为 FFNN 工作,意味着信息从输入层传播到输出层。

多个感知器被堆叠在一起形成多层感知机(MLPs),其中层作为有向图连接。从根本上讲,MLP 是最简单的前馈神经网络(FFNN)之一,因为它有三层:输入层、隐藏层和输出层。这样,信号以单向传播的方式,从输入层经过隐藏层到输出层,如下图所示:

自编码器(Autoencoders)和限制玻尔兹曼机(RBMs)分别是堆叠自编码器(SAEs)和深度置信网络(DBNs)的基础构建模块。与多层感知机(MLP)不同,MLP 是一种以监督方式训练的前馈神经网络(FFNN),而 SAEs 和 DBNs 都是在两个阶段进行训练的:无监督预训练和监督微调。在无监督预训练阶段,层按顺序堆叠并以逐层的方式进行训练,使用的是未标记数据。

在监督式微调中,会叠加一个输出分类器层,并通过用标签数据重新训练来优化整个神经网络。MLP 的一个问题是它经常会发生过拟合,因此泛化能力较差。为了解决这个问题,Hinton 等人提出了深度信念网络(DBN)。DBN 使用了一种贪婪的逐层预训练算法。DBN 由一个可见层和多个隐藏单元层组成。DBN 的构建模块是限制玻尔兹曼机(RBM),如下图所示,其中几个 RBM 层被一个接一个地堆叠起来:

前两层具有无向对称连接,而下层则有来自前一层的有向连接。尽管自深度信念网络(DBNs)取得了许多成功,但现在它们正被自编码器所替代。

自编码器

自编码器(AEs)也是一种特殊类型的神经网络,可以从输入数据中自动学习。自编码器由两个组件组成:编码器和解码器。编码器将输入压缩成一个潜在空间表示。然后,解码器部分尝试从这个表示中重建原始输入数据:

  • 编码器:使用一个称为h = f(x)的函数将输入编码或压缩成一个潜在空间表示

  • 解码器:使用一个称为r = g(h)的函数从潜在空间表示中解码或重建输入

因此,AE 可以用* g(f(x)) = 0的函数来描述,其中我们希望 0 尽可能接近原始输入x*。以下图示展示了自编码器的典型工作方式:

自编码器在数据去噪和数据可视化的降维方面非常有用,因为它们比主成分分析(PCA)更有效地学习被称为表示的数据投影。

卷积神经网络

卷积神经网络(CNNs)取得了巨大成功,并已广泛应用于计算机视觉领域(例如,图像识别)。在卷积神经网络中,连接模式与多层感知机(MLP)或深度信念网络(DBN)有显著不同。几个卷积层以级联样式连接。每一层后面都有一个 ReLU 层、一个池化层、附加的卷积层(+ReLU),以及另一个池化层,接着是一个全连接层和一个 softmax 层。以下图示为面部识别用 CNN 架构的示意图,它接受面部图像作为输入,并预测愤怒、厌恶、恐惧、快乐和悲伤等情绪:

用于面部识别的 CNN 示意架构

重要的是,深度神经网络(DNNs)并没有预先了解像素如何组织,因为它们不知道相邻像素是相近的。卷积神经网络通过在图像的小区域内使用特征图,利用低层嵌入了这种先验知识,而高层则将低级特征组合成更大的特征。

这种设置在大多数自然图像中效果良好,给 CNN 带来了比 DNN 更具决定性的优势。每一层卷积层的输出是一组对象,称为特征图,它们是由单个卷积核滤波器生成的。然后,特征图可以用于定义下一个层的输入。CNN 网络中的每个神经元都会产生一个输出,接着是一个激活阈值,这个值与输入成比例并且不受限制。

递归神经网络

在 RNN 中,单元之间的连接形成了一个有向循环。RNN 架构最初是由 Hochreiter 和 Schmidhuber 在 1997 年提出的。RNN 架构包含标准的 MLP,并增加了循环,以便能够利用 MLP 强大的非线性映射能力。它们还具备某种形式的记忆。以下图示展示了一个非常基础的 RNN,它包含一个输入层、两个递归层和一个输出层:

然而,这种基本的 RNN 存在梯度消失和梯度爆炸问题,无法建模长期依赖关系。这些架构包括 LSTM、门控递归单元GRUs)、双向 LSTM 和其他变种。因此,LSTM 和 GRU 能够克服常规 RNN 的缺点:梯度消失/爆炸问题以及长期和短期依赖问题。

新兴架构

许多其他新兴的深度学习架构也已经被提出,例如深度时空神经网络DST-NNs)、多维递归神经网络MD-RNNs)和卷积自编码器CAEs)。然而,仍有一些新兴网络,如CapsNets(它是 CNN 的改进版本,旨在消除常规 CNN 的缺点)、用于图像识别的 RNN 和用于简单图像生成的生成对抗网络GANs)。除此之外,个性化的因子分解机和深度强化学习也在广泛应用。

残差神经网络

由于有时会有数百万个超参数和其他实际问题,训练更深的神经网络真的很困难。为了克服这一限制,Kaiming H.等人(arxiv.org/abs/1512.03385v1)提出了一种残差学习框架,以简化训练远深于以前的网络。

他们还明确地将层重新表述为参考层输入的学习残差函数,而不是学习无参考的函数。这样,这些残差网络更容易优化,并且可以通过大幅增加网络深度来提高准确性。缺点是,仅仅通过堆叠残差块构建网络必然会限制优化能力。为克服这一局限性,Ke Zhang 等人还提出了使用多级残差网络(arxiv.org/abs/1608.02908)。

生成对抗网络

GAN 是深度神经网络架构,由两个网络相互对抗(因此得名对抗性)。Ian Goodfellow 等人通过一篇论文引入了 GAN(更多信息见arxiv.org/abs/1406.2661v1)。在 GAN 中,两个主要组件是生成器和判别器

生成对抗网络的工作原理

在 GAN 架构中,生成器和判别器是相互对抗的—因此得名,对抗性:

  • 生成器尝试从特定的概率分布中生成数据样本,并且这些样本与实际对象非常相似。

  • 判别器将判断其输入是来自原始训练集还是来自生成器部分。

许多深度学习从业者认为 GAN 是最重要的进展之一,因为 GAN 可以用于模拟任何数据分布,并且基于数据分布,它们可以被训练来生成机器人艺术家图像、超分辨率图像、文本到图像合成、音乐、语音等。例如,由于对抗训练的概念,Facebook 的 AI 研究总监 Yann LeCun 建议,GAN 是过去 10 年机器学习领域最有趣的想法。

胶囊网络

在 CNN 中,每一层通过缓慢的感受野或最大池化操作在更精细的层次上理解图像。如果图像存在旋转、倾斜或非常不同的形状或方向,CNN 无法提取这些空间信息,在图像处理任务中表现非常差。即使是 CNN 中的池化操作,在面对这种位置不变性时也没有太大帮助。CNN 中的这个问题促使我们在 Geoffrey Hinton 等人发表的论文《胶囊间动态路由》中,推动了 CapsNet 的最新进展(更多信息见arxiv.org/abs/1710.09829):

“胶囊是神经元的组,其活动向量表示特定类型实体的实例化参数,例如一个物体或物体的部分。”

与常规 DNN 不同,在 CapsNet 中,思想是将更多的层添加到单一层内部。这样,CapsNet 就成为了一组嵌套的神经层。在 CapsNet 中,胶囊的向量输入和输出是通过在物理学中使用的路由算法进行计算的,这一算法迭代地传递信息并处理自洽场SCF)过程:

上图展示了一个简单的三层 CapsNet 的示意图。每个 Capsule 中 DigiCaps 层的活动向量长度表示每个类别实例的存在,用于计算损失。现在我们已经了解了神经网络的工作原理和不同的神经网络架构,动手实现一些东西会很有趣。不过,在此之前,让我们先看一下几个流行的 DL 库和框架,它们已经实现了这些网络架构。

聚类分析的神经网络

为了解决高维输入空间的问题,提出了几种 k-means 的变种。然而,它们本质上仅限于线性嵌入。因此,我们无法建模非线性关系。尽管如此,这些方法中的微调仅基于聚类分配硬化损失(见本节后文)。因此,无法实现精细的聚类准确性。由于聚类结果的质量依赖于数据分布,深度架构可以帮助模型学习从数据空间到较低维特征空间的映射,在该空间中模型可以迭代优化聚类目标。过去几年中,提出了几种方法,尝试利用深度神经网络的表征能力来预处理聚类输入。

一些值得注意的方法包括深度嵌入聚类、深度聚类网络、判别性增强聚类、聚类 CNN、深度嵌入网络、卷积深度嵌入聚类以及图像深度表示的联合无监督学习。其他方法包括基于 DL 的非参数聚类、基于 CNN 的联合聚类与特征漂移补偿学习、神经网络中的潜在表示学习用于聚类、使用卷积神经网络进行聚类,以及通过卷积自编码器嵌入进行深度聚类。

这些方法大多遵循相似的原理:即使用深度架构进行表示学习,将输入转换为潜在表示,并使用这些表示作为特定聚类方法的输入。这样的深度架构包括 MLP、CNN、DBN、GAN 和变分自编码器。下图展示了如何通过卷积自编码器优化重构和 CAH 损失联合来提高 DEC 网络的聚类性能。来自编码器层的潜在空间被输入到 K-means 进行软聚类分配。模糊的基因变异表明存在重构误差:

基于 DL 的聚类(来源:Karim 等人,《用于基因型聚类和族群预测的递归深度嵌入网络》,arXiv:1805.12218)

总结来说,在这些方法中,涉及三个重要步骤——使用深度架构提取聚类友好的深度特征、结合聚类和非聚类损失,最后,通过网络更新联合优化聚类和非聚类损失。

用于物联网的深度学习框架和云平台

有几个流行的深度学习框架,每个框架都有其优缺点。其中一些是桌面应用程序,另一些则是云平台,可以用来部署或运行你的深度学习应用程序。然而,大多数开源许可下发布的库对于使用图形处理器的用户有所帮助,这最终可以加速学习过程。这样的框架和库包括 TensorFlow、PyTorch、Keras、Deeplearning4j、H2O 和 微软认知工具包 (CNTK)。即便是在几年前,其他实现方式,如 Theano、Caffee 和 Neon,也曾被广泛使用,但现在它们已经过时。

Deeplearning4j (DL4J) 是首批商业级开源分布式深度学习库之一,专为 Java 和 Scala 构建。它还提供对 Hadoop 和 Spark 的集成支持。DL4J 是为在分布式 GPU 和 CPU 上的商业环境中使用而构建的,旨在成为前沿的且即插即用,比配置更注重约定,这使得非研究人员能够快速原型开发。其众多的库可以与 DL4J 集成,使得无论你是在 Java 还是 Scala 中开发 ML 应用,都能简化 JVM 的使用体验。类似于 JVM 上的 NumPy,ND4J 提供了线性代数的基本操作(矩阵创建、加法和乘法)。然而,ND4S 是一个面向 JVM 的科学计算库。

线性代数和矩阵操作。它还为基于 JVM 的语言提供了 n 维数组。以下图表显示了去年 Google Trends,展示了 TensorFlow 的受欢迎程度:

除了这些框架,Chainer 也是一个强大、灵活且直观的深度学习框架,支持 CUDA 计算。它只需要几行代码就能利用 GPU,还能在多个 GPU 上轻松运行。最重要的是,Chainer 支持多种网络架构,包括前馈网络、卷积网络、循环网络和递归网络。它还支持每批次架构。Chainer 另一个有趣的特点是,它支持前向计算,因此 Python 中的任何控制流语句都可以包含其中,并且不会失去反向传播的能力。这使得代码更加直观,且易于调试。

2018 年深度学习框架的实力评分也显示,TensorFlow、Keras 和 PyTorch 远远领先于其他框架(参见towardsdatascience.com/deep-learning-framework-power-scores-2018-23607ddf297a)。评分是根据以下来源的深度学习框架的使用情况、流行程度和兴趣计算的。除了前述的库,还有一些针对云中的深度学习的最新倡议。其理念是将深度学习能力引入具有数十亿数据点和高维数据的大数据。例如,Amazon Web ServicesAWS)、Microsoft Azure、Google Cloud Platform 和NVIDIA GPU CloudNGC)都提供原生于其公共云的机器学习和深度学习服务。

2017 年 10 月,AWS 发布了深度学习 AMIDLAMIs)用于Amazon 弹性计算云Amazon EC2)P3 实例。这些 AMI 预装了深度学习框架,如 TensorFlow、Gluon 和 Apache MXNet,这些框架经过优化,适用于 Amazon EC2 P3 实例中的 NVIDIA Volta V100 GPU。目前,DL 服务提供三种类型的 AMI:Conda AMI、基础 AMI 和带源代码的 AMI。CNTK 是 Azure 的开源深度学习服务。与 AWS 的产品类似,它侧重于可以帮助开发者构建和部署深度学习应用的工具。Azure 还提供了一个模型库,其中包含帮助企业入门的资源,如代码示例等。

另一方面,NGC 通过 GPU 加速容器赋能 AI 科学家和研究人员(参见www.nvidia.com/en-us/data-center/gpu-cloud-computing/)。NGC 包含了诸如 TensorFlow、PyTorch、MXNet 等容器化的深度学习框架,这些框架经过 NVIDIA 的调优、测试和认证,可以在参与的云服务提供商的最新 NVIDIA GPU 上运行。然而,第三方服务也可以通过各自的市场提供。

在基于云的物联网系统开发市场方面,目前它分为三条明显的路线: 现成平台(例如,AWS IoT Core、Azure IoT Suite 和 Google Cloud IoT Core),这些平台权衡了供应商锁定和更高的批量定价与具成本效益的可扩展性和较短的交付时间;基于 Linux 堆栈的相对成熟的 MQTT 配置(示例:Eclipse Mosquitto);以及那些较为新颖的、正在开发并获得足够关注、兴趣和社区投资的协议和产品(例如,Nabto 的 P2P 协议),这些协议和产品将来有望在市场中占据强有力的地位。

作为一个深度学习框架,Chainer 神经网络是适用于所有由 Intel Atom、NVIDIA Jetson TX2 和 Raspberry Pi 驱动的设备的绝佳选择。因此,使用 Chainer 时,我们无需从零开始为设备构建和配置机器学习框架。它提供了三个流行机器学习框架的预构建包,包括 TensorFlow、Apache MXNet 和 Chainer。Chainer 的工作原理类似,它依赖于 Greengrass 库以及通过 Amazon SageMaker 生成并/或直接存储在 Amazon S3 桶中的一组模型文件。从 Amazon SageMaker 或 Amazon S3 中,机器学习模型可以部署到 AWS Greengrass,作为机器学习推理的本地资源使用。从概念上讲,AWS IoT Core 充当管理平面,将机器学习推理部署到边缘。

总结

在本章中,我们介绍了一些基础的深度学习主题。我们从基本的但全面的机器学习介绍开始了我们的旅程。然后,我们逐步进入了深度学习和不同的神经网络架构。接着,我们简要概述了可以用于开发基于深度学习的物联网设备应用程序的最重要的深度学习框架。

物联网应用程序,如智能家居、智能城市和智能医疗,严重依赖于视频或图像数据处理来进行决策。在下一章中,我们将介绍基于深度学习的物联网应用图像处理,包括图像识别、分类和目标检测。此外,我们还将介绍物联网应用中的视频数据处理实践。

第二部分:物联网的深度学习应用开发实践

在本节中,我们将了解如何使用深度学习为各种应用场景创建应用程序,例如图像识别、音频/语音/声音识别、室内定位以及生理和心理状态检测。我们还将通过实例学习如何使用聚类算法进行物联网中的异常检测应用开发。

本节包括以下章节:

  • 第三章,物联网中的图像识别

  • 第四章,物联网中的音频/语音/声音识别

  • 第五章,物联网中的室内定位

  • 第六章,物联网中的生理和心理状态检测

  • 第七章,物联网安全

第三章:物联网中的图像识别

未来,许多物联网应用,包括智能家居、智能城市和智能健康等,将广泛使用基于图像识别的决策制定(如智能门锁的面部识别)。机器学习ML)和深度学习DL)算法对于图像识别和决策制定非常有用,因此它们在物联网应用中具有很大的潜力。本章将涉及基于深度学习的物联网应用图像数据处理的实际操作。

本章的第一部分将简要描述不同的物联网应用及其基于图像检测的决策制定。此外,还将简要讨论一个物联网应用及其在实际场景中的基于图像检测的实现。在本章的第二部分,我们将介绍使用深度学习算法的图像检测应用的实际操作。本章将涵盖以下主题:

  • 物联网应用与图像识别

  • 用例一:基于图像的道路故障检测

  • 用例二:基于图像的智能固体废物分离

  • 实现用例

  • 物联网中图像识别的迁移学习

  • 物联网应用中的 CNN 图像识别

  • 数据收集

  • 数据预处理

  • 模型训练

  • 模型评估

物联网应用与图像识别

物联网应用中的图像识别领域正在迅速变化。移动处理能力、边缘计算和机器学习的重大进展正在为图像识别在许多物联网应用中的广泛使用铺平道路。例如,普及的移动设备(它们是许多物联网应用的关键组件)配备高分辨率摄像头,能够让每个人在任何地方生成图像和视频。

此外,智能视频摄像头,如 IP 摄像头和带摄像头的树莓派,广泛应用于许多场所,如智能家居、校园和工厂,用于不同的应用。许多物联网应用——包括智能城市、智能家居、智能健康、智能教育、智能工厂和智能农业——都通过图像识别/分类做出决策。如下面的图示所示,这些应用使用以下一种或多种图像识别服务:

让我们详细讨论前面提到的图像:

  • 人员识别:通常,家庭、办公室和其他场所的安全且友好的进入方式是一个具有挑战性的任务。使用包括物联网解决方案在内的智能设备可以为许多场所提供安全且友好的访问方式。以办公室或家庭的访问为例,我们通常使用一把或多把钥匙进入家庭或办公室。如果丢失了这些钥匙,除了给我们带来不便,还可能带来安全风险,特别是如果有人捡到它们。在这种情况下,基于图像识别的人员识别可以作为智能家居或办公室的无钥匙进入方式。

  • 物体识别:基于物联网的自动物体识别在许多领域中非常有价值,包括无人驾驶汽车、智能城市和智能工厂。例如,智能城市应用程序,如智能车辆牌照识别和车辆检测,以及全市范围的公共资产监控,可以使用基于图像识别的物体检测服务。类似地,智能工厂可以使用物体检测服务进行库存管理。

  • 面部识别:基于图像处理的面部检测和识别领域发展迅速,未来它将成为一种商品。配备生物识别功能的智能手机将成为常态。智能手机和基于物联网的面部识别可以应用于许多领域,如安全、智能教育等。例如,在智能课堂(教育)中,可以使用面部识别系统来识别学生对讲座的反应。

  • 事件检测:许多人类疾病(如手足口病)、动物疾病(如口蹄疫和家禽疾病)以及植物疾病的症状是显而易见的,可以通过物联网解决方案和基于深度学习的图像分类进行数字化检测。

用例一 – 基于图像的自动故障检测

城市中的公共资产(如道路、公共建筑和旅游景点)是异质的,并且分布在城市各处。世界上大多数城市在监控、故障检测和报告这些资产方面面临挑战。例如,在许多英国城市,市民经常报告故障,但在许多情况下,报告的准确性和效率都是一个问题。在智能城市中,这些资产可以通过物联网应用进行监控,故障也可以被检测并报告。例如,一辆附有一个或多个传感器(如摄像头或麦克风)的车辆(例如市政车辆)可以用于道路故障监测和检测。

道路是城市中重要的资产,且存在许多故障。坑洼、颠簸和道路粗糙是通勤者和车辆常遇到的一些最令人沮丧的危害和异常情况。更重要的是,车辆可能经常面临悬挂问题、转向不对准和爆胎,这些问题也可能导致事故。与道路故障相关的损坏成本相当高。例如,仅坑洼造成的损害就让英国司机每年损失 17 亿英镑。支持适当深度学习算法的物联网应用可以自动检测这些故障并进行适当报告,从而以具有成本效益的方式减少与道路故障相关的损害数量。

实施用例一

如下图所示,实施此用例包括三个主要元素:

让我们详细了解这些组件:

  • 传感器和数据收集:数据收集传感器的选择取决于资产和故障类型。如果我们使用智能手机作为边缘计算设备,其摄像头可以用于感知和收集道路故障数据。相反,如果使用树莓派作为边缘计算设备,则需要使用外部摄像头,因为树莓派没有内置摄像头。前面的图示展示了树莓派和摄像头如何用于用例实现。我们使用了一台树莓派 3 型 B+,配备 1GB RAM 和一款 500 万像素的 Omnivision OV5647 传感器,采用定焦镜头。相机的采样或拍照速率将取决于车辆的速度和道路故障的可用性。例如,如果智能手机摄像头或安装在车辆上的摄像头每秒钟能拍摄一张照片,当车辆速度为 40 公里/小时或以下时,手机或树莓派将在两秒内检测到故障。一旦图像被感知并捕捉到,它将被发送到检测方法。

  • 故障检测与报告:在此阶段,边缘计算设备将安装一个应用程序。安装在智能手机或树莓派上的应用程序将加载预训练的故障检测和分类模型。一旦车辆的智能手机或树莓派摄像头拍摄到一张照片(按照采样率),这些模型将检测并分类潜在的故障,并向应用服务器(本地议会)报告。

  • 议会服务器和故障检测模型:议会的服务器负责以下内容:

    • 使用参考数据集学习故障检测和分类模型

    • 传播和更新边缘计算设备的模型

    • 接收和存储故障数据

基于图像的模型学习和道路故障检测的验证是实现的核心。章节的第二部分(从物联网中图像识别的迁移学习开始的部分)将描述前述用例中基于深度学习的异常检测实现。所有必要的代码都可以在章节的代码文件夹中找到。

用例二 – 基于图像的智能固体废物分拣

固体废物是全球面临的挑战。固体废物的管理成本高昂,不当的废物管理也在严重影响全球经济、公共健康和环境。一般来说,塑料、玻璃瓶和纸张等固体废物是可回收的,它们需要有效的回收方法,才能在经济和环境上带来益处。然而,在大多数国家,现有的回收过程仍是手工操作。此外,市民或消费者往往会对回收方法感到困惑。

在这个背景下,物联网(IoT)借助机器学习和深度学习,尤其是基于图像的物体识别,能够识别废物类型并帮助将其进行分类,无需人工干预。

实现用例二

基于图像的智能固体废物分离的实现包括两个关键组件:

  • 一个带有独立舱室、每种类型固体废物都有可控盖子的垃圾箱

  • 带有深度学习模型的物联网基础设施,用于图像识别

实现的第一个组件不在本书的范围内,我们假设该组件已经可用。如以下图所示,用例的物联网实现由两个主要元素组成:

  • 传感器和数据收集:选择传感器进行数据收集取决于固体废物的类型及其特性。例如,许多玻璃瓶和塑料瓶在颜色和外观上非常相似。然而,它们的重量通常差异显著。对于该用例,我们考虑使用两种传感器:

    • 一个或多个摄像头,用于捕捉垃圾进入垃圾箱的图像

    • 一个重量传感器,用于测量垃圾的重量

我们使用树莓派作为计算平台。该用例使用了 1 GB 内存的树莓派 3 型号 B+,并配备了 5 百万像素的 Omnivision OV5647 传感器和固定焦距镜头进行测试。一旦图像和重量被感知并捕获,它们将被发送到分类方法。

  • 垃圾检测与分类:这是实现的关键元素。树莓派将加载一个经过预训练的垃圾检测与分类模型,采用深度学习技术。一旦检测算法识别出垃圾并进行分类,它将启动控制系统打开适当的盖子,并将垃圾移入垃圾箱。

该用例场景集中于城市公共区域的废物管理,包括公园、旅游景点、绿化带和其他休闲区域。通常,这些区域的市民和/或游客会单独处理他们的废物。值得注意的是,他们丢弃的废物数量较少,从单个物品到几个物品不等。

以下各节将描述所需的基于深度学习的图像识别实现,用于上述用例。所有必要的代码可以在本章的代码文件夹中找到。

物联网中的图像识别迁移学习

通常,迁移学习是指将预训练的机器学习模型表示迁移到另一个问题中。近年来,这种方法已成为应用深度学习模型解决问题的一种流行手段,尤其是在图像处理和识别中,因为它能够用相对较少的数据训练深度学习模型。

下图展示了两个模型:

  • 标准深度学习模型架构(a)

  • 迁移学习深度学习模型架构(b):

如标准深度学习模型架构图所示,一个完全训练的神经网络在初始层接收输入值,然后将这些信息依次向前传递并进行必要的转换,直到倒数第二层(也称为 瓶颈层)构建了输入的高级表示,该表示可以更容易地转化为最终输出。模型的完整训练包括对每个连接(标记为蓝色)的权重和偏置项进行优化。在大型和异构数据集中,这些权重和偏置项的数量可能达到数百万。

在迁移学习中,我们可以使用前面和中间层,只重新训练后面的层。迁移学习的一种流行方法是复用整个网络中除最后一层外的预训练权重,并通过使用新数据集重新训练网络来重新学习最后一层或分类部分的权重。如迁移学习深度学习(DL)模型架构图所示,我们复用了橙色连接,并通过使用新数据集重新训练网络以学习最后一层的绿色连接。

许多预训练的深度学习模型,包括 Inception-v3 和 MobileNets 模型,已经可以用于迁移学习。Inception-v3 模型是为 ImageNet 大规模视觉识别挑战赛训练的,它将图像分类为 1,000 个类别,如 斑马达尔马提亚犬洗碗机。Inception-v3 由两个部分组成:

  • 一个使用卷积神经网络(CNN)进行特征提取的部分,它从输入中提取特征

  • 一个分类部分,包含全连接层和 softmax 层,它基于第一部分识别的特征对输入数据进行分类

如果我们想使用 Inception-v3,我们可以复用特征提取部分,并使用我们的数据集重新训练分类部分。

迁移学习提供了两个好处:

  • 在新数据上的训练速度更快。

  • 解决问题的能力是在 较少的训练数据 上进行训练,而不是从头开始学习。

迁移学习的这些特性对物联网(IoT)资源受限的边缘设备中深度学习模型的实现尤为重要,因为我们无需训练资源消耗大的特征提取部分。因此,模型可以使用更少的计算资源和时间进行训练。

物联网应用中的图像识别 CNN

卷积神经网络CNN)有多种实现方式。AlexNet 就是其中一种实现,并且在 ImageNet 挑战赛:ILSVRC 2012 中获得了胜利。从那时起,CNN 已在计算机视觉和图像检测、分类中无处不在。直到 2017 年 4 月,普遍趋势是构建更深、更复杂的网络以实现更高的准确率。然而,这些更深、更复杂的网络提高了准确性,但并不总是使网络变得更加高效,特别是在网络的大小和速度方面。在许多实际应用中,尤其是在物联网应用(如自动驾驶汽车和病人监控)中,识别任务需要在资源受限(处理能力、内存)平台上及时完成。

在这种背景下,MobileNet V1 于 2017 年 4 月推出。这个版本的 MobileNet 相较于 2018 年 4 月推出的第二版(MobileNetV2)有所改进。Mobilenets及其变体是高效 CNN 深度学习模型在物联网(IoT)应用中的重要应用,尤其是在基于图像识别的物联网应用中。在接下来的段落中,我们将简要介绍 MobileNets。

MobileNets 是最流行和最广泛使用的深度学习(DL)模型的实现,即卷积神经网络(CNNs)。它们特别为资源受限的移动设备设计,以支持分类、检测和预测功能。安装了深度学习模型的个人移动设备,包括智能手机、可穿戴设备和智能手表,能够提升用户体验,提供随时随地的访问,并带来安全、隐私和节能的附加益处。值得注意的是,移动设备中的新兴应用将需要更高效的神经网络,以便实时与现实世界进行交互。

以下示意图展示了标准卷积滤波器(图 a)如何在 MobileNet V1 中被两层所替代。它使用深度卷积(图 b)和点卷积(图 c)来构建深度可分离滤波器:

MobileNet V1 的主要动机是卷积层计算代价高,它们可以被所谓的深度可分离卷积所替代。在 MobileNet V1 中,深度可分离卷积过程使用单个滤波器作用于每个输入通道,然后点卷积使用 1x1 的卷积过程处理早期深度卷积的输出。如标准卷积滤波器的示意图所示,标准卷积滤波器在一步中既进行滤波又合并输入,生成新的输出。与标准 CNN 不同,MobileNet 中的深度可分离卷积(分解形式)将这一过程分为两个层次(如 MobileNet V1 的示意图所示):一个用于滤波,另一个用于合并。

下图展示了 MobileNet V1 的因式分解架构。这种因式分解大大减少了计算量和模型大小,因为模型需要计算的参数数量显著减少。例如,MobileNet V1 需要计算 420 万个参数,而全卷积网络需要计算 2930 万个参数:

MobileNet V2 是 MobileNet V1 的更新版,并且在多个方面有了显著改进。它极大地提高了现有的移动视觉识别,包括分类、检测和语义分割。与 MobileNet V1 一样,MobileNet V2 作为 TensorFlow-Slim 图像分类库的一部分发布。如果需要,你可以在 Google 的 Colaboratory 中进行探索。此外,MobileNet V2 作为模块可在 TF-Hub 上使用,预训练检查点或保存的模型可以在github.com/tensorflow/models/tree/master/research/slim/nets/mobilenet找到,并且可以用作迁移学习。

下图展示了 MobileNet V2 的简化架构。MobileNet V2 作为 MobileNet V1 的扩展进行了开发。它使用深度可分离卷积作为高效的构建模块。此外,MobileNet V2 在架构中引入了两个新特性。一个是层之间的线性瓶颈,另一个是瓶颈之间的捷径连接:

收集用例一的数据

我们可以使用智能手机相机或树莓派相机来收集数据,并自己准备数据集,或者从互联网上下载现有的图像(如通过 Google、Bing 等)并准备数据集。或者,我们可以使用现有的开源数据集。对于用例一,我们使用了两者的结合。我们从互联网上下载了现有的坑洞图像数据集(这是最常见的道路故障之一),并通过 Google 图像更新了数据集。该开源数据集(PotDataset)由英国克兰菲尔德大学发布,用于坑洞识别。数据集包含坑洞物体和非坑洞物体的图像,包括井盖、人行道、道路标记和阴影。这些图像经过手工标注,并整理到以下文件夹中:

  • 井盖

  • 人行道

  • 坑洞

  • 道路标记

  • 阴影

探索用例一中的数据集

在将深度学习算法应用于数据之前,探索数据集是非常必要的。在探索过程中,我们可以通过运行image_explorer.py来探索数据集,如下所示:

python image_explorer.py datset_original

下图展示了数据探索过程的快照:

如数据探索图所示,如果仅使用智能手机相机,坑洞和非坑洞物体之间的区别并不总是显而易见。结合红外线相机和智能手机相机可以改善这种情况。此外,我们发现我们使用的坑洞图像可能不足以覆盖各种类型的坑洞,例如以下内容:

  • 已用数据集中的许多图片显示坑洞已经修复/维护。

  • 已用数据集中有几张大尺寸坑洞的图片。

在这个背景下,我们决定通过从互联网收集更多的图像来更新坑洞图像数据集。接下来,我们简要讨论数据收集过程:

  1. 搜索:使用任意浏览器(我们使用了 Chrome),访问 Google,并在 Google 图片中搜索pothole images。你的搜索窗口将显示如下截图:

你可以通过点击工具并将使用权限更改为可修改再利用的标注来选择无版权限制的图片。

  1. 收集图片 URLs:此步骤是使用几行 JavaScript 代码收集图片的 URLs。收集到的 URLs 可以在 Python 中用于下载图片。如以下截图所示,选择 JavaScript 控制台(假设你使用 Chrome 浏览器,但你也可以使用 Firefox),通过点击查看|开发者|JavaScript 控制台(在 macOS 上)或者Google Chrome | 更多工具 | 开发者工具(在 Windows 操作系统上):

一旦你选择了 JavaScript 控制台,你将看到类似于以下截图的浏览器窗口,这将允许你像 REPL 一样执行 JavaScript:

  1. 现在按以下顺序操作:

    • 滚动页面,直到找到所有有用的图片(注意:请使用没有版权限制的图片)作为数据集。之后,你需要收集已选图片的 URLs。

    • 现在进入 JavaScript 控制台,并将以下 JavaScript 代码复制并粘贴到控制台中:

// Get the jquery into the JavaScript console
var scriptJs = document.createElement('scriptJs');
scriptJs.src = "https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js";
document.getElementsByTagName('head')[0].appendChild(scriptJs)
    • 前一行代码将加载 jQuery JavaScript 库。现在,你可以使用 CSS 选择器通过以下代码行收集网址列表:
// Collect the selected URLs
var urls_images = $('.rg_di .rg_meta').map(function() { return JSON.parse($(this).text()).ou; });
  1. 最后,使用以下代码行将网址写入文件(每行一个网址):
// write the URls to a file 
var text_url_Save = urls_images.toArray().join('\n');
var hiddenComponents = document.createElement('a');
hiddenComponents.href = 'data:attachment/text,' + encodeURI(text_url_Save);
hiddenComponents.target = '_blank';
hiddenComponents.download = 'imageurls.txt';
hiddenComponents.click();

执行前面的代码行后,你将在默认下载目录中获得一个名为imageurls.txt的文件。如果你想将其下载到特定文件夹,请在上述代码中将hiddenComponents.download = 'imageurls.txt'改为hiddenComponents.download = 'your fooler/imageurls.txt'

  1. 下载图片:现在你可以准备下载运行图片download_images.py(在章节的代码文件夹中可找到),并使用先前下载的imageurls.txt
python download_images.py  imageurls.txt
  1. 数据探索:下载图像后,我们需要对其进行探索,以删除无关的图像。我们可以通过手动检查来完成这一过程。之后,我们需要调整图像大小,并将其转换为灰度图像,以匹配之前下载的数据集:

上面的截图显示了坑洞图像和非坑洞图像数据集的文件夹结构。

收集用例二的数据

与用例一类似,我们可以通过数码相机收集数据,或使用现有的开源数据集,或两者结合使用。我们正在使用现有的开源数据集来实现排序算法。该数据集是从美国的城市环境中收集的。由于固体垃圾种类可能因国家而异,因此最好根据实际使用用例的国家来更新数据集。该数据集包含六种类型的固体垃圾:玻璃、纸张、纸板、塑料、金属和垃圾。数据集共包含 2,527 张图像,这些图像已被注释并按以下文件夹结构整理,如下图所示:

用例二的数据探索

以下是用例二的数据探索快照。如图所示,玻璃和塑料图像可能会混淆排序算法。在这种情况下,重量传感器数据可以帮助解决这个问题:

数据预处理

这是深度学习管道中的一个关键步骤。现有的坑洞图像数据集以及用于用例中的固体垃圾图像数据集已被预处理,并准备好用于训练、验证和测试。如下面的图示所示,原始图像和修改后的图像(为坑洞类下载的附加图像)都被整理成子文件夹,每个文件夹以五个类别之一命名,并且只包含该类别的图像。在准备训练图像集时需要注意以下几个问题:

  • 数据大小:我们需要为每个类别收集至少 100 张图像,以训练一个表现良好的模型。我们收集的数据越多,训练模型的准确率可能就越高。所使用数据集中的每个类别都有超过 1,000 张样本图像。我们还确保这些图像能够很好地代表我们应用在实际实施中将会遇到的情况。

  • 数据异质性:用于训练的数据应该是异质的。例如,关于坑洞的图片需要尽可能在各种不同的环境、不同的时间和使用不同设备的情况下拍摄。

模型训练

如前所述,我们使用了迁移学习,这不需要从头开始训练;使用新数据集重新训练模型在许多情况下已经足够有效。我们在一台桌面计算机上重新训练了两种流行的 CNN 架构或模型,即 Incentive V3 和 Mobilenet V1,这台计算机模拟了市议会的服务器。在这两种模型中,重新训练模型的时间都不到一小时,这是迁移学习方法的优势。在运行 retrain.py 文件之前,我们需要了解关键参数的列表,该文件位于代码文件夹中。如果我们在终端(Linux 或 macOS)或命令提示符(Windows)中输入 python retrain.py -h,将会看到一个类似于下图的窗口,其中包含额外的信息(即每个参数的概述)。强制性参数是图像目录,它是之前图中所示的数据集目录之一:

下面,我们提供两个命令示例:一个用于重新训练 Incentive V3 模型,另一个用于在修改后的数据集(dataset-modified)上重新训练 Mobilenet V1。为了重新训练 Incentive V3,我们没有传递架构参数值,因为它是 retrain.py 中包含的默认架构。对于其余的参数,包括训练、验证和测试之间的数据划分比例,我们使用了默认值。在这个使用案例中,我们使用了数据拆分规则,将 80% 的图像放入主训练集,保留 10% 作为训练过程中的验证集,剩余的 10% 作为测试集。测试集用于测试分类器的真实世界分类性能:

python retrain.py \
--output_graph=trained_model_incentive-modified-dataset/retrained_graph.pb \
--output_labels=trained_model_incentive-modified-dataset/retrained_labels.txt \
--image_dir=dataset-modified

要运行 Mobilenet V1 模型的训练和验证,请使用以下命令:

python retrain.py \
--output_graph=trained_model_mobilenetv1-modified-dataset/retrained_graph.pb \
--output_labels=trained_model_mobilenetv1-modified-dataset/retrained_labels.txt \
--architecture mobilenet_1.0_224 \
--image_dir=dataset-modified

一旦运行上述命令,它将生成重新训练的模型(retrained_graph.pb)、标签文本(retrained_labels.txt)以及包含训练和验证摘要信息的目录。(--summaries_dir 参数,默认值为 retrain_logs),TensorBoard 可以使用这些摘要信息来可视化模型的不同方面,包括网络结构和性能图表。如果我们在终端或命令提示符中输入以下命令,它将启动 TensorBoard:

tensorboard --logdir retrain_logs

一旦 TensorBoard 启动,打开你的网页浏览器并访问localhost:6006,即可查看 TensorBoard 并查看相应模型的网络结构。下图 (a)(b) 分别展示了 Incentive V3 和 Mobilenet V1 的网络结构。该图展示了与 Mobilenet V1 相比,Incentive V3 的复杂性:

在第二种使用情况下,我们只在固体废物数据集上重新训练了 Mobilenet V1。你可以通过仅提供图像或数据集目录来重新训练模型,如下所示:

--image_dir=dataset-solidwaste

评估模型

首先,我们已经确定了重新训练模型的大小。如下面的截图所示,Mobilenet V1 仅需要 17.1 MB(适用于两种用例),是 Incentive V3(92.3 MB)大小的五分之一,并且该模型可以轻松部署到资源受限的物联网设备中,包括树莓派或智能手机。其次,我们评估了模型的性能。针对这些用例,进行了两级性能评估:(i) 在重新训练阶段,使用桌面 PC 平台/服务器对整个数据集进行评估或测试,(ii) 在树莓派 3 环境中对单个图像或样本(现实生活中的图像)进行了测试或评估:

模型性能(用例一)

用例一的所有评估性能都展示在以下截图中。接下来的六张截图展示了 Incentive V3 和 Mobilenet V1 模型在两组数据上的训练、验证和测试性能。前三张截图展示了重新训练模型后终端生成的结果,后三张截图则是从 TensorBoard 生成的结果。

以下截图展示了在原始数据集上对 Incentive V3 的评估结果:

以下截图展示了在修改后的数据集上对 Incentive V3 的评估结果:

以下截图展示了在原始数据集上对 Mobilenet V1 的评估结果:

以下截图展示了在修改后的数据集上对 Mobilenet V1 的评估结果:

以下截图展示了在原始数据集上对 Incentive V3 的评估结果,这些结果是通过 TensorBoard 生成的:

以下截图展示了在原始数据集上对 Mobilenet V1 的评估结果,这些结果是通过 TensorBoard 生成的:

从之前所有的模型性能截图中可以看出,训练和验证的准确率均远高于 90%,这对于故障检测已经足够。

以下图表展示了对单个样本的分类或目标检测性能。我们使用了两组不同的分类代码(代码在本章的代码文件夹中)。

第一张截图展示了运行 Mobilenet V1 分类器对两个样本进行分类的快照。从所有结果来看,测试或评估准确率均高于 94%,而且凭借这样的准确率,深度学习模型(CNN)具有检测物体的潜力,包括坑洞、井盖以及路上的其他物体。然而,在 Pi 3 上进行物体检测的时间大约为三到五秒,如果我们想要在实时检测和执行中使用这些模型,还需要进一步提高检测速度。此外,结果显示,使用修改过的数据集训练的模型在真实环境中有很大机会提供较高的检测或测试准确率(如前面截图所示),尤其是在坑洞检测方面,因为这一类数据通过加入来自谷歌图片的多样化图像得到了改善:

以下截图展示了使用 Incentive V3 模型在原始数据集(Pi 3 B+)上训练的坑洞检测评估结果:

以下图表展示了使用 Incentive V3 模型在原始数据集(Pi 3 B+)上训练的井盖检测评估结果:

以下图表展示了使用 Mobilenet V1 模型在原始数据集(Pi 3 B+)上训练的坑洞检测评估结果:

以下图表展示了使用 Mobilenet V1 模型在原始数据集(Pi 3 B+)上训练的井盖检测评估结果:

模型性能(用例二)

用例二的所有评估性能展示在下面的截图中。对于这个用例,我们只展示 Mobilenet V1 的结果。以下图表展示了在两个数据集上,Mobilenet V1 模型的训练、验证和测试性能。从以下截图可以看出,测试准确率并不是特别高(77.5%),但对于固体废物检测和分类来说,已经足够好:

以下截图展示了在 TensorBoard 生成的数据集上,Mobilenet V1 的评估结果:

以下三张截图展示了对单个样本的分类或物体(固体废物)检测性能。第一张截图展示了玻璃检测的评估结果:

以下截图展示了塑料检测的评估结果:

以下截图展示了使用 Mobilenet V1 进行金属检测的评估结果:

总结

在本章的第一部分,我们简要描述了不同的物联网应用及其基于图像检测的决策制定。此外,我们还简要讨论了两个使用案例:基于图像检测的道路故障检测和基于图像检测的固体废物分类。第一个应用可以使用智能手机摄像头或树莓派摄像头检测道路上的坑洼。第二个应用则检测不同类型的固体废物,并根据智能回收进行分类。

在本章的第二部分,我们简要讨论了迁移学习和几个示例网络,并研究了其在资源受限的物联网应用中的有效性。此外,我们还讨论了选择 CNN 的理由,包括两种流行的实现方式,即 Inception V3 和 Mobilenet V1。接下来的内容将介绍 Inception V3 和 Mobilenet V1 模型所需的所有深度学习流水线组件。

在许多物联网应用中,仅凭图像识别可能不足以进行物体和/或主体检测。在这种情况下,有时音频/语音/声音识别可能会有所帮助。第三章,物联网中的音频/语音/声音识别,将介绍基于深度学习的语音/声音数据分析和物联网应用中的识别。

参考文献

  • 智能巡逻:使用智能手机传感器和众包进行高效的道路表面监测,Gurdit Singh,Divya Bansal,Sanjeev Sofat,Naveen Aggarwal,普适计算与移动计算,第 40 卷,2017 年,第 71-88 页

  • 使用智能手机拍摄图像的深度神经网络道路损伤检测,Hiroya Maeda,Yoshihide Sekimoto,Toshikazu Seto,Takehiro Kashiyama,Hiroshi Omata,arXiv:1801.09454

  • 坑洼让英国司机每年损失 17 亿英镑:如果您的车受损,如何索赔,Luke John Smith:www.express.co.uk/life-style/cars/938333/pothole-damage-cost-how-to-claim-UK

  • What a Waste: 全球固体废物管理回顾,D Hoornweg 和 P Bhada-Tata,世界银行,华盛顿特区,美国,2012 年

  • 高效卷积神经网络在移动视觉应用中的应用,Andrew G Howard,Menglong Zhu,Bo Chen,Dmitry Kalenichenko,Weijun Wang,Tobias Weyand,Marco Andreetto,Hartwig Adam,MobileNets: arXiv:1704.04861

  • 基于深度卷积神经网络的 Imagenet 分类,A Krizhevsky,I Sutskever,G E Hinton,发表于神经信息处理系统进展,第 1,097-1,105 页,2012 年。1,6。

  • MobileNetV2:倒残差和线性瓶颈,Mark Sandler,Andrew Howard,Menglong Zhu,Andrey Zhmoginov,Liang-Chieh Chen,arXiv:1801.04381。

  • 坑洼数据集:cord.cranfield.ac.uk/articles/PotDataset/5999699

  • Trashnet: github.com/garythung/trashnet

第四章:IoT 中的音频/语音/语音识别

自动音频/语音/语音识别正成为人们与设备(包括智能手机、可穿戴设备和其他智能设备)交互的常见、便捷方式。机器学习和深度学习算法对于音频/语音/语音识别和决策制定非常有用。因此,它们对依赖音频/语音/语音识别进行活动和决策的 IoT 应用非常有前景。本章将总体介绍基于深度学习的 IoT 应用中的语音/语音数据分析和识别。

本章的第一部分将简要描述不同的 IoT 应用及其基于语音/语音识别的决策制定。此外,还将简要讨论两个 IoT 应用及其在实际场景中的基于语音/语音识别的实现。第二部分将介绍使用深度学习算法的应用的语音/语音检测实现。我们将涵盖以下主题:

  • IoT 应用与音频/语音识别

  • 用例一 – 语音控制的智能灯

  • 实现语音控制的智能灯

  • 用例二 – 语音控制的家庭访问

  • 实现语音控制的家庭访问

  • IoT 中的音频/语音识别的深度学习(DL)

  • IoT 应用中的音频/语音识别的深度学习算法

  • 基于深度学习的音频/语音识别在 IoT 中的不同部署选项

  • 数据收集与预处理

  • 模型训练

  • 模型评估

IoT 中的语音/语音识别

像图像识别一样,IoT 应用中的语音/语音识别领域正在迅速变化。近年来,消费者已经开始依赖语音命令功能,这一趋势得到了亚马逊、谷歌、小米等公司语音启用搜索和/或设备的推动。这项技术正变得对用户极为有用。统计数据显示,约 50%的美国家庭(techcrunch.com/2017/11/08/voice-enabled-smart-speakers-to-reach-55-of-u-s-households-by-2022-says-report/)使用语音激活命令来访问在线内容。因此,IoT、机器学习和深度学习支持的语音/语音识别已经彻底改变了商业和消费者期望的焦点。许多行业——包括家庭自动化、医疗保健、汽车和娱乐——正在采用语音启用的 IoT 应用。如下图所示,这些应用使用了以下一种或多种语音/语音识别服务:

  • 语音/命令识别: 语音控制的物联网应用在许多应用领域中越来越受欢迎,如智能家居/办公室、智能医院和智能汽车,因为它们的便利性。例如,行动不便的人可能会发现开关电视或灯光困难。语音控制/命令的电视/灯光可以通过简单地听取声音来打开电视/灯光,从而缓解这一困难。这将为许多残疾人士和/或有特殊需求的人提供独立的生活方式。语音激活的智能微波炉可以彻底改变烹饪方式。此外,语音启用的智能音响可以帮助并回答许多常见问题,服务于医院、机场、火车站等公共服务领域。例如,智能语音音响可以回答医院中患者的常见问题,比如探视时间是什么时候,病房医生是谁。

  • 人/说话人识别: 说话人/人物识别是物联网应用提供的第二个重要服务,近年来备受关注。利用基于深度学习/机器学习的说话人识别服务的关键应用包括个性化语音助手、智能家电、安全服务中的生物认证、刑事调查和智能汽车[1,2]。语音控制的家庭/办公室访问是生物认证的一个例子。

  • 情感分析/情绪检测: 用户情绪检测或情感分析对于提供个性化和高效的服务非常有用。物联网应用,如智能医疗[3]、智能教育以及安全和保障服务,可以通过基于深度学习的情绪检测或情感分析来提升其服务。例如,在智能教室中,教师可以实时或准实时分析学生的情绪,以提供个性化和/或小组教学。这将改善学生的学习体验。

  • 语言翻译: 全球有 6500 种活跃的口语语言(www.infoplease.com/askeds/how-many-spoken-languages),这给有效沟通和互操作性带来了挑战。许多公共服务,如移民办公室,可以使用翻译器代替付费口译员。游客可以使用智能设备,如ILIiamili.com/us/),与他人有效沟通。

用例一 – 语音控制智能灯

根据世界卫生组织WHO)的统计,全球有超过十亿人生活在某种形式的残疾中。 其中约 20%的人在功能和独立生活方面面临显著困难。 未来,由于残疾患病率的不断增加,残疾问题将变得更加严重。 得到机器学习/深度学习支持的物联网应用,如智能家居,能够为这一群体提供支持,并通过提高独立性改善他们的生活质量。 其中一个应用就是语音激活的智能灯/风扇控制。

面对残疾(如行动障碍)的个体,在日常生活中会面临各种困难。 其中一个困难是开关家里或办公室的灯/风扇/其他设备。 语音激活的家居/办公室灯/风扇/其他设备的智能控制是一种物联网应用。 然而,语音识别和准确检测给定命令并不是一件容易的事情。 一个人的口音、发音和周围噪音可能会使得语音识别变得困难。 适当的深度学习(DL)算法,经过在大规模语音数据集上训练,能够有效解决这些问题,并可以实现一个功能完备的语音控制智能灯应用。

实现用例一

以下图展示了实现语音激活灯光(在房间内)的关键组件:

如前图所示,实施该用例将需要以下组件:

  • 传感器和计算平台:对于这个用例,我们考虑在房间墙上安装两个全向麦克风。 这些麦克风通过无线方式与计算平台连接。 在这个用例中,我们使用树莓派 3 作为计算平台,它可以作为智能家居的边缘计算设备,控制家居中部署的物联网设备。 我们还需要另外两种设备:一台 433 MHz 无线发射器,通过树莓派连接,用于将处理后的命令传输到开关;以及一台 433 MHz 遥控器或无线控制的电源插座,用于控制灯光或目标设备。

  • 语音激活命令检测与控制:在此阶段,边缘计算设备将安装一个应用程序。 安装在树莓派上的应用程序将加载一个预训练的语音命令检测与分类模型。 一旦某个麦克风接收到“关灯”命令或类似的指令,它将把收到的命令发送到树莓派进行处理和检测,使用深度学习模型进行分析。 最终,树莓派将检测到的命令传输给无线控制的电源插座,从而对灯光进行必要的操作。

  • 桌面或服务器用于模型学习:我们还需要一台桌面计算机/服务器或访问云计算平台,用于通过参考数据集学习语音检测和分类的模型。该学习模型将预先安装在树莓派上。

本章第二部分(从DL 用于物联网中的声音/音频识别部分开始)将描述基于深度学习的前述用例的异常检测实现。所有必要的代码可以在本章的代码文件夹中找到。

用例二 – 语音控制家居访问

创建安全且友好的家居、办公室及其他场所的访问方式是一个具有挑战性的任务,因为它可能需要钥匙或访问卡(如酒店房间卡),而用户不一定总是记得随身携带。智能设备的使用,包括物联网解决方案,可以为许多场所提供安全且友好的访问方式。智能安全访问的一个潜在方法是基于图像识别对人员进行身份验证,并据此打开门/门禁。然而,这种方法的问题在于,任何入侵者都可以收集一个或多个被允许进入人员的照片,并将照片展示给已安装的摄像头,从而获得访问权限。解决这一问题的一个方法是结合使用图像识别和语音识别,或仅使用语音识别来允许进入家门/办公室。

声音生物识别(或声音指纹)对每个人来说都是独一无二的,模拟这一特征是一个具有挑战性的任务。然而,检测这一独特属性并非易事。基于深度学习的语音识别可以识别独特的属性和相应的人,并且仅允许该人访问。

实现用例二

如下图所示,语音激活灯光(在房间内)使用案例的实现包含三个主要元素:

  • 传感器和计算平台:对于此用例,我们考虑在家门口安装一台全向麦克风,且通过无线方式与计算平台连接,或将其隐藏在墙内。对于计算平台,我们使用树莓派,它将作为智能家居的边缘计算设备,控制家中部署的物联网设备。同时,门上安装了一个数字锁系统,可以通过计算机进行控制。

  • 语音激活命令检测与控制:在这一阶段,边缘计算设备将安装一个应用程序。安装在树莓派上的应用程序将加载一个预训练的扬声器或人声检测与分类模型。一旦真实用户对门口的麦克风说话,设备便会收集音频信号,并将接收到的语音信号发送到树莓派进行处理和人脸检测,使用深度学习模型。如果检测到的人在智能家居控制器(此处为树莓派)的白名单(家中住户名单)中,控制器将命令门解锁,否则不会解锁。

  • 桌面或服务器用于模型学习:我们还需要一个桌面/服务器或访问云计算平台,以便使用参考数据集学习语音检测和分类模型。该学习的模型将预安装在树莓派中。

以下所有章节描述了实现基于深度学习的命令/扬声器识别的过程,这些是上述应用场景所需的。所有必要的代码可以在章节的代码文件夹中找到。

物联网中的声音/音频识别的深度学习

在讨论有用的深度学习模型之前,理解自动语音识别ASR)系统的工作原理是非常重要的。

ASR 系统模型

自动语音识别ASR)系统需要三个主要的知识来源。这些来源分别是声学模型语音词典语言模型[4]。通常,声学模型处理语言的声音,包括音素和额外的声音(如停顿、呼吸、背景噪音等)。另一方面,语音词典模型或字典包括系统可以理解的单词及其可能的发音。最后,语言模型包含有关语言潜在单词序列的知识。近年来,深度学习(DL)方法已广泛应用于 ASR 的声学和语言模型中。

以下图展示了一个自动语音识别ASR)的系统模型。该模型由三个主要阶段组成:

  • 数据收集

  • 信号分析与特征提取(也称为预处理

  • 解码/识别/分类。如以下图所示,深度学习将用于识别阶段:

ASR 中的特征提取

特征提取是自动语音识别(ASR)深度学习(DL)流程中的一个重要预处理阶段。这个阶段包括一个分析器和音频指纹或特征的提取。这个阶段主要计算一系列特征向量,提供了对采集到的语音信号的紧凑表示。通常,这个任务可以分为三个关键步骤。第一步称为语音分析。这一步对语音信号进行频谱时域分析,生成描述短语音间隔功率谱包络的原始特征。第二步提取一个扩展的特征向量,包含静态和动态特征。最后一步将这些扩展的特征向量转换为更紧凑、更鲁棒的向量。重要的是,这些向量是基于深度学习的命令/说话人/语言识别器的输入。

有多种特征提取方法可用于 ASR,线性预测编码LPC)、感知线性预测PLP)和梅尔频率倒谱系数MFCC)是其中广泛使用的方法。MFCC 是最广泛使用的特征提取方法。下图展示了 MFCC 的关键组成部分:

MFCC 的关键步骤如下:

  1. 输入音频文件并将其转换为原始声音数据(时域信号)。

  2. 通过短时傅里叶变换、加窗和帧分割将时域信号转换为频域信号。

  3. 通过梅尔谱变换将频率转换为人类可感知的线性关系。

  4. 通过梅尔倒谱分析采用离散余弦变换(DCT)将直流成分与正弦成分分离。

  5. 提取声音频谱特征向量并将其转换为图像。

ASR 的深度学习模型

许多深度学习算法或模型已被应用于自动语音识别(ASR)。深度信念网络DBN)是深度学习在 ASR 中的早期实现之一。通常,它作为预训练层与一个单独的监督层的深度神经网络DNN)一起使用。长短期记忆LSTM)已被用于大规模声学建模。时延神经网络TDNN)架构已被用于音频信号处理。CNN(卷积神经网络),它普及了深度学习,也被用作 ASR 的深度学习架构。深度学习架构的使用显著提高了 ASR 的语音识别准确性。然而,并非所有深度学习架构都显示出改进,特别是在不同类型的音频信号和环境中,如嘈杂和混响环境。CNN 可以用于减少频谱变化并建模语音信号中存在的频谱相关性。

循环神经网络RNNs)和 LSTM 因其能够在演变过程中结合输入的时间特征,广泛应用于连续和/或自然语言处理。相反,CNN 更适合处理短小且非连续的音频信号,因为其具有平移不变性,比如发现结构模式的能力,不受位置的影响。此外,CNN 在噪声和回响环境中的语音识别表现最佳,而 LSTM 在干净条件下表现更好。这是因为 CNN 强调局部相关性,而非全局相关性。在这种背景下,我们将使用 CNN 来实现用例,因为用于灯光控制的语音和用于门禁的语音都很短且非连续。此外,它们的环境可能会有噪声和回响。

CNN 和转移学习在物联网应用中的语音识别

CNN 是一种广泛应用的深度学习(DL)算法,主要用于图像识别。近年来,这种算法在音频/语音/说话人识别中变得越来越流行,因为这些信号可以转换为图像。CNN 有多种实现方式,包括两个版本的 Mobilenets 和 Incentive V3。Mobilenets 和 Incentive V3 的概述可以参见 第三章,物联网中的图像识别

数据收集

自动语音识别(ASR)数据收集由于多种原因具有挑战性,包括隐私问题。因此,开源数据集的数量有限。更重要的是,这些数据集可能难以访问,可能缺乏足够的数据/说话人,或者可能包含噪声。在这种情况下,我们决定为两个用例使用两个不同的数据集。对于语音驱动的智能灯控制,我们使用 Google 的语音命令数据集;对于第二个用例,我们可以从三个流行的开放数据源中抓取数据,分别是 LibriVox、LibriSpeech ASR 语料库、VoxCeleb 和 YouTube。

Google 的语音命令数据集包含 65,000 条一秒钟长的 30 个简短单词的发音,由数千名来自公众的不同成员通过 AIY 网站贡献。该数据集提供了常见单词的基础音频数据,如 OnOffYes、数字和方向,这些数据对于测试第一个用例非常有用。例如,switch on the light 命令可以通过数据集中的 On 来表示,而 switch off the light 命令则可以通过 Off 数据来表示。类似地,通过抓取个人语音获得的数据可以代表家庭的住户。第二个用例将考虑一个典型的家庭,通常有三到五个住户。这些住户将是家庭的白名单,若被识别出来,将被授予访问权限。任何非白名单中的人员将无法自动进入家庭。我们在 Google 的语音命令数据集及其较小版本上测试了 CNN。以下截图展示了用于第一个用例的较小数据集的层次结构视图:

对于用例二,我们从 LibriVox 抓取了数据,并且还下载了 LibriSpeech ASR 语音识别语料库的音频文件。我们使用 BeautifulSoup 和 Selenium 编写了一个网页抓取器。你也可以使用其他 Python 模块或甚至其他语言(如 Node.js、C、C++ 和 PHP)编写类似的抓取器。该抓取器将解析 LibriVox 网站或任何其他给定的链接,并下载我们需要的音频书籍/文件。在以下代码中,我们简要展示了抓取器的脚本,它包含三个主要部分:

第一部分:导入所需的 Python 模块以进行音频文件抓取:

# Import the required modules
import urllib
from bs4 import BeautifulSoup
from selenium import webdriver
import os, os.path
import simplejson
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

第二部分:准备要下载的音频书籍链接。请注意,这些链接可能包含重复的读者,将对其进行清理,以生成一个非重复的读者/发言人/家庭成员数据集:

# Create links book for the audio data to be downloaded: this may include repeated readers
book_links = []
browser = webdriver.PhantomJS(executable_path = '/usr/local/bin/phantomjs')

for i in range(1): ## testing first 0-1 (2) pages of the site : to minimise the time require to downloads   
    url = ("https://librivox.org/search?title=&author=&reader=&keywords=&genre_id=0&status=all&project_type=solo&recorded_language=&sort_order=catalog_date&search_page={}&search_form=advanced").format(i)
    print(url)
    browser.get(url)
    element = WebDriverWait(browser, 100).until(
    EC.presence_of_element_located((By.CLASS_NAME , "catalog-result")))
    html = browser.page_source
    soup = BeautifulSoup(html, 'html.parser')
    ul_tag = soup.find('ul', {'class': 'browse-list'})   
    for li_tag in ul_tag.find_all('li', {'class': 'catalog-result'}):
        result_data = li_tag.find('div', {'class': 'result-data'})
        book_meta = result_data.find('p', {'class': 'book-meta'})
        link = result_data.a["href"]
        print(link)
        if str(book_meta).find("Complete") and link not in book_links:
            book_links.append(link)      
    print(len(book_links)) # links per page could be different from regular browsers
browser.quit()

第三部分:从列出的书籍下载音频文件,并形成一个非重复读者/发言人的数据集:

#  List of Links or pages for the audio books to be downloaded
f = open('audiodownload_links.txt', 'w')
simplejson.dump(download_links, f)
f.close()

# Record the file size of each reader's file
f = open('audiodownload_sizes.txt', 'w')
simplejson.dump(download_sizes, f)
f.close()

# Download the audio files and save them in local directory
 def count_files():
    dir = 'audio_files_downloaded'
    list = [file for file in os.listdir(dir) if file.endswith('.zip')] # dir is your directory path
    number_files = len(list)
    return number_files
counter = 100 # this is for naming each downloaded file
for link, size in zip(download_links, download_sizes):
    if size >= 50 and size <= 100:
        localDestination = 'audio_files_downloaded/audio{}.zip'.format(counter)
        resultFilePath, responseHeaders = urllib.request.urlretrieve(link, localDestination)
        counter += 1
cnt2 =  0
num = count_files()
if num < 200:
    for link, size in zip(download_links, download_sizes):
        if size > 100 and size <= 150:
            localDestination = 'audio_files_downloaded/audio{}.zip'.format(counter)
            resultFilePath, responseHeaders = urllib.request.urlretrieve(link, localDestination)
            counter += 1
        cnt2 += 1
num = count_files()
if num < 200:
    for link, size in zip(download_links, download_sizes):        if size > 150 and size <= 200:
            localDestination = 'audio_files_downloaded/audio{}.zip'.format(counter)
            resultFilePath, responseHeaders = urllib.request.urlretrieve(link, localDestination)
            counter += 1
num = count_files()
if num < 200:
    for link, size in zip(download_links, download_sizes):
        if size > 200 and size <= 250:
            localDestination = 'audio_files_downloaded/audio{}.zip'.format(counter)
            resultFilePath, responseHeaders = urllib.request.urlretrieve(link, localDestination)
            counter += 1
num = count_files()
if num < 200:
    for link, size in zip(download_links, download_sizes):
        if size > 250 and size <= 300:
            localDestination = 'audio_files_downloaded/audio{}.zip'.format(counter)
            resultFilePath, responseHeaders = urllib.request.urlretrieve(link, localDestination)
            counter += 1
num = count_files()
if num < 200:
    for link, size in zip(download_links, download_sizes):
        if size > 300 and size <= 350:
            localDestination = 
audio_files_downloaded/audio{}.zip'.format(counter)
            resultFilePath, responseHeaders = urllib.request.urlretrieve(link, localDestination)
            counter += 1
num = count_files()
if num < 200:
    for link, size in zip(download_links, download_sizes):
        if size > 350 and size <= 400:
            localDestination = 'audio_files_downloaded/audio{}.zip'.format(counter)
            resultFilePath, responseHeaders = urllib.request.urlretrieve(link, localDestination)
            counter += 1

下载所需数量的读者/发言人的音频文件或.mp3文件(例如五个发言人或家庭成员)后,我们处理这些.mp3文件并将它们转换为固定大小的五秒钟音频文件(.wav)。我们可以通过使用像 ffmpeg、sox 和 mp3splt 这样的工具,通过 shell 脚本来完成,也可以手动进行(如果读者/家庭成员和文件不多的话)。

由于实现基于卷积神经网络(CNN),我们需要将 WAV 音频文件转换为图像。音频文件转换为图像的过程根据输入数据格式的不同而有所变化。我们可以使用convert_wav2spect.sh(可在第四章,音频/语音/物联网中的语音识别代码文件夹中找到)将 WAV 文件转换为固定大小(503 x 800)的频谱图颜色图像:

#!/bin/bash
#for file in test/*/*.wav
for file in train/*/*.wav
do
    outfile=${file%.*}
          sox "$file" -n spectrogram -r -o ${outfile}.png
done

通常,前面脚本中使用的工具 sox 支持.png格式,如果需要转换图像,可以通过 Windows 或命令提示符批量重命名文件来实现。以下截图展示了用于案例 2 的数据集的层次视图:

数据探索

在对数据应用深度学习算法之前,探索数据集是非常重要的。要进行探索,首先,我们可以将音频信号(.wav)传递给图像转换器wav2image.py(可在第四章,音频/语音/物联网中的语音识别代码目录中找到),以查看频谱图像的效果。这将生成图像,如下所示。以下截图展示了一个on命令的转换图像:

以下截图展示了一个off命令的转换图像。从截图中可以看出,它们的颜色分布不同,这将被深度学习算法利用来进行识别:

我们还可以对数据进行分组探索,为此我们可以在想要探索的数据集上运行image_explorer.py,如下所示:

python image_explorer.py

下面的截图展示了在语音命令数据集中探索谱图像数据的过程。有趣的是,这些图像的颜色与之前展示的单独图像不同。这可能是由于我们用于它们的工具不同。对于组合图像,我们使用了 sox 工具;而对于单独的图像,我们使用了ffmpegf

正如在前面的数据探索截图中所示,谱图像中四种不同语音命令之间的差异并不总是显著。这是音频信号识别中的一个挑战。

下面的截图展示了基于说话者/居住者语音(5 秒)数据集的谱图像数据探索过程的快照:

正如前面的截图所示,每个居住者的短语音谱图像呈现出一种模式,这将有助于对居住者进行分类,并相应地授予访问权限。

数据预处理

数据预处理 是深度学习流水线中的一个关键步骤。语音命令数据集由每个短语音命令的 1 秒.wav文件组成,这些文件只需转换为谱图像。然而,第二使用案例的下载音频文件长度不统一,因此需要进行两步预处理:

  • .mp3转换为统一长度(如 5 秒)的 WAV 文件

  • .wav文件转换为谱图像。

数据集的预处理在数据收集部分有所讨论。在训练图像集准备过程中需要注意以下几个问题:

  • 数据规模:我们需要为每个类别收集至少一百张图像,以便训练一个效果良好的模型。我们收集的图像数量越多,训练模型的准确性就可能越高。在这个使用案例中的每个数据集类别中,有超过 3,000 张样本图像。然而,少样本学习(使用较少样本进行学习)在少于 100 个训练样本时也能发挥良好效果。我们还确保这些图像能够很好地代表我们应用程序在实际实施中可能面临的情况。

  • 数据异质性:用于训练的数据应该是异质的。例如,关于说话者的音频或语音信号应该在尽可能多的情况下采集,包括他们的不同语音状态和使用不同设备的情况。

模型训练

如前所述,我们对两个用例都采用迁移学习,无需从头开始训练;使用新数据集重新训练模型在很多情况下已经足够。另外,在第三章,物联网中的图像识别中,我们发现 Mobilenet V1 是一种轻量级(占用内存少且训练时间较短)的 CNN 架构。因此,我们在实现两个用例时都采用 Mobilenet V1 网络。重要的是,我们将使用 TensorFlow 的retrain.py模块,因为它专门为 CNN(如 Mobilenet V1)基于迁移学习设计。

在重新训练 Mobilenet V1 模型之前,我们需要了解retrain.py的关键参数列表。对于重新训练,如果我们在 Linux 或 macOS 的终端或 Windows 的命令提示符中键入python retrain.py -h,将会看到一个窗口,类似以下截屏,并包含额外的信息(如每个参数的概述):

如前面的截屏所示,强制参数是-–image directory,它需要是一个数据集目录,其中我们希望训练或重新训练模型。对于 Mobilenet V1,我们必须明确提到 CNN 架构,例如--architecture mobilenet_1.0_224。对于其余的参数,包括在训练、验证和测试数据之间的数据分割比例,我们使用了默认值。数据的默认分割是将 80%的图像放入主训练集中,保留 10%作为验证集频繁用于训练,最后 10%的数据用于测试分类器在现实世界中的性能。

下面是运行 Mobilnet V1 模型重新训练的命令:

python retrain.py \
--output_graph=trained_model_mobilenetv1/retrained_graph.pb \
--output_labels=trained_model_mobilenetv1/retrained_labels.txt   \
--architecture mobilenet_1.0_224 \
--image_dir= your dataset directory

一旦我们运行上述命令,它们将在给定目录中生成重新训练模型(retrained_graph.pb)和标签文本(retrained_labels.txt),而摘要目录包含了模型的训练和验证摘要信息。摘要信息(--summaries_dir参数默认值为retrain_logs)可以被 TensorBoard 用来可视化模型的不同方面,包括网络和性能图表。如果我们在终端或命令提示符中输入以下命令,将会运行tensorboard

tensorboard --logdir retrain_logs

一旦 TensorBoard 运行起来,请在浏览器中输入localhost:6006,可以查看 TensorBoard 并浏览相应模型的网络。以下图表展示了所使用的 Mobilnet V1 网络的结构。

评估模型

我们可以从三个不同的角度评估模型:

  • 学习/(重新)训练时间

  • 存储需求

  • 性能(准确性)

使用retrain.py模块进行的 Mobilnet V1 的重新训练和验证过程,在台式机(Intel Xenon CPU E5-1650 v3@3.5GHz 和 32 GB RAM)上,配备 GPU 支持,仅需不到一小时。

模型的存储/内存需求是资源受限的物联网设备中的一个重要考虑因素。为了评估 Mobilenet V1 的存储/内存占用,我们将其存储需求与另外两个类似网络(Incentive V3 和 CIFAR-10 CNN)的存储需求进行了比较。以下截图展示了三个模型的存储需求。如图所示,Mobilenet V1 仅需要 17.1 MB,少于 Incentive V3(87.5 MB)和 CIFAR-10 CNN(91.1 MB)的五分之一。在存储需求方面,Mobilenet V1 是许多资源受限物联网设备(如 Raspberry Pi 和智能手机)的更好选择:

最后,我们对模型的性能进行了评估。两个层次的性能评估已经在不同的用例中完成:

  • 数据集级别的评估或测试在桌面 PC 平台/服务器端的重训练阶段完成

  • 个别音频和一组家庭成员样本在 Raspberry Pi 3 环境中进行测试或评估。所有的评估结果展示在以下图表中。

模型性能(用例 1)

以下截图展示了 Mobilenet V1 在语音命令数据集(自定义为仅包含五个命令,包括onnooffyesstop)上的评估结果。请注意,由于缺乏真实数据集,在用例一中,on被认为是打开灯光

以下截图来自 TensorBoard 日志文件。橙色线表示训练准确度,蓝色线表示 Mobilenet V1 在指令数据集上的验证准确度:

从前面的两张截图中可以看出,Mobilenet V1 的性能并不算很好,但通过增加更多的指令信息,如打开主灯而不仅仅是,就足以用于指令检测。此外,我们可以使用更好的音频文件转图像转换器来提高图像质量和识别准确性。

模型性能(用例 2)

以下截图展示了 Mobilenet V1 在三名成员数据集上的评估结果。可以看出,数据集的性能相当不错,能够成功检测到占用者的概率超过 90%:

以下截图来自 TensorBoard 日志文件。橙色线表示训练准确度,蓝色线表示 Mobilenet V1 在三名成员数据集上的验证准确度:

我们还在一个五名居住者数据集上测试了 Mobilenet V1,并且它在 85-94%的准确率范围内稳定表现。最后,我们可以将训练好的模型详细信息(如retrained_mobilenet_graph.pbretrained_labels.txt)导出到物联网设备,包括智能手机或树莓派,然后使用提供的label_image.py代码或类似的工具,测试模型在新数据上的表现。

摘要

自动音频/语音/声音识别正成为人们与设备交互的流行方式,包括智能手机、可穿戴设备及其他智能设备。机器学习和深度学习算法在基于音频/语音/声音的决策中至关重要。

本章的第一部分,我们简要描述了不同的物联网应用及其基于音频/语音/声音检测的决策过程。我们还简要讨论了物联网中深度学习算法在基于语音/命令的决策中的潜在应用。第一个用例考虑了一个通过语音控制照明来使家庭智能化的物联网应用。第二个用例同样使家庭或办公室智能化,其中基于深度学习的物联网解决方案提供了自动化的智能家居或办公室访问控制。在本章的第二部分,我们简要讨论了这些用例的数据收集过程,并讨论了选择 CNN,特别是 Mobilenet V1 的理由。章中的其余部分描述了这些模型的深度学习管道的所有必要组件及其结果。

许多物联网设备和/或用户是移动的。在他们移动时,为其提供服务的前提是设备和用户的定位。GPS 可以支持户外定位,但在室内环境中无法使用。因此,室内定位需要其他替代技术。目前有多种室内定位技术,包括 WiFi 指纹识别,它们通常基于设备通信信号的分析。在下一章(第五章,物联网中的室内定位)中,我们将讨论并演示如何使用深度学习模型在物联网应用中进行室内定位。

参考文献

  • 辅助技术: www.who.int/en/news-room/fact-sheets/detail/assistive-technology

  • 用于上下文感知车载应用的智能且强健的说话人识别,I Bisio,C Garibotto,A Grattarola,F Lavagetto,A Sciarrone,发表于《IEEE 车辆技术学报》,第 67 卷,第 9 期,第 8808-8821 页,2018 年 9 月。

  • 面向 5G 的情感感知连接健康大数据,M S Hossain 和 G Muhammad,发表于《IEEE 物联网学报》,第 5 卷,第 4 期,第 2399-2406 页,2018 年 8 月。

  • 语音识别的机器学习范式,L Deng,X Li(2013)。《IEEE 音频、语音与语言处理学报》,第 2 卷,第 5 期。

  • 关于深度学习架构在远距离语音识别中的比较,R Sustika,A R Yuliani,E Zaenudin 和 H F Pardede,2017 第二届信息技术、信息系统与电气工程国际会议(ICITISEE),日惹,2017 年,第 17-21 页。

  • 用于语音识别的声学建模的深度神经网络,G Hinton,L Deng,D Yu,G E Dahl,A R Mohamed,N Jaitly,A Senior,V Vanhoucke,P Nguyen,T N Sainath 和 B Kingsbury,《IEEE 信号处理杂志》,卷 29,第 6 期,第 82–97 页,2012 年。

  • 长短期记忆递归神经网络架构用于大规模声学建模,H Sak,A Senior 和 F Beaufays,发表于国际语音通信协会第十五届年会,2014 年。

  • 使用时延神经网络的音素识别,《IEEE 声学、语音与信号处理学报》,G. H. K. S. K. J. L. Alexander Waibel,Toshiyuki Hanazawa,卷 37,第 3 期,1989 年。

  • 用于高效建模长时间上下文的时延神经网络架构,V Peddinti,D Povey 和 S Khudanpur,发表于《Interspeech 论文集》,ISCA,2005 年。

  • 用于大词汇连续语音识别的深度卷积神经网络,B. K. B. R. Tara N Sainath 和 Abdel Rahman Mohamed,发表于国际声学、语音与信号处理会议。IEEE,2013 年,第 8614–8618 页。

  • 用于音乐建模的梅尔频率倒谱系数,Logan,Beth 等,ISMIR,卷 270,2000 年。

  • 发布语音命令数据集,Pete Warden: ai.googleblog.com/2017/08/launching-speech-commands-dataset.html

第五章:物联网中的室内定位

许多物联网应用,如室内导航、零售商的定位营销、智能家居、智能校园和医院,都依赖于室内定位。这些应用生成的输入数据通常来自多个来源,如红外线、超声波、Wi-Fi、RFID、超宽带、蓝牙等。

这些设备和技术的通信指纹,如 Wi-Fi 指纹数据,可以使用深度学习模型进行分析,以预测设备或用户在室内环境中的位置。在本章中,我们将讨论如何将深度学习技术应用于物联网应用中的室内定位,并提供一个实践示例。此外,我们还将讨论一些物联网环境中室内定位服务的部署设置。本章将简要涵盖以下主题:

  • 在物联网应用中引入室内定位

  • 深度学习DL)在物联网应用中的室内定位

  • 示例 – Wi-Fi 指纹定位中的室内定位

  • 基于深度学习的室内定位的不同部署选项

室内定位概述

随着移动互联网的快速发展,基于位置的 服务LBS)在大型公共室内场所变得越来越流行。在这种室内位置中,接收信号强度指示器RSSI)通常作为估算物联网设备从无线接入点WAPs)接收到的功率水平的指标。然而,当与信号源的距离增加时,信号变弱,无线数据速率变慢,导致总体数据吞吐量降低。

室内定位技术

目前已经提出了几种基于不同测量技术的室内定位技术,如超声波、红外线、图像、光、磁场和无线信号。例如,基于蓝牙低能耗BLE)的室内定位因其低成本、低功耗以及几乎所有移动设备上普遍可用,受到了越来越多的关注。另一方面,Wi-Fi 定位系统则基于 Wi-Fi 信号的信道状态信息CSI)。

最近,已经提出了深度学习(DL)方法,其中使用深度学习模型来学习高维 CSI 信号的指纹模式。虽然每次 Wi-Fi 扫描包含了其周围接入点(AP)的信号强度测量,但只观察到环境中总数网络的一个子集。

此外,由于这些设备是低端的,处理能力非常小,因此在这些方法中使用的不可预测的信号增强或减弱组合会影响多路径信号,从而打破 RSSI 与传输距离之间的关系,导致效果较差。另一方面,指纹识别方法并不依赖于距离的恢复,而是仅使用测量到的 RSSI 作为空间模式。因此,它对多路径效应的敏感度较低。

指纹识别

常用的指纹识别方法通常分为两个阶段:离线阶段和在线阶段。

一个阶段使用指纹数据库构建位置依赖的参数,这些参数从测量到的 RSSI 参考位置中提取,称为离线阶段。在定位阶段,也称为在线阶段,RSSI 测量值被映射到参考位置,使用数据库中最相关的 RSSI 指纹来完成,这可以通过以下方式解释:

在前述方程中,表示数据库中参考位置的总数,表示第参考位置的指纹模式,是该参考位置的空间坐标。指纹模式,,可以是来自多个信标站的原始 RSSI 值,或者是从 RSSI 中提取的其他特征向量,可以通过以下方式表示:

然而,原始 RSSI 值在现有的指纹识别系统中被用作空间模式。在前述方程中,m是 BLE 信标站或 Wi-Fi 接入点(AP)的总数,表示第站的测量 RSSI 值。

现在,我们大致了解了什么是室内定位。在下一节中,我们将看到如何使用机器学习和深度学习(DL)算法来开发这样的室内定位系统。

基于深度学习(DL)的物联网室内定位

现在,如果我们想要开发一个深度学习应用并部署低端设备,这些物联网设备将无法处理它们。特别是,处理非常高维度的数据会成为瓶颈。因此,使用像k 近邻(k-NNs)这样的机器学习算法,户外定位问题可以在合理的精度下得到解决,因为移动设备中包含 GPS 传感器,这意味着我们现在手头有更多的数据。

然而,室内定位仍然是一个未解决的研究问题,主要是由于室内环境中 GPS 信号的丧失,尽管有先进的室内定位技术。幸运的是,通过使用深度学习(DL)技术,我们可以以合理的精度解决这个问题,尤其是由于使用自编码器AEs)及其表示能力,可以成为一个很好的替代方案和可行的选择。在这种情况下,我们有两种选择:

  1. 在 AE 网络前添加一个全连接层和一个 softmax 层,这将作为一个端到端的分类器。

  2. 使用其他分类算法,如逻辑回归、k-NN、随机森林或支持向量机进行位置估计(即分类),如下图所示:

这个思路是使用 AEs 进行表示学习,以便网络能够很好地学习特征。然后,编码器部分的输出可以用来初始化分类器部分的权重。在接下来的部分,我们将讨论 k-NN 和 AEs,并看看它们如何用于解决室内定位问题。

K 近邻(k-NN)分类器

k-NN 算法是一种非参数方法,可以使用来自物联网设备的指纹数据进行训练。该方法试图将从网关收集到的 RSSI 值分类到一个参考点而非坐标。输入包括 k 个最接近的 RSSI 值,输出将是一个类的成员资格。然后,输入样本通过其邻居的多数投票进行分类,物体被分配到其 k 个最近邻中最常见的类。

从技术上讲,如果指纹数据库由(X, y)组成——其中X是 RSSI 值,y是已知位置的集合——那么 k-NN 首先计算距离 ,其中x是未知样本。然后,它计算一个集合,,包含来自 的 k 个最小距离的索引。接着,返回 的多数标签,其中 。换句话说,通过使用 k-NN,分类是通过计算观察数据与数据库中训练 RSSI 样本记录的相似度来进行的。最终,在前 k 个最相似记录中出现次数最多的网格单元就是估计的位置,如下图所示:

使用 k-NN 算法进行物联网设备的定位

在前面的图示中,当 k=4 时,Wi-Fi 数据包跟踪被归类为网格 c(绿色三角形)记录,而当 k=6 时,则被归类为网格 a(红色矩形)。因此,k-NN 可以被视为一种懒惰学习方法,在这种方法中,函数仅在局部进行近似,所有计算都推迟到分类发生时。k-NN 算法的优点是它对噪声数据具有鲁棒性。特别地,使用加权距离的反平方作为距离度量。尽管如此,如果它已经在大量训练数据上进行了训练,它仍然表现良好。

也存在一些潜在的缺点。例如,我们需要确定 K 参数值,即最近邻居的数量。它在使用不同的距离度量时表现差异较大。使用 k-NN 算法的计算成本较高,因为需要计算训练数据中每个样本的距离。在数据维度非常高的情况下,这一问题尤为严重。在下一节中,我们将使用 k-NN 作为端到端分类器,而不是使用神经网络设置,提供基于 AE 的分类器与 k-NN 分类器之间的比较分析。

AE 分类器

如 第二章《物联网深度学习架构》所述,AEs 是一种特殊类型的神经网络,它们能够从输入数据中自动学习。AEs 由两个部分组成:编码器和解码器。编码器将输入压缩为潜在空间表示。然后,解码器部分尝试从该表示中重建原始输入数据:

  • 编码器:使用一种称为 的函数,将输入编码或压缩为潜在空间表示。

  • 解码器:使用一种称为 的函数,从潜在空间表示中解码或重建输入。

因此,AE 可以通过 的函数来描述,其中我们希望 0 尽可能接近原始输入 x。AEs 在数据去噪和降维数据可视化方面非常有用。AEs 比 PCA 更有效地学习数据投影,称为 表示。下图展示了一个去噪 AE 的架构:

因此,一旦我们手头有了指纹数据库,AEs 就可以通过原始的 RSSI 测量值进行训练,训练好的网络本身则用作特定参考位置的指纹模式。由于深度网络可以通过每层的权重表示,因此指纹模式可以表达为以下形式:

在上述公式中,l 是 AE(自编码器)的隐藏层编码层的数量, 表示编码隐藏层及其解码镜像层的权重,如下图所示:

然后,我们可以将 AE 中央隐藏层的输出作为全连接 Softmax 层的输入,以预测位置,如上图所示。现在我们已经知道神经网络或机器学习环境下的室内定位工作原理,接下来可以开始使用 Wi-Fi 指纹的实际示例。

示例 – 使用 Wi-Fi 指纹进行室内定位

在这个示例中,我们将使用多建筑、多楼层的室内定位数据库和堆叠的 AE 来进行 Wi-Fi 指纹定位。只需进行一些最小的努力,这个应用可以部署到移动机器人上,使用 Wi-Fi 定位子系统。

描述数据集

UJIIndoorLoc 数据集是一个多建筑、多楼层的室内定位数据库,旨在测试基于 Wi-Fi 指纹的室内定位系统。自动用户定位包括估算用户的位置信息,如经度、纬度和海拔,这些信息通过手机收集。UJIIndoorLoc数据库覆盖了 Jaume I 大学的三栋建筑,楼层数为 4 层或以上,总面积接近 110,000 平方米,数据收集于 2013 年,涉及 20 多位用户和 25 台 Android 设备。该数据库包含两个 CSV 文件:

  • trainingData.csv:19,937 条训练/参考记录

  • validationData.csv:1,111 条验证/测试记录

529 个属性包含 Wi-Fi 指纹及其采集的坐标。每个 Wi-Fi 指纹可以通过检测到的 WAP 和相应的 RSSI 来描述。强度值以负整数形式表示,范围从-104 dBm(非常差的信号)到 0 dBm。正值 100 表示 WAP 未被检测到。在数据库创建过程中,检测到了 520 个不同的 WAP。因此,Wi-Fi 指纹由 520 个强度值组成。坐标的纬度、经度、楼层和BuildingID信息是需要预测的属性。以下是数据集的快速总结:

  • 属性 001 到 520(即 WAP001 到 WAP520):这些是接入点的强度测量值,取值范围为-104 到 0 和+100。100 表示未检测到 WAP001。

  • 属性 521(经度):负实数值,从 7,695,938,754,929,900 到-7299.786516730871000

  • 属性 522(纬度):正实数值,从 4,864,745.7,450,159,714 到 4,865,017.3,646,842,018。

  • 属性 523(楼层):建筑物内的楼层高度。整数值范围从 0 到 4。

  • 属性 524(建筑 ID):用于识别建筑的 ID,作为从 0 到 2 的分类整数值提供。

  • 属性 525(空间 ID):用于识别空间的内部 ID 号码,例如办公室、走廊或教室。

  • 属性 526(相对位置):相对于空间的相对位置(1—室内,2—室外,门前)。

  • 属性 527(用户 ID):用户标识符。

  • 属性 528(手机 ID):安卓设备标识符(见下文)。

  • 属性 529(时间戳):捕获时间的 UNIX 时间。

网络构建

我们将使用的 AE 分类器将包含一个由编码器和解码器组成的 AE 部分。以下的 AE 架构用于确定 Wi-Fi 所在的楼层和建筑位置。AE 的输入是扫描中检测到的信号强度。然后,每个可见网络的一个值被视为 RSSI 记录。解码器的输出是来自压缩表示的重建输入,如下图所示(来源:使用深度学习的低努力场所识别与 Wi-Fi 指纹,Michał N.等人,arXiv:1611.02049v1):

用于特征空间表示的 AE 架构

分类器部分由两个隐藏层组成;根据问题的复杂性,需要选择神经元的数量。当 AE 的权重进行无监督学习完成后,网络的解码器部分将断开。然后,通常会在编码器输出后放置全连接层,通过将整个网络转化为分类器。在以下图中,预训练的编码器部分连接到全连接的 softmax 层(来源:使用深度学习的低努力场所识别与 Wi-Fi 指纹,Michał N.等人,arXiv:1611.02049v1):

用于基于 Wi-Fi 扫描输入分类建筑及其楼层的 AE 分类器架构

最终的输出层是一个 softmax 层,它输出当前样本属于分析类别的概率。现在,让我们不再拖延,开始实现前述网络。

实现

我们将使用 Keras 来实现这一概念。首先,让我们导入必要的包和库,如下所示:

import pandas as pd
import numpy as np
import tensorflow as tf
from sklearn.preprocessing import scale
from keras.models import Sequential
from keras.layers import Input, Dense, Flatten, Dropout, Embedding, BatchNormalization
from keras.layers.convolutional import Conv1D,MaxPooling1D
from keras.layers import LSTM
from keras.layers.merge import concatenate
from keras.layers import GaussianNoise
from pickle import load
from keras import optimizers
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
from sklearn.metrics import precision_recall_curve
from sklearn.metrics import precision_recall_fscore_support
import pandas_profiling

一旦我们导入了所有必要的包,就可以继续准备训练集和测试集,分别用于训练和评估模型。

探索性分析

使用Python pandas库进行数据探索性分析提供了许多强大的功能——毫无疑问。然而,使用df.describe()df.dtypes,或者使用df.isnull().sum()并分别绘制这些图表总是非常耗时。有时,你甚至无法以一种高级的方式获取所需的信息。实际上,你必须编写额外的代码行将它们转换成可展示的格式。然而,为了让你的工作更轻松,现在你可以开始使用pandas_profiling库(请参阅github.com/pandas-profiling/pandas-profiling)。只需一行代码,就能提供你所需要的信息:

pandas_profiling.ProfileReport(df)

当然,使用pandas_profiling来快速了解你的数据是非常值得的。让我们试试看!首先,我们通过显式传递header=0来读取训练数据,以便能够替换现有的列名:

trainDF = pd.read_csv("trainingData.csv",header = 0)

要获取由于高度相关性而被拒绝的变量列表,可以使用以下命令:

profile = pandas_profiling.ProfileReport(trainDF) 

这将生成一份报告,显示关于数据集的信息:

让我们来看一下报告的前几行。正如我们所看到的,数据中没有任何空值,所有变量都是数值型的,这非常好。然而,有些特征意义较小,因为它们与其他变量高度相关(例如,74 个变量被拒绝),还有一些变量分布非常偏斜,给出了非常宽广的分布。甚至我们的训练数据集也有 637 行重复数据。被拒绝的变量不会对模型的学习产生帮助。因此,这些可以从训练数据中删除(不过这一步是可选的)。这些被拒绝的变量列表可以通过以下get_rejected_variables方法来获取:

rejected_variables = profile.get_rejected_variables(threshold=0.9)

如果你想生成 HTML 报告文件,可以将分析结果保存到一个对象中,并使用to_file函数,如下所示:

profile.to_file(outputfile="Report.html")

这将生成一个包含必要信息的HTML报告。现在我们了解了数据和变量,接下来让我们专注于特征工程步骤,在此过程中我们将准备训练和测试所需的数据。

准备训练集和测试集

首先,我们将数据进行标准化,中心化到均值。然后,我们对每个分量进行单位方差缩放。这将有助于我们的模型更快地收敛:

featureDF = np.asarray(trainDF.iloc[:,0:520]) # First 520 features 
featureDF[featureDF == 100] = -110
featureDF = (featureDF - featureDF.mean()) / featureDF.var()

然后,我们构建真实标签。我们将所有的建筑物 ID 和楼层 ID 转换为字符串:

labelDF = np.asarray(trainDF["BUILDINGID"].map(str) + trainDF["FLOOR"].map(str)) 
labelDF = np.asarray(pd.get_dummies(labelDF))

然后,让我们尝试创建两个变量:train_xtrain_y。这将有助于在训练评估过程中避免混淆:

train_x = featureDF
train_y = labelDF
print(train_x.shape)
print(train_x.shape[1])

现在,与训练集类似,我们也准备好测试集:

testDF = pd.read_csv("validationData.csv",header = 0)
test_featureDF = np.asarray(testDF.iloc[:,0:520])
test_featureDF[test_featureDF == 100] = -110
test_x = (test_featureDF - test_featureDF.mean()) / test_featureDF.var()
test_labelDF = np.asarray(testDF["BUILDINGID"].map(str) + testDF["FLOOR"].map(str))
test_y = np.asarray(pd.get_dummies(test_labelDF))
print(test_x.shape)
print(test_y.shape[1])

一旦我们准备好了训练集和测试集,就可以继续创建一个自编码器(AE)。

创建自编码器(AE)

让我们创建独立的编码器和解码器函数,因为你稍后会使用编码器权重进行分类。首先,我们定义一些参数,比如 epoch 数量和批量大小。此外,我们计算输入数据的形状和构建与训练 AE 所需的类别数:

number_epochs = 100
batch_size = 32
input_size = train_x.shape[1] # 520
num_classes = train_y.shape[1] # 13

然后,我们创建 AE 的编码器部分,它有三个隐藏层:

def encoder():
    model = Sequential()
    model.add(Dense(256, input_dim=input_size, activation='relu', use_bias=True))
    model.add(Dense(128, activation='relu', use_bias=True))
    model.add(Dense(64, activation='relu', use_bias=True))    
    return model

接下来,我们创建 AE 的解码器部分,它有三个隐藏层,接着是 compile() 方法:

def decoder(encoder):   
    encoder.add(Dense(128, input_dim=64, activation='relu', use_bias=True))
    encoder.add(Dense(256, activation='relu', use_bias=True))
    encoder.add(Dense(input_size, activation='relu', use_bias=True))
    encoder.compile(optimizer='adam', loss='mse')
    return encoder 

然后,我们将它们堆叠在一起以构建 AE:

encoderModel = encoder() # Encoder
auto_encoder = decoder(encoderModel) # The autoencoder 
auto_encoder.summary()

让我们看看 AE 的结构和总结:

然后,我们可以使用训练数据训练 AE 100 次,其中 10% 的训练数据将用于验证:

auto_encoder.fit(train_x, train_x, epochs = 100, batch_size = batch_size, 
                 validation_split=0.1, verbose = 1)

由于我们在前面的代码块中设置了 verbose =1,因此在训练过程中,你将看到以下日志:

Train on 17943 samples, validate on 1994 samples
Epoch 1/100
17943/17943 [==============================] - 5s 269us/step - loss: 0.0109 - val_loss: 0.0071
Epoch 2/100
17943/17943 [==============================] - 4s 204us/step - loss: 0.0085 - val_loss: 0.0066
Epoch 3/100
17943/17943 [==============================] - 3s 185us/step - loss: 0.0081 - val_loss: 0.0062
Epoch 4/100
17943/17943 [==============================] - 4s 200us/step - loss: 0.0077 - val_loss: 0.0062
Epoch 98/100
17943/17943 [==============================] - 6s 360us/step - loss: 0.0067 - val_loss: 0.0055
.......
Epoch 99/100
17943/17943 [==============================] - 5s 271us/step - loss: 0.0067 - val_loss: 0.0055
Epoch 100/100
17943/17943 [==============================] - 7s 375us/step - loss: 0.0067 - val_loss: 0.0055

然后,我们将编码器网络的输出作为训练集和测试集的潜在特征:

X_train_re = encoderModel.predict(train_x)
X_test_re = encoderModel.predict(test_x)

创建 AE 分类器

接下来,我们将通过将前三层的训练状态设置为 True 来重新训练 auto_encoder 模型,而不是将它们保持为 False

for layer in auto_encoder.layers[0:3]:
    layer.trainable = True  

或者,我们也可以通过以下方式删除前三层:

for i in range(number_of_layers_to_remove):
    auto_encoder.pop()

然后,我们在前面添加全连接层,BatchNormalization 层紧随其后,接着是第一个密集层。接着,我们添加另一个密集层,再后面是 BatchNormalizationDropout 层。然后,我们放置另一个密集层,接着是 GaussionNoise 层和一个 Dropout 层,最后是 softmax 层:

auto_encoder.add(Dense(128, input_dim=64, activation='relu', use_bias=True)) 
auto_encoder.add(BatchNormalization())                     
auto_encoder.add(Dense(64, activation='relu', kernel_initializer = 'he_normal', use_bias=True)) 
auto_encoder.add(BatchNormalization())
auto_encoder.add(Dropout(0.2))    
auto_encoder.add(Dense(32, activation='relu', kernel_initializer = 'he_normal', use_bias=True))
auto_encoder.add(GaussianNoise(0.1))
auto_encoder.add(Dropout(0.1))  
auto_encoder.add(Dense(num_classes, activation = 'softmax', use_bias=True))

最后,我们得到了完整的 AE 分类器:

full_model = autoEncoderClassifier(auto_encoder)

完整的代码如下:

def autoEncoderClassifier(auto_encoder):
    for layer in auto_encoder.layers[0:3]:
        layer.trainable = True        

    auto_encoder.add(Dense(128, input_dim=64, activation='relu', use_bias=True)) 
    auto_encoder.add(BatchNormalization())                     
    auto_encoder.add(Dense(64, activation='relu', kernel_initializer = 'he_normal', use_bias=True)) 
    auto_encoder.add(BatchNormalization())
    auto_encoder.add(Dropout(0.2))    
    auto_encoder.add(Dense(32, activation='relu', kernel_initializer = 'he_normal', use_bias=True))
    auto_encoder.add(GaussianNoise(0.1))
    auto_encoder.add(Dropout(0.1))  
    auto_encoder.add(Dense(num_classes, activation = 'softmax', use_bias=True))
    return auto_encoder

full_model = autoEncoderClassifier(auto_encoder)

然后,我们在开始训练之前编译模型:

full_model.compile(loss = 'categorical_crossentropy', optimizer = optimizers.adam(lr = 0.001), metrics = ['accuracy'])

现在,我们开始以监督方式微调网络:

history = full_model.fit(X_train_re, train_y, epochs = 50, batch_size = 200, validation_split = 0.2, verbose = 1)

由于我们在前面的代码块中设置了verbose =1,因此在训练过程中,你会看到以下日志:

Train on 15949 samples, validate on 3988 samples
Epoch 1/50
15949/15949 [==============================] - 10s 651us/step - loss: 0.9263 - acc: 0.7086 - val_loss: 1.4313 - val_acc: 0.5747
Epoch 2/50
15949/15949 [==============================] - 5s 289us/step - loss: 0.6103 - acc: 0.7749 - val_loss: 1.2776 - val_acc: 0.5619
Epoch 3/50
15949/15949 [==============================] - 5s 292us/step - loss: 0.5499 - acc: 0.7942 - val_loss: 1.3871 - val_acc: 0.5364
.......
Epoch 49/50
15949/15949 [==============================] - 5s 342us/step - loss: 1.3861 - acc: 0.4662 - val_loss: 1.8799 - val_acc: 0.2706
Epoch 50/50
15949/15949 [==============================] - 5s 308us/step - loss: 1.3735 - acc: 0.4805 - val_loss: 2.1081 - val_acc: 0.2199

现在让我们看看训练损失与验证损失的对比,这将帮助我们理解训练过程。这也将帮助我们判断我们的神经网络是否存在过拟合和欠拟合等问题:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

plt.plot(history.history['acc'])
plt.plot(history.history['val_acc'])
plt.ylabel('Accuracy')
plt.xlabel('Epochs')
plt.legend(['Training loss', 'Validation loss'], loc='upper left')
plt.show()

前面的代码块将绘制训练损失和验证损失:

如前面的图所示,跨越多个 epoch 的训练损失大于验证损失,这是过拟合的表现。我们没有足够的训练样本来很好地训练神经网络。一些样本在数据集中甚至重复,这些样本在网络中实际上变得非常琐碎和冗余。这可能是添加 DropoutGaussian 噪声层没有太大帮助的原因。无论如何,我们也可以保存训练好的模型,以便将来重用,我们将在下一部分讨论这个问题。

保存训练好的模型

现在我们已经完全训练好了 AE 分类器,可以保存它,以便稍后从磁盘恢复:

import os
from pickle import load
from keras.models import load_model
os.environ["PATH"] += os.pathsep + 'C:/Program Files (x86)/Graphviz2.38/bin/'
from keras.utils.vis_utils import plot_model

plot_model(full_model, show_shapes=True, to_file='Localization.png')
# save the model
full_model.save('model.h5')
# load the model
model = load_model('model.h5') 

在下一部分中,我们将对测试集进行评估,我们将在下一个小节中讨论这个问题。

评估模型

现在我们的模型已经完全训练好了,可以在未见过的数据上评估其性能:

results = full_model.evaluate(X_test_re, test_y)
print('Test accuracy: ', results[1])

上述代码行将显示准确度得分,类似如下:

1111/1111 [==============================] - 0s 142us/step
Test accuracy: 0.8874887488748875

然后,让我们计算性能指标:

predicted_classes = full_model.predict(test_x)
pred_y = np.argmax(np.round(predicted_classes),axis=1)
y = np.argmax(np.round(test_y),axis=1)
p, r, f1, s = precision_recall_fscore_support(y, pred_y, average='weighted')
print("Precision: " + str(p*100) + "%")
print("Recall: " + str(r*100) + "%")
print("F1-score: " + str(f1*100) + "%")

上述代码块将显示以下输出,F1-score 大约为 88%:

Precision: 90.29611866225324%
Recall: 88.11881188118812%
F1-score: 88.17976604784566%

此外,我们可以打印分类报告以了解类特定的定位情况:

print(classification_report(y, pred_y))

上述代码行将产生以下输出:

此外,我们将绘制混淆矩阵:

print(confusion_matrix(y, pred_y))

上述代码行将生成以下混淆矩阵:

如前述混淆矩阵所示,我们的 AE 分类器大多数情况下被误判为类别 11,并且将多达 39 个样本预测为属于网格 12。但是,我们仍然取得了非常好的准确率。改进的可能建议如下:

  • 在移除被拒绝的变量后训练网络

  • 在更多的训练轮次上训练网络

  • 使用网格搜索和交叉验证进行超参数调优

  • 向网络中添加更多的层

一旦找到经过更多数据训练的优化模型,并且能够提供稳定、改进的性能,它就可以部署到 IoT 设备上。我们将在下一部分讨论一些可能的部署选项。

部署技术

正如我们之前所讨论的,每次 Wi-Fi 扫描都包含其周围可用 AP 的信号强度测量,但仅会观察到环境中所有网络的一个子集。许多 IoT 设备,如手机或树莓派,处理能力较低。因此,部署这样的深度学习模型将是一项具有挑战性的任务。

许多解决方案提供商和科技公司提供商业化的智能定位服务。利用室内外定位数据中的 Wi-Fi 指纹技术,现如今可以实现设备的精确追踪。在这些公司中,大多数使用 RSSI 指纹定位作为核心技术。在这种情况下,具有不同敏感度的信号或消息(这当然取决于距离)可以被网关接收。如果网络中有 网关,那么从特定的室内或室外位置获取的 RSSI 值将形成该位置的 RSSI 指纹,其中包含 n 个条目,如下所示:

上述图表对应于以下方程:

然而,在有大量网关(>4)的情况下,指纹可能在某个范围内明显独特。一种部署技术是通过训练好的模型在后台提供服务,并作为 Android 或 iOS 移动应用程序提供服务。然后,应用程序监控已部署在室内位置的物联网设备信号,将其作为 RSSI 值插入到 SQLite 数据库中,并根据 RSSI 值准备测试集,向预先训练好的模型发送查询,以获取位置。

下图展示了一个示意架构,概述了该部署所需的所有步骤:

在这种情况下,训练过的模型将作为迁移学习的方式。然而,训练过的模型可以作为一个 web 应用程序,通过 Flask 或 DJango Python 框架来提供服务。然后,来自物联网设备的 RSSI 值和信号可以存储在数据库中,以丰富历史数据。随后,可以通过 Android 或 iOS 应用程序来追踪位置。

总结

在本章中,我们讨论了物联网设备的室内定位工作原理。特别是,我们看到了深度学习技术如何应用于物联网应用中的室内定位,并通过一个实际示例展示了如何使用这些数据。此外,我们还探讨了物联网环境中室内定位服务的一些部署设置。

在第六章《物联网中的生理和心理状态检测》中,我们将讨论基于深度学习的物联网应用中人体生理和心理状态检测技术。结合现实场景,我们将讨论两个基于生理和心理状态检测的物联网应用。

第六章:物联网中的生理和心理状态检测

人体生理和心理状态能够提供关于个人活动和情感的非常有用的信息。这些信息可以应用于多个领域,包括智能家居、智能汽车、娱乐、教育、康复与健康支持、体育和工业制造等,以改进现有服务和/或提供新服务。许多物联网应用都集成了用于人体姿态估计或活动和情感识别的传感器和处理器。然而,基于传感器数据检测活动或情感是一项具有挑战性的任务。近年来,基于深度学习的方法已成为解决这一挑战的流行且有效的方式。

本章介绍了基于深度学习的物联网应用中的人体生理和心理状态检测技术。章节的第一部分将简要描述不同的物联网应用及其基于生理和心理状态检测的决策制定。此外,还将简要讨论两个物联网应用及其在现实场景中的基于生理和心理状态检测的实现。在章节的第二部分,我们将展示这两个物联网应用的基于深度学习的实现。本章将涵盖以下主题:

  • 基于物联网的人体生理和心理状态检测

  • 用例一:基于物联网的远程物理治疗进度监控

  • 基于物联网的远程物理治疗进度监控的实现

  • 用例二:智能教室

  • 智能教室的实现

  • 基于深度学习的人体活动与情感检测在物联网中的应用

  • LSTM 和 CNN 以及转移学习在物联网应用中的人体活动/情感识别(HAR/FER)

  • 数据收集

  • 数据预处理

  • 模型训练

  • 模型评估

基于物联网的人体生理和心理状态检测

近年来,人体生理和心理状态检测已在多个应用领域得到广泛应用,旨在提升现有服务和/或提供新服务。物联网结合深度学习技术可用于检测人体的生理和心理状态。以下图表展示了这些检测方法的一些关键应用:

现在,我们将详细了解这两种状态检测变体:

  • 生理状态检测:生理状态或活动检测在许多应用中都非常有用,包括对脆弱人群(如老年人)的辅助生活,以及远程物理治疗/康复系统。在老年人的辅助生活中,摔倒对受害者的健康有害,因为摔倒伴随的身体伤害风险。摔倒还可能带来经济后果,因其需要医疗费用和住院治疗。此外,摔倒还可能缩短一个人的预期寿命,特别是长时间卧床不起的情况下。值得注意的是,摔倒相关的医疗费用极为昂贵。例如,仅在美国,摔倒的年成本预计到 2020 年将达到 670 亿美元。在此背景下,使用深度学习支持的物联网(IoT)应用进行自动化和远程摔倒检测可以解决这一问题,从而提高老年人的生活质量并减少相关成本。人类活动检测应用的另一个关键领域是远程物理治疗监控系统。这是本章的第一个应用案例,我们将在下一节中概述它。

  • 心理状态检测:面部表情是人类心理状态的良好反映,它们是人类交流中的重要因素,帮助我们理解他人的意图。通常,通过分析他人的面部表情和语音语调,我们可以推测他们的情感状态,如快乐、悲伤和愤怒。非语言交流的形式构成了所有人类互动的三分之二。面部表情作为情感表达的方式,是主要的非语言人际沟通渠道之一。因此,基于面部表情的情感检测可以在理解人们行为方面发挥作用。因此,它可以帮助改进现有服务和/或新服务,包括个性化的客户服务。物联网应用,如智能医疗、智能教育和安全保障,可以通过基于深度学习的情感检测或情绪分析来改善其服务。例如,在智能课堂中,教师可以实时或准实时地分析学生的情感,从而提供个性化或小组导向的教学。这将改善学生的学习体验。

用例一 - 远程物理治疗进展监控

物理治疗是医疗保健中的重要组成部分。物理治疗的需求与我们提供该治疗的能力之间存在巨大的差距。世界上大多数国家仍然严重依赖一对一的患者-治疗师互动(这是黄金标准),但这种方式不可扩展,也不具备成本效益,无论对患者还是医疗提供者而言。此外,大多数现有的治疗及其更新依赖于平均数据,而非个体的独特数据,有时这些数据是定性的(例如,是的,我做了你告诉我做的事情),而非定量的。这是有效治疗面临的一个挑战。最后,许多人,特别是老年人,正面临多重慢性病MCC),这些病症通常是分开治疗的,这可能导致治疗效果不佳,甚至出现病症之间的冲突。例如,对于糖尿病和背痛的患者:糖尿病护理人员可能建议步行,而背痛护理人员则可能禁止此举。在这种情况下,物联网已经在改变医疗保健。它可以借助机器学习/深度学习和数据分析工具解决大多数挑战,通过提供实时或准实时的信息,提供有效的物理治疗。

用例一的实现

进展监测是传统治疗中的一个关键挑战。基于物联网的治疗可以解决这一进展监测问题。下图简要展示了基于物联网的远程物理治疗监控系统如何运作:

该应用的一个关键组成部分是对受试者(患者)活动的监控,帮助治疗师远程观察患者是否遵循建议的治疗方案,并了解其是否取得了进展。如前面的图示所示,基于物联网的远程物理治疗监控系统由四个主要元素组成:

  • 传感器和患者端计算平台:对于这个用例,我们考虑使用两个传感器:加速度计和陀螺仪。它们都可以测量与受试者活动相关的三维数据。对于这些传感器,我们可以使用专用传感器或智能手机内置的传感器(这些传感器通常嵌入在大多数智能手机中)。对于客户端计算平台,我们可以考虑使用树莓派来配合专用传感器,或者使用智能手机(如果我们使用智能手机传感器)。传感器需要正确放置,才能准确测量信号。传感器可以用于受试者活动的连续或事件式监控(如运动期间)。

  • 护理人员和治疗师:护理人员,如拥有医生和医疗/健康数据库的医院,通过云平台/HealthCloud 进行连接。治疗用例的主要护理提供者是治疗师,医院/医生将在需要时为治疗师提供支持。

  • 基于深度学习的人体活动检测:在此阶段,边缘计算设备将安装一个应用程序。安装在智能手机或树莓派上的应用程序将加载一个预训练的人体活动检测与分类模型。一旦加速度计和陀螺仪检测到任何信号,它们将其发送到智能手机或树莓派进行处理,并使用深度学习模型进行检测,最后将结果告知治疗师,以便其根据需要提供反馈或干预。

  • HealthCloud 进行模型学习:HealthCloud 是一个主要为医疗健康相关服务设计的云计算平台。它将使用参考数据集训练选定的深度学习模型,以进行人体活动的检测和分类。训练后的模型将预装在智能手机或树莓派上。

用例二 — 基于物联网的智能教室

全球高等教育的辍学率正在增加。例如,英国大学生的辍学率已经连续第三年上升。辍学的前八个原因中有三个是:

  • 缺乏与教师和辅导员的优质时间

  • 沮丧的学校环境

  • 学生支持不足

解决这些问题的关键挑战之一是了解学生(例如,了解学生是否跟得上某个话题)并据此提供讲座/辅导及其他支持。一种潜在的方法是了解学生的情感,这在大班、计算机实验室或电子学习环境中是非常具有挑战性的。利用技术(包括在深度学习模型支持下的物联网)可以帮助通过面部表情和/或语音识别情感。本章的第二个用例旨在通过检测情感并相应管理讲座/实验室,提升学生在教室中的表现。

用例二的实现

下图展示了基于物联网的智能教室应用的简化实现:

基于面部表情的情感分析实现包含三个主要元素:

  • 传感器和计算平台:对于此用例,我们需要至少一台可以覆盖教室的闭路电视(CCTV)摄像头,并通过无线或墙内隐蔽的电缆连接到计算平台。教室内讲师的电脑可以充当计算平台。该电脑将持续处理视频信号并将其转化为图像,以便进行基于图像的面部表情分析。

  • 基于面部表情的情感检测:讲师的电脑将安装一个应用程序。该应用程序将加载一个预训练的基于面部表情的检测和分类模型。一旦深度学习模型接收到学生的面部图像,它会识别学生的情感(如快乐/不开心/困惑)并通知讲师采取必要的行动。

  • 桌面或服务器用于模型学习: 讲师的电脑将连接到大学服务器或云计算平台,这将用于基于面部表情的情感识别和分类的模型训练/重训,使用参考数据集。这一学习过的模型将预装在讲师的课堂电脑中。

以下各节将描述为实现上述使用案例所需的基于深度学习的人类活动和情感识别。所有必要的代码都可以在本章的代码文件夹中找到。

基于物联网的人类活动与情感检测深度学习

在讨论有用的深度学习模型之前,了解基于加速度计和陀螺仪的人类活动检测系统,以及基于面部表情的情感检测系统的工作原理是非常重要的。

自动人类活动识别系统

自动人类活动识别HAR)系统基于原始的加速度计和陀螺仪信号来检测人类活动。下图展示了一个基于深度学习的 HAR 示意图,该系统包括三个不同的阶段。具体如下:

  • 物联网部署或对受试者或人的仪器化

  • 特征提取和模型开发

  • 活动分类/识别

通常,经典的 HAR 方法主要依赖于启发式的手工特征提取方法,这一过程较为复杂,不太适合资源受限的物联网设备。较新的基于深度学习的 HAR 方法能够自动进行特征提取,并且能够在资源受限的物联网设备上良好工作。大多数 HAR 方法考虑了六种不同的活动,包括走路、跑步、坐着、站立、上楼和下楼。这些活动在加速度计和陀螺仪信号中表现出差异,分类器利用这些差异来识别当前活动——这可能是物理治疗的一部分(例如跑步)。

自动化人类情感识别系统

自动化人类情感识别HER)可以通过使用以下信号/输入之一或其组合来完成:

  • 面部表情

  • 语音/音频

  • 文本

本章讨论基于面部表情识别FER)的 HER。基于深度学习的自动化面部表情识别包括三个主要步骤:预处理、深度特征学习和分类。下图突出显示了基于 FER 的 HER 中的这些主要步骤。

面部表情分析的图像处理需要预处理,因为不同类型的情感(如愤怒、厌恶、恐惧、快乐、悲伤、惊讶和中立)之间有微妙的差异。输入图像中与 FER 无关的变化,包括不同的背景、光照和头部姿势,可以通过预处理去除,从而提高模型预测/分类的准确性。面部对齐、数据增强和图像归一化是一些关键的预处理技术。大多数用于 FER 的开源数据集不足以泛化 FER 方法。数据增强对于改进现有数据集中的 FER 至关重要。面部对齐和图像归一化对于改善单个图像非常有用。FER 深度学习流程的最后阶段是让深度学习算法学习并分类特征,从而识别情感。大多数图像识别深度学习算法,包括 CNN 和 RNN,适用于这一最后阶段:

深度学习模型在 HAR 和情感检测中的应用

通常,人类活动识别系统使用加速度计和陀螺仪信号,这些信号是时间序列数据。有时,识别过程会结合时间序列和空间数据。在这种情况下,循环神经网络RNN)和 LSTM 是处理前者类型信号的潜在候选模型,因为它们能够在演化过程中结合输入的时间特征。另一方面,CNN 对于加速度计和陀螺仪信号的空间特征非常有效。因此,CNN 与 LSTM/RNN 的组合或混合模型对于前者类型的信号是理想选择。我们将使用 LSTM 模型来处理 HAR 用例,因为它能够处理人类活动的时间特征。

与 HAR 系统不同,基于 FER 的人类情感检测系统通常依赖于面部表情图像,这些图像依赖于图像像素值之间的局部或空间相关性。任何能够很好地进行图像识别的深度学习模型都适用于 FER 任务,同样适用于情感检测。许多深度学习算法或模型已经被用于图像识别,其中深度信念网络DBN)和 CNN 是最重要的两个候选模型。在本章中,我们将考虑 CNN,因为它在图像识别中的表现非常出色。

LSTM、CNN 和迁移学习在物联网应用中的 HAR/FER 中的应用

LSTM 是广泛使用的深度学习模型,用于 HAR,包括物联网(IoT)基础的 HAR,因为其记忆能力可以比其他模型(包括 CNN)更好地处理时间序列数据(如 HAR 数据)。LSTM 实现的 HAR 可以支持迁移学习,并且适用于资源受限的物联网设备。通常,FER 依赖于图像处理,而 CNN 是处理图像的最佳模型。因此,我们使用 CNN 模型实现用例二(FER)。在第三章中,物联网中的图像识别,我们概述了两种流行的 CNN 实现(如 Incentive V3 和 Mobilenets)及其相应的迁移学习。在接下来的段落中,我们简要介绍基础 LSTM 的概述。

LSTM 是 RNN 的扩展。许多 LSTM 的变种已被提出,它们遵循基础 LSTM。以下是基础 LSTM 的示意图:

如前图所示,LSTM 主要由两个组件组成。它们具有一个记忆单元或神经元,每个单元或神经元都有一个乘法遗忘门、读取门和写入门。这些门控控制对记忆单元/神经元的访问,并防止它们受到无关输入的干扰。这些门控通过 0/1 或开/关进行控制。例如,如果遗忘门开启/1,神经元/单元将其数据写入自身;如果门关闭/0,神经元将遗忘其上次的内容。其他门控的控制方式类似。

与 RNN 不同,LSTM 使用遗忘门主动控制单元/神经元状态,并确保它们不会退化。重要的是,LSTM 模型在数据具有长期时间依赖性的情况下,比 RNN 模型表现更好。许多物联网应用,如基于环境监测的人体活动识别和灾难预测,都展示了这种长期时间依赖性。

由于用例二的 FER 是基于图像处理的,因此 CNN 是最佳选择。CNN 有不同的实现方式,包括一个简单的 CNN、两个版本的 Mobilenets 和 Incentive3。用例二将探索简单的 CNN 和 Mobilenet V1,用于实现 FER 部分。

数据收集

HAR 和/FER 的数据收集因多种原因而具有挑战性,其中包括隐私问题。因此,开源高质量数据集的数量有限。对于用例一中的 HAR 实现,我们使用了一个非常流行且开源的无线传感器数据挖掘(WISDM)实验室数据集。该数据集包含来自 36 个不同受试者的 54,901 个样本。出于隐私原因,用户名已被 ID 号(1-36)掩盖。数据收集涵盖了受试者进行的六种不同活动:站立、坐着、慢跑、走路、下楼和爬楼。数据集包含三个方向的加速度计数据,每个样本有超过 200 个时间步长。以下截图是数据集的一个样本:

在用例二中基于 FER 的情感检测,我们使用了两个不同的数据集。第一个是流行的开源 FER2013 数据集。该数据集包含 48 x 48 像素的灰度人脸图像。这些图像已经预处理,并且可以直接用于训练和验证。图像可以分为七类(0=愤怒,1=恶心,2=恐惧,3=快乐,4=悲伤,5=惊讶,6=中立)。该数据集采用 CSV 格式,包含面部图像的像素值信息,而不是图像本身。以下截图显示了数据集中的一些值:

训练集与验证集的拆分比例为80:20

我们还通过 Google 搜索准备了一个数据集,特别针对 Mobilenet V1。该数据集不大,包含五个情感类别,每个类别都有超过 100 张图像。这些图像未经预处理。以下图示显示了准备好的数据集文件夹视图:

对于数据收集(每个类别的数据集),我们可以遵循一个四步过程:

  1. 搜索:使用任意浏览器(我们使用了 Chrome),访问 Google 并搜索与类别/情感相关的合适词组(例如愤怒的人类)的 Google 图片。

  2. 图像 URL 收集:此步骤利用几行 JavaScript 代码来收集图像 URL。收集到的 URL 可以在 Python 中用于下载图像。为此,选择 JavaScript 控制台(假设你使用的是 Chrome 浏览器,也可以使用 Firefox),点击 View | Developer | JavaScript console(在 macOS 上),或自定义并控制Google Chrome | 更多工具 | 开发者工具(Windows 操作系统)。一旦选择了 JavaScript 控制台,这将使你能够以 REPL 的方式执行 JavaScript。接下来,按照以下步骤操作:

    1. 向下滚动页面,直到找到与你的查询相关的所有图像。然后,你需要抓取这些图像的 URL。

切换回 JavaScript 控制台,然后将以下 JavaScript 代码片段复制并粘贴到控制台中:

// Get the jquery into the JavaScript console
var script = document.createElement('script');
script.src = "https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js";
document.getElementsByTagName('head')[0].appendChild(script)
    1. 上述代码片段将下载 jQuery JavaScript 库,现在你可以使用 CSS 选择器通过以下代码片段抓取 URL 列表:
// Grab the chosen URLs
var urls = $('.rg_di .rg_meta').map(function() { return JSON.parse($(this).text()).ou; });

    1. 最后,使用以下代码片段将 URL 写入文件(每行一个):
// write the URls to file (one per line)
var textToSave = urls.toArray().join('\n');
var hiddenElement = document.createElement('a');
hiddenElement.href = 'data:attachment/text,' + encodeURI(textToSave);
hiddenElement.target = '_blank';
hiddenElement.download = 'emotion_images_urls.txt';
hiddenElement.click();

执行上述代码片段后,你将在默认下载目录下得到一个名为emotion_images_urls.txt的文件。

  1. 下载图像:现在,你已经准备好下载图像,运行download_images.py(位于章节代码文件夹中),使用之前下载的emotion_images_urls.txt文件:
python download_images.py emotion_images_urls.txt
  1. 探索:一旦我们下载了图像,就需要对图像进行探索,以便删除不相关的图像。我们可以通过手动检查来完成此过程。之后,我们需要调整图像的大小并裁剪以满足要求。

数据探索

在本节中,我们将更详细地检查我们将使用的数据集:

  • HAR 数据集:该数据集是一个文本文件,包含了六种活动中不同受试者的加速度数据。由于仅凭文本文件很难直观感知数据分布,我们可以对数据集进行数据分布检查。以下图表总结了训练集的分布情况:

^()

正如我们从前面的图表中看到的,训练数据集包含比其他四种活动更多的步行和慢跑数据。这对深度学习模型是有利的,因为步行和慢跑属于动态活动,涉及的加速度数据范围可能较广。为了可视化这一点,我们探索了每项活动的 200 个时间步加速度测量数据。以下截图显示了坐着活动的 200 个时间步加速度测量值:

以下截图显示了站立活动的 200 个时间步加速度测量值:

以下截图显示了步行活动的 200 个时间步加速度测量值:

以下截图显示了慢跑活动的 200 个时间步加速度测量值:

从前面的图示可以看出,步行和慢跑活动比其他活动更为活跃,因为它们反映了用户的运动状态。

  • FER 数据集:我们需要将 FER2013 数据集中面部图像的像素值转换为实际图像,以便进行进一步探索。我们可以使用以下代码将像素值转换为图像:
import os
import csv
import argparse
import numpy as np
import scipy.misc
parser = argparse.ArgumentParser()
parser.add_argument('-f', '--file', *required*=True, *help*="path of the csv file")
parser.add_argument('-o', '--output', *required*=True, *help*="path of the output directory")
args = parser.parse_args()
w, h = 48, 48
image = np.zeros((h, w), dtype=np.uint8)
id = 1
with open(args.file) as csvfile:
    datareader = csv.reader(csvfile, delimiter =',')
    next(datareader,None)
    for row in datareader:       
        emotion = row[0]
        pixels = row[1].split()
        usage = row[2]
        pixels_array = np.asarray(pixels, dtype=np.int)
        image = pixels_array.reshape(w, h)
        stacked_image = np.dstack((image,) * 3)
        image_folder = os.path.join(args.output, usage)
        if not os.path.exists(image_folder):
            os.makedirs(image_folder)
        image_file =  os.path.join(image_folder , emotion +'_'+ str(id) +'.jpg')
        scipy.misc.imsave(image_file, stacked_image)
        id+=1
        if id % 100 == 0:
            print('Processed {} images'.format(id))
print("Finished conversion to {} images".format(id))

我们可以使用以下代码执行前面的代码:

python imager_converter.py

一旦我们有了图表,就可以运行以下代码进行图像探索:

python image_explorer.py

这将生成类似以下图像的结果:

如前图所示,FER 数据集经过良好的预处理。另一方面,第二个数据集(我们将其命名为 FER2019)没有进行预处理,包括图像大小,正如以下图像所示:

数据预处理

数据预处理是深度学习流程中的一个关键步骤。HAR 和 FER2013 数据集已经进行了良好的预处理。然而,用例二的第二个数据集的下载图像文件尚未经过预处理。如前图所示,这些图像在大小和像素上不统一,且数据集的大小也不大,因此需要进行数据增强。常见的增强技术包括翻转、旋转、缩放、裁剪、平移和高斯噪声。每个活动都有许多可用的工具。你可以使用这些工具或编写自己的脚本来进行数据增强。一款有用的工具是Augmentor,这是一个用于机器学习的 Python 库。我们可以在 Python 中安装该工具并使用它进行增强。以下代码(data_augmentation.py)是一个简单的数据增强过程,它执行图像的翻转、旋转、裁剪和调整大小:

# Import the module
import Augmentor
da = Augmentor.Pipeline("data_augmentation_test")
# Define the augmentation
da.rotate90(probability=0.5)
da.rotate270(probability=0.5)
da.flip_left_right(probability=0.8)
da.flip_top_bottom(probability=0.3)
da.crop_random(probability=1, percentage_area=0.5)
da.resize(probability=1.0, width=120, height=120)
# Do the augmentation operation: sampling
da.sample(25)

下图展示了两张原始图像及其增强后的样本(25 个样本中的 3 个):

如前图所示,增强后的图像大小一致,已进行翻转和旋转处理。

以下是在准备训练图像集时需要注意的两个关键问题:

  • 数据大小:我们需要收集至少 100 张图像每个类别,以训练一个效果良好的模型。收集的越多,训练后模型的准确度越高。然而,一次性学习(对象分类技术)可以在少于 100 个训练样本的情况下工作。我们还确保图像能够很好地代表我们在实际应用中可能遇到的情况。

  • 数据异质性:用于训练的数据应具有异质性。例如,FER 数据集中的图像应来自不同肤色或相同表情的不同视角。

模型训练

如前所述,我们在用例一中使用 LSTM,在用例二中使用 CNN(简单的 CNN 和 Mobilenet V1)。所有这些深度学习实现都支持迁移学习,适用于两个用例,无需从头开始训练。

用例一

我们考虑使用堆叠 LSTM,它是一个常用于序列预测(包括时间序列问题)的流行深度学习模型。堆叠 LSTM 架构由两层或更多 LSTM 层组成。我们为用例一实现了 HAR,采用了一个两层的堆叠 LSTM 架构。以下图示展示了一个两层的 LSTM,其中第一层向第二层 LSTM 提供一系列输出,而非单一的值输出:

我们可以通过运行 LSTM -HAR.py 代码来训练和测试模型,代码位于 use-case-1 文件夹中(在对你的环境做必要修改后,例如data目录):

python LSTM-HAR.py

用例二

我们使用了两种不同架构的卷积神经网络(CNN)来进行智能教室中的基于 FER 的情感检测。第一种是简单的 CNN 架构。为了在 FER2013 数据集上训练模型,我们需要运行CNN-FER2013.py,该文件可以在本章的use-case-2代码文件夹中找到,或者使用笔记本。要在CNN-FER2013.py的所有默认设置下运行(在对设置做出必要更改后,比如data目录),我们需要在命令提示符下运行以下命令:

python CNN-FER2013.py

在 FER2013 数据集上训练和测试模型可能需要几个小时。下图是通过 TensorBoard 日志文件生成的,展示了用于用例二的网络:

我们可以通过运行以下代码在 FER2019 数据集上重新训练 Mobilenet V1:

python retrain.py \

--output_graph=trained_model_mobilenetv1/retrained_graph.pb \
--output_labels=trained_model_mobilenetv1/retrained_labels.txt   \
--architecture =mobilenet_1.0_224 \
--image_dir= your dataset directory

一旦我们运行前面的命令,它们将生成重新训练的模型(retrained_graph.pb)和标签文本(retrained_labels.txt)到指定目录中。这也会将模型的摘要信息存储在一个目录中。摘要信息(--summaries_dir参数默认值为retrain_logs)可以被 TensorBoard 用于可视化模型的不同方面,包括网络结构和性能图。如果我们在终端或命令窗口中输入以下命令,它将启动 TensorBoard:

tensorboard --logdir retrain_logs

一旦 TensorBoard 启动,可以通过浏览器访问localhost:6006来查看 TensorBoard 和相应模型的网络。下图展示了在实现中使用的 Mobilenet V1 架构的网络:

模型评估

我们可以从三个不同的方面评估模型:

  • 学习/(重新)训练时间

  • 存储需求

  • 性能(准确度)

在训练时间方面,在一台桌面电脑(Intel Xenon CPU E5-1650 v3@3.5 GHz,32 GB RAM)并支持 GPU 的环境下,LSTM 在 HAR 数据集上,CNN 在 FER2013 数据集上,以及 Mobilenet V1 在 FER2019 数据集上的训练/重新训练时间都少于一个小时。

模型的存储需求是资源受限的物联网设备中的一个重要考虑因素。下图展示了我们在两个用例中测试的三种模型的存储需求。如图所示,简单 CNN 只占用 2.6 MB,远小于 Mobilenet V1(17.1 MB)的一六分之一。此外,HAR 用的 LSTM 占用了 1.6 MB(图中未展示)的存储空间。在存储需求方面,所有模型都适合在许多资源受限的物联网设备中部署,包括树莓派或智能手机:

最后,我们评估了模型的性能。可以对用例执行两级性能评估:

  • 数据集级别的评估或测试已经在桌面 PC 平台/服务器端的重新训练阶段完成。

  • 人体活动的单独信号和面部图像情感检测已在树莓派 3 环境中进行测试或评估。

模型性能(用例一)

以下图表展示了 LSTM 模型在 HAR 数据集上的逐步训练和测试准确率。从图中可以看到,训练准确率接近 1.0 或 100%,而测试准确率在.90 或 90%以上。通过这个测试准确率,我们相信 LSTM 模型能够在大多数情况下检测人体活动,包括判断被试是否在进行指定的物理治疗活动:

以下图是该模型在 HAR 测试数据集上的混淆矩阵。从图中可以看到,模型在下楼上楼坐下站立的活动之间产生了混淆,因为这些活动的移动性非常有限或没有移动,意味着没有显著的加速度来区分它们:

模型性能(用例二)

以下截图显示了简单 CNN 模型在 FER2013 数据集上的训练和验证表现。该数据集的准确率并不高(训练准确率为.83,验证准确率为.63),但测试或验证准确率应该能够检测到智能教室中必要且独特的情感(如开心、悲伤和困惑):

以下图是该模型在 FER2013 测试数据集上的混淆矩阵。如预期,模型在所有表情(例如 156 个愤怒表情被误识为悲伤表情)上都表现出混淆。这是深度学习的一个应用,进一步研究仍然需要提升性能:

对于用例二,我们测试了 Mobilenet V1。以下图表展示了模型 Mobilenet V1 在 FER2019 数据集上的整体表现。从图中可以看到,这显示了更好的训练准确率,但验证和测试准确率没有提升。造成这一结果的一个潜在原因可能是数据的大小和质量,因为经过数据增强后,每个样本可能不包含面部表情图像。进一步的预处理,包括人工检查,可能会提高数据质量和模型性能:

为了在单个图像上测试该模型,并转移模型的学习,我们需要执行以下步骤:

  • 将训练好的模型(例如fer2013_trained.hdf5)和label_image.py文件(图像分类器)导出到树莓派(已安装 TensorFlow)/智能手机中。

  • 使用以下命令运行图像分类器(不要忘记更新test_image路径):

python label_image.py

这将生成你测试图像的测试结果。

总结

自动检测人体生理和心理状态正成为一种流行的方式,人们通过这种方式了解一个人的身心状态,从而进行相应的互动和反应。在智能教育、医疗保健和娱乐等领域,许多应用都可以利用这些状态检测技术。机器学习和深度学习算法对这些检测技术至关重要。在本章的第一部分,我们简要介绍了利用人体生理和心理状态检测的不同物联网应用。我们还简要讨论了两个潜在的物联网应用案例,其中深度学习算法可以在人类生理和心理状态检测中发挥作用。第一个应用案例考虑了基于物联网的远程物理治疗进度监控系统。第二个应用案例是基于物联网的智能课堂应用,利用学生的面部表情来了解他们的反馈。在本章的第二部分,我们简要讨论了这些应用案例的数据收集过程,并讨论了选择 LSTM 进行人体活动识别(HAR)和选择卷积神经网络(CNN)进行面部表情识别(FER)的理由。本章的其余部分描述了这些模型的深度学习流程的所有必要组件及其结果。

物联网应用中的一个关键挑战是安全性。许多物联网应用,如无人驾驶汽车、智能医疗和智能电网,都是关键任务应用。安全性是这些以及许多其他物联网应用的核心要素。在下一章中,我们将讨论物联网应用中的安全性,并展示深度学习如何用于物联网安全解决方案。

参考文献

  • K. Rapp, C. Becker, I.D. Cameron, H.H. König 和 G. Büchele, 老年护理机构跌倒流行病学:分析来自巴伐利亚养老院居民的超过 70,000 起跌倒事件, J. Am. Med. Dir. Assoc. 13 (2) (2012) 187.e1–187.e6.

  • 疾病控制与预防中心. 老年人跌倒的成本, 2014. www.cdc.gov/homeandrecreationalsafety/falls/fallcost.html(访问时间:14.04.19)。

  • M. S. Hossain 和 G. Muhammad, 面向 5G 的情感感知连接健康大数据,发表于 IEEE 物联网期刊,第 5 卷,第 4 期,页码 2399-2406,2018 年 8 月。

  • M. A. Razzaque, Muta Tah Hira 和 Mukta Dira. 2017. 体域网中的 QoS:一项调查。ACM Trans. Sen. Netw. 13, 3, 第 25 篇文章(2017 年 8 月),46 页。

  • Nigel Bosch, Sidney K. D'Mello, Ryan S. Baker, Jaclyn Ocumpaugh, Valerie Shute, Matthew Ventura, Lubin Wang 和 Weinan Zhao. 2016. 在计算机辅助课堂中检测学生情绪。载于 第二十五届国际人工智能联合会议论文集(IJCAI'16),Gerhard Brewka(编)。AAAI Press 4125-4129。

  • Isabel Sagenmüller, 学生保持:8 个导致人们辍学的原因, www.u-planner.com/en-us/blog/student-retention-8-reasons-people-drop-out-of-higher-education

  • Nikki Bardsley, 大学生辍学率连续第三年上升, www.fenews.co.uk/featured-article/24449-drop-out-rates-among-university-students-increases-for-third-consecutive-year

  • S. Hochreiter 和 J. Schmidhuber, 长短期记忆, 神经计算, 第 9 卷,第 8 期, 第 1735–1780 页, 1997 年。

  • www.cis.fordham.edu/wisdm/dataset.php

  • I. Goodfellow, D. Erhan, PL Carrier, A. Courville, M. Mirza, B. Hamner, W. Cukierski, Y. Tang, DH Lee, Y. Zhou, C. Ramaiah, F. Feng, R. Li, X. Wang, D. Athanasakis, J. Shawe-Taylor, M. Milakov, J. Park, R. Ionescu, M. Popescu, C. Grozea, J. Bergstra, J. Xie, L. Romaszko, B. Xu, Z. Chuang, 和 Y. Bengio, 表征学习中的挑战:三项机器学习竞赛报告. arXiv 2013 年。

第七章:物联网安全

物联网的使用正在以危险的速度增长,研究人员和行业已经估计,活跃的无线连接设备数量将超过 200 亿。这种物联网设备的指数级增长正在增加对我们生命和财产的风险,也增加了整个 IT 行业的风险。更多连接的设备意味着更多的攻击向量,也给黑客提供了更多的利用机会。在这种背景下,物联网的安全性不仅对其应用至关重要,也对整个 IT 行业至关重要。

在物联网安全解决方案中,网络和设备可以分为基于签名的和基于行为的。与物联网相关的基于行为的解决方案,如异常检测,是更可取的,因为准备和维护动态且未知的物联网攻击签名非常困难。类似于人类行为分析,深度学习DL)/机器学习ML)模型可以在物联网中用于数据探索,以及学习物联网设备和网络在不同应用环境中的正常与异常行为(从安全角度来看)。

本章介绍基于深度学习(DL)技术的物联网网络和设备行为数据分析,以及物联网应用中的安全事件检测技术。在本章的第一部分,我们将简要描述不同的物联网安全攻击及其潜在的检测技术,包括基于深度学习/机器学习(DL/ML)的方法。此外,我们将简要讨论两个物联网用例,其中拒绝服务攻击DoS)和分布式拒绝服务攻击DDoS)等安全攻击可以通过基于深度学习的异常检测智能地和自动地进行检测。在本章的第二部分,我们将展示基于深度学习的安全事件检测实现。以下是本章将涉及的主题:

  • 物联网安全攻击与潜在检测方法

  • 用例一—物联网智能主机入侵检测

  • 物联网智能主机入侵检测的实现

  • 用例二—物联网智能网络入侵检测

  • 物联网智能网络入侵检测的实现

  • 用于物联网安全事件检测的深度学习(DL)

  • 深度神经网络DNN)、自编码器长短期记忆网络LSTM)在物联网安全事件检测中的应用

  • 数据收集

  • 数据预处理

  • 模型训练

  • 模型评估

物联网中的安全攻击与检测

根据统计数据,全球将有超过 260 亿个连接的物联网设备。这些设备包括智能电视、平板电脑、智能手机、笔记本电脑、可穿戴设备、传感器、恒温器等,将使我们的生活更高效、更节能、更舒适、更具成本效益。然而,只有当这些应用的安全性得到保障时,这些才能实现,因为在许多情况下,这些设备涉及的是关键任务应用。

现实情况是,物联网安全目前是物联网行业面临的首要挑战。如果没有合适的安全解决方案,特别是无线联网设备上通过公共互联网传输的数据就容易受到黑客攻击。在这种情况下,整个物联网管道或路径需要保持安全。换句话说,物联网需要端到端E2E)安全,数据必须从终端设备或家电离开时开始得到保护,在它通过云端往返的过程中,直到它到达最终用户的移动应用或基于浏览器的应用程序。此外,一旦在用户设备/应用中处理并做出决策,它还必须遵循一个安全的反向路径,将控制指令传输到设备。以下图展示了物联网解决方案的 E2E(三层)视图及主要三层的安全要求:

以下图展示了从三层视角总结的物联网(IoT)主要攻击方式:

设计和开发物联网安全解决方案是一项非常具有挑战性的任务。例如,这些设备通常被称为“嵌入式”设备,它们具有固定的功能,专门用于执行特定的任务。它们在操作系统、处理能力和内存方面都受到资源限制。传统的 PC 安全解决方案并不适用,因为它们甚至无法在大多数嵌入式设备上运行。重要的是,有大量设备存在漏洞,可能会被攻击者利用。例如,在智能家居中,我们的物联网/智能设备比 PC/笔记本电脑还要多。

很快,我们的家中将配备大量联网设备,其数量可能与中型公司中的连接数相媲美。在这种情况下,仅仅管理这些联网设备的更新、密码和设置,没有 IT 安全团队的支持,也没有任何昂贵的企业级安全工具,将成为一场噩梦。基于人工智能AI)——尤其是深度学习(DL)/机器学习(ML)——的自动化方法可以反应性地和/或主动地发现安全问题并帮助我们进行管理。基于 AI 的解决方案可以采取两种不同的形式:

  • 基于网络的解决方案:基于网络的解决方案旨在通过在应用的网络周围建立保护屏障来保护物联网设备免受攻击。这种方法维护一个允许访问物联网应用网络的设备白名单,以防止入侵者进入网络。然而,物联网设备需要访问并从外部世界访问,例如从云端或智能手机应用程序。深度学习/机器学习引擎可以监控物联网设备的进出流量,并创建一个定义物联网应用正常行为的配置文件。该引擎将通过与已建立的正常行为进行比较,检测任何即将到来的威胁。与企业网络不同,基于 AI 的威胁检测在物联网中更为简单,因为通常物联网设备的功能非常有限,且很难在恶意请求中伪装物联网设备。此外,定义一个有限的规则集来确定物联网设备的正常行为和异常行为也更为容易。例如,在智能家居中,一个智能灯泡与智能冰箱进行通信并非正常行为,并且很容易检测到,因为灯泡是用来照明的,不需要与冰箱进行通信来产生光。

  • 基于设备的解决方案:通常,物联网设备在处理能力和存储容量方面是受限的。因此,基于签名的安全解决方案不适合物联网设备,因为它们需要存储大量的威胁和恶意软件签名数据库。与基于网络的解决方案类似,支持深度学习/机器学习的自动化行为检测解决方案是更好的替代方案,因为它们对资源的需求较少。此外,这些解决方案可以在不拖慢小型处理器的情况下运行。

尽管许多人更倾向于使用基于网络的解决方案而非基于设备的解决方案,但我们的建议是同时选择两者,因为它们能够为您的物联网设备以及整个网络提供更强的保护。

异常检测与物联网安全

网络和设备级行为异常检测是发现潜在安全事件的重要手段,包括 DoS 或 DDoS 攻击,或任何一般性的入侵。异常检测机制可以划分为多个子类:

  • 统计方法:这些方法使用过去的行为来近似传感器或设备的正常行为模型。如果事物或网络观察到新的行为,会将其与模型进行比较,并且如果在统计上不兼容,则标记为异常。

  • 概率方法:这些方法围绕概率模型的定义(参数化或非参数化)展开。如果设备或网络中的某个事件发生的概率低于预定义的阈值,则该事件被标记为异常事件。

  • 基于接近度的方法:这些方法基于正常行为与异常行为之间的距离。聚类方法也属于这一类。

  • 基于预测的方法:这些方法利用过去的网络/设备行为数据来训练一个模型,该模型可以预测任何进出流量的行为并识别异常。这是我们在两个用例中将使用的方法。第一个是主机级别或设备级别的入侵检测异常检测,第二个是网络级别的入侵检测。

DoS 和 DDoS 入侵事件在物联网应用中非常常见。物联网设备可能成为这些攻击的目标,或者物联网设备可能被攻击者利用,生成洪水流量以发起和运行 DDoS 攻击。这些攻击可以在物联网协议栈的不同层次上发起,包括网络层、传输层和应用层。通常,在应用层发起的 DDoS 攻击检测非常具有挑战性,因为请求包看起来与正常的请求包相似。由于这种攻击,我们可能会观察到在资源消耗方面的明显行为,例如网络带宽、CPU 处理和内存。例如,2016 年 9 月,由 Mirai 恶意软件劫持的物联网设备群体向法国某网站主机发起了约 1 Tbps 的 DDoS 流量攻击^([3])。在这种背景下,检测主机/物联网设备级别的入侵以及物联网网络级别的入侵非常关键,以确保物联网应用能够按预期使用并/或不成为对他人发起 DDoS 攻击的工具。在接下来的部分,我们将展示一个关于物联网设备级别入侵检测的用例,以及一个关于物联网网络级别入侵检测的用例。

用例一:物联网中的智能主机入侵检测

很多时候,资源受限的物联网设备成为攻击者的目标,攻击者可以发起 DoS 或 DDoS 攻击,导致物联网应用无法提供给消费者。例如,考虑一个基于物联网的远程病人监护系统。如果在关键时刻(如心脏病发作期间)病人的传感器数据无法传输给医生或医院,病人可能会因此失去生命。在这种背景下,设备或主机级别的入侵检测对大多数物联网应用至关重要。在用例一中,我们将考虑物联网设备或主机级别的入侵检测。

在使用预测方法(包括深度学习)检测物联网设备和网络中的异常(例如 DoS 和 DDoS)时,选择一个好的特征或特征集至关重要。通常,我们需要时间序列数据进行实时或在线异常检测,如果可以利用任何已经是这种形式的数据源,就不需要额外的特征工程。物联网设备的 CPU 利用率数据无需进一步工程化即可进行主机/设备级别的异常检测。

用例一的实现

我们正在考虑一个基于 IoT 的远程病人监测应用,用于实现智能主机级入侵检测。物理治疗的监测是一项具有挑战性的任务。基于 IoT 的治疗可以解决进度监测的问题。下图简要展示了基于 IoT 的远程病人监测系统及其设备级入侵检测的工作原理:

如前图所示,基于 IoT 的远程病人监测系统由三个主要元素组成:

  • 传感器和病人端计算平台:病人将连接多个传感器,包括心电图仪、血压传感器、加速度计和陀螺仪。这些传感器将收集生理和活动相关的信息,并将其发送给护理提供者,以便进行必要的实时反馈。然而,这些传感器或设备的数据可能会因 DoS 或 DDoS 攻击而无法获取。攻击者可以通过向这些传感器发送过多请求,发起 DoS 攻击,试图使其过载,从而阻止合法请求的处理。类似地,攻击者也可以通过来自多个分布式源的请求发起 DDoS 攻击。连接到家庭网络的树莓派 3 可以作为病人端计算平台和传感器级入侵检测器。

  • 基于 DL 的入侵检测:树莓派 3 将预安装一个基于 DL 的异常检测器,该检测器将分析传感器和 CPU 的使用情况,以检测是否有潜在的入侵行为。如果传感器没有任何 MCU,我们将考虑对树莓派 3 进行入侵检测。该检测器将持续监控树莓派 3 的 CPU 使用率,如果发现异常,将报告给管理团队以采取对策。

  • Healthcloud 模型学习:Healthcloud 是一个云计算平台,主要用于医疗相关服务。它将使用参考数据集训练选定的 DL 模型,用于异常检测。

在本章的第二部分(即从DL 用于 IoT 安全事件检测开始的章节),我们将描述基于 DL 的异常检测在前述用例中的实现。所有必要的代码都可以在本章的代码文件夹中找到。

用例二:基于流量的 IoT 智能网络入侵检测

通常,主机入侵(包括设备级入侵)利用外部世界的通信,大多数时候,一次成功的主机入侵伴随着网络入侵的成功。例如,在僵尸网络中,远程指挥与控制服务器通过与被攻陷的机器通信,给出执行操作的指令。更重要的是,大量不安全的物联网设备导致了全球 IT 基础设施中物联网僵尸网络攻击的激增。2016 年 10 月的 Dyn域名系统DNS)攻击就是一个例子,在该事件中,Mirai 僵尸网络指挥了 100,000 台物联网设备发起 DDoS 攻击。此事件影响了许多热门网站,包括 GitHub、Amazon、Netflix、Twitter、CNN 和 PayPal。在这种背景下,检测物联网中的网络级入侵不仅对物联网应用程序至关重要,而且对其他 IT 行业同样重要。

通常,网络入侵检测器通过检查在网络中主机之间传输的流量来识别入侵者。与主机入侵检测类似,网络入侵检测可以基于签名或基于异常检测。在基于签名的方法中,所有传入的流量将与已知的恶意流量签名列表进行比较;而在基于异常检测的方法中,它将传入的流量与先前建立的正常行为进行比较。考虑到前者方法对资源的高需求,我们将考虑基于异常检测的入侵检测系统IDS)。

用例二的实现

与传统网络不同,物联网中的入侵检测系统(IDS)需要轻量级、分布式于不同层次,并且具有长久性。第一个条件对于资源受限的物联网设备来说显而易见。解决方案需要分布在多个层次,以优化检测过程的效果。更重要的是,解决方案需要适用于长期使用的物联网设备。例如,一个智能冰箱可能会在一个家庭中使用超过 10 年,找到一个能够经得起如此长时间考验的安全解决方案是一项困难的任务。

以下图展示了一个物联网基础设施,包括一个多层网络 IDS,它可以解决物联网中 IDS 的前两个要求。例如,物联网部署由不同的、分布式的、资源受限的组件组成。一个系统范围的整体 IDS 在实时响应方面可能不太适用。在这种情况下,多层 IDS 中的每一层都会实时或准实时地识别该层特有的异常以及相应的入侵者:

物联网的多层网络 IDS(特别是在智能家居应用中)由以下三个主要元素组成:

  • 传感器/物联网设备与边缘计算平台:智能家居设备,如智能电视、智能冰箱、恒温器、智能灯泡和家庭物理安全摄像头,是该应用场景中的传感器或“物品”。这些设备通过家用路由器/网关连接到互联网。在这个应用场景中,我们考虑的是基于网络的安全解决方案,而非基于设备的解决方案。我们还假设家用路由器将作为边缘计算设备,允许我们安装多层入侵检测系统(IDS)。

  • 基于 DL 的入侵检测:家用路由器/网关将预装三个(每层一个)基于 DL 的异常检测器,这些检测器将分析来自家庭中连接设备的流量/数据包。每个检测器将与该层的正常流量进行比较,寻找任何异常或入侵,一旦检测到,将报告给家庭用户和/或自动设置对策。

  • 模型学习平台:学习和更新用于异常检测的 DL 模型需要一个家用桌面或云平台。这个平台将使用三个参考数据集训练选择的 DL 模型/模型进行异常检测。

以下各节将描述基于 DL 的网络级和节点级异常检测在上述应用场景中的实现。所有必要的代码都可以在本章的代码文件夹中找到。

DL 在物联网安全事件检测中的应用

传统的安全解决方案(如加密、身份验证、访问控制和网络安全)对于物联网设备来说并不奏效。近年来,基于 DL/ML 的解决方案已成为传统解决方案的热门替代品。基于 DL/ML 的解决方案可以智能地监控物联网设备及其网络,并检测各种新的或零日攻击。重要的是,DL/ML 可以通过异常检测来检测和/或预测各种设备和网络级安全事件。通过收集、处理和分析设备/物品及其网络的正常与异常活动数据,这些 DL/ML 方法能够识别各种安全事件,包括物联网设备和网络级入侵。在以下各节中,我们将简要介绍几种在物联网设备和网络级入侵检测系统(IDS)中有用的 DL 模型。

DNN、自编码器和 LSTM 在物联网安全事件检测中的应用

许多深度学习模型,包括简单的 DNN、自编码器和递归神经网络(RNNs)^([6]),已经用于物联网安全增强。这些方法可以是监督的或无监督的。在本章中,我们将使用监督和无监督方法。对于第一个用例,我们将使用基于 LSTM 的监督方法来进行设备级入侵检测。在第二个用例中,我们将分别使用 DNN 和自编码器进行监督和无监督的网络级入侵检测。我们在第一个用例中使用 LSTM,因为设备级入侵检测基于时间序列 CPU 利用率数据,而 LSTM 在处理时间数据时表现良好。另一方面,自编码器是一种轻量级模型,非常适合资源受限的物联网设备。我们已经在前一章节中简要介绍了 LSTM,因此在下图中,我们简要介绍了自编码器作为模型回顾。

正如其名称所示,自编码器是编码和解码算法。下图展示了自编码器模型的简单架构:

如前图所示,自编码器由一个输入层和一个输出层组成,通过一个或多个隐藏层连接 [7]。由于自编码器复制输入,它们具有相同数量的输入和输出神经元。通常,自编码器由两个组件组成:编码器和解码器。编码器连接输入层,一旦接收到输入(X),它将其转换为新的压缩表示(Z)。压缩码也称为编码或潜变量(Z)。在输出层,解码器接收生成的代码或压缩代码,并将其转换为原始输入的重建。自编码器训练过程的目标是在输出层中最小化重建错误。

自动编码器由于其在输出层的输入重构,适用于诊断和故障检测。特别是,自动编码器的这一特殊功能在物联网中非常有用,包括工业物联网IIoT),用于硬件设备和机器的故障诊断,以及操作/数据收集/性能中的异常检测。自动编码器的异常检测能力激励我们在网络入侵检测的用例中使用该模型。此外,一旦自动编码器在云或服务器中可用,它们可以轻松地在各种 IoT 设备和网络之间迁移。可用的自动编码器类型包括去噪、收缩、堆叠、稀疏和变分自动编码器。在本用例中,我们将使用一个简单的自动编码器架构,并为入侵检测使用独立的深度学习模型,但自动编码器也可以与其他深度学习模型集成,包括卷积神经网络CNNs)和 LSTMs。在接下来的部分中,我们将从数据收集开始,讨论基于深度学习的上述用例实现。

数据收集

对于这两个用例,我们可以生成自己的数据集并在其上训练和测试模型。接下来的段落中,我们简要介绍如何通过 DoS 攻击为设备级主机入侵检测创建数据集。

CPU 使用率数据

对于 DoS 攻击,我们需要一台攻击机器和一台目标机器。我们使用 Kali Linux 机器作为攻击者,Windows 机器作为目标(可以是家庭网关/Raspberry Pi 3/传感器)。在 Kali Linux 中,可以通过多种方式实现 DoS 攻击。一种方式是使用hping3. hping3命令作为网络工具,发送自定义 TCP/IP 数据包,用于测试防火墙、端口扫描、地址伪造等。

这可以通过快速连续发送多个请求来执行 DoS 攻击,耗尽 IoT 服务器/传感器的资源,使其变慢或无法响应。以下截图显示了发送hping3命令或发起 DoS 攻击之前,目标 Windows 服务器的 CPU 使用率:

以下命令是使用 Kali Linux 的hping3工具进行 DoS 攻击的示例。

hping3 -c 10000 -d 120 -S -w 64 -p 21 --flood --rand-source example.com

以下列表是前述命令的语法说明:

  • hping3: 二进制应用程序的名称

  • -c 100000: 数据包数量

  • -d 120: 每个数据包的大小

  • -S: 仅 SYN 数据包

  • -w 64: TCP 窗口大小

  • -p 21: 目标端口

  • --flood: 表示以最快的速度发送数据包,而不关心是否显示接收到的回复

  • --rand-source: 使用随机源 IP 地址;你也可以使用-a–spoof来隐藏主机名

  • example.com: 网站或目标 IP 地址,或者目标机器的 IP 地址

以下截图展示了 DoS 攻击后 Windows 服务器的 CPU 利用率。我们可以清晰地看到,被攻击的机器 CPU 利用率增加了 30%:

我们可以对不同目标机器运行多个 hping3 会话,并保存 CPU 利用率数据。在 Windows 系统中,可以使用进程监控工具来保存数据。对于用例一,我们使用基于 LSTM(长短期记忆网络)的入侵检测算法所需的 CPU 利用率数据。

KDD Cup 1999 IDS 数据集

基于流量的物联网智能网络入侵检测,我们可以使用 Wireshark 网络监控工具来记录并保存不同攻击类型下的网络流量,从而创建我们自己的数据集。此外,我们还可以使用现有的开源数据集。我们正在使用 KDD Cup 1999 IDS 数据集。该数据集非常适合用例二,因为它涉及的是网络级入侵检测。在接下来的段落中,我们将简要介绍该数据集的概况。更多细节请参考相关资料。

KDD Cup 1999 数据集由 国防高级研究计划局 (DARPA) 在模拟空军模型上生成。数据集是通过两次不同的会话收集的:

  • 训练数据收集时间为 7 周

  • 测试数据收集时间为 2 周

完整数据集包括 39 种网络级攻击类型和 200 个背景流量实例。网络流量数据集被分类为某一攻击类型或“正常”。KDD Cup 1999 IDS 数据集有三个版本——完整的 KDD 数据集、修正的 KDD 数据集以及 10% KDD 数据集。10% KDD 数据集是这三个数据集中使用最频繁的,我们将在用例二中使用该数据集。在用例二中,我们将使用自编码器对正常流量和攻击或入侵流量进行聚类。此外,我们还将测试一个 DNN(深度神经网络)对正常流量和攻击流量进行分类。

数据探索

在接下来的段落中,我们将探讨用于两个用例的两个数据集(物联网设备级的 CPU 利用率数据集,以及用于网络级入侵检测的 KDD Cup 1999 IDS 数据集)。

  • CPU 利用率数据集:该数据集是一个 CSV 文件,包含日期和时间以及相应的 CPU 利用率(%)。数据集包含了每分钟记录的 700 个利用率值。以下截图展示了数据集的一个快照:

  • KDD Cup 1999 IDS 数据集:以下截图展示了 KDD Cup 1999 IDS 数据集的一个快照。从截图中可以明显看出,数据集尚未准备好用于模型。数据集包含协议类型、分类值,且数据值未进行标准化。此外,我们还需要将数据集划分为三个子集,以便实现一个三层网络级入侵检测系统(IDS)。

以下截图展示了正常通信的网络流量模式:

以下截图展示了异常或攻击(例如由 smurf-it 发起的网络级分布式 DoS 攻击)通信的网络流量模式:

数据预处理

数据预处理是深度学习流程中的一个重要步骤。CPU 利用率数据集已准备好用于训练,但 KDD Cup 1999 IDS 数据集需要多级预处理,包括以下三个步骤:

  1. 将数据分为三个不同的协议集(应用层、传输层和网络层)

  2. 重复数据删除、类别数据转换和归一化

  3. 特征选择(可选)

使用以下代码行是将数据集拆分为三个数据集的一个潜在方法,即Final_App_LayerFinal_Transport_LayerFinal_Network_Layer

#Importing all the required Libraries
import pandas as pd
IDSdata = pd.read_csv("kddcup.data_10_percent.csv",header = None,engine = 'python',sep=",")

# Add column header
IDSdata.columns = ["duration","protocol_type","service","flag","src_bytes","dst_bytes","land","wrong_fragement","urgent",               "hot","num_failed_logins","logged_in","num_compressed","root_shell","su_attempted","num_root","num_file_creations", "num_shells","num_access_files","num_outbound_cmds","is_hot_login","is_guest_login","count","srv_count","serror_rate","srv_serror_rate","rerror_rate","srv_rerror_rate","same_srv_rate","diff_srv_rate","srv_diff_host_rate","dst_host_count","dst_host_srv_count","dst_host_same_srv_rate","dst_host_diff_srv_rate","dst_host_same_src_port_rate","dst_host_srv_diff_host_rate","dst_host_serror_rate","dst_host_srv_serror_rate","dst_host_rerror_rate","dst_host_srv_rerror_rate","labels"]

# Explore the Application Layer IDS Data
ApplicationLayer = IDSdata[(IDSdata['labels'].isin(['normal.','smurf.','back.','satan.','pod.','guess_passwd.','buffer_overflow.','warezmaster.','imap.','loadmodule.','ftp_write.','multihop.','perl.']))]
print (ApplicationLayer['labels'].value_counts())

# Save a Applayer data only into a text file
ApplicationLayer.to_csv('Final_App_Layer.txt',header = None,index = False)

# Explore the Transport Layer IDS Data
TransportLayer = IDSdata[(IDSdata['labels'].isin(['normal.','neptune.','portsweep.','teardrop.','buffer_overflow.','land.','nmap.']))]
print (TransportLayer['labels'].value_counts())
TransportLayer.to_csv('Final_Transport_Layer.txt',header = None,index = False)

# Explore the Network Layer IDS Data
NetworkLayer = IDSdata[(IDSdata['labels'].isin(['normal.','smurf.','ipsweep.','pod.','buffer_overflow.']))]
print (NetworkLayer['labels'].value_counts())
NetworkLayer.to_csv('Final_Network_Layer.txt',header = None,index = False)

一旦数据集准备好,我们就删除重复的数据条目并归一化其余条目的值。可以使用以下代码行或函数进行重复数据删除和归一化:

def DataPreprocessing(IDSdataframe):
 # Duplicate entry removal
    recordcount = len(IDSdataframe)
    print ("Original number of records in the training dataset before removing duplicates is: " , recordcount)
    IDSdataframe.drop_duplicates(subset=None, inplace=True)  # Python command to drop duplicates
    newrecordcount = len(IDSdataframe)
    print ("Number of records in the training dataset after removing the duplicates is :", newrecordcount,"\n")

    #Dropping the labels to a different dataset which is used to train the recurrent neural network classifier
    df_X = IDSdataframe.drop(IDSdataframe.columns[41],axis=1,inplace = False)
    df_Y = IDSdataframe.drop(IDSdataframe.columns[0:41],axis=1, inplace = False)

    # Categorial data to numerical data conversion
    df_X[df_X.columns[1:4]] = df_X[df_X.columns[1:4]].stack().rank(method='dense').unstack()

    # Coding the normal as " 1 0" and attack as "0 1"
    df_Y[df_Y[41]!='normal.'] = 0
    df_Y[df_Y[41]=='normal.'] = 1

    #converting input data into float
    df_X = df_X.loc[:,df_X.columns[0:41]].astype(float)

    # Normal is "1 0" and the attack is "0 1"
    df_Y.columns = ["y1"]
    df_Y.loc[:,('y2')] = df_Y['y1'] ==0
    df_Y.loc[:,('y2')] = df_Y['y2'].astype(int)
    return df_X,df_Y

数据集的最终预处理是为分类器选择最优的特征集。这个过程是可选的,但对于资源受限的物联网设备很有用,因为这将最小化网络输入层或神经元的大小。可以使用以下代码行或利用随机森林的函数进行该预处理:

def FeatureSelection(myinputX, myinputY):
    labels = np.array(myinputY).astype(int)
    inputX = np.array(myinputX)

    #Random Forest Model
    model = RandomForestClassifier(random_state = 0)
    model.fit(inputX,labels)
    importances = model.feature_importances

    #Plotting the Features agains their importance scores
    indices = np.argsort(importances)[::-1]
    std = np.std([tree.feature_importances_ for tree in model.estimators_],
axis=0)            
    plt.figure(figsize = (10,5))
    plt.title("Feature importances (y-axis) vs Features IDs(x-axis)")
    plt.bar(range(inputX.shape[1]), importances[indices],
       color="g", yerr=std[indices], align="center")
    plt.xticks(range(inputX.shape[1]), indices)
    plt.xlim([-1, inputX.shape[1]])
    plt.show()

    # Selecting top featueres which have higher importance values
    newX = myinputX.iloc[:,model.feature_importances_.argsort()[::-1][:10]]

   # Converting the dataframe into tensors
    myX = newX.as_matrix()
    myY = labels
    return myX,myY

以下两张图分别突出显示了应用层和网络层数据集的 41 个特征。特征按重要性排序,从图中可以明显看出,不同层数据集的重要特征集是不同的。我们用 8-12 个特征和 41 个特征对深度学习模型进行了测试:

以下图表突出显示了网络层数据集的 41 个特征:

模型训练

如我们在本章前面提到的,我们在用例一中使用 LSTM,在多层 IDS 数据集上使用自编码器,在整个 IDS 数据集上使用 DNN。在接下来的小节中,我们将展示这两个用例的深度学习模型训练过程。

用例一

我们考虑了一个三层 LSTM 网络架构用于基于 CPU 利用率的主机/设备级入侵检测。下图展示了我们使用的 LSTM 架构:

我们可以通过运行lstm_anomaly_detection.py文件(可在本章的代码文件夹中找到)来训练和测试模型,方法如下:

python lstm_anomaly_detection.py 

用例二

我们使用自编码器进行多层 IDS 实现,使用的是 KDD Cup 1999 IDS 数据集,并且已经在这三个数据集上进行了训练和测试。为了在每个层的数据集上训练模型,我们需要运行IDS_AutoEncoder_KDD.py文件(可在本章的代码文件夹中找到),方法如下:

python IDS_AutoEncoder_KDD.py

我们还在整体 KDD Cup 1999 IDS 数据集上训练并测试了一个 DNN 模型。为此,我们需要运行 DNN-KDD-Overall.py 文件(位于本章的代码文件夹中),方法如下:

python DNN-KDD-Overall.py

对于所有模型,我们都保存了最佳的模型,以便在 IoT 设备中导入和使用。同时,我们使用 TensorBoard 保存了模型日志,以可视化模型的不同方面,包括网络和性能图表。我们可以通过运行以下命令生成性能图表和网络:

tensorboard --logdir logs

一旦 TensorBoard 正在运行,可以通过浏览器访问 localhost:6006 来查看 TensorBoard 并查看相应模型的网络结构。以下图是用于物联网多层 IDS 中的自动编码器架构:

模型评估

我们可以评估模型的三个不同方面:

  • 学习/(重新)训练时间

  • 存储需求

  • 性能(准确性)

在一台配有 GPU 支持的桌面电脑(Intel Xenon CPU E5-1650 v3@3.5GHz 和 32 GB RAM)上,LSTM 在 CPU 利用率数据集上的训练和自动编码器在 KDD 分层数据集(减少的数据集)上的训练仅花费了几分钟。DNN 模型在整体数据集上的训练花费了超过一个小时,这是可以预料的,因为它是基于更大的数据集(KDD 整体 10% 数据集)进行训练的。

模型的存储需求是资源受限的 IoT 设备中的一个重要考虑因素。以下截图展示了我们为两个用例测试的三种模型的存储需求:

如截图所示,自动编码器的存储需求在 KB 范围内。存储的自动编码器模型的最终版本仅占 85 KB,LSTM 占 1.5 MB,DNN 占 16.3 MB。在存储需求方面,所有模型都适合在许多资源受限的 IoT 设备中部署,包括 Raspberry Pi 和智能手机。此外,从截图中可以看出,由于优化的特征选择过程等原因,自动编码器是一个非常轻量的模型。

最后,我们评估了模型的性能。在这两个用例中,数据集范围的评估或测试是在 PC 平台/服务器端的训练阶段进行的。我们也可以在 Raspberry Pi 3 或任何 IoT 边缘计算设备上测试它们,因为这些模型已经保存并可导入使用。

模型性能(用例一)

以下图表展示了在 CPU 利用率数据集上使用 LSTM 的验证结果:

从图中可以看出,预测结果紧密跟随非异常或“正常”的 CPU 利用率数据系列,这表明模型运行良好。重要的是,当它发现异常观察值时,观察到的与预测的 CPU 利用率值(归一化后的)与正常行为之间存在显著差异。这表明可能存在对物联网设备的 DoS 或 DDoS 攻击。误差差异以均方根(RMS)值进行绘制,这是此类指标中最常用的度量标准之一。

模型性能(用例二)

我们已经在三个数据集上测试了自编码器模型,用于三个不同层次的 IDS。以下截图展示了应用层 IDS 的评估结果快照:

从截图中可以看出,当我们使用前 12 个最重要的特征进行训练时,训练准确率、验证准确率和测试准确率均高于 90%。如果使用不同的特征集,性能可能会有所不同。

以下图表展示了前述模型在应用层 IDS 数据集上的每个 epoch 的训练准确率:

我们获得了一些有趣的评估结果,关于网络和传输层 IDS 模型的训练。如果使用前 12 个最重要的特征,验证准确率在 50%左右;如果将特征集改为 8 到 10 之间,准确率则提高到 80%到 90%之间。以下两张截图展示了网络层 IDS 实验的评估快照:

有趣的是,从第二张截图可以看出,准确率在前 50 个 epoch 内约为 50%,然后迅速上升到 90%以上。最终的准确率,或保存模型的准确率,处于 91%到 98%之间。因此,它们足以检测网络和传输层的异常。

以下截图展示了 DNN 模型在整体 KDD 数据集上的训练表现:

从前面的图示可以看出,测试准确率接近 1 或 100%。我们还单独测试了保存的模型,测试准确率远高于 0.90 或 90%。因此,DNN 在检测物联网网络中的网络级入侵方面也足够优秀。

总结

安全性是物联网实现中的最重要问题。传统的 PC/桌面安全解决方案,特别是基于签名的解决方案,在物联网应用中效果不佳。基于行为的解决方案,如异常检测,更适用于物联网。深度学习(DL)/机器学习(ML)模型是物联网中非常有用的工具,不仅用于数据分析,还用于安全事件检测。在本章中,我们介绍了基于 DL 的网络和设备行为数据分析以及物联网应用中的安全事件检测技术。在本章的第一部分,我们简要描述了各种物联网安全攻击及其潜在检测技术,包括基于 DL/ML 的技术。我们考虑了物联网应用中的两种不同级别的入侵检测。第一个使用案例是设备级或主机级的入侵检测,第二个使用案例是网络级的入侵检测。在本章的第二部分,我们介绍了基于 DL 的异常或事件检测部分的实现。通过评估发现,所选的 DL 模型足以检测物联网应用中的设备级和网络级入侵。

物联网将被应用于各类场景,如基础设施和工业,以监控其健康状况。健康监控的潜在应用之一是被监控对象(如电机)的预测性维护,以避免服务中断或其他事故发生。

在下一章中,我们将简要介绍基于物联网的预测性维护的重要性及其使用深度学习模型的实现。

参考文献

  • 全球 2015 年至 2025 年物联网(IoT)连接设备安装基数(以十亿计),见www.statista.com/statistics/471264/iot-number-of-connected-devices-worldwide/.

  • 利用时间序列分析实时检测应用层 DDoS 攻击,T. Ni,X. Gu,H. Wang 和 Y. Li,《控制科学与工程学报》,第 2013 卷,第 1-6 页,2013 年。

  • 物联网中的 DDoS:**Mirai 和其他僵尸网络,C. Kolias,G. Kambourakis,A. Stavrou,J. Voas,《IEEE 计算机》,第 50 卷,第 7 期,第 80-84 页,2017 年。

  • 2016 年 Dyn 网络攻击,见en.wikipedia.org/wiki/2016_Dyn_cyberattack.

  • 基于 Fisher 和深度自编码器的大型网络流量数据融合**方法,Tao X.,Kong D.,Wei Y. 和 Wang Y.(2016 年),《信息》,第 7 卷第 2 期,第 20 页。

  • 基于长短时记忆(LSTM)和梯度下降优化的有效入侵检测分类器,Kim J. 和 Kim H.(2017 年 2 月),在平台技术与服务(PlatCon),2017 年国际会议(第 1-6 页),IEEE。

  • Pierre Baldi,自编码器、无监督学习与深度架构,Isabelle Guyon,Gideon Dror,Vincent Lemaire,Graham Taylor 和 Daniel Silver(编辑),见《2011 年无监督与迁移学习国际会议论文集——第 27 卷(UTLW'11)》,第 27 卷,JMLR.org 37-50,2011。

  • KDD Cup 1999 数据,来自 kdd.ics.uci.edu/databases/kddcup99/kddcup99.html

第三部分:物联网中的高级方面与分析

在本节中,我们将学习如何利用涡扇发动机退化模拟数据集开发物联网的预测性维护深度学习解决方案。接下来,我们将探讨如何在医疗领域使用基于深度学习的物联网解决方案,并详细讨论两个使用案例,分析如何利用深度学习支持的物联网解决方案改善和/或自动化医疗服务。然后,我们将讨论现有深度学习技术在物联网中的各种挑战,特别是在资源受限和嵌入式物联网设备中的挑战,并介绍一些未来解决方案方向,以解决剩余问题。

本节包括以下章节:

  • 第八章,物联网的预测性维护

  • 第九章,医疗物联网中的深度学习

  • 第十章,接下来:总结与未来方向

第八章:物联网的预测性维护

物联网IoT)设备中,数据流是为每次事件生成的。基于深度学习的方法可以实时检查这些数据,以诊断整个设备群体的问题,并预测单个设备的未来健康状况,从而实现按需维护。这种策略被称为预测性(或基于状态维护。这种方法现在已经成为物联网最有前景和最有利可图的工业应用之一。

考虑到这些动机,在本章中,我们将探讨如何使用涡扇发动机退化仿真数据集开发物联网的深度学习解决方案。预测性维护的核心思想是确定各种类型的故障模式是否可以预测。此外,我们还将讨论如何从物联网设备收集数据以进行预测性维护。简而言之,本章将涉及以下内容:

  • 物联网的预测性维护

  • 开发预测性维护应用程序

  • 准备数据

  • 训练机器学习基准模型

  • 训练 LSTM 模型

  • 评估模型

  • 常见问题解答

物联网的预测性维护

随着实时数据捕获和流处理架构的进步,现在可以进行实时数据监控,组织可以实时了解单个组件和所有流程的情况。监控仍然需要积极参与和快速反应——例如,一个石油井传感器指示温度或体积增加,或者网络流量中出现了僵尸网络活动或内部威胁。

让我们考虑一个真实世界的例子,叫做工业工程中的设备故障,这一直被认为是一个高成本问题。定期进行预防性维护一直是传统策略。因此,维护计划往往非常保守,通常基于操作员的经验。这种人工干预有几个缺点。首先,它往往会增加维护成本。其次,无法将这种设置适应高度复杂或不断变化的工业场景。

在工业环境中收集物联网数据

根据RT Insights,单个喷气发动机可能价值 1600 万美元,在跨大西洋航班中,它可能消耗 36,000 加仑的燃料。今天的航空燃料价格约为每次航程 54,000 美元,或者每小时超过 5,000 美元。大多数喷气发动机都是燃气涡轮发动机,在这些发动机中,热能通过喷嘴膨胀转化为动能,然后转化为旋转的机械能。这种发动机产生大量的物联网数据。让我们尝试理解,机器学习驱动的预测性维护如何帮助我们降低维护成本。

第一步是收集代表健康和故障操作的传感器数据,涵盖不同的操作条件,例如温度、流量和压力。在实际场景中,这些数据可能在不同的环境和地点进行部署(假设你在西伯利亚,操作温度为-20 摄氏度,流体粘度较高,另一个则在中东国家,温度为 45 摄氏度,流体粘度也较高)。

尽管这两个引擎都应正常运行,但由于不同的操作条件,其中一个引擎可能会更早发生故障。遗憾的是,若没有足够的数据,就无法进一步调查故障的根本原因。一旦这类喷气涡轮发动机投入使用,可以通过流媒体技术在以下环境中收集传感器数据:

  • 正常系统操作中的真实传感器数据

  • 在故障条件下运行的系统中的真实传感器数据

  • 系统故障中的真实传感器数据(从运行到故障数据)

然而,如果我们没有部署很多这类引擎,就没有足够的数据来代表健康和故障状态下的操作。有两种解决方法可以克服这种数据稀缺问题:

  • 使用来自相似/相同引擎的历史数据,这些引擎可能与当前部署的引擎相似。

  • 其次,我们可以建立引擎的数学模型,并根据可用的传感器数据估算其参数。基于统计分布和操作条件,我们可以生成故障数据。

如果选择第二种方法,在生成传感器数据后,我们可以将其与真实传感器数据结合,生成大规模的传感器数据,以用于开发预测性维护模型,如下图所示:

用于预测性维护的机器学习(ML)技术

深度学习DL)技术可以应用于处理大量的物联网数据,并且可能成为经典机器学习算法的有力替代方案。其理念是,当设备配备传感器并联网时,会产生大量的传感器数据。在更复杂的工业环境中,传感器通道的数据通常非常嘈杂,并随着时间波动,但有些数据似乎根本没有变化。这几乎适用于每一个工业环境,因为在物联网环境下产生的数据是一系列多变量的传感器测量,每个数据都有自己的噪声,并包含许多缺失或无意义的值。

预测性维护应用开发中的关键步骤是识别状态指标CIs)和从收集的传感器数据中提取特征,检查 CIs 在系统退化过程中可预测的行为变化。通常,CIs 包含帮助区分正常与故障操作的特征,并预测剩余使用寿命RUL)。

发动机或机器的剩余使用寿命(RUL)是指在发动机需要修理或更换之前预期的剩余使用时间。因此,从传感器数据中预测 RUL 是许多预测性维护应用中的关键。在下图中,我们可以看到,随着涡轮发动机的退化,频率数据中的峰值向左移动。因此,峰值频率可以作为状态指示器:

CI 可以帮助我们理解涡轮发动机的健康状态和故障状态。然而,它们并不能告诉我们哪些部件需要修理,或者在故障发生之前还有多少时间。我们可以在修理之前识别故障类型,或在计划维护之前预测 RUL。对于前者选项,使用提取的 CI 特征来训练 ML 或 DL 模型,并识别故障类型,如密封泄漏、进气阻塞或轴承磨损,如下图所示:

对于后一种策略,我们还可以训练 ML/DL 模型,预测泵在这两种状态(当前状态和故障状态)之间继续转换的趋势。DL 模型可以捕捉 CI 特征之间的关系,而涡轮发动机的退化路径将帮助我们预测距离下次故障还有多长时间,或者何时应安排维护,如下图所示:

最后,稳定的模型可以在工业环境中部署。前述步骤可以通过以下图表进行总结:

不幸的是,由于缺乏用于预测故障类型的传感器数据,在下一节中,我们将通过实际示例展示如何使用 ML 和 DL 技术预测 RUL。

示例 – 飞机燃气涡轮发动机的预测性维护

为了让大家更直观地了解预测性维护,我们将使用 2008 年由NASA Ames 研究中心的预测卓越中心发布的开源涡扇发动机退化仿真数据集。该数据集可以从ti.arc.nasa.gov/c/6/下载。我们感谢以下研究的作者提供此数据集:

涡扇发动机退化仿真数据集,A. Saxena 和 K. Goebel(2008),NASA Ames 预测数据存储库(ti.arc.nasa.gov/tech/dash/groups/pcoe/prognostic-data-repository/),NASA Ames 研究中心,莫菲特场,加利福尼亚州。

描述数据集

数据集由模拟的飞机燃气涡轮发动机的传感器读取数据组成,数据表示多元时间序列的多种操作条件。数据集包括单独的训练集和测试集。测试集与训练集相似,不同之处在于,每个引擎的测量值会在其故障前被截断一段(未知)时间。数据以 ZIP 压缩的文本文件形式提供,包含 26 列数字。每一行表示在单次操作周期内获取的数据快照,每一列代表不同的变量。列名对应以下属性:

  • 单元号

  • 时间,以循环为单位

  • 操作设置 1

  • 操作设置 2

  • 操作设置 3

  • 传感器测量 1

  • 传感器测量 2

  • 传感器测量 26

此外,数据集还包含一组真实的 RUL(剩余使用寿命)值,作为训练模型时的真实标签。

探索性分析

为了展示传感器读取值在引擎的物理状态方面的表现(例如,组件的温度、涡轮风扇的转速等),我们决定从第一个数据集中提取一个引擎的所有传感器数据。为此,我们编写了一个脚本(请参见make_dataset.py),它会从输入目录获取所有数据文件。然后,解析一组原始数据文件为一个单一的 DataFrame 对象,并返回所有文件的聚合表示,带有适当的列名:

data_sets = []
    for data_file in glob(file_pattern):
        if label_data:
            # read in contents as a DataFrame
            subset_df = pd.read_csv(data_file, header=None)
            # need to create a unit_id column explicitly
            unit_id = range(1, subset_df.shape[0] + 1)
            subset_df.insert(0, 'unit_id', unit_id)
        else:
            # read in contents as a DataFrame
            subset_df = pd.read_csv(data_file, sep=' ', header=None, usecols=range(26))
        # extract the id of the dataset from the name and add as a column
        dataset_id = basename(data_file).split("_")[1][:5]
        subset_df.insert(0, 'dataset_id', dataset_id)
        # add to list
        data_sets.append(subset_df)
    # combine dataframes
    df = pd.concat(data_sets)
    df.columns = columns
    # return the result

    return df

要使用这个脚本,首先复制data/raw/目录下的所有文件,然后执行以下命令:

$python3 make_dataset.py data/raw/ /data/processed/

该命令将生成三个文件——train.csvtest.csvRUL.csv——分别对应训练集、测试集和标签。现在我们的数据集已经准备好进行探索性分析,我们可以将每个 CSV 文件作为 pandas DataFrame 读取:

# load the processed data in CSV format
train_df = pd.read_csv('train.csv')
test_df = pd.read_csv('test.csv')
rul_df = pd.read_csv('RUL.csv')

# for convenience, identify the sensor and operational setting columns
sensor_columns = [col for col in train_df.columns if col.startswith("sensor")]
setting_columns = [col for col in train_df.columns if col.startswith("setting")]

然后,从第一个数据集中提取第一个单元:

slice = train_df[(train_df.dataset_id == 'FD001') & (train_df.unit_id == 1)]

接着,我们将其传感器数据随时间变化的轨迹绘制在一个 7 * 3 = 21 个图的网格中,以查看所有传感器通道。我们需要绘制与该位置相对应的通道:

fig, axes = plt.subplots(7, 3, figsize=(15, 10), sharex=True)

for index, ax in enumerate(axes.ravel()):
    sensor_col = sensor_columns[index]
    slice.plot(x='cycle', y=sensor_col, ax=ax, color='blue');
    # label formatting
    if index % 3 == 0:
        ax.set_ylabel("Sensor reading", size=10);
    else:
        ax.set_ylabel("");
    ax.set_xlabel("Time (cycle)");
    ax.set_title(sensor_col.title(), size=14);
    ax.legend_.remove();

# plot formatting
fig.suptitle("Sensor reading : unit 1, dataset 1", size=20, y=1.025)
fig.tight_layout();

如下图所示,传感器通道的数据相当嘈杂,并随着时间波动,而其他数据似乎完全没有变化。每个传感器的生命周期在X轴上的起始值和结束值都不同:

我们可以看到,每个引擎的生命周期和故障模式略有不同。接下来,我们可以将所有传感器通道的数据与时间进行可视化,选取训练集中的 10 个引擎作为随机样本:

# randomly select 10 units from dataset 1 to plot
all_units = train_df[train_df['dataset_id'] == 'FD001']['unit_id'].unique()
units_to_plot = np.random.choice(all_units, size=10, replace=False)

# get the data for these units
plot_data = train_df[(train_df['dataset_id'] == 'FD001') &
                     (train_df['unit_id'].isin(units_to_plot))].copy()

# plot their sensor traces (overlaid)
fig, axes = plt.subplots(7, 3, figsize=(15, 10), sharex=True)

for index, ax in enumerate(axes.ravel()):
    sensor_col = sensor_columns[index]

    for unit_id, group in plot_data.groupby('unit_id'):
        # plot the raw sensor trace
        (group.plot(x='cycle', y=sensor_col, alpha=0.45, ax=ax, color='gray', legend=False));
        # overlay the 10-cycle rolling mean sensor trace for visual clarity
        (group.rolling(window=10, on='cycle')
             .mean()
             .plot(x='cycle', y=sensor_col, alpha=.75, ax=ax, color='black', legend=False));

    # label formatting
    if index % 3 == 0:
        ax.set_ylabel("Sensor Value", size=10);
    else:
        ax.set_ylabel("");
    ax.set_title(sensor_col.title());
    ax.set_xlabel("Time (Cycles)");

# plot formatting
fig.suptitle("All Sensor Traces: Dataset 1 (Random Sample of 10 Units)", size=20, y=1.025);
fig.tight_layout();

上述代码段展示了从数据集 1 中提取的 10 个随机样本的传感器读取图:

从前面的图中,我们可以观察到,一台发动机的进展与时间的关系与其他发动机并不完全一致。这种阻碍使得我们无法将一台发动机的第五周期与另一台发动机的第五周期进行比较。

检查故障模式

由于在训练集中已经知道每台发动机的故障时间,我们可以在每个时间步计算一个故障前的时间值,该值可以定义如下:

故障前的时间(TBF) = 故障时的发动机经过使用的时间(EEL) - 总使用寿命(TOL)

这个数字可以视为每台发动机的倒计时,允许我们将不同发动机的数据对齐到一个共同的结束点:

# generate the lifetimes series
lifetimes = train_df.groupby(['dataset_id', 'unit_id'])['cycle'].max()

# apply the above function to the data we're plotting
plot_data['ctf'] = plot_data.apply(lambda r: cycles_until_failure(r, lifetimes), axis=1)

# plot the sensor traces (overlaid)
fig, axes = plt.subplots(7, 3, figsize=(15, 10), sharex=True)
for index, ax in enumerate(axes.ravel()):
    sensor_col = sensor_columns[index]
    # use the same subset of data as above
    for unit_id, group in plot_data.groupby('unit_id'):
        # plot the raw sensor trace, using ctf on the time axis
        (group.plot(x='ctf', y=sensor_col, alpha=0.45, ax=ax, color='gray', legend=False));

        # overlay the 10-cycle rolling mean sensor trace for visual clarity
        (group.rolling(window=10, on='ctf')
             .mean()
             .plot(x='ctf', y=sensor_col, alpha=.75, ax=ax, color='black', legend=False));

    # label formatting
    if index % 3 == 0:
        ax.set_ylabel("Sensor Value", size=10);
    else:
        ax.set_ylabel("");
    ax.set_title(sensor_col.title());
    ax.set_xlabel("Time Before Failure (Cycles)");

    # add a vertical red line to signal common time of failure
    ax.axvline(x=0, color='r', linewidth=3);

    # extend the x-axis to compensate
    ax.set_xlim([None, 10]);
fig.suptitle("All Sensor Traces: Dataset 1 (Random Sample of 10 Units)", size=20, y=1.025);
fig.tight_layout();

下图展示了相同发动机的传感器通道。唯一的不同是,前图是以故障前的时间为横轴绘制的,其中每台发动机的故障时间都在同一时刻结束(t=0)。它还为我们提供了不同发动机之间的共同模式,显示出在故障前,某些传感器读数始终上升或下降,而其他传感器——例如传感器 14——则表现出不同的故障行为

这种模式在许多预测性维护问题中非常常见:故障通常是多种不同过程的交汇,因此,现实世界中的事物可能表现出多种故障模式。由于这种数据的不可预测模式,预测 RUL 非常具有挑战性。

预测挑战

如下图所示,在观察了发动机的传感器数据和操作条件一段时间(图中的 133 个周期)后,挑战在于预测发动机在故障之前还能继续运行多长时间(即 RUL):

然而,对于一个机器学习/深度学习模型来说,做出错误的预测基本上是低估了某个发动机的真实剩余使用寿命(RUL)。这可能导致涡轮发动机过早进行维护,而实际上它还可以在没有出现问题的情况下运行一段时间。那么,如果我们的模型高估了真实的 RUL,会发生什么呢?在这种情况下,我们可能会允许一台性能下降的飞机继续飞行,进而冒着发生灾难性发动机故障的风险。显然,这两种结果的成本是不同的。考虑到这些挑战,在下一部分中,我们将重点讨论基于深度学习的 RUL 预测技术。

深度学习用于 RUL 预测

如我们所讨论的,我们正尝试计算发动机需要进行维护前的时间。这个数据集的特别之处在于,发动机一直运行到故障,这为我们提供了每台发动机在每个时间点的准确 RUL 信息。

计算截止时间

让我们考虑一下FD004数据集,它包含了最多 249 台发动机(engine_no),并在不同时间(time_in_cycles)进行监控。每台发动机都有每个周期的operational_settingssensor_measurements数据记录:

data_path = 'train_FD004.txt'
data = utils.load_data(data_path)

为了训练一个预测 RUL 的模型,我们可以通过选择引擎寿命中的一个随机点,并只使用该点之前的数据来模拟实际预测。我们可以通过使用截止时间轻松地创建带有此限制的特征:

def make_cutoff_times(data):
    gb = data.groupby(['unit_id'])
    labels = []
    for engine_no_df in gb:
        instances = engine_no_df[1].shape[0]
        label = [instances - i - 1 for i in range(instances)]
        labels += label
    return new_labels(data, labels)

上面的函数通过对cutoff_timelabel进行采样来生成截止时间,可以按如下方式调用:

cutoff_times = utils.make_cutoff_times(data)
cutoff_times.head()

上面的代码行只显示了五个引擎的 RUL 和截止时间:

深度特征合成

然后,我们使用深度特征合成DFS)生成特征。为此,我们需要为数据建立实体集结构。我们可以通过标准化原始数据中的engine_no列来创建引擎实体:

def make_entityset(data):
    es = ft.EntitySet('Dataset')
    es.entity_from_dataframe(dataframe=data,
                             entity_id='recordings',
                             index='index',
                             time_index='time')
    es.normalize_entity(base_entity_id='recordings',
                        new_entity_id='engines',
                        index='engine_no')
    es.normalize_entity(base_entity_id='recordings',
                        new_entity_id='cycles',
                        index='time_in_cycles')
    return es
es = make_entityset(data)

上面的代码块将生成实体集的以下统计信息:

Entityset: Dataset
 Entities:
 recordings [Rows: 20631, Columns: 28]
 engines [Rows: 100, Columns: 2]
 cycles [Rows: 362, Columns: 2]
 Relationships:
 recordings.engine_no -> engines.engine_no
 recordings.time_in_cycles -> cycles.time_in_cycles

ft.dfs函数接受一个实体集,并通过实体之间的原始操作(如maxminlast)进行穷举堆叠:

fm, features = ft.dfs(entityset=es,
                      target_entity='engines',
                      agg_primitives=['last', 'max', 'min'],
                      trans_primitives=[],
                      cutoff_time=cutoff_times,
                      max_depth=3,
                      verbose=True)
fm.to_csv('FM.csv')

机器学习基准

现在我们已经生成了特征,可以开始训练第一个机器学习模型,称为RandomForestRegressor。然后,我们将逐步转向使用深度学习(DL),例如长短期记忆LSTM)网络。随机森林RF)是一种集成技术,通过构建多个决策树并将其整合在一起,来获得更准确、更稳定的预测。通常,较深的树表示更复杂的决策规则和更好的模型拟合,例如以下图像显示了大学录取数据的决策树:

因此,树的深度越深,决策规则越复杂,模型拟合得越好。这是随机森林的直接结果。换句话说,基于独立评审团的多数投票的最终预测,总是比最佳评审团更好、更可靠。下图显示了随机森林及其集成技术:

所以,让我们通过准备单独的训练集和测试集开始:

fm = pd.read_csv('FM.csv', index_col='engine_no')
X = fm.copy().fillna(0)
y = X.pop('RUL')
X_train, X_test, y_train, y_test = train_test_split(X, y)

然后,使用训练集,我们将检查以下基准:

  • 始终预测y_train的中位数值。

  • 始终将 RUL 预测为每个引擎在X_train中具有中位数寿命的情况。

我们将通过计算绝对误差的平均值,即平均绝对误差MAE),来检查这些预测,使用来自 scikit-learn 的RandomForestRegressor

from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error

yhat_median_predict = [np.median(y_train) for _ in y_test]
print('Baseline by median label: MAE = {:.2f}'.format(
    mean_absolute_error(yhat_median_predict, y_test)))

# Collect sensor readings from the sensor in training set
recordings_from_train = es['recordings'].df[es['recordings'].df['engine_no'].isin(y_train.index)]
median_life = np.median(recordings_from_train.groupby(['engine_no']).apply(lambda df: df.shape[0]))

# Collect sensor readings from the sensor in training set
recordings_from_test = es['recordings'].df[es['recordings'].df['engine_no'].isin(y_test.index)]
life_in_test = recordings_from_test.groupby(['engine_no']).apply(lambda df: df.shape[0])-y_test

# Compute mean absolute error as the baseline by meadian of the RUL
yhat_median_predict2 = (median_life - life_in_test).apply(lambda row: max(row, 0))
print('Baseline by median life: MAE = {:.2f}'.format(
    mean_absolute_error(yhat_median_predict2, y_test)))

上面的代码块应产生以下输出,显示基准MAE值:

Baseline by median label: MAE = 66.72
Baseline by median life: MAE = 59.96

进行预测

现在我们可以使用我们创建的特征来拟合RandomForestRegressor模型,看看是否能够提高之前的分数:

rf = RandomForestRegressor() # first we instantiate RandomForestRegressor from scikit-learn
rf.fit(X_train, y_train) # train the regressor model with traing set

preds = rf.predict(X_test) # making predictin on unseen observation 
scores = mean_absolute_error(preds, y_test) # Computing MAE

print('Mean Abs Error: {:.2f}'.format(scores))
high_imp_feats = utils.feature_importances(X, reg, feats=10) # Printing feature importance

上面的代码块应产生以下输出,显示基准 MAE 值和引擎记录周期的统计信息:

Mean Abs Error: 31.04
 1: LAST(recordings.cycles.LAST(recordings.sensor_measurement_4)) [0.395]
 2: LAST(recordings.sensor_measurement_4) [0.192]
 3: MAX(recordings.sensor_measurement_4) [0.064]
 4: LAST(recordings.cycles.MIN(recordings.sensor_measurement_11)) [0.037]
 5: LAST(recordings.cycles.MAX(recordings.sensor_measurement_12)) [0.029]
 6: LAST(recordings.sensor_measurement_15) [0.020]
 7: LAST(recordings.cycles.MAX(recordings.sensor_measurement_11)) [0.020]
 8: LAST(recordings.cycles.LAST(recordings.sensor_measurement_15)) [0.018]
 9: MAX(recordings.cycles.MAX(recordings.sensor_measurement_20)) [0.016]
 10: LAST(recordings.time_in_cycles) [0.014]

然后,我们需要准备特征和标签,可以使用以下代码完成:

data2 = utils.load_data('test_FD001.txt')
es2 = make_entityset(data2)
fm2 = ft.calculate_feature_matrix(entityset=es2, features=features, verbose=True)
fm2.head()

加载的数据应包含来自 249 个引擎的 41,214 条记录,其中使用了 21 个传感器测量值,涵盖了三种操作设置。然后,我们需要使用加载的数据准备特征和标签,以下是我们可以使用的代码:

X = fm2.copy().fillna(0)
y = pd.read_csv('RUL_FD004.txt', sep=' ', header=-1, names=['RUL'], index_col=False)

preds2 = rf.predict(X)
print('Mean Abs Error: {:.2f}'.format(mean_absolute_error(preds2, y)))

yhat_median_predict = [np.median(y_train) for _ in preds2]
print('Baseline by median label: MAE = {:.2f}'.format(
    mean_absolute_error(yhat_median_predict, y)))

yhat_median_predict2 = (median_life - es2['recordings'].df.groupby(['engine_no']).apply(lambda df: df.shape[0])).apply(lambda row: max(row, 0))

print('Baseline by median life: MAE = {:.2f}'.format(
    mean_absolute_error(yhat_median_predict2 y)))

上面的代码块应该生成以下输出,显示预测的 MAE 和基线 MAE 值:

Mean Abs Error: 40.33
Baseline by median label: Mean Abs Error = 52.08
Baseline by median life: Mean Abs Error = 49.55

如图所示,预测的 MAE 值低于基线的 MAE 值。接下来,我们尝试进一步使用 LSTM 网络改善 MAE。

使用 LSTM 改进 MAE

我们将使用基于 Keras 的 LSTM 网络来预测剩余使用寿命(RUL)。不过,为此,我们首先需要将数据转换成 LSTM 模型可以使用的三维格式:

#Prepare data for Keras based LSTM model
def prepareData(X, y):
    X_train, X_test, y_train, y_test = train_test_split(X, y)
    X_train = X_train.as_matrix(columns=None)
    X_test = X_test.as_matrix(columns=None)
    y_train = y_train.as_matrix(columns=None)
    y_test = y_test.as_matrix(columns=None)
    y_train = y_train.reshape((y_train.shape[0], 1))
    y_test = y_test.reshape((y_test.shape[0], 1))
    X_train = np.reshape(X_train,(X_train.shape[0], 1, X_train.shape[1]))
    X_test = np.reshape(X_test,(X_test.shape[0], 1, X_test.shape[1]))    
    return X_train, X_test, y_train, y_test

现在我们拥有适合 LSTM 模型的数据,我们可以构建 LSTM 网络。为此,我们有一个简化的 LSTM 网络,只有一个 LSTM 层,接着是一个全连接层,在应用掉出层以进行更好的正则化之后。然后,我们再加一个全连接层,最后通过线性激活函数将这个全连接层的输出投射到激活层,以便输出实值结果。然后,我们使用 SGD 版本的RMSProp,它尝试优化均方误差MSE):

#Create LSTM model
from keras.models import Sequential
from keras.layers.core import Dense, Activation
from keras.layers.recurrent import LSTM
from keras.layers import Dropout
from keras.layers import GaussianNoise

def createLSTMModel(X_train, hidden_neurons):
    model = Sequential()
    model.add(LSTM(hidden_neurons, input_shape=(X_train.shape[1], X_train.shape[2])))
    model.add(Dense(hidden_neurons))
    model.add(Dropout(0.7))
    model.add(Dense(1))
    model.add(Activation("linear"))
    model.compile(loss="mean_squared_error", optimizer="rmsprop")
    return model

然后,我们使用训练集来训练 LSTM 模型:

X_train, X_test, y_train, y_test = prepareData(X, y)
hidden_neurons = 128
model = createLSTMModel(X_train, hidden_neurons)
history = model.fit(X_train, y_train, batch_size=32, nb_epoch=5000, validation_split=0.20)

上面的代码行应该生成一些日志,帮助我们了解训练和验证损失是否在迭代过程中减少:

Train on 60 samples, validate on 15 samples
 Epoch 1/5000
 60/60 [==============================] - ETA: 0s - loss: 7996.37 - 1s 11ms/step - loss: 7795.0232 - val_loss: 8052.6118
 Epoch 2/5000
 60/60 [==============================] - ETA: 0s - loss: 6937.66 - 0s 301us/step - loss: 7466.3648 - val_loss: 7833.4321
 …
 60/60 [==============================] - ETA: 0s - loss: 1754.92 - 0s 259us/step - loss: 1822.5668 - val_loss: 1420.7977
 Epoch 4976/5000
 60/60 [==============================] - ETA: 0s - loss: 1862.04

现在训练已经完成,我们可以绘制训练和验证损失图:

# plot history
plt.plot(history.history['loss'], label='Training')
plt.plot(history.history['val_loss'], label='Validation')
plt.legend()
plt.show()

上面的代码块应该生成以下图表,我们可以看到验证损失低于训练损失:

该模型可能存在过拟合训练数据的情况。在训练过程中测量并绘制 MAE 可能会对此提供更多的线索。让我们来看一下测试集上的 MAE:

predicted = model.predict(X_test)
rmse = np.sqrt(((predicted - y_test) ** 2).mean(axis=0))
print('Mean Abs Error: {:.2f}'.format(mean_absolute_error(predicted, y_test)))

我们应该得到一个 MAE 为 38.32,这意味着 MAE 误差有所降低(而 RF 模型的 MAE 为 40.33),但仍然不令人信服。造成这种较高 MAE 的原因可能有多个。例如,我们可能没有足够的训练数据;其次,我们在生成实体集时使用了一种低效的方法。对于第一个问题,我们可以使用整个数据集来训练模型。我们还可以使用其他正则化技术,如高斯噪声层,并指定噪声阈值:

def createLSTMModel(X_train, hidden_neurons):
    model = Sequential()
    model.add(LSTM(hidden_neurons, input_shape=(X_train.shape[1], X_train.shape[2])))
    model.add(GaussianNoise(0.2))
    model.add(Dense(hidden_neurons))
    model.add(Dropout(0.7))
    model.add(Dense(1))
    model.add(GaussianNoise(0.5))
    model.add(Activation("linear"))
    model.compile(loss="mean_squared_error", optimizer="rmsprop")
    return model    

高斯噪声层可以作为输入层直接向输入变量添加噪声。这是神经网络中使用噪声作为正则化方法的传统方式,噪声可以在激活函数使用之前或之后添加。尽管将噪声添加到激活函数之前可能更有意义,但两种方式都是可能的。在我们的案例中,我们在 LSTM 层后、全连接层前添加了一个掉出率为 0.2 的高斯噪声层。

然后,我们有另一个高斯噪声层,将噪声添加到密集层的线性输出之前,再使用修正线性激活函数。然后,使用引入噪声的相同数据训练 LSTM 模型应该产生略低的 MAE 值,约为 35.25。我们甚至可以检查显示训练和验证损失的图表:

前面的图表显示训练损失和测试损失几乎相同,这表明模型的正则化效果更好。因此,模型在测试集上的表现也更好。然而,通过改进质量更好的特征,MAE 仍然可以降低。让我们探索一下使用更好的特征生成技术。

无监督深度特征合成

我们将看到实体集结构如何有助于提高预测准确性。我们将使用tsfresh库中的时间序列函数构建自定义原始功能。在此之前,我们将通过从每个引擎的生命周期中随机选择一个来制定截止时间。我们将制定五组截止时间用于交叉验证:

from tqdm import tqdm
splits = 10
cutoff_time_list = []
for i in tqdm(range(splits)):
    cutoff_time_list.append(utils.make_cutoff_times(data))
cutoff_time_list[0].head()

前面的代码块应显示五个引擎的截止时间和 RUL 值,如下所示:

然后,我们将使用一种无监督的方式生成实体集。正如我们所见,操作设置13的值是连续的,但它们在不同引擎之间创建了隐含的关系。因此,如果两个引擎具有相似的操作设置,则传感器测量结果会给出相似的值。这个想法是通过 k-means 技术将这些设置进行聚类。然后,我们从具有相似值的簇中创建一个新的实体:

from sklearn.cluster import KMeans
nclusters = 50
def make_entityset(data, nclusters, kmeans=None):
    X = data[['operational_setting_1', 'operational_setting_2', 'operational_setting_3']]
    if kmeans:
        kmeans=kmeans
    else:
        kmeans = KMeans(n_clusters=nclusters).fit(X)
    data['settings_clusters'] = kmeans.predict(X)
        es = ft.EntitySet('Dataset')
    es.entity_from_dataframe(dataframe=data,
                             entity_id='recordings',
                             index='index',
                             time_index='time')
    es.normalize_entity(base_entity_id='recordings', 
                        new_entity_id='engines',
                        index='engine_no')
    es.normalize_entity(base_entity_id='recordings', 
                        new_entity_id='settings_clusters',
                        index='settings_clusters')
    return es, kmeans
es, kmeans = make_entityset(data, nclusters)

前面的代码段生成一个实体集,显示以下关系:

Entityset: Dataset
 Entities:
 settings_clusters [Rows: 50, Columns: 2]
 recordings [Rows: 61249, Columns: 29]
 engines [Rows: 249, Columns: 2]
 Relationships:
 recordings.engine_no -> engines.engine_no
 recordings.settings_clusters -> settings_clusters.settings_clusters

除了改变我们的实体集结构外,我们还将使用tsfresh包中的复杂时间序列原始功能。任何接收 Pandas 系列并输出浮点数的函数都可以使用make_agg_primitive函数转换为聚合原始功能,如下所示:

from featuretools.primitives import make_agg_primitive
import featuretools.variable_types as vtypes
from tsfresh.feature_extraction.feature_calculators import (number_peaks, mean_abs_change, 
                                                            cid_ce, last_location_of_maximum, length)
Complexity = make_agg_primitive(lambda x: cid_ce(x, False),
                              input_types=[vtypes.Numeric],
                              return_type=vtypes.Numeric,
                              name="complexity")
fm, features = ft.dfs(entityset=es, 
                      target_entity='engines',
                      agg_primitives=['last', 'max', Complexity],
                      trans_primitives=[],
                      chunk_size=.26,
                      cutoff_time=cutoff_time_list[0],
                      max_depth=3,
                      verbose=True)
fm.to_csv('Advanced_FM.csv')
fm.head()

使用这种方法,我们成功生成了额外的 12 个特征(之前有 290 个)。然后,我们用相同的特征集构建了另外四个特征矩阵,但使用了不同的截止时间。这使我们能够在将其用于测试数据之前多次测试管道:

fm_list = [fm]
for i in tqdm(range(1, splits)):
    fm = ft.calculate_feature_matrix(entityset=make_entityset(data, nclusters, kmeans=kmeans)[0], 
         features=features, chunk_size=.26, cutoff_time=cutoff_time_list[i])
    fm_list.append(fm)

然后,使用递归特征消除,我们再次对 RF 回归器建模,以便模型仅选择重要特征,从而进行更好的预测:

from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error
from sklearn.feature_selection import RFE

def pipeline_for_test(fm_list, hyperparams={'n_estimators':100, 'max_feats':50, 'nfeats':50}, do_selection=False):
    scores = []
    regs = []
    selectors = []
    for fm in fm_list:
        X = fm.copy().fillna(0)
        y = X.pop('RUL')
        reg = RandomForestRegressor(n_estimators=int(hyperparams['n_estimators']), 
              max_features=min(int(hyperparams['max_feats']), int(hyperparams['nfeats'])))
        X_train, X_test, y_train, y_test = train_test_split(X, y)

        if do_selection:
            reg2 = RandomForestRegressor(n_jobs=3)
            selector=RFE(reg2,int(hyperparams['nfeats']),step=25)
            selector.fit(X_train, y_train)
            X_train = selector.transform(X_train)
            X_test = selector.transform(X_test)
            selectors.append(selector)
        reg.fit(X_train, y_train)
        regs.append(reg)
        preds = reg.predict(X_test)
        scores.append(mean_absolute_error(preds, y_test))
    return scores, regs, selectors  

scores, regs, selectors = pipeline_for_test(fm_list)
print([float('{:.1f}'.format(score)) for score in scores])
print('Average MAE: {:.1f}, Std: {:.2f}\n'.format(np.mean(scores), np.std(scores)))
most_imp_feats = utils.feature_importances(fm_list[0], regs[0])

前面的代码块应生成以下输出,显示每次迭代中的预测 MAE 及其平均值。此外,它显示了基线 MAE 值和有关引擎记录周期的统计信息:

[33.9, 34.5, 36.0, 32.1, 36.4, 30.1, 37.2, 34.7,38.6, 34.4]
 Average MAE: 33.1, Std: 4.63
 1: MAX(recordings.settings_clusters.LAST(recordings.sensor_measurement_13)) [0.055]
 2: MAX(recordings.sensor_measurement_13) [0.044]
 3: MAX(recordings.sensor_measurement_4) [0.035]
 4: MAX(recordings.settings_clusters.LAST(recordings.sensor_measurement_4)) [0.029]
 5: MAX(recordings.sensor_measurement_11) [0.028]

现在让我们再次尝试使用 LSTM,看看是否可以减少 MAE 误差:

X = fm.copy().fillna(0)
y = X.pop('RUL')
X_train, X_test, y_train, y_test = prepareData(X, y)

hidden_neurons = 128
model = createLSTMModel(X_train, hidden_neurons)

history = model.fit(X_train, y_train, batch_size=32, nb_epoch=5000, validation_split=0.20)
# plot history
plt.plot(history.history['loss'], label='Training')
plt.plot(history.history['val_loss'], label='Validation')
plt.legend()
plt.show()

前面的代码行应生成以下图表,其中验证损失低于训练损失:

最后,我们可以根据 MAE 评估模型的表现:

predicted = model.predict(X_test)
print('Mean Abs Error: {:.2f}'.format(mean_absolute_error(predicted, y_test)))

上面的代码块应该产生一个 MAE 为 52.40 的结果,低于我们在前一节中得到的结果。

常见问题解答

在本节中,我们将涵盖一些常见问题FAQ),这些问题将帮助你扩展这个应用:

  1. 我们可以使用其他深度架构在类似的物联网环境中进行预测吗?

回答:是的,使用其他深度架构可能是一个可行的选项。例如,通过结合 CNN 和 LSTM 层的预测能力,创建一个卷积-LSTM 网络,已经在许多应用场景中证明是有效的,如音频分类、自然语言处理NLP)和时间序列预测。

  1. 有时我们没有足够的物联网数据来灵活地训练模型。我们如何增加训练数据的数量?

回答:有很多方法可以做到这一点。例如,我们可以尝试通过将所有发动机数据结合起来生成训练集。为此,生成的训练、测试和 RUL 的 CSV 文件会很有帮助。另一个例子是尝试通过添加更多的样本来扩展数据集。

  1. 我可以在工业环境中进行异常检测吗?

回答:是的,你可以。实际上,在工业环境中,这种做法非常常见,例如生产故障识别、实时时间序列异常检测、预测监控等。

  1. 我在哪里可以获得数据以在物联网环境中进行其他分析?

回答:来自预测数据仓库的时间序列数据,从某一正常状态到失败状态,可以用于预测算法的开发。请参阅以下链接了解更多关于数据集的信息:ti.arc.nasa.gov/tech/dash/groups/pcoe/prognostic-data-repository/

总结

在本章中,我们讨论了如何使用物联网和涡扇发动机退化仿真数据集开发用于预测性维护的深度学习解决方案。我们首先讨论了数据集的探索性分析,然后使用一种非常流行的基于树的集成技术——随机森林(RF)来建模预测性维护,RF 使用的是涡轮发动机的特征。接着,我们看到如何通过使用 LSTM 网络提高预测准确性。LSTM 网络确实有助于减少网络错误。尽管如此,我们仍然看到如何在 LSTM 网络中加入高斯噪声层,以实现泛化,同时进行 dropout 操作。

了解深度学习技术在物联网各层(包括传感器/感知层、网关层和云层)的潜力非常重要。因此,为物联网健康设备开发可扩展且高效的解决方案也不例外。在下一章中,我们将展示一个利用深度学习在生命周期各阶段进行数据分析的应用案例。

第九章:深度学习在医疗物联网中的应用

物联网有着广泛的应用领域,包括健康和医疗保健。物联网在医疗健康中的应用正在以危险的速度增长,市场研究表明,全球物联网医疗市场到 2025 年有望达到 5343 亿美元。这些应用中的大多数,包括远程和实时病人监控,将产生异构流数据和/或大数据。然而,从这些数据中分析并提取有用信息,对于医疗健康专业人员来说是一个巨大的挑战。在这种背景下,机器学习ML)和深度学习DL)模型能够通过自动化分析、分类各类数据以及检测数据中的异常来应对这一挑战。医疗行业广泛使用机器学习和深度学习进行各种应用。因此,机器学习/深度学习模型在物联网医疗健康应用中的使用,对于真正实现医疗物联网至关重要。

在本章中,我们将介绍基于深度学习(DL)的物联网(IoT)解决方案在医疗健康领域的应用。首先,我们将概述物联网在医疗健康中的各类应用。接着,我们将简要讨论两个使用案例,展示如何通过基于深度学习的物联网解决方案来改进和/或自动化医疗服务。第二部分将介绍这两个案例中,基于深度学习的医疗事件和/或疾病检测的实际经验。本章将涵盖以下主题:

  • 物联网与医疗健康应用

  • 使用案例一:远程慢性病管理

  • 远程慢性病管理的实施

  • 使用案例二:物联网在痤疮检测与护理中的应用

  • 痤疮检测与护理的实施

  • 深度学习在医疗物联网中的应用

  • 卷积神经网络(CNN)和长短时记忆网络(LSTM)在医疗物联网应用中的应用

  • 数据收集

  • 数据预处理

  • 模型训练

  • 模型评估

物联网在医疗健康中的应用

全球范围内,健康和医疗服务面临着巨大的挑战,例如成本飙升、人口老龄化、慢性病和/或多重病症的患病率增加,以及医疗专业人员短缺。此外,依赖于平均数据和/或定性数据以及一刀切的处方方式的传统医疗服务效果并不理想。在这种背景下,物联网在医疗服务中的应用通过以下特性应对了这些挑战:

  • 与各种现有技术的无缝集成

  • 大数据处理与分析的支持

  • 个性化服务

  • 基于远程与实时监控的连接医疗服务

  • 定量数据,相比定性数据,能够提供更有效的服务

  • 医疗专业人员与患者之间的互动与实时互动

  • 服务的普遍可达性

  • 高效的医疗资源管理

所有这些基于物联网的解决方案特点将通过提供各种服务颠覆医疗行业。这些服务可以在两种不同的环境中查看和提供:

  • 医院和诊所

  • 非临床病人环境

以下图表突出展示了这两种环境中的一些主要应用,并列出了每个环境中的潜在服务:

以下是物联网医疗的关键子领域:

  • 智能医院:在全球范围内,无论是发达国家还是发展中国家,医院都面临病人过多的问题。此外,它们还面临资源短缺——包括缺乏熟练的专业人员和设备。在大多数国家的农村地区,情况尤为严重,那里的人们几乎无法或完全无法获得医疗服务。在这种背景下,基于物联网的远程服务,如远程监测和远程医疗,可以提供许多基础的医疗服务。此外,远程监测老年病人和慢性病患者可以大大降低与医疗相关的成本,并提高病人和医疗专业人员的生活质量。智能和联网的救护车可以提供车载即时和紧急服务,并减少与紧急服务相关的事故。在手术室中,连接的医生(本地和远程)、工作人员和医疗设备可以提供更好、更顺畅的手术环境。此外,医院的库存管理可以通过物联网应用得到极大的改善。

  • 诊所:许多人去全科医生GP)诊所接受初级保健服务。这些服务提供者也可以通过使用物联网应用受益。例如,全科医生可以虚拟查看和分析病人的病理报告,这节省了双方的时间。重要的是,病人将获得更多用于护理相关讨论的时间,而不是单纯的信息收集。诊所可以实时核实病人的保险覆盖情况。诊所和全科医生诊所的预约管理是一个全球性挑战。在英格兰,每年大约有 1500 万次预约未能按时进行,这使国民健康服务NHS)损失了数百万英镑。物联网应用可以改善这一情况。

  • 非临床病人环境:物联网的两个潜在应用领域是连接的——病人和智能家居。在这里,智能家居可以随时随地为病人提供医疗服务。远程监测处方干预措施,如物理治疗,可以通过连接的病人应用程序进行。此外,病人可以获得个性化服务,例如提醒服药。为老年人提供监测和医疗服务是全球性的重大挑战。智能家居解决方案可以通过跌倒检测、服药提醒、远程医疗和一般辅助生活等服务改善现有服务,并为这些高风险人群提供新的服务。

从上述讨论中可以明显看出,物联网在医疗领域具有巨大的潜力。在接下来的部分,我们将简要讨论物联网在医疗领域的两个用例。

用例一 – 慢性病的远程管理

慢性病——包括心血管疾病、高血压和糖尿病——每年全球造成超过 4000 万人的死亡。这个问题在发展中国家和发达国家有不同的表现。在发展中国家,慢性病患者在许多基本健康服务方面存在访问限制或无法获取,包括早期或及时的检测设施,这导致了大量死亡。另一方面,在发达国家,医学研究已显著提高了预期寿命。例如,通过早期发现和疾病监测来实现这一点。然而,在包括英国在内的发达国家,每增加 2 年的预期寿命,我们只能获得 1 年的高质量生命。因此,我们在慢性病和残疾中度过的生命比例正在上升。管理多种慢性疾病患者的成本达到数万亿美元/英镑。幸运的是,基于物联网的慢性病患者远程监测能够解决大部分这些问题,并提供具有成本效益的服务。

用例一的实施

我们正在考虑一个基于物联网(IoT)的远程患者监测应用程序,适用于用例一。以下图表简要展示了基于物联网的远程患者监测与管理系统如何运作:

如图所示,基于物联网的远程患者监测系统由三个主要元素组成,分别是智能家居、护理提供者和健康云:

  • 智能家居:这是解决方案的核心,包括患者和各种物联网设备。智能家居由以下关键组件组成:

    • 患者:患者将连接到多个传感器,包括心电图(ECG)、血压传感器、加速度计和陀螺仪。这些传感器将收集生理和活动相关的数据,并将其发送给护理提供者,以便进行必要的实时反馈。

    • 环境感知:仅靠身体传感器和可穿戴设备不足以覆盖患者的所有活动。此外,患者因多种原因对身体上有过多传感器感到不适,包括需要无缝移动。智能家居将安装各种环境传感器,包括光线、振动、运动、压力和门传感器。这些传感器将提供关于患者的上下文信息。

    • 边缘计算平台:我们为此组件提供了多种选择,例如智能手机/平板电脑、边缘网关或 Raspberry Pi 3。在这个用例中,我们考虑使用 Raspberry Pi 3。前面提到的所有传感器都可以连接到 Raspberry Pi 3。大多数传感器将持续监测环境和/或患者的活动,其他传感器则是事件驱动的(例如,门传感器会在有人开门或敲门时被激活)。这些传感器将把数据发送到 Raspberry Pi 3 进行进一步处理,包括检测高血压、体温异常或摔倒等事件。最后,处理后的数据将通过家庭路由器和健康云发送给护理提供者。重要的是,Raspberry Pi 3 将安装各种预训练的深度学习/机器学习模型,包括用于检测心脏异常的 ECG 测量分类器。

  • 健康云用于模型学习和数据分析:健康云是一个云计算平台,主要设计用于与健康护理相关的服务,主要负责以下内容:

    • 深度学习模型训练

    • 数据分析

模型训练组件将训练必要的深度学习模型,用于分类或分类来自患者的各种生理信号以及背景数据,以做出明智的决策。健康云将接收来自 Raspberry Pi 3 的各种数据,其中一些数据可能相互冲突。在这种情况下,数据分析工具将分析并展示数据,以供医疗专业人员做出决策。

  • 护理提供者:护理提供者可以是提供护理服务的医院或诊所。由于许多患者患有多种慢性病,大多数需要与不止一位专科医生直接或间接联系。一旦医生收到患者及其环境的信息,他们将根据其他数据(包括来自电子健康记录(EHR)的历史数据)做出决策。决策做出后,结果将反馈给患者,并在必要时通过适当的设备(如胰岛素泵)执行决策。

基于 ECG(心电图)的心脏健康检查是上述用例中的一个重要元素。在本章的第二部分,我们将描述基于深度学习的 ECG 测量分类的实现,以便于先前用例的实施。

用例二 – 用于痤疮检测和护理的物联网

痤疮是世界上最常见的皮肤病之一。大多数人在一生中的某个阶段都会受到痤疮的影响。通常,痤疮出现在面部,并以斑点(如下图所示)和油性皮肤的形式出现。有时,皮肤可能会变得发热或触碰时感到疼痛。痤疮可以表现为白头、黑头、脓疱、丘疹、囊肿和结节。前三种也被称为粉刺。不同类型的痤疮需要不同的治疗和护理;因此,痤疮的检测和自动分类可能会很有用。痤疮可能与三种类似的皮肤病混淆——玫瑰痤疮、湿疹或过敏反应——因为患者通常会自行诊断和治疗。错误的诊断和治疗可能会使病情加重。以下图展示了痤疮的两种表现形式:

一般来说,痤疮不仅是一个身体健康问题,对于许多患者来说,还是一个心理健康问题。根据研究,痤疮与抑郁症密切相关。在《英国皮肤病学杂志》上发布的一项研究中,研究人员分析了 1986 年至 2012 年间英国患有痤疮的患者记录,并对这些患者的心理健康问题做出了强有力的结论。他们得出结论,患有痤疮的患者发展为抑郁症的风险比没有痤疮的患者高出 63%。

在本章中,我们将介绍一种创新的解决方案,使用物联网(IoT)和深度学习(DL)模型来解决痤疮检测/诊断问题。

用例二的实现

大多数患有痤疮及相关皮肤病的人使用镜子来检测痤疮并监测治疗进展。因此,创新的想法是创建一面智能联网镜子,帮助用户检测和识别皮肤(主要是面部)异常,包括痤疮。

以下图展示了实现自动痤疮检测、分类和护理服务的物联网基础设施:

如图所示,基于物联网的自动痤疮检测、分类和护理系统由三大元素组成——智能镜子、护理提供者和健康云:

  • 智能镜子:这是解决方案的核心,包含以下三个组件:

    • 摄像头:镜子内置高分辨率摄像头,能够以嵌入的方式捕捉面部图像。镜子上将有一个按钮,用于激活检测过程,因为患者可能并不总是对该服务感兴趣或有需求。镜子还将有一个小显示屏,展示结果和/或护理提供者针对痤疮的建议治疗方案。
    • 边缘计算平台:我们有多种选择,包括智能手机/平板、边缘网关或树莓派 3。在这个用例中,我们考虑使用连接到摄像头的树莓派 3。一旦它接收到图像,它将通过预安装的深度学习模型检测任何皮肤问题,包括痤疮。最终,树莓派 3 将把检测结果及图像发送给护理提供者,以获得治疗建议。此外,还可以在树莓派 3 中集成一个模型(不在本书的范围内),分析面部图像以进行潜在的抑郁症检测,并由精神科医生提供相应支持。
  • 健康云用于模型学习和数据:健康云是一个主要为医疗健康相关服务设计的云计算平台。该平台将用于训练深度学习模型,以实现基于图像的痤疮及其他皮肤问题的检测和分类。健康云还负责更新预先安装在树莓派 3 或物联网设备中的任何模型。

  • 护理提供者:护理提供者可以是提供护理服务的医院和诊所。由于痤疮可能引起抑郁,我们考虑了两位潜在的医生——一位是皮肤科医生,处理皮肤相关问题;另一位是精神科医生,处理抑郁症相关问题。一旦医生收到检测到的信息和图像,他们将结合其他数据(包括患者的历史图像)作出决定。最终,建议的治疗方案或反馈将发送给患者。

在接下来的章节中,我们将描述针对上述使用案例所需的基于深度学习的解决方案的实现。所有必要的代码可以在本章的代码文件夹中找到。

深度学习在医疗健康中的应用

深度学习(DL)模型正不断发展,成为各行业最强大和最有效的计算资源。它们通过改善用户体验和推动更为明智的决策,显著地为各行业创造价值。医疗健康是深度学习的一个重要应用领域,随着异构医疗数据的日益增多,深度学习在这一领域得到了进一步发展。

与许多其他行业不同,健康和医疗行业在多个领域获得了高附加值的应用,包括研究、创新和实际的医疗环境。这些应用中,许多是面向患者的(如癌症的早期检测和预测,以及个性化医疗),而其他应用则是为了改善医疗信息技术各方面的用户体验。下图突出显示了深度学习在医疗健康领域的一些应用领域:

卷积神经网络(CNN)和长短期记忆网络(LSTM)在医疗健康应用中的应用

医疗保健应用产生大量数据,且这些数据来自异构来源,格式也各异。包括来自磁共振成像(MRI)、X 射线和超声的筛查和诊断数据,其中大量数据以图像格式存在。人体生理信号,如肌电图(EMG)、脑电图(EEG)、ECG 和眼电图(EOG)等,是时间序列数据。电子健康记录(EHR)包括结构化数据(如诊断、处方和实验室检查)以及非结构化数据(如自由文本的临床记录)。此外,高通量生物学数据,如基因组学,生成关于人体内部结构的高维数据。所有这些不同的医疗数据都需要机器学习,尤其是深度学习(DL)的支持,以提取有价值的信息并获得有关潜在问题的洞察。

许多深度学习(DL)模型已被用于分析这些异构医疗数据。卷积神经网络(CNN)和长短时记忆网络(LSTM)(递归神经网络,RNN)是最广泛使用的 DL 模型,因为它们的特性与大多数医疗数据类型非常契合。例如,CNN 模型最适合图像处理,并且用于各种医学图像。相比之下,LSTM/RNN 最适合大多数生理信号,因为它们具有处理信号时序特性的记忆特性。ECG 测量值是筛查心血管疾病的关键生理信号之一。因此,远程患者监控系统包括一个基于 DL 的 ECG 信号分析器,用于检测各种心脏病状况,如房颤(AF)。

考虑到 ECG 信号的时间特性,我们将考虑使用 LSTM 来实现远程患者监控系统。此外,我们将测试 CNN 作为 ECG 信号的对比。基于物联网的痤疮检测和护理系统将依赖图像。因此,我们将使用 CNN 架构来实现此系统。这两种 DL 模型在章节中已简要介绍;请参考这些章节以了解概览。

数据收集

健康和医疗保健应用的数据收集是一个具有挑战性的任务,原因包括隐私和伦理问题。在这种背景下,我们决定为这两个应用场景使用两个不同的开源数据集。

应用场景一

用于第一种应用场景的 ECG 数据集是从 2017 年 PhysioNet/计算心脏病学挑战中收集的。该数据集包含 8,528 个 ECG 测量值。这些测量值通过 AliveCor 手持设备记录(如下图所示),有趣的是,这是一个医疗物联网(IoT)应用示例:

ECG 测量的采样率为 300 Hz,噪声通过 AliveCor 设备的带通滤波器去除。每个记录的测量值符合 MATLAB V4 WFDB 格式,由两个文件组成:

  • 一个 .mat 扩展名的文件,呈现主要的 ECG 信号信息

  • 具有.hea扩展名的相应头文件,包含了测量的波形相关信息

数据集包括四种不同类别的信号:正常节律、房颤、其他节律或过于嘈杂以至于无法分类。以下图表展示了这些不同类别的心电图信号的可视化:

房颤是心房快速而不规则跳动的特征,表明心律不正常。其他异常心律被视为其他节律类别。最后,任何不能反映这三类之一的测量,因为噪音太大而无法分类,被定义为嘈杂的测量。基于深度学习模型的分类器需要提取这些测量中的特征,以对来自患者的记录信号进行分类,并与相关的心脏问题进行关联。为了更好地理解和实际实施,需要进一步研究心电图信号,这不在本书的范围内。以下图表展示了正常与房颤心脏信号测量的对比:

用例二

对于痤疮检测和护理系统用例,我们依赖于一个图像数据集。我们从Dermnet 皮肤病图谱中收集了图片,这是一个关于各种皮肤病的开源数据库。数据库包含 23 个数据集,每个数据集都涉及不同的皮肤病,每个类别(包括痤疮和酒渣鼻)都有子类别。由于页面太多,这些数据集不易下载。我们使用 Python 的 Beautiful Soup 模块编写了一个图像爬虫,我们使爬虫通用化,以便读者可以在不同的皮肤病上测试他们的 LSTM/CNN 模型。爬虫image_scraper.py位于本章代码子文件夹use-case-2中。要爬取所有 23 个数据集,请运行以下命令:

python image_scraper.py

以下截图显示了各种皮肤病的下载图像文件夹:

数据探索

在接下来的部分,我们将探索用于两个用例的数据集。具体如下:

  • 心电图数据集

  • 痤疮数据集

心电图数据集

下图显示了包含四类数据的心电图数据集的快照。如图所示,每个信号都具有独特的特征,可以被深度学习模型利用:

我们可以使用可用的代码ecg_singal_explorer.py在本章的use-case-1代码文件夹中生成这种探索结果或类似的结果。

痤疮数据集

我们已经使用了痤疮和酒渣鼻图像数据集。以下截图展示了数据集的文件夹视图,包括各类中的图片数量。不幸的是,正如我们所见,只有四个文件夹或类别有 100 张或更多的图片:

由于我们使用的是 MobileNet v1 架构,任何图像数少于 100 张的类别可能会出现错误。事实上,我们已经测试过,并发现了与数据大小相关的错误。在这种情况下,我们选择了一个减少的数据集,该数据集仅包含四个类别,每个类别的图像数都超过 100 张。

下图展示了经过探索后的减少版痤疮数据集:

数据预处理

数据预处理是深度学习管道中的一个关键步骤。ECG 数据集无法直接用于模型训练和验证。ECG 信号的预处理程序已包含在模型训练和验证代码LSTM_ECG.pyCNN1D_ECG.py中,分别用于运行模型并对输入的.mat数据进行预处理。然而,痤疮图像数据集已经准备好用于训练和验证。

模型训练

如前所述,我们在用例一中使用 LSTM 和 CNN,特别是 1D CNN。在用例二中,我们使用 MobileNet v1。所有这些深度学习实现都支持迁移学习,因此无需从头开始训练即可在物联网设备中使用。

用例一

我们为 ECG 数据分类使用了五层 LSTM 架构,如下图所示:

我们可以通过运行LSTM_ECG.py文件来训练和测试模型,该文件位于本章代码文件夹中的use-case-1子文件夹内:

python LSTM_ECG.py

对于远程患者管理系统中的 ECG 数据,我们还测试并验证了一个 CNN 模型。下图展示了我们用于 ECG 数据集的 CNN 架构。从图中可以看出,CNN 架构由四个卷积层组成:

我们可以通过运行CNN1D_ECG.py文件来训练和测试模型,该文件位于本章代码文件夹中的use-case-1子文件夹内:

python CNN1D_ECG.py

用例二

我们在第二个用例中使用了 MobileNet v1。下图展示了该模型的架构:

为了在痤疮数据集上训练和验证模型,我们需要运行retrain_CNN.py文件,该文件位于本章代码文件夹中的use-case-2子文件夹内。要训练和测试模型我们只需在命令提示符下运行以下命令。

python retrain_CNN.py \
--output_graph=trained_model_mobilenetv1/retrained_graph.pb \
--output_labels=trained_model_mobilenetv1/retrained_labels.txt   \
--architecture mobilenet_1.0_224 \
--image_dir= dataset-Acne-reduced

MobileNet v1 训练的最后两个参数是强制性的,其他参数则是可选的。

模型评估

我们评估了模型的三个不同方面:

  • 学习/(重新)训练时间

  • 存储需求

  • 性能(准确率)

在训练时间方面,在一台带 GPU 支持的台式机(Intel Xenon CPU E5-1650 v3 @3.5 GHz,32 GB RAM)上,LSTM 和 CNN 1D 在 ECG 数据上的训练时间超过一小时,而 MobileNet v1 在痤疮数据集上的训练时间不到 1 小时。

模型的存储需求是资源受限的物联网设备中的一个重要考量。下图展示了我们为两个用例测试的三个模型的存储需求:

如图所示,LSTM 保存的模型占用了 234 MB 的存储空间,CNN 1D 占用了 8.5 MB,MobileNet v1(CNN)占用了 16.3 MB。在存储需求方面,除了当前版本的 LSTM 外,所有模型都可以部署在许多资源受限的 IoT 设备上,包括 Raspberry Pi 3 或智能手机。

最后,我们评估了模型的性能。在这两个用例中,数据集范围内的评估或测试已在桌面 PC 平台/服务器端的训练阶段执行,但我们也可以在 Raspberry Pi 3 或任何 IoT 边缘计算设备上进行测试,因为这些模型是可迁移的。

模型性能(用例一)

以下截图显示了在 ECG 数据集上使用 LSTM 的训练和验证结果。从截图中可以看到,测试准确率始终接近 1.0 或 100%。然而,验证准确率不理想,且在两次不同的模型运行(100 和 500 个 epoch)中,验证准确率在 50%左右。以下截图显示了 LSTM 模型在训练阶段的进展:

以下图表通过 TensorBoard 的日志文件生成,展示了 LSTM 模型在 ECG 数据集上的训练准确率:

以下图表展示了 LSTM 模型在 ECG 数据集上的验证结果的混淆矩阵:

矩阵清楚地显示了 LSTM 模型在 ECG 数据集上的糟糕表现。特别是,它未能识别大多数 AF(异常心律)测量。

LSTM 在 ECG 数据集上的表现不佳,促使我们在该数据集上测试了 CNN 1D 模型。以下图示展示了 CNN 1D 模型在 ECG 数据集上的性能。如图所示,CNN 的单维度模型的测试准确率始终高于 0.96 或 96%(略低于 LSTM 模型),且其验证准确率始终在 0.82 左右,明显高于 LSTM。具备这种准确度的模型应该能够在大多数情况下正确分类患者的心律,并进行相应报告。以下截图显示了 CNN 1D 模型在训练阶段的进展及其最终训练和验证准确率:

以下图表通过 TensorBoard 的日志文件生成,展示了 CNN 1D 模型在 ECG 数据集上的验证准确率:

以下图表展示了 CNN 1D 模型在 ECG 数据集上的验证结果的归一化混淆矩阵:

矩阵清楚地突出显示了该模型在 ECG 数据上的表现远超 LSTM 模型。重要的是,它成功地识别了大多数(87.5%)的房颤(AF)测量值(异常心律)。

通过增加模型网络的密度,CCN 1D 模型的性能可以得到改善,甚至可以接近 100%。然而,这会使得模型变得复杂,训练后的模型需要更多的内存,这使得它不适用于资源受限的物联网设备。

模型性能(用例二)

我们已经在减少后的痤疮数据集上训练并验证了 MobileNet v1 模型。以下截图展示了模型的评估结果。从截图中可以看到,大多数步骤中的训练准确率为 1.0 或 100%,最终的测试准确率为 0.89 或 89%:

以下图表是通过 TensorBoard 生成的,基于模型的训练和验证准确率日志文件,显示了训练准确率在初期步骤中略有不一致,而之后稳定接近 1.0 或 100%。另一方面,验证准确率在 80% 到 89% 范围内略有不一致:

我们相信,即使存在这些不一致,模型仍然能够在超过 80% 的案例中检测到痤疮的类型。

总结

医疗行业正在采用机器学习(ML)和深度学习(DL)技术进行各种应用。物联网(IoT)医疗应用需要采用 ML 和 DL 技术,才能真正实现医疗物联网的目标。本章中,我们尝试展示了基于 DL 的物联网解决方案如何有用,以及它们如何在医疗应用中得以实施。在本章的第一部分,我们介绍了物联网在医疗行业的各种应用概述。随后,我们简要讨论了两个使用案例,通过 DL 支持的物联网解决方案可以改善和/或自动化医疗服务。在本章的第二部分,我们展示了基于 DL 的医疗事件和/或皮肤病检测案例的实践经验。

深度学习(DL)在物联网应用中的使用正在兴起。然而,DL 技术与物联网结合存在一些挑战,这些问题需要尽快解决,以便最大限度地发挥这两种令人兴奋的技术整合的潜力。在下一章,也是最后一章中,我们将识别并讨论这些挑战。此外,我们将提供一些未来的方向,以减轻一些问题。

参考文献

  • Bahar Farahani, Farshad Firouzi, Victor Chang, Mustafa Badaroglu, Nicholas Constant, 和 Kunal Mankodiya,面向雾计算驱动的物联网电子健康:物联网在医学和医疗中的承诺与挑战,《未来一代计算机系统》,第 78 卷,第二部分,2018 年,第 659-676 页

  • 错过的全科医生预约让 NHS 损失数百万:www.england.nhs.uk/2019/01/missed-gp-appointments-costing-nhs-millions/

  • 世界卫生组织,(2017 年 9 月 10 日),非传染性疾病www.who.int/mediacentre/factsheets/fs355/en/

  • MACAELA MACKENZIE,粉刺如何影响心理健康的各种方式www.allure.com/story/how-acne-affects-mental-health-depression

  • Vallerand IA, Lewinson RT, Parsons LM, Lowerison MW, Frolkis AD, Kaplan GG, Barnabe C, Bulloch AGM 和 Patten SB:在英国患有粉刺的患者中抑郁的风险:基于人群的队列研究,Br. J. Dermatol,(2018)178(3):e194-e195

  • Riccardo Miotto, Fei Wang, Shuang Wang, Xiaoqian Jiang 和 Joel T Dudley,医疗健康的深度学习:回顾、机遇和挑战,Briefings in Bioinformatics,Volume 19,Issue 6,2018 年 11 月,pp. 1236–1246

  • Goldberger AL, Amaral LAN, Glass L, Hausdorff JM, Ivanov PCh, Mark RG, Mietus JE, Moody GB, Peng C-K, Stanley HE。PhysioBank, PhysioToolkit 和 PhysioNet:复杂生理信号的新研究资源的组成部分Circulation(2000)101(23):e215-e220

  • AliveCor:www.alivecor.com/

  • 皮肤病图谱 Dermnetwww.dermnet.com/dermatology-pictures-skin-disease-pictures/

第十章:接下来 - 总结与未来方向

物联网的使用将通过各种应用无处不在地融入我们的生活,包括连接医疗、智能家居和智慧城市。尽管物联网应用令人兴奋,但在全面实现之前,仍面临重大的科学和技术挑战。物联网的一个关键技术挑战是设计和开发适用于资源受限的物联网设备或边缘/雾计算设备的深度学习DL)模型,并满足实时响应的要求。在本章的最后,我们将首先总结前几章的内容,然后通过实例讨论现有深度学习技术在资源受限和嵌入式物联网环境中的开发和实施面临的主要挑战。最后,我们将总结一些现有解决方案,并指出一些潜在的解决方案,以填补深度学习驱动的物联网分析中的空白。

本章我们将涵盖的主题如下:

  • 本书中我们做了什么?

  • 在资源受限的物联网设备中设计和开发深度学习(DL)模型的挑战

  • 支持资源受限物联网设备中深度学习的现有解决方案

  • 潜在的未来解决方案

本书中我们涵盖了哪些内容?

大多数物联网应用正在生成——并且将生成——大量或快速/实时流数据。对这些大数据或数据流的分析对于获取新信息、预测未来趋势和做出明智决策至关重要。机器学习,包括深度学习(DL),是这一分析的关键技术。近年来,深度学习模型在物联网应用中的数据分析方面取得了进展。然而,在物联网领域,缺乏对深度学习模型的整体应用视角。本书努力填补这一空白,通过展示来自不同领域的物联网应用及其基于深度学习的实现,弥补了这一空白。

在本书的第一章,我们介绍了物联网的概述、关键应用以及物联网解决方案的三层端到端视图,这有助于了解和应用深度学习驱动的数据分析在物联网生态系统中的应用。我们概述了深度学习及其流行的模型和实现框架,包括 TensorFlow 和 Keras。在接下来的章节(3-9)中,我们展示了深度学习模型在不同物联网应用领域提供的各种通用服务(如图像处理),并通过各种用例进行了说明。下表总结了各章的关键活动:

从表格中可以看出,卷积神经网络(CNN)及其变种在大多数情况下被广泛应用。一个潜在的原因可能是,CNN 模型在图像数据集上表现非常出色,而大多数数据集要么是图像,要么可以转换为图像(如语音数据)。表格中呈现的模型性能,以及章节中展示的性能,并不是最终的性能值;它们只是指示性性能值,因为深度学习模型对数据的结构和大小非常敏感。数据集和/或深度学习架构的结构变化可能会改变模型的性能。一般来说,相比于浅层模型,深度学习模型在大数据集上通常能更好地工作,且这些数据集拥有广泛的特征。

资源受限的物联网设备中深度学习解决方案的部署挑战

尽管本文中展示的物联网应用案例及其基于深度学习的实现展示了深度学习在物联网中的潜力,但在许多方向上仍然存在一些未解决的研究挑战。特别是,许多领域仍需要研究和开发的支持。以下是一些关键的研究与开发领域,包括数据集预处理、安全和隐私感知的深度学习、大数据处理的各个方面,以及资源高效的训练与学习。在接下来的章节中,我们将简要地从机器学习的角度以及从物联网设备、边缘/雾计算和云计算的角度介绍这些剩余的挑战。

机器学习/深度学习的视角

近年来,机器学习和深度学习技术已被应用于多个领域,以做出更加明智的决策。然而,机器学习和深度学习也面临一些特有的挑战,具体如下:

  • 缺乏大型物联网数据集:许多物联网应用领域正在采用深度学习进行数据分析。不幸的是,这些现有工作,包括本书,依赖于用于模型训练和测试的数据集,这些数据集并非来自物联网应用和/或真实生活应用。其后果之一是,许多物联网特有的问题未能在模型中得到显著体现。例如,物联网设备比通用计算设备更容易发生硬件故障。在这种情况下,使用通用计算数据进行物联网应用的预测可能会导致错误的事件预测。此外,硬件故障可能被误报告为安全事件。再者,这些数据集大多不足够大,无法有效地克服过拟合问题。

所有与数据集相关的问题都是基于 DL 的物联网分析部署和接受的重大障碍。数据集是经验验证和评估物联网系统在现实世界中能够无障碍或仅有最小问题地运行的关键需求。访问现有数据集的能力是另一个许多人(包括我们在本书中的作者)面临的大问题。医疗健康和人体活动检测是物联网的主要应用领域;然而,它们相关的数据通常受到版权或隐私保护的限制,无法让我们完全自由地使用这些数据。许多网络资源已经编制了有用数据集的一般列表。类似的集合将对物联网应用开发者和研究人员大有帮助。

  • 预处理:预处理是深度学习(DL)中的一个关键步骤,它将原始数据处理成适合输入 DL 模型的表示。与 DL 的许多其他应用领域不同,在物联网(IoT)应用中,传感器和/或物品生成的数据格式各异,因此这是一个挑战。例如,考虑一个远程患者监测的物联网应用。该应用需要使用各种传感器,而这些传感器生成的数据格式不同。为了使用这些数据并对患者做出集体且正确的决策,我们需要在将数据应用到 DL 模型之前对其进行预处理。

  • 安全和隐私保护的 DL:安全和隐私是物联网的头号挑战。因此,大多数物联网应用都在致力于确保数据在端到端生命周期中的安全和隐私。通常,物联网的大数据通过互联网传输到云端进行基于 DL 的分析,这些数据可能被全球范围内的人或设备查看。许多现有应用依赖于数据匿名化来保护隐私,但这些技术并非防黑客攻击的绝对保障。有趣的是,大多数人讨论的是物联网设备生成的数据的安全和隐私问题,但运行在这些数据上的操作(包括机器学习和深度学习)的安全性如何呢?事实上,DL 训练模型也可能遭受各种恶意攻击,包括虚假数据注入FDI)或异常样本输入。通过这些攻击,物联网解决方案的许多功能性或非功能性要求可能会遭遇严重威胁,甚至使得解决方案对于预期目标变得无用或甚至危险。因此,机器学习和 DL 模型需要配备机制来发现异常或无效数据。在主模型之上添加一个数据监控 DL 模型,可能是一个潜在的解决方案。为了防御这些攻击并确保 DL 模型能够使物联网应用变得有用和可靠,还需要进一步的研究和开发来解决安全问题。

  • 大数据问题(六个 V):物联网应用是大数据生成的重要来源之一。因此,深度学习在大数据面临的挑战,也是深度学习在物联网中面临的挑战。物联网大数据的每一个特征(六个 V:体量、种类、真实性、速度、变异性和价值)都会对深度学习技术构成挑战。在接下来的几点中,我们简要讨论它们所面临的挑战。

  • 数据量巨大给深度学习(DL)带来了巨大的压力,特别是在时间和结构复杂性方面。时间在实时物联网应用中是一个严重的问题。大量的输入数据、异质属性和分类变异性可能需要一个高度复杂的深度学习模型,这种模型可能需要更长的运行时间和巨大的计算资源,而这些资源在大多数物联网应用中是无法获得的。深度学习模型通常在模型学习过程中能很好地处理噪声和未标注数据。然而,物联网的大量噪声和未标注数据可能会面临一些问题。

  • 来自异质源和/或设备的物联网数据格式的异质性(多样性)可能成为物联网应用中深度学习模型的一个问题。如果这些数据源彼此冲突,可能会成为一个严重的问题。许多物联网应用产生连续的实时数据,并且需要实时响应,而在物联网设备中,这并非总是可能的。基于流的在线学习是一个潜在的解决方案。然而,进一步的研究是必需的,以便整合在线学习和顺序学习方法,以解决物联网中数据流速度的问题。

  • 许多应用中数据的真实性(准确性),例如医疗保健、无人驾驶汽车和智能电网,是一个强制性的要求,这可能会给物联网中的深度学习模型带来挑战。缺乏真实数据可能使物联网的大数据分析失去作用。因此,需要在数据分析的每个层级检查数据验证和真实性。数据的变异性,例如数据流速,可能会给在线流数据处理带来额外的挑战。

  • 最后,清楚地理解物联网采纳及其相关大数据的商业价值至关重要。然而,大多数决策者未能理解这一价值。

深度学习的局限性

尽管在各个应用领域取得了巨大成功,深度学习模型在未来仍有许多问题需要解决。例如,任何深度学习模型做出的虚假声明,如果人类无法识别,也是一个问题。深度学习模型缺乏回归能力是许多物联网应用中的一个问题,因为它们需要某种回归作为核心分析组件。一些研究已经提出了将回归能力整合到深度学习模型中的解决方案。我们需要在这个方向上进行更多的研究。

下图总结了与深度学习视角相关的关键挑战:

IoT 设备、边缘/雾计算和云视角

如我们在第一章《物联网的端到端生命周期》中提到的,端到端物联网解决方案由三个不同的关键组件或层次构成,主要包括物联网设备、边缘/雾计算和云平台。所有这些组件在深度学习(DL)实现方面都有各自的挑战。以下是我们将简要讨论的这些挑战:

  • 资源受限的物联网设备:物联网设备在处理器、电池能量、内存和网络连接方面资源有限。为传统计算机开发的深度学习模型可能无法直接在物联网设备上使用。更重要的是,物联网设备无法进行深度学习模型的训练,因为训练过程是一个资源密集型操作。对于本书中的所有深度学习模型训练,都是在一台强大的桌面计算机或云平台上完成的。在某些情况下,资源稀缺到预训练模型无法在设备上进行推理。正如以下截图所示,在第三章《物联网中的图像识别》中讨论的两个 CNN 实现版本,图像分类需要大约 90 MB 的存储空间来存储其预训练模型,而许多物联网设备可能没有足够的存储空间。因此,我们需要轻量级的深度学习模型,特别是轻量级的预训练深度学习模型。有许多现有的解决方案可以解决物联网设备相关问题,接下来我们将简要介绍这些解决方案:

  • 边缘/雾计算:边缘/雾计算正在成为物联网解决方案中一种流行的计算平台,特别是对于实时应用,因为这些应用中使用的数据不需要始终移动到云平台。然而,这项技术仍处于初期阶段,面临许多挑战,包括以下几点:

    • 设备的深度学习服务发现:边缘/雾路由器或网关将在地理上分布,并将向物联网最终用户/节点提供基于特定深度学习模型的服务。例如,一个雾节点可能通过卷积神经网络(CNN)提供图像分类服务,而另一个附近的节点可能通过长短期记忆网络(LSTM)提供入侵检测服务。在这种情况下,设备需要服务发现协议,能够根据它们的需求和上下文高效地发现适合的数据显示服务。

    • 深度学习模型和任务分配:雾计算可能依赖分布式学习方法,通过在不同的雾/边缘节点之间共享学习任务来分担学习责任。这将需要一些时间来拆分深度学习模型的执行过程以及任务分配,这可能会成为实时物联网应用的一个问题。

    • 移动设备作为边缘设备:智能手机无处不在,正成为物联网生态系统中的关键元素。然而,这些设备在加入/离开网络方面的动态特性对依赖它们的深度学习分析服务构成了挑战,因为它们随时可能离开网络。此外,它们的能耗和其他与资源相关的准确信息需要在任务分配器处可用,以便为它们分配适当的任务。

  • 云计算:云计算是物联网大数据分析的一个重要平台。然而,其响应时间以及法律/政策限制(例如数据可能需要从安全边界迁移)可能成为许多物联网应用的问题。此外,物联网数据在处理和存储过程中的安全性与隐私性也是许多物联网应用所关注的问题。

以下图表总结了物联网设备、边缘/雾计算和云计算视角中的关键挑战:

支持深度学习在资源受限物联网设备中的现有解决方案

通常,深度学习模型需要计算超大规模(数百万到数十亿个)的参数,这需要一个强大的计算平台和巨大的存储支持,而这些在物联网设备或平台上并不可得。幸运的是,现有的一些方法和技术(本书中未使用,因为我们在桌面上进行了模型训练)可以解决物联网设备中的一些问题,从而支持深度学习在这些设备上的应用:

  • 深度学习网络压缩:深度学习网络通常非常密集,需要大量的计算能力和内存,而这些在物联网设备中可能并不具备。这对于进行推理和/或分类是必需的。深度学习网络压缩通过将密集网络转化为稀疏网络,为资源受限的物联网设备提供了一种潜在的解决方案。许多现有的服务,包括 Mobilenet V1 和 V2,都已测试过这项技术。例如,CNN 的 Incentive V3 架构可以通过使用 Mobilenet V1 架构,将 87.0MB 的存储压缩到 17.0MB(如我们在第三章 物联网中的图像识别 中演示的那样)。然而,这种方法仍然不够通用,无法用于所有深度学习模型,压缩技术可能需要特定的硬件才能进行操作。

  • 深度学习的近似计算:这种方法通过将预测视为一系列可接受值的一部分,而不是精确值(例如 95% 的准确率),因为许多物联网应用可能不需要精确的数值。例如,许多事件检测应用只需要检测到事件的发生,而不需要预测事件的准确度。近似计算能够节省能源,但不适用于对精确值有要求的关键应用(例如医疗护理)。

  • 加速器:基于硬件的加速器在深度学习模型中已获得了一些研究和开发的关注。专用硬件和电路可以用来减少内存占用并提高能效,以在物联网设备上运行深度学习模型。此外,软件加速也可以用于此类任务。然而,加速器可能无法与传统的物联网硬件兼容。

  • Tinymotes:研究人员正在开发小型节点,这些节点通过硬件加速器支持,在电池供电的情况下执行基于板载的数据分析。它们对于实时应用非常有用。然而,它们主要用于特定目的的深度学习网络,安全性是其中的一个问题。

潜在的未来解决方案

在本节中,我们将简要讨论一些潜在的研究和开发解决方案,以应对前述问题。

  • 分布式学习:在本书中,模型学习或训练是集中进行的,但在许多物联网应用中,这种方式可能不可行。在这种情况下,分布式学习可能是一个潜在的解决方案。然而,分布式计算存在安全问题,这可以通过基于区块链的分布式学习来最小化。

  • 物联网移动数据:智能手机是物联网普及的关键推动力。通过深度学习模型进行移动大数据分析的高效解决方案,可以在各种应用领域提供更好的物联网服务,包括智慧城市。该领域需要进一步的研究。

  • 情境信息的集成:情境信息对于正确使用和解读基于深度学习的数据分析至关重要。然而,通过物联网传感器数据来理解物联网应用的环境情境是非常困难的。将环境传感器数据与物联网应用传感器数据融合,可以提供情境信息。因此,开发集成情境信息的基于深度学习的解决方案可能是未来的另一个方向。

  • 边缘/雾计算中的在线资源调度:对于实时数据分析流处理的物联网数据,边缘/雾计算资源的需求可能是动态的。因此,在线或按需的资源调度是必要的,以为各种物联网应用提供数据分析服务。虽然已有一些提案,但它们主要集中在特定的应用领域。还需要进一步的研究,以适应更广泛的物联网应用。

  • 半监督数据分析框架:监督式数据分析需要大量标注数据,而对于许多物联网应用来说,标注数据并不总是能得到。通常,我们会有更多未标注的数据而非标注数据。因此,半监督框架可能是更好的选择。目前已有一些相关的举措,但还需要进一步的工作来支持这一解决方案的应用。

  • 安全的深度学习模型:基于深度学习的数据分析只有在正确运行并且其非功能性属性(如可信度和可用性)得到保障时才会有用。然而,深度学习模型可能成为各种恶意攻击的目标,使其变得脆弱。在这一领域的研究和开发非常有限,这可能是未来的一个研究和开发方向。

总结

这是最后一章,在本章中,我们回顾了前几章的总结,并讨论了现有深度学习技术在资源受限和嵌入式物联网环境中的主要挑战。我们从机器学习的角度以及物联网解决方案的组成部分(如物联网设备、雾计算和云计算)的角度讨论了这些挑战。最后,我们总结了一些现有的解决方案,并指出了未来可能的解决方案方向,这些方向可以弥补基于深度学习的物联网分析现有的空白。

参考文献

  • 人工智能skymind.ai/wiki/open-datasets

  • 机器学习研究的数据集列表en.wikipedia.org/wiki/List_of_datasets_for_machine-learning_research

  • 物联网大数据与流式分析的深度学习:综述,M Mohammadi,A Al-Fuqaha,S Sorour 和 M Guizani,发表于 IEEE 通信调查与教程,第 20 卷,第 4 期,第 2,923-2,960 页,2018 年第四季度

  • 使用哈希技巧压缩神经网络,W Chen,J T Wilson,S Tyree,K Q Weinberger 和 Y Chen,发表于第 32 届国际机器学习会议论文集,第 37 卷。JMLR: W&CP,2015 年

  • 集成深度学习用于回归和时间序列预测,发表于《集成学习中的计算智能(CIEL)》2014 IEEE 研讨会。IEEE,2014 年,第 1–6 页

posted @ 2025-07-08 21:23  绝不原创的飞龙  阅读(22)  评论(0)    收藏  举报