【Datawhale AI 夏令营第三期--深度学习-从零入门 AI for Science-Task2:抽丝剥茧——降水预测baseline详解学习笔记】

Part1 精读baseline——如何针对降水预测问题搭建模型

回顾baseline, 可以大致将搭建模型并解决问题分为以下几个步骤:

1.定义数据集, 建立起训练数据和标签之间的关系;定义数据加载器(DataLoader), 方便取数据进行训练
2. 定义模型, 利用PyTorch搭建网络,根据输入输出数据维度实例化模型
3. 定义损失函数, 优化器, 训练周期, 训练模型并保存模型参数
4. 模型加载及推理(模型预测),输入测试数据输出要提交的文件

有了大概的判断了, 接下来就逐代码块进行讲解:

  1. 是在魔搭平台上, 安装运行baseline所必须的库, 命令pip install xxx是一个运行于终端的shell语句, 通过前面加上 ! 符号使之可以从notebook中运行
  2. 第二部分即导入执行下面语句所需要的函数库
  3. 第三部分是数据集的一些相关配置,feature_path和gt_path分别是官方提供的train.xxx数据和gt.xxx数据存放的路径.
    a. 其中 feature_path存放的路径需要如下图文件树所示:
    feature
    └── 2021
    ├── 20210101-00
    │ ├── 006.nc
    │ ├── 012.nc
    │ ├── 018.nc
    │ ├── 024.nc
    │ ├── 030.nc
    │ ├── 036.nc
    │ ├── 042.nc
    │ ├── 048.nc
    │ ├── 054.nc
    │ ├── 060.nc
    │ ├── 066.nc
    │ └── 072.nc
    b. gt_path存放的路径如下图文件树所示:
    groundtruth
    ├── 2019.nc
    ├── 2020.nc
    └── 2021.nc
    c. 定义年份的列表, 里面可以存放"2019", “2020”, "2021"三个年份, 根据自己数据集挑选时使用的那年数据, 就在这个列表中增加相应的年份的字符串即可
    d. fcst_steps是一个存放了从1-72数字的列表, 因为我们的预报是从1-72小时的, 这个数据在之后的数据集加载也会用到
  4. 我们在这里定义了两个类, 一个是Feature类, 另外一个是GT类:
    a. Feature:
    1.第一部分是构造函数, 定义了feature的输入路径、使用到的年份、预测的时间点、还有获取到具体某个feature数据的路径;
    2.get_features_paths函数是构造函数中self.features_paths_dict的具体实现, 通过遍历 feature-2021(年份)-20210101-00(具体时间戳),获取到每个具体时间点存放数据特征的路径;
    3.最后的get_fts函数, 通过使用xarray库中加载cdf数据,其中sel()中要增加对应的预测预测间隔, isel()中time要设置为0, 表示从头开始组成数据. 这听起来可能有些绕, 我们直接从数据类型上说话.如下图, 我们可以看到在.sel()后, 数据的维度是(1, 6, 24, 57, 81), 其中的6是因为我们看到的feature中的.nc数据, 是每隔6小时一取的;再经过.isel()方法后, 数据维度就变成了(6, 24, 57, 81), 即通过取time=0处索引的数据, 去除了作为数据输入时, 用不到的时间戳,这样实现了数据集的结构化处理。
    在这里插入图片描述
    b. GT:
    1.构造函数与Feature部分类似, 其中gt_path如此设计是因为groundtruth文件夹下就有三个.nc文件, 2021.nc等,相比feature, 多出来的self.gts即添加了年份中所有的gt数据, 之后根据需要再去取对应的部分即可
    2.parser_gt_timestamps这个函数是根据输入获取到时间戳, 如果我们查看gt中.nc数据的话会发现gt中包含的时间戳及对应数据要比feature中的数据更全, 因此我们采用从feature中获取到时间戳, 然后使用针对的时间戳取对应的groundtruth数据
    3.get_gts中, 跟feature中的类似, 取对应时间戳的数据即可, 同样, 我们也可以打印出这个函数的返回值查看数据, 是一个(72, 57, 81)维度的数据:
    在这里插入图片描述
  5. 完成了Feature类和GT类的分别构建后, 就可以定义数据集了~ 数据集首先是继承torch.utils.data中的Dataset类
    1.首先是构造函数, 分别实例化了Feature和GT类, 定义了取feature的路径还有feature中含有的时间戳数据, 方便在GT中找到对应时间的数据
    2.__get_item__方法是我们进行取数据的操作, 通过传入的index, 可以获取到对应的时间戳, 然后通过此时间戳, 可以从feature和gt中获取到对应的数据. ft.get_fts和gt.get_gts在上面已经提到过, 其中 ft_item = self.ft.get_fts(init_time).to_array().isel(variable=0).values这行代码是将提取到的feature数据和gt数据转化成numpy格式,便于做数据处理
    3.len()函数返回数据长度, 在此不用再过赘述
  6. 完成了mydataset类的构建并实例化以后, 可以打印一下看看, 本次由于存储空间的限制, 我们给大家的训练数据只有一条, 后面大家在提升上分时要增加训练数据, 以便模型取得更好的效果;dataset实例化以后, 就可以构建dataloader方便训练使用了
  7. 完成数据的与准备工作, 下面就进入了模型的构建部分:
    1.首先, 要定义一个模型类, 他是继承于nn.Module类的, 这个类是pytorch中构建网络时最常用的类之一, 方便了我们做初始化操作, 其中super(Model, self).init()就是用来使用父类nn.Module中的初始化方式; 在构造函数中, 我们可以看到baseline只简单的定义了一层卷积, 其中的num_in_ch和num_out_ch分别指输入的通道数和输出的通道数(特征数)
    2.接下来的forward()函数是我们在使用网络时做前向传播的函数, 其底层的实现是利用了__call__()这个内置函数, 方便我们实例化模型以后直接可以通过model(inputs)形式调用forward函数。forward函数中, 首先记录了输入数据feature的shape, 然后将输入数据的时间维度和特征维度叠加到一起,这样再经过卷积层得到输出, 得到输出以后再对输出数据做一下维度上的reshape, 保证跟赛题中要求的输出维度一致
    3.定义模型的输入输出维度, 确保模型可以做实例化, 另外时间维度和特征维度需要按照定义模型中的shape操作来对应相乘, 否则就会有维度上的报错; 根据channel进行实例化以后, 因为我们本次使用魔搭的GPU资源, 就需要使用.cuda()将模型放在gpu上
  8. 定义模型的损失函数, 一般对于回归任务而言, MSELoss是最常用的
  9. 模型训练部分:
    1.首先要定义优化器和训练轮数, 这里我们使用了Adam优化器, 设置的学习率为0.001
    2.接下来就是一个二层的循环, 外层循环是在整个训练轮数上做的, 每次经过这个循环就表示已经遍历了一遍全局数据集;内层循环是根据dataloader中设置的batchsize, 每次循环取batchsize个数据进行训练和优化
    3.获取到feature和gt数据后, 我们要把数据放到GPU上, 保证和模型.cuda()一致,接下来, 就可以将训练数据(feature)输入到模型中获取输出了, 得到这个输出以后, 就可以计算输出和gt之间的损失函数, 以便模型进行后续优化, 这一步骤在模型内部也叫做正向传播
    4.正向传播以后, 我们需要梯度回传反向传播来优化我们的模型, 首先使用optimizer.zero_grad()先清空梯度, 再计算模型输出和loss, 然后使用.backward()进行反向传播, optimizer.step()用于更新模型参数. 这三个方法一般都是一起使用, 用于反向传播和更新模型参数. task1中给大家的思考题里面有提到这里, baseline中计算完loss后再使用optimizer.zero_grad()是不合理的.
    5.最后要将模型参数数据(包括权重weight和偏置bias)进行保存, 以便后续的推理使用
  10. 模型推理部分, 这部分就是我们生成数据提交结果的最后一步:
    1.首先需要先加载模型权重, 并使用model.eval()将模型置于推理模式
    2.接下来, 要将测试输入数据的路径进行指定, 这部分已经在魔搭的云空间里面给大家定义好了
    3.接着一个循环来遍历测试数据路径下所有的数据, 因为测试数据都为.pt文件, 直接使用torch.load加载就好了;取到输入数据以后, 需要使用.cuda()将数据放到GPU上,和model保持一致
    4.接着调用模型, 输入测试数据, 得出输出数据
    5.最后, 对输出的数据进行保存(注意最后保存的数据要放在cpu上, 否则提交会报错)
    在这里插入图片描述
    这样, baseline的整个流程就跑完了, 主要是包含数据集准备和处理、模型定义、模型训练、模型推理四个大部分。

