التنفيذ الرسمي
يمكن استخدام هذا المستودع لتدريب كل من نماذج U-time الأصلية وأحدث نوم. ومع ذلك ، تم تمديد المستودع بشكل كبير منذ [1] وقد يتباعد تدريجياً عن الإصدار الموضح في [2]. يمكن العثور على الإصدارات السابقة على:
يصف هذا المستند حزمة البرامج الرسمية التي تم تطويرها واستخدامها لإنشاء نظام التدريج الحر والجمهور U-Sleep [2]. U-Sleep هي شبكة عصبية عميقة تلالك بالكامل لتنظيم النوم الآلي. قد يتم تدريب مثيل واحد من النموذج على تنظيم نوم دقيق ومرن عبر مجموعة واسعة من السكان السريريين وبروتوكولات الاستحواذ على plysomnography (PSG).
يتيح هذا البرنامج التدريب المتزامن لـ U-Sleep عبر أي عدد من مجموعات بيانات PSG باستخدام اختيار عشوائي على أساس تكوينات قناة الإدخال. إنه يتميز بواجهة سطر الأوامر لتهيئة النماذج وتدريبها وتقييمها دون الحاجة إلى تعديل قاعدة الشفرة الأساسية.
في ما يلي ، سنقدم البرنامج وراء U-Sleep بمزيد من التفصيل. يرجى ملاحظة أن:
يقوم هذا المستودع بتخزين رمز التدريب وتقييم نموذج التدريج للنوم U-Sleep . إنه يعتمد ويمتد بشكل كبير مستودع u-time الخاص بنا ، الذي تم نشره في Neurips 2019 [1]. في ما يلي ، سوف نستخدم مصطلح U-Sleep للإشارة إلى نموذج التدريج ذو التردد العالي المرتفع [2] ، ووقت U للدلالة على هذا المستودع من الكود المستخدم لتدريب وتقييم نموذج U-Sleep.
لا يزال بإمكانك استخدام هذا المستودع لتدريب طراز U-time الأقدم ، انظر مثال U-Time أدناه.
الحد الأدنى من متطلبات الأجهزة
يمكن عادةً إجراء نموذج U-Sleep المدربين بالفعل لتدريج النوم على أي كمبيوتر محمول حديث (مع مراعاة متطلبات البرنامج المذكورة أدناه).
لتدريب نماذج U-Sleep من نقطة الصفر ، نوصي بشدة باستخدام جهاز كمبيوتر يعتمد على Linux مع مواصفات الأجهزة التالية على الأقل:
من الممكن تدريب النموذج على الآلات الأصغر ، وبدون وحدات معالجة الرسومات ، ولكن قد يستغرق القيام بذلك وقتًا كبيرًا. وبالمثل ، فإن المزيد من الموارد سوف تسرع التدريب. إذا تجاوزت مجموعة البيانات المدروسة ذاكرة النظام (مثل 8 GIB من RAM المقترحة أعلاه) ، فيجب معالجة البيانات مسبقًا وتدفقها من القرص كما هو موضح في القسم التجريبي أدناه. على الآلات الأكبر ، قد يستفيد المرء من الحفاظ على مجموعة أكبر من البيانات المحملة في الذاكرة. على سبيل المثال ، قمنا بتدريب U-Sleep [2] باستخدام 8 نوى وحدة المعالجة المركزية ، و 1 GPU و 40 GIB من ذاكرة الوصول العشوائي ، يرجى الرجوع إلى الاستنساخ الكامل لقسم S-Sleep أدناه.
*تعتمد مساحة القرص الصلب المطلوبة على عدد وأحجام مجموعات البيانات التي تم النظر فيها. للحصول على استنساخ كامل لـ U-Sleep ، هناك حاجة إلى حوالي 4 Tib من التخزين المتاح.
متطلبات البرمجيات:
إذا كنت ستدرب طراز U-Sleep بنفسك من الصفر ، فإننا نوصي بشدة بالقيام بذلك على وحدة معالجة الرسومات. من أجل استخدام حزمة U-Time مع وحدة معالجة الرسومات ، مطلوب مكتبة tensorflow ( v2.8.0 ). لهذا ، مطلوب البرنامج الإضافي التالي على نظامك:
يرجى الرجوع إلى https://www.tensorflow.org/install/gpu للحصول على تفاصيل إضافية. لا تحتاج إلى تثبيت TensorFlow بنفسك (انظر دليل التثبيت أدناه) ، ولكن يجب تثبيت البرنامج أعلاه قبل المتابعة.
على جهاز Linux مع ما لا يقل عن 1 CUDA GPU متاح وتثبيت anaconda أو miniconda ، قم بتشغيل الأوامر التالية لتنزيل البرنامج ، وإنشاء بيئة conda تسمى u-sleep وإعداد أحدث حزمة برامج u وتبعياتها:
git clone https://github.com/perslev/U-Time.git
conda env create --file U-Time/environment.yaml
conda activate u-sleep
pip install U-Time/
بدلاً من ذلك ، يمكنك تثبيت الحزمة من PYPI (يمكن تحديثها بشكل متكرر):
pip install utime
في هذا التالي ، سوف نوضح كيفية إطلاق جلسة تدريبية قصيرة لـ U-Sleep على مجموعة فرعية محدودة بشكل كبير من مجموعات البيانات المستخدمة في [2].
30 minutes لإكماله على جهاز الكمبيوتر والشبكة النموذجي. غالبية هذا الوقت هي قضاء تنزيل البيانات المطلوبة من قواعد البيانات العامة. قد تستغرق هذه الخطوة وقتًا أطول بكثير اعتمادًا على حركة قاعدة البيانات الحالية.11 GiB من مساحة القرص المتاحة على جهاز الكمبيوتر الخاص بك. أولاً ، نقوم بإنشاء دليل مشروع سيخزن جميع بياناتنا لهذا العرض التوضيحي. سيقوم الأمر ut init بإنشاء مجلد وملءه بمجموعة من القيم الافتراضية المفرطة:
ut init --name demo --model usleep_demo
عند إدخال دليل المشروع الذي تم إنشاؤه حديثًا ، سنجد مجلد تخزين المجلدات المفرطة:
cd demo
ls
> hyperparameters
سنقوم بتنزيل 6 دراسات PSG من قواعد بيانات النوم العامة Sleep-EDF و DCSM باستخدام أمر ut fetch . ستحتاج إلى ما يقرب من 10 GiB من مساحة القرص الصلب المجاني لتخزين الملفات التي تم تنزيلها. اعتمادًا على سرعة الإنترنت الخاصة بك والحمل الحالي على كل من الخادمين ، قد يستغرق التنزيل في أي مكان من 5 دقائق إلى عدة ساعات:
ut fetch --dataset sedf_sc --out_dir data/sedf_sc --N_first 6
ut fetch --dataset dcsm --out_dir data/dcsm --N_first 6
تم الآن تنزيل البيانات الأولية التي سنأخذها في هذا العرض التوضيحي. يحتوي مجلد المشروع demo الخاص بنا الآن على الهيكل التالي تقريبًا:
└─ demo
├─ hyperparameters
└─ data
├─ dcsm
│ ├─ tp005f7e68_a084_46bb_9f0a_b6a084155a1c
│ │ ├─ hypnogram.ids
│ │ └─ psg.h5
│ ├─ ...
└─ sedf_sc
├─ SC4001E0
│ ├─ SC4001E0-PSG.edf
│ └─ SC4001EC-Hypnogram.edf
├─ ...
قبل المتابعة لتدريب نموذج U-Sleep ، نقوم بتقسيم كل مجموعة بيانات إلى تقسيم القطار/التحقق/الاختبار الثابت باستخدام أمر ut cv_split . يجب استدعاء الأمر مرتين لكل منهما مع مجموعة فريدة من المعلمات التي تحدد اتفاقيات التسمية لمجموعة البيانات:
# Split dataset SEDF-SC
ut cv_split --data_dir data/sedf_sc/
--subject_dir_pattern 'SC*'
--CV 1
--validation_fraction 0.10
--test_fraction 0.25
--subject_matching_regex 'SC4(d{2}).*'
--seed 123
# Split dataset DCSM
ut cv_split --data_dir data/dcsm/
--subject_dir_pattern 'tp*'
--CV 1
--validation_fraction 0.10
--test_fraction 0.25
--seed 123
لاحظ أن تقسيم SEDF-SC يتم على أساس لكل موضوع. سيتم وضع جميع سجلات PSG من نفس الموضوع في نفس مجموعة البيانات. هذا غير ضروري لـ DCSM لأن جميع التسجيلات هي مواضيع فريدة.
يرجى العلم أنه إذا قمت بتعديل أي من الأوامر المذكورة أعلاه على سبيل المثال ، استخدم أسماء دليل الإخراج المختلفة ، فستحتاج إلى تعديل مسارات في ملفات مقياس البيانات المخزنة تحت hyperparameters/dataset_configurations حسب الاقتضاء قبل الإجراء مع الخطوات التالية.
قم بتشغيل الأمر التالي لإعداد البيانات للتدريب:
ut preprocess --out_path data/processed_data.h5 --dataset_splits train_data val_data
يقوم برنامج ut preprocess Script بتحميل ومعالجة جميع مجموعات البيانات كما هو موضح في المعلمات المحددة في hyperparameters/hparams.yaml وجميع الملفات الخاصة بمجموعة البيانات في المجلد hyperparameters/dataset_configurations . على وجه التحديد ، يقوم بتحميل القنوات المطلوبة (تجاهل الباقي) ، وإعادة العينات ، والمقاييس ، ومقاطع البيانات ، وتخطيط مراحل hypnogram إلى تمثيلات interger المستخدمة داخليًا أثناء التدريب وأخيراً يحفظ البيانات المعالجة إلى أرشيف HDF5. عند التدريب ، قد يتم بث البيانات مباشرة من هذا الأرشيف لتقليل ذاكرة النظام المطلوبة بشكل كبير.
من الممكن أيضًا تخطي هذه الخطوة معًا وإما 1) تحميل جميع البيانات اللازمة للتدريب في المقدمة ، أو 2) دفق وتطبيق المعالجة المسبقة أثناء التدريب كما هو موضح في التكاثر الكامل لقسم النوم أدناه.
قد نبدأ الآن التدريب من خلال استدعاء قيادة ut train . تم تحديد مجموعة افتراضية من أجهزة التحسين المفرطة المحددة مسبقًا وتقع في ملف hyperparameters/hparams.yaml من دليل المشروع الخاص بك. في هذا العرض التوضيحي ، سنقوم فقط بتشغيل جلسة تدريبية قصيرة جدًا ، لكن لا تتردد في تعديل أي معلمات في ملف hparams.yaml كما ترى مناسبة. قم بتشغيل الأمر التالي:
ut train --num_gpus=1 --preprocessed --seed 123
يمكنك استبدال المعلمة --num_gpus=1 في الأمر أعلاه مع --num_gpus=0 إذا لم يكن لديك وحدة معالجة الرسومات المتاحة ، وترغب في التدريب على وحدة المعالجة المركزية. قد يستغرق التدريب على وحدة المعالجة المركزية ما يصل إلى 30 دقيقة.
بعد التدريب ، ستتوفر مجموعة من نماذج المرشحين في model المجلد. باستخدام أفضل واحدة لوحظ (أعلى معدل التحقق من صحة درجة F1) ، قد نتوقع على مجموعات الاختبار لكل من SEDF-SC و DCSM باستخدام جميع مجموعات القنوات وكذلك حساب أصوات الأغلبية من خلال استدعاء أمر ut predict التالي:
ut predict --num_gpus=1
--data_split test_data
--strip_func strip_to_match
--one_shot
--save_true
--majority
--out_dir predictions
تتوفر الآن hypnograms المتوقعة تحت predictions/test_data . أخيرًا ، دعنا نقوم بطباعة مصفوفة تشويه عالمية (محسوبة في جميع الموضوعات) لمجموعة البيانات sedf_sc (استبدل sedf_sc -> dcsm لتقييم DCSM):
ut cm --true 'predictions/test_data/sedf_sc/*TRUE.npy'
--pred 'predictions/test_data/sedf_sc/majority/*PRED.npy'
--ignore 5
--round 2
--wake_trim_min 30
>>> Looking for files...
>>> Loading 2 pairs...
>>> OBS: Wake trimming of 30 minutes (period length 30 sec)
>>> OBS: Ignoring class(es): [5]
>>>
>>> Raw Confusion Matrix:
>>>
>>> Pred 0 Pred 1 Pred 2 Pred 3 Pred 4
>>> True 0 0 0 17 234 0
>>> True 1 0 0 132 146 0
>>> True 2 0 0 790 157 0
>>> True 3 0 0 25 189 0
>>> True 4 0 0 243 99 0
>>>
>>> Raw Metrics:
>>>
>>> F1 Precision Recall/Sens.
>>> Class 0 0.00 0.00 0.00
>>> Class 1 0.00 0.00 0.00
>>> Class 2 0.73 0.65 0.83
>>> Class 3 0.36 0.23 0.88
>>> Class 4 0.00 0.00 0.00
>>> mean 0.22 0.18 0.34
إذا تلقيت ناتجًا مشابهًا لما ورد أعلاه ، تهانينا! لقد قمت بتثبيت وتكوين وتدريب وتقييم نموذج U-Sleep بنجاح على مجموعتين مختلفتين.
يرجى ملاحظة أن:
إذا قمت بتشغيل الرمز أعلاه على وحدة معالجة الرسومات ، فقد لا تحصل على نفس الأرقام المحددة المدرجة هنا ، حتى لو حددت الوسيطات ذات الواجهة. وذلك لأن بعض الحسابات المستخدمة أثناء تدريب U-Sleep غير محددة بشكل أساسي عند تقييمها على وحدة معالجة الرسومات. ومع ذلك ، فإن التنبؤ باستخدام نموذج U-Sleep المدربين سيعطي مخرجات حتمية.
أداء النموذج التجريبي الذي تم الحصول عليه منخفض للغاية وغير مناسب لتدريج النوم الفعلي. والسبب هو أننا قمنا بتدريب U-Sleep على مجموعة محدودة للغاية من البيانات ولعديد محدود للغاية من الحقبة. يرجى الرجوع إلى الاستنساخ الكامل لقسم U-Sleep للحصول على تفاصيل حول كيفية إعداد وتدريب نسخة كاملة من U-Sleep.
يصف العرض التوضيحي أعلاه من حيث المبدأ جميع الخطوات اللازمة لتكاثر نوم U كما ورد في [2]. الفرق الرئيسي - والمهم - هو أنه من أجل إعادة إنتاج النموذج الكامل ، ستحتاج إلى 1) أن تكون قادرًا على الوصول إلى 2) التنزيل و 3) معالجة جميع مجموعات البيانات المطلوبة. قد تحتاج أيضًا إلى جهاز كمبيوتر به المزيد من الموارد كما هو موضح في متطلبات النظام.
لقد بذلنا قصارى جهدنا لجعل هذه العملية سهلة قدر الإمكان. يجب أن تتخذ الخطوات التالية:
ut fetch . يرجى استدعاء ut fetch --help لمشاهدة قائمة محدثة يمكن تنزيل مجموعات البيانات بهذه الطريقة.[LOCAL_PATH] مع جهاز فرعي واحد لكل مجموعة بيانات.ut extract و ut extract_hypno و ut cv_split على جميع مجموعات البيانات كما هو محدد لكل مجموعة بيانات بشكل منفصل في الملفات ضمن resources/usleep_dataset_pred من هذا المستودع (الموجود أيضًا هنا). ستقوم هذه الأوامر باستخراج البيانات ووضعها في بنية مجلد وتنسيق يقبله وقت U ، بالإضافة إلى تقسيم البيانات إلى مجموعات فرعية.ut extract بتحديد القنوات ذات الصلة ، وإعادة تعديلها إلى 128 هرتز وتخزين البيانات في أرشيف HDF5. لن يتم حذف البيانات الأصلية افتراضيًا. إذا كان لديك مساحة محدودة من القرص الصلب ، ففكر في إزالة الملفات القديمة قبل معالجة مجموعة البيانات التالية.ut init --name u-sleep --model usleep .u-sleep/hyperparameters/dataset_configurations/ استبدل السلسلة [local_path] بـ [LOCAL_PATH] لبياناتك. إذا كان لديك أكثر من أكثر من ذاكرة نظام GIB ، قم بتدريب U-Sleep باستخدام الأمر التالي:
ut train --num_gpus 1 --max_loaded_per_dataset 40 --num_access_before_reload 32 --train_queue_type limitation --val_queue_type lazy --max_train_samples_per_epoch 1000000
على الأنظمة ذات الذاكرة الأقل ، قد تكون إما 1) تقليل المعلمة --max_loaded_per_dataset من القيمة 40 الحالية إلى قيمة أقل (سيؤدي ذلك إلى إبقاء سجلات PSG أقل في تجمع الذاكرة النشط ، مما يقلل العشوائية عند تحديد السجلات) أو 2) المعالجة المسبقة للبيانات ودفق البيانات أثناء التدريب (كما هو موضح في العرض التوضيحي أعلاه) من خلال استدعاء الأوامر التالية (استبدال [local_path] حسب الاقتضاء):
ut preprocess --out_path '[LOCAL_PATH]/processed_data.h5' --dataset_splits train_data val_data
ut train --num_gpus 1 --preprocessed --max_train_samples_per_epoch 1000000
سيطبق هذا كل المعالجة المسبقة ، وإنشاء أرشيف بيانات مناسب للبث ، وتدريب النوم باستخدام عينات تم تحميلها على ذرة من القرص.
نظرًا للحجم الهائل لمجموعة البيانات التي يتم النظر فيها ، قد يستغرق التدريب على النوم مع المعلمات الافتراضية وقتًا طويلاً. نقترح زيادة معدل التعلم (من 1e-7 الحالي إلى EG 1e-6 ) إلا إذا كنت تتطلع إلى إعادة إنشاء U-Sleep في ظل الظروف الدقيقة التي تم النظر فيها في [2].
لا يزال بإمكانك استخدام هذا المستودع لتدريب نموذج U-Time الأقدم. في ما يلي ، نعرض مثالًا شاملاً. تقوم الأوامر المذكورة أدناه بإعداد مجلد المشروع ، وتنزيل مجموعة بيانات Sleep-EDF-153 ، وتناسبها وتقييم نموذج وقت U في إعداد مجموعة بيانات قطار/VAL/اختبار. يرجى ملاحظة أن الكود أدناه لا يعيد إنتاج تجربة Sleep-EDF-153 لـ [1] حيث تم استخدام CV 10 أضعاف. لتشغيل تجربة السيرة الذاتية ، يرجى الرجوع إلى أوامر ut cv_split --help و ut cv_experiment --help .
# احصل على مجموعة بيانات انطلاق للنوم العام
UT FETCH -DATASET SEDF_SC -OUT_DIR مجموعات البيانات/SEDF_SC
# قم بإعداد تجربة ثابتة
UT CV_SPLIT -DATA_DIR 'مجموعات البيانات/sedf_sc'
-sign_dir_pattern 'sc*'
--cv 1
-VECENTID_FRACTION 0.20
-Test_fraction 0.20
-sigject_matching_regex 'sc4 ( d {2}).*'
-File_List
# تهيئة مشروع u-time
ut init -name my_utime_project
-نموذج UTIME
-data_dir مجموعات البيانات/sedf_sc/views/fixed_split
# ابدأ التدريب
CD my_utime_project
UT TRAIN-NUM_GPUS = 1-Channels 'EEG FPZ-CZ'
# التنبؤ والتقييم
UT تقييم -out_dir eval -one_shot
# اطبع مصفوفة الارتباك
UT CM -TRUE 'eval/test_data/dataset_1/files/*/true.npz'
-pred 'eval/test_data/dataset_1/files/*/pred.npz'
# طباعة إحصائيات ملخص لكل موضوع
ملخص UT -csv_pattern 'eval/test_data/*/evaluation_dice.csv'
-print_all
# مراحل النوم الإخراج لكل 3 ثوانٍ من إشارة 128 هرتز
# هنا ، يطابق "Folder_regex" ملفين في مجموعة البيانات
UT تنبؤ-folder_regex '../datasets
-out_dir High_res_pred
-data_per_prediction 384
-one_shot
@incollection{NIPS2019_8692,
title = {U-Time: A Fully Convolutional Network for Time Series Segmentation Applied to Sleep Staging},
author = {Perslev, Mathias and Jensen, Michael and Darkner, Sune and Jennum, Poul Jo rgen and Igel, Christian},
booktitle = {Advances in Neural Information Processing Systems 32},
editor = {H. Wallach and H. Larochelle and A. Beygelzimer and F. dtextquotesingle Alch'{e}-Buc and E. Fox and R. Garnett},
pages = {4415--4426},
year = {2019},
publisher = {Curran Associates, Inc.},
url = {http://papers.nips.cc/paper/8692-u-time-a-fully-convolutional-network-for-time-series-segmentation-applied-to-sleep-staging.pdf}
}
U-Sleep: Resilient High-Frequency Sleep Staging
Mathias Perslev (1), Sune Darkner (1), Lykke Kempfner (2), Miki Nikolic (2), Poul Jørgen Jennum (2) & Christian Igel (1)
npj Digital Medicine, 4, 72 (2021)
https://doi.org/10.1038/s41746-021-00440-5
(1) Department of Computer Science, University of Copenhagen, Denmark
(2) Danish Center for Sleep Medicine, Rigshospitalet, Glostrup, Denmark