Эта кодовая база дополняет документ Nature Communications «Сезонное прогнозирование морского льда в Арктике» с вероятностным глубоким обучением . Он включает в себя код, позволяющий полностью воспроизвести все результаты исследования с нуля. Он также включает в себя код для загрузки данных, полученных в ходе исследования, опубликованных в Центре полярных данных, и воспроизведения всех рисунков из статьи.
Гибкость кода упрощает возможные расширения исследования. Конвейер обработки данных и специальный класс IceNetDataLoader
позволяют вам определять, какие переменные вводятся в сети, какие климатические симуляции используются для предварительного обучения и насколько далеко вперед прогнозировать. Архитектуру модели IceNet можно адаптировать в icenet/models.py
. Выходную переменную для прогнозирования можно даже изменить путем рефакторинга класса IceNetDataLoader
.
Демонстратор этой кодовой базы (загрузка предварительно обученных сетей IceNet, последующее создание и анализ прогнозов), созданный @acocac, можно найти в книге «Наука об экологических данных».
Приведенные ниже рекомендации предполагают, что вы работаете в командной строке Unix-подобной машины с графическим процессором. Если вы хотите воспроизвести все результаты исследования, 1 ТБ пространства должен безопасно покрыть требования к хранилищу загруженных и сгенерированных данных.
Если у вас возникнут проблемы или у вас есть предложения по улучшению, поднимите вопрос или напишите мне ([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
. Следуйте инструкциям «Установить ключ API CDS» здесь.
Чтобы загрузить данные прогнозов ECMWF SEAS5 для сравнения с IceNet, вам необходимо сначала зарегистрироваться в ECMWF здесь. Если вы из государства-члена ЕЦСПП, вы можете получить доступ к каталогу ЕЦСПП MARS, связавшись со своим представителем по вычислительной технике. После регистрации получите ключ API здесь и заполните записи API ECMWF в icenet/config.py
.
Чтобы отслеживать тренировочные прогоны и выполнять настройку байесовских гиперпараметров с помощью весов и смещений, зарегистрируйтесь на https://wandb.ai/site. Получите ключ API отсюда и заполните записи Weights и Biases в icenet/config.py
. Убедитесь, что вы вошли в систему, запустив wandb login
после настройки среды conda.
После клонирования репозитория выполните приведенные ниже команды в корне репозитория, чтобы настроить среду 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 загружаются в глобальном формате широты и долготы и привязываются к сетке EASE, на которой лежат данные OSI-SAF SIC. Журналы выводятся в logs/era5_download_logs/
.
./download_cmip6_data_in_parallel.sh
. Загружает данные моделирования климата CMIP6. При этом в фоновом режиме выполняется несколько параллельных команд python3 icenet/download_cmip6_data.py
для загрузки каждого моделирования климата. Необработанные данные CMIP6 пересчитываются из глобального формата широты и долготы в сетку EASE, на которой лежат данные OSI-SAF SIC. Логи выводятся в 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
для получения прогнозов SEAS5 на 2002–2020 годы для каждого периода заблаговременности через API ECMWF MARS и перераспределения прогнозов в EASE. Прогнозы сохраняются в data/forecasts/seas5/
в папках latlon/
и EASE/
. Логи выводятся в logs/seas5_download_logs/
.
python3 icenet/biascorrect_seas5_forecasts.py
. Система смещения корректирует прогнозы SEAS5 2012+, используя прогнозы на 2002–2011 годы. Также рассчитывает поля вероятности морского льда (SIP) SEAS5. Прогнозы с поправкой на систематическое отклонение сохраняются в формате NetCDF в data/forecasts/seas5/
с размерами (target date, y, x, lead time)
.
python3 icenet/gen_data_loader_config.py
. Настраивает конфигурацию загрузчика данных. Он сохраняется как файл JSON, определяющий входные и выходные данные IceNet, разделение поездов/значений/тестов и т. д. Файл конфигурации используется для создания экземпляра пользовательского класса IceNetDataLoader
. В этом репозитории представлены два примера файлов конфигурации в dataloader_configs/
. Каждый файл конфигурации идентифицируется идентификатором загрузчика данных, который определяется меткой времени и именем, предоставленным пользователем (например, 2021_06_15_1854_icenet_nature_communications
). Идентификатор загрузчика данных вместе с идентификатором архитектуры, установленным в сценарии обучения, предоставляют «идентификатор IceNet», который однозначно идентифицирует модель ансамбля IceNet по ее конфигурации данных и архитектуре. python3 icenet/preproc_icenet_data.py
. Нормализует необработанные данные NetCDF и сохраняет их как ежемесячные файлы NumPy. Параметры нормализации (среднее/стандартное отклонение или мин/макс) сохраняются в виде файла JSON, поэтому новые данные можно предварительно обработать без необходимости повторного расчета нормализации. Пользовательский класс IceNetDataPreProcessor.
Набор данных для наблюдательного обучения и проверки для IceNet составляет всего 23 ГБ, что может поместиться в ОЗУ в некоторых системах и значительно ускорить этап точной настройки обучения по сравнению с использованием загрузчика данных. Чтобы воспользоваться этим, запустите python3 icenet/gen_numpy_obs_train_val_datasets.py
, чтобы сгенерировать тензоры NumPy для входных/выходных данных train/val. Чтобы получить дополнительную выгоду от повышения скорости обучения tf.data
, сгенерируйте набор данных TFRecords из тензоров NumPy, используя python3 icenet/gen_tfrecords_obs_train_val_datasets.py
. Использовать ли для обучения загрузчик данных, массивы NumPy или наборы данных TFRecords можно с помощью логических значений в icenet/train_icenet.py
.
icenet/train_icenet.py
для настройки гиперпараметров: установите для bools предварительного обучения и масштабирования температуры значение False
в разделе пользовательского ввода.wandb sweep icenet/sweep.yaml
wandb agent
, которая будет напечатана.python3 icenet/train_icenet.py
. При этом в качестве входных данных командной строки используются настройки гипераметра и случайное начальное число для инициализации веса сети. Запустите это несколько раз с разными настройками --seed
, чтобы обучить ансамбль. Обученные сети сохраняются в trained_networks/<dataloader_ID>/<architecture_ID>/networks/
. Если вы работаете на общей машине и знакомы с SLURM, вы можете захотеть обернуть эту команду в сценарий SLURM. python3 icenet/predict_heldout_data.py
. Использует xarray
для сохранения прогнозов за годы проверки и тестирования (2012–2020) в виде NetCDF для IceNet и эталона линейного тренда. Прогнозы 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 и вычисляет показатели прогноза, сохраняя результаты в глобальном DataFrame pandas
с MultiIndex
(model, ensemble member, lead time, target date)
и столбцами для каждого показателя (двоичная точность и ошибка протяженности морского льда). Использует dask
, чтобы избежать загрузки всех наборов прогнозных данных в память, и параллельно обрабатывает фрагменты, чтобы значительно ускорить анализ. Результаты сохраняются в виде файлов CSV в папке results/forecast_results/
с отметкой времени, чтобы избежать перезаписи. При необходимости предварительно загрузите последний файл CSV, чтобы добавить к результатам новые модели или показатели без необходимости повторного анализа существующих моделей. Используйте эту функцию для добавления результатов прогноза из других моделей IceNet (идентифицированных по их идентификатору загрузчика данных и идентификатору архитектуры) для отслеживания влияния изменений конструкции на производительность прогноза.
python3 icenet/analyse_uncertainty.py
. Оценивает калибровку прогнозов SIP IceNet и SEAS5. Также определяет область кромки льда IceNet и оценивает ее способность ограничивать кромку льда. Результаты сохраняются в results/uncertainty_results/
.
python3 icenet/permute_and_predict.py
. Результаты сохраняются в results/permute_and_predict_results/
.python3 icenet/plot_paper_figures.py
. Рисунки сохраняются в figures/paper_figures/
. Обратите внимание: для построения графика Supp вам понадобится CSV-файл ошибок Sea Ice Outlook. Рис. 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
:
Спасибо Джеймсу Бирну (BAS) и Тони Филлипсу (BAS) за непосредственный вклад в эту кодовую базу.