Diese Codebasis begleitet den Artikel von Nature Communications zur saisonalen Vorhersage des arktischen Meereises mit probabilistischem Deep Learning . Es enthält Code, um alle Ergebnisse der Studie von Grund auf vollständig zu reproduzieren. Es enthält auch Code zum Herunterladen der durch die Studie generierten, im Polar Data Centre veröffentlichten Daten und zur Reproduktion aller Zahlen des Papiers.
Die Flexibilität des Codes vereinfacht mögliche Erweiterungen der Studie. Mit der Datenverarbeitungspipeline und der benutzerdefinierten IceNetDataLoader
-Klasse können Sie bestimmen, welche Variablen in die Netzwerke eingegeben werden, welche Klimasimulationen für das Vortraining verwendet werden und wie weit im Voraus die Vorhersage erfolgen soll. Die Architektur des IceNet-Modells kann in icenet/models.py
angepasst werden. Die zu prognostizierende Ausgabevariable könnte sogar durch eine Umgestaltung der IceNetDataLoader
-Klasse geändert werden.
Ein von @acocac erstellter Demonstrator dieser Codebasis (Herunterladen vorab trainierter IceNet-Netzwerke, anschließendes Generieren und Analysieren von Prognosen) ist im „Environmental Data Science Book“ zu finden.
Bei den folgenden Richtlinien wird davon ausgegangen, dass Sie in der Befehlszeile eines Unix-ähnlichen Computers mit einer GPU arbeiten. Wenn alle Ergebnisse der Studie reproduziert werden sollen, sollte 1 TB Speicherplatz den Speicherbedarf der heruntergeladenen und generierten Daten sicher decken.
Wenn Sie auf Probleme stoßen oder Verbesserungsvorschläge haben, melden Sie bitte ein Problem oder senden Sie mir eine E-Mail ([email protected]).
Um die Papierzahlen direkt aus den Ergebnissen und Prognosen des Papiers zu reproduzieren, führen Sie nach dem Einrichten der Conda-Umgebung Folgendes aus (siehe Schritt 1 unten):
./download_paper_generated_data.sh
. Lädt Rohdaten aus dem Papier herunter. Von hier aus könnten Sie damit beginnen, die Ergebnisse der Arbeit detaillierter zu untersuchen.python3 icenet/download_sic_data.py
. Dies ist erforderlich, um die Eiskante der Grundwahrheit darzustellen. Beachten Sie, dass dieser Download zwischen 1 und 12 Stunden dauern kann.python3 icenet/gen_masks.py
python3 icenet/plot_paper_figures.py
. Figuren werden in figures/paper_figures/
gespeichert. Ich verwende Conda für die Paketverwaltung. Wenn Sie Conda noch nicht haben, können Sie es hier herunterladen.
Um ERA5-Daten herunterladen zu können, müssen Sie zunächst ein CDS-Konto einrichten und Ihre .cdsapirc
Datei füllen. Befolgen Sie hier die Anweisungen zum Installieren des CDS-API-Schlüssels.
Um die ECMWF SEAS5-Vorhersagedaten zum Vergleich mit IceNet herunterzuladen, müssen Sie sich zunächst hier bei ECMWF registrieren. Wenn Sie aus einem ECMWF-Mitgliedstaat kommen, können Sie dann Zugang zum ECMWF MARS-Katalog erhalten, indem Sie sich an Ihren Computervertreter wenden. Nach der Registrierung erhalten Sie hier Ihren API-Schlüssel und füllen die ECMWF-API-Einträge in icenet/config.py
aus.
Melden Sie sich unter https://wandb.ai/site an, um Trainingsläufe zu verfolgen und eine bayesianische Hyperparameter-Abstimmung mit Gewichten und Biases durchzuführen. Erhalten Sie hier Ihren API-Schlüssel und füllen Sie die Gewichtungen und Biases-Einträge in icenet/config.py
aus. Stellen Sie sicher, dass Sie angemeldet sind, indem Sie wandb login
ausführen, nachdem Sie die Conda-Umgebung eingerichtet haben.
Führen Sie nach dem Klonen des Repositorys die folgenden Befehle im Stammverzeichnis des Repositorys aus, um die Conda-Umgebung einzurichten:
conda install -n base mamba -c conda-forge
.mamba env create --file environment.yml
mamba env create --file environment.locked.yml
conda activate icenet
In diesem Projekt wird die CMIP6-Variablennamenskonvention verwendet – z. B. tas
für die Oberflächenlufttemperatur, siconca
für die Meereiskonzentration usw.
Achtung: Einige Downloads sind langsam und die Netto-Downloadzeit kann 1-2 Tage dauern. Es kann ratsam sein, ein Bash-Skript zu schreiben, das alle diese Befehle automatisch nacheinander ausführt, und es über ein Wochenende laufen zu lassen.
python3 icenet/gen_masks.py
. Dadurch erhält man Masken für Land, die Polarlöcher, die monatliche maximale Eisausdehnung (die „aktive Gitterzellenregion“) sowie die arktischen Regionen und Küsten.
python3 icenet/download_sic_data.py
. Lädt OSI-SAF SIC-Daten herunter. Dies berechnet serverseitig den Monatsdurchschnitt des SIC, lädt die Ergebnisse herunter und interpoliert fehlende Gitterzellen (z. B. Polarloch) bilinear. Beachten Sie, dass dieser Download zwischen 1 und 12 Stunden dauern kann.
./download_era5_data_in_parallel.sh
. Lädt ERA5-Reanalysedaten herunter. Dadurch werden mehrere parallele python3 icenet/download_era5_data.py
im Hintergrund ausgeführt, um jede ERA5-Variable abzurufen. Die ERA5-Rohdaten werden im globalen Breitengrad-Längengrad-Format heruntergeladen und in das EASE-Raster übertragen, auf dem die OSI-SAF-SIC-Daten liegen. Protokolle werden an logs/era5_download_logs/
ausgegeben.
./download_cmip6_data_in_parallel.sh
. Lädt CMIP6-Klimasimulationsdaten herunter. Dadurch werden mehrere parallele python3 icenet/download_cmip6_data.py
im Hintergrund ausgeführt, um jede Klimasimulation herunterzuladen. Die CMIP6-Rohdaten werden vom globalen Breitengrad-Längengrad-Format in das EASE-Raster umgerechnet, auf dem die OSI-SAF-SIC-Daten liegen. Protokolle werden an logs/cmip6_download_logs/
ausgegeben.
./rotate_wind_data_in_parallel.sh
. Dadurch werden im Hintergrund mehrere parallele python3 icenet/rotate_wind_data.py
ausgeführt, um die ERA5- und CMIP6-Windvektordaten auf dem EASE-Raster zu rotieren. Protokolle werden an logs/wind_rotation_logs/
ausgegeben.
./download_seas5_forecasts_in_parallel.sh
. Lädt ECMWF SEAS5 SIC-Prognosen herunter. Dadurch werden mehrere parallele python3 icenet/download_seas5_forecasts.py
-Befehle ausgeführt, um SEAS5-Prognosen für 2002–2020 für jede Vorlaufzeit über die ECMWF MARS API zu erfassen und die Prognosen in EASE umzurechnen. Die Vorhersagen werden unter data/forecasts/seas5/
in den Ordnern latlon/
und EASE/
gespeichert. Protokolle werden an logs/seas5_download_logs/
ausgegeben.
python3 icenet/biascorrect_seas5_forecasts.py
. Bias korrigiert die SEAS5 2012+ Prognosen anhand der Prognosen 2002–2011. Berechnet außerdem SEAS5-Meereiswahrscheinlichkeitsfelder (SIP). Die verzerrungskorrigierten Prognosen werden als NetCDFs in data/forecasts/seas5/
mit Dimensionen (target date, y, x, lead time)
gespeichert.
python3 icenet/gen_data_loader_config.py
. Richtet die Datenladekonfiguration ein. Dies wird als JSON-Datei gespeichert, die die Eingabe- und Ausgabedaten, Trainings-/Value-/Testaufteilungen usw. von IceNet vorgibt. Die Konfigurationsdatei wird zum Instanziieren der benutzerdefinierten IceNetDataLoader
-Klasse verwendet. Zwei Beispielkonfigurationsdateien werden in diesem Repository in dataloader_configs/
bereitgestellt. Jede Konfigurationsdatei wird durch eine Dataloader-ID identifiziert, die durch einen Zeitstempel und einen vom Benutzer bereitgestellten Namen bestimmt wird (z. B. 2021_06_15_1854_icenet_nature_communications
). Die Datenlade-ID stellt zusammen mit einer im Trainingsskript festgelegten Architektur-ID eine „IceNet-ID“ bereit, die ein IceNet-Ensemble-Modell anhand seiner Datenkonfiguration und Architektur eindeutig identifiziert. python3 icenet/preproc_icenet_data.py
. Normalisiert die NetCDF-Rohdaten und speichert sie als monatliche NumPy-Dateien. Die Normalisierungsparameter (Mittelwert/Standardabweichung oder Min./Max.) werden als JSON-Datei gespeichert, sodass neue Daten vorverarbeitet werden können, ohne dass die Normalisierung neu berechnet werden muss. Eine benutzerdefinierte IceNetDataPreProcessor-Klasse
Der Beobachtungs-Trainings- und Validierungsdatensatz für IceNet ist nur 23 GB groß, was auf einigen Systemen in den RAM passt und die Feinabstimmungs-Trainingsphase im Vergleich zur Verwendung des Datenladers erheblich beschleunigt. Um davon zu profitieren, führen Sie python3 icenet/gen_numpy_obs_train_val_datasets.py
aus, um NumPy-Tensoren für die Eingabe-/Ausgabedaten von train/val zu generieren. Um weiter von den Trainingsgeschwindigkeitsverbesserungen von tf.data
zu profitieren, generieren Sie mit python3 icenet/gen_tfrecords_obs_train_val_datasets.py
einen TFRecords-Datensatz aus den NumPy-Tensoren. Ob der Datenlader, NumPy-Arrays oder TFRecords-Datensätze für das Training verwendet werden sollen, wird durch Bools in icenet/train_icenet.py
gesteuert.
icenet/train_icenet.py
für die Hyperparameter-Optimierung ein: Setzen Sie die Bools vor dem Training und der Temperaturskalierung im Abschnitt „Benutzereingabe“ auf False
.wandb sweep icenet/sweep.yaml
wandb agent
-Befehl aus.python3 icenet/train_icenet.py
. Dabei werden Hyperameter-Einstellungen und der Zufallsstartwert für die Netzwerkgewichtsinitialisierung als Befehlszeileneingaben verwendet. Führen Sie dies mehrmals mit unterschiedlichen Einstellungen von --seed
aus, um ein Ensemble zu trainieren. Trainierte Netzwerke werden in trained_networks/<dataloader_ID>/<architecture_ID>/networks/
gespeichert. Wenn Sie auf einem gemeinsam genutzten Computer arbeiten und mit SLURM vertraut sind, möchten Sie diesen Befehl möglicherweise in ein SLURM-Skript einbinden. python3 icenet/predict_heldout_data.py
. Verwendet xarray
, um Vorhersagen über die Validierungs- und Testjahre (2012–2020) als NetCDFs für IceNet und den linearen Trend-Benchmark zu speichern. Die Prognosen von IceNet werden in data/forecasts/icenet/<dataloader_ID>/<architecture_ID>/
gespeichert. Für IceNet verfügt der vollständige Prognosedatensatz über Dimensionen (target date, y, x, lead time, ice class, seed)
, wobei seed
ein einzelnes Ensemblemitglied oder die Ensemble-Mittelwertprognose angibt. Eine Ensemble-Mittelwert-SIP-Prognose wird ebenfalls berechnet und als separate, kleinere Datei (die nur die ersten vier Dimensionen enthält) gespeichert.
Berechnen Sie den Ensemble-Mean-Temperaturskalierungsparameter von IceNet für jede Vorlaufzeit: python3 icenet/compute_ensemble_mean_temp_scaling.py
. Die neuen, auf Ensemble-Mitteltemperatur skalierten SIP-Vorhersagen werden unter data/forecasts/icenet/<dataloader_ID>/<architecture_ID>/icenet_sip_forecasts_tempscaled.nc
gespeichert. Diese Prognosen stellen das endgültige Ensemble-Mean-IceNet-Modell dar, das für die Arbeit verwendet wurde.
python3 icenet/analyse_heldout_predictions.py
. Lädt die NetCDF-Prognosedaten und berechnet Prognosemetriken, wobei die Ergebnisse in einem globalen pandas
-DataFrame mit MultiIndex
(model, ensemble member, lead time, target date)
und Spalten für jede Metrik (binäre Genauigkeit und Meereisausdehnungsfehler) gespeichert werden. Verwendet dask
, um zu vermeiden, dass die gesamten Prognosedatensätze in den Speicher geladen werden, und verarbeitet Teile parallel, um die Analyse erheblich zu beschleunigen. Die Ergebnisse werden als CSV-Dateien in results/forecast_results/
mit einem Zeitstempel gespeichert, um ein Überschreiben zu vermeiden. Laden Sie optional die neueste CSV-Datei vorab, um neue Modelle oder Metriken an die Ergebnisse anzuhängen, ohne vorhandene Modelle erneut analysieren zu müssen. Verwenden Sie diese Funktion, um Prognoseergebnisse von anderen IceNet-Modellen (identifiziert durch ihre Dataloader-ID und Architektur-ID) anzuhängen, um die Auswirkung von Designänderungen auf die Prognoseleistung zu verfolgen.
python3 icenet/analyse_uncertainty.py
. Bewertet die Kalibrierung der SIP-Vorhersagen von IceNet und SEAS5. Bestimmt außerdem die Eiskantenregion von IceNet und bewertet seine Fähigkeit zur Eiskantenbegrenzung. Die Ergebnisse werden in results/uncertainty_results/
gespeichert.
python3 icenet/permute_and_predict.py
. Die Ergebnisse werden in results/permute_and_predict_results/
gespeichert.python3 icenet/plot_paper_figures.py
. Figuren werden in figures/paper_figures/
gespeichert. Beachten Sie, dass Sie die Sea Ice Outlook-Fehlerdatei im CSV-Format benötigen, um Supp darzustellen. Abb. 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
definiert IceNet-Dienstprogrammfunktionen wie den Datenpräprozessor, den Datenlader, die ERA5- und CMIP6-Verarbeitung, den Lernratenabfall und die Videofunktionalität.icenet/models.py
definiert Netzwerkarchitekturen.icenet/config.py
definiert Globals.icenet/losses.py
definiert Verlustfunktionen.icenet/callbacks.py
definiert Trainingsrückrufe.icenet/metrics.py
definiert Trainingsmetriken.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
:
Vielen Dank an James Byrne (BAS) und Tony Phillips (BAS) für direkte Beiträge zu dieser Codebasis.