Pytorch复现STGCN:基于图卷积时空神经网络在交通速度中的预测

Pytorch复现STGCN:基于图卷积时空神经⽹络在交通速度中的预测
1:论⽂信息十长生
来⾃IJCAI 2018的⼀篇论⽂:《Spatio-Temporal Graph Convolutional Networks: A Deep Learning Framework for Traffic Forecasting 》
1.1:论⽂思路
使⽤Kipf & Welling 2017的近似谱图卷积得到的图卷积作为空间上的卷积操作,时间上使⽤⼀维卷积TCN对所有顶点进⾏卷积,两者交替进⾏,组成了时空卷积块,在加州PeMS和北京市的两个数据集上做了验证。论⽂中图的构建⽅法并不是基于实际路⽹,⽽是通过数学⽅法构建了⼀个基于距离关系的⽹络。
1.2:摘要和引⾔总结
在交通研究中,交通流的基本变量,也就是速度、流量和密度(实际中,还有排队长度,时间占有率,空间占有率,车头时距等多个变量),这些变量通常作为监控当前交通状态以及未来预测的指标。根据预测的长度,主要是指预测时间窗⼝的⼤⼩,交通预测⼤体分为两个尺度:短期(5~30min),中和长期预测(超过30min)。⼤多数流⾏的统计⽅法(⽐如,线性回归)可以在短期预测上表现的很好。然⽽,由于交
通流的不确定性和复杂性,这些⽅法在相对长期的预测上不是很有效。
中长期交通预测上的研究可以分为两类:动态建模和数据驱动的⽅法。
动态建模⽅法:使⽤了数学⼯具(⽐如微分⽅程)和物理知识通过计算模拟来形式化交通问题。为了达到⼀个稳定的状态,模拟进程不仅需要复杂的系统编程,还需要消耗⼤量的计算资源。模型中不切实际的假设和化简也会降低预测的精度。因此,随着交通数据收集和存储技术的快速发展,⼀⼤研究者正在将他们的⽬光投向数据驱动的⽅法。
数据驱动⽅法:主要是统计学和机器学习模型。在时间序列分析上,⾃回归移动平均模型(ARIMA)和它的变形是众多统⼀的⽅法中基于传统统计学的⽅法。但是,这种类型的模型受限于时间序列的平稳分布,不能捕捉时空间依赖关系。因此,这些⽅法限制了⾼度⾮线性的交通流的表⽰能⼒。相对传统统计学⽅法,机器学习可以获得更⾼精度的预测结果,对更复杂的数据建模,⽐如k 近邻(KNN),⽀持向量机(SVM)和神经⽹络(NN)。
深度学习⽅法:深度学习已经⼴泛且成功地应⽤于各式各样的交通任务中,并取得了很显著的成果,⽐如层叠⾃编码器(SAE)。然⽽,这些全连接神经⽹络很难从输⼊中提取空间和时间特征。⽽且,空间属性的严格限制甚⾄完全缺失,这些⽹络的表⽰能⼒被限制的很严重。为了充分利⽤空间特征,⼀些研究者使⽤了卷积神经⽹络来捕获交通⽹络中的临近信息,同时也在时间轴上部署了循环神经⽹
络。通过组合LSTM和1维卷积,⽐如特征层⾯融合的架构CLTFP来预测短期交通状况。CLTFP是第⼀个尝试对时间和空间规律性对齐的⽅法。后来,有学者提出带有嵌⼊卷积层的全连接⽹络:ConvLSTM。但是常规卷积操作只适合处理规则化的⽹络结构,⽐如图像或者视频,⽽⼤多数领域是⾮结构化的,⽐如社交⽹络,交通路⽹等。此外,RNN对于序列的学习需要迭代训练,这会导致误差的积累。并且还有难以训练和耗时的缺点。
针对以上问题和缺陷:该⽂引⼊了⼀些策略来有效的对交通流的时间动态和空间依赖进⾏建模。为了完全利⽤空间信息,利⽤⼴义图对交通⽹络建模,⽽不是将交通流看成各个离散的部分(⽐如⽹格或碎块)。为了处理循环神经⽹络的缺陷,我们在时间轴上部署了⼀个全卷积结构来加速模型的训练过程。综上所述,该⽂提出了⼀个新的神经⽹络架构-时空图卷积⽹络,来预测交通状况。这个架构由多个时空图卷积块组成。
主要贡献:
该⽂研在交通研究中第⼀次应⽤纯卷积层(TCN)来同时从图结构的时间序列中提取时空信息。
该⽂提出了⼀个新的由时空块组成的神经⽹络结构。由于这个架构中是纯卷积操作,它⽐基于RNN的模型的训练速度快10倍以上,⽽且需要的参数更少。这个架构可以让我们更有效地处理更⼤的路⽹。
实验在两个真实交通数据集上验证了提出来的⽹络。这个实验显⽰出我们的框架⽐已经存在的在多长度预测和⽹络尺度上的模型表现的更好
1.3:上述总结
2:正⽂
2.1:数据处理
⽂章⾸先将⽹格数据改为图数据作为输⼊,图可以⽤邻接矩阵来表⽰,图中的W就是图的邻接矩阵,实验中使⽤的数据集PeMSD7(M)共有228个数据点,相当于⼀个具有228个顶点的图,因为这个模型主要是对速度进⾏预测,所以每个顶点只有⼀个特征就是:速度。
远程医疗系统
2.2:⽹络架构
⽹络架构是本⽂的重点部分。如下图所⽰,STGCN有多个时空卷积块组成,每⼀个都是像⼀个“三明治”结构的组成,有两个门序列卷积层和⼀个空间图卷积层在中间。
诺基亚3128组成结构:STGCN 有两个ST-Conv Block(淡蓝⾊部分)快和⼀个全连接输出layer(绿⾊部分),其中每个ST-Conv Block块有包括两个时间卷积块(橙⾊部分)和⼀个空间卷积块(浅黄⾊部分)
2.3:提取空间特征的图卷积神经⽹络
提取时间特征的图卷积神经⽹络,即对应⽹络结构中的Spatial Graph-Conv 模块。
交通路⽹是⾮结构化的图像,为了捕获空间上的相关性,本篇论⽂采⽤的是切⽐雪夫近似与⼀阶近似后的图卷积公式。只需要看最终的那个卷积公式,其中D为图的度矩阵,A_hat为图的邻接矩阵+单位矩阵,为的是在卷积过程中不仅考虑邻居节点的状态,也考虑⾃⾝的状态。
2.4:提取时间特征的门控卷积神经⽹络
提取空间特征的图卷积神经⽹络,即对应⽹络结构中的Temporal Gated-Conv 模块。
论⽂提到,每个ST—Conv模块包含两个时间门控卷积层和⼀个空间图卷积层。
在时间维度上,论⽂提到采⽤使⽤GLU实现的1维因果卷积,就不再像采⽤RNN的⽅法依赖于之前的输出,并且还可以对数据进⾏并⾏处理,这样使得模型训练速度更快。GLU是在这篇论⽂中提出的:Language Modeling with Gated Convolutional Networks。在STGCN 这篇论⽂,⽂章只是简单提到采⽤这种操作可以缓解梯度消失等现象还可以保留模型的⾮线性能⼒。
在阅读论⽂源码后,我的理解是:采⽤GLU实现了在时间维度上的卷积操作,卷积核⼤⼩是13,即H W,H表⽰节点数量,W表⽰时间长度,因此在每个节点上使⽤GLU来捕获时间上的依赖关系,也就是利⽤GLU来实现TCN能够达到的效果——1D卷积和并⾏计算的功能
2.5:时空卷积块ST-Conv Block
将以上的图卷积和门控CNN组合成如图所⽰的结构,其中使⽤了瓶颈策略来实现尺度压缩和特征压缩。并在每层之后接归⼀化层来防⽌过拟合。
ST-Conv Block的公式就是图的另⼀个解释,输⼊数据先做时间维度卷积,输出结果再做图卷积,图卷积的输出结果经过⼀个RELU,在进⾏⼀个时间维度卷积,就是整个ST-Conv Block的输出。
2.6:模型输出
最后的模型是堆叠两个St-Conv Block之后接⼀个输出层,其中输出层⾸先⽤时间维度的卷积将之前的输出数据的时间维度进⾏合并,合并之后在经过⼀个卷积输出最终的预测数据,预测数据就是下⼀个时间维度的⼀张图[1,228,1]。模型采⽤的是L2损失。
2.7:模型总结
STGCN 是处理结构化时间序列的通⽤框架。它不仅能够解决交通⽹络建模和预测问题,⽽且可以应⽤于更⼀般的时空序列学习任务。
时空卷积块结合了图卷积和门控时间卷积,能够提取出最有⽤的空间特征,并连贯地捕捉到最基本的时间特征。
该模型完全由卷积结构组成,在输⼊端实现并⾏化,参数更少,训练速度更 快。更重要的是,这种经济架构允许模型以更⾼的效率处理⼤规模⽹络。
3:源码解读
源码以Pytorch为例
3.1:读取数据
原始数据时间窗⼝长度是5min⼀个数据⽚,即:每5分钟记录该时间窗⼝内,各个路⽹节点的数据信息,每条数据信息包含2个维度信息。utlis.load_metr_la_data函数
读取数据,并且利⽤ Z-score method进⾏归⼀化:
复杂电磁环境
X = X - shape(1, -1, 1)和 X = X / shape(1, -1, 1),最终返回数据格式为:X:[207, 2, 34272],表⽰有图中有207个节点,34272个时间⽚,每个时间⽚对应的节点数据维度是2
def load_metr_la_data():
if(not os.path.isfile("data/adj_mat.npy")
or not os.path.isfile("data/node_values.npy")):
with zipfile.ZipFile("data/METR-LA.zip",'r')as zip_ref:
actall("data/")
A = np.load("data/adj_mat.npy")
X = np.load("data/node_values.npy").transpose((1,2,0))
X = X.astype(np.float32)
# Normalization using Z-score method
means = np.mean(X, axis=(0,2))
X = X - shape(1,-1,1)
stds = np.std(X, axis=(0,2))
X = X / shape(1,-1,1)
return A, X, means, stds
<_normalized_adj函数
读取邻接矩阵,并返回度信息
def get_normalized_adj(A):
"""
Returns the degree normalized adjacency matrix.
"""
A = A + np.s(A.shape[0], dtype=np.float32))
D = np.array(np.sum(A, axis=1)).reshape((-1,))
D[D <=10e-5]=10e-5# Prevent infs
diag = np.reciprocal(np.sqrt(D))
A_wave = np.multiply(np.shape((-1,1)), A),
return A_wave吐火罗文
历史时间窗⼝长度:num_timesteps_input = 12,预测未来时间窗⼝长度:num_timesteps_output = 3,即⽤过去12个时间⽚信息,来预测接下来3个时间⽚的数值。
在main函数中,训练数据集为60%,即训练数量共34272*0.6=20563。main函数调⽤generate_dataseth函数,其原始输⼊为(num_vertices, num_features,num_timesteps),即 (207, 2, 20563),207是节点数量,2表⽰每个时间⽚对应的特征数量,训练时间⽚数量为20563。
最后generate_dataseth返回X的结果为:(num_samples, num_vertices, num_features, num_timesteps_input),即[20549, 207, 12, 2],20549表⽰处理后的时间⽚数量,207表⽰节点数量,12表⽰特征数量也就是过去12个时间⽚,2表⽰特征的通道数量,generate_dataseth返回Y的结果为:(num_samples, num_vertices, num_features, num_timesteps_output),即[20549, 207, 2],其中的第⼀个通道的数值表⽰预测数值对应的通道。
def generate_dataset(X, num_timesteps_input, num_timesteps_output):
"""
Takes node features for the graph and divides them into multiple samples
along the time-axis by sliding a window of size (num_timesteps_input+
num_timesteps_output) across it in steps of 1.
:param X: Node features of shape (num_vertices, num_features,
num_timesteps)
:return:
- Node features divided into multiple samples. Shape is
(num_samples, num_vertices, num_features, num_timesteps_input).
- Node targets for the samples. Shape is
(num_samples, num_vertices, num_features, num_timesteps_output).一体化
"""
# Generate the beginning index and the ending index of a sample, which
# contains (num_points_for_training + num_points_for_predicting) points
indices =[(i, i +(num_timesteps_input + num_timesteps_output))for i
in range(X.shape[2]-(
num_timesteps_input + num_timesteps_output)+1)]
# Save samples
features, target =[],[]
for i, j in indices:
features.append(
X[:,:, i: i + num_timesteps_input].transpose(
(0,2,1)))
target.append(X[:,0, i + num_timesteps_input: j])
return torch.from_numpy(np.array(features)), \
torch.from_numpy(np.array(target))
3.2:模型输⼊
这⾥batch_size设置为50,同时为了⽐较快速清晰的查看各个模块的输出,我们就以⼀个batch为例,即:输⼊的总时间⽚长度为50 STGCN包含三个模型,其中两个时空STGCNBlock模块和⼀个TimeBlock模块和最后⼀个全连接层,⽽⼀个STGCNBlock⼜包含两个temporal(temporal)模块,(
也就是TimeBlock模块模块)和 ⼀个Theta(spatial)模块,⼀个TimeBlock模块包含因果卷积操作⽬的就是为了提取时间信息(主要是W维度上的)TimeBlock模块主要是为了提取时间信息,利⽤的是⼀维卷积,kernel_size=3,卷积核⼤⼩为(1,kernel_size=3,分别对应H,W)。

本文发布于:2024-09-20 20:34:17,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/258343.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:卷积   时间   数据   预测   模型   交通   空间   特征
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议