摘要:2017年深度学习框架关注度排名tensorflow以绝对的优点占领榜首,本文经过使用tensorflow优化过去一个使用特征提取方法的框架,证明了深度学习的优秀性能。
时间序列分析是一种动态数据处理的统计方法。根据对系统进行观测获得的时间序列数据,用曲线拟合的方法对系统进行客观的描述。算法
现在,时间序列数据出如今金融,信号处理,语音识别和医学等诸多领域。解决时间序列问题的标准方法一般须要手动提炼数据特征,而后才能将其输入到机器学习算法中。这一般还要求开发设计人员掌握数据所属学科领域的知识特征,以便在算法中加入特征过滤。例如,若是处理信号(即EEG信号的分类),则须要掌握的知识特征涉及各类频带的功率谱及Hjorth参数。对于认真钻研本领域的程序猿来讲,这简直就是噩梦。数组
那么是否是不掌握这些学科领域的知识特征,咱们就没有办法进行模型设计了呢?网络
其实答案否则,在图像分类领域也出现了相似的状况。可是,随着深度学习的出现,卷积神经网络(CNN)的性能已经能够赛过这种人工提取特征的方法。CNN不须要任何手动设置任何的图像特征。在训练过程当中,随着层次愈来愈深,CNN愈来愈复杂,进而它本身会学习获得许多“过滤器”,并在最终的分类器中使用它们。架构
在这篇博客文章中,我将讨论使用深度学习的方法对时间序列数据进行分类,而无需手动设计特征。我在本文中将使用到的例子是UCI存储库中经典的人类活动识别(HAR)数据集。该数据集包含原始时间序列数据,以及具备561个预处理数据的工程特征。在博客中我会比较使用工程特征与深度学习这两种方法(卷积和复现神经网络),并代表深度学习能够超越前者的性能。框架
在本文中我将使用Tensorflow来实现和训练博客中所用到的模型。在下面的讨论中,提供了代码片断来解释实现过程。有关完整的代码,请参阅个人Github资源库。机器学习
第一步是将数据投射到具备必定形状的numpy数组中:(batch_size, seq_len, n_channels),其中batch_size是训练期间批次中的示例数,seq_len是时间序列的长度(在咱们的状况下n_channels为128),而且是进行测量的通道的数量。在本文的小例子中,有9个通道,每3个坐标轴包括3个不一样的加速度测量。每次观察有6类活动LAYING, STANDING, SITTING, WALKING_DOWNSTAIRS, WALKING_UPSTAIRS, WALKING。函数
首先,咱们为输入到计算图的数据建立占位符:性能
inputs是将输入的张量馈送到计算图,并将其数组第一个位置设置为None,以便容许可变的批量大小。labels_是要预测的一个热编码的标签,keep_prob的做用是在退出正则化中保持几率来防止过分拟合,而且learning_rate_是Adam优化器中使用的学习率。学习
咱们将经过使用移动序列的一维内核构造卷积层(与使用2d卷积的图像不一样)来构造卷积层,这些内核做为在训练过程当中的过滤器。像许多CNN架构同样,层越深,过滤器数越多。每一个卷积以后是聚集层,以此减小序列长度。下面是可能可使用的CNN架构的简单图片:测试
上面描述的卷积层以下实现:
一旦达到最后一层,咱们须要张量平坦化并将其输送到具备正确数量的神经元的分类器中(上图中的144个)。模型功能:
功能实现代码以下:
其他的实施部分涉及向图表馈送批次的训练数据并评估验证集的性能。最后,对测试集进行评估。采用上述架构batch_size=600,learning_rate=0.001(默认值),keep_prob=0.5,500训练次数,咱们获得98%的测试精度。下面的图表显示了训练/验证精度如何经过训练次数演变:
LSTM在处理基于文本的数据方面很是受欢迎,在情感分析,语言翻译和文本生成方面也至关成功。今天咱们就用LSTM来解决咱们今天的问题。
如下是能够在咱们的问题中使用的示例架构:
为了将数据传送到网络中,咱们须要将数组分红128个,每一个的形状咱们定义为:(batch_size, n_channels)。而后,单层神经元将把这些输入转换成LSTM细胞,每个都具备维度lstm_size。该参数的大小选择要大于通道数。这是一种相似于在文本应用程序中嵌入图层的方式。为了实现,占位符与上述相同。如下代码段实现了LSTM层:
上面的代码段中有一个重要的技术细节。我将阵列从新整形(batch_size, seq_len, n_channels)到(seq_len, batch_size, n_channels),这样tf.split就能够在每一个步骤中将数据(由第零个索引)正确地分割成数组列表。其他的是LSTM实现的标准,包括构建层(包括正则化的退出),而后是定义初始状态。
下一步是经过网络实现前向传递和成本函数。一个重要的技术方面利用梯度剪辑,由于它经过防止反向传播期间的爆炸梯度来改善训练。
请注意,仅使用LSTM输出顶部序列的最后一个成员,由于咱们正在尝试每一个序列预测一个数字。其他的相似CNN,咱们只须要将数据提供给图表进行训练。lstm_size=27,lstm_layers=2,batch_size=600,learning_rate=0.0005,和keep_prob=0.5,我得到95%的准确度的测试集。这比CNN的结果还差,但仍是不错的。这些超参数的更好选择会改进的结果。
在此以前,我已经使用561个预先设计的特征测试了一些关于这个问题的机器学习方法。性能最好的模型之一是梯度提高树(gradient booster)(树形或线性),其结果是96%的精确度(您能够从这本笔记本中了解更多信息)。CNN架构优于梯度提高树,但LSTM的性能相较于梯度提高树(gradient booster)就稍差一些。
在这篇博客文章中,我已经说明了如何使用CNN和LSTM进行时间序列分类,并证实深层架构能够赛过预先设计的功能特征训练的模型。除了达到更好的准确性外,深度学习模式还“培养”了本身的功能。这是很是可取的,由于人们不须要具备来自数据来源的领域专长,可以训练准确的模型。
咱们在这篇文章中使用的序列至关小(128步)。人们可能会想,若是步骤数量不少,那么今天我讨论的这些架构的可训练性是否还有?若是有?会发生什么。我认为一种可能的架构将涉及LSTM和CNN的组合,其对于较大的序列(即> 1000,对于LSTM是有问题的)能够更好地工做。由于在这种状况下,具备聚集做用的几个卷积就能够有效地减小前几个层中的步数,而且获得的较短的序列能够被反馈送到LSTM层。这种结构的一个例子最近被用于从移动设备记录的心房颤动检测。若是你有兴趣了解这种长序列的方法能够去研究它。