درّب نماذج على الجزيئات والأطياف والإشارات وحلقات الروبوت
درّب rdkit-property وpeak-cnn وsignal-cnn وepisode-model على إجابات دراستك، ثم اعرض التنبؤات على المعلّقين ليقبلوها أو يصحّحوها.
جديد في v2.14.0
يدرّب هذا الدرس أربعة نماذج على تعليقات توضيحية علمية في دراسة Potato. يجيب rdkit-property عن سؤال حول جزيء، ويلتقط peak-cnn القمم في أطياف NMR وIR وRaman وUV-Vis والأطياف الكتلية، ويصنّف signal-cnn مراحل النوم أو يعلّم الفترات المصنّفة في تسجيلات EEG وECG وتسجيلات المستشعرات، ويعلّم episode-model مراحل حلقة الروبوت ونتيجتها ومنحنى المكافأة فيها. الصفحة موجّهة إلى الفرق التي تعلّق الجزيئات أو الأطياف أو الإشارات أو حلقات الروبوت في Potato أصلاً، وتريد نموذجاً يضع تصنيفات مسبقة على العناصر المتبقية. تقدّم الصفحة لكل مُدرِّب تهيئة تجتاز potato validate config.yaml --strict، وما تتعلّمه التشغيلة، ودرجة العناصر المحجوزة التي تُقرأ، وكيف تصل التنبؤات إلى المعلّقين. يشرح درّب نموذجك الأول صفحة التدريب بمصنِّف نصوص، ويفترض هذا الدرس أنك قرأته.
المُدرِّبات الأربعة
يتعلّم كل مُدرِّب من إجابات مخطط تعليق توضيحي واحد، ويقرأ مدخل النموذج من العرض أو من الملف الذي يشير إليه المخطط:
| المُدرِّب | المخطط | المدخل | التثبيت | الدرجة الرئيسية للعناصر المحجوزة |
|---|---|---|---|---|
rdkit-property | radio أو select أو likert أو slider عن جزيء | حقل عرض molecule، أو إجابة chemical_structure | potato-annotation[chemistry] | macro-F1، أو دقة الموضع المطابق تماماً للمنزلق |
peak-cnn | peak_picking | أطياف من JCAMP-DX أو mzML أو CSV أو بيانات مضمّنة | potato-annotation[train-vision] | F1 للقمم ضمن هامش تسامح |
signal-cnn | interval_label، بنمط epoch أو free | إشارات من EDF أو BDF أو WFDB أو CSV أو Parquet أو بيانات مضمّنة | potato-annotation[train-vision]، مع [signals] لـ WFDB وParquet | macro-F1 على الحقب، أو F1 للفترات عند IoU 0.5 |
episode-model | episode_annotation | حلقات روبوت من LeRobot أو HDF5 أو بيان حلقات Potato | potato-annotation[train-vision] | macro-F1 للمراحل |
يضبط rdkit-property نموذج scikit-learn، وتضبط المُدرِّبات الثلاثة الأخرى شبكات PyTorch صغيرة على الجهاز الذي يحدّده model_training.device. تتدرّب كل تشغيلة على مخطط واحد، وتقيّم النموذج على عناصر val وtest المحجوزة للتشغيلة، ولا تكتب التنبؤات راجعةً إلا للمخططات المسرودة تحت writeback.schemas. ولا تحصل عناصر قسم train في التشغيلة على تصنيف مسبق أبداً. يحتفظ peak-cnn وsignal-cnn وepisode-model بنقطة الحفظ من الحقبة التي سجّلت أفضل درجة على val، ولذلك يأخذ Potato درجة العناصر المحجوزة للشبكات الثلاث من test. والدراسة الصغيرة فيها عناصر اختبار قليلة، ويعطي مقياس التشغيلة test_n العدد الذي تستند إليه الدرجة.
تعطي الشبكات الثلاث تنبؤَ العنصر ثقةَ أقل أجزاء التنبؤ يقيناً، أي أضعف قمة أو فترة أو مرحلة أو نتيجة. ولذلك يحجب الحدّ الأدنى writeback.min_confidence العنصر كله حين ينزل جزء واحد دون الحدّ. أما تنبؤ المنزلق من rdkit-property فلا قيمة ثقة له، ويجتاز الحدّ دائماً.
الخصائص الجزيئية باستخدام rdkit-property
يتعلّم rdkit-property إجابات سؤال عن الجزيء الذي يعرضه العنصر، وبنية الجزيء هي مدخل النموذج لا نص العنصر. تتحول كل بنية إلى بصمة Morgan بنصف قطر 2 و2048 بتاً، تليها واصفات RDKit ثنائية الأبعاد، مثل الوزن الجزيئي وlogP. وعند نصف القطر 2 تطابق بصمة Morgan بصمةَ ECFP4، أي بصمة الاتصال الموسَّع بقطر 4 روابط. يضبط الانحدار اللوجستي إجابة radio أو select أو likert افتراضياً، ويضبط انحدار ridge إجابة slider. والغابة العشوائية بديل للاثنين. ثبّت RDKit على الخادم الذي يتدرّب:
pip install "potato-annotation[chemistry]"تعرض التهيئة أدناه كل مركّب رسماً لبنيته، وتطرح سؤالين، منزلقاً من 1 إلى 10 لصعوبة تصنيع المركّب واختياراً بنعم أو لا لتصنيعه تالياً:
annotation_task_name: "Compound triage"
task_dir: .
output_annotation_dir: annotation_output
data_files: [data/molecules.jsonl]
item_properties: {id_key: id, text_key: note}
user_config:
allow_all_users: true
instance_display:
fields:
- key: smiles # SMILES, a molfile, or a .mol, .sdf or .smi file
type: molecule
label: "Compound"
annotation_schemes:
- annotation_type: slider
name: synthesis
description: "How hard would this compound be to make? 1 is one step from a catalog reagent, 10 is a research project."
min_value: 1
max_value: 10
starting_value: 5
step: 1
- annotation_type: radio
name: advance
description: "Would you make this compound next?"
labels: ["yes", "no"]
model_training:
enabled: true
writeback:
schemas: [synthesis, advance]
include_unlabeled: true
min_confidence: 0.6يحمل كل سطر في ملف البيانات مركّباً واحداً:
{"id": "cpd_023", "smiles": "CC(=O)Nc1ccc(O)cc1", "note": "Compound 23"}يأخذ المُدرِّب البنية من أول حقل molecule في instance_display. وتستطيع الدراسة التي لا حقل molecule فيها أن تطرح السؤال بجانب مخطط chemical_structure، فيتعلّم المُدرِّب حينئذ من البنية التي رسمها المعلّقون. وحين يرسم المعلّقون بنى مختلفة يأخذ المُدرِّب الرسم الأكثر شيوعاً، وحين لا يرسم أحد يأخذ البنية التي بدأ منها المحرِّر (prefill_field). وتعرض صفحة التدريب rdkit-property لحقل molecule متى ملأ الحقلَ 80% من العناصر على الأقل. والبنية التي لا يستطيع RDKit تحليلها تُستبعد من التدريب، ولا يُتنبأ بها، وتُحتسب في مقياس التشغيلة n_unparseable. ولسؤال الاختيار أو ليكرت تعرض صفحة التدريب كذلك مُدرِّبات النص، لأن للعناصر نصاً مع ذلك.
يُقرَّب تنبؤ المنزلق إلى step المنزلق ويُبقى بين min_value وmax_value، فيقترح النموذج دائماً موضعاً موجوداً على المنزلق. والدرجة الرئيسية للمنزلق هي دقة الموضع المطابق تماماً، وهي تحتسب تنبؤاً بـ6 مقابل إجابة 7 خاطئاً. اقرأ val_mae أو test_mae، أي متوسط الخطأ المطلق، بجانب الدقة قبل أن تقرّر هل التنبؤات قريبة بما يكفي لعرضها. تحتاج التشغيلة إلى 10 جزيئات مصنّفة على الأقل في قسم train. وتوضع معاملات مثل model وclass_weight وradius وbits في حقل Parameters في صفحة التدريب أو في طلب API:
curl -X POST -H "X-API-Key: $KEY" -H "Content-Type: application/json" \
http://localhost:8000/admin/training/api/runs \
-d '{"trainer": "rdkit-property", "schemas": ["advance"],
"params": {"model": "random_forest", "class_weight": "balanced"}}'يسمّي سجل التشغيلة عدد الجزيئات وعدد الميزات والنموذج. ويعدّ وزن الفئة المتوازن الإجابات النادرة بوزن أكبر. استخدم class_weight: balanced حين تحصل معظم المركّبات على الإجابة نفسها. وحين تنتهي التشغيلة، يجد المعلّق الذي يفتح مركّباً غير مصنّف المنزلقَ مضبوطاً على قيمة النموذج واختيارَ النموذج محدَّداً، وكلاهما قابل للتعديل.
القمم في الأطياف باستخدام peak-cnn
يتعلّم peak-cnn التقاط القمم من إجابات peak_picking التي أعطاها المعلّقون. يقرأ المُدرِّب الطيف الذي يعرضه viewer_field في المخطط، بالقارئات نفسها التي يستخدمها عرض الأطياف. وهدف التدريب هو كل قمة أبقاها المعلّق، من اقتراحات مقبولة وقمم مضافة. والاقتراح الذي رفضه المعلّق يعلّم موضعاً بلا قمة. يتنبأ النموذج بمواضع القمم فقط، ولا يزال المعلّقون يعطون كل قمة إسناداً أو تصنيفاً أو تعدّدية. ثبّت PyTorch على الجهاز الذي يتدرّب:
pip install "potato-annotation[train-vision]"تطلب التهيئة أدناه من المعلّقين مراجعة القمم المقترحة في أطياف 1H NMR:
annotation_task_name: "1H NMR peak picking"
task_dir: .
media_directory: media
output_annotation_dir: annotation_output
data_files: [data/spectra.jsonl]
item_properties: {id_key: id, text_key: note}
user_config:
allow_all_users: true
instance_display:
fields:
- key: spectrum
type: spectrum
label: "1H NMR"
display_options:
prepick:
method: auto # item peaks, then model, then file peak table, then detector
prominence: 0.05
max_peaks: 30
annotation_schemes:
- annotation_type: peak_picking
name: peaks
description: "Accept or reject each suggested peak, and add any the suggestions missed"
viewer_field: spectrum
peak_fields:
- name: assignment
placeholder: "e.g. OCH2"
require_review: true
label_requirement: {required: true}
model_training:
enabled: true
trainer_params:
peak-cnn:
tolerance: 0.02 # ppm
writeback:
schemas: [peaks]
include_unlabeled: trueلا تصل قمم النموذج إلى المعلّقين إلا عبر إعداد prepick في العرض، وبدون prepick لا يعرض العرض أي اقتراحات. وفي method: auto يقدّم العرض قمم peaks الخاصة بالعنصر أولاً، ثم قمم النموذج، ثم جدول القمم في الملف، ثم القمم التي يجدها الكاشف. وقبل التشغيلة الأولى يراجع المعلّقون اقتراحات الكاشف، وبعد التشغيلة تعرض العناصر نفسها قمم النموذج دون إعادة تشغيل. ومع method: model يعرض العرض قمم النموذج فقط. استخدم method: model لقياس عدد مرات قبول المعلّقين لقمم النموذج دون أن تختلط باقتراحات الكاشف. وتُدرج كل قمة للنموذج مع "· model"، ويحتفظ العرض بأعلى max_peaks قمة ثقةً، وتُخزَّن القمة المقبولة للنموذج مع source: model.
يحدّد المعامل tolerance المسافة، بوحدات x، التي قد تبعدها قمة متنبَّأ بها عن قمة معلَّقة وتظل محتسبة موجودة. وبدون tolerance تستخدم التشغيلة 0.5% من مدى x للطيف، و0.5% من نافذة 1H بعرض 12 ppm تساوي 0.06 ppm. وعند 400 MHz يفصل تزاوجٌ بقيمة 7 Hz بين خطوط المتعدّد بمقدار 0.0175 ppm. والتسامح الافتراضي أوسع من هذه المسافة، ولذلك تضبط التهيئة 0.02 ppm بدلاً منه. تحسب التشغيلة الدقة والاستدعاء وF1 على القمم المطابَقة واحدةً بواحدة، الأقرب أولاً، وتبلّغ عن متوسط الإزاحة للقمم المطابَقة. والقمة المتنبَّأ بها على طيف قال المعلّق إنه لا قمم فيه تُحتسب إنذاراً كاذباً. وتحتاج التشغيلة إلى 5 أطياف معلَّقة على الأقل في قسم train.
يُعاد أخذ عيّنات كل طيف إلى length نقطة، وهي 4096 افتراضياً، قبل أن تراه الشبكة. ارفع length حين تكون القمم أضيق من 1/length من مدى x، كما في الطيف الكتلي عالي الدقة. وتحتاج قراءة ملفات mzML أيضاً إلى الإضافة spectra، كما تصف صفحة عرض الأطياف.
مراحل النوم وفترات الإشارة باستخدام signal-cnn
يتعلّم signal-cnn من إجابات interval_label على التسجيلات الفسيولوجية وتسجيلات المستشعرات مثل EEG وECG وEMG وبيانات مقياس التسارع. الشبكة نموذج InceptionTime صغير، أي رصة من الالتفافات المتوازية بثلاثة عروض. يقرأ المُدرِّب كل تسجيل بقارئات عرض السلاسل الزمنية، ويأخذ القنوات التي يسمّيها العرض، ويعيد أخذ عيّنات كل قناة إلى rate (100 Hz افتراضياً)، ويوحّد كل قناة معيارياً. ثبّت PyTorch، والإضافة signals لتسجيلات WFDB وParquet:
pip install "potato-annotation[train-vision,signals]"تقيّم التهيئة أدناه النوم في حقب من 30 ثانية على تخطيط نوم ليلي، كما يصنّف المقيِّم البشري كل حقبة يقظةً أو N1 أو N2 أو N3 أو REM:
annotation_task_name: "Sleep staging"
task_dir: .
media_directory: media
output_annotation_dir: annotation_output
data_files: [data/psg.jsonl]
item_properties: {id_key: id, text_key: note}
user_config:
allow_all_users: true
instance_display:
fields:
- key: signal
type: time_series
label: "PSG"
display_options:
window: 30
channels: ["EEG Fpz-Cz", "EOG", "EMG chin"] # also the channels signal-cnn reads
annotation_schemes:
- annotation_type: interval_label
name: stage
description: "Sleep stage of each 30-second epoch"
signal_field: signal
mode: epoch
epoch_length: 30
require_all_epochs: true
label_requirement: {required: true}
labels:
- {name: W, key_value: "1"}
- {name: N1, key_value: "2"}
- {name: N2, key_value: "3"}
- {name: N3, key_value: "4"}
- {name: REM, key_value: "5"}
model_training:
enabled: true
writeback:
schemas: [stage]
include_unlabeled: trueيحدّد mode في المخطط المهمة. في نمط epoch تكون كل حقبة معلَّقة مثالَ تدريب واحداً، ويصنّف النموذج كل حقبة في تسجيل جديد. والحقبة الأخيرة التي سُجّل أقل من نصف طولها لا تحصل على تصنيف. والدرجة الرئيسية للعناصر المحجوزة هي macro-F1 على الحقب المعلَّقة. يعطي macro-F1 المرحلة النادرة مثل N1 الوزن نفسه الذي لـ N2. وتزن خسارة التدريب كل مرحلة افتراضياً بمقلوب تكرار التصنيف (balanced: true)، فتُحتسب حقبة N1 بأكثر مما تُحتسب حقبة N2. ويُقرأ كل تسجيل بقنوات أول تسجيل تدريب، وبالترتيب نفسه، والتسجيل الذي تنقصه إحدى قنوات التدريب يحصل على خط مستقيم بدل القناة المفقودة. والعرض الذي لا يسمّي قنوات يعطي المُدرِّب كل قناة، حتى max_channels (16).
يتدرّب نمط free على المقاطع المعلَّمة بدلاً من ذلك. أضف مخطط interval_label ثانياً بـmode: free على signal_field نفسه لتعليم المصنوعات أو حالات الاستثارة:
- annotation_type: interval_label
name: artifacts
description: "Mark artifacts"
signal_field: signal
mode: free
labels:
- {name: artifact, key_value: "a"}
- {name: spike, key_value: "s", kind: event}في نمط free تتدرّب الشبكة على اقتطاعات عشوائية من 30 ثانية (window_s)، وتصنّف كل إطار من ثانية واحدة (frame_s)، وتدمج الإطارات المتتالية ذات التصنيف الواحد في فترة، وتسقط الفترات الأقصر من min_duration. والدرجة الرئيسية هي F1 للفترات، وهي تطابق الفترة المتنبَّأ بها بفترة معلَّقة لها التصنيف نفسه عند IoU 0.5. أما أحداث النقطة مثل التصنيف spike أعلاه فلا تُدرَّب ولا يُتنبأ بها. وتحتاج التشغيلة إلى 3 تسجيلات معلَّقة على الأقل في قسم train، ويحتاج نمط epoch كذلك إلى تصنيفين مختلفين على الأقل في البيانات.
تظهر فترات النموذج على التسجيل تعليقاتٍ توضيحية مسبقة متقطعة، مسرودة مع "· from the model"، وتُحفظ حين يجري المعلّق أول تغيير أو ينقر "Keep these". وتتقدم تعليقات التسجيل نفسه. فملف EDF+ الذي يحتوي على هيبنوغرام يعرض الهيبنوغرام لا فترات النموذج، وكذلك العنصر الذي فيه فترات preannotation_field. ويؤدي ضبط pre_annotations: false على المخطط إلى إيقاف النوعين.
حلقات الروبوت باستخدام episode-model
يتعلّم episode-model الطبقات الثلاث لإجابة episode_annotation، أي المراحل والنتيجة ومنحنى مكافأة التقدّم. مدخل النموذج هو كل سلسلة رقمية تسجّلها الحلقة، مثل مواضع المفاصل وحالة الماسك، بصف واحد لكل إطار. ويشمل المدخل السلاسل التي يتركها series_shown خارج الشاشة، ويستثني الفيديو. ولا يستطيع النموذج إيجاد مرحلة تظهر في الكاميرا وحدها وتترك قياسات الروبوت دون تغيير. ثبّت PyTorch، مع pyarrow لمجموعات LeRobot أو h5py لعروض HDF5:
pip install "potato-annotation[train-vision]"تجمع التهيئة أدناه الطبقات الثلاث على عروض الالتقاط والوضع، كما تصف صفحة حلقات الروبوت:
annotation_task_name: "Robot episode review"
task_dir: .
media_directory: media
output_annotation_dir: annotation_output
data_files: [data/episodes.jsonl]
item_properties: {id_key: id, text_key: note}
user_config:
allow_all_users: true
annotation_schemes:
- annotation_type: episode_annotation
name: episode_review
description: "Mark the phases, judge the outcome, and draw the progress."
source_field: episode
layers: [phases, outcome, reward]
phases:
- {name: reach, key_value: "1"}
- {name: grasp, key_value: "2"}
- {name: transport, key_value: "3"}
- {name: place, key_value: "4"}
- {name: retract, key_value: "5"}
outcomes: [success, partial, failure]
failure_causes: [missed grasp, object slipped, collision]
reward_range: [0.0, 1.0]
series_shown: [gripper, wrist_force, shoulder_lift, elbow]
model_training:
enabled: true
writeback:
schemas: [episode_review]
include_unlabeled: trueتشغّل الشبكة التفافاً على السلاسل يغذّي GRU ثنائي الاتجاه بثلاثة رؤوس، واحد لمرحلة كل إطار، وواحد لنتيجة الحلقة، وواحد للمكافأة عند كل إطار. والطبقة التي تتركها الإجابة فارغة تُستبعد من خسارة تلك الحلقة، فالحلقة المعلَّمة بنتيجة فقط تدرّب رأس النتيجة مع ذلك. ويتدرّب رأس النتيجة متى ضمّت حلقات التدريب نتيجتين مختلفتين على الأقل. ويتدرّب رأس المكافأة على المقطع الذي رسم فيه المعلّق المنحنى فقط، لأن المعلّق لم يعطِ إجابة خارج ذلك المقطع. وتُدرَّب الحلقات الأطول من max_frames (2000) على اقتطاعات عشوائية.
للتنبؤ شكل الإجابة المخزَّنة، بمراحل من قائمة المخطط، وإحدى نتائج المخطط، ومنحنى مكافأة من 50 نقطة داخل reward_range، للطبقات التي يعرضها المخطط. يملأ التنبؤ الجدول الزمني مسبقاً، ويُخزَّن متى عدّل المعلّق الجدول الزمني. ويُترك سبب الإخفاق والتعليمة للمعلّق. والدرجة الرئيسية للعناصر المحجوزة هي macro-F1 للمراحل على شبكة من 0.1 ثانية. وتبلّغ التشغيلة أيضاً عن F1 لمقاطع المراحل عند IoU 0.5، ودقة النتيجة، وr لبيرسون لمنحنى المكافأة حيث رُسم منحنى. والمخطط بلا مراحل يتخذ دقة النتيجة درجةً رئيسية، ثم ارتباط المكافأة. وتحتاج التشغيلة إلى 5 حلقات معلَّقة على الأقل في قسم train. ولا مُدرِّب في Potato لـrollout_evaluation، لأن تفضيل التشغيلات التجريبية يقارن فيديوهات ولا يقرأ episode-model أي فيديو.
ابدأ تشغيلة وافحص النتيجة
أعد تشغيل الخادم بعد إضافة model_training:
potato start config.yaml -p 8000افتح /admin/training، واختر المخطط والمُدرِّب، وانقر Train now. تعرض الصفحة المُدرِّبات التي تناسب كل مخطط فقط، ويُسرد المُدرِّب غير المثبّت بعبارة "not installed" مع أمر التثبيت. وحين تنتهي التشغيلة يسرد Potato درجة العناصر المحجوزة في جدول التشغيلات، مع القسم والمقياس في تلميح. وتسرد صفحة التشغيلة كل مقياس وقسم كل عنصر. ويعدّ تقرير الكتابة الراجعة في GET /admin/training/api/status التنبؤات المنشورة وتلك التي حجبها كل فحص، مثل n_skipped_low_confidence.
التصنيفات المسبقة تثبّت المعلّقين على إجابة النموذج، ولذلك فعّل include_unlabeled في دراسة جديدة فقط حين تسوّغ درجة العناصر المحجوزة عرض إجابات النموذج. يتناول راجع التصنيفات المسبقة للنموذج في الحلقة تقديم التصنيفات المسبقة الأقل ثقة أولاً وإعادة التدريب على التصحيحات، ويسرد التهيئة كل مفتاح والخلفيات وفحوص الكتابة الراجعة.
قراءات إضافية
- نظرة عامة على تدريب النماذج
- جميع المُدرِّبات
- البنى الكيميائية، والأطياف، والسلاسل الزمنية
- التعليق التوضيحي لحلقات الروبوت ودليل حلقات الروبوت
- Potato للكيمياء، والفسيولوجيا، والروبوتات
- الوسم بمساعدة النموذج
- المرجع الأصلي لـ
rdkit-propertyوpeak-cnnوsignal-cnnوepisode-model
المراجع
- Ismail Fawaz, H., Lucas, B., Forestier, G., Pelletier, C., Schmidt, D. F., Weber, J., Webb, G. I., Idoumghar, L., Muller, P.-A., and Petitjean, F. (2020). InceptionTime: Finding AlexNet for Time Series Classification. Data Mining and Knowledge Discovery, 34(6), 1936-1962. https://doi.org/10.1007/s10618-020-00710-y
- Rogers, D., and Hahn, M. (2010). Extended-Connectivity Fingerprints. Journal of Chemical Information and Modeling, 50(5), 742-754. https://doi.org/10.1021/ci100050t