如何使用最流行框架Tensorflow进行时间序列分析——第二篇

简介: 2017年深度学习框架关注度排名tensorflow以绝对的优势占领榜首,本文通过使用tensorflow优化过去一个使用特征提取方法的框架,证实了深度学习的优秀性能。

更多深度文章,请关注:https://yq.aliyun.com/cloud


看深度学习框架排名第一的TensorFlow如何进行时序预测——第一篇

时间序列分析是一种动态数据处理的统计方法。根据对系统进行观测得到的时间序列数据,用曲线拟合的方法对系统进行客观的描述。

如今,时间序列数据出现在金融,信号处理,语音识别和医学等诸多领域。解决时间序列问题的标准方法通常需要手动提炼数据特征,然后才能将其输入到机器学习算法中。这通常还要求开发设计人员掌握数据所属学科领域的知识特征,以便在算法中加入特征过滤。例如,如果处理信号(即EEG信号的分类),则需要掌握的知识特征涉及各种频带的功率谱及Hjorth参数。对于认真钻研本领域的程序猿来说,这简直就是噩梦。

那么是不是不掌握这些学科领域的知识特征,我们就没有办法进行模型设计了呢?

其实答案不然,在图像分类领域也出现了类似的情况。但是,随着深度学习的出现,卷积神经网络(CNN)的性能已经可以胜过这种人工提取特征的方法。CNN不需要任何手动设置任何的图像特征。在训练过程中,随着层次越来越深,CNN越来越复杂,进而它自己会学习得到许多过滤器,并在最终的分类器中使用它们。

在这篇博客文章中,我将讨论使用深度学习的方法对时间序列数据进行分类,而无需手动设计特征。我在本文中将使用到的例子是UCI存储库中经典的人类活动识别(HAR)数据集。该数据集包含原始时间序列数据,以及具有561个预处理数据的工程特征。在博客中我会比较使用工程特征与深度学习这两种方法(卷积和复现神经网络),并表明深度学习可以超越前者的性能。

在本文中我将使用Tensorflow来实现和训练博客中所用到的模型。在下面的讨论中,提供了代码片段来解释实现过程。有关完整的代码,请参阅我的Github资源库

