该代码库附带《自然通讯》论文《利用概率深度学习进行季节性北极海冰预测》 。它包含从头开始完全重现所有研究结果的代码。它还包括用于下载研究生成的数据(发布在极地数据中心)的代码,并复制论文中的所有数据。
代码的灵活性简化了研究的可能扩展。数据处理管道和自定义IceNetDataLoader
类可让您指定将哪些变量输入到网络中、使用哪些气候模拟进行预训练以及预测多久。 IceNet模型的架构可以在icenet/models.py
中进行调整。甚至可以通过重构IceNetDataLoader
类来更改要预测的输出变量。
由 @acocac 制作的该代码库的演示程序(下载预先训练的 IceNet 网络,然后生成和分析预测)可以在环境数据科学书中找到。
以下指南假设您正在带有 GPU 的类 Unix 机器的命令行中工作。如果旨在重现所有研究结果,1 TB 空间应安全满足下载和生成的数据的存储要求。
如果您遇到问题或有改进建议,请提出问题或给我发送电子邮件 ([email protected])。
要直接从论文结果和预测中重现论文数据,请在设置 conda 环境后运行以下命令(请参阅下面的步骤 1):
./download_paper_generated_data.sh
。从论文中下载原始数据。从这里开始,您可以开始更详细地探索论文的结果。python3 icenet/download_sic_data.py
。这是绘制地面真实冰边缘所需的。请注意,此下载可能需要 1 到 12 小时才能完成。python3 icenet/gen_masks.py
python3 icenet/plot_paper_figures.py
。数字保存在figures/paper_figures/
中。 我使用 conda 进行包管理。如果您还没有 conda,可以在此处下载。
为了能够下载 ERA5 数据,您必须首先设置 CDS 帐户并填充.cdsapirc
文件。请按照此处的“安装 CDS API 密钥”说明进行操作。
要下载 ECMWF SEAS5 预报数据以与 IceNet 进行比较,您必须首先在此处注册 ECMWF。如果您来自 ECMWF 成员国,则可以通过联系您的计算代表来访问 ECMWF MARS 目录。注册后,请在此处获取您的 API 密钥并在icenet/config.py
中填写 ECMWF API 条目。
要跟踪训练运行并使用权重和偏差执行贝叶斯超参数调整,请在 https://wandb.ai/site 上注册。从此处获取您的 API 密钥并填写icenet/config.py
中的权重和偏差条目。设置 conda 环境后,通过运行wandb login
确保您已登录。
克隆存储库后,在存储库的根目录中运行以下命令来设置 conda 环境:
conda install -n base mamba -c conda-forge
。mamba env create --file environment.yml
mamba env create --file environment.locked.yml
conda activate icenet
整个项目均使用 CMIP6 变量命名约定 - 例如, tas
表示地表空气温度, siconca
表示海冰浓度等。
警告:有些下载速度很慢,网络下载时间可能需要 1-2 天。建议编写一个 bash 脚本来自动按顺序执行所有这些命令并在周末运行它。
python3 icenet/gen_masks.py
。这可以获得陆地、极洞、每月最大冰范围(“活动网格单元区域”)以及北极地区和海岸线的掩模。
python3 icenet/download_sic_data.py
。下载 OSI-SAF SIC 数据。这会在服务器端计算每月平均 SIC,下载结果,并双线性插值缺失的网格单元(例如极洞)。请注意,此下载可能需要 1 到 12 小时才能完成。
./download_era5_data_in_parallel.sh
。下载 ERA5 再分析数据。这会在后台运行多个并行python3 icenet/download_era5_data.py
命令来获取每个 ERA5 变量。原始 ERA5 数据以全球纬度-经度格式下载,并重新网格化到 OSI-SAF SIC 数据所在的 EASE 网格。日志输出到logs/era5_download_logs/
。
./download_cmip6_data_in_parallel.sh
。下载CMIP6气候模拟数据。这会在后台运行多个并行的python3 icenet/download_cmip6_data.py
命令来下载每个气候模拟。原始 CMIP6 数据从全球经纬度格式重新网格化为 OSI-SAF SIC 数据所在的 EASE 网格。日志输出到logs/cmip6_download_logs/
./rotate_wind_data_in_parallel.sh
。这会在后台运行多个并行的python3 icenet/rotate_wind_data.py
命令,以将 ERA5 和 CMIP6 风矢量数据旋转到 EASE 网格上。日志输出到logs/wind_rotation_logs/
。
./download_seas5_forecasts_in_parallel.sh
。下载 ECMWF SEAS5 SIC 预测。它运行多个并行的python3 icenet/download_seas5_forecasts.py
命令,通过 ECMWF MARS API 获取每个提前期的 2002-2020 SEAS5 预测,并将预测重新网格化为 EASE。预测将保存到文件夹latlon/
和EASE/
中的data/forecasts/seas5/
中。日志输出到logs/seas5_download_logs/
。
python3 icenet/biascorrect_seas5_forecasts.py
。偏差使用 2002-2011 年的预测修正了 SEAS5 2012+ 的预测。还计算 SEAS5 海冰概率 (SIP) 字段。偏差校正后的预测在data/forecasts/seas5/
中保存为 NetCDF,其维度为(target date, y, x, lead time)
。
python3 icenet/gen_data_loader_config.py
。设置数据加载器配置。这被保存为 JSON 文件,指示 IceNet 的输入和输出数据、训练/验证/测试拆分等。配置文件用于实例化自定义IceNetDataLoader
类。此存储库的dataloader_configs/
中提供了两个示例配置文件。每个配置文件都由数据加载器 ID 标识,该 ID 由时间戳和用户提供的名称(例如2021_06_15_1854_icenet_nature_communications
)确定。数据加载器 ID 与训练脚本中设置的架构 ID 一起提供“IceNet ID”,该 ID 通过其数据配置和架构来唯一标识 IceNet 集成模型。 python3 icenet/preproc_icenet_data.py
。标准化原始 NetCDF 数据并将其保存为每月 NumPy 文件。标准化参数(平均值/标准偏差或最小值/最大值)保存为 JSON 文件,以便可以预处理新数据,而无需重新计算标准化。自定义 IceNetDataPreProcessor 类
IceNet 的观察训练和验证数据集只有 23 GB,可以放入某些系统的 RAM 中,与使用数据加载器相比,可以显着加快微调训练阶段的速度。要从中受益,请运行python3 icenet/gen_numpy_obs_train_val_datasets.py
为 train/val 输入/输出数据生成 NumPy 张量。为了进一步受益于tf.data
训练速度的提高,请使用python3 icenet/gen_tfrecords_obs_train_val_datasets.py
从 NumPy 张量生成 TFRecords 数据集。是否使用数据加载器、NumPy 数组或 TFRecords 数据集进行训练由icenet/train_icenet.py
中的布尔值控制。
icenet/train_icenet.py
以进行超参数调整:在用户输入部分将预训练和温度缩放布尔值设置为False
。wandb sweep icenet/sweep.yaml
wandb agent
命令。python3 icenet/train_icenet.py
训练 IceNet 网络。这将超参数设置和网络权重初始化的随机种子作为命令行输入。使用不同的--seed
设置多次运行此命令来训练整体。训练后的网络保存在trained_networks/<dataloader_ID>/<architecture_ID>/networks/
中。如果在共享计算机上工作并且熟悉 SLURM,您可能希望将此命令包装在 SLURM 脚本中。python3 icenet/predict_heldout_data.py
。使用xarray
将验证和测试年份(2012-2020)的预测保存为 IceNet 和线性趋势基准的 NetCDF。 IceNet的预测保存在data/forecasts/icenet/<dataloader_ID>/<architecture_ID>/
中。对于 IceNet,完整的预测数据集具有维度(target date, y, x, lead time, ice class, seed)
,其中seed
指定单个集合成员或集合平均预测。还会计算整体平均 SIP 预测并将其保存为单独的较小文件(仅具有前四个维度)。
计算每个提前期的 IceNet 的集合平均温度缩放参数: python3 icenet/compute_ensemble_mean_temp_scaling.py
。新的整体平均温度缩放 SIP 预测将保存到data/forecasts/icenet/<dataloader_ID>/<architecture_ID>/icenet_sip_forecasts_tempscaled.nc
。这些预测代表了本文使用的最终整体平均 IceNet 模型。
python3 icenet/analyse_heldout_predictions.py
。加载 NetCDF 预测数据并计算预测指标,将结果存储在具有MultiIndex
(model, ensemble member, lead time, target date)
和每个指标的列(二进制精度和海冰范围误差)的全局pandas
DataFrame 中。使用dask
避免将整个预测数据集加载到内存中,并行处理块以显着加快分析速度。结果以 CSV 文件形式保存在results/forecast_results/
中,并带有时间戳以避免覆盖。 (可选)预加载最新的 CSV 文件以将新模型或指标附加到结果中,而无需重新分析现有模型。使用此功能附加来自其他 IceNet 模型的预测结果(由其数据加载器 ID 和架构 ID 标识),以跟踪设计更改对预测性能的影响。
python3 icenet/analyse_uncertainty.py
。评估 IceNet 和 SEAS5 的 SIP 预测的校准。还确定 IceNet 的冰边缘区域并评估其冰边缘边界能力。结果保存在results/uncertainty_results/
中。
python3 icenet/permute_and_predict.py
。结果存储在results/permute_and_predict_results/
中。python3 icenet/plot_paper_figures.py
。数字保存在figures/paper_figures/
中。请注意,您将需要 Sea Ice Outlook 错误 CSV 文件来绘制 Supp。图5: wget -O data/sea_ice_outlook_errors.csv 'https://ramadda.data.bas.ac.uk/repository/entry/get/sea_ice_outlook_errors.csv?entryid=synth%3A71820e7d-c628-4e32-969f-464b7efb187c%3AL3Jlc3VsdHMvb3V0bG9va19lcnJvcnMvc2VhX2ljZV9vdXRsb29rX2Vycm9ycy5jc3Y%3D'
icenet/utils.py
定义了 IceNet 实用功能,例如数据预处理器、数据加载器、ERA5 和 CMIP6 处理、学习率衰减和视频功能。icenet/models.py
定义网络架构。icenet/config.py
定义全局变量。icenet/losses.py
定义损失函数。icenet/callbacks.py
定义训练回调。icenet/metrics.py
定义训练指标。tree
输出 .
├── data
│ ├── obs
│ ├── cmip6
│ │ ├── EC-Earth3
│ │ │ ├── r10i1p1f1
│ │ │ ├── r12i1p1f1
│ │ │ ├── r14i1p1f1
│ │ │ ├── r2i1p1f1
│ │ │ └── r7i1p1f1
│ │ └── MRI-ESM2-0
│ │ ├── r1i1p1f1
│ │ ├── r2i1p1f1
│ │ ├── r3i1p1f1
│ │ ├── r4i1p1f1
│ │ └── r5i1p1f1
│ ├── forecasts
│ │ ├── icenet
│ │ │ ├── 2021_06_15_1854_icenet_nature_communications
│ │ │ │ └── unet_tempscale
│ │ │ └── 2021_06_30_0954_icenet_pretrain_ablation
│ │ │ └── unet_tempscale
│ │ ├── linear_trend
│ │ └── seas5
│ │ ├── EASE
│ │ └── latlon
│ ├── masks
│ └── network_datasets
│ └── dataset1
│ ├── meta
│ ├── obs
│ ├── transfer
│ └── norm_params.json
├── dataloader_configs
│ ├── 2021_06_15_1854_icenet_nature_communications.json
│ └── 2021_06_30_0954_icenet_pretrain_ablation.json
├── figures
├── icenet
├── logs
│ ├── cmip6_download_logs
│ ├── era5_download_logs
│ ├── seas5_download_logs
│ └── wind_rotation_logs
├── results
│ ├── forecast_results
│ │ └── 2021_07_01_183913_forecast_results.csv
│ ├── permute_and_predict_results
│ │ └── permute_and_predict_results.csv
│ └── uncertainty_results
│ ├── ice_edge_region_results.csv
│ ├── sip_bounding_results.csv
│ └── uncertainty_results.csv
└── trained_networks
└── 2021_06_15_1854_icenet_nature_communications
├── obs_train_val_data
│ ├── numpy
│ └── tfrecords
│ ├── train
│ └── val
└── unet_tempscale
└── networks
├── network_tempscaled_36.h5
├── network_tempscaled_37.h5
:
感谢 James Byrne (BAS) 和 Tony Phillips (BAS) 对此代码库的直接贡献。