{"id":123977,"name":"IceNet","description":"Code for Seasonal Arctic sea ice forecasting with probabilistic deep learning.","url":"https://github.com/tom-andersson/icenet-paper","last_synced_at":"2026-04-11T21:03:44.558Z","repository":{"id":43789524,"uuid":"388791527","full_name":"tom-andersson/icenet-paper","owner":"tom-andersson","description":"Code associated with the paper 'Seasonal Arctic sea ice forecasting with probabilistic deep learning'","archived":false,"fork":false,"pushed_at":"2023-10-10T10:01:08.000Z","size":460,"stargazers_count":103,"open_issues_count":1,"forks_count":25,"subscribers_count":3,"default_branch":"main","last_synced_at":"2026-03-25T12:42:58.300Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tom-andersson.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2021-07-23T12:18:07.000Z","updated_at":"2026-02-24T01:25:44.000Z","dependencies_parsed_at":"2022-07-12T20:00:33.041Z","dependency_job_id":null,"html_url":"https://github.com/tom-andersson/icenet-paper","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/tom-andersson/icenet-paper","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tom-andersson%2Ficenet-paper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tom-andersson%2Ficenet-paper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tom-andersson%2Ficenet-paper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tom-andersson%2Ficenet-paper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tom-andersson","download_url":"https://codeload.github.com/tom-andersson/icenet-paper/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tom-andersson%2Ficenet-paper/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31196261,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-30T12:28:04.769Z","status":"ssl_error","status_checked_at":"2026-03-30T12:28:01.577Z","response_time":138,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"owner":{"login":"tom-andersson","name":"Tom Andersson","uuid":"26459412","kind":"user","description":"Research Engineer at Google DeepMind. MEng in Information Engineering from Cambridge University.","email":"","website":null,"location":"London, UK","twitter":"tom_r_andersson","company":"Google DeepMind","icon_url":"https://avatars.githubusercontent.com/u/26459412?u=00384568a391cb3a353459796d4c9eff6d6caf38\u0026v=4","repositories_count":15,"last_synced_at":"2024-06-11T15:40:37.906Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/tom-andersson","funding_links":[],"total_stars":98,"followers":58,"following":24,"created_at":"2023-02-14T18:54:57.221Z","updated_at":"2024-06-11T15:40:40.522Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tom-andersson","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tom-andersson/repositories"},"packages":[{"id":11780480,"name":"github.com/tom-andersson/icenet-paper","ecosystem":"go","description":null,"homepage":null,"licenses":"gpl-3.0","normalized_licenses":["GPL-3.0"],"repository_url":"https://github.com/tom-andersson/icenet-paper","keywords_array":[],"namespace":null,"versions_count":1,"first_release_published_at":"2021-08-10T15:15:17.000Z","latest_release_published_at":"2021-08-10T15:15:17.000Z","latest_release_number":"v1.0.0","last_synced_at":"2026-04-05T18:02:34.659Z","created_at":"2025-06-09T09:47:18.823Z","updated_at":"2026-04-05T18:02:34.659Z","registry_url":"https://pkg.go.dev/github.com/tom-andersson/icenet-paper","install_command":"go get github.com/tom-andersson/icenet-paper","documentation_url":"https://pkg.go.dev/github.com/tom-andersson/icenet-paper#section-documentation","metadata":{},"repo_metadata":{"id":43789524,"uuid":"388791527","full_name":"tom-andersson/icenet-paper","owner":"tom-andersson","description":"Code associated with the paper 'Seasonal Arctic sea ice forecasting with probabilistic deep learning'","archived":false,"fork":false,"pushed_at":"2023-10-10T10:01:08.000Z","size":460,"stargazers_count":100,"open_issues_count":1,"forks_count":22,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-11-04T16:01:35.048Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tom-andersson.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2021-07-23T12:18:07.000Z","updated_at":"2025-08-27T23:06:40.000Z","dependencies_parsed_at":"2022-07-12T20:00:33.041Z","dependency_job_id":null,"html_url":"https://github.com/tom-andersson/icenet-paper","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/tom-andersson/icenet-paper","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tom-andersson%2Ficenet-paper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tom-andersson%2Ficenet-paper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tom-andersson%2Ficenet-paper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tom-andersson%2Ficenet-paper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tom-andersson","download_url":"https://codeload.github.com/tom-andersson/icenet-paper/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tom-andersson%2Ficenet-paper/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":283734530,"owners_count":26885442,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-11-10T02:00:06.292Z","response_time":53,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"},"tags":[]},"repo_metadata_updated_at":"2025-08-30T07:03:05.272Z","dependent_packages_count":0,"downloads":null,"downloads_period":null,"dependent_repos_count":0,"rankings":{"downloads":null,"dependent_repos_count":5.736112545925084,"dependent_packages_count":5.375175157675018,"stargazers_count":5.253694591719538,"forks_count":5.344708480078659,"docker_downloads_count":null,"average":5.427422693849575},"purl":"pkg:golang/github.com/tom-andersson/icenet-paper","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/go/github.com/tom-andersson/icenet-paper","docker_dependents_count":null,"docker_downloads_count":null,"usage_url":"https://repos.ecosyste.ms/usage/go/github.com/tom-andersson/icenet-paper","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/go/github.com/tom-andersson/icenet-paper/dependencies","status":null,"funding_links":[],"critical":null,"issue_metadata":{"last_synced_at":"2025-08-30T07:02:15.150Z","issues_count":8,"pull_requests_count":4,"avg_time_to_close_issue":2055831.875,"avg_time_to_close_pull_request":45342.5,"issues_closed_count":8,"pull_requests_closed_count":4,"pull_request_authors_count":4,"issue_authors_count":4,"avg_comments_per_issue":4.25,"avg_comments_per_pull_request":0.5,"merged_pull_requests_count":3,"bot_issues_count":0,"bot_pull_requests_count":0,"past_year_issues_count":0,"past_year_pull_requests_count":0,"past_year_avg_time_to_close_issue":null,"past_year_avg_time_to_close_pull_request":null,"past_year_issues_closed_count":0,"past_year_pull_requests_closed_count":0,"past_year_pull_request_authors_count":0,"past_year_issue_authors_count":0,"past_year_avg_comments_per_issue":null,"past_year_avg_comments_per_pull_request":null,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":0,"issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/tom-andersson%2Ficenet-paper/issues","maintainers":[{"login":"tom-andersson","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/tom-andersson"}],"active_maintainers":[]},"versions_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Ftom-andersson%2Ficenet-paper/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Ftom-andersson%2Ficenet-paper/version_numbers","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Ftom-andersson%2Ficenet-paper/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Ftom-andersson%2Ficenet-paper/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Ftom-andersson%2Ficenet-paper/codemeta","maintainers":[],"registry":{"name":"proxy.golang.org","url":"https://proxy.golang.org","ecosystem":"go","default":true,"packages_count":2088247,"maintainers_count":0,"namespaces_count":779664,"keywords_count":112728,"github":"golang","metadata":{"funded_packages_count":53440},"icon_url":"https://github.com/golang.png","created_at":"2022-04-04T15:19:22.939Z","updated_at":"2026-04-05T05:09:06.732Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages","maintainers_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/maintainers","namespaces_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/namespaces"}}],"commits":{"id":1422304,"full_name":"tom-andersson/icenet-paper","default_branch":"main","total_commits":62,"total_committers":3,"total_bot_commits":0,"total_bot_committers":0,"mean_commits":20.666666666666668,"dds":0.032258064516129004,"past_year_total_commits":0,"past_year_total_committers":0,"past_year_total_bot_commits":0,"past_year_total_bot_committers":0,"past_year_mean_commits":0.0,"past_year_dds":0.0,"last_synced_at":"2026-04-05T18:05:39.324Z","last_synced_commit":"79ab77c452088d805514d0ba2f3ad86581945954","created_at":"2023-10-26T00:14:34.934Z","updated_at":"2026-04-05T18:05:39.310Z","committers":[{"name":"tom-andersson","email":"tomand@bas.ac.uk","login":"tom-andersson","count":60},{"name":"Michael T Tang","email":"ttgmichael@gmail.com","login":"ttgmichael","count":1},{"name":"Alejandro ©","email":"acocac@gmail.com","login":"acocac","count":1}],"past_year_committers":[],"commits_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories/tom-andersson%2Ficenet-paper/commits","host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-04-07T00:00:11.408Z","repositories_count":6211614,"commits_count":918017205,"contributors_count":35583097,"owners_count":1142749,"icon_url":"https://github.com/github.png","host_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories"}},"issues_stats":{"full_name":"tom-andersson/icenet-paper","html_url":"https://github.com/tom-andersson/icenet-paper","last_synced_at":"2026-03-06T03:01:14.470Z","status":"error","issues_count":8,"pull_requests_count":4,"avg_time_to_close_issue":2055831.875,"avg_time_to_close_pull_request":45342.5,"issues_closed_count":8,"pull_requests_closed_count":4,"pull_request_authors_count":4,"issue_authors_count":4,"avg_comments_per_issue":4.25,"avg_comments_per_pull_request":0.5,"merged_pull_requests_count":3,"bot_issues_count":0,"bot_pull_requests_count":0,"past_year_issues_count":0,"past_year_pull_requests_count":0,"past_year_avg_time_to_close_issue":null,"past_year_avg_time_to_close_pull_request":null,"past_year_issues_closed_count":0,"past_year_pull_requests_closed_count":0,"past_year_pull_request_authors_count":0,"past_year_issue_authors_count":0,"past_year_avg_comments_per_issue":null,"past_year_avg_comments_per_pull_request":null,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":0,"created_at":"2023-10-26T00:14:40.495Z","updated_at":"2026-03-06T03:01:14.470Z","repository_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/tom-andersson%2Ficenet-paper","issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/tom-andersson%2Ficenet-paper/issues","issue_labels_count":{},"pull_request_labels_count":{},"issue_author_associations_count":{"NONE":7},"pull_request_author_associations_count":{"NONE":2,"CONTRIBUTOR":2,"OWNER":1},"issue_authors":{"bryandunn614":4,"kf-rahman":1,"ZHUYMGeo":1,"xinaesthete":1},"pull_request_authors":{"tom-andersson":1,"llbbl":1,"acocac":1,"ttgmichael":1,"bryandunn614":1},"host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-04-03T00:00:08.051Z","repositories_count":14065016,"issues_count":34433358,"pull_requests_count":112491235,"authors_count":11220102,"icon_url":"https://github.com/github.png","host_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories","owners_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/owners","authors_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors"},"past_year_issue_labels_count":{},"past_year_pull_request_labels_count":{},"past_year_issue_author_associations_count":{},"past_year_pull_request_author_associations_count":{"NONE":1},"past_year_issue_authors":{},"past_year_pull_request_authors":{"llbbl":1},"maintainers":[{"login":"tom-andersson","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/tom-andersson"}],"active_maintainers":[]},"events":{"total":{"PullRequestEvent":1,"ForkEvent":3,"WatchEvent":11},"last_year":{"PullRequestEvent":1,"ForkEvent":2,"WatchEvent":3}},"keywords":[],"dependencies":[],"score":null,"created_at":"2023-10-26T00:00:21.003Z","updated_at":"2026-04-11T21:03:44.560Z","avatar_url":"https://github.com/tom-andersson.png","language":"Python","category":"Cryosphere","sub_category":"Sea Ice","monthly_downloads":0,"total_dependent_repos":0,"total_dependent_packages":0,"readme":"# IceNet: Seasonal Arctic sea ice forecasting with probabilistic deep learning\n\n[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.5176573.svg)](https://doi.org/10.5281/zenodo.5176573)\n\nThis codebase accompanies the Nature Communications paper [_Seasonal Arctic sea\nice forecasting with probabilistic deep\nlearning_](https://www.nature.com/articles/s41467-021-25257-4). It includes code to fully reproduce all the results of the study\nfrom scratch. It also includes code to download\nthe data generated by the study,\n[published on the Polar Data\nCentre](https://doi.org/10.5285/71820e7d-c628-4e32-969f-464b7efb187c), and\nreproduce all the paper's figures.\n\nThe flexibility of the code simplifies possible extensions of the study.\nThe data processing pipeline and custom `IceNetDataLoader` class lets you\ndictate which variables are input to the networks, which climate simulations are\nused for pre-training, and how far ahead to forecast.\nThe architecture of the IceNet model can be adapted in `icenet/models.py`.\nThe output variable to forecast could even be changed by refactoring the `IceNetDataLoader`\nclass.\n\nA demonstrator of this codebase (downloading pre-trained IceNet networks,\nthen generating and analysing forecasts) produced by [@acocac](https://github.com/acocac) can be found in [The Environmental\nData Science Book](https://edsbook.org/notebooks/gallery/ac327c3a-5264-40a2-8c6e-1e8d7c4b37ef/notebook).\n\n![](figures/architecture.png)\n\nThe guidelines below assume you're working in\nthe command line of a Unix-like machine with a GPU. If aiming to reproduce all the\nresults of the study, 1 TB of space should safely cover the storage requirements\nfrom the data downloaded and generated.\n\nIf you run into issues or have suggestions for improvement,\nplease raise an issue or email me (tomand@bas.ac.uk).\n\n## Steps to plot paper figures using the paper's results \u0026 forecasts\n\nTo reproduce the paper figures directly from the paper's \nresults and forecasts, run the following after\nsetting up the conda environment (see Step 1 below):\n- `./download_paper_generated_data.sh`. Downloads raw data from the paper. From here, you could start to explore the results of the paper in\nmore detail.\n- `python3 icenet/download_sic_data.py`. This is needed to plot the ground truth ice edge. Note this download can take anywhere from 1 to 12 hours to complete.\n- `python3 icenet/gen_masks.py`\n- `python3 icenet/plot_paper_figures.py`. Figures are saved in `figures/paper_figures/`.\n\n## Steps to reproduce the paper's results from scratch\n\n### 0) Preliminary setup\n\n* I use conda for package management. If you don't yet\nhave conda, you can download it\n[here](https://docs.conda.io/projects/conda/en/latest/user-guide/install/linux.html).\n\n* To be able to download ERA5 data, you must first set up a CDS\naccount and populate your `.cdsapirc` file. Follow the 'Install the CDS API key'\ninstructions\n[here](https://cds.climate.copernicus.eu/api-how-to#install-the-cds-api-key).\n\n* To download the ECMWF SEAS5 forecast data for comparing with IceNet,\nyou must first register with ECMWF [here](https://apps.ecmwf.int/registration/).\nIf you are from an ECMWF Member State, you can then gain access to the ECMWF MARS Catalogue by\n[contacting your Computing\nRepresentative](https://www.ecmwf.int/en/about/contact-us/computing-representatives).\nOnce registered, obtain your\nAPI key [here](https://api.ecmwf.int/v1/key/) and fill the ECMWF API entries in\n`icenet/config.py`.\n\n* To track training runs and perform Bayesian hyperparameter tuning with Weights\nand Biases, sign up at https://wandb.ai/site. Obtain your API key from\n[here](https://wandb.ai/authorize) and fill the Weights and Biases entries in `icenet/config.py`.\nEnsure you are logged in by running `wandb login` after setting up the conda\nenvironment.\n\n### 1) Set up conda environment\n\nAfter cloning the repo, run the commands below in the root of the repository to\nset up the conda environment:\n\n- If you don't have [mamba](https://github.com/mamba-org/mamba) already, install\nit to your base env for faster conda operations: `conda install -n base mamba -c\nconda-forge`.\n- For upgradeability use the versioned direct dependency\nenvironment file: `mamba env create --file environment.yml`\n- For reproducibility use the locked environment file: `mamba env create --file\nenvironment.locked.yml`\n- Activate the environment before running code: `conda activate icenet`\n\n### 2) Download data\n\nThe [CMIP6 variable naming convention](https://docs.google.com/spreadsheets/d/1UUtoz6Ofyjlpx5LdqhKcwHFz2SGoTQV2_yekHyMfL9Y/edit#gid=1221485271)\nis used throughout this project - e.g. `tas` for surface air temperature, `siconca` for\nsea ice concentration, etc.\n\nWarning: some downloads are slow and the net download time can take 1-2 days.\nIt may be advisable to write a bash script to automatically execute all these\ncommands in sequence and run it over a weekend.\n\n- `python3 icenet/gen_masks.py`. This obtains masks for land, the polar holes,\nmonthly maximum ice extent (the 'active grid cell region'), and the Arctic regions\n\u0026 coastline.\n\n- `python3 icenet/download_sic_data.py`. Downloads OSI-SAF SIC data. This computes\nmonthly-averaged SIC server-side, downloads the results, and bilinearly interpolates missing grid cells (e.g. polar hole). Note this download can take anywhere from 1 to 12 hours to complete.\n\n- `./download_era5_data_in_parallel.sh`. Downloads ERA5 reanalysis data.\nThis runs multiple parallel `python3 icenet/download_era5_data.py`\ncommands in the background to acquire each ERA5 variable. The raw ERA5 data is downloaded in\nglobal latitude-longitude format and regridded to the EASE grid that\nOSI-SAF SIC data lies on. Logs are output to `logs/era5_download_logs/`.\n\n- `./download_cmip6_data_in_parallel.sh`. Downloads CMIP6 climate simulation data.\nThis runs multiple parallel `python3 icenet/download_cmip6_data.py`\ncommands in the background to download each climate simulation. The raw\n CMIP6 data is regridded from global latitude-longitude format to the EASE grid that\n OSI-SAF SIC data lies on. Logs are output to `logs/cmip6_download_logs/`\n\n- `./rotate_wind_data_in_parallel.sh`. This runs multiple parallel `python3 icenet/rotate_wind_data.py`\ncommands in the background to rotate the ERA5 and CMIP6 wind vector data onto the EASE grid.\nLogs are output to `logs/wind_rotation_logs/`.\n\n- `./download_seas5_forecasts_in_parallel.sh`. Downloads ECMWF SEAS5 SIC forecasts.\nThis runs multiple parallel `python3 icenet/download_seas5_forecasts.py`\ncommands to acquire 2002-2020 SEAS5 forecasts for each lead time\nvia the ECMWF MARS API and regrid the forecasts to EASE. The forecasts are saved to\n`data/forecasts/seas5/` in the folders `latlon/` and `EASE/`.\nLogs are output to `logs/seas5_download_logs/`.\n\n- `python3 icenet/biascorrect_seas5_forecasts.py`. Bias corrects the SEAS5 2012+ forecasts\nusing 2002-2011 forecasts. Also computes SEAS5 sea ice probability (SIP) fields.\nThe bias-corrected forecasts are saved as NetCDFs in `data/forecasts/seas5/` with dimensions\n`(target date, y, x, lead time)`.\n\n### 3) Process data\n\n#### 3.1) Set up IceNet's custom data loader\n\n- `python3 icenet/gen_data_loader_config.py`. Sets up the data loader configuration.\nThis is saved as a JSON file dictating IceNet's input and output data,\ntrain/val/test splits, etc.The config file is used to instantiate the\ncustom `IceNetDataLoader` class. Two example config files are provided in this repository\nin `dataloader_configs/`. Each config file is identified by a\ndataloader ID, determined by a timestamp and a user-provided name (e.g.\n`2021_06_15_1854_icenet_nature_communications`). The data loader ID,\ntogether with an architecture ID set in the training script, provides an 'IceNet ID'\nwhich uniquely identifies an IceNet ensemble model by its data configuration and\narchitecture.\n\n#### 3.2) Preprocess the raw data\n\n- `python3 icenet/preproc_icenet_data.py`. Normalises the raw NetCDF data and saves it as\nmonthly NumPy files. The normalisation parameters (mean/std dev or min/max)\nare saved as a JSON file so that new data can be preprocessed without\nhaving to recompute the normalisation. A custom IceNetDataPreProcessor class\n\n- The observational training \u0026 validation dataset for IceNet is just 23 GB,\nwhich can fit in RAM on some systems and significantly speed up the fine-tuning\ntraining phase compared with using the data loader. To benefit from this, run\n`python3 icenet/gen_numpy_obs_train_val_datasets.py` to generate NumPy tensors\nfor the train/val input/output data. To further benefit from the training speed\nimprovements of `tf.data`, generate a TFRecords dataset from the NumPy tensors\nusing `python3 icenet/gen_tfrecords_obs_train_val_datasets.py`. Whether to use\nthe data loader, NumPy arrays, or TFRecords datasets for training is controlled by bools in\n`icenet/train_icenet.py`.\n\n### 4) Train IceNet\n\n#### 4.1) OPTIONAL: Run the hyperparameter search (skip if using default values from paper)\n\n- Set `icenet/train_icenet.py` up for hyperparameter tuning: Set pre-training\nand temperature scaling bools to `False` in the user input section.\n- `wandb sweep icenet/sweep.yaml`\n- Then run the `wandb agent` command that is printed.\n- Cancel the sweep after a sufficient picture on optimal hyperparameters is\nbuilt up on the [wandb.ai](https://wandb.ai/home) page.\n\n#### 4.2) Run training\n\n- Train IceNet networks with `python3 icenet/train_icenet.py`. This takes\nhyperameter settings and the random seed for network weight initalisation as\ncommand line inputs. Run this multiple times with different settings of `--seed`\nto train an ensemble. Trained networks are saved in\n`trained_networks/\u003cdataloader_ID\u003e/\u003carchitecture_ID\u003e/networks/`. If working on a\nshared machine and familiar with SLURM, you may want to wrap this command in a\nSLURM script.\n\n### 5) Produce forecasts\n\n- `python3 icenet/predict_heldout_data.py`. Uses `xarray` to save predictions\nover the validation and test years as (2012-2020) as NetCDFs for IceNet and the\nlinear trend benchmark. IceNet's forecasts are saved in\n`data/forecasts/icenet/\u003cdataloader_ID\u003e/\u003carchitecture_ID\u003e/`.\nFor IceNet, the full forecast dataset has dimensions\n`(target date, y, x, lead time, ice class, seed)`, where `seed` specifies\na single ensemble member or the ensemble-mean forecast. An ensemble-mean\nSIP forecast is also computed and saved as a separate, smaller file\n(which only has the first four dimensions).\n\n- Compute IceNet's ensemble-mean temperature scaling parameter for each lead time:\n`python3 icenet/compute_ensemble_mean_temp_scaling.py`. The new, ensemble-mean\ntemperature-scaled SIP forecasts are saved to\n`data/forecasts/icenet/\u003cdataloader_ID\u003e/\u003carchitecture_ID\u003e/icenet_sip_forecasts_tempscaled.nc`.\nThese forecasts represent the final ensemble-mean IceNet model used for the paper.\n\n### 6) Analyse forecasts\n\n- `python3 icenet/analyse_heldout_predictions.py`. Loads the NetCDF forecast data and computes\nforecast metrics, storing results in a global `pandas` DataFrame with\n`MultiIndex` `(model, ensemble member, lead time, target date)` and columns\nfor each metric (binary accuracy and sea ice extent error). Uses\n`dask` to avoid loading the entire forecast datasets into memory, processing\nchunks in parallel to significantly speed up the analysis. Results are saved\nas CSV files in `results/forecast_results/` with a timestamp to avoid overwriting.\nOptionally pre-load the latest CSV file to append new models or metrics to the\nresults without needing to re-analyse existing models. Use this feature to append\nforecast results from other IceNet models (identified by their dataloader ID\nand architecture ID) to track the effect of design changes on forecast performance.\n\n- `python3 icenet/analyse_uncertainty.py`. Assesses the calibration of IceNet and\nSEAS5's SIP forecasts. Also determines IceNet's ice edge region and assesses\nits ice edge bounding ability. Results are saved in `results/uncertainty_results/`.\n\n### 7) Run the permute-and-predict method to explore IceNet's most important input variables\n\n- `python3 icenet/permute_and_predict.py`. Results are stored in\n`results/permute_and_predict_results/`.\n\n### 8) Generate the paper figures and tables\n\n- `python3 icenet/plot_paper_figures.py`. Figures are saved in `figures/paper_figures/`. Note, you will need the Sea Ice Outlook\nerror CSV file to plot Supp. Fig. 5:\n```\nwget -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'\n```\n\n### Misc\n\n- `icenet/utils.py` defines IceNet utility functions like the data preprocessor,\ndata loader, ERA5 and CMIP6 processing, learning rate decay, and video functionality.\n- `icenet/models.py` defines network architectures.\n- `icenet/config.py` defines globals.\n- `icenet/losses.py` defines loss functions.\n- `icenet/callbacks.py` defines training callbacks.\n- `icenet/metrics.py` defines training metrics.\n\n### Project structure: simplified output from `tree`\n\n```\n.\n├── data\n│   ├── obs\n│   ├── cmip6\n│   │   ├── EC-Earth3\n│   │   │   ├── r10i1p1f1\n│   │   │   ├── r12i1p1f1\n│   │   │   ├── r14i1p1f1\n│   │   │   ├── r2i1p1f1\n│   │   │   └── r7i1p1f1\n│   │   └── MRI-ESM2-0\n│   │       ├── r1i1p1f1\n│   │       ├── r2i1p1f1\n│   │       ├── r3i1p1f1\n│   │       ├── r4i1p1f1\n│   │       └── r5i1p1f1\n│   ├── forecasts\n│   │   ├── icenet\n│   │   │   ├── 2021_06_15_1854_icenet_nature_communications\n│   │   │   │   └── unet_tempscale\n│   │   │   └── 2021_06_30_0954_icenet_pretrain_ablation\n│   │   │       └── unet_tempscale\n│   │   ├── linear_trend\n│   │   └── seas5\n│   │       ├── EASE\n│   │       └── latlon\n│   ├── masks\n│   └── network_datasets\n│       └── dataset1\n│           ├── meta\n│           ├── obs\n│           ├── transfer\n│           └── norm_params.json\n├── dataloader_configs\n│   ├── 2021_06_15_1854_icenet_nature_communications.json\n│   └── 2021_06_30_0954_icenet_pretrain_ablation.json\n├── figures\n├── icenet\n├── logs\n│   ├── cmip6_download_logs\n│   ├── era5_download_logs\n│   ├── seas5_download_logs\n│   └── wind_rotation_logs\n├── results\n│   ├── forecast_results\n│   │   └── 2021_07_01_183913_forecast_results.csv\n│   ├── permute_and_predict_results\n│   │   └── permute_and_predict_results.csv\n│   └── uncertainty_results\n│       ├── ice_edge_region_results.csv\n│       ├── sip_bounding_results.csv\n│       └── uncertainty_results.csv\n└── trained_networks\n    └── 2021_06_15_1854_icenet_nature_communications\n        ├── obs_train_val_data\n        │   ├── numpy\n        │   └── tfrecords\n        │       ├── train\n        │       └── val\n        └── unet_tempscale\n            └── networks\n                ├── network_tempscaled_36.h5\n                ├── network_tempscaled_37.h5\n                :\n```\n\n### Acknowledgements\n\nThanks to James Byrne (BAS) and Tony Phillips (BAS) for direct contributions to this codebase.\n","funding_links":[],"readme_doi_urls":["https://doi.org/10.5281/zenodo.5176573","https://doi.org/10.5285/71820e7d-c628-4e32-969f-464b7efb187c"],"works":{"https://doi.org/10.5281/zenodo.5176573":{"id":"https://openalex.org/W3210231097","doi":"https://doi.org/10.5281/zenodo.5176573","title":"Code associated with the paper: 'Seasonal Arctic sea ice forecasting with probabilistic deep learning'","display_name":"Code associated with the paper: 'Seasonal Arctic sea ice forecasting with probabilistic deep learning'","publication_year":2021,"publication_date":"2021-08-10","ids":{"openalex":"https://openalex.org/W3210231097","doi":"https://doi.org/10.5281/zenodo.5176573","mag":"3210231097"},"language":"en","primary_location":{"is_oa":false,"landing_page_url":"https://zenodo.org/record/5176573","pdf_url":null,"source":null,"license":null,"version":null,"is_accepted":false,"is_published":false},"type":"article","type_crossref":"journal-article","open_access":{"is_oa":false,"oa_status":"closed","oa_url":null,"any_repository_has_fulltext":false},"authorships":[{"author_position":"first","author":{"id":"https://openalex.org/A5041436747","display_name":"Tom R. Andersson","orcid":"https://orcid.org/0000-0002-1556-9932"},"institutions":[],"countries":[],"is_corresponding":true,"raw_author_name":"Tom R. Andersson","raw_affiliation_string":"","raw_affiliation_strings":[]}],"countries_distinct_count":0,"institutions_distinct_count":0,"corresponding_author_ids":["https://openalex.org/A5041436747"],"corresponding_institution_ids":[],"apc_list":null,"apc_paid":null,"has_fulltext":false,"cited_by_count":1,"cited_by_percentile_year":{"min":66,"max":75},"biblio":{"volume":null,"issue":null,"first_page":null,"last_page":null},"is_retracted":false,"is_paratext":false,"keywords":[{"keyword":"probabilistic deep learning","score":0.5236},{"keyword":"forecasting","score":0.3911},{"keyword":"code","score":0.3482},{"keyword":"seasonal","score":0.313}],"concepts":[{"id":"https://openalex.org/C49937458","wikidata":"https://www.wikidata.org/wiki/Q2599292","display_name":"Probabilistic logic","level":2,"score":0.61860853},{"id":"https://openalex.org/C136894858","wikidata":"https://www.wikidata.org/wiki/Q213926","display_name":"Sea ice","level":2,"score":0.61600816},{"id":"https://openalex.org/C2776760102","wikidata":"https://www.wikidata.org/wiki/Q5139990","display_name":"Code (set theory)","level":3,"score":0.55699736},{"id":"https://openalex.org/C49204034","wikidata":"https://www.wikidata.org/wiki/Q52139","display_name":"Climatology","level":1,"score":0.49437618},{"id":"https://openalex.org/C518008717","wikidata":"https://www.wikidata.org/wiki/Q25322","display_name":"Arctic","level":2,"score":0.47132757},{"id":"https://openalex.org/C153294291","wikidata":"https://www.wikidata.org/wiki/Q25261","display_name":"Meteorology","level":1,"score":0.46749058},{"id":"https://openalex.org/C122282355","wikidata":"https://www.wikidata.org/wiki/Q7246855","display_name":"Probabilistic forecasting","level":3,"score":0.4455484},{"id":"https://openalex.org/C41008148","wikidata":"https://www.wikidata.org/wiki/Q21198","display_name":"Computer science","level":0,"score":0.43581033},{"id":"https://openalex.org/C161798024","wikidata":"https://www.wikidata.org/wiki/Q3651008","display_name":"Arctic ice pack","level":3,"score":0.426518},{"id":"https://openalex.org/C39432304","wikidata":"https://www.wikidata.org/wiki/Q188847","display_name":"Environmental science","level":0,"score":0.33687538},{"id":"https://openalex.org/C154945302","wikidata":"https://www.wikidata.org/wiki/Q11660","display_name":"Artificial intelligence","level":1,"score":0.33472306},{"id":"https://openalex.org/C205649164","wikidata":"https://www.wikidata.org/wiki/Q1071","display_name":"Geography","level":0,"score":0.32456565},{"id":"https://openalex.org/C111368507","wikidata":"https://www.wikidata.org/wiki/Q43518","display_name":"Oceanography","level":1,"score":0.2992924},{"id":"https://openalex.org/C127313418","wikidata":"https://www.wikidata.org/wiki/Q1069","display_name":"Geology","level":0,"score":0.19586685},{"id":"https://openalex.org/C199360897","wikidata":"https://www.wikidata.org/wiki/Q9143","display_name":"Programming language","level":1,"score":0.10441524},{"id":"https://openalex.org/C177264268","wikidata":"https://www.wikidata.org/wiki/Q1514741","display_name":"Set (abstract data type)","level":2,"score":0.09305075}],"mesh":[],"locations_count":1,"locations":[{"is_oa":false,"landing_page_url":"https://zenodo.org/record/5176573","pdf_url":null,"source":null,"license":null,"version":null,"is_accepted":false,"is_published":false}],"best_oa_location":null,"sustainable_development_goals":[{"id":"https://metadata.un.org/sdg/14","display_name":"Life below water","score":0.66},{"id":"https://metadata.un.org/sdg/13","display_name":"Climate action","score":0.18}],"grants":[],"referenced_works_count":0,"referenced_works":[],"related_works":["https://openalex.org/W65260730","https://openalex.org/W1123324919","https://openalex.org/W1831767722","https://openalex.org/W1977402529","https://openalex.org/W2072950528","https://openalex.org/W2291467865","https://openalex.org/W2330579472","https://openalex.org/W2532778875","https://openalex.org/W2579903493","https://openalex.org/W2775070522","https://openalex.org/W2891139966","https://openalex.org/W2903026219","https://openalex.org/W2963601129","https://openalex.org/W2998009636","https://openalex.org/W3027421894","https://openalex.org/W3041155266","https://openalex.org/W3135784599","https://openalex.org/W3157309701","https://openalex.org/W3171186748","https://openalex.org/W2614537199"],"ngrams_url":"https://api.openalex.org/works/W3210231097/ngrams","abstract_inverted_index":null,"cited_by_api_url":"https://api.openalex.org/works?filter=cites:W3210231097","counts_by_year":[{"year":2021,"cited_by_count":1}],"updated_date":"2023-12-10T00:06:56.996427","created_date":"2021-11-08"},"https://doi.org/10.5285/71820e7d-c628-4e32-969f-464b7efb187c":null},"citation_counts":{"https://doi.org/10.5281/zenodo.5176573":1},"total_citations":1,"keywords_from_contributors":[],"project_url":"https://ost.ecosyste.ms/api/v1/projects/123977","html_url":"https://ost.ecosyste.ms/projects/123977"}