卷积神经网络(CNN

第一步是将数据投射到具有一定形状的numpy数组中:(batch_size, seq_len, n_channels)其中batch_size是训练期间批次中的示例数,seq_len是时间序列的长度(在我们的情况下n_channels128),并且是进行测量的通道的数量。在本文的小例子中,有9个通道,每3个坐标轴包括3个不同的加速度测量。每次观察有6类活动LAYING, STANDING, SITTING, WALKING_DOWNSTAIRS, WALKING_UPSTAIRS, WALKING

首先,我们为输入到计算图的数据创建占位符:

graph = tf.Graph()
with graph.as_default():
inputs_ = tf.placeholder(tf.float32, [None, seq_len, n_channels],name = 'inputs')
labels_ = tf.placeholder(tf.float32, [None, n_classes], name = 'labels')
keep_prob_ = tf.placeholder(tf.float32, name = 'keep')
learning_rate_ = tf.placeholder(tf.float32, name = 'learning_rate')

inputs是将输入的张量馈送到计算图,并将其数组第一个位置设置为None,以便允许可变的批量大小。labels_是要预测的一个热编码的标签,keep_prob的作用是在退出正则化中保持概率来防止过度拟合,并且learning_rate_Adam优化器中使用的学习率。

我们将通过使用移动序列的一维内核构造卷积层(与使用2d卷积的图像不同)来构造卷积层,这些内核作为在训练过程中的过滤器。像许多CNN架构一样,层越深,过滤器数越多。每个卷积之后是汇集层,以此减少序列长度。下面是可能可以使用的CNN架构的简单图片:

8f27ebf492ab729ebe28bb20c103e63e658412dc

上面描述的卷积层如下实现:

with graph.as_default():
# (batch, 128, 9) -> (batch, 32, 18)
conv1 = tf.layers.conv1d(inputs=inputs_, filters=18, kernel_size=2, strides=1,padding='same', activation = tf.nn.relu)
max_pool_1 = tf.layers.max_pooling1d(inputs=conv1, pool_size=4, strides=4, padding='same')
# (batch, 32, 18) -> (batch, 8, 36)
conv2 = tf.layers.conv1d(inputs=max_pool_1, filters=36, kernel_size=2, strides=1,padding='same', activation = tf.nn.relu)
max_pool_2 = tf.layers.max_pooling1d(inputs=conv2, pool_size=4, strides=4, padding='same')
# (batch, 8, 36) -> (batch, 2, 72)
conv3 = tf.layers.conv1d(inputs=max_pool_2, filters=72, kernel_size=2, strides=1,padding='same', activation = tf.nn.relu)
max_pool_3 = tf.layers.max_pooling1d(inputs=conv3, pool_size=4, strides=4, padding='same')

一旦达到最后一层,我们需要张量平坦化并将其输送到具有正确数量的神经元的分类器中(上图中的144个)。模型功能:

1.    计算softmax交叉熵,这是多类问题中使用的标准损失度量。

2.    从最大概率以及精度预测类标签。

功能实现代码如下:

with graph.as_default():
    # Flatten and add dropout
    flat = tf.reshape(max_pool_3, (-1, 2*72))
    flat = tf.nn.dropout(flat, keep_prob=keep_prob_)
    # Predictions
    logits = tf.layers.dense(flat, n_classes)
# Cost function and optimizer
cost =        tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logits,labels=labels_))
optimizer = tf.train.AdamOptimizer(learning_rate_).minimize(cost)
# Accuracy
correct_pred = tf.equal(tf.argmax(logits, 1), tf.argmax(labels_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32), name='accuracy')

其余的实施部分涉及向图表馈送批次的训练数据并评估验证集的性能。最后,对测试集进行评估。采用上述架构 batch_size= 600 learning_rate  =0.001 (默认值), keep_prob=  0.5 500 训练次数,我们得到 98 的测试精度。下面的图表显示了训练 / 验证精度如何通过训练次数演变:

7cea480d54c18348366dc6a1da66769881ae6c7a

长短期记忆网络(LSTM

LSTM在处理基于文本的数据方面非常受欢迎,在情感分析,语言翻译和文本生成方面也相当成功。今天我们就用LSTM来解决我们今天的问题。

以下是可以在我们的问题中使用的示例架构:

d2cacfd93e952fab7162b5727f1f907910f2a554

为了将数据传送到网络中,我们需要将数组分成128个,每个的形状我们定义为:(batch_size, n_channels)。然后,单层神经元将把这些输入转换成LSTM细胞,每一个都具有维度lstm_size。该参数的大小选择要大于通道数。这是一种类似于在文本应用程序中嵌入图层的方式。为了实现,占位符与上述相同。以下代码段实现了LSTM层:

with graph.as_default():
    # Construct the LSTM inputs and LSTM cells
    lstm_in = tf.transpose(inputs_, [1,0,2]) # reshape into (seq_len, N, channels)
    lstm_in = tf.reshape(lstm_in, [-1, n_channels]) # Now (seq_len*N, n_channels)
    # To cells
    lstm_in = tf.layers.dense(lstm_in, lstm_size, activation=None)
    # Open up the tensor into a list of seq_len pieces
    lstm_in = tf.split(lstm_in, seq_len, 0)
    # Add LSTM layers
    lstm = tf.contrib.rnn.BasicLSTMCell(lstm_size)
    drop = tf.contrib.rnn.DropoutWrapper(lstm, output_keep_prob=keep_prob_)
    cell = tf.contrib.rnn.MultiRNNCell([drop] * lstm_layers)
initial_state = cell.zero_state(batch_size, tf.float32)

上面的代码段中有一个重要的技术细节。我将阵列重新整形(batch_size, seq_len, n_channels)(seq_len, batch_size, n_channels),这样tf.split可以在每个步骤中将数据(由第零个索引)正确地分割成数组列表。其余的是LSTM实现的标准,包括构建层(包括正则化的退出),然后是定义初始状态。

下一步是通过网络实现前向传递和成本函数。一个重要的技术方面利用梯度剪辑,因为它通过防止反向传播期间的爆炸梯度来改善训练。

with graph.as_default():
    outputs, final_state = tf.contrib.rnn.static_rnn(cell, lstm_in, dtype=tf.float32,initial_state = initial_state)
# We only need the last output tensor to pass into a classifier
	logits = tf.layers.dense(outputs[-1], n_classes, name='logits')
	# Cost function and optimizer
	cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=labels_))
	# Grad clipping
	train_op = tf.train.AdamOptimizer(learning_rate_)
	gradients = train_op.compute_gradients(cost)
	capped_gradients = [(tf.clip_by_value(grad, -1., 1.), var) for grad,var in gradients]
	optimizer = train_op.apply_gradients(capped_gradients)
	# Accuracy
	correct_pred = tf.equal(tf.argmax(logits, 1), tf.argmax(labels_, 1))
 	accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32), name='accuracy')

