دورة تعليمية حول PyTorch CNN: بناء وتدريب الشبكات العصبية التكرارية التصاعدية في لغة البايثون

الشبكات العصبية التصويرية (CNNs) هي ركيزة أساسية في رؤية الحواسيب الحديثة، حيث تمكن من تطبيقات مثل التعرف على الصور، والكشف عن الوجوه، والسيارات ذاتية القيادة. تم تصميم هذه الشبكات لاستخراج أنماط وميزات تلقائيًا من الصور، مما يجعلها أكثر قوة من تقنيات التعلم الآلي التقليدية للمهام البصرية.

في هذا البرنامج التعليمي، سنقوم بتنفيذ شبكة عصبية تصويرية باستخدام PyTorch، إطار عميق للتعلم يتميز بسهولة الاستخدام والكفاءة العالية لتطبيقات البحث والإنتاج.

المتطلبات الأساسية: التعلم العميق وPyTorch

قبل التعمق في تفاصيل الشبكات العصبية التصويرية، يجب أن تكون على دراية بمجال التعلم العميق والمكتبات التي سنستخدمها أثناء إعداد بيئتنا.

التعلم العميق هو جزء من التعلم الآلي، حيث يكون الهيكل الأساسي للنموذج شبكة من المداخل والطبقات الخفية والمخرجات. يمكن أن تحتوي هذه الشبكة على طبقة واحدة أو عدة طبقات خفية. كانت الفكرة الأصلية وراء التعلم العميق هي إنشاء نماذج مستوحاة من كيفية تعلم الدماغ البشري: من خلال خلايا تتصل تسمى العقد. هذا هو السبب في استمرارنا في تسمية نماذج التعلم العميق “شبكات” عصبية. تتطلب هذه الهياكل النمذجية المتدرجة كمية أكبر بكثير من البيانات للتعلم منها من غيرها من نماذج التعلم المراقب، لاستخلاص الأنماط من البيانات غير المهيكلة. نعتبر عادةً عند الحديث عن مئات الآلاف من نقاط البيانات على الأقل.

بينما هناك العديد من الأطر والحزم المتاحة لتنفيذ خوارزميات التعلم العميق, سنركز على PyTorch, واحدة من أكثر الأطر شهرة وصيانة. بالإضافة إلى استخدام مهندسي التعلم العميق في الصناعة, يعتبر PyTorch أداة مفضلة بين الباحثين. تُنشر العديد من الأوراق البحثية حول التعلم العميق باستخدام PyTorch. تم تصميمه ليكون بديهيًا وسهل الاستخدام, مشتركًا في الكثير من الأسس مع مكتبة Python NumPy.

إذا كنت بحاجة إلى مقدمة حول هذه المفاهيم, فكر في الالتحاق بدورة Deep Learning with PyTorch اليوم.

ما هو شبكة التعلم العميق التصنيفية (CNN)?

شبكات التعلم العميق التصنيفية, المعروفة باسم CNN أو ConvNet, هي نوع محدد من الشبكات العصبية العميقة مناسب جيدًا لمهام رؤية الحاسوب. يعود اختراع شبكات CNN إلى الثمانينيات. ومع ذلك, لم تصبح شائعة إلا في العقد الثاني من القرن الحادي والعشرين, بعد الانفجارات الحاسوبية التي نجمت عن تنفيذ وحدات المعالجة الرسومية (GPUs). في الواقع, ساعدت شعبية سريعة لشبكات CNN المجال الخاص بالشبكات العصبية في استعادة بريقها, مما أدى إلى ما يعرف بـ “الموجة الثالثة من الشبكات العصبية” التي نعيش فيها حتى اليوم.

تستلهم شبكات CNN بشكل خاص من القشرة البصرية البيولوجية. تحتوي القشرة على مناطق صغيرة من الخلايا التي تكون حساسة لمناطق معينة من الحقل البصري. تم توسيع هذه الفكرة من خلال تجربة مثيرة قدمها هوبل وويزل في عام 1962.

