程式碼庫附帶《自然通訊》論文《利用機率深度學習進行季節性北極海冰預測》 。它包含從頭開始完全重現所有研究結果的程式碼。它還包括用於下載研究產生的資料(發佈在極地資料中心)的程式碼,並複製論文中的所有資料。
程式碼的靈活性簡化了研究的可能擴展。資料處理管道和自訂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) 對此程式碼庫的直接貢獻。