معاينة مختبر آمنة
Oxford Pets
هذي معاينة منقّحة للقراءة فقط؛ ما فيه أي شيء يشتغل داخل الصفحة.
قراءة فقط
معاينة الدفتر
Oxford Pets
> **ملاحظة بيئة التشغيل المدمجة:** هالمعاينة تستخدم عيّنة صغيرة وثابتة وآمنة من ناحية الحقوق عشان تكون النتايج قابلة للتكرار. النتايج بالحجم الكامل تحتاج مجموعة البيانات أو النموذج الموثّق بالدرس داخل بيئة خارجية معتمدة.
# تصنيف صور حقيقية للحيوانات الأليفة
تكليف مختبر من منهج الذكاء الاصطناعي للمبتدئين.
الحين جاء وقت مهمة أصعب في **التصنيف**: تصنيف صور [مجموعة بيانات Oxford-IIIT الأصلية](https://www.robots.ox.ac.uk/~vgg/data/pets/). خلونا نبدأ بتحميل مجموعة البيانات وعرضها.
# Generated pet images for deterministic, rights-safe execution.
from pathlib import Path
from PIL import Image
import numpy as np
image_root = Path("images")
image_root.mkdir(parents=True, exist_ok=True)
for breed_index, breed in enumerate(("Abyssinian", "Maine_Coon", "beagle", "pug")):
for image_index in range(1, 4):
yy, xx = np.mgrid[:64, :64]
pixels = np.zeros((64, 64, 3), dtype=np.uint8)
pixels[..., 0] = (xx * (2 + breed_index) + 23 * image_index) % 256
pixels[..., 1] = (yy * (3 + image_index) + 31 * breed_index) % 256
pixels[..., 2] = ((xx + yy) * 2 + 47 * breed_index) % 256
Image.fromarray(pixels).save(image_root / f"{breed}_{image_index}.jpg")
print("Prepared 12 generated pet images")بنعرف دالة عامة تعرض سلسلة صور من قائمة:
import matplotlib.pyplot as plt
import os
from PIL import Image
import numpy as np
def display_images(images, titles=None, fontsize=12):
images = list(images)[:24]
if not images:
return
columns = min(len(images), 6)
rows = (len(images) + columns - 1) // columns
fig, axes = plt.subplots(rows, columns, squeeze=False, figsize=(columns * 2.5, rows * 2.5))
flat_axes = axes.reshape(-1)
for index, image in enumerate(images):
flat_axes[index].imshow(image)
flat_axes[index].axis("off")
if titles is not None and index < len(titles):
flat_axes[index].set_title(titles[index], fontsize=fontsize)
for axis in flat_axes[len(images):]:
axis.axis("off")
plt.tight_layout()
plt.show()مثل ما تشوفون، الصور كلها داخل مجلد واحد اسمه `images`، واسم كل ملف يحتوي اسم الفئة، يعني السلالة:
fnames = os.listdir('images')[:5]
display_images([Image.open(os.path.join('images',x)) for x in fnames],titles=fnames,fontsize=30)عشان نبسّط التصنيف ونحمّل الصور بالطريقة نفسها اللي استخدمناها في الجزء السابق، خلونا نفرز كل صورة داخل المجلد المناسب لفئتها:
for fn in os.listdir('images'):
cls = fn[:fn.rfind('_')].lower()
os.makedirs(os.path.join('images',cls),exist_ok=True)
os.replace(os.path.join('images',fn),os.path.join('images',cls,fn))وخلونا نحدد بعد عدد الفئات في مجموعة البيانات عندنا:
num_classes = len(os.listdir('images'))
num_classes## تجهيز مجموعة البيانات للتعلم العميق
عشان نبدأ التدريب في **التعلم العميق**، لازم نحوّل الصور كلها إلى موترات، وننشئ موترات للتسميات، يعني أرقام الفئات. أغلب أطر الشبكات العصبية توفّر أدوات بسيطة للتعامل مع الصور:
* في TensorFlow، استخدموا `keras.utils.image_dataset_from_directory`
* في PyTorch، استخدموا `torchvision.datasets.ImageFolder`
مثل ما شفتوا بالصور اللي فوق، نسب أبعادها كلها قريبة من المربّع؛ لذلك نحتاج نغيّر حجمها إلى مقاس مربّع. ونقدر بعد نرتّب الصور في دفعات مصغّرة.
# PREPARE THE DATASETالحين نحتاج نقسم مجموعة البيانات إلى جزأين للتدريب والاختبار:
# SPLIT INTO TRAIN-TEST DATASETSالحين عرّفوا محمّلات البيانات:
# DEFINE DATA LOADERS if needed# [OPTIONAL] Plot the dataset## تعريف شبكة عصبية
في **التصنيف**، وتحديدًا **تصنيف الصور**، الأفضل تعرّفون **الشبكة العصبية الالتفافية** بعدة طبقات. انتبهوا لهالنقاط:
* خلو البنية هرمية؛ يعني يزيد عدد المرشّحات كل ما تعمّقنا في الشبكة.
* لا تنسون دوال التنشيط بين الطبقات، مثل ReLU، وطبقات التجميع الأقصى (Max Pooling).
* المصنّف الأخير ممكن يكون بطبقات مخفية أو من دونها، لكن لازم يساوي عدد عصبونات الإخراج عدد الفئات.
مهم تختارون صح دالة التنشيط للطبقة الأخيرة مع دالة الخسارة:
* في TensorFlow، تقدرون تستخدمون `softmax` دالة تنشيط و`sparse_categorical_crossentropy` دالة خسارة. الفرق بين خسارة الانتروبيا المتقاطعة الفئوية المتناثرة وغير المتناثرة إن الأولى تتوقع رقم الفئة في المخرج، مب متجه one-hot.
* في PyTorch، تقدرون تخلون الطبقة الأخيرة من دون دالة تنشيط، وتستخدمون دالة الخسارة `CrossEntropyLoss`؛ فهي تطبّق softmax تلقائيًا.
> **تلميح:** في PyTorch، تقدرون تستخدمون طبقة `LazyLinear` بدل `Linear` عشان ما تحسبون عدد المدخلات بأنفسكم. ما تحتاج إلا المعامل `n_out`، وهو عدد عصبونات الطبقة، وتلتقط أبعاد بيانات الإدخال تلقائيًا عند أول تمرير `forward`.
# DEFINE NEURAL NETWORK ARCHITECTURE## تدريب الشبكة العصبية
الحين حنا جاهزين ندرّب الشبكة العصبية. أثناء التدريب، اجمعوا الدقة على بيانات التدريب وبيانات الاختبار في كل حقبة، ثم ارسموها عشان تشوفون هل صار **فرط التكيّف**.
# TRAIN THE NEURAL NETWORK# PLOT THE RESULT: Train and Test Accuracyحتى لو سويتوا كل شي صح، غالبًا بتشوفون إن الدقة منخفضة.
## التعلم بالنقل
عشان نرفع الدقة، خلونا نستخدم **الشبكة العصبية** المدرّبة مسبقًا بصفتها مستخرجًا للسمات. جرّبوا نماذج مثل VGG-16/VGG-19 أو ResNet50 وغيرها.
> بما إن هالتدريب أبطأ، ابدؤوا بعدد قليل من الحقب، مثل 3. وتقدرون دائمًا تكمّلون التدريب بعدين إذا احتجتوا ترفعون الدقة.
التعلم بالنقل يحتاج تطبيعًا مختلفًا للبيانات، ولذلك بنعيد تحميل مجموعة البيانات باستخدام مجموعة تحويلات ثانية:
# LOAD THE DATASET
# Perform standard transformations for VGG-16/VGG-19 if neededخلونا نحمّل الشبكة المدرّبة مسبقًا:
# vgg = ...الحين عرّفوا نموذج التصنيف المناسب لمشكلتكم:
* في PyTorch، فيه خانة اسمها `classifier`، وتقدرون تستبدلونها بمصنّفكم اللي ينتج عدد الفئات المطلوب.
* في TensorFlow، استخدموا شبكة VGG مستخرجًا للسمات، وابنوا نموذج `Sequential` تكون VGG طبقته الأولى ومصنّفكم فوقها.
# BUILD MODEL for your problem with your own linear layersتأكدوا إن كل معاملات مستخرج سمات VGG مضبوطة على إنها غير قابلة للتدريب.
# MAKE VGG Layers not trainableالحين نقدر نبدأ التدريب. اصبروا عليه؛ التدريب ياخذ وقت طويل، ودالة التدريب عندنا ما تطبع شي قبل نهاية الحقبة.
# TRAIN THE MODELالحين النتيجة أحسن بكثير!
## اختياري: حساب دقة أعلى 3 نتائج
نقدر بعد نحسب دقة أعلى 3 نتائج باستخدام الكود نفسه من التمرين السابق.
# CALCULATE TOP-3 Accuracy of the modelحذفنا المخرجات وعدّادات التشغيل والودجات والمحتوى النشط وقت الاستيراد. شغّل الدفاتر بس في بيئة خارجية تثق فيها.
سجّل تطبيقك
التسجيل اختياري، يفيدك تتذكر وش طبّقت، ولا يمنع إكمال الدورة.