รหัสฐานนี้มาพร้อมกับรายงาน Nature Communications การพยากรณ์น้ำแข็งในทะเลอาร์กติกตามฤดูกาลพร้อมการเรียนรู้เชิงลึกที่น่าจะเป็นไปได้ มันมีโค้ดเพื่อสร้างผลลัพธ์ทั้งหมดของการศึกษาตั้งแต่เริ่มต้นอย่างสมบูรณ์ นอกจากนี้ยังมีโค้ดสำหรับดาวน์โหลดข้อมูลที่สร้างโดยการศึกษา ซึ่งเผยแพร่บน Polar Data Center และทำซ้ำตัวเลขในรายงานทั้งหมด
ความยืดหยุ่นของโค้ดช่วยลดความยุ่งยากในการขยายการศึกษาที่เป็นไปได้ ไปป์ไลน์การประมวลผลข้อมูลและคลาส IceNetDataLoader
แบบกำหนดเองช่วยให้คุณกำหนดตัวแปรที่จะป้อนเข้าเครือข่าย การจำลองสภาพอากาศใดที่ใช้สำหรับการฝึกอบรมล่วงหน้า และคาดการณ์ล่วงหน้าได้ไกลแค่ไหน สถาปัตยกรรมของโมเดล IceNet สามารถปรับเปลี่ยนได้ใน icenet/models.py
ตัวแปรเอาท์พุตที่จะคาดการณ์สามารถเปลี่ยนแปลงได้ด้วยการปรับโครงสร้างคลาส IceNetDataLoader
ใหม่
ผู้สาธิตของโค้ดเบสนี้ (ดาวน์โหลดเครือข่าย IceNet ที่ได้รับการฝึกอบรมล่วงหน้า จากนั้นสร้างและวิเคราะห์การคาดการณ์) ที่ผลิตโดย @acocac สามารถพบได้ใน หนังสือวิทยาศาสตร์ข้อมูลสิ่งแวดล้อม
หลักเกณฑ์ด้านล่างนี้ถือว่าคุณกำลังทำงานในบรรทัดคำสั่งของเครื่องที่มีลักษณะคล้าย Unix ที่มี GPU หากต้องการจำลองผลลัพธ์ของการศึกษาทั้งหมด พื้นที่ 1 TB ควรครอบคลุมข้อกำหนดพื้นที่จัดเก็บข้อมูลอย่างปลอดภัยจากข้อมูลที่ดาวน์โหลดและสร้าง
หากคุณพบปัญหาหรือมีข้อเสนอแนะในการปรับปรุง โปรดแจ้งปัญหาหรือส่งอีเมลถึงฉัน ([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' ที่นี่
หากต้องการดาวน์โหลดข้อมูลการคาดการณ์ ECMWF SEAS5 เพื่อเปรียบเทียบกับ IceNet คุณต้องลงทะเบียนกับ ECMWF ที่นี่ก่อน หากคุณมาจากประเทศสมาชิก ECMWF คุณสามารถเข้าถึง ECMWF MARS Catalog ได้โดยติดต่อตัวแทนฝ่ายคอมพิวเตอร์ของคุณ เมื่อลงทะเบียนแล้ว ให้รับคีย์ API ของคุณที่นี่ และกรอกรายการ ECMWF API ใน icenet/config.py
หากต้องการติดตามการฝึกซ้อมและทำการปรับแต่งไฮเปอร์พารามิเตอร์แบบเบย์ด้วย Weights and Biases ให้ลงทะเบียนที่ https://wandb.ai/site รับคีย์ API ของคุณจากที่นี่ และกรอกรายการ Weights and Biases ใน icenet/config.py
ตรวจสอบให้แน่ใจว่าคุณเข้าสู่ระบบแล้วโดยเรียกใช้การ wandb login
หลังจากตั้งค่าสภาพแวดล้อม conda
หลังจากโคลน repo แล้ว ให้รันคำสั่งด้านล่างในรูทของที่เก็บเพื่อตั้งค่าสภาพแวดล้อม 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 วัน ขอแนะนำให้เขียนสคริปต์ทุบตีเพื่อรันคำสั่งเหล่านี้ตามลำดับโดยอัตโนมัติและรันในช่วงสุดสัปดาห์
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 ที่มีข้อมูล SIC ของ OSI-SAF อยู่ บันทึกจะถูกส่งออกไปที่ 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 สำหรับแต่ละระยะเวลารอคอยสินค้าผ่าน ECMWF MARS API และบันทึกการคาดการณ์อีกครั้งเพื่อให้ 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 การแยก Train/val/test ฯลฯ ไฟล์กำหนดค่าใช้เพื่อสร้างอินสแตนซ์คลาส IceNetDataLoader
แบบกำหนดเอง ไฟล์กำหนดค่าตัวอย่างสองไฟล์มีอยู่ในที่เก็บนี้ใน dataloader_configs/
ไฟล์กำหนดค่าแต่ละไฟล์จะถูกระบุด้วย ID ของตัวโหลดข้อมูล ซึ่งกำหนดโดยการประทับเวลาและชื่อที่ผู้ใช้ระบุ (เช่น 2021_06_15_1854_icenet_nature_communications
) ID ตัวโหลดข้อมูล พร้อมด้วย ID สถาปัตยกรรมที่ตั้งค่าไว้ในสคริปต์การฝึกอบรม จะให้ 'IceNet ID' ซึ่งระบุโมเดล IceNet Ensemble โดยไม่ซ้ำกันโดยการกำหนดค่าข้อมูลและสถาปัตยกรรม python3 icenet/preproc_icenet_data.py
ปรับข้อมูลดิบ NetCDF ให้เป็นปกติและบันทึกเป็นไฟล์ NumPy รายเดือน พารามิเตอร์การทำให้เป็นมาตรฐาน (mean/std dev หรือ min/max) จะถูกบันทึกเป็นไฟล์ JSON เพื่อให้สามารถประมวลผลข้อมูลใหม่ล่วงหน้าได้โดยไม่ต้องคำนวณการทำให้เป็นมาตรฐานใหม่ คลาส IceNetDataPreProcessor แบบกำหนดเอง
ชุดข้อมูลการฝึกอบรมเชิงสังเกตการณ์และการตรวจสอบความถูกต้องสำหรับ IceNet มีขนาดเพียง 23 GB ซึ่งสามารถใส่ RAM ได้ในบางระบบ และเร่งขั้นตอนการฝึกอบรมแบบละเอียดได้อย่างมากเมื่อเทียบกับการใช้ตัวโหลดข้อมูล เพื่อให้ได้ประโยชน์จากสิ่งนี้ ให้รัน python3 icenet/gen_numpy_obs_train_val_datasets.py
เพื่อสร้าง NumPy tensors สำหรับข้อมูลอินพุต/เอาท์พุต 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
ขึ้นสำหรับการปรับแต่งไฮเปอร์พารามิเตอร์: ตั้งค่าบูลการฝึกอบรมล่วงหน้าและการปรับอุณหภูมิเป็น 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 อื่นๆ (ระบุโดย ID ตัวโหลดข้อมูลและ ID สถาปัตยกรรม) เพื่อติดตามผลกระทบของการเปลี่ยนแปลงการออกแบบต่อประสิทธิภาพการคาดการณ์
python3 icenet/analyse_uncertainty.py
ประเมินการสอบเทียบของ IceNet และการคาดการณ์ SIP ของ 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/
โปรดทราบว่าคุณจะต้องมีไฟล์ CSV ข้อผิดพลาด Sea Ice Outlook เพื่อวางแผน Supp รูปที่ 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
กำหนด globalsicenet/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) สำหรับการสนับสนุนโดยตรงใน codebase นี้