Esta base de código acompaña al artículo de Nature Communications Pronóstico estacional del hielo marino del Ártico con aprendizaje profundo probabilístico . Incluye código para reproducir íntegramente todos los resultados del estudio desde cero. También incluye un código para descargar los datos generados por el estudio, publicados en el Polar Data Centre, y reproducir todas las cifras del artículo.
La flexibilidad del código simplifica posibles ampliaciones del estudio. La canalización de procesamiento de datos y la clase IceNetDataLoader
personalizada le permiten dictar qué variables se ingresan a las redes, qué simulaciones climáticas se utilizan para el entrenamiento previo y con qué anticipación se deben pronosticar. La arquitectura del modelo IceNet se puede adaptar en icenet/models.py
. La variable de salida a pronosticar podría incluso cambiarse refactorizando la clase IceNetDataLoader
.
En The Environmental Data Science Book se puede encontrar un demostrador de este código base (descarga de redes IceNet previamente capacitadas y luego generación y análisis de pronósticos) producido por @acocac.
Las siguientes pautas asumen que estás trabajando en la línea de comandos de una máquina tipo Unix con una GPU. Si se pretende reproducir todos los resultados del estudio, 1 TB de espacio debería cubrir de forma segura los requisitos de almacenamiento de los datos descargados y generados.
Si tiene problemas o tiene sugerencias para mejorar, plantee un problema o envíeme un correo electrónico ([email protected]).
Para reproducir las cifras en papel directamente a partir de los resultados y pronósticos del documento, ejecute lo siguiente después de configurar el entorno conda (consulte el Paso 1 a continuación):
./download_paper_generated_data.sh
. Descarga datos sin procesar del documento. A partir de aquí, podría empezar a explorar los resultados del artículo con más detalle.python3 icenet/download_sic_data.py
. Esto es necesario para trazar el borde del hielo real del terreno. Tenga en cuenta que esta descarga puede tardar entre 1 y 12 horas en completarse.python3 icenet/gen_masks.py
python3 icenet/plot_paper_figures.py
. Las figuras se guardan en figures/paper_figures/
. Utilizo conda para la gestión de paquetes. Si aún no tienes conda, puedes descargarlo aquí.
Para poder descargar datos de ERA5, primero debe configurar una cuenta CDS y completar su archivo .cdsapirc
. Siga las instrucciones para 'Instalar la clave API de CDS' aquí.
Para descargar los datos de pronóstico del ECMWF SEAS5 para compararlos con IceNet, primero debe registrarse en el ECMWF aquí. Si es de un estado miembro del ECMWF, puede obtener acceso al catálogo MARS del ECMWF comunicándose con su representante de informática. Una vez registrado, obtenga su clave API aquí y complete las entradas de la API de ECMWF en icenet/config.py
.
Para realizar un seguimiento de las carreras de entrenamiento y realizar ajustes de hiperparámetros bayesianos con pesos y sesgos, regístrese en https://wandb.ai/site. Obtenga su clave API desde aquí y complete las entradas de Pesos y Sesgos en icenet/config.py
. Asegúrese de haber iniciado sesión ejecutando wandb login
después de configurar el entorno conda.
Después de clonar el repositorio, ejecute los siguientes comandos en la raíz del repositorio para configurar el entorno 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
A lo largo de este proyecto se utiliza la convención de nomenclatura de variables CMIP6: por ejemplo, tas
para la temperatura del aire en la superficie, siconca
para la concentración de hielo marino, etc.
Advertencia: algunas descargas son lentas y el tiempo de descarga neta puede tardar entre 1 y 2 días. Puede ser recomendable escribir un script bash para ejecutar automáticamente todos estos comandos en secuencia y ejecutarlo durante un fin de semana.
python3 icenet/gen_masks.py
. Esto obtiene máscaras para la tierra, los agujeros polares, la extensión máxima mensual de hielo (la 'región de celda de cuadrícula activa') y las regiones y costas del Ártico.
python3 icenet/download_sic_data.py
. Descarga datos OSI-SAF SIC. Esto calcula el promedio mensual del lado del servidor SIC, descarga los resultados e interpola bilinealmente las celdas faltantes de la cuadrícula (por ejemplo, el agujero polar). Tenga en cuenta que esta descarga puede tardar entre 1 y 12 horas en completarse.
./download_era5_data_in_parallel.sh
. Descarga datos de reanálisis de ERA5. Esto ejecuta múltiples comandos paralelos python3 icenet/download_era5_data.py
en segundo plano para adquirir cada variable ERA5. Los datos sin procesar de ERA5 se descargan en formato global de latitud y longitud y se vuelven a registrar en la cuadrícula EASE en la que se encuentran los datos OSI-SAF SIC. Los registros se envían a logs/era5_download_logs/
.
./download_cmip6_data_in_parallel.sh
. Descarga datos de simulación climática CMIP6. Esto ejecuta múltiples comandos paralelos python3 icenet/download_cmip6_data.py
en segundo plano para descargar cada simulación climática. Los datos CMIP6 sin procesar se vuelven a clasificar desde el formato global de latitud y longitud a la cuadrícula EASE en la que se encuentran los datos OSI-SAF SIC. Los registros se envían a logs/cmip6_download_logs/
./rotate_wind_data_in_parallel.sh
. Esto ejecuta múltiples comandos paralelos python3 icenet/rotate_wind_data.py
en segundo plano para rotar los datos del vector de viento ERA5 y CMIP6 en la cuadrícula EASE. Los registros se envían a logs/wind_rotation_logs/
.
./download_seas5_forecasts_in_parallel.sh
. Descarga las previsiones del SIC ECMWF SEAS5. Esto ejecuta múltiples comandos paralelos python3 icenet/download_seas5_forecasts.py
para adquirir pronósticos SEAS5 2002-2020 para cada tiempo de entrega a través de la API ECMWF MARS y volver a clasificar los pronósticos para EASE. Los pronósticos se guardan en data/forecasts/seas5/
en las carpetas latlon/
y EASE/
. Los registros se envían a logs/seas5_download_logs/
.
python3 icenet/biascorrect_seas5_forecasts.py
. Bias corrige las previsiones del SEAS5 2012+ utilizando las previsiones del período 2002-2011. También calcula los campos de probabilidad de hielo marino (SIP) de SEAS5. Los pronósticos con corrección de sesgo se guardan como NetCDF en data/forecasts/seas5/
con dimensiones (target date, y, x, lead time)
.
python3 icenet/gen_data_loader_config.py
. Establece la configuración del cargador de datos. Esto se guarda como un archivo JSON que dicta los datos de entrada y salida de IceNet, divisiones de tren/val/prueba, etc. El archivo de configuración se utiliza para crear una instancia de la clase IceNetDataLoader
personalizada. Se proporcionan dos archivos de configuración de ejemplo en este repositorio en dataloader_configs/
. Cada archivo de configuración se identifica mediante un ID de cargador de datos, determinado por una marca de tiempo y un nombre proporcionado por el usuario (por ejemplo, 2021_06_15_1854_icenet_nature_communications
). El ID del cargador de datos, junto con un ID de arquitectura establecido en el script de entrenamiento, proporciona un 'ID de IceNet' que identifica de forma única un modelo de conjunto IceNet por su configuración y arquitectura de datos. python3 icenet/preproc_icenet_data.py
. Normaliza los datos NetCDF sin procesar y los guarda como archivos NumPy mensuales. Los parámetros de normalización (media/desv estándar o mín/máx) se guardan como un archivo JSON para que se puedan preprocesar nuevos datos sin tener que volver a calcular la normalización. Una clase IceNetDataPreProcessor personalizada
El conjunto de datos de validación y entrenamiento por observación para IceNet tiene solo 23 GB, lo que puede caber en RAM en algunos sistemas y acelerar significativamente la fase de entrenamiento de ajuste en comparación con el uso del cargador de datos. Para beneficiarse de esto, ejecute python3 icenet/gen_numpy_obs_train_val_datasets.py
para generar tensores NumPy para los datos de entrada/salida del tren/val. Para beneficiarse aún más de las mejoras en la velocidad de entrenamiento de tf.data
, genere un conjunto de datos TFRecords a partir de los tensores NumPy usando python3 icenet/gen_tfrecords_obs_train_val_datasets.py
. El uso del cargador de datos, las matrices NumPy o los conjuntos de datos TFRecords para el entrenamiento se controla mediante bools en icenet/train_icenet.py
.
icenet/train_icenet.py
para el ajuste de hiperparámetros: establezca los bools de escalamiento de temperatura y preentrenamiento en False
en la sección de entrada del usuario.wandb sweep icenet/sweep.yaml
wandb agent
que está impreso.python3 icenet/train_icenet.py
. Esto toma la configuración del hiperámetro y la semilla aleatoria para la inicialización del peso de la red como entradas de la línea de comando. Ejecute esto varias veces con diferentes configuraciones de --seed
para entrenar un conjunto. Las redes entrenadas se guardan en trained_networks/<dataloader_ID>/<architecture_ID>/networks/
. Si trabaja en una máquina compartida y está familiarizado con SLURM, es posible que desee incluir este comando en un script SLURM. python3 icenet/predict_heldout_data.py
. Utiliza xarray
para guardar predicciones durante los años de validación y prueba (2012-2020) como NetCDF para IceNet y el punto de referencia de tendencia lineal. Los pronósticos de IceNet se guardan en data/forecasts/icenet/<dataloader_ID>/<architecture_ID>/
. Para IceNet, el conjunto de datos de pronóstico completo tiene dimensiones (target date, y, x, lead time, ice class, seed)
, donde seed
especifica un solo miembro del conjunto o el pronóstico medio del conjunto. Un pronóstico SIP de media de conjunto también se calcula y se guarda como un archivo separado y más pequeño (que solo tiene las primeras cuatro dimensiones).
Calcule el parámetro de escala de temperatura media del conjunto de IceNet para cada tiempo de entrega: python3 icenet/compute_ensemble_mean_temp_scaling.py
. Los nuevos pronósticos SIP a escala de temperatura media de conjunto se guardan en data/forecasts/icenet/<dataloader_ID>/<architecture_ID>/icenet_sip_forecasts_tempscaled.nc
. Estos pronósticos representan el modelo IceNet de media de conjunto final utilizado para el artículo.
python3 icenet/analyse_heldout_predictions.py
. Carga los datos de pronóstico de NetCDF y calcula las métricas de pronóstico, almacenando los resultados en un DataFrame pandas
global con MultiIndex
(model, ensemble member, lead time, target date)
y columnas para cada métrica (precisión binaria y error de extensión del hielo marino). Utiliza dask
para evitar cargar todos los conjuntos de datos de pronóstico en la memoria, procesando fragmentos en paralelo para acelerar significativamente el análisis. Los resultados se guardan como archivos CSV en results/forecast_results/
con una marca de tiempo para evitar sobrescribirlos. Opcionalmente, cargue previamente el archivo CSV más reciente para agregar nuevos modelos o métricas a los resultados sin necesidad de volver a analizar los modelos existentes. Utilice esta función para agregar resultados de pronóstico de otros modelos de IceNet (identificados por su ID de cargador de datos e ID de arquitectura) para rastrear el efecto de los cambios de diseño en el rendimiento del pronóstico.
python3 icenet/analyse_uncertainty.py
. Evalúa la calibración de los pronósticos SIP de IceNet y SEAS5. También determina la región del borde del hielo de IceNet y evalúa su capacidad de delimitación del borde del hielo. Los resultados se guardan en results/uncertainty_results/
.
python3 icenet/permute_and_predict.py
. Los resultados se almacenan en results/permute_and_predict_results/
.python3 icenet/plot_paper_figures.py
. Las figuras se guardan en figures/paper_figures/
. Tenga en cuenta que necesitará el archivo CSV de error de Sea Ice Outlook para trazar Supp. Figura 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
define las funciones de la utilidad IceNet como el preprocesador de datos, el cargador de datos, el procesamiento ERA5 y CMIP6, la caída de la tasa de aprendizaje y la funcionalidad de video.icenet/models.py
define arquitecturas de red.icenet/config.py
define globales.icenet/losses.py
define funciones de pérdida.icenet/callbacks.py
define devoluciones de llamadas de entrenamiento.icenet/metrics.py
define métricas de entrenamiento.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
:
Gracias a James Byrne (BAS) y Tony Phillips (BAS) por sus contribuciones directas a este código base.