تحاول الـCNNs تقليد هذه الميزة عن طريق إنشاء شبكات عصبية معقدة تتكون من طبقات مختلفة تعمل على مهام محددة. تسمى الـCNNs “تغذية إلى الأمام” لأن المعلومات تتدفق مباشرة من خلال النموذج. لا توجد اتصالات راجعة حيث يتم إعادة إدخال مخرجات النموذج إلى نفسه، بالمقارنة مع النماذج الأخرى التي تستخدم تقنيات مثل الانتشار العكسي.

على وجه الخصوص، يتكون الـCNN عادة من الطبقات التالية:

طبقة التحويل

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

وظيفة التنشيط

عادة، يتم تطبيق وظيفة تنشيط ReLU بعد كل عملية تحويل. تساعد هذه الوظيفة الشبكة على تعلم العلاقات غير الخطية بين الميزات في الصورة، مما يجعل الشبكة أكثر قوة في تحديد أنماط مختلفة. كما تساعد في التقليل من مشاكل الانحسار التدريجي. 

طبقة التجميع

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

الطبقات المتصلة بالكامل

هذه الطبقات تكون في الطبقة الأخيرة من الشبكة العصبية التابعة للتحويل، ومدخلاتها تتوافق مع المصفوفة المسطحة ذات الأبعاد الواحدة التي تم إنشاؤها بواسطة طبقة التجميع الأخيرة. يتم تطبيق وظائف تنشيط ReLU عليها لإضفاء عدم الخطية. 

بنية الشبكة العصبية التابعة للتحويل. المصدر: DataCamp

يمكنك قراءة شرح مفصل أكثر حول الرياضيات وراء الشبكات العصبية التابعة للتحويل في دورتنا التعليمية، الشبكات العصبية التابعة للتحويل بلغة البايثون.

لماذا استخدام الشبكات العصبية التابعة للتحويل لتصنيف الصور؟

لقد كانت الشبكات العصبية التلافيفية واحدة من أكثر الابتكارات تأثيراً في مجال رؤية الكمبيوتر. لقد قدمت أداءً أفضل بكثير من نماذج تعلم الآلة التقليدية، مثل آلات الدعم الناقل، و أشجار القرار، وأنتجت نتائج متطورة.

علاوة على ذلك، تمنح الطبقات التلافيفية الشبكات العصبية التلافيفية خصائص عدم الحساسية للترجمة، مما يمكنها من تحديد واستخراج الأنماط والميزات من البيانات بغض النظر عن التغيرات في الموضع أو الاتجاه أو المقياس أو الترجمة.

لقد أثبتت الشبكات العصبية التلافيفية نجاحها في العديد من دراسات الحالة والتطبيقات الواقعية المختلفة، مثل:

  • تصنيف الصور، اكتشاف الكائنات، التجزئة، التعرف على الوجوه؛
  • السيارات ذاتية القيادة التي تستفيد من أنظمة الرؤية المستندة إلى الشبكات العصبية التلافيفية؛
  • تصنيف بنية البلورات باستخدام شبكة عصبية تلافيفية؛
  • أنظمة كاميرات الأمان.

بعيدًا عن مهام تصنيف الصور، فإن الشبكات العصبية التلافيفية متعددة الاستخدامات ويمكن تطبيقها على مجموعة من المجالات الأخرى، مثل معالجة اللغة الطبيعية، وتحليل السلاسل الزمنية، والتعرف على الكلام.

تنفيذ شبكة عصبية تلافيفية باستخدام بايتورتش

الآن بما أنك تعرفت على نظرية الشبكات العصبية التكرارية، نحن جاهزون للبدء بالعمل الفعلي. في هذا القسم، سنقوم ببناء وتدريب شبكة عصبية تكرارية بسيطة باستخدام PyTorch. هدفنا هو بناء نموذج لتصنيف الأرقام في الصور. لتدريب واختبار نموذجنا، سنستخدم مجموعة البيانات الشهيرة MNIST، وهي مجموعة تحتوي على 70,000 صورة رمادية بأبعاد 28×28 بيكسل تحتوي على أرقام مكتوبة باليد.

