EarthFormer¶
开始训练、评估前,请先下载
# ICAR-ENSO 模型评估
python examples/earthformer/earthformer_enso_train.py mode=eval EVAL.pretrained_model_path=https://paddle-org.bj.bcebos.com/paddlescience/models/earthformer/earthformer_enso.pdparams
# SEVIR 模型评估
python examples/earthformer/earthformer_sevir_train.py mode=eval EVAL.pretrained_model_path=https://paddle-org.bj.bcebos.com/paddlescience/models/earthformer/earthformer_sevir.pdparams
模型 | 变量名称 | C-Nino3.4-M | C-Nino3.4-WM | MSE(1E-4) |
---|---|---|---|---|
ENSO 模型 | sst | 0.74130 | 2.28990 | 2.5000 |
模型 | 变量名称 | CSI-M | CSI-219 | CSI-181 | CSI-160 | CSI-133 | CSI-74 | CSI-16 | MSE(1E-4) |
---|---|---|---|---|---|---|---|---|---|
SEVIR 模型 | vil | 0.4419 | 0.1791 | 0.2848 | 0.3232 | 0.4271 | 0.6860 | 0.7513 | 3.6957 |
1. 背景简介¶
地球是一个复杂的系统。地球系统的变化,从温度波动等常规事件到干旱、冰雹和厄尔尼诺/南方涛动 (ENSO) 等极端事件,影响着我们的日常生活。在所有后果中,地球系统的变化会影响农作物产量、航班延误、引发洪水和森林火灾。对这些变化进行准确及时的预测可以帮助人们采取必要的预防措施以避免危机,或者更好地利用风能和太阳能等自然资源。因此,改进地球变化(例如天气和气候)的预测模型具有巨大的社会经济影响。
Earthformer,一种用于地球系统预测的时空转换器。为了更好地探索时空注意力的设计,论文提出了 Cuboid Attention ,它是高效时空注意力的通用构建块。这个想法是将输入张量分解为不重叠的长方体,并行应用长方体级自注意力。由于我们将 O(N2) 自注意力限制在局部长方体内,因此整体复杂度大大降低。不同类型的相关性可以通过不同的长方体分解来捕获。同时论文引入了一组关注所有局部长方体的全局向量,从而收集系统的整体状态。通过关注全局向量,局部长方体可以掌握系统的总体动态并相互共享信息。
2. 模型原理¶
本章节仅对 EarthFormer 的模型原理进行简单地介绍,详细的理论推导请阅读 Earthformer: Exploring Space-Time Transformers for Earth System Forecasting。
Earthformer 的网络模型使用了基于 Cuboid Attention 的分层 Transformer incoder-decoder 。这个想法是将数据分解为长方体并并行应用长方体级自注意力。这些长方体进一步与全局向量的集合连接。
模型的总体结构如图所示:
EarthFormer 原代码中训练了 ICAR-ENSO 数据集中海面温度 (sst) 和 SEVIR 数据集中对云总降水量 (vil) 的估计模型,接下来将介绍这两个模型的训练、推理过程。
2.1 ICAR-ENSO 和 SEVIR 模型的训练、推理过程¶
模型预训练阶段是基于随机初始化的网络权重对模型进行训练,如下图所示,其中 \([x_{i}]_{i=1}^{T}\) 表示长度为 \(T\) 时空序列的输入气象数据,\([y_{i}]_{i=1}^{K}\) 表示预测未来 \(K\) 步的气象数据,\([y_{i_True}]_{i=1}^{K}\) 表示未来 \(K\) 步的真实数据,如海面温度数据和云总降水量数据。最后网络模型预测的输出和真值计算 mse 损失函数。
在推理阶段,给定长度序列为 \(T\) 的数据,得到长度序列为 \(K\) 的预测结果。
3. 海面温度模型实现¶
接下来开始讲解如何基于 PaddleScience 代码,实现 EarthFormer 模型的训练与推理。关于该案例中的其余细节请参考 API文档。
3.1 数据集介绍¶
数据集采用了 EarthFormer 处理好的 ICAR-ENSO 数据集。
本数据集由气候与应用前沿研究院 ICAR 提供。数据包括 CMIP5/6 模式的历史模拟数据和美国 SODA 模式重建的近100多年历史观测同化数据。每个样本包含以下气象及时空变量:海表温度异常 (SST) ,热含量异常 (T300),纬向风异常 (Ua),经向风异常 (Va),数据维度为 (year,month,lat,lon)。训练数据提供对应月份的 Nino3.4 index 标签数据。测试用的初始场数据为国际多个海洋资料同化结果提供的随机抽取的 n 段 12 个时间序列,数据格式采用 NPY 格式保存。
训练数据:
每个数据样本第一维度 (year) 表征数据所对应起始年份,对于 CMIP 数据共 291 年,其中 1-2265 为 CMIP6 中 15 个模式提供的 151 年的历史模拟数据 (总共:151年 15 个模式=2265) ;2266-4645 为 CMIP5 中 17 个模式提供的 140 年的历史模拟数据 (总共:140 年17 个模式=2380)。对于历史观测同化数据为美国提供的 SODA 数据。
训练数据标签
标签数据为 Nino3.4 SST 异常指数,数据维度为 (year,month)。
CMIP(SODA)_train.nc 对应的标签数据当前时刻 Nino3.4 SST 异常指数的三个月滑动平均值,因此数据维度与维度介绍同训练数据一致。
注:三个月滑动平均值为当前月与未来两个月的平均值。
测试数据
测试用的初始场 (输入) 数据为国际多个海洋资料同化结果提供的随机抽取的 n 段 12 个时间序列,数据格式采用NPY格式保存,维度为 (12,lat,lon, 4), 12 为 t 时刻及过去 11 个时刻,4 为预测因子,并按照 SST,T300,Ua,Va 的顺序存放。
EarthFFormer 模型对于 ICAR-ENSO 数据集的训练中,只对其中海面温度 (SST) 进行训练和预测。训练海温异常观测的 12 步 (一年) ,预测海温异常最多 14 步。
3.2 模型预训练¶
3.2.1 约束构建¶
本案例基于数据驱动的方法求解问题,因此需要使用 PaddleScience 内置的 SupervisedConstraint
构建监督约束。在定义约束之前,需要首先指定监督约束中用于数据加载的各个参数。
数据加载的代码如下:
其中,"dataset" 字段定义了使用的 Dataset
类名为 ENSODataset
,"sampler" 字段定义了使用的 Sampler
类名为 BatchSampler
,设置的 batch_size
为 16,num_works
为 8。
定义监督约束的代码如下:
examples/earthformer/earthformer_enso_train.py | |
---|---|
SupervisedConstraint
的第一个参数是数据的加载方式,这里使用上文中定义的 train_dataloader_cfg
;
第二个参数是损失函数的定义,这里使用自定义的损失函数 mse_loss
;
第三个参数是约束条件的名字,方便后续对其索引。此处命名为 Sup
。
3.2.2 模型构建¶
在该案例中,海面温度模型基于 CuboidTransformer 网络模型实现,用 PaddleScience 代码表示如下:
examples/earthformer/earthformer_enso_train.py | |
---|---|
网络模型的参数通过配置文件进行设置如下:
其中,input_keys
和 output_keys
分别代表网络模型输入、输出变量的名称。
3.2.3 学习率与优化器构建¶
本案例中使用的学习率方法为 Cosine
,学习率大小设置为 2e-4
。优化器使用 AdamW
,并将参数进行分组,使用不同的
weight_decay
,用 PaddleScience 代码表示如下:
3.2.4 评估器构建¶
本案例训练过程中会按照一定的训练轮数间隔,使用验证集评估当前模型的训练情况,需要使用 SupervisedValidator
构建评估器。代码如下:
SupervisedValidator
评估器与 SupervisedConstraint
比较相似,不同的是评估器需要设置评价指标 metric
,在这里使用了自定义的评价指标分别是 MAE
、MSE
、RMSE
、corr_nino3.4_epoch
和 corr_nino3.4_weighted_epoch
。
3.2.5 模型训练与评估¶
完成上述设置之后,只需要将上述实例化的对象按顺序传递给 ppsci.solver.Solver
,然后启动训练、评估。
3.3 模型评估可视化¶
3.3.1 测试集上评估模型¶
构建模型的代码为:
examples/earthformer/earthformer_enso_train.py | |
---|---|
构建评估器的代码为:
3.3.2 模型导出¶
构建模型的代码为:
examples/earthformer/earthformer_enso_train.py | |
---|---|
实例化 ppsci.solver.Solver
:
examples/earthformer/earthformer_enso_train.py | |
---|---|
构建模型输入格式并导出静态模型:
examples/earthformer/earthformer_enso_train.py | |
---|---|
InputSpec
函数中第一个设置模型输入尺寸,第二个参数设置输入数据类型,第三个设置输入数据的 Key
.
3.3.3 模型推理¶
创建预测器:
examples/earthformer/earthformer_enso_train.py | |
---|---|
准备预测数据:
进行模型预测与预测值保存:
examples/earthformer/earthformer_enso_train.py | |
---|---|
4. 云总降水量 vil 模型实现¶
4.1 数据集介绍¶
数据集采用了 EarthFormer 处理好的 SEVIR 数据集。
The Storm Event ImagRy(SEVIR) 数据集是由麻省理工林肯实验室和亚马逊收集并提供的。SEVIR 是一个经过注释、整理和时空对齐的数据集,包含 10,000 多个天气事件,每个事件由 384 千米 x 384 千米的图像序列组成,时间跨度为 4 小时。SEVIR 中的图像通过五种不同的数据类型进行采样和对齐:GOES-16 高级基线成像仪的三个通道 (C02、C09、C13)、NEXRAD 垂直液态水含量 (vil) 和 GOES-16 地球静止闪电成像 (GLM) 闪烁图。
SEVIR数据集的结构包括两部分:目录 (Catalog) 和数据文件 (Data File)。目录是一个 CSV 文件,其中包含描述事件元数据的行。数据文件是一组 HDF5 文件,包含特定传感器类型的事件。这些文件中的数据以 4D 张量形式存储,形状为 N x L x W x T,其中 N 是文件中的事件数,LxW 是图像大小,T 是图像序列中的时间步数。
EarthFormer 采用 SEVIR 中的 NEXRAD 垂直液态水含量 (VIL) 作为降水预报的基准,即在 65 分钟的垂直综合液体背景下,预测未来 60 分钟的垂直综合液体。因此,分辨率为 13x384x384→12x384x384。
4.2 模型预训练¶
4.2.1 约束构建¶
本案例基于数据驱动的方法求解问题,因此需要使用 PaddleScience 内置的 SupervisedConstraint
构建监督约束。在定义约束之前,需要首先指定监督约束中用于数据加载的各个参数。
数据加载的代码如下:
其中,"dataset" 字段定义了使用的 Dataset
类名为 ENSODataset
,"sampler" 字段定义了使用的 Sampler
类名为 BatchSampler
,设置的 batch_size
为 1,num_works
为 8。
定义监督约束的代码如下:
examples/earthformer/earthformer_sevir_train.py | |
---|---|
SupervisedConstraint
的第一个参数是数据的加载方式,这里使用上文中定义的 train_dataloader_cfg
;
第二个参数是损失函数的定义,这里使用自定义的损失函数 mse_loss
;
第三个参数是约束条件的名字,方便后续对其索引。此处命名为 Sup
。
4.2.2 模型构建¶
在该案例中,云总降水量模型基于 CuboidTransformer 网络模型实现,用 PaddleScience 代码表示如下:
examples/earthformer/earthformer_sevir_train.py | |
---|---|
定义模型的参数通过配置进行设置,如下:
其中,input_keys
和 output_keys
分别代表网络模型输入、输出变量的名称。
4.2.3 学习率与优化器构建¶
本案例中使用的学习率方法为 Cosine
,学习率大小设置为 1e-3
。优化器使用 AdamW
,并将参数进行分组,使用不同的 weight_decay
,用 PaddleScience 代码表示如下:
4.2.4 评估器构建¶
本案例训练过程中会按照一定的训练轮数间隔,使用验证集评估当前模型的训练情况,需要使用 SupervisedValidator
构建评估器。代码如下:
SupervisedValidator
评估器与 SupervisedConstraint
比较相似,不同的是评估器需要设置评价指标 metric
,在这里使用了自定义的评价指标分别是 MAE
、MSE
、csi
、pod
、sucr
和 bias
,且后四个评价指标分别使用不同的阈值 [16,74,133,160,181,219]
。
4.2.5 模型训练¶
完成上述设置之后,只需要将上述实例化的对象按顺序传递给 ppsci.solver.Solver
,然后启动训练。
4.2.6 模型评估¶
由于目前 paddlescience
中的验证策略分为两类,一类是直接对验证数据集进行模型输出拼接,然后计算评价指标。另一类是按照每个 batch_size 计算评价指标,然后拼接,最后对所有结果求平均,该方法默认数据之间没有关联性。但是 SEVIR
数据集数据之间有关联性,所以不适用第二种方法;又由于 SEVIR
数据集量大,使用第一种方法验证显存需求大,因此验证 SEVIR
数据集使用的方法如下:
- 1.对一个 batch size 计算
hits
、misses
和fas
三个数据 - 2.对数据集所有数据保存所有
batch
的三个值的累加和. - 3.对三个值的累加和计算
csi
、pod
、sucr
和bias
四个指标。
4.3 模型评估可视化¶
4.3.1 测试集上评估模型¶
构建模型的代码为:
examples/earthformer/earthformer_sevir_train.py | |
---|---|
构建评估器的代码为:
模型评估:
4.3.2 模型导出¶
构建模型的代码为:
examples/earthformer/earthformer_sevir_train.py | |
---|---|
实例化 ppsci.solver.Solver
:
examples/earthformer/earthformer_enso_train.py | |
---|---|
构建模型输入格式并导出静态模型:
examples/earthformer/earthformer_sevir_train.py | |
---|---|
InputSpec
函数中第一个设置模型输入尺寸,第二个参数设置输入数据类型,第三个设置输入数据的 Key
.
4.3.3 模型推理¶
创建预测器:
examples/earthformer/earthformer_sevir_train.py | |
---|---|
准备预测数据并进行对应模式的数据预处理:
进行模型预测并可视化:
5. 完整代码¶
examples/earthformer/earthformer_enso_train.py | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 |
|
examples/earthformer/earthformer_sevir_train.py | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 |
|
6. 结果展示¶
下图展示了云总降水量模型按照65分钟的输入数据,得到60分钟间隔的预测结果和真值结果。
说明:
Hit:TP, Miss:FN, False Alarm:FP
第一行: 输入数据;
第二行: 真值结果;
第三行: 预测结果;
第四行: 设定阈值为 74
情况下,TP、FN、FP 三种情况标记
第五行: 在所有阈值情况下,TP、FN、FP 三种情况标记