معاينة مختبر آمنة
Pet Faces
هذي معاينة منقّحة للقراءة فقط؛ ما فيه أي شيء يشتغل داخل الصفحة.
قراءة فقط
معاينة الدفتر
Pet Faces
> **ملاحظة بيئة التشغيل المدمجة:** هالمعاينة تستخدم عيّنة صغيرة وثابتة وآمنة من ناحية الحقوق عشان تكون النتايج قابلة للتكرار. النتايج بالحجم الكامل تحتاج مجموعة البيانات أو النموذج الموثّق بالدرس داخل بيئة خارجية معتمدة.
# تصنيف وجوه الحيوانات الأليفة
هذا واجب مختبر من منهج «الذكاء الاصطناعي للمبتدئين».
### جلب البيانات
بنركّز في هالواجب على مهمة بسيطة نسبيًا في **التصنيف**: تصنيف وجوه الحيوانات الأليفة. بنستخدم [مجموعة البيانات Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/)، وفيها صور لـ 37 سلالة مختلفة من الكلاب والقطط. خلونا نبدأ بتنزيل مجموعة البيانات وعرض بعض صورها.
**ملاحظة:** تحتوي Oxford-IIIT Pet Dataset على صور كاملة للحيوانات. وبعد فك الملفات، بنرتّب الصور بحسب السلالة داخل المجلد الناتج.
# 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()الحين بنمر على كل المجلدات الفرعية للفئات، ونعرض أول كم صورة من كل فئة:
# Note: The Oxford-IIIT Pet Dataset extracts to a folder named 'images'
# Images are named by breed (e.g., 'Abyssinian_1.jpg')
# We need to organize them into breed-specific subdirectories
import os
from collections import defaultdict
# Organize images by breed
if not os.path.exists('petfaces'):
os.makedirs('petfaces')
for img_file in os.listdir('images'):
if img_file.endswith(('.jpg', '.png')):
# Extract breed name from filename (everything before the last underscore and number)
breed = '_'.join(img_file.split('_')[:-1])
breed_dir = os.path.join('petfaces', breed)
if not os.path.exists(breed_dir):
os.makedirs(breed_dir)
os.rename(os.path.join('images', img_file), os.path.join(breed_dir, img_file))
for cls in os.listdir('petfaces'):
print(cls)
display_images([Image.open(os.path.join('petfaces',cls,x))
for x in os.listdir(os.path.join('petfaces',cls))[:10]])وخلونا نحدد بعد عدد الفئات في مجموعة البيانات:
num_classes = len(os.listdir('petfaces'))
num_classes## تجهيز مجموعة البيانات: التعلم العميق
عشان نبدأ تدريب الشبكة العصبية، لازم نحوّل كل الصور إلى موترات، وننشئ موترات ثانية للتسميات، أي أرقام الفئات. توفر أغلب أطر الشبكات العصبية أدوات سهلة للتعامل مع الصور:
* في Tensorflow استخدموا `keras.utils.image_dataset_from_directory`.
* في PyTorch استخدموا `torchvision.datasets.ImageFolder`.
مثل ما شفتوا في الصور اللي فوق، نسب أبعادها قريبة من المربع، لذلك بنغيّر مقاسها كلها إلى مقاس مربع. ونقدر بعد ننظّم الصور في دفعات صغيرة.
# CODE TO LOAD DATASETالحين نحتاج نقسّم مجموعة البيانات إلى جزء للتدريب وجزء للاختبار:
# CODE TO DO TRAIN/TEST SPLITخلونا نطبع أبعاد الموترات في مجموعة البيانات. إذا كان كل شي مضبوطًا، تكون أبعاد عناصر التدريب كالتالي:
* `(batch_size,image_size,image_size,3)` في Tensorflow، و`batch_size,3,image_size,image_size` في PyTorch.
* `batch_size` للتسميات.
المفروض تحتوي التسميات على أرقام الفئات.
# Print tensor sizes# Display the data## تعريف شبكة عصبية
ضمن **التصنيف**، وتحديدًا **تصنيف الصور**، الأفضل غالبًا نعرّف **الشبكة العصبية الالتفافية** من عدة طبقات. انتبهوا للنقاط التالية:
* حافظوا على البنية الهرمية؛ يعني يزيد عدد المرشحات كل ما تعمّقنا في الشبكة.
* لا تنسون دوال التنشيط بين الطبقات، مثل ReLU، والتجميع بالأقصى Max Pooling.
* المصنّف الأخير ممكن يكون بطبقات مخفية أو من دونها، لكن لازم يساوي عدد عصبونات الإخراج عدد الفئات.
من المهم نضبط دالة التنشيط في الطبقة الأخيرة مع دالة الخسارة:
* في Tensorflow تقدرون تستخدمون `softmax` للتنشيط و`sparse_categorical_crossentropy` للخسارة. الفرق بين الانتروبيا المتقاطعة الفئوية المتناثرة وغير المتناثرة إن الأولى تتوقع رقم الفئة مخرجًا، مب متجه one-hot.
* في PyTorch تقدرون تخلّون الطبقة الأخيرة من دون دالة تنشيط، وتستخدمون دالة الخسارة `CrossEntropyLoss`؛ هالدالة تطبّق softmax تلقائيًا.
# CODE TO DEFINE NEURAL NETWORK## تدريب الشبكة العصبية
الحين صرنا جاهزين ندرّب الشبكة العصبية. أثناء التدريب، اجمعوا دقة بيانات التدريب وبيانات الاختبار في كل حقبة، ثم ارسموا الدقة عشان تشوفون إذا صار فرط التكيّف.
> لتسريع التدريب، استخدموا GPU إذا كان متوفرًا. يستخدم TensorFlow/Keras وحدة GPU تلقائيًا، لكن في PyTorch لازم تنقلون النموذج والبيانات إلى GPU أثناء التدريب بالدالة `.to` عشان تستفيدون من التسريع.
# TRAIN THE NETWORK# PLOT THE ACCURACY on train and validation datasetوش تقدرون تقولون عن فرط التكيّف؟ ووش نقدر نسوي عشان نحسّن دقة النموذج؟
## اختياري: حساب دقة Top3
في هالتمرين نتعامل مع مسألة **التصنيف** فيها عدد كبير من الفئات (35)، لذلك نتيجتنا، وهي قرابة 50% لدقة التحقق، تُعد زينة. وفي مجموعة البيانات القياسية ImageNet عدد أكبر بكثير: 1000 فئة.
في حالات زي كذا، يصعب نضمن إن النموذج يتنبأ **دائمًا** بالفئة الصحيحة. قد تتشابه سلالتان جدًا، ويرجع النموذج احتمالين متقاربين، مثل 0.45 و 0.43. لو قسنا الدقة المعتادة، بنعد النتيجة خطأ رغم إن خطأ النموذج بسيط جدًا. عشان كذا نقيس غالبًا مؤشرًا ثانيًا: هل الإجابة الصحيحة ضمن أعلى 3 تنبؤات محتملة للنموذج؟
نعد الحالة صحيحة إذا كانت التسمية المستهدفة ضمن أعلى 3 تنبؤات للنموذج.
لحساب دقة top-3 على مجموعة بيانات الاختبار، مرّوا على مجموعة البيانات يدويًا، وطبّقوا الشبكة العصبية للحصول على التنبؤ، ثم سوّوا الحسابات. هذي بعض التلميحات:
* في Tensorflow استخدموا الدالة `tf.nn.in_top_k` عشان تعرفون هل `predictions`، وهي مخرجات النموذج، ضمن أعلى k مقارنةً بـ`targets`. مرّروا `k=3` معاملًا. ترجع الدالة موترًا من القيم المنطقية؛ نقدر نحوّله إلى `int` باستخدام `tf.cast`، ثم نجمعه باستخدام `tf.reduce_sum`.
* في PyTorch استخدموا الدالة `torch.topk` للحصول على مؤشرات الفئات ذات الاحتمالات الأعلى، ثم تحققوا هل الفئة الصحيحة بينها. راجعوا [هالمثال](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) لمزيد من التلميحات.
# CALCULATE TOP-3 ACCURACY## اختياري: بناء تصنيف للقطط مقابل الكلاب
نبي بعد نعرف دقة **التصنيف** الثنائي للقطط مقابل الكلاب على مجموعة البيانات نفسها. عشان نسوي كذا، نحتاج نعدّل التسميات:
# Define dataset that contains only two labels: 0 = cat, 1 = dog
# Hint: use class name prefix to figure out which one is which# Define neural network architecture and trainحذفنا المخرجات وعدّادات التشغيل والودجات والمحتوى النشط وقت الاستيراد. شغّل الدفاتر بس في بيئة خارجية تثق فيها.
سجّل تطبيقك
التسجيل اختياري، يفيدك تتذكر وش طبّقت، ولا يمنع إكمال الدورة.