Basis kode ini menyertai makalah Nature Communications , prakiraan es laut Arktik Musiman dengan pembelajaran mendalam probabilistik . Ini mencakup kode untuk mereproduksi sepenuhnya semua hasil penelitian dari awal. Ini juga mencakup kode untuk mengunduh data yang dihasilkan oleh penelitian tersebut, yang dipublikasikan di Pusat Data Polar, dan mereproduksi semua angka yang ada di makalah tersebut.
Fleksibilitas kode menyederhanakan kemungkinan perluasan penelitian. Jalur pemrosesan data dan kelas IceNetDataLoader
khusus memungkinkan Anda menentukan variabel mana yang dimasukkan ke jaringan, simulasi iklim mana yang digunakan untuk pra-pelatihan, dan seberapa jauh perkiraan ke depan. Arsitektur model IceNet dapat diadaptasi di icenet/models.py
. Variabel keluaran yang diperkirakan bahkan dapat diubah dengan memfaktorkan ulang kelas IceNetDataLoader
.
Demonstrasi basis kode ini (mengunduh jaringan IceNet yang telah dilatih sebelumnya, lalu membuat dan menganalisis perkiraan) yang dihasilkan oleh @acocac dapat ditemukan di The Environmental Data Science Book.
Panduan di bawah ini mengasumsikan Anda bekerja di baris perintah mesin mirip Unix dengan GPU. Jika ingin mereproduksi semua hasil penelitian, ruang sebesar 1 TB harus memenuhi kebutuhan penyimpanan data yang diunduh dan dihasilkan dengan aman.
Jika Anda mengalami masalah atau memiliki saran untuk perbaikan, silakan ajukan masalah atau kirim email kepada saya ([email protected]).
Untuk mereproduksi angka makalah secara langsung dari hasil dan prakiraan makalah, jalankan perintah berikut setelah menyiapkan lingkungan conda (lihat Langkah 1 di bawah):
./download_paper_generated_data.sh
. Mengunduh data mentah dari kertas. Dari sini, Anda bisa mulai mengeksplorasi hasil makalah lebih detail.python3 icenet/download_sic_data.py
. Hal ini diperlukan untuk memetakan tepian es kebenaran dasar. Perhatikan bahwa pengunduhan ini dapat memakan waktu antara 1 hingga 12 jam untuk diselesaikan.python3 icenet/gen_masks.py
python3 icenet/plot_paper_figures.py
. Gambar disimpan dalam figures/paper_figures/
. Saya menggunakan conda untuk manajemen paket. Jika Anda belum memiliki conda, Anda dapat mendownloadnya di sini.
Untuk dapat mendownload data ERA5, Anda harus terlebih dahulu menyiapkan akun CDS dan mengisi file .cdsapirc
Anda. Ikuti petunjuk 'Instal kunci CDS API' di sini.
Untuk mendownload data prakiraan ECMWF SEAS5 untuk dibandingkan dengan IceNet, Anda harus mendaftar terlebih dahulu ke ECMWF di sini. Jika Anda berasal dari Negara Anggota ECMWF, Anda dapat memperoleh akses ke Katalog MARS ECMWF dengan menghubungi Perwakilan Komputasi Anda. Setelah terdaftar, dapatkan kunci API Anda di sini dan isi entri API ECMWF di icenet/config.py
.
Untuk melacak proses pelatihan dan melakukan penyetelan hyperparameter Bayesian dengan Bobot dan Bias, daftar di https://wandb.ai/site. Dapatkan kunci API Anda dari sini dan isi entri Bobot dan Bias di icenet/config.py
. Pastikan Anda masuk dengan menjalankan wandb login
setelah mengatur lingkungan conda.
Setelah mengkloning repo, jalankan perintah di bawah ini di root repositori untuk mengatur lingkungan 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
Konvensi penamaan variabel CMIP6 digunakan di seluruh proyek ini - misalnya tas
untuk suhu udara permukaan, siconca
untuk konsentrasi es laut, dll.
Peringatan: beberapa unduhan lambat dan waktu pengunduhan bersih bisa memakan waktu 1-2 hari. Mungkin disarankan untuk menulis skrip bash untuk secara otomatis menjalankan semua perintah ini secara berurutan dan menjalankannya selama akhir pekan.
python3 icenet/gen_masks.py
. Hal ini menghasilkan masker untuk daratan, lubang kutub, luas es maksimum bulanan ('wilayah sel jaringan aktif'), dan wilayah Arktik & garis pantai.
python3 icenet/download_sic_data.py
. Mengunduh data OSI-SAF SIC. Ini menghitung rata-rata bulanan sisi server SIC, mengunduh hasilnya, dan menginterpolasi sel jaringan yang hilang secara bilinear (misalnya lubang kutub). Perhatikan bahwa pengunduhan ini dapat memakan waktu antara 1 hingga 12 jam untuk diselesaikan.
./download_era5_data_in_parallel.sh
. Mengunduh data analisis ulang ERA5. Ini menjalankan beberapa perintah paralel python3 icenet/download_era5_data.py
di latar belakang untuk memperoleh setiap variabel ERA5. Data mentah ERA5 diunduh dalam format lintang-bujur global dan dimasukkan kembali ke grid EASE tempat data OSI-SAF SIC berada. Log dikeluarkan ke logs/era5_download_logs/
.
./download_cmip6_data_in_parallel.sh
. Mengunduh data simulasi iklim CMIP6. Ini menjalankan beberapa perintah paralel python3 icenet/download_cmip6_data.py
di latar belakang untuk mengunduh setiap simulasi iklim. Data CMIP6 mentah disusun ulang dari format lintang-bujur global ke grid EASE tempat data OSI-SAF SIC berada. Log dikeluarkan ke logs/cmip6_download_logs/
./rotate_wind_data_in_parallel.sh
. Ini menjalankan beberapa perintah paralel python3 icenet/rotate_wind_data.py
di latar belakang untuk memutar data vektor angin ERA5 dan CMIP6 ke grid EASE. Log dikeluarkan ke logs/wind_rotation_logs/
.
./download_seas5_forecasts_in_parallel.sh
. Unduh perkiraan ECMWF SEAS5 SIC. Ini menjalankan beberapa perintah python3 icenet/download_seas5_forecasts.py
paralel untuk memperoleh perkiraan SEAS5 2002-2020 untuk setiap waktu tunggu melalui ECMWF MARS API dan mengatur ulang perkiraan tersebut ke EASE. Prakiraan disimpan ke data/forecasts/seas5/
di folder latlon/
dan EASE/
. Log dikeluarkan ke logs/seas5_download_logs/
.
python3 icenet/biascorrect_seas5_forecasts.py
. Bias mengoreksi perkiraan SEAS5 2012+ dengan menggunakan perkiraan tahun 2002-2011. Juga menghitung bidang probabilitas es laut (SIP) SEAS5. Perkiraan yang telah dikoreksi bias disimpan sebagai NetCDF dalam data/forecasts/seas5/
dengan dimensi (target date, y, x, lead time)
.
python3 icenet/gen_data_loader_config.py
. Menyiapkan konfigurasi pemuat data. Ini disimpan sebagai file JSON yang menentukan data masukan dan keluaran IceNet, pemisahan kereta/val/pengujian, dll. File konfigurasi digunakan untuk membuat instance kelas IceNetDataLoader
khusus. Dua contoh file konfigurasi disediakan dalam repositori ini di dataloader_configs/
. Setiap file konfigurasi diidentifikasi oleh ID pemuat data, ditentukan oleh stempel waktu dan nama yang diberikan pengguna (misalnya 2021_06_15_1854_icenet_nature_communications
). ID pemuat data, bersama dengan ID arsitektur yang ditetapkan dalam skrip pelatihan, memberikan 'ID IceNet' yang secara unik mengidentifikasi model ansambel IceNet berdasarkan konfigurasi dan arsitektur datanya. python3 icenet/preproc_icenet_data.py
. Menormalkan data NetCDF mentah dan menyimpannya sebagai file NumPy bulanan. Parameter normalisasi (mean/std dev atau min/max) disimpan sebagai file JSON sehingga data baru dapat diproses terlebih dahulu tanpa harus menghitung ulang normalisasi. Kelas IceNetDataPreProcessor khusus
Kumpulan data pelatihan observasional & validasi untuk IceNet hanya berukuran 23 GB, yang dapat memuat RAM pada beberapa sistem dan secara signifikan mempercepat fase pelatihan penyempurnaan dibandingkan dengan menggunakan pemuat data. Untuk memanfaatkannya, jalankan python3 icenet/gen_numpy_obs_train_val_datasets.py
untuk menghasilkan tensor NumPy untuk data input/output train/val. Untuk mendapatkan manfaat lebih lanjut dari peningkatan kecepatan pelatihan tf.data
, buat kumpulan data TFRecords dari tensor NumPy menggunakan python3 icenet/gen_tfrecords_obs_train_val_datasets.py
. Apakah akan menggunakan pemuat data, larik NumPy, atau kumpulan data TFRecords untuk pelatihan dikontrol oleh bools di icenet/train_icenet.py
.
icenet/train_icenet.py
untuk penyetelan hyperparameter: Setel bools pra-pelatihan dan penskalaan suhu ke False
di bagian input pengguna.wandb sweep icenet/sweep.yaml
wandb agent
yang tercetak.python3 icenet/train_icenet.py
. Ini memerlukan pengaturan hyperameter dan seed acak untuk inisialisasi bobot jaringan sebagai input baris perintah. Jalankan ini beberapa kali dengan pengaturan --seed
yang berbeda untuk melatih ansambel. Jaringan terlatih disimpan di trained_networks/<dataloader_ID>/<architecture_ID>/networks/
. Jika bekerja pada mesin bersama dan terbiasa dengan SLURM, Anda mungkin ingin menggabungkan perintah ini dalam skrip SLURM. python3 icenet/predict_heldout_data.py
. Menggunakan xarray
untuk menyimpan prediksi selama tahun validasi dan pengujian (2012-2020) sebagai NetCDF untuk IceNet dan tolok ukur tren linier. Perkiraan IceNet disimpan di data/forecasts/icenet/<dataloader_ID>/<architecture_ID>/
. Untuk IceNet, kumpulan data perkiraan lengkap memiliki dimensi (target date, y, x, lead time, ice class, seed)
, dengan seed
yang menentukan satu anggota ansambel atau perkiraan rata-rata ansambel. Perkiraan SIP rata-rata ansambel juga dihitung dan disimpan sebagai file terpisah yang lebih kecil (yang hanya memiliki empat dimensi pertama).
Hitung parameter penskalaan suhu rata-rata ansambel IceNet untuk setiap waktu tunggu: python3 icenet/compute_ensemble_mean_temp_scaling.py
. Perkiraan SIP skala suhu rata-rata ansambel yang baru disimpan ke data/forecasts/icenet/<dataloader_ID>/<architecture_ID>/icenet_sip_forecasts_tempscaled.nc
. Perkiraan ini mewakili model IceNet rata-rata ensembel akhir yang digunakan untuk makalah ini.
python3 icenet/analyse_heldout_predictions.py
. Memuat data perkiraan NetCDF dan menghitung metrik perkiraan, menyimpan hasil dalam DataFrame pandas
global dengan MultiIndex
(model, ensemble member, lead time, target date)
dan kolom untuk setiap metrik (akurasi biner dan kesalahan luasan es laut). Menggunakan dask
untuk menghindari memuat seluruh kumpulan data perkiraan ke dalam memori, memproses potongan secara paralel untuk mempercepat analisis secara signifikan. Hasil disimpan sebagai file CSV di results/forecast_results/
dengan stempel waktu untuk menghindari penimpaan. Secara opsional, muat file CSV terbaru untuk menambahkan model atau metrik baru ke hasil tanpa perlu menganalisis ulang model yang ada. Gunakan fitur ini untuk menambahkan hasil perkiraan dari model IceNet lainnya (diidentifikasi berdasarkan ID pemuat data dan ID arsitekturnya) untuk melacak pengaruh perubahan desain pada performa perkiraan.
python3 icenet/analyse_uncertainty.py
. Menilai kalibrasi perkiraan SIP IceNet dan SEAS5. Juga menentukan wilayah tepi es IceNet dan menilai kemampuan membatasi tepi esnya. Hasil disimpan di results/uncertainty_results/
.
python3 icenet/permute_and_predict.py
. Hasil disimpan di results/permute_and_predict_results/
.python3 icenet/plot_paper_figures.py
. Gambar disimpan dalam figures/paper_figures/
. Catatan, Anda memerlukan file CSV kesalahan Sea Ice Outlook untuk memplot Supp. Gambar 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
mendefinisikan fungsi utilitas IceNet seperti praprosesor data, pemuat data, pemrosesan ERA5 dan CMIP6, peluruhan kecepatan pembelajaran, dan fungsionalitas video.icenet/models.py
mendefinisikan arsitektur jaringan.icenet/config.py
mendefinisikan global.icenet/losses.py
mendefinisikan fungsi kerugian.icenet/callbacks.py
mendefinisikan panggilan balik pelatihan.icenet/metrics.py
mendefinisikan metrik pelatihan.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
:
Terima kasih kepada James Byrne (BAS) dan Tony Phillips (BAS) atas kontribusi langsung pada basis kode ini.