数学建模活动的经历
# 数学建模活动的经历
# 背景
今年四月份(快五一的时候),我们学年数学组搞了一个数学建模的活动。然后我当时想到的就是深度学习之类的东西。所以我打算就一拍即合,报名了这次活动。
# 选题的筹备
老师说选题要与生活有关系。不过在五一时期的话。我脑海里能想到的第一个关键词就是 游玩 。而众所周知,像五一这样的旅游旺季,肯定会有一个字离不开。 那就是 “堵车”。
是的,基本上大部分的旅游时间都耽误在道上。看到的不是风景,而是熙熙攘攘的人群。而堵车这个因素又跟交通有关。所以我们打算做交通预测这个选题
# 技术选型
在这次建模中,我们选用了LSTM网络去针对交通拥堵的建模。LSTM有天然的时序数据处理优势。
我曾经在AI Studio上看到用LSTM预测股价的案例。因为股票价格的涨或跌可以简单看作是由时间这个序列引起的。而我们的交通拥堵情况也可以简单看作一个时间序列引起的。所以我想把LSTM网络迁移到这里来。
# 过程
# 数据集的准备&预处理
要搭建模型肯定是得有数据集做支撑的。我们当时正好在arxiv上搜到了一篇论文
这篇论文做的跟交通预测有关,选取的数据集是由滴滴数据开放平台提供的路况数据。不过因为时间已久,这个开放平台已经不再提供数据。然后我们在GitHub上搜BaiduTraffic(主要是百度的数据还是比较准的),结果还真的搜到了数据集。但是,还得从百度网盘下载。众所周知,百度网盘的下载速度真是一言难尽。不过在发现这个数据集的同时。我们也发现了另外一个数据集,是阿里天池云上贵州智慧交通预测挑战赛 (opens new window)的数据。这个下载速度还快,而且数据质量也很好。于是我就用它这个了。
不过下下来的数据上是很多个因素导致一个路段堵不堵车的。比如上游路段的拥堵时长。在这里,为了方便建模。我们只选择一个路段进行建模。
# LSTM模型的理解
其实,当时只是知道应该选用LSTM网络来建模。但还不知道怎么样搭建。于是我就翻了很多很多的api文档。以及LSTM网络的原理。而且可能要解决很多的问题啊,比如h_n,c_n没有重置的问题。num_layers的问题等等。在不断的尝试下,终于把网络搭建好了
# 训练的准备
我们用的是DatasetLoader去加载数据集,又把数据集分成了训练集,测试集,验证集。我们用的是SGD优化器去优化。然后用scheduler来去动态调节学习率,然后在训练的过程中还有保存点的设置。由于我们当时还没接触到tensorboard,所以loss图都是用matplotlib画的。
# 训练过程1
第一次训练是在我朋友家进行的。用的是cpu去训练模型。总共跑完100step也就一个小时。不过loss实在是不如人意。而且训完之后情况非常糟糕
(loss图是这样的)
train_loss几乎都是平的。val_loss下降好半天也只是下到了10。
于是我开始再看别人的博客什么的去改进自己的网络。我发现两个重要的原因。
1.我当时选用的是SGD优化器,收敛速度较慢
2.没进行归一化
于是我就针对这两个问题进行修改。把SGD改成了Adam优化器。之后把数据用Min/Max 的方法去归一化。为了提升训练速度我用的是AutoDL的机子训练,用的是 2080Ti 显卡来推理(这样可以用CUDA加速)于是,第二次训练就开始了
# 第二次训练
吸取上次的经验我几乎时时刻刻都看着loss图。不过可喜的是,训练没多久就收敛的很快。这简直真的震惊到我了。loss图如下
这回loss真的就是一泻千里。至少不会太像上次那么离谱。经过测试,模型还是表现的很良好的
# 预测与分析
我们把前两秒的数据放进模型里面,预测后面的数据,比较符合实际情况(如下图)
不过,我们还没有建立一个数学解析式(问我为啥?老师要求的QAQ)于是我们用geogebra去对预测数据拟合
# 总结
这次的话是我对于LSTM网络的认识和初实践。我们队伍在这次比赛中获得特等奖(而且特等奖中还是第一名)。 那么就先到这里了,拜拜