请注意,仅使用LSTM输出顶部序列的最后一个成员,因为我们正在尝试每个序列预测一个数字。其余的类似CNN,我们只需要将数据提供给图表进行训练。lstm_size=27,lstm_layers=2,batch_size=600learning_rate=0.0005,和keep_prob=0.5,我获得95%的准确度的测试集。这比CNN的结果还差,但还是不错的。这些超参数的更好选择会改进的结果。

与工程特征进行比较

在此之前,我已经使用561个预先设计的特征测试了一些关于这个问题的机器学习方法。性能最好的模型之一是梯度提升树(gradient booster)(树形或线性),其结果是96的精确度(您可以从这本笔记本中了解更多信息)。CNN架构优于梯度提升树,但LSTM的性能相较于梯度提升树(gradient booster)就稍差一些。

总结:

在这篇博客文章中,我已经说明了如何使用CNNLSTM进行时间序列分类,并证明深层架构可以胜过预先设计的功能特征训练的模型。除了达到更好的准确性外,深度学习模式还培养了自己的功能。这是非常可取的,因为人们不需要具有来自数据来源的领域专长,能够训练准确的模型。

我们在这篇文章中使用的序列相当小(128步)。人们可能会想,如果步骤数量很多,那么今天我讨论的这些架构的可训练性是否还有?如果有?会发生什么。我认为一种可能的架构将涉及LSTMCNN的组合,其对于较大的序列(即> 1000,对于LSTM是有问题的)可以更好地工作。因为在这种情况下,具有汇集作用的几个卷积就可以有效地减少前几个层中的步数,并且得到的较短的序列可以被反馈送到LSTM层。这种结构的一个例子最近被用于从移动设备记录的心房颤动检测。如果你有兴趣了解这种长序列的方法可以去研究它。

本文由北邮@爱可可-爱生活老师推荐,阿里云云栖社区组织翻译。

文章原标题《time-series-classification-with-tensorflow》,

作者:burakhimmetoglu 作者博客:https://burakhimmetoglu.com/

译者:袁虎 审阅:主题曲

文章为简译,更为详细的内容,请查看原文


