ترافق قاعدة التعليمات البرمجية هذه ورقة 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
. هذا ضروري لرسم حافة الجليد الحقيقية على الأرض. لاحظ أن هذا التنزيل يمكن أن يستغرق من ساعة إلى 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 عن طريق الاتصال بممثل الحوسبة الخاص بك. بمجرد التسجيل، احصل على مفتاح API الخاص بك هنا واملأ إدخالات ECMWF API في icenet/config.py
.
لتتبع عمليات التدريب وإجراء ضبط المعلمة الافتراضية الافتراضية باستخدام الأوزان والتحيزات، قم بالتسجيل على https://wandb.ai/site. احصل على مفتاح واجهة برمجة التطبيقات (API) الخاص بك من هنا واملأ إدخالات "الأوزان والتحيزات" في 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
لتركيز الجليد البحري، وما إلى ذلك.
تحذير: بعض التنزيلات بطيئة وقد يستغرق صافي وقت التنزيل من يوم إلى يومين. قد يكون من المستحسن كتابة برنامج نصي bash لتنفيذ جميع هذه الأوامر تلقائيًا بالتسلسل وتشغيلها خلال عطلة نهاية الأسبوع.
python3 icenet/gen_masks.py
. يحصل هذا على أقنعة للأرض، والثقوب القطبية، والحد الأقصى الشهري لمدى الجليد ("منطقة خلية الشبكة النشطة")، ومناطق القطب الشمالي والساحل.
python3 icenet/download_sic_data.py
. تنزيل بيانات OSI-SAF SIC. يقوم هذا بحساب المتوسط الشهري لجانب خادم SIC، وتنزيل النتائج، واستيفاء خلايا الشبكة المفقودة (مثل الثقب القطبي) بشكل ثنائي. لاحظ أن هذا التنزيل يمكن أن يستغرق من ساعة إلى 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 لكل مهلة زمنية عبر 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. يتم حفظ التوقعات المصححة على هيئة NetCDFs في 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 شهرية. يتم حفظ معلمات التسوية (mean/std dev أو min/max) كملف JSON بحيث يمكن معالجة البيانات الجديدة مسبقًا دون الحاجة إلى إعادة حساب التسوية. فئة IceNetDataPreProcessor مخصصة
يبلغ حجم مجموعة بيانات التدريب على المراقبة والتحقق من صحة IceNet 23 جيجابايت فقط، والتي يمكن أن تتناسب مع ذاكرة الوصول العشوائي (RAM) في بعض الأنظمة وتسريع مرحلة التدريب الدقيق بشكل كبير مقارنة باستخدام أداة تحميل البيانات. للاستفادة من ذلك، قم بتشغيل python3 icenet/gen_numpy_obs_train_val_datasets.py
لإنشاء موترات NumPy لبيانات الإدخال/الإخراج الخاصة بالتدريب/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) مثل NetCDFs لـ 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/
. لاحظ أنك ستحتاج إلى ملف 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) على مساهماتهما المباشرة في قاعدة البيانات هذه.