学术堂首页 | 文献求助论文范文 | 论文题目 | 参考文献 | 开题报告 | 论文格式 | 摘要提纲 | 论文致谢 | 论文查重 | 论文答辩 | 论文发表 | 期刊杂志 | 论文写作 | 论文PPT
学术堂专业论文学习平台您当前的位置:学术堂 > 计算机论文 > 软件工程论文

智能家居系统预测模块

来源:学术堂 作者:姚老师
发布于:2017-02-07 共4391字

  4.4 预测模块

  预测模块是整个系统的核心模块,在预测模块中,我们使用 TensorFlow 训练了人工神经网络,再使用训练后的神经网络对最新数据进行预测,最后把结果返回到任务管理模块中。

  4.4.1 整体流程。

  根据 TensorFlow 的设计模式,我们首先要按照我们设计的人工神经网络模型,确定整个机器学习过程中数据的流向,确定整个机器学习的流程,也就是要得到数据流图。而根据上文中的分析,我们可以得到 TensorFlow 的数据流图。

  从数据流图中,我们可以看到整个系统如下的运行流程:

  1. 将输入数据按要求格式填充到输入 tensor 中。

  2. 经过两个隐藏层,在隐藏层中先后将输入数据与权值相乘,再加上偏移,最后做 ReLu 变换后输出。

  3. 经过 Softmax 层得到最终输出。

  4. 将人工神经网络输出作为梯度下降的输入,对误差进行梯度下降求解。

  通过将数据作为机器学习的特征[31]输入之后,我们就可以得到训练后的目标人工神经网络,在需要对数据进行预测时,我们可以把数据组合之后,输入的人工神经网络中,得到目标输出,最后通过使用 TensorFlow 提供的 argmax 函数得到预测得到的具体档位。

  Argmax函数在TensorFlow中的说明是返回一个向量tensor中最大值的序号。

  也就是我们希望找到的那个趋近于 1 的值,也就是我们希望找到的档位值。

  4.4.2 输入输出。

  在智能家居中,最常见的数据就是各传感器采集数据和各个设备状态的数据,通过把传感器数据与设备状态数据结合到一起,我们可以得到按时间顺序的输入数据,在本文的实现中,我们使用了马萨诸塞大学所提供的一个家居监测数据集,其数据为对一个房子进行为期三个月的监测得到的数据,该数据集包含了多个子数据集,其中环境数据集所包含的数据和数据范围。

  还有用电器状态数据集,其类别为:时间戳,室内各个房间的台灯状态,吊灯状态,风扇状态,加热器状态等,其范围为 0 或 1,表示用电器的开或关状态。

  其它还有用电器参数与用电量数据集。其中温度数据为华氏温度,范围大多在40 到 90 之间,湿度为百分比数据,用电器状态通过 0 和 1 表示开关。

  在本文实现中,我们主要使用了环境数据集和用电器状态数据集,将数据集去除固定参数数据,方向数据等无关数据后,将同一时间点的数据组合成为一个数据组合作为一条输入数据,两个时间点之间相差 300 秒。由于环境监测数据中,所有数据都是以 300 秒的时间间隔提供的,所以在去除无关数据后,环境监测数据可以直接使用。而设备的状态数据相对复杂,不同的设备在采集状态信息时不能够保证位于同一时间点,所以设备数据出现的时间点不统一,而且相对数据量比环境监测数据要多。于是我们需要把各设备的数据分离,按照时间排序后,通过与环境监测数据的时间进行比较,找到最接近环境监测数据时间点的设备状态,加入数据集中。从而得到在各个 300 秒时间间隔点的数据。

  同时考虑到数据的单位不同,数据差异较大,我们使用了如下公式对数据进行归一化处理。

  使得数据值都在 0-1 之间。由此我们可以得到一个 34 维的输入数据,输入数据总数为 25904 条。

  对于这些数据,我们把数据分为三个数据集,前 60%为训练集,中间 20%为验证集,最后 20%为测试集。在每次计算时,我们随机从相应数据集中返回 128条数据进行一次计算。

  对于输出数据,由于在数据集中,设备的状态为开和关,所以我们的输出数据使用 0 和 1 对应开和关状态,在神经网络中,我们使用一个二维的向量表示这两个状态,分别是[0, 1]和[1, 0],向量中 1 的位置表示结果为 0 或 1.在上文使用的数据集中,我们已经有设备的状态数据,我们从中选择一个设备数据进行时间段的预测,用以展示预测的准确性。在本文中,我们使用了卧室的风扇数据作为示例。

  由此,我们得到二维的目标数据。对于一些多档位的设备,如空调,窗帘等,我们可以相应使用多维向量作为输出目标数据,在此由于数据集没有包含多个档位的数据,我们在下文使用了另一个数据集,对神经网络的多档位分类功能进行了认证。

  4.4.3 神经网络。

  考虑到智能家居系统需要经常对数据进行分析,在数据发生改变后需要重新进行学习过程,而且有一定实时性要求,我们不能够使用过于复杂的神经网络,其会导致学习和预测时间大量增加,使得出现时间上的问题。而在使用前反馈神经网络后,我们可以看到预测的准确性可以满足需求,所以本文使用了前反馈神经网络进行分析学习和预测。

  神经网络中对于隐含层层数和节点数的确定,现在并没有一个很好的方法可以给出明确的结论,所以现在很多时候都是凭借经验进行试探性选择,在参考了一些文献[32][33]后,本文选择了使用两个隐含层。

  进行节点数计算,其中 l 为节点数,m 为输入数,n 为输出数,a 为 1 到 10 之间任意常数。考虑到输入数据为 34 维向量,输出数据为 2 维向量,每次输入样本数为 128 条,经测试确定,两个隐含层中均使用了 15 个节点进行运算,此时梯度下降可以收敛而不会出现过拟合现象。由此,我们得到了一个四层的神经网络。

  在对神经网络的训练过程中,需要确定学习率,但类似于隐含层的选择,学习率也没有能够较好确定的方法,一般使用的学习率都在 0.01 到 0.1 之间。这此我们使用了 0.05.

  4.4.4 具体实现。

  在 TensorFlow 中,使用的是 placeholder 来存放输入数据,所以本文根据数据管理模块所读入的数据动态生成三个 placeholder:

  1. x,样本数和特征数大小组成的 float32 型二维 placeholder,用以存放训练集,交叉验证集的 x 数据。

  2. y,样本数大小的 int32 型一维 placeholder,用以存放预期目标。

  3. predict_x,特征数大小的 float32 型一维 placeholder,用以存放需要预测的数据。

  完成 placeholder 的初始化后,再生成训练集,交叉验证集,测试集,预测数据的四个生成器,以在需要读取数据时,动态使用生成器读入相应数据。

  接下来进入人工神经网络部分,第一次进行人工网络训练时,我们没有可用的初始训练参数,所以使用 TensorFlow 提供的 truncated_normal 生成一个符合大小的正态分布随机矩阵,再生成一个全为 0 的偏置向量,完成了数据的准备,我们就可以把输入数据与参数进行计算。

  至此,我们得到了第一个隐藏层的计算结果 A.类似地,我们把 A 作为输入数据传至后面的神经网络,我们可以相应得到整个人工神经网络的输出 logits.

  Logits 是我们通过一次人工神经网络计算得到的矩阵,其每一行作为一个向量表示档位向量,为了求出其误差,我们把预期输出也转换为向量,并把向量组合为一个与 logits 相同大小的矩阵 Y,再通过使用 TensorFlow 提供的softmax_cross_entropy_with_logits 计算 logits 与预期输出的误差。得到误差计算方法后,我们就可以使用梯度下降法,使用 0.01 作为学习率,使用误差作为输入,对人工神经网络进行训练,从而得到目标人工神经网络。

  最后,只需要把目标数据输入到人工神经网络中,就可计算得到最后的结果,返回到任务管理模块中。
 

  4.5 网络通信模块
  
  网络通信是与智能家居系统对接的桥梁,所有与智能家居系统进行的交互都是通过网络通信模块完成[34].

  网络通信模块暂时完成两个任务,一个是通过 request_nodes 函数为接口,向服务器请求节点列表;另一个是提供 send_command 函数为主要接口,完成智能家居网络向服务器发送命令操作。

  服务器采用 UDP 协议建立服务端,使用 UDP 协议一方面使得服务器可以不用保持连接,节约服务器资源,另一方面服务器开启之后,可以允许客户端以一对多的方式连接到服务器上,增加同一时间的连接数。

  4.5.1 请求节点列表。

  对于服务器而言,其记录了所有已经入网的设备,在服务器端有着智能家居系统的节点管理系统,所有操作都通过以客户端的形式接入服务器完成。所以本文系统也采取同样的规则,向服务器请求节点列表,用于对上文所述应用。

  其中数据格式包含四个部分:

  1. 头,所有智能家居系统中的 TCP/IP 网络包都以 0x40,也就是 ASCII 码中的"@"字符开始,标记一个消息的开始。

  2. 长度,表示这个消息中,所有数据的长度,在数据生成时,动态地确定值,在此是 0x04,表示一共有 4 个节点。

  3. 类型,智能家居系统中各种网络包都有特定的类型,其中 0x0F 表示此消息包是向服务器请求节点列表。

  4. 校验和,所有网络包都需要确定其数据的正确性,其中最简单高效的方法之一就是校验和,先为其赋值为 0x00,然后通过把所有数据按字节相加,得到的值的最后一个字节作为校验和,同理,收包方做相同的处理,确定数据的正确性。

  在服务器收到请求节点列表命令之后,会向客户端,也就是网络模块,返回已连接至服务器的所有节点列表和其地址。

  服务器返回的消息中的数据以 0x404142 为起始标志,后面是一连串的节点数据,通过在各类节点数据前加入本类节点的计数表示一类节点的数量,例如第一类为窗帘,其计数为 n,表示一共有 n 个窗帘,从计数 1 之后的 2n个数据为窗帘列表,分别是节点名和节点地址,在所有节点名和地址之间通过使用 0x00 作为分隔符表示间隔,如此类推,我们就可以得到所有节点的列表。

  通过上文的节点列表可以看到,列表中并没有节点的优先级数据,这是由于服务器没有优先级需求,所以在节点列表中并没有优先级数据,因此,本系统在接收到节点列表同时对节点以类型作为分类,为节点列表赋予了优先级,用于上文中的通过优先级进行不同时间间隔的人工神经网络训练。

  4.5.2 发送命令。

  机器学习系统的主要目的之一就是为智能家居提供智能分析并执行,所以网络通信模块的另一个重要功能就是向服务器发送命令请求执行操作。考虑到在初始阶段预测的结果与用户预期不一定十分一致,还有预测结果一旦出错,对用户的体验影响过大,所以设计中对命令的处理流程。

  首先在得到预测结果后,并不为每个结果都送发需要执行的命令,而是先通过判断状态变化幅度,如果变化幅度小于某一阈值,则判定为不需要执行操作,否则才向用户发出执行提醒,而且,系统并不直接为用户执行操作,而是向用户手中的移动客户端发送执行提醒消息,在得到用户的允许之后再执行。

  其中,对结果变化幅度的判断是为了减小对用户的影响,出现类似于状态闪烁的情况,频繁改变当前状态;发送提醒而不直接执行是为了解决上文提到的失败代价过大的问题。

  执行流程主要由服务器完成,在此更多关注对命令的发送。在向服务器发送命令时,也是通过服务器提供的命令接口完成,其中命令的数据格式。

  数据模式中前面部分都与前方相同,主要区别是后面两个部分。

  1. 命令长度,由于控制命令各类繁多,所以采用了动态长度方式以减少网络数据,命令长度指的是最后一部分命令的长度值。

  2. 命令部分根据不同的设备会有不同的命令格式。

  命令部分与设备相关性比较高,例如窗帘的命令格式。

  可以看到,窗帘的集合只需要两个字节就可以完成,其中操作部分共有三个可能值:

  1. 0x01,表示开操作,后面接档位,表示把窗帘开至第几档2. 0x02,表示关操作,后面接档位,表示把窗帘关至第几档3. 0x03,表示停止窗帘开关,后面字节不用考虑。

  其它设备格式与窗帘类似。

相关标签:
  • 报警平台
  • 网络监察
  • 备案信息
  • 举报中心
  • 传播文明
  • 诚信网站