تصنيف متتاليات الحمض النووي بدقة عالية باستخدام شبكات CNN العصبية التلافيفية مع آلية الانتباه

يقدم هذا المقال شرحًا عمليًا لبناء شبكة عصبية تلافيفية متقدمة (CNN) لتصنيف متتاليات الحمض النووي، مع التركيز على محاكاة المهام البيولوجية الواقعية مثل التنبؤ بالمروج، والكشف عن مواقع الربط، وتحديد العناصر التنظيمية. نستخدم في هذا النهج تقنية ترميز واحد مقابل جميع (One-hot encoding)، وطبقات تلافيفية متعددة المقاييس، وآلية الانتباه، لتصميم نموذج لا يتعلم فقط الأنماط المعقدة، بل يوفر أيضًا قابلية للتفسير. سنقوم بإنشاء بيانات اصطناعية، وتدريب النموذج باستخدام عمليات استدعاء قوية، وعرض النتائج بيانياً لفهم نقاط القوة والقيود في هذا النهج.

تحضير البيانات والبيئة

نبدأ باستيراد المكتبات اللازمة للتعلم العميق، ومعالجة البيانات، وعرض النتائج:

import numpy as np
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, confusion_matrix
import seaborn as sns
import random

np.random.seed(42)
tf.random.set_seed(42)
random.seed(42)

نقوم بتعيين قيم عشوائية ثابتة لضمان تكرار النتائج في كل مرة يتم تشغيل التجربة.

بناء نموذج التصنيف

سنستخدم فئة DNASequenceClassifier لبناء وتدريب وتقييم نموذجنا:

class DNASequenceClassifier:
    def __init__(self, sequence_length=200, num_classes=2):
        self.sequence_length = sequence_length
        self.num_classes = num_classes
        self.model = None
        self.history = None

    def one_hot_encode(self, sequences):
        mapping = {'A': 0, 'T': 1, 'G': 2, 'C': 3}
        encoded = np.zeros((len(sequences), self.sequence_length, 4))
        for i, seq in enumerate(sequences):
            for j, nucleotide in enumerate(seq[:self.sequence_length]):
                if nucleotide in mapping:
                    encoded[i, j, mapping[nucleotide]] = 1
        return encoded

    # ... (باقي الكود كما هو في المثال الأصلي)

طبقة الانتباه (Attention Layer)

تُستخدم آلية الانتباه لتحسين قابلية تفسير النموذج وفهم الأجزاء المهمة من متتالية الحمض النووي:

    def attention_layer(self, inputs, name="attention"):
        attention_weights = layers.Dense(1, activation='tanh', name=f"{name}_weights")(inputs)
        attention_weights = layers.Flatten()(attention_weights)
        attention_weights = layers.Activation('softmax', name=f"{name}_softmax")(attention_weights)
        attention_weights = layers.RepeatVector(inputs.shape[-1])(attention_weights)
        attention_weights = layers.Permute([2, 1])(attention_weights)
        attended = layers.Multiply(name=f"{name}_multiply")([inputs, attention_weights])
        return layers.GlobalMaxPooling1D()(attended)

بناء النموذج (Build Model)

يُبنى النموذج باستخدام طبقات تلافيفية متعددة المقاييس، وطبقة الانتباه، وطبقات كثيفة:

    def build_model(self):
        inputs = layers.Input(shape=(self.sequence_length, 4), name="dna_input")
        conv_layers = []
        filter_sizes = [3, 7, 15, 25]
        # ... (باقي الكود كما هو في المثال الأصلي)

توليد بيانات اصطناعية

نقوم بتوليد بيانات اصطناعية تحتوي على أنماط (Motifs) محددة لضمان جودة التدريب:

    def generate_synthetic_data(self, n_samples=10000):
        sequences = []
        labels = []
        positive_motifs = ['TATAAA', 'CAAT', 'GGGCGG', 'TTGACA']
        negative_motifs = ['AAAAAAA', 'TTTTTTT', 'CCCCCCC', 'GGGGGGG']
        nucleotides = ['A', 'T', 'G', 'C']
        # ... (باقي الكود كما هو في المثال الأصلي)

تدريب وتقييم النموذج

بعد توليد البيانات وترميزها، نقوم بتدريب النموذج باستخدام عمليات استدعاء قوية للتحكم في عملية التدريب وتحسين الأداء:

    def train(self, X_train, y_train, X_val, y_val, epochs=50, batch_size=32):
        callbacks = [
            keras.callbacks.EarlyStopping(monitor='val_loss', patience=10, restore_best_weights=True),
            keras.callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.5, patience=5, min_lr=1e-6)
        ]
        self.history = self.model.fit(
            X_train, y_train, validation_data=(X_val, y_val), epochs=epochs, batch_size=batch_size,
            callbacks=callbacks, verbose=1
        )
        return self.history

    # ... (باقي الكود كما هو في المثال الأصلي)

عرض النتائج

نقوم بعرض نتائج التقييم بيانياً لتسهيل فهم أداء النموذج:

    def evaluate_and_visualize(self, X_test, y_test):
        # ... (باقي الكود كما هو في المثال الأصلي)

الوظيفة الرئيسية (Main Function)

تجمع هذه الوظيفة جميع الخطوات السابقة معًا:

def main():
    # ... (باقي الكود كما هو في المثال الأصلي)

الخلاصة

يوضح هذا المقال كيفية بناء شبكة CNN متقدمة مع آلية الانتباه لتصنيف متتاليات الحمض النووي بدقة عالية وقابلية للتفسير. يساعد استخدام البيانات الاصطناعية على التحقق من قدرة النموذج على التعرف على الأنماط، بينما توفر تقنيات العرض المرئي رؤى قيّمة في ديناميكيات التدريب والتنبؤات. يُعد هذا النهج خطوة مهمة نحو دمج تقنيات التعلم العميق مع البيانات البيولوجية، ويمهد الطريق لتطبيق هذه الأساليب في أبحاث الجينوم التطبيقية.

المصدر: MarkTechPost