このコードベースは、Nature Communications の論文「確率的深層学習による季節的北極海氷予測」に付属しています。これには、すべての研究結果を最初から完全に再現するためのコードが含まれています。また、研究によって生成され、Polar Data Centre で公開されたデータをダウンロードし、論文のすべての図を再現するためのコードも含まれています。
コードの柔軟性により、研究の拡張が容易になります。データ処理パイプラインとカスタムIceNetDataLoader
クラスを使用すると、どの変数をネットワークに入力するか、どの気候シミュレーションを事前トレーニングに使用するか、どのくらい先の予測を行うかを指定できます。 IceNet モデルのアーキテクチャはicenet/models.py
で調整できます。予測する出力変数は、 IceNetDataLoader
クラスをリファクタリングすることによって変更することもできます。
@acocac によって作成されたこのコードベースのデモンストレーター (事前トレーニングされた IceNet ネットワークをダウンロードし、予測を生成および分析する) は、The Environmental Data Science Book にあります。
以下のガイドラインは、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 キーのインストール」の手順に従ってください。
IceNet と比較するために ECMWF SEAS5 予測データをダウンロードするには、まずここで 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) フィールドも計算します。バイアス補正された予測は、ディメンション(target date, y, x, lead time)
とともに NetCDF としてdata/forecasts/seas5/
に保存されます。
python3 icenet/gen_data_loader_config.py
。データローダー構成をセットアップします。これは、IceNet の入出力データ、train/val/test 分割などを記述した JSON ファイルとして保存されます。この設定ファイルは、カスタムIceNetDataLoader
クラスをインスタンス化するために使用されます。このリポジトリのdataloader_configs/
には、2 つの構成ファイルの例が提供されています。各構成ファイルは、タイムスタンプとユーザー指定の名前 (例: 2021_06_15_1854_icenet_nature_communications
) によって決定されるデータローダー ID によって識別されます。データ ローダー ID は、トレーニング スクリプトに設定されたアーキテクチャ ID とともに、データ構成とアーキテクチャによって IceNet アンサンブル モデルを一意に識別する「IceNet ID」を提供します。 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
の bool によって制御されます。
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 予測も計算され、別の小さなファイル (最初の 4 つの次元のみ) として保存されます。
各リードタイムに対する 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
データフレームに結果を保存します。 dask
使用して、予測データセット全体をメモリにロードすることを回避し、チャンクを並列処理して分析を大幅に高速化します。結果は、上書きを避けるためにタイムスタンプを付けて、 results/forecast_results/
に CSV ファイルとして保存されます。必要に応じて、最新の 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 ファイルが必要であることに注意してください。図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
、データ プリプロセッサ、データ ローダー、ERA5 および CMIP6 処理、学習率減衰、ビデオ機能などの IceNet ユーティリティ関数を定義します。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) に感謝します。