Part2 伏羲大模型初探

在前面的探索中,了解到输入数据源是伏羲气象大模型的输入。伏羲大模型是由复旦大学主力研发,并得到Shanghai AI Lab(上海人工智能实验室)创新孵化研究院的助力推出。该模型采用独特的级联架构,能够提供长达15天的全球预报,拥有6小时的时间分辨率和0.25°的空间分辨率。值得一提的是,这一成果已得到认可,被Nature杂志收录。
伏羲大模型目前已以开源的形式发布了预训练模型,并贴心地提供了样本输入和输出数据。然而,有一点遗憾,并未提供可复现的训练源码。
论文原文:https://arxiv.org/pdf/2306.12873
Github:https://github.com/tpys/FuXi
模型、数据获取渠道(百度网盘):https://pan.baidu.com/share/init?surl=PDeb-nwUprYtu9AKGnWnNw&pwd=fuxi#list/path=/
模型、数据获取渠道(Zenodo):https://zenodo.org/records/10401602
接下来,让我们简短地概述一下FuXi模型的输入与输出: FuXi模型作为一个自回归模型,它采用前两个时间步的天气参数(𝑋𝑡−1,𝑋𝑡)作为输入,进而预测下一个时间步(𝑋𝑡+1)的天气参数。这里的t、t−1和t+1分别代表当前时间步、前一个时间步以及即将到来的时间步。该模型设定的时间步长为6小时。通过将模型的输出再次作为输入,系统能够生成具有不同预见期的预报。
为了使用单个FuXi模型生成15天的预报,需要进行60次迭代运行。与基于物理原理的数值天气预报(NWP)模型不同,纯数据驱动的机器学习(ML)模型缺乏物理限制,这可能会导致长期预报的误差显著增加,甚至产生不切实际的预测结果。然而,通过采用自回归多步损失函数,可以有效减少长期预报过程中的累积误差
在进行预报迭代的过程中,随着预报提前期的延长,误差的累积是难以避免的现象。此外,已有的研究指出,单一的模型无法在所有提前期内都达到最佳表现。为了提升短期和长期预报的性能,提出了一个使用预训练FuXi模型的级联模型架构,该架构针对特定的5天预报时间窗口进行精细调整,以实现最优性能。
这些时间窗口被划分为FuXi-Short(0-5天)、FuXi-Medium(5-10天)和FuXi-Long(10-15天)。FuXi-Short和FuXi-Medium的输出在第20步和第40步时,分别被用作FuXi-Medium和FuXi-Long的输入。与Pangu-Weather采用的贪婪分层时间聚合策略——后者通过使用4个模型,其预报提前期分别为1小时、3小时、6小时和24小时,以减少步骤数量——不同,级联的FuXi模型避免了时间不一致性的问题。

