이 코드베이스는 확률론적 딥 러닝을 통해 Nature Communications의 논문인 계절별 북극 해빙 예측과 함께 제공됩니다. 여기에는 연구의 모든 결과를 처음부터 완전히 재현하는 코드가 포함되어 있습니다. 또한 연구에서 생성되고 Polar Data Center에 게시된 데이터를 다운로드하고 논문의 모든 수치를 재현하는 코드도 포함되어 있습니다.
코드의 유연성은 연구의 가능한 확장을 단순화합니다. 데이터 처리 파이프라인과 사용자 정의 IceNetDataLoader
클래스를 사용하면 어떤 변수가 네트워크에 입력되는지, 어떤 기후 시뮬레이션이 사전 훈련에 사용되는지, 예측할 기간을 지정할 수 있습니다. IceNet 모델의 아키텍처는 icenet/models.py
에서 조정할 수 있습니다. IceNetDataLoader
클래스를 리팩토링하여 예측할 출력 변수를 변경할 수도 있습니다.
@acocac에서 생성한 이 코드베이스(사전 훈련된 IceNet 네트워크를 다운로드한 후 예측 생성 및 분석)의 시연자는 The Environmental Data Science Book에서 찾을 수 있습니다.
아래 지침에서는 GPU가 있는 Unix 계열 시스템의 명령줄에서 작업한다고 가정합니다. 연구 결과를 모두 재현하려면 1TB의 공간이 다운로드 및 생성된 데이터의 저장 요구 사항을 안전하게 감당해야 합니다.
문제가 발생하거나 개선을 위한 제안이 있는 경우 문제를 제기하거나 저에게 이메일([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
파일을 채워야 합니다. 여기에서 'CDS API 키 설치' 지침을 따르세요.
IceNet과 비교하기 위해 ECMWF SEAS5 예측 데이터를 다운로드하려면 먼저 여기에서 ECMWF에 등록해야 합니다. ECMWF 회원국 출신인 경우 컴퓨팅 담당자에게 문의하여 ECMWF MARS 카탈로그에 액세스할 수 있습니다. 등록이 완료되면 여기에서 API 키를 얻고 icenet/config.py
에 ECMWF API 항목을 입력하세요.
훈련 실행을 추적하고 가중치 및 편향을 사용하여 베이지안 초매개변수 조정을 수행하려면 https://wandb.ai/site에 가입하세요. 여기에서 API 키를 얻고 icenet/config.py
에 Weights 및 Biases 항목을 입력하세요. Conda 환경을 설정한 후 wandb login
실행하여 로그인되었는지 확인하세요.
리포지토리를 복제한 후 리포지토리 루트에서 아래 명령을 실행하여 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 데이터는 글로벌 위도-경도 형식으로 다운로드되고 OSI-SAF SIC 데이터가 있는 EASE 그리드에 다시 그리드됩니다. 로그는 logs/era5_download_logs/
에 출력됩니다.
./download_cmip6_data_in_parallel.sh
. CMIP6 기후 시뮬레이션 데이터를 다운로드합니다. 이는 백그라운드에서 여러 병렬 python3 icenet/download_cmip6_data.py
명령을 실행하여 각 기후 시뮬레이션을 다운로드합니다. 원시 CMIP6 데이터는 글로벌 위도-경도 형식에서 OSI-SAF SIC 데이터가 있는 EASE 그리드로 다시 그리드됩니다. 로그는 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
명령을 실행하여 ECMWF MARS API를 통해 각 리드 타임에 대한 2002-2020 SEAS5 예측을 획득하고 예측을 EASE로 다시 표시합니다. 예측은 latlon/
및 EASE/
폴더의 data/forecasts/seas5/
에 저장됩니다. 로그는 logs/seas5_download_logs/
에 출력됩니다.
python3 icenet/biascorrect_seas5_forecasts.py
. 편향은 2002~2011년 예측을 사용하여 SEAS5 2012+ 예측을 수정합니다. 또한 SEAS5 해빙 확률(SIP) 필드를 계산합니다. 편향 수정된 예측은 차원 (target date, y, x, lead time)
과 함께 data/forecasts/seas5/
에 NetCDF로 저장됩니다.
python3 icenet/gen_data_loader_config.py
. 데이터 로더 구성을 설정합니다. 이는 IceNet의 입력 및 출력 데이터, 훈련/평가/테스트 분할 등을 지시하는 JSON 파일로 저장됩니다. 구성 파일은 사용자 정의 IceNetDataLoader
클래스를 인스턴스화하는 데 사용됩니다. dataloader_configs/
의 이 저장소에는 두 가지 예제 구성 파일이 제공됩니다. 각 구성 파일은 타임스탬프와 사용자 제공 이름(예: 2021_06_15_1854_icenet_nature_communications
)으로 결정되는 데이터로더 ID로 식별됩니다. 데이터 로더 ID는 훈련 스크립트에 설정된 아키텍처 ID와 함께 데이터 구성 및 아키텍처를 통해 IceNet 앙상블 모델을 고유하게 식별하는 'IceNet ID'를 제공합니다. python3 icenet/preproc_icenet_data.py
. 원시 NetCDF 데이터를 정규화하고 이를 월별 NumPy 파일로 저장합니다. 정규화 매개변수(평균/표준 편차 또는 최소/최대)는 정규화를 다시 계산할 필요 없이 새 데이터를 전처리할 수 있도록 JSON 파일로 저장됩니다. 사용자 정의 IceNetDataPreProcessor 클래스
IceNet의 관찰 훈련 및 검증 데이터세트는 23GB에 불과합니다. 이는 일부 시스템의 RAM에 적합하며 데이터 로더를 사용할 때와 비교하여 미세 조정 훈련 단계의 속도를 크게 높일 수 있습니다. 이를 활용하려면 python3 icenet/gen_numpy_obs_train_val_datasets.py
실행하여 train/val 입력/출력 데이터에 대한 NumPy 텐서를 생성하세요. tf.data
의 훈련 속도 향상을 더 활용하려면 python3 icenet/gen_tfrecords_obs_train_val_datasets.py
를 사용하여 NumPy 텐서에서 TFRecords 데이터세트를 생성하세요. 훈련을 위해 데이터 로더, NumPy 배열 또는 TFRecords 데이터 세트를 사용할지 여부는 icenet/train_icenet.py
의 bool에 의해 제어됩니다.
icenet/train_icenet.py
설정합니다. 사용자 입력 섹션에서 사전 훈련 및 온도 조정 부울을 False
로 설정합니다.wandb sweep icenet/sweep.yaml
wandb agent
명령을 실행합니다.python3 icenet/train_icenet.py
사용하여 IceNet 네트워크를 훈련합니다. 이는 하이퍼미터 설정과 네트워크 가중치 초기화를 위한 무작위 시드를 명령줄 입력으로 사용합니다. 앙상블을 훈련하려면 --seed
의 다양한 설정을 사용하여 이를 여러 번 실행하세요. 훈련된 네트워크는 trained_networks/<dataloader_ID>/<architecture_ID>/networks/
에 저장됩니다. 공유 시스템에서 작업하고 SLURM에 익숙한 경우 이 명령을 SLURM 스크립트로 래핑할 수 있습니다. python3 icenet/predict_heldout_data.py
. xarray
사용하여 검증 및 테스트 기간 동안의 예측을 IceNet용 NetCDF 및 선형 추세 벤치마크(2012-2020)로 저장합니다. IceNet의 예측은 data/forecasts/icenet/<dataloader_ID>/<architecture_ID>/
에 저장됩니다. IceNet의 경우 전체 예측 데이터세트에는 차원 (target date, y, x, lead time, ice class, seed)
이 있으며 여기서 seed
단일 앙상블 멤버 또는 앙상블 평균 예측을 지정합니다. 앙상블 평균 SIP 예측도 계산되어 별도의 더 작은 파일(처음 4개 차원만 포함)로 저장됩니다.
각 리드 타임에 대한 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 예측 데이터를 로드하고 예측 메트릭을 계산하여 MultiIndex
(model, ensemble member, lead time, target date)
및 각 메트릭(이진 정확도 및 해빙 범위 오류)에 대한 열을 사용하여 글로벌 pandas
DataFrame에 결과를 저장합니다. dask
사용하면 전체 예측 데이터 세트가 메모리에 로드되는 것을 방지하고 청크를 병렬로 처리하여 분석 속도를 크게 높일 수 있습니다. 결과는 덮어쓰기를 방지하기 위해 타임스탬프와 함께 results/forecast_results/
에 CSV 파일로 저장됩니다. 선택적으로 최신 CSV 파일을 미리 로드하여 기존 모델을 다시 분석할 필요 없이 결과에 새 모델이나 측정항목을 추가할 수 있습니다. 이 기능을 사용하면 다른 IceNet 모델(데이터로더 ID 및 아키텍처 ID로 식별됨)의 예측 결과를 추가하여 설계 변경이 예측 성능에 미치는 영향을 추적할 수 있습니다.
python3 icenet/analyse_uncertainty.py
. IceNet 및 SEAS5의 SIP 예측 보정을 평가합니다. 또한 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를 플롯하려면 Sea Ice Outlook 오류 CSV 파일이 필요합니다. 그림 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
데이터 전처리기, 데이터 로더, ERA5 및 CMIP6 처리, 학습 속도 감소 및 비디오 기능과 같은 IceNet 유틸리티 기능을 정의합니다.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
:
이 코드베이스에 직접 기여한 James Byrne(BAS) 및 Tony Phillips(BAS)에게 감사드립니다.