1. استيراد المكتبات المطلوبة

أدناه يمكنك العثور على المكتبات التي سنستخدمها في هذا البرنامج التعليمي. في الجوهر، سنستفيد من PyTorch لبناء شبكتنا العصبية التكرارية، ووحدة رؤية الحاسوب الخاصة بـ PyTorch torchvision، لتنزيل وتحميل مجموعة بيانات MNIST. وأخيرًا، سنستخدم أيضًا torchmetrics لتقييم أداء نموذجنا.

import numpy as np import pandas as pd import matplotlib.pyplot as plt import torch from torch import optim from torch import nn from torch.utils.data import DataLoader from tqdm import tqdm # !pip install torchvision import torchvision import torch.nn.functional as F import torchvision.datasets as datasets import torchvision.transforms as transforms # !pip install torchmetrics import torchmetrics

2. تحميل ومعالجة مجموعة البيانات

تأتي PyTorch أيضًا مع نظام غني من الأدوات والامتدادات، بما في ذلك torchvision، وحدة لرؤية الحاسوب. تتضمن torchvision عدة مجموعات بيانات للصور يمكن استخدامها لتدريب واختبار الشبكات العصبية. في برنامجنا التعليمي، سنستخدم مجموعة بيانات MNIST. 

أولاً، سنقوم بتنزيل وتحويل مجموعة بيانات MNIST إلى تنسور، الهيكل الأساسي للبيانات في PyTorch، شبيه بمصفوفات NumPy ولكن مع إمكانيات تسارع GPU.

ثم، سنستخدم أيضًا DataLoader لمعالجة التجميع والتبديل في كل من مجموعات بيانات التدريب والاختبار. يمكن إنشاء DataLoader PyTorch من مجموعة بيانات لتحميل البيانات، تقسيمها إلى دفعات، وإجراء تحويلات على البيانات إذا تم الرغبة في ذلك. ثم، يقدم عينة بيانات جاهزة للتدريب. في الشيفرة أدناه، نقوم بتحميل البيانات وحفظها في DataLoaders بحجم دفعة يحتوي على 60 صورة:

batch_size = 60 train_dataset = datasets.MNIST(root="dataset/", download=True, train=True, transform=transforms.ToTensor()) train_loader = DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True) test_dataset = datasets.MNIST(root="dataset/", download=True, train=False, transform=transforms.ToTensor()) test_loader = DataLoader(dataset=test_dataset, batch_size=batch_size, shuffle=True)

يمكن اختياريًا تقسيم مجموعة بيانات التدريب إلى قسمين من التدريب والتحقق. التحقق هو تقنية تُستخدم في التعلم العميق لتقييم أداء النموذج أثناء التدريب. إنها تساعد في اكتشاف التجاوز المحتمل والتحاقل النماذج الخاصة بنا، وهي مفيدة بشكل خاص لتحسين المعلمات الفائقة. ومع ذلك، لأغراض البساطة، لن نستخدم التحقق في هذا البرنامج التعليمي. إذا كنت ترغب في معرفة المزيد عن التحقق، يمكنك الاطلاع على شرح كامل في دورة مقدمة للتعلم العميق باستخدام PyTorch.

الآن بعد أن حصلنا على بياناتنا، دعونا نرى كيف تبدو دفعة عشوائية من الأرقام:

def imshow(img): npimg = img.numpy() plt.imshow(np.transpose(npimg, (1, 2, 0))) plt.show() # احصل على بعض الصور التدريبية العشوائية dataiter = iter(dataloader_train) images, labels = next(dataiter) labels # عرض الصور imshow(torchvision.utils.make_grid(images))

3. تعريف بنية CNN

لحل مشكلة التصنيف، سنستفيد من فئة nn.Module، التي تعد قطعة بناء PyTorch لإنشاء بنى شبكة عصبونية متطورة بشكل بديهي.

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