Part3 时间序列分析入门

降水预测、风速预测、海浪预测等等, 这些气象预测任务都与着时间序列分析有密不可分的关系。在传统的气象预测任务例如降水预测中, 科学家们总会根据云层反射率的变化, 进行严谨的数学建模,输出预报的结果. 然而现如今深度学习强大的数据拟合能力能帮助科学家们更为快速和精准的找到最佳拟合的模型, AI+气象预测领域就越发受到气象专家们的关注.
时间序列分析问题, 一般数据序列中前后有顺序上或周期上的关联。

  1. 统计方法中, 常用自回归(AR)模型、移动平均(MA)模型, 或者自回归滑动平均模型(ARMA)模型, 但是这些模型的使用有个前提, 当前处的值是序列中前几个点误差项的线性组合. 后来科学家们又针对这个前提的缺点, 又提出了自回归积分滑动平均(ARIMA)模型,在传统的时间序列分析中, 这些方法总是比较实用的, 不过对于大数据量长时间的任务, 预测的精度总是有些不尽人意.
  2. 后来深度学习爆发式增长, 循环神经网络(RNN)也开始登上了时间序列分析的舞台, 凭借着它能捕捉输入特征前后时间的逻辑, 同时还具备神经网络强大的拟合能力, 也收获了一众信徒. 然而, RNN难以训练, 同时层数也不能加太深, 且非常容易过出现梯度消失或梯度爆炸的问题, 为了解决这个问题, 长短记忆网络(LSTM)在RNN的基础上, 又引入了记忆单元和输入门、遗忘门、和输出门来控制信息在序列中的传递,避免过远的时间节点对当前时间节点产生的不恰当的影响.
    在这里插入图片描述
  3. 如今, transformer模型由于其独特的注意力机制可以在全局建模时间序列中某个时间节点和其他时间节点的关系和它的强大的拟合能力和良好的可并行计算的特性, 在当今数据量爆炸的时代也越来越受当今学术圈的追捧,如informer, autoformer等等.
    在这里插入图片描述

总结

在本次学习中, 主要对baseline做了逐行精讲, 了解了如何使用torch和深度学习搭建一个全流程的预测任务, 学习到了时间序列预测任务的基础知识, 同时也对伏羲大模型如何在气象预报中起作用有了简单的理解。

参考文献

抽丝剥茧——降水预测baseline详解
第二届世界科学智能大赛地球科学赛道:AI极端降水预报
【第二届世界科学智能大赛地球科学赛道:AI极端降水预报】FAQ

  • 13
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值