相关文章
|
5月前
|
机器学习/深度学习 人工智能 PyTorch
AI智能体研发之路-模型篇(五):pytorch vs tensorflow框架DNN网络结构源码级对比
AI智能体研发之路-模型篇(五):pytorch vs tensorflow框架DNN网络结构源码级对比
93 1
|
5月前
|
测试技术 数据库
探索JSF单元测试秘籍!如何让您的应用更稳固、更高效?揭秘成功背后的测试之道!
【8月更文挑战第31天】在 JavaServer Faces(JSF)应用开发中,确保代码质量和可维护性至关重要。本文详细介绍了如何通过单元测试实现这一目标。首先,阐述了单元测试的重要性及其对应用稳定性的影响;其次,提出了提高 JSF 应用可测试性的设计建议,如避免直接访问外部资源和使用依赖注入;最后,通过一个具体的 `UserBean` 示例,展示了如何利用 JUnit 和 Mockito 框架编写有效的单元测试。通过这些方法,不仅能够确保代码质量,还能提高开发效率和降低维护成本。
66 0
|
5月前
|
UED 开发者
哇塞!Uno Platform 数据绑定超全技巧大揭秘!从基础绑定到高级转换,优化性能让你的开发如虎添翼
【8月更文挑战第31天】在开发过程中,数据绑定是连接数据模型与用户界面的关键环节,可实现数据自动更新。Uno Platform 提供了简洁高效的数据绑定方式,使属性变化时 UI 自动同步更新。通过示例展示了基本绑定方法及使用 `Converter` 转换数据的高级技巧,如将年龄转换为格式化字符串。此外,还可利用 `BindingMode.OneTime` 提升性能。掌握这些技巧能显著提高开发效率并优化用户体验。
78 0
|
5月前
|
UED 开发工具 iOS开发
Uno Platform大揭秘:如何在你的跨平台应用中,巧妙融入第三方库与服务,一键解锁无限可能,让应用功能飙升,用户体验爆棚!
【8月更文挑战第31天】Uno Platform 让开发者能用同一代码库打造 Windows、iOS、Android、macOS 甚至 Web 的多彩应用。本文介绍如何在 Uno Platform 中集成第三方库和服务,如 Mapbox 或 Google Maps 的 .NET SDK,以增强应用功能并提升用户体验。通过 NuGet 安装所需库,并在 XAML 页面中添加相应控件,即可实现地图等功能。尽管 Uno 平台减少了平台差异,但仍需关注版本兼容性和性能问题,确保应用在多平台上表现一致。掌握正确方法,让跨平台应用更出色。
70 0
|
5月前
|
机器学习/深度学习 人工智能 自然语言处理
【人工智能】TensorFlow简介,应用场景,使用方法以及项目实践及案例分析,附带源代码
TensorFlow是由Google Brain团队开发的开源机器学习库,广泛用于各种复杂的数学计算,特别是涉及深度学习的计算。它提供了丰富的工具和资源,用于构建和训练机器学习模型。TensorFlow的核心是计算图(Computation Graph),这是一种用于表示计算流程的图结构,由节点(代表操作)和边(代表数据流)组成。
113 0
|
8月前
|
机器学习/深度学习 数据可视化 PyTorch
TensorFlow与PyTorch框架的深入对比:特性、优势与应用场景
【5月更文挑战第4天】本文对比了深度学习主流框架TensorFlow和PyTorch的特性、优势及应用场景。TensorFlow以其静态计算图、高性能及TensorBoard可视化工具适合大规模数据处理和复杂模型,但学习曲线较陡峭。PyTorch则以动态计算图、易用性和灵活性见长,便于研究和原型开发,但在性能和部署上有局限。选择框架应根据具体需求和场景。
|
8月前
|
机器学习/深度学习 数据可视化 TensorFlow
Python用线性回归和TensorFlow非线性概率神经网络不同激活函数分析可视化
Python用线性回归和TensorFlow非线性概率神经网络不同激活函数分析可视化
|
8月前
|
机器学习/深度学习 PyTorch TensorFlow
TensorFlow、Keras 和 Python 构建神经网络分析鸢尾花iris数据集|代码数据分享
TensorFlow、Keras 和 Python 构建神经网络分析鸢尾花iris数据集|代码数据分享
|
8月前
|
机器学习/深度学习 算法 TensorFlow
精通 Sklearn 和 TensorFlow 预测性分析:1~5 全
精通 Sklearn 和 TensorFlow 预测性分析:1~5 全
154 0
|
8月前
|
人工智能 TensorFlow 算法框架/工具

热门文章

最新文章