في PyTorch، نستخدم nn.Conv2d لتعريف طبقة تحويل تباين. نمرر لها عدد خرائط الميزات الداخلية والخارجية. كما نقوم بتعيين بعض المعلمات لعمل طبقة التحويل التبايني، بما في ذلك حجم النواة أو الفلتر والحشو.

بعد ذلك، نضيف طبقة تجميع بحد أقصى باستخدام nn.MaxPool2d. ننزلق نافذة لا تتداخل عبر إخراج الطبقة التحويل التبايني السابقة. في كل موضع، نختار القيمة القصوى من النافذة للمرور إلى الأمام. يقلل هذا التشغيل من الأبعاد الفضائية لخرائط الميزات، مما يقلل من عدد المعلمات والتعقيد الحسابي في الشبكة. وأخيرًا، نضيف طبقة خطية متصلة بالكامل.

تقوم الدالة forward() بتعريف كيفية ربط الطبقات المختلفة، مضيفة عدة دوال تنشيط ReLU بعد كل طبقة تحويل تباينية.

class CNN(nn.Module): def __init__(self, in_channels, num_classes): """ Building blocks of convolutional neural network. Parameters: * in_channels: Number of channels in the input image (for grayscale images, 1) * num_classes: Number of classes to predict. In our problem, 10 (i.e digits from 0 to 9). """ super(CNN, self).__init__() # الطبقة التكاملية الأولى self.conv1 = nn.Conv2d(in_channels=in_channels, out_channels=8, kernel_size=3, padding=1) # طبقة التجميع القصوى self.pool = nn.MaxPool2d(kernel_size=2, stride=2) # الطبقة التكاملية الثانية self.conv2 = nn.Conv2d(in_channels=8, out_channels=16, kernel_size=3, padding=1) # الطبقة المتصلة بالكامل self.fc1 = nn.Linear(16 * 7 * 7, num_classes) def forward(self, x): """ Define the forward pass of the neural network. Parameters: x: Input tensor. Returns: torch.Tensor The output tensor after passing through the network. """ x = F.relu(self.conv1(x)) # تطبيق التكامل الأول وتفعيل ReLU x = self.pool(x) # تطبيق التجميع القصوى x = F.relu(self.conv2(x)) # تطبيق التكامل الثاني وتفعيل ReLU x = self.pool(x) # تطبيق التجميع القصوى x = x.reshape(x.shape[0], -1) # تسطيح التنسور x = self.fc1(x) # تطبيق الطبقة المتصلة بالكامل return x x = x.reshape(x.shape[0], -1) # تسطيح التنسور x = self.fc1(x) # تطبيق الطبقة المتصلة بالكامل return x

بمجرد تحديد فئة CNN، يمكننا إنشاء نموذجنا ونقله إلى الجهاز الذي سيتم تدريبه وتشغيله عليه.

الشبكات العصبية، بما في ذلك CNNs، تظهر أداءً أفضل عند التشغيل على وحدات معالجة الرسوميات، ولكن قد لا يكون هذا هو الحال على جهاز الكمبيوتر الخاص بك. لذلك، سنقوم بتشغيل النموذج على وحدة معالجة الرسوميات فقط عند توفرها؛ وإلا، سنستخدم معالج الكمبيوتر العادي.

device = "cuda" if torch.cuda.is_available() else "cpu" model = CNN(in_channels=1, num_classes=10).to(device) print(model) >>> CNN( (conv1): Conv2d(1, 8, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (pool): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False) (conv2): Conv2d(8, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (fc1): Linear(in_features=784, out_features=10, bias=True) )

4. تدريب نموذج CNN

الآن بعد أن أصبح لدينا النموذج، حان الوقت لتدريبه. للقيام بذلك، سنحتاج أولاً إلى تحديد كيفية قياس أداء النموذج. نظرًا لأننا نتعامل مع مشكلة تصنيف متعددة الفئات، سنستخدم دالة خسارة الانتروبيا المتصالبة، المتاحة في PyTorch كـ nn.CrossEntropyLoss. سنستخدم أيضًا محسّن آدم، وهو واحد من أشهر خوارزميات التحسين.

# تعريف دالة الخسارة criterion = nn.CrossEntropyLoss() # تعريف المحسّن optimizer = optim.Adam(model.parameters(), lr=0.001)

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

num_epochs=10 for epoch in range(num_epochs): # التكرار على مجموعات التدريب print(f"Epoch [{epoch + 1}/{num_epochs}]") for batch_index, (data, targets) in enumerate(tqdm(dataloader_train)): data = data.to(device) targets = targets.to(device) scores = model(data) loss = criterion(scores, targets) optimizer.zero_grad() loss.backward() optimizer.step()
Epoch [1/10] 100%|██████████| 1000/1000 [00:13<00:00, 72.94it/s] Epoch [2/10] 100%|██████████| 1000/1000 [00:12<00:00, 77.27it/s] Epoch [3/10] 100%|██████████| 1000/1000 [00:12<00:00, 77.16it/s] Epoch [4/10] 100%|██████████| 1000/1000 [00:12<00:00, 77.00it/s] Epoch [5/10] 100%|██████████| 1000/1000 [00:13<00:00, 75.69it/s] Epoch [6/10] 100%|██████████| 1000/1000 [00:12<00:00, 77.24it/s] Epoch [7/10] 100%|██████████| 1000/1000 [00:12<00:00, 78.23it/s] Epoch [8/10] 100%|██████████| 1000/1000 [00:12<00:00, 78.16it/s] Epoch [9/10] 100%|██████████| 1000/1000 [00:12<00:00, 77.96it/s] Epoch [10/10] 100%|██████████| 1000/1000 [00:12<00:00, 77.93it/s]

5. تقييم النموذج

بمجرد تدريب النموذج، يمكننا تقييم أدائه على مجموعة البيانات الاختبارية. سنستخدم الدقة، وهي مقياس شائع لمشاكل التصنيف. تقيس الدقة نسبة الحالات المصنفة بشكل صحيح من إجمالي عدد الكائنات في مجموعة البيانات. يتم حسابها عن طريق قسمة عدد التوقعات الصحيحة على العدد الإجمالي للتوقعات التي قام بها النموذج.

أولاً، نقوم بإعداد مقياس الدقة من torchmetrics. بعد ذلك، نستخدم طريقة .eval للنموذج لوضع النموذج في وضع التقييم، لأن بعض الطبقات في نماذج PyTorch تتصرف بشكل مختلف في مراحل التدريب مقابل مراحل الاختبار. كما نضيف سياق Python مع torch.no_grad، مشيرين إلى أننا لن نقوم بحساب التدرجات.

ثم، نكرر على أمثلة الاختبار بدون حساب التدرجات. بالنسبة لكل دفعة اختبار، نحصل على نتائج النموذج، نأخذ الفئة الأكثر احتمالية، ونمررها إلى وظيفة الدقة مع التسميات. وأخيرًا، نحسب المقاييس ونطبع النتائج. حصلنا على درجة دقة بنسبة 0.98، مما يعني أن نموذجنا قام بتصنيف 98% من الأرقام بشكل صحيح. ليس سيئاً!

# إعداد مقياس الدقة للتصنيف المتعدد الفئات acc = Accuracy(task="multiclass",num_classes=10) # تكرار على دفعات مجموعة البيانات model.eval() with torch.no_grad(): for images, labels in dataloader_test: # الحصول على احتماليات التنبؤ لدفعة بيانات الاختبار outputs = model(images) _, preds = torch.max(outputs, 1) acc(preds, labels) precision(preds, labels) recall(preds, labels) # حساب الدقة الإجمالية للاختبار test_accuracy = acc.compute() print(f"Test accuracy: {test_accuracy}") >>> Test accuracy: 0.9857000112533569

يمكنك أيضا استخدام مقاييس التصنيف الشهيرة الأخرى، بما في ذلك الاستدعاء والدقة. نحن نخبركم عن هذه المقاييس بأمثلة عملية في دورتنا التعلم العميق المتوسط مع PyTorch.

تحسين أداء النموذج

بينما يحقق نموذج CNN لدينا أداء قويًا، هناك عدة استراتيجيات يمكننا استخدامها لتعزيز دقته وقوته وتعميمه إلى بيانات جديدة.

في هذا القسم، سنكتشف التقنيات الرئيسية مثل تعزيز البيانات، ضبط الهايبرباراميتر، ونقل التعلم لتحسين أداء نموذجنا.

تقنيات تعزيز البيانات

تعزيز البيانات هي تقنية تستخدم لتحسين دقة نموذجنا عن طريق إنشاء بيانات تدريب جديدة بشكل عشوائي. على سبيل المثال، يمكن للشخص تطبيق تحويلات على صور التدريب، مثل تغيير الحجم، والانعكاس الأفقي أو الرأسي، دوران عشوائي، وهكذا. وبهذه الطريقة، يمكن إنشاء صور معززة وتعيينها بنفس التصنيف كالصورة الأصلية، مما يزيد من حجم مجموعة التدريب.

إضافة تحويلات عشوائية للصور الأصلية يسمح لنا بتوليد المزيد من البيانات مع زيادة الحجم وتنوع مجموعة التدريب. إنه يجعل النموذج أكثر متانة للتباينات والتشويهات التي توجد عادة في الصور الحقيقية، ويقلل من الإفراط في التجانس حيث يتعلم النموذج تجاهل التحويلات العشوائية.

ومع ذلك، من المهم أن نكون حذرين فيما يتعلق بتعزيز البيانات، لأنه في بعض الأحيان قد يؤثر سلبًا على عملية التدريب. على سبيل المثال، في مشكلتنا، إذا قمنا بتطبيق الانعكاس الرأسي على الرقم “6”، سيبدو وكأنه الرقم “9”. تمريره إلى النموذج مصنفًا كـ “6” سيشوش النموذج ويعوق التدريب. هذه الأمثلة تظهر أنه في بعض الأحيان يمكن أن تؤثر التحويلات الخاصة على التصنيف.

ضبط الهايبرباراميتر

طريقة أخرى لتحسين أداء نموذجنا هي عن طريق تغيير قيم المعلمات الفائقة المشاركة في الطبقات المختلفة من النموذج. يتطلب هذا ضبط المعلمات الفائقة فهمًا عميقًا للرياضيات وراء الشبكات العصبية وأهمية المعلمات الفائقة المختلفة.

على سبيل المثال، يمكنك ضبط طبقات الشبكة العصبية التابعة للتصنيف البئري عن طريق تغيير حجم المرشحات أو زيادة التعبئة. يمكنك أيضًا تعيين قيمة مختلفة للأوزان الابتدائية للخلايا العصبية.

نظرًا لعدم معرفتنا بالقيم الأمثل للمعلمات الفائقة مسبقًا، سيكون هناك حاجة إلى درجة من التجربة والخطأ. يتم ذلك عادةً من خلال تقنية تعرف باسم البحث الشبكي، التي تتيح لك تقييم النموذج بنظام عبر شبكة من قيم المعلمات.

ومع ذلك، كن حذرًا عند استخدام هذه التقنية، لأنها عادةً ما تكون مكلفة حسابيًا، خاصة عند التعامل مع شبكات عصبية معقدة ومجموعات بيانات تدريبية كبيرة.

بالمثل، يمكنك زيادة تعقيد نموذجك عن طريق إضافة المزيد من الطبقات التصنيفية والخطية. ومع ذلك، كن حذرًا عند إضافة طبقات جديدة، لأن عدد الخلايا العصبية قد يزيد بشكل كبير، مما يؤدي إلى زمن تدريب أطول واحتمالية الإفراط في التدريب.

يمكنك معرفة المزيد حول ضبط المعلمات الفائقة في مقدمة للتعلم العميق باستخدام دورة PyTorch.

استخدام النماذج مُعَدة مُسبقًا

تدريب نماذج التعلم العميق من الصفر هو عملية طويلة ومملة، وغالبًا ما تتطلب الكثير من بيانات التدريب. بدلاً من ذلك، يمكننا في كثير من الأحيان استخدام نماذج مُعدة مُسبقًا، أي نماذج تم تدريبها بالفعل على بعض المهام.

أحيانًا، يمكننا إعادة استخدام نموذج مُعد مُسبقًا مباشرة إذا كان بالفعل قادرًا على حل المهمة التي نهتم بها. في مناسبات أخرى، قد نحتاج إلى ضبط النموذج المُعد مُسبقًا ليلائم المهمة الجديدة. وهذا ما يُعرف بـنقل التعلم.

استخدام نماذج مُعدة مُسبقًا في PyTorch سهل للغاية. توفر Torchvision مجموعة من النماذج المُعدة مُسبقًا لمختلف المهام المتعلقة بالصور. تم تدريب هذه النماذج مُسبقًا على مجموعات بيانات الصور بمقياس كبير وهي متاحة بسهولة. تحقق من دورتنا “التعلم العميق للصور باستخدام PyTorch” لتتعلم كل ما تحتاج إلى معرفته عنها.

نشر نموذج CNN

بعد تدريب نموذج التصنيف الدقيق للغاية الخاص بك في PyTorch، يمكنك الآن حفظ النموذج وأوزانه المُعدة مُسبقًا للاستخدام في المستقبل ومشاركته مع فريقك، مما يضمن لهم تحميله بسلاسة.

لحفظ نموذج، يمكننا استخدام torch.save. امتداد الملف الشائع لنماذج torch هو pt أو pth. لحفظ أوزان النموذج، نمرر model.state_dict إلى torch.save ونقدم اسم الملف الناتج، على سبيل المثال، MulticlassCNN.pth.

لتحميل نموذج محفوظ، نقوم بتهيئة نموذج جديد بنفس التصميم المعماري. ثم نستخدم طريقة تحميل الحالة load state dict بالاشتراك مع torch.load لتحميل المعلمات إلى النموذج الجديد.

# حفظ النموذج torch.save(model.state_dict(), 'MulticlassCNN.pth') # إنشاء نموذج جديد loaded_model = CNN(in_channels=1, num_classes=10) # تحميل النموذج المحفوظ loaded_model.load_state_dict(torch.load('MulticlassCNN.pth')) print(loaded_model) CNN( (conv1): Conv2d(1, 8, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (pool): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False) (conv2): Conv2d(8, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (fc1): Linear(in_features=784, out_features=10, bias=True) )

الاستنتاج

لقد قمنا بتغطية نظرة عامة شاملة عن الشبكات العصبية التصنيفية CNNs، مقدمين تفاصيل حول كل طبقة من طبقات تصميم الشبكة العصبية التصنيفية CNN. بالإضافة إلى ذلك، قدمنا دليلاً على كيفية تنفيذ شبكة عصبية تصنيفية CNN في PyTorch، مغطين الخطوات الرئيسية، بدءًا من تحميل البيانات وتصميم النموذج وصولًا إلى تدريب النموذج والتقييم. وأخيرًا، قمنا أيضًا بتحليل عدة استراتيجيات لتحسين أداء نموذجنا. قمنا بتطبيق كل هذه المهارات على سيناريو حقيقي متعلق بمهمة تصنيف متعددة الفئات. 

هناك الكثير لتعلمه عن التعلم العميق، وهو بلا شك أحد أكثر المجالات إثارة ومطلوبة في مجال الذكاء الاصطناعي. لحسن الحظ، DataCamp هنا للمساعدة. تحقق من موادنا ودوراتنا المخصصة وكن خبيرًا في الشبكات العصبية:

Source:
https://www.datacamp.com/tutorial/pytorch-cnn-tutorial