Merge pull request #551 from microsoft/update-translations

🌐 Update translations via Co-op Translator
This commit is contained in:
Lee Stott 2025-10-03 15:59:53 +01:00 committed by GitHub
commit 7c0ba248e8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
96 changed files with 2727 additions and 1593 deletions

View File

@ -10,7 +10,9 @@
"\n",
"### الحصول على البيانات\n",
"\n",
"في هذه المهمة، سنركز على مهمة تصنيف بسيطة نسبيًا - تصنيف وجوه الحيوانات الأليفة. يتكون هذا المجموعة من صور مقطوعة للوجوه مأخوذة من [مجموعة بيانات أكسفورد-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/). لنبدأ بتحميل المجموعة وعرضها.\n"
"في هذه المهمة، سنركز على مهمة تصنيف بسيطة نسبيًا - تصنيف وجوه الحيوانات الأليفة. سنستخدم [مجموعة بيانات الحيوانات الأليفة من أكسفورد-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/)، التي تحتوي على صور لـ 37 سلالة مختلفة من الكلاب والقطط. لنبدأ بتنزيل المجموعة وعرضها.\n",
"\n",
"**ملاحظة:** تحتوي مجموعة بيانات الحيوانات الأليفة من أكسفورد-IIIT على صور كاملة للحيوانات الأليفة. سيتم تنظيم الصور حسب السلالة في المجلد المستخرج.\n"
]
},
{
@ -77,7 +79,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"الآن دعونا نستعرض جميع أدلة الفئات الفرعية ونرسم أول بضعة صور من كل فئة:\n"
"الآن دعونا نستعرض جميع المجلدات الفرعية للفئات ونرسم أول بضعة صور من كل فئة:\n"
]
},
{
@ -86,6 +88,24 @@
"metadata": {},
"outputs": [],
"source": [
"# Note: The Oxford-IIIT Pet Dataset extracts to a folder named 'images'\n",
"# Images are named by breed (e.g., 'Abyssinian_1.jpg')\n",
"# We need to organize them into breed-specific subdirectories\n",
"import os\n",
"from collections import defaultdict\n",
"\n",
"# Organize images by breed\n",
"if not os.path.exists('petfaces'):\n",
" os.makedirs('petfaces')\n",
" for img_file in os.listdir('images'):\n",
" if img_file.endswith(('.jpg', '.png')):\n",
" # Extract breed name from filename (everything before the last underscore and number)\n",
" breed = '_'.join(img_file.split('_')[:-1])\n",
" breed_dir = os.path.join('petfaces', breed)\n",
" if not os.path.exists(breed_dir):\n",
" os.makedirs(breed_dir)\n",
" os.rename(os.path.join('images', img_file), os.path.join(breed_dir, img_file))\n",
"\n",
"for cls in os.listdir('petfaces'):\n",
" print(cls)\n",
" display_images([Image.open(os.path.join('petfaces',cls,x)) \n",
@ -96,7 +116,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"دعونا أيضًا نحدد عدد الفئات في مجموعة البيانات الخاصة بنا:\n"
"دعونا نحدد أيضًا عدد الفئات في مجموعة البيانات الخاصة بنا:\n"
]
},
{
@ -124,13 +144,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## تجهيز مجموعة البيانات للتعلم العميق\n",
"## إعداد مجموعة البيانات للتعلم العميق\n",
"\n",
"لبدء تدريب الشبكة العصبية، نحتاج إلى تحويل جميع الصور إلى تنسورات، وأيضًا إنشاء تنسورات تتوافق مع التصنيفات (أرقام الفئات). تحتوي معظم أطر عمل الشبكات العصبية على أدوات بسيطة للتعامل مع الصور:\n",
"لبدء تدريب الشبكة العصبية، نحتاج إلى تحويل جميع الصور إلى موترات، وكذلك إنشاء موترات تتوافق مع التصنيفات (أرقام الفئات). تحتوي معظم أطر عمل الشبكات العصبية على أدوات بسيطة للتعامل مع الصور:\n",
"* في Tensorflow، استخدم `tf.keras.preprocessing.image_dataset_from_directory`\n",
"* في PyTorch، استخدم `torchvision.datasets.ImageFolder`\n",
"\n",
"كما رأيت من الصور أعلاه، جميعها تقريبًا ذات نسبة قريبة من الصور المربعة، لذا نحتاج إلى تغيير حجم جميع الصور إلى حجم مربع. بالإضافة إلى ذلك، يمكننا تنظيم الصور في دفعات صغيرة.\n"
"كما رأيت من الصور أعلاه، جميعها تقريبًا ذات نسبة قريبة من المربع، لذا نحتاج إلى تغيير حجم جميع الصور إلى حجم مربع. بالإضافة إلى ذلك، يمكننا تنظيم الصور في دفعات صغيرة.\n"
]
},
{
@ -146,7 +166,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"الآن نحتاج إلى تقسيم مجموعة البيانات إلى أجزاء التدريب والاختبار:\n"
"الآن نحتاج إلى تقسيم مجموعة البيانات إلى أجزاء للتدريب والاختبار:\n"
]
},
{
@ -162,11 +182,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"الآن دعونا نطبع حجم المصفوفات في مجموعة البيانات الخاصة بنا. إذا قمت بكل شيء بشكل صحيح، يجب أن يكون حجم عناصر التدريب كالتالي:\n",
"الآن دعونا نطبع حجم المصفوفات في مجموعتنا البيانية. إذا كنت قد نفذت كل شيء بشكل صحيح، يجب أن يكون حجم عناصر التدريب كالتالي:\n",
" * `(batch_size,image_size,image_size,3)` لـ Tensorflow، و `batch_size,3,image_size,image_size` لـ PyTorch\n",
" * `batch_size` لـ التصنيفات\n",
" * `batch_size` بالنسبة للتسميات\n",
"\n",
"يجب أن تحتوي التصنيفات على أرقام الفئات.\n"
"يجب أن تحتوي التسميات على أرقام الفئات.\n"
]
},
{
@ -228,16 +248,16 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## تعريف شبكة عصبية\n",
"## تعريف الشبكة العصبية\n",
"\n",
"لتصنيف الصور، من الأفضل تعريف شبكة عصبية تلافيفية تحتوي على عدة طبقات. ما يجب الانتباه إليه:\n",
"* تذكر هيكلية الهرم، أي أن عدد المرشحات (filters) يجب أن يزداد كلما تعمقت في الشبكة.\n",
"* لا تنسَ استخدام دوال التفعيل (ReLU) بين الطبقات، بالإضافة إلى Max Pooling.\n",
"* المصنف النهائي يمكن أن يكون مع أو بدون طبقات مخفية، ولكن يجب أن يكون عدد الخلايا العصبية في المخرجات مساويًا لعدد الفئات.\n",
"* ضع في اعتبارك هيكل الهرم، أي أن عدد الفلاتر يجب أن يزيد كلما تعمقت في الشبكة.\n",
"* لا تنسَ وظائف التنشيط بين الطبقات (ReLU) والتجميع الأقصى (Max Pooling).\n",
"* المصنف النهائي يمكن أن يكون مع أو بدون طبقات مخفية، ولكن يجب أن يكون عدد الخلايا العصبية في الطبقة الأخيرة مساويًا لعدد الفئات.\n",
"\n",
"من المهم جدًا اختيار دالة التفعيل في الطبقة الأخيرة + دالة الخسارة بشكل صحيح:\n",
"* في Tensorflow، يمكنك استخدام `softmax` كدالة تفعيل، و`sparse_categorical_crossentropy` كدالة خسارة. الفرق بين الخسارة التصنيفية الفئوية المتفرقة وغير المتفرقة هو أن الأولى تتوقع المخرجات كرقم يمثل الفئة، وليس كمتجه واحد-ساخن (one-hot vector).\n",
"* في PyTorch، يمكنك أن تكون الطبقة الأخيرة بدون دالة تفعيل، واستخدام دالة الخسارة `CrossEntropyLoss`. هذه الدالة تطبق softmax تلقائيًا.\n"
"من المهم جدًا اختيار وظيفة التنشيط في الطبقة الأخيرة + وظيفة الخسارة بشكل صحيح:\n",
"* في Tensorflow، يمكنك استخدام `softmax` كوظيفة تنشيط، و`sparse_categorical_crossentropy` كوظيفة خسارة. الفرق بين الخسارة التصنيفية الفئوية النادرة وغير النادرة هو أن الأولى تتوقع الإخراج كرقم الفئة، وليس كمتجه واحد-ساخن.\n",
"* في PyTorch، يمكنك أن تكون الطبقة الأخيرة بدون وظيفة تنشيط، واستخدام وظيفة الخسارة `CrossEntropyLoss`. هذه الوظيفة تطبق softmax تلقائيًا.\n"
]
},
{
@ -255,9 +275,9 @@
"source": [
"## تدريب الشبكة العصبية\n",
"\n",
"الآن نحن جاهزون لتدريب الشبكة العصبية. أثناء التدريب، يرجى جمع دقة البيانات التدريبية والاختبارية في كل حقبة، ثم قم برسم الدقة لمعرفة ما إذا كان هناك إفراط في التكيف.\n",
"الآن نحن جاهزون لتدريب الشبكة العصبية. أثناء التدريب، يرجى جمع دقة البيانات التدريبية والاختبارية في كل عصر، ثم رسم الدقة لمعرفة ما إذا كان هناك إفراط في التكيف.\n",
"\n",
"> لتسريع عملية التدريب، تحتاج إلى استخدام GPU إذا كان متاحًا. بينما سيستخدم TensorFlow/Keras الـ GPU تلقائيًا، في PyTorch تحتاج إلى نقل كل من النموذج والبيانات إلى الـ GPU أثناء التدريب باستخدام طريقة `.to()` للاستفادة من تسريع الـ GPU.\n"
"> لتسريع عملية التدريب، تحتاج إلى استخدام وحدة معالجة الرسومات (GPU) إذا كانت متوفرة. بينما يقوم TensorFlow/Keras تلقائيًا باستخدام وحدة معالجة الرسومات، في PyTorch تحتاج إلى نقل النموذج والبيانات إلى وحدة معالجة الرسومات أثناء التدريب باستخدام طريقة `.to()` للاستفادة من تسريع وحدة معالجة الرسومات.\n"
]
},
{
@ -295,17 +315,17 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"ما الذي يمكن قوله عن الإفراط في التكيّف؟ وما الذي يمكن فعله لتحسين دقة النموذج؟\n",
"ما الذي يمكن قوله عن الإفراط في التخصيص؟ وما الذي يمكن فعله لتحسين دقة النموذج؟\n",
"\n",
"## اختياري: حساب دقة Top3\n",
"\n",
"في هذا التمرين، كنا نتعامل مع تصنيف يحتوي على عدد كبير من الفئات (35)، لذا فإن النتيجة التي حصلنا عليها - حوالي 50% دقة التحقق - تعتبر جيدة جدًا. مجموعة بيانات ImageNet القياسية تحتوي على عدد أكبر - 1000 فئة.\n",
"في هذا التمرين، كنا نتعامل مع تصنيف يحتوي على عدد كبير من الفئات (35)، لذا فإن النتيجة التي حصلنا عليها - حوالي 50% دقة التحقق - تعتبر جيدة جدًا. مجموعة بيانات ImageNet القياسية تحتوي على عدد أكبر من الفئات - 1000 فئة.\n",
"\n",
"في مثل هذه الحالات، من الصعب ضمان أن النموذج **دائمًا** يتنبأ بالفئة الصحيحة. هناك حالات تكون فيها سلالتان متشابهتان جدًا، ويُرجع النموذج احتمالات متقاربة جدًا (على سبيل المثال، 0.45 و 0.43). إذا قمنا بقياس الدقة القياسية، سيتم اعتبار ذلك حالة خاطئة، على الرغم من أن الخطأ الذي ارتكبه النموذج صغير جدًا. لهذا السبب، غالبًا ما نقيس معيارًا آخر - وهو الدقة ضمن أعلى 3 تنبؤات الأكثر احتمالًا للنموذج.\n",
"في مثل هذه الحالات، من الصعب ضمان أن النموذج **دائمًا** يتنبأ بالفئة الصحيحة. هناك حالات تكون فيها سلالتان متشابهتان جدًا، ويقوم النموذج بإرجاع احتمالات متقاربة جدًا (على سبيل المثال، 0.45 و 0.43). إذا قمنا بقياس الدقة القياسية، سيتم اعتبار ذلك حالة خاطئة، على الرغم من أن الخطأ الذي ارتكبه النموذج صغير جدًا. لهذا السبب، غالبًا ما نقيس معيارًا آخر - وهو الدقة ضمن أعلى 3 توقعات الأكثر احتمالًا للنموذج.\n",
"\n",
"نعتبر الحالة دقيقة إذا كانت الفئة المستهدفة موجودة ضمن أعلى 3 تنبؤات للنموذج.\n",
"نعتبر الحالة دقيقة إذا كانت الفئة المستهدفة موجودة ضمن أعلى 3 توقعات للنموذج.\n",
"\n",
"لحساب دقة top-3 على مجموعة بيانات الاختبار، تحتاج إلى مراجعة مجموعة البيانات يدويًا، تطبيق الشبكة العصبية للحصول على التنبؤ، ثم إجراء الحسابات. بعض التلميحات:\n",
"لحساب دقة Top-3 على مجموعة بيانات الاختبار، تحتاج إلى مراجعة مجموعة البيانات يدويًا، وتطبيق الشبكة العصبية للحصول على التوقعات، ثم إجراء الحسابات. بعض التلميحات:\n",
"\n",
"* في Tensorflow، استخدم وظيفة `tf.nn.in_top_k` لمعرفة ما إذا كانت `predictions` (مخرجات النموذج) ضمن أعلى k (مرر `k=3` كمعامل)، بالنسبة إلى `targets`. تُرجع هذه الوظيفة مصفوفة من القيم المنطقية، والتي يمكن تحويلها إلى `int` باستخدام `tf.cast`، ثم تجميعها باستخدام `tf.reduce_sum`.\n",
"* في PyTorch، يمكنك استخدام وظيفة `torch.topk` للحصول على مؤشرات الفئات ذات الاحتمالات الأعلى، ثم التحقق مما إذا كانت الفئة الصحيحة تنتمي إليها. انظر [هذا](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) للحصول على المزيد من التلميحات.\n"
@ -326,7 +346,7 @@
"source": [
"## اختياري: بناء تصنيف القطط مقابل الكلاب\n",
"\n",
"نريد أيضًا معرفة مدى دقة تصنيفنا الثنائي للقطط مقابل الكلاب على نفس مجموعة البيانات. للقيام بذلك، نحتاج إلى تعديل التسميات:\n"
"نريد أيضًا معرفة مدى دقة تصنيفنا الثنائي للقطط مقابل الكلاب على نفس مجموعة البيانات. للقيام بذلك، نحتاج إلى تعديل التصنيفات:\n"
]
},
{
@ -352,7 +372,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**إخلاء المسؤولية**: \nتم ترجمة هذا المستند باستخدام خدمة الترجمة بالذكاء الاصطناعي [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو معلومات غير دقيقة. يجب اعتبار المستند الأصلي بلغته الأصلية المصدر الموثوق. للحصول على معلومات حاسمة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة ناتجة عن استخدام هذه الترجمة.\n"
"\n---\n\n**إخلاء المسؤولية**: \nتم ترجمة هذا المستند باستخدام خدمة الترجمة بالذكاء الاصطناعي [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو عدم دقة. يجب اعتبار المستند الأصلي بلغته الأصلية المصدر الرسمي. للحصول على معلومات حاسمة، يُوصى بالترجمة البشرية الاحترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة ناتجة عن استخدام هذه الترجمة.\n"
]
}
],
@ -378,8 +398,8 @@
"version": "3.9.5"
},
"coopTranslator": {
"original_hash": "1de3ae931831253c3198d899da48bfe5",
"translation_date": "2025-08-28T03:03:51+00:00",
"original_hash": "df7d1f7da8d2617b76acd93115776ca4",
"translation_date": "2025-10-03T14:27:00+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb",
"language_code": "ar"
}

View File

@ -1,8 +1,8 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "f3d2cee9cb3c52160419e560c57a690e",
"translation_date": "2025-08-26T09:33:26+00:00",
"original_hash": "b70fcf7fcee862990f848c679090943f",
"translation_date": "2025-10-03T14:52:18+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/README.md",
"language_code": "ar"
}
@ -13,13 +13,13 @@ CO_OP_TRANSLATOR_METADATA:
## المهمة
تخيل أنك بحاجة إلى تطوير تطبيق لحضانة الحيوانات الأليفة لتصنيف جميع الحيوانات. واحدة من الميزات الرائعة لهذا التطبيق ستكون اكتشاف السلالة تلقائيًا من صورة. يمكن تحقيق ذلك بنجاح باستخدام الشبكات العصبية.
تخيل أنك بحاجة إلى تطوير تطبيق لحضانة الحيوانات الأليفة لتصنيف جميع الحيوانات. واحدة من الميزات الرائعة لهذا التطبيق ستكون اكتشاف السلالة تلقائيًا من صورة فوتوغرافية. يمكن تحقيق ذلك بنجاح باستخدام الشبكات العصبية.
عليك تدريب شبكة عصبية التفافية لتصنيف سلالات مختلفة من القطط والكلاب باستخدام مجموعة بيانات **وجوه الحيوانات الأليفة**.
عليك تدريب شبكة عصبية تلافيفية لتصنيف سلالات مختلفة من القطط والكلاب باستخدام مجموعة بيانات **Pet Faces**.
## مجموعة البيانات
سنستخدم مجموعة بيانات **وجوه الحيوانات الأليفة**، المشتقة من مجموعة بيانات الحيوانات الأليفة [Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/). تحتوي على 35 سلالة مختلفة من الكلاب والقطط.
سنستخدم [مجموعة بيانات الحيوانات الأليفة من أكسفورد-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/)، والتي تحتوي على صور لـ 37 سلالة مختلفة من الكلاب والقطط.
![مجموعة البيانات التي سنتعامل معها](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.ar.png)
@ -31,13 +31,17 @@ CO_OP_TRANSLATOR_METADATA:
!rm images.tar.gz
```
## بدء العمل على الدفتر
**ملاحظة:** يتم تنظيم صور مجموعة بيانات الحيوانات الأليفة من أكسفورد-IIIT حسب اسم الملف (مثل `Abyssinian_1.jpg`، `Bengal_2.jpg`). يتضمن دفتر الملاحظات كودًا لتنظيم هذه الصور في أدلة فرعية خاصة بالسلالات لتسهيل التصنيف.
ابدأ المختبر بفتح [PetFaces.ipynb](../../../../../../lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb)
## بدء دفتر الملاحظات
ابدأ المختبر بفتح [PetFaces.ipynb](PetFaces.ipynb)
## النتيجة
لقد قمت بحل مشكلة معقدة نسبيًا لتصنيف الصور من البداية! كانت هناك العديد من الفئات، ومع ذلك تمكنت من تحقيق دقة معقولة! من المنطقي أيضًا قياس دقة top-k، لأنه من السهل الخلط بين بعض الفئات التي لا تختلف بوضوح حتى بالنسبة للبشر.
---
**إخلاء المسؤولية**:
تم ترجمة هذا المستند باستخدام خدمة الترجمة الآلية [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو معلومات غير دقيقة. يجب اعتبار المستند الأصلي بلغته الأصلية هو المصدر الموثوق. للحصول على معلومات حساسة أو هامة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة ناتجة عن استخدام هذه الترجمة.
تم ترجمة هذا المستند باستخدام خدمة الترجمة بالذكاء الاصطناعي [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو معلومات غير دقيقة. يجب اعتبار المستند الأصلي بلغته الأصلية المصدر الموثوق. للحصول على معلومات حاسمة، يُوصى بالترجمة البشرية الاحترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة ناتجة عن استخدام هذه الترجمة.

View File

@ -6,11 +6,13 @@
"source": [
"# Класификация на лицата на домашни любимци\n",
"\n",
"Лабораторно упражнение от [AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners).\n",
"Лабораторно упражнение от [Учебна програма за начинаещи в AI](https://github.com/microsoft/ai-for-beginners).\n",
"\n",
"### Получаване на данните\n",
"\n",
"В това упражнение ще се съсредоточим върху сравнително проста задача за класификация - класификация на лицата на домашни любимци. Този набор от данни се състои от изрязани лица от [Oxford-IIIT Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/). Нека започнем с зареждане и визуализация на набора от данни.\n"
"В това упражнение ще се съсредоточим върху сравнително проста задача за класификация - класификация на лицата на домашни любимци. Ще използваме [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), който съдържа изображения на 37 различни породи кучета и котки. Нека започнем с изтегляне и визуализация на набора от данни.\n",
"\n",
"**Забележка:** Oxford-IIIT Pet Dataset съдържа изображения на цели домашни любимци. Изображенията ще бъдат организирани по породи в извлечената папка.\n"
]
},
{
@ -86,6 +88,24 @@
"metadata": {},
"outputs": [],
"source": [
"# Note: The Oxford-IIIT Pet Dataset extracts to a folder named 'images'\n",
"# Images are named by breed (e.g., 'Abyssinian_1.jpg')\n",
"# We need to organize them into breed-specific subdirectories\n",
"import os\n",
"from collections import defaultdict\n",
"\n",
"# Organize images by breed\n",
"if not os.path.exists('petfaces'):\n",
" os.makedirs('petfaces')\n",
" for img_file in os.listdir('images'):\n",
" if img_file.endswith(('.jpg', '.png')):\n",
" # Extract breed name from filename (everything before the last underscore and number)\n",
" breed = '_'.join(img_file.split('_')[:-1])\n",
" breed_dir = os.path.join('petfaces', breed)\n",
" if not os.path.exists(breed_dir):\n",
" os.makedirs(breed_dir)\n",
" os.rename(os.path.join('images', img_file), os.path.join(breed_dir, img_file))\n",
"\n",
"for cls in os.listdir('petfaces'):\n",
" print(cls)\n",
" display_images([Image.open(os.path.join('petfaces',cls,x)) \n",
@ -130,7 +150,7 @@
"* В Tensorflow използвайте `tf.keras.preprocessing.image_dataset_from_directory`\n",
"* В PyTorch използвайте `torchvision.datasets.ImageFolder`\n",
"\n",
"Както видяхте от горните изображения, всички те са близки до квадратното съотношение, затова трябва да преоразмерим всички изображения до квадратен размер. Също така можем да организираме изображенията в минипартиди.\n"
"Както видяхте от горните изображения, всички те са с пропорции, близки до квадратни, затова трябва да преоразмерим всички изображения до квадратен размер. Освен това можем да организираме изображенията в минипартиди.\n"
]
},
{
@ -162,11 +182,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Сега нека отпечатаме размера на тензорите в нашия набор от данни. Ако сте направили всичко правилно, размерът на тренировъчните елементи трябва да бъде:\n",
"Сега нека отпечатаме размера на тензорите в нашия набор от данни. Ако сте направили всичко правилно, размерът на тренировъчните елементи трябва да бъде\n",
" * `(batch_size,image_size,image_size,3)` за Tensorflow, `batch_size,3,image_size,image_size` за PyTorch\n",
" * `batch_size` за етикети\n",
" \n",
" Етикетите трябва да съдържат номерата на класовете.\n"
" Етикетите трябва да съдържат номера на класовете.\n"
]
},
{
@ -230,13 +250,13 @@
"source": [
"## Дефиниране на невронна мрежа\n",
"\n",
"За класификация на изображения е препоръчително да се дефинира конволюционна невронна мрежа с няколко слоя. Какво да имате предвид:\n",
"* Помнете пирамидалната архитектура, т.е. броят на филтрите трябва да се увеличава с навлизането в по-дълбоки слоеве.\n",
"За класификация на изображения е препоръчително да дефинирате конволюционна невронна мрежа с няколко слоя. Какво да имате предвид:\n",
"* Имайте предвид пирамидалната архитектура, т.е. броят на филтрите трябва да се увеличава с навлизането в по-дълбоки слоеве.\n",
"* Не забравяйте активационните функции между слоевете (ReLU) и Max Pooling.\n",
"* Финалният класификатор може да бъде със или без скрити слоеве, но броят на изходните неврони трябва да е равен на броя на класовете.\n",
"\n",
"Важно е да изберете правилната активационна функция за последния слой + функцията за загуба:\n",
"* В Tensorflow можете да използвате `softmax` като активация и `sparse_categorical_crossentropy` като функция за загуба. Разликата между sparse categorical cross-entropy и несъсредоточената версия е, че първата очаква изхода като номер на класа, а не като one-hot вектор.\n",
"* В Tensorflow можете да използвате `softmax` като активация и `sparse_categorical_crossentropy` като функция за загуба. Разликата между sparse categorical cross-entropy и несъкращената версия е, че първата очаква изхода като номер на класа, а не като one-hot вектор.\n",
"* В PyTorch можете да оставите последния слой без активационна функция и да използвате функцията за загуба `CrossEntropyLoss`. Тази функция автоматично прилага softmax.\n"
]
},
@ -255,9 +275,9 @@
"source": [
"## Обучение на невронната мрежа\n",
"\n",
"Сега сме готови да обучим невронната мрежа. По време на обучението, моля, събирайте точността върху тренировъчните и тестовите данни за всяка епоха и след това начертайте графика на точността, за да проверите дали има пренасищане.\n",
"Сега сме готови да обучим невронната мрежа. По време на обучението, моля, събирайте точността върху тренировъчните и тестовите данни за всяка епоха и след това начертайте графика на точността, за да проверите дали има свръхобучение.\n",
"\n",
"> За да ускорите обучението, трябва да използвате GPU, ако е наличен. Докато TensorFlow/Keras автоматично ще използва GPU, в PyTorch трябва да преместите както модела, така и данните на GPU по време на обучението, използвайки метода `.to()`, за да се възползвате от ускорението на GPU.\n"
"> За да ускорите обучението, трябва да използвате GPU, ако е наличен. Докато TensorFlow/Keras автоматично ще използва GPU, в PyTorch трябва да преместите както модела, така и данните към GPU по време на обучението, използвайки метода `.to()`, за да се възползвате от ускорението на GPU.\n"
]
},
{
@ -295,9 +315,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Какво можете да кажете за overfitting? Какво може да се направи, за да се подобри точността на модела?\n",
"Какво можете да кажете за overfitting? Какво може да се направи за подобряване на точността на модела?\n",
"\n",
"## Опционално: Изчисляване на Top3 Точност\n",
"## Опционално: Изчисляване на Top3 точност\n",
"\n",
"В това упражнение се занимавахме с класификация с доста голям брой класове (35), така че нашият резултат - около 50% точност на валидацията - е доста добър. Стандартният ImageNet dataset има дори повече - 1000 класа.\n",
"\n",
@ -305,10 +325,10 @@
"\n",
"Считаме случая за точен, ако целевият етикет е сред топ 3 предсказания на модела.\n",
"\n",
"За да изчислите top-3 точност върху тестовия dataset, трябва ръчно да преминете през dataset-а, да приложите невронната мрежа, за да получите предсказанието, и след това да направите изчисленията. Някои насоки:\n",
"За да изчислите top-3 точност върху тестовия dataset, трябва ръчно да преминете през набора от данни, да приложите невронната мрежа, за да получите предсказанието, и след това да направите изчисленията. Някои насоки:\n",
"\n",
"* В Tensorflow, използвайте функцията `tf.nn.in_top_k`, за да проверите дали `predictions` (изходът на модела) са в top-k (предайте `k=3` като параметър) спрямо `targets`. Тази функция връща тензор от булеви стойности, които могат да бъдат преобразувани в `int` с помощта на `tf.cast`, и след това акумулирани с `tf.reduce_sum`.\n",
"* В PyTorch, можете да използвате функцията `torch.topk`, за да получите индекси на класовете с най-високи вероятности, и след това да проверите дали правилният клас принадлежи към тях. Вижте [това](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) за повече насоки.\n"
"* В PyTorch, можете да използвате функцията `torch.topk`, за да получите индекси на класовете с най-високи вероятности, и след това да проверите дали правилният клас принадлежи към тях. Вижте [тук](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) за повече насоки.\n"
]
},
{
@ -324,9 +344,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## Допълнително: Създаване на класификация Котки срещу Кучета\n",
"## Опционално: Създаване на класификация Котки срещу Кучета\n",
"\n",
"Също така искаме да проверим колко точна би била нашата бинарна класификация Котки срещу Кучета върху същия набор от данни. За да го направим, трябва да коригираме етикетите:\n"
"Също така искаме да проверим колко точна би била нашата бинарна класификация на котки срещу кучета върху същия набор от данни. За да го направим, трябва да коригираме етикетите:\n"
]
},
{
@ -352,7 +372,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Отказ от отговорност**: \nТози документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.\n"
"\n---\n\n**Отказ от отговорност**: \nТози документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за каквито и да било недоразумения или погрешни интерпретации, произтичащи от използването на този превод.\n"
]
}
],
@ -378,8 +398,8 @@
"version": "3.9.5"
},
"coopTranslator": {
"original_hash": "1de3ae931831253c3198d899da48bfe5",
"translation_date": "2025-08-29T23:13:49+00:00",
"original_hash": "df7d1f7da8d2617b76acd93115776ca4",
"translation_date": "2025-10-03T14:46:51+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb",
"language_code": "bg"
}

View File

@ -1,25 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "f3d2cee9cb3c52160419e560c57a690e",
"translation_date": "2025-08-25T22:58:28+00:00",
"original_hash": "b70fcf7fcee862990f848c679090943f",
"translation_date": "2025-10-03T14:57:52+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/README.md",
"language_code": "bg"
}
-->
# Класификация на лицата на домашни любимци
Лабораторно упражнение от [AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners).
Лабораторно упражнение от [Учебна програма за начинаещи в AI](https://github.com/microsoft/ai-for-beginners).
## Задача
Представете си, че трябва да разработите приложение за детска градина за домашни любимци, което да каталогизира всички животни. Една от страхотните функции на такова приложение би била автоматичното разпознаване на породата от снимка. Това може успешно да се постигне с помощта на невронни мрежи.
Трябва да обучите конволюционна невронна мрежа, за да класифицирате различни породи котки и кучета, използвайки набора от данни **Pet Faces**.
Трябва да обучите конволюционна невронна мрежа, за да класифицирате различни породи котки и кучета, използвайки **Pet Faces** набора от данни.
## Наборът от данни
Ще използваме набора от данни **Pet Faces**, който е извлечен от набора от данни за домашни любимци [Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/). Той съдържа 35 различни породи кучета и котки.
Ще използваме [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), който съдържа изображения на 37 различни породи кучета и котки.
![Наборът от данни, с който ще работим](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.bg.png)
@ -31,13 +31,17 @@ CO_OP_TRANSLATOR_METADATA:
!rm images.tar.gz
```
## Начален Notebook
**Забележка:** Изображенията в Oxford-IIIT Pet Dataset са организирани по имена на файлове (например `Abyssinian_1.jpg`, `Bengal_2.jpg`). В ноутбука е включен код за организиране на тези изображения в поддиректории, специфични за породата, за по-лесна класификация.
Започнете лабораторното упражнение, като отворите [PetFaces.ipynb](../../../../../../lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb)
## Начален ноутбук
Започнете лабораторното упражнение, като отворите [PetFaces.ipynb](PetFaces.ipynb)
## Изводи
Решихте сравнително сложен проблем за класификация на изображения от нулата! Имаше доста класове, но все пак успяхте да постигнете разумна точност! Също така има смисъл да измервате top-k точност, защото е лесно да се объркат някои от класовете, които дори за хората не са ясно различими.
Решихте сравнително сложен проблем с класификация на изображения от нулата! Имаше доста класове, но въпреки това успяхте да постигнете разумна точност! Също така има смисъл да измервате top-k точност, защото е лесно да се объркат някои от класовете, които дори за хората не са ясно различими.
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за каквито и да било недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

View File

@ -4,13 +4,15 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"# পোষা প্রাণীর মুখের শ্রেণীবিভাগ\n",
"# পোষা প্রাণীর মুখের শ্রেণীবিন্যাস\n",
"\n",
"[AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners) থেকে ল্যাব অ্যাসাইনমেন্ট।\n",
"\n",
"### ডেটা সংগ্রহ\n",
"### ডেটা সংগ্রহ করা\n",
"\n",
"এই অ্যাসাইনমেন্টে, আমরা একটি তুলনামূলকভাবে সহজ শ্রেণীবিভাগ কাজের উপর মনোযোগ দেব - পোষা প্রাণীর মুখের শ্রেণীবিভাগ। এই ডেটাসেটটি [Oxford-IIIT Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/) থেকে কাটা মুখের ছবি নিয়ে গঠিত। চলুন ডেটাসেটটি লোড এবং ভিজুয়ালাইজ করার মাধ্যমে শুরু করি।\n"
"এই অ্যাসাইনমেন্টে আমরা একটি তুলনামূলকভাবে সহজ শ্রেণীবিন্যাস কাজের উপর মনোযোগ দেব - পোষা প্রাণীর মুখের শ্রেণীবিন্যাস। আমরা [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/) ব্যবহার করব, যা কুকুর এবং বিড়ালের ৩৭টি বিভিন্ন প্রজাতির ছবি ধারণ করে। চলুন ডেটাসেটটি ডাউনলোড এবং ভিজুয়ালাইজ করার মাধ্যমে শুরু করি।\n",
"\n",
"**নোট:** Oxford-IIIT Pet Dataset-এ সম্পূর্ণ পোষা প্রাণীর ছবি রয়েছে। এক্সট্র্যাক্ট করা ফোল্ডারে ছবিগুলি প্রজাতি অনুযায়ী সংগঠিত থাকবে।\n"
]
},
{
@ -77,7 +79,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"এখন চলুন সমস্ত ক্লাস সাবডিরেক্টরিগুলি পরিভ্রমণ করি এবং প্রতিটি ক্লাসের প্রথম কয়েকটি চিত্র প্লট করি:\n"
"এখন চলুন সমস্ত ক্লাস সাবডিরেক্টরি ঘুরে দেখি এবং প্রতিটি ক্লাসের প্রথম কয়েকটি ছবি প্লট করি:\n"
]
},
{
@ -86,6 +88,24 @@
"metadata": {},
"outputs": [],
"source": [
"# Note: The Oxford-IIIT Pet Dataset extracts to a folder named 'images'\n",
"# Images are named by breed (e.g., 'Abyssinian_1.jpg')\n",
"# We need to organize them into breed-specific subdirectories\n",
"import os\n",
"from collections import defaultdict\n",
"\n",
"# Organize images by breed\n",
"if not os.path.exists('petfaces'):\n",
" os.makedirs('petfaces')\n",
" for img_file in os.listdir('images'):\n",
" if img_file.endswith(('.jpg', '.png')):\n",
" # Extract breed name from filename (everything before the last underscore and number)\n",
" breed = '_'.join(img_file.split('_')[:-1])\n",
" breed_dir = os.path.join('petfaces', breed)\n",
" if not os.path.exists(breed_dir):\n",
" os.makedirs(breed_dir)\n",
" os.rename(os.path.join('images', img_file), os.path.join(breed_dir, img_file))\n",
"\n",
"for cls in os.listdir('petfaces'):\n",
" print(cls)\n",
" display_images([Image.open(os.path.join('petfaces',cls,x)) \n",
@ -96,7 +116,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"চলুন আমাদের ডেটাসেটে শ্রেণীর সংখ্যা নির্ধারণ করি:\n"
"আসুন আমাদের ডেটাসেটে শ্রেণির সংখ্যা নির্ধারণ করি:\n"
]
},
{
@ -124,13 +144,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## ডিপ লার্নিংয়ের জন্য ডেটাসেট প্রস্তুত করা\n",
"## ডিপ লার্নিংের জন্য ডেটাসেট প্রস্তুত করা\n",
"\n",
"আমাদের নিউরাল নেটওয়ার্ক প্রশিক্ষণ শুরু করতে, সমস্ত ছবিকে টেনসরে রূপান্তর করতে হবে এবং লেবেল (ক্লাস নম্বর) এর জন্যও টেনসর তৈরি করতে হবে। বেশিরভাগ নিউরাল নেটওয়ার্ক ফ্রেমওয়ার্কে ছবির সাথে কাজ করার জন্য সহজ টুলস থাকে:\n",
"* Tensorflow-এ, ব্যবহার করুন `tf.keras.preprocessing.image_dataset_from_directory`\n",
"* PyTorch-এ, ব্যবহার করুন `torchvision.datasets.ImageFolder`\n",
"আমাদের নিউরাল নেটওার্ক প্রশিক্ষণ শুরু করতে, সমস্ত ছবিকে টেনসরে রূপান্তর করতে হবে এবং লেবেল (ক্লাস নম্বর) অনুযায়ী টেনসর তৈরি করতে হবে। বেশিরভাগ নিউরাল নেটওয়ার্ক ফ্রেমওয়ার্কে ছবির সাথে কাজ করার জন্য সহজ টুলস থাকে:\n",
"* Tensorflow-এ, `tf.keras.preprocessing.image_dataset_from_directory` ব্যবহার করুন\n",
"* PyTorch-এ, `torchvision.datasets.ImageFolder` ব্যবহার করুন\n",
"\n",
"উপরে ছবিগুলো থেকে আপনি দেখেছেন, এগুলো প্রায় সবই বর্গাকার অনুপাতের কাছাকাছি, তাই আমাদের সমস্ত ছবিকে বর্গাকার আকারে রিসাইজ করতে হবে। এছাড়াও, আমরা ছবিগুলোকে মিনিব্যাচে সংগঠিত করতে পারি।\n"
"উপরে ছবিগুলো থেকে আপনি দেখেছেন, সবগুলোই প্রায় বর্গাকার অনুপাতের কাছাকাছি, তাই আমাদের সমস্ত ছবিকে বর্গাকার আকারে রিসাইজ করতে হবে। এছাাও, আমরা ছবিগুলোকে মিনিব্যাচে সংগঠিত করতে পারি।\n"
]
},
{
@ -162,11 +182,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"এখন আমাদের ডেটাসেটে টেনসরগুলোর আকার প্রিন্ট করি। যদি সবকিছু সঠিকভাবে করা হয়ে থাকে, তাহলে ট্রেনিং উপাদানগুলোর আকার হবে:\n",
" * Tensorflow এর জন্য `(batch_size,image_size,image_size,3)`, PyTorch এর জন্য `batch_size,3,image_size,image_size`\n",
" * লেবেলগুলোর জন্য `batch_size`\n",
"এখন আমাদের ডেটাসেটে টেনসরগুলোর আকার প্রিন্ট করি। যদি আপনি সবকিছু সঠিকভাবে করে থাকেন, তাহলে প্রশিক্ষণের উপাদানগুলোর আকার হবে:\n",
" * টেনসরফ্লোরের জন্য `(batch_size,image_size,image_size,3)`, পাইটর্চের জন্য `batch_size,3,image_size,image_size`\n",
" * লেবেলর জন্য `batch_size`\n",
" \n",
"লেবেলগুলোতে ক্লাসের সংখ্যা থাকা উচিত।\n"
" লেবেলগুলোতে শ্রেণির সংখ্যা থাকা উচিত।\n"
]
},
{
@ -231,13 +251,13 @@
"## একটি নিউরাল নেটওয়ার্ক সংজ্ঞায়িত করুন\n",
"\n",
"ইমেজ শ্রেণীবিন্যাসের জন্য, আপনাকে সম্ভবত কয়েকটি স্তর সহ একটি কনভোলিউশনাল নিউরাল নেটওয়ার্ক সংজ্ঞায়িত করতে হবে। যেসব বিষয়ে নজর রাখা উচিত:\n",
"* পিরামিড আর্কিটেকচারের কথা মনে রাখুন, অর্থাৎ স্তর যত গভীরে যাবে, ফিল্টারের সংখ্যা তত বাড়বে।\n",
"* পিরামিড আর্কিটেকচারের কথা মনে রাখুন, অর্থাৎ স্তর যত গভীরে যাবে, ফিল্টারের সংখ্যা তত বাড়তে হবে।\n",
"* স্তরগুলোর মধ্যে অ্যাক্টিভেশন ফাংশন (ReLU) এবং ম্যাক্স পুলিং ভুলে যাবেন না।\n",
"* চূড়ান্ত শ্রেণীবিন্যাসকারী লুকানো স্তর সহ বা ছাড়া হতে পারে, তবে আউটপুট নিউরনের সংখ্যা শ্রেণীর সংখ্যার সমান হওয়া উচিত।\n",
"\n",
"একটি গুরুত্বপূর্ণ বিষয় হল শেষ স্তরের অ্যাক্টিভেশন ফাংশন + লস ফাংশন সঠিকভাবে সেট করা:\n",
"* টেনসরফ্লো-তে, আপনি `softmax` অ্যাক্টিভেশন এবং `sparse_categorical_crossentropy` লস ব্যবহার করতে পারেন। স্পার্স ক্যাটেগরিকাল ক্রস-এন্ট্রোপি এবং নন-স্পার্সের মধ্যে পার্থক্য হল যে প্রথমটি আউটপুটকে শ্রেণীর সংখ্যা হিসেবে আশা করে, এবং ওয়ান-হট ভেক্টর হিসেবে নয়।\n",
"* পাইটর্চ-এ, আপনি চূড়ান্ত স্তরটি অ্যাক্টিভেশন ফাংশন ছাড়া রাখতে পারেন এবং `CrossEntropyLoss` লস ফাংশন ব্যবহার করতে পারেন। এই ফাংশনটি স্বয়ংক্রিয়ভাবে softmax প্রয়োগ করে।\n"
"* Tensorflow-এ, আপনি `softmax` অ্যাক্টিভেশন এবং `sparse_categorical_crossentropy` লস ব্যবহার করতে পারেন। স্পার্স ক্যাটেগরিকাল ক্রস-এন্ট্রোপি এবং নন-স্পার্সের মধ্যে পার্থক্য হল যে প্রথমটি আউটপুটকে শ্রেণীর সংখ্যা হিসেবে আশা করে, এবং এক-হট ভেক্টর হিসেবে নয়।\n",
"* PyTorch-এ, আপনি চূড়ান্ত স্তরটি অ্যাক্টিভেশন ফাংশন ছাড়া রাখতে পারেন এবং `CrossEntropyLoss` লস ফাংশন ব্যবহার করতে পারেন। এই ফাংশনটি স্বয়ংক্রিয়ভাবে softmax প্রয়োগ করে।\n"
]
},
{
@ -255,9 +275,9 @@
"source": [
"## নিউরাল নেটওয়ার্ক প্রশিক্ষণ দিন\n",
"\n",
"এখন আমরা নিউরাল নেটওয়ার্ক প্রশিক্ষণের জন্য প্রস্তুত। প্রশিক্ষণের সময়, প্রতিটি epoch-এ train এবং test ডেটার উপর সঠিকতার (accuracy) তথ্য সংগ্রহ করুন এবং তারপর সঠিকতার গ্রাফ আঁকুন যাতে দেখা যায় কোনো overfitting হচ্ছে কিনা।\n",
"এখন আমরা নিউরাল নেটওয়ার্ক প্রশিক্ষণের জন্য প্রস্তুত। প্রশিক্ষণের সময়, প্রতিটি epoch-এ train এবং test ডেটার উপর সঠিকতার তথ্য সংগ্রহ করুন এবং তারপর সঠিকতার গ্রাফ তৈরি করুন যাতে দেখা যায় কোনো overfitting হচ্ছে কিনা।\n",
"\n",
"> প্রশিক্ষণের গতি বাড়ানোর জন্য, GPU ব্যবহার করতে হবে যদি এটি উপলব্ধ থাকে। TensorFlow/Keras স্বয়ংক্রিয়ভাবে GPU ব্যবহার করবে, কিন্তু PyTorch-এ আপনাকে প্রশিক্ষণের সময় `.to()` মেথড ব্যবহার করে মডেল এবং ডেটা উভয়কেই GPU-তে স্থানান্তর করতে হবে GPU-র তি সুবিধা নেওয়ার জন্য।\n"
"> প্রশিক্ষণের গতি বাড়ানোর জন্য GPU ব্যবহার করতে হবে যদি এটি উপলব্ধ থাকে। TensorFlow/Keras স্বয়ংক্রিয়ভাবে GPU ব্যবহার করবে, কিন্তু PyTorch-এ আপনাকে প্রশিক্ষণের সময় `.to()` মেথড ব্যবহার করে মডেল এবং ডেটা GPU-তে স্থানান্তর করতে হবে GPU ত্বরান্বিতকরণের সুবিধা নেওয়ার জন্য।\n"
]
},
{
@ -295,20 +315,20 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"ওভারফিটিং সম্পর্কে আপনি কী বলতে পারেন? মডেলের সঠিকতা উন্নত করতে কী করা যেতে পারে?\n",
"ওভারফিটিং সম্পর্কে কী বলা যায়? মডেলের সঠিকতা উন্নত করতে কী করা যেতে পারে?\n",
"\n",
"## ঐচ্ছিক: টপ-৩ সিকতা গণনা করুন\n",
"## ঐচ্ছিক: টপ-৩ অ্যাকুরেসি গণনা করুন\n",
"\n",
"এই অনুশীলনে, আমরা এমন একটি শ্রেণীবিভাজন নিয়ে কাজ করছিলাম যেখানে শ্রেণীর সংখ্যা বেশ বেশি (৩৫), তাই আমাদের ফলাফল - প্রায় ৫০% যাচাইকরণ সঠিকতা - বেশ ভালো। স্ট্যান্ডার্ড ইমেজনেট ডেটাসেটে আরও বেশি শ্রেণী থাকে - ১০০০।\n",
"এই অনুশীলনে, আমরা বেশ উচ্চ সংখ্যক ক্লাস (৩৫) নিয়ে শ্রেণীবিন্যাস করছিলাম, তাই আমাদের ফলাফল - প্রায় ৫০% ভ্যালিডেশন অ্যাকুরেসি - বেশ ভালো। স্ট্যান্ডার্ড ImageNet ডেটাসেটে আরও বেশি ক্লাস থাকে - ১০০০।\n",
"\n",
"এমন ক্ষেত্রে মডেলটি **সবসময়** সঠিকভাবে শ্রেণী অনুমান করবে তা নিশ্চিত করা কঠিন। এমন কিছু পরিস্থিতি থাকে যেখানে দুটি প্রজাতি একে অপরের সাথে খুবই সাদৃশ্যপূর্ণ, এবং মডেল খুব কাছাকাছি সম্ভাবনা প্রদান করে (যেমন, .৪৫ এবং .৪৩)। যদি আমরা স্ট্যান্ডার্ড সিকতা পরিমাপ করি, এটি ভুল হিসেবে গণ্য হবে, যদিও মডেল খুব ছোট একটি ভুল করেছে। এই কারণে, আমরা প্রায়ই আরেকটি মেট্রিক পরিমাপ করি - মডেলের সবচেয়ে সম্ভাব্য তিনটি অনুমানের মধ্যে সঠিকতা।\n",
"এমন ক্ষেত্রে নিশ্চিত করা কঠিন যে মডেল **সবসময়** সঠিকভাবে ক্লাস পূর্বাভাস করবে। এমন কিছু পরিস্থিতি থাকে যেখানে দুটি প্রজাতি একে অপরের সাথে খুবই মিল থাকে, এবং মডেল খুব কাছাকাছি সম্ভাবনা প্রদান করে (যেমন, .৪৫ এবং .৪৩)। যদি আমরা স্ট্যান্ডার্ড অ্যাকুরেসি পরিমাপ করি, এটি ভুল হিসেবে গণ্য হবে, যদিও মডেল খুব ছোট একটি ভুল করেছে। এই কারণে, আমরা প্রায়ই আরেকটি মেট্রিক পরিমাপ করি - মডেলের সর্বাধিক সম্ভাব্য তিনটি পূর্বাভাসের মধ্যে অ্যাকুরেসি।\n",
"\n",
"আমরা একটি কেসকে সঠিক বলে বিবেচনা করি যদি লক্ষ্য লেবেলটি মডেলের শীর্ষ ৩ অনুমানের মধ্যে থাকে।\n",
"আমরা একটি ক্ষেত্রে সঠিক বলে বিবেচনা করি যদি টার্গেট লেবেল মডেলের টপ-৩ পূর্বাভাসের মধ্যে থাকে।\n",
"\n",
"পরীক্ষার ডেটাসেটে টপ-৩ সঠিকতা গণনা করতে, আপনাকে ডেটাসেটটি ম্যানুয়ালি পর্যবেক্ষণ করতে হবে, নিউরাল নেটওয়ার্ক প্রয়োগ করে অনুমান পেতে হবে, এবং তারপর গণনা করতে হবে। কিছু পরামর্শ:\n",
"টেস্ট ডেটাসেটে টপ-৩ অ্যাকুরেসি গণনা করতে, আপনাকে ম্যানুয়ালি ডেটাসেটের উপর যেতে হবে, নিউরাল নেটওয়ার্ক প্রয়োগ করে পূর্বাভাস পেতে হবে, এবং তারপর গণনা করতে হবে। কিছু পরামর্শ:\n",
"\n",
"* টেনসরফ্লো-তে, `tf.nn.in_top_k` ফাংশন ব্যবহার করুন দেখতে যে `predictions` (মডেলের আউটপুট) টপ-k-তে আছে কিনা (প্যারামিটার হিসেবে `k=3` পাস করুন), `targets` এর সাথে সম্পর্কিত। এই ফাংশন একটি বুলিয়ান মানের টেনসর প্রদান করে, যা `tf.cast` ব্যবহার করে `int`-এ রূপান্তর করা যায়, এবং তারপর `tf.reduce_sum` ব্যবহার করে যোগ করা যায়।\n",
"* পাইটর্চ-এ, আপনি `torch.topk` ফাংশন ব্যবহার করতে পারেন উচ্চতর সম্ভাবনার শ্রেণীর ইনডেক্স পেতে, এবং তারপর দেখতে পারেন সঠিক শ্রেণীটি তাদের মধ্যে আছে কিনা। আরও পরামর্শের জন্য [এটি](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) দেখুন।\n"
"* Tensorflow-এ, `tf.nn.in_top_k` ফাংশন ব্যবহার করুন দেখতে যে `predictions` (মডেলের আউটপুট) টপ-k এর মধ্যে আছে কিনা (প্যারামিটার হিসেবে `k=3` পাস করুন), `targets` এর সাথে সম্পর্কিত। এই ফাংশন একটি বুলিয়ান মানের টেনসর প্রদান করে, যা `tf.cast` ব্যবহার করে `int` এ রূপান্তরিত করা যায়, এবং তারপর `tf.reduce_sum` ব্যবহার করে যোগ করা যায়।\n",
"* PyTorch-এ, আপনি `torch.topk` ফাংশন ব্যবহার করতে পারেন উচ্চ সম্ভাবনার ক্লাসগুলোর ইনডেক্স পেতে, এবং তারপর দেখতে পারেন সঠিক ক্লাস তাদের মধ্যে আছে কিনা। আরও পরামর্শের জন্য [এটি](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) দেখুন।\n"
]
},
{
@ -326,7 +346,7 @@
"source": [
"## ঐচ্ছিক: বিড়াল বনাম কুকুর শ্রেণীবিন্যাস তৈরি করুন\n",
"\n",
"আমরা দেখতে চাই আমাদের দ্বৈত বিড়াল বনাম কুকুর শ্রেণীবিন্যাস একই ডেটাসেটে কতটা সঠিক হবে। এটি করতে, আমাদের লেবেলগুলি সামঞ্জস্য করতে হবে:\n"
"আমরা একই ডেটাসেটে আমাদের দ্বৈত বিড়াল বনাম কুকুর শ্রেণীবিন্যাস কতটা সঠিক হবে তা দেখতে চাই। এটি করতে, আমাদের লেবেলগুলি সামঞ্জস্য করতে হবে:\n"
]
},
{
@ -352,7 +372,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**অস্বীকৃতি**: \nএই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা তার জন্য দায়ী থাকব না।\n"
"\n---\n\n**অস্বীকৃতি**: \nএই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসাধ্য সঠিকতার জন্য চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।\n"
]
}
],
@ -378,8 +398,8 @@
"version": "3.9.5"
},
"coopTranslator": {
"original_hash": "1de3ae931831253c3198d899da48bfe5",
"translation_date": "2025-08-28T10:53:14+00:00",
"original_hash": "df7d1f7da8d2617b76acd93115776ca4",
"translation_date": "2025-10-03T14:32:23+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb",
"language_code": "bn"
}

View File

@ -1,29 +1,29 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "f3d2cee9cb3c52160419e560c57a690e",
"translation_date": "2025-08-26T09:33:55+00:00",
"original_hash": "b70fcf7fcee862990f848c679090943f",
"translation_date": "2025-10-03T14:53:39+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/README.md",
"language_code": "bn"
}
-->
# পোষা প্রাণীর মুখমণ্ডল শ্রেণীবিভাগ
# পোষা প্রাণীর মুখের শ্রেণীবিন্যাস
[AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners) থেকে ল্যাব অ্যাসাইনমেন্ট।
## কাজ
ভাবুন, আপনাকে একটি পোষা প্রাণীর নার্সারির জন্য একটি অ্যাপ্লিকেশন তৈরি করতে হবে, যেখানে সব পোষা প্রাণীকে ক্যাটালগ করা হবে। এমন একটি অ্যাপ্লিকেশনের একটি চমৎকার বৈশিষ্ট্য হতে পারে ফটোগ্রাফ থেকে স্বয়ংক্রিয়ভাবে প্রজাতি শনাক্ত করা। এটি নিউরাল নেটওয়ার্ক ব্যবহার করে সফলভাবে করা সম্ভব।
ধরুন আপনাকে একটি পোষা প্রাণীর নার্সারি অ্যাপ্লিকেশন তৈরি করতে হবে যেখানে সমস্ত পোষা প্রাণীকে ক্যাটালগ করা হবে। এই ধরনের অ্যাপ্লিকেশনের একটি চমৎকার বৈশিষ্ট্য হতে পারে ফটোগ্রাফ থেকে স্বয়ংক্রিয়ভাবে জাত শনাক্ত করা। এটি নিউরাল নেটওয়ার্ক ব্যবহার করে সফলভাবে করা সম্ভব।
আপনাকে একটি কনভলিউশনাল নিউরাল নেটওয়ার্ক প্রশিক্ষণ দিতে হবে, যা **Pet Faces** ডেটাসেট ব্যবহার করে বিভিন্ন প্রজাতির বিড়াল এবং কুকুর শ্রেণীবদ্ধ করতে সক্ষম হবে।
আপনাকে **Pet Faces** ডেটাসেট ব্যবহার করে বিড়াল এবং কুকুরের বিভিন্ন জাত শ্রেণীবিন্যাস করার জন্য একটি কনভোলিউশনাল নিউরাল নেটওয়ার্ক প্রশিক্ষণ দিতে হবে।
## ডেটাসেট
আমরা **Pet Faces** ডেটাসেট ব্যবহার করব, যা [Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/) পোষা প্রাণীর ডেটাসেট থেকে প্রাপ্ত। এতে ৩৫টি ভিন্ন প্রজাতির কুকুর এবং বিড়াল রয়েছে।
আমরা [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/) ব্যবহার করব, যেখানে ৩৭টি ভিন্ন জাতের কুকুর এবং বিড়ালের ছবি রয়েছে।
![আমরা যে ডেটাসেট নিয়ে কাজ করব](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.bn.png)
ডেটাসেট ডাউনলোড করতে নিচের কোড স্নিপেটটি ব্যবহার করুন:
ডেটাসেট ডাউনলোড করতে, এই কোড স্নিপেটটি ব্যবহার করুন:
```python
!wget https://thor.robots.ox.ac.uk/~vgg/data/pets/images.tar.gz
@ -31,13 +31,17 @@ CO_OP_TRANSLATOR_METADATA:
!rm images.tar.gz
```
**নোট:** Oxford-IIIT Pet Dataset-এর ছবিগুলি ফাইলনামের মাধ্যমে সংগঠিত (যেমন, `Abyssinian_1.jpg`, `Bengal_2.jpg`)। নোটবুকে এই ছবিগুলিকে জাত-নির্দিষ্ট সাবডিরেক্টরিতে সংগঠিত করার কোড অন্তর্ভুক্ত রয়েছে, যা শ্রেণীবিন্যাসকে সহজ করে তোলে।
## নোটবুক শুরু করা
ল্যাব শুরু করতে [PetFaces.ipynb](../../../../../../lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb) খুলুন।
ল্যাব শুরু করতে [PetFaces.ipynb](PetFaces.ipynb) খুলুন।
## মূল শিক্ষা
আপনি স্ক্র্যাচ থেকে একটি তুলনামূলকভাবে জটিল ইমেজ শ্রেণীবিভাগ সমস্যার সমাধান করেছেন! এখানে অনেকগুলো শ্রেণী ছিল, তবুও আপনি যুক্তিসঙ্গত নির্ভুলতা অর্জন করতে পেরেছেন! উপরন্তু, টপ-k নির্ভুলতা পরিমাপ করাও যৌক্তিক, কারণ কিছু শ্রেণী এমন রয়েছে যেগুলো মানুষের জন্যও স্পষ্টভাবে আলাদা করা কঠিন।
আপনি স্ক্র্যাচ থেকে একটি তুলনামূলকভাবে জটিল ইমেজ শ্রেণীবিন্যাস সমস্যার সমাধান করেছেন! এখানে অনেকগুলো ক্লাস ছিল, তবুও আপনি যুক্তিসঙ্গত সঠিকতা অর্জন করতে পেরেছেন! এটি টপ-k সঠিকতা পরিমাপ করাও যুক্তিযুক্ত, কারণ কিছু ক্লাসকে বিভ্রান্ত করা সহজ, যা মানুষের জন্যও স্পষ্টভাবে আলাদা নয়।
---
**অস্বীকৃতি**:
এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। নথিটির মূল ভাষায় থাকা সংস্করণটিকেই প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে সৃষ্ট কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যার জন্য আমরা দায়ী নই
এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসাধ্য সঠিকতার জন্য চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না

View File

@ -6,11 +6,13 @@
"source": [
"# Classificação de Rostos de Animais de Estimação\n",
"\n",
"Trabalho prático do [Currículo de IA para Iniciantes](https://github.com/microsoft/ai-for-beginners).\n",
"Tarefa de laboratório do [Currículo de IA para Iniciantes](https://github.com/microsoft/ai-for-beginners).\n",
"\n",
"### Obtendo os Dados\n",
"\n",
"Neste trabalho, vamos nos concentrar em uma tarefa de classificação relativamente simples - a classificação de rostos de animais de estimação. Este conjunto de dados consiste em recortes de rostos do [Conjunto de Dados Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/). Vamos começar carregando e visualizando o conjunto de dados.\n"
"Nesta tarefa, vamos nos concentrar em uma tarefa de classificação relativamente simples - classificação de rostos de animais de estimação. Utilizaremos o [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), que contém imagens de 37 raças diferentes de cães e gatos. Vamos começar baixando e visualizando o conjunto de dados.\n",
"\n",
"**Nota:** O Oxford-IIIT Pet Dataset contém imagens completas de animais de estimação. As imagens serão organizadas por raça na pasta extraída.\n"
]
},
{
@ -86,6 +88,24 @@
"metadata": {},
"outputs": [],
"source": [
"# Note: The Oxford-IIIT Pet Dataset extracts to a folder named 'images'\n",
"# Images are named by breed (e.g., 'Abyssinian_1.jpg')\n",
"# We need to organize them into breed-specific subdirectories\n",
"import os\n",
"from collections import defaultdict\n",
"\n",
"# Organize images by breed\n",
"if not os.path.exists('petfaces'):\n",
" os.makedirs('petfaces')\n",
" for img_file in os.listdir('images'):\n",
" if img_file.endswith(('.jpg', '.png')):\n",
" # Extract breed name from filename (everything before the last underscore and number)\n",
" breed = '_'.join(img_file.split('_')[:-1])\n",
" breed_dir = os.path.join('petfaces', breed)\n",
" if not os.path.exists(breed_dir):\n",
" os.makedirs(breed_dir)\n",
" os.rename(os.path.join('images', img_file), os.path.join(breed_dir, img_file))\n",
"\n",
"for cls in os.listdir('petfaces'):\n",
" print(cls)\n",
" display_images([Image.open(os.path.join('petfaces',cls,x)) \n",
@ -126,7 +146,7 @@
"source": [
"## Preparando o conjunto de dados para Deep Learning\n",
"\n",
"Para começar o treinamento da nossa rede neural, precisamos converter todas as imagens em tensores e também criar tensores correspondentes aos rótulos (números das classes). A maioria dos frameworks de redes neurais contém ferramentas simples para lidar com imagens:\n",
"Para começar a treinar nossa rede neural, precisamos converter todas as imagens em tensores e também criar tensores correspondentes aos rótulos (números das classes). A maioria dos frameworks de redes neurais contém ferramentas simples para lidar com imagens:\n",
"* No Tensorflow, use `tf.keras.preprocessing.image_dataset_from_directory`\n",
"* No PyTorch, use `torchvision.datasets.ImageFolder`\n",
"\n",
@ -228,15 +248,15 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## Defina uma rede neural\n",
"## Definir uma rede neural\n",
"\n",
"Para classificação de imagens, você provavelmente deve definir uma rede neural convolucional com várias camadas. O que observar:\n",
"* Lembre-se da arquitetura em pirâmide, ou seja, o número de filtros deve aumentar à medida que você aprofunda.\n",
"* Tenha em mente a arquitetura em pirâmide, ou seja, o número de filtros deve aumentar conforme você aprofunda.\n",
"* Não se esqueça das funções de ativação entre as camadas (ReLU) e do Max Pooling.\n",
"* O classificador final pode ser com ou sem camadas ocultas, mas o número de neurônios de saída deve ser igual ao número de classes.\n",
"* O classificador final pode ter ou não camadas ocultas, mas o número de neurônios de saída deve ser igual ao número de classes.\n",
"\n",
"Um ponto importante é acertar a função de ativação na última camada + a função de perda:\n",
"* No Tensorflow, você pode usar `softmax` como a ativação e `sparse_categorical_crossentropy` como a função de perda. A diferença entre a entropia cruzada categórica esparsa e a não esparsa é que a primeira espera a saída como o número da classe, e não como um vetor one-hot.\n",
"É importante acertar a função de ativação na última camada + função de perda:\n",
"* No Tensorflow, você pode usar `softmax` como função de ativação e `sparse_categorical_crossentropy` como função de perda. A diferença entre sparse categorical cross-entropy e a versão não-sparse é que a primeira espera a saída como o número da classe, e não como um vetor one-hot.\n",
"* No PyTorch, você pode ter a camada final sem função de ativação e usar a função de perda `CrossEntropyLoss`. Essa função aplica softmax automaticamente.\n"
]
},
@ -253,11 +273,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## Treine a Rede Neural\n",
"## Treinar a Rede Neural\n",
"\n",
"Agora estamos prontos para treinar a rede neural. Durante o treinamento, colete a acurácia nos dados de treino e teste em cada época e, em seguida, faça um gráfico da acurácia para verificar se há overfitting.\n",
"Agora estamos prontos para treinar a rede neural. Durante o treinamento, colete a precisão nos dados de treinamento e teste em cada época e, em seguida, faça um gráfico da precisão para verificar se há overfitting.\n",
"\n",
"> Para acelerar o treinamento, é necessário usar GPU, se disponível. Enquanto o TensorFlow/Keras usará a GPU automaticamente, no PyTorch você precisa mover tanto o modelo quanto os dados para a GPU durante o treinamento usando o método `.to()` para aproveitar a aceleração da GPU.\n"
"> Para acelerar o treinamento, você precisa usar GPU, se disponível. Enquanto o TensorFlow/Keras usará GPU automaticamente, no PyTorch você precisa mover tanto o modelo quanto os dados para a GPU durante o treinamento usando o método `.to()` para aproveitar a aceleração da GPU.\n"
]
},
{
@ -299,16 +319,16 @@
"\n",
"## Opcional: Calcular a Precisão Top-3\n",
"\n",
"Neste exercício, estávamos lidando com uma classificação com um número relativamente alto de classes (35), então nosso resultado - cerca de 50% de precisão na validação - é bastante bom. O conjunto de dados padrão do ImageNet tem ainda mais classes - 1000.\n",
"Neste exercício, estamos lidando com classificação com um número bastante alto de classes (35), então nosso resultado - cerca de 50% de precisão na validação - é muito bom. O conjunto de dados padrão do ImageNet tem ainda mais - 1000 classes.\n",
"\n",
"Em tais casos, é difícil garantir que o modelo **sempre** preveja corretamente a classe. Existem situações em que duas categorias são muito semelhantes entre si, e o modelo retorna probabilidades muito próximas (por exemplo, 0,45 e 0,43). Se medirmos a precisão padrão, isso será considerado um erro, mesmo que o modelo tenha cometido um erro muito pequeno. Por isso, muitas vezes medimos outra métrica - a precisão dentro das 3 previsões mais prováveis do modelo.\n",
"Em casos como este, é difícil garantir que o modelo **sempre** preveja corretamente a classe. Existem situações em que duas raças são muito semelhantes entre si, e o modelo retorna probabilidades muito próximas (por exemplo, 0,45 e 0,43). Se medirmos a precisão padrão, isso será considerado um erro, mesmo que o modelo tenha cometido um erro muito pequeno. Por isso, frequentemente medimos outra métrica - uma precisão dentro das 3 previsões mais prováveis do modelo.\n",
"\n",
"Consideramos o caso como correto se o rótulo alvo estiver contido entre as 3 principais previsões do modelo.\n",
"Consideramos o caso como preciso se o rótulo alvo estiver contido nas 3 principais previsões do modelo.\n",
"\n",
"Para calcular a precisão top-3 no conjunto de dados de teste, você precisa percorrer manualmente o conjunto de dados, aplicar a rede neural para obter a previsão e, em seguida, fazer os cálculos. Algumas dicas:\n",
"Para calcular a precisão top-3 no conjunto de dados de teste, você precisa revisar manualmente o conjunto de dados, aplicar a rede neural para obter a previsão e, em seguida, fazer os cálculos. Algumas dicas:\n",
"\n",
"* No TensorFlow, use a função `tf.nn.in_top_k` para verificar se as `predictions` (saída do modelo) estão entre as top-k (passe `k=3` como parâmetro), em relação aos `targets`. Essa função retorna um tensor de valores booleanos, que pode ser convertido para `int` usando `tf.cast`, e depois acumulado usando `tf.reduce_sum`.\n",
"* No PyTorch, você pode usar a função `torch.topk` para obter os índices das classes com maiores probabilidades e, em seguida, verificar se a classe correta está entre elas. Veja [este](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) para mais dicas.\n"
"* No Tensorflow, use a função `tf.nn.in_top_k` para verificar se as `predictions` (saída do modelo) estão no top-k (passe `k=3` como parâmetro), em relação aos `targets`. Esta função retorna um tensor de valores booleanos, que pode ser convertido em `int` usando `tf.cast`, e então acumulado usando `tf.reduce_sum`.\n",
"* No PyTorch, você pode usar a função `torch.topk` para obter os índices das classes com maiores probabilidades e, em seguida, verificar se a classe correta pertence a elas. Veja [este](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) para mais dicas.\n"
]
},
{
@ -352,7 +372,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Aviso Legal**: \nEste documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução.\n"
"\n---\n\n**Aviso Legal**: \nEste documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte oficial. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução.\n"
]
}
],
@ -378,8 +398,8 @@
"version": "3.9.5"
},
"coopTranslator": {
"original_hash": "1de3ae931831253c3198d899da48bfe5",
"translation_date": "2025-08-28T12:58:44+00:00",
"original_hash": "df7d1f7da8d2617b76acd93115776ca4",
"translation_date": "2025-10-03T14:35:12+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb",
"language_code": "br"
}

View File

@ -1,29 +1,29 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "f3d2cee9cb3c52160419e560c57a690e",
"translation_date": "2025-08-26T09:34:45+00:00",
"original_hash": "b70fcf7fcee862990f848c679090943f",
"translation_date": "2025-10-03T14:54:27+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/README.md",
"language_code": "br"
}
-->
# Classificação de Rostos de Animais de Estimação
Trabalho prático do [Currículo de IA para Iniciantes](https://github.com/microsoft/ai-for-beginners).
Atividade de laboratório do [Currículo de IA para Iniciantes](https://github.com/microsoft/ai-for-beginners).
## Tarefa
Imagine que você precisa desenvolver um aplicativo para um berçário de animais de estimação para catalogar todos os animais. Uma das grandes funcionalidades de tal aplicativo seria identificar automaticamente a raça a partir de uma fotografia. Isso pode ser feito com sucesso utilizando redes neurais.
Imagine que você precisa desenvolver um aplicativo para um berçário de animais de estimação para catalogar todos os animais. Uma das grandes funcionalidades de tal aplicativo seria identificar automaticamente a raça a partir de uma fotografia. Isso pode ser feito com sucesso usando redes neurais.
Você precisa treinar uma rede neural convolucional para classificar diferentes raças de gatos e cachorros usando o dataset **Pet Faces**.
Você precisa treinar uma rede neural convolucional para classificar diferentes raças de gatos e cães usando o conjunto de dados **Pet Faces**.
## O Dataset
## O Conjunto de Dados
Usaremos o dataset **Pet Faces**, derivado do dataset de animais de estimação [Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/). Ele contém 35 raças diferentes de cães e gatos.
Usaremos o [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), que contém imagens de 37 diferentes raças de cães e gatos.
![Dataset com o qual trabalharemos](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.br.png)
![Conjunto de dados com o qual trabalharemos](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.br.png)
Para baixar o dataset, use este trecho de código:
Para baixar o conjunto de dados, use este trecho de código:
```python
!wget https://thor.robots.ox.ac.uk/~vgg/data/pets/images.tar.gz
@ -31,13 +31,17 @@ Para baixar o dataset, use este trecho de código:
!rm images.tar.gz
```
## Iniciando o Notebook
**Nota:** As imagens do Oxford-IIIT Pet Dataset estão organizadas por nome de arquivo (por exemplo, `Abyssinian_1.jpg`, `Bengal_2.jpg`). O notebook inclui código para organizar essas imagens em subdiretórios específicos de raças para facilitar a classificação.
Comece o trabalho prático abrindo [PetFaces.ipynb](../../../../../../lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb)
## Notebook Inicial
Comece o laboratório abrindo [PetFaces.ipynb](PetFaces.ipynb)
## Conclusão
Você resolveu um problema relativamente complexo de classificação de imagens do zero! Havia muitas classes, e mesmo assim você conseguiu obter uma precisão razoável! Também faz sentido medir a precisão top-k, porque é fácil confundir algumas classes que não são claramente diferentes, mesmo para seres humanos.
Você resolveu um problema relativamente complexo de classificação de imagens do zero! Havia muitas classes, e você ainda conseguiu obter uma precisão razoável! Também faz sentido medir a precisão top-k, porque é fácil confundir algumas classes que não são claramente diferentes, mesmo para seres humanos.
---
**Aviso Legal**:
Este documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automáticas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte oficial. Para informações críticas, recomenda-se a tradução profissional feita por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução.
Este documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, é importante estar ciente de que traduções automáticas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução.

View File

@ -10,7 +10,9 @@
"\n",
"### Získání dat\n",
"\n",
"V tomto úkolu se zaměříme na relativně jednoduchý klasifikační úkol - klasifikaci obličejů domácích mazlíčků. Tento dataset obsahuje výřezy obličejů z [Oxford-IIIT Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/). Začněme načtením a vizualizací dat.\n"
"V tomto úkolu se zaměříme na relativně jednoduchý klasifikační úkol klasifikaci obličejů domácích mazlíčků. Použijeme [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), který obsahuje obrázky 37 různých plemen psů a koček. Začněme stažením a vizualizací datové sady.\n",
"\n",
"**Poznámka:** Oxford-IIIT Pet Dataset obsahuje kompletní obrázky domácích mazlíčků. Obrázky budou v extrahované složce uspořádány podle plemen.\n"
]
},
{
@ -77,7 +79,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Nyní projdeme všechny podadresáře tříd a vykreslíme první obrázky každé třídy:\n"
"Nyní projděme všechny podadresáře tříd a zobrazme první několik obrázků každé třídy:\n"
]
},
{
@ -86,6 +88,24 @@
"metadata": {},
"outputs": [],
"source": [
"# Note: The Oxford-IIIT Pet Dataset extracts to a folder named 'images'\n",
"# Images are named by breed (e.g., 'Abyssinian_1.jpg')\n",
"# We need to organize them into breed-specific subdirectories\n",
"import os\n",
"from collections import defaultdict\n",
"\n",
"# Organize images by breed\n",
"if not os.path.exists('petfaces'):\n",
" os.makedirs('petfaces')\n",
" for img_file in os.listdir('images'):\n",
" if img_file.endswith(('.jpg', '.png')):\n",
" # Extract breed name from filename (everything before the last underscore and number)\n",
" breed = '_'.join(img_file.split('_')[:-1])\n",
" breed_dir = os.path.join('petfaces', breed)\n",
" if not os.path.exists(breed_dir):\n",
" os.makedirs(breed_dir)\n",
" os.rename(os.path.join('images', img_file), os.path.join(breed_dir, img_file))\n",
"\n",
"for cls in os.listdir('petfaces'):\n",
" print(cls)\n",
" display_images([Image.open(os.path.join('petfaces',cls,x)) \n",
@ -96,7 +116,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Pojďme také definovat počet tříd v našem datovém souboru:\n"
"Definujme také počet tříd v našem datovém souboru:\n"
]
},
{
@ -126,11 +146,11 @@
"source": [
"## Příprava datové sady pro hluboké učení\n",
"\n",
"Abychom mohli začít trénovat naši neuronovou síť, musíme převést všechny obrázky na tensory a také vytvořit tensory odpovídající štítkům (číslům tříd). Většina frameworků pro neuronové sítě obsahuje jednoduché nástroje pro práci s obrázky:\n",
"Abychom mohli začít trénovat naši neuronovou síť, musíme převést všechny obrázky na tensory a také vytvořit tensory odpovídající štítkům (čísla tříd). Většina frameworků pro neuronové sítě obsahuje jednoduché nástroje pro práci s obrázky:\n",
"* V Tensorflow použijte `tf.keras.preprocessing.image_dataset_from_directory`\n",
"* V PyTorch použijte `torchvision.datasets.ImageFolder`\n",
"\n",
"Jak jste viděli na obrázcích výše, všechny mají poměr stran blízký čtverci, takže musíme všechny obrázky změnit na čtvercový rozměr. Také můžeme obrázky organizovat do minibatchů.\n"
"Jak jste viděli na obrázcích výše, všechny mají poměr stran blízký čtverci, takže musíme všechny obrázky změnit na čtvercový rozměr. Také můžeme obrázky uspořádat do minibatchů.\n"
]
},
{
@ -162,7 +182,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Nyní si vypíšeme velikost tensorů v našem datasetu. Pokud jste vše provedli správně, velikost trénovacích prvků by měla být\n",
"Nyní si vytiskneme velikost tensorů v našem datasetu. Pokud jste vše provedli správně, velikost trénovacích prvků by měla být:\n",
" * `(batch_size,image_size,image_size,3)` pro Tensorflow, `batch_size,3,image_size,image_size` pro PyTorch\n",
" * `batch_size` pro štítky\n",
" \n",
@ -235,8 +255,8 @@
"* Nezapomeňte na aktivační funkce mezi vrstvami (ReLU) a Max Pooling.\n",
"* Konečný klasifikátor může být s nebo bez skrytých vrstev, ale počet výstupních neuronů by měl odpovídat počtu tříd.\n",
"\n",
"Důležité je správně nastavit aktivační funkci na poslední vrstvě + ztrátovou funkci:\n",
"* V Tensorflow můžete použít `softmax` jako aktivační funkci a `sparse_categorical_crossentropy` jako ztrátovou funkci. Rozdíl mezi sparse kategorickou cross-entropií a nesparse verzí je v tom, že první očekává výstup jako číslo třídy, nikoliv jako one-hot vektor.\n",
"Důležité je správně nastavit aktivační funkci v poslední vrstvě + ztrátovou funkci:\n",
"* V Tensorflow můžete použít `softmax` jako aktivační funkci a `sparse_categorical_crossentropy` jako ztrátovou funkci. Rozdíl mezi sparse categorical cross-entropy a nesparse verzí je v tom, že první očekává výstup jako číslo třídy, nikoli jako one-hot vektor.\n",
"* V PyTorch můžete mít poslední vrstvu bez aktivační funkce a použít ztrátovou funkci `CrossEntropyLoss`. Tato funkce automaticky aplikuje softmax.\n"
]
},
@ -255,9 +275,9 @@
"source": [
"## Trénování neuronové sítě\n",
"\n",
"Nyní jsme připraveni trénovat neuronovou síť. Během trénování sbírejte přesnost na trénovacích a testovacích datech při každé epoše a poté vykreslete graf přesnosti, abyste zjistili, zda nedochází k přeučení.\n",
"Nyní jsme připraveni trénovat neuronovou síť. Během trénování prosím sbírejte přesnost na trénovacích a testovacích datech v každé epoše a poté vykreslete graf přesnosti, abyste zjistili, zda dochází k přeučení.\n",
"\n",
"> Pro urychlení trénování je potřeba použít GPU, pokud je k dispozici. Zatímco TensorFlow/Keras automaticky využije GPU, v PyTorch je nutné během trénování přesunout jak model, tak data na GPU pomocí metody `.to()`, abyste mohli využít akceleraci GPU.\n"
"> Pro urychlení trénování je potřeba použít GPU, pokud je k dispozici. Zatímco TensorFlow/Keras automaticky využijí GPU, v PyTorch je nutné během trénování přesunout model i data na GPU pomocí metody `.to()`, aby bylo možné využít akceleraci GPU.\n"
]
},
{
@ -295,20 +315,20 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Co můžete říci o overfittingu? Co lze udělat pro zlepšení přesnosti modelu?\n",
"Co můžete říci o přeučení? Co lze udělat pro zlepšení přesnosti modelu?\n",
"\n",
"## Volitelné: Výpočet Top3 přesnosti\n",
"\n",
"V tomto cvičení jsme se zabývali klasifikací s poměrně vysokým počtem tříd (35), takže náš výsledek - přibližně 50% validační přesnost - je docela dobrý. Standardní dataset ImageNet má dokonce ještě více - 1000 tříd.\n",
"V tomto cvičení jsme se zabývali klasifikací s poměrně vysokým počtem tříd (35), takže náš výsledek - přibližně 50% validační přesnost - je docela dobrý. Standardní dataset ImageNet má dokonce více - 1000 tříd.\n",
"\n",
"V takových případech je obtížné zajistit, aby model **vždy** správně předpověděl třídu. Existují situace, kdy jsou si dvě plemena velmi podobná a model vrací velmi podobné pravděpodobnosti (např. 0,45 a 0,43). Pokud měříme standardní přesnost, bude to považováno za chybu, i když model udělal jen velmi malou chybu. Proto často měříme jinou metriku - přesnost v rámci top 3 nejpravděpodobnějších předpovědí modelu.\n",
"\n",
"Považujeme případ za správný, pokud cílový štítek je obsažen v top 3 předpovědích modelu.\n",
"Považujeme případ za přesný, pokud je cílový štítek obsažen v top 3 předpovědích modelu.\n",
"\n",
"Pro výpočet top-3 přesnosti na testovacím datasetu je třeba dataset manuálně projít, aplikovat neuronovou síť pro získání předpovědi a poté provést výpočty. Několik tipů:\n",
"\n",
"* V Tensorflow použijte funkci `tf.nn.in_top_k`, abyste zjistili, zda `predictions` (výstup modelu) jsou v top-k (předat `k=3` jako parametr) vzhledem k `targets`. Tato funkce vrací tensor s hodnotami typu boolean, které lze převést na `int` pomocí `tf.cast` a poté akumulovat pomocí `tf.reduce_sum`.\n",
"* V PyTorch můžete použít funkci `torch.topk` pro získání indexů tříd s nejvyššími pravděpodobnostmi a poté zjistit, zda správná třída mezi nimi patří. Podívejte se na [tento](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) odkaz pro další tipy.\n"
"* V Tensorflow použijte funkci `tf.nn.in_top_k`, abyste zjistili, zda `predictions` (výstup modelu) jsou v top-k (předat `k=3` jako parametr) vzhledem k `targets`. Tato funkce vrací tensor hodnot typu boolean, které lze převést na `int` pomocí `tf.cast` a poté akumulovat pomocí `tf.reduce_sum`.\n",
"* V PyTorch můžete použít funkci `torch.topk`, abyste získali indexy tříd s nejvyššími pravděpodobnostmi, a poté zjistit, zda správná třída mezi nimi patří. Podívejte se na [tento](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) odkaz pro další tipy.\n"
]
},
{
@ -326,7 +346,7 @@
"source": [
"## Volitelné: Vytvoření klasifikace kočky vs. psi\n",
"\n",
"Chceme také zjistit, jak přesná by byla naše binární klasifikace kočky vs. psi na stejném datovém souboru. Abychom toho dosáhli, musíme upravit štítky:\n"
"Chceme také zjistit, jak přesná by byla naše binární klasifikace kočky vs. psi na stejném datovém souboru. K tomu je potřeba upravit štítky:\n"
]
},
{
@ -352,7 +372,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Prohlášení**: \nTento dokument byl přeložen pomocí služby pro automatický překlad [Co-op Translator](https://github.com/Azure/co-op-translator). I když se snažíme o přesnost, mějte prosím na paměti, že automatické překlady mohou obsahovat chyby nebo nepřesnosti. Původní dokument v jeho původním jazyce by měl být považován za autoritativní zdroj. Pro důležité informace doporučujeme profesionální lidský překlad. Neodpovídáme za žádná nedorozumění nebo nesprávné interpretace vyplývající z použití tohoto překladu.\n"
"\n---\n\n**Prohlášení**: \nTento dokument byl přeložen pomocí služby AI pro překlady [Co-op Translator](https://github.com/Azure/co-op-translator). I když se snažíme o přesnost, mějte prosím na paměti, že automatizované překlady mohou obsahovat chyby nebo nepřesnosti. Původní dokument v jeho původním jazyce by měl být považován za autoritativní zdroj. Pro důležité informace doporučujeme profesionální lidský překlad. Neodpovídáme za žádná nedorozumění nebo nesprávné interpretace vyplývající z použití tohoto překladu.\n"
]
}
],
@ -378,8 +398,8 @@
"version": "3.9.5"
},
"coopTranslator": {
"original_hash": "1de3ae931831253c3198d899da48bfe5",
"translation_date": "2025-08-29T13:29:25+00:00",
"original_hash": "df7d1f7da8d2617b76acd93115776ca4",
"translation_date": "2025-10-03T14:45:10+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb",
"language_code": "cs"
}

View File

@ -1,8 +1,8 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "f3d2cee9cb3c52160419e560c57a690e",
"translation_date": "2025-08-25T22:58:01+00:00",
"original_hash": "b70fcf7fcee862990f848c679090943f",
"translation_date": "2025-10-03T14:57:03+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/README.md",
"language_code": "cs"
}
@ -13,17 +13,17 @@ Laboratorní úkol z [AI for Beginners Curriculum](https://github.com/microsoft/
## Úkol
Představte si, že potřebujete vyvinout aplikaci pro školku domácích mazlíčků, která by katalogizovala všechna zvířata. Jednou z úžasných funkcí takové aplikace by bylo automatické rozpoznání plemene z fotografie. Toho lze úspěšně dosáhnout pomocí neuronových sítí.
Představte si, že potřebujete vyvinout aplikaci pro školku domácích mazlíčků, která by katalogizovala všechny mazlíčky. Jednou z úžasných funkcí takové aplikace by bylo automatické rozpoznání plemene z fotografie. To lze úspěšně provést pomocí neuronových sítí.
Vaším úkolem je natrénovat konvoluční neuronovou síť, která bude klasifikovat různá plemena koček a psů pomocí datasetu **Pet Faces**.
## Dataset
Použijeme dataset **Pet Faces**, který je odvozen z datasetu domácích mazlíčků [Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/). Obsahuje 35 různých plemen psů a koček.
Použijeme [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), který obsahuje obrázky 37 různých plemen psů a koček.
![Dataset, se kterým budeme pracovat](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.cs.png)
Pro stažení datasetu použijte tento úryvek kódu:
Pro stažení datasetu použijte tento kód:
```python
!wget https://thor.robots.ox.ac.uk/~vgg/data/pets/images.tar.gz
@ -31,13 +31,17 @@ Pro stažení datasetu použijte tento úryvek kódu:
!rm images.tar.gz
```
**Poznámka:** Obrázky v Oxford-IIIT Pet Dataset jsou organizovány podle názvu souboru (např. `Abyssinian_1.jpg`, `Bengal_2.jpg`). Notebook obsahuje kód, který tyto obrázky organizuje do podadresářů podle plemen pro snadnější klasifikaci.
## Výchozí notebook
Začněte laboratoř otevřením [PetFaces.ipynb](../../../../../../lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb)
Začněte laboratorní úkol otevřením [PetFaces.ipynb](PetFaces.ipynb)
## Závěr
Vyřešili jste poměrně složitý problém klasifikace obrázků od základů! Bylo zde mnoho tříd, a přesto jste byli schopni dosáhnout rozumné přesnosti! Má také smysl měřit top-k přesnost, protože je snadné zaměnit některé třídy, které nejsou jasně odlišitelné ani pro lidské oko.
Vyřešili jste poměrně složitý problém klasifikace obrázků od základu! Bylo zde mnoho tříd, a přesto jste byli schopni dosáhnout rozumné přesnosti! Má také smysl měřit top-k přesnost, protože je snadné zaměnit některé třídy, které nejsou jasně odlišné ani pro lidské oko.
---
**Prohlášení**:
Tento dokument byl přeložen pomocí služby pro automatický překlad [Co-op Translator](https://github.com/Azure/co-op-translator). I když se snažíme o přesnost, mějte prosím na paměti, že automatické překlady mohou obsahovat chyby nebo nepřesnosti. Původní dokument v jeho původním jazyce by měl být považován za závazný zdroj. Pro důležité informace doporučujeme profesionální lidský překlad. Neodpovídáme za žádná nedorozumění nebo nesprávné výklady vyplývající z použití tohoto překladu.
Tento dokument byl přeložen pomocí služby AI pro překlady [Co-op Translator](https://github.com/Azure/co-op-translator). I když se snažíme o přesnost, mějte prosím na paměti, že automatizované překlady mohou obsahovat chyby nebo nepřesnosti. Původní dokument v jeho původním jazyce by měl být považován za autoritativní zdroj. Pro důležité informace se doporučuje profesionální lidský překlad. Neodpovídáme za žádná nedorozumění nebo nesprávné interpretace vyplývající z použití tohoto překladu.

View File

@ -10,7 +10,9 @@
"\n",
"### Hentning af data\n",
"\n",
"I denne opgave vil vi fokusere på en relativt simpel klassifikationsopgave - klassificering af kæledyrs ansigter. Dette datasæt består af udskårne ansigter fra [Oxford-IIIT Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/). Lad os starte med at indlæse og visualisere datasættet.\n"
"I denne opgave vil vi fokusere på en relativt simpel klassificeringsopgave - klassificering af kæledyrs ansigter. Vi vil bruge [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), som indeholder billeder af 37 forskellige hunde- og katteracer. Lad os starte med at downloade og visualisere datasættet.\n",
"\n",
"**Bemærk:** Oxford-IIIT Pet Dataset indeholder komplette billeder af kæledyr. Billederne vil være organiseret efter race i den udpakkede mappe.\n"
]
},
{
@ -86,6 +88,24 @@
"metadata": {},
"outputs": [],
"source": [
"# Note: The Oxford-IIIT Pet Dataset extracts to a folder named 'images'\n",
"# Images are named by breed (e.g., 'Abyssinian_1.jpg')\n",
"# We need to organize them into breed-specific subdirectories\n",
"import os\n",
"from collections import defaultdict\n",
"\n",
"# Organize images by breed\n",
"if not os.path.exists('petfaces'):\n",
" os.makedirs('petfaces')\n",
" for img_file in os.listdir('images'):\n",
" if img_file.endswith(('.jpg', '.png')):\n",
" # Extract breed name from filename (everything before the last underscore and number)\n",
" breed = '_'.join(img_file.split('_')[:-1])\n",
" breed_dir = os.path.join('petfaces', breed)\n",
" if not os.path.exists(breed_dir):\n",
" os.makedirs(breed_dir)\n",
" os.rename(os.path.join('images', img_file), os.path.join(breed_dir, img_file))\n",
"\n",
"for cls in os.listdir('petfaces'):\n",
" print(cls)\n",
" display_images([Image.open(os.path.join('petfaces',cls,x)) \n",
@ -126,11 +146,11 @@
"source": [
"## Forberedelse af datasæt til Deep Learning\n",
"\n",
"For at begynde træningen af vores neurale netværk skal vi konvertere alle billeder til tensorer og også oprette tensorer, der svarer til labels (klasse-numre). De fleste neurale netværksrammer indeholder simple værktøjer til at arbejde med billeder:\n",
"For at begynde træningen af vores neurale netværk skal vi konvertere alle billeder til tensorer og også oprette tensorer, der svarer til labels (klasse-numre). De fleste neurale netværksrammer indeholder enkle værktøjer til at arbejde med billeder:\n",
"* I Tensorflow, brug `tf.keras.preprocessing.image_dataset_from_directory`\n",
"* I PyTorch, brug `torchvision.datasets.ImageFolder`\n",
"\n",
"Som du har set på billederne ovenfor, har alle en tæt på kvadratisk billedforhold, så vi skal ændre størrelsen på alle billeder til kvadratisk størrelse. Derudover kan vi organisere billederne i minibatches.\n"
"Som du har set på billederne ovenfor, har de alle en tæt på kvadratisk billedforhold, så vi skal ændre størrelsen på alle billeder til kvadratisk størrelse. Derudover kan vi organisere billederne i minibatches.\n"
]
},
{
@ -166,7 +186,7 @@
" * `(batch_size,image_size,image_size,3)` for Tensorflow, `batch_size,3,image_size,image_size` for PyTorch\n",
" * `batch_size` for Labels\n",
" \n",
" Labels bør indeholde numre for klasser.\n"
" Labels bør indeholde klassernes numre.\n"
]
},
{
@ -236,8 +256,8 @@
"* Den endelige klassifikator kan være med eller uden skjulte lag, men antallet af outputneuroner skal være lig med antallet af klasser.\n",
"\n",
"En vigtig ting er at få aktiveringsfunktionen på det sidste lag + tabsfunktionen korrekt:\n",
"* I Tensorflow kan du bruge `softmax` som aktiveringsfunktion og `sparse_categorical_crossentropy` som tabsfunktion. Forskellen mellem sparse categorical cross-entropy og den ikke-sparse version er, at den første forventer output som klassens nummer og ikke som en one-hot vektor.\n",
"* I PyTorch kan du have det sidste lag uden aktiveringsfunktion og bruge `CrossEntropyLoss` som tabsfunktion. Denne funktion anvender automatisk softmax.\n"
"* I Tensorflow kan du bruge `softmax` som aktivering og `sparse_categorical_crossentropy` som tab. Forskellen mellem sparse kategorisk krydstab og ikke-sparse er, at den første forventer output som klassens nummer og ikke som en one-hot vektor.\n",
"* I PyTorch kan du have det sidste lag uden aktiveringsfunktion og bruge `CrossEntropyLoss` som tabsfunktion. Denne funktion anvender softmax automatisk.\n"
]
},
{
@ -255,9 +275,9 @@
"source": [
"## Træn det neurale netværk\n",
"\n",
"Nu er vi klar til at træne det neurale netværk. Under træningen skal du indsamle nøjagtighed på trænings- og testdata for hver epoke og derefter plotte nøjagtigheden for at se, om der er overfitting.\n",
"Nu er vi klar til at træne det neurale netværk. Under træningen skal du indsamle nøjagtighed på trænings- og testdata for hver epoch og derefter plotte nøjagtigheden for at se, om der er overfitting.\n",
"\n",
"> For at fremskynde træningen skal du bruge GPU, hvis det er tilgængeligt. Mens TensorFlow/Keras automatisk vil bruge GPU, skal du i PyTorch flytte både modellen og dataene til GPU under træningen ved hjælp af `.to()`-metoden for at udnytte GPU-acceleration.\n"
"> For at accelerere træningen skal du bruge GPU, hvis det er tilgængeligt. Mens TensorFlow/Keras automatisk vil bruge GPU, skal du i PyTorch flytte både modellen og dataene til GPU under træningen ved hjælp af `.to()`-metoden for at udnytte GPU-acceleration.\n"
]
},
{
@ -297,18 +317,18 @@
"source": [
"Hvad kan man sige om overfitting? Hvad kan gøres for at forbedre modellens nøjagtighed?\n",
"\n",
"## Valgfrit: Beregn Top3-nøjagtighed\n",
"## Valgfrit: Beregn Top-3 Nøjagtighed\n",
"\n",
"I denne øvelse arbejdede vi med klassifikation med et ret højt antal klasser (35), så vores resultat - omkring 50% valideringsnøjagtighed - er ret godt. Det standard ImageNet-datasæt har endnu flere - 1000 klasser.\n",
"\n",
"I sådanne tilfælde er det svært at sikre, at modellen **altid** korrekt forudsiger klassen. Der er tilfælde, hvor to racer ligner hinanden meget, og modellen returnerer meget lignende sandsynligheder (fx 0.45 og 0.43). Hvis vi måler standardnøjagtighed, vil det blive betragtet som en fejl, selvom modellen kun lavede en meget lille fejl. Derfor måler vi ofte en anden metrisk - en nøjagtighed inden for de top 3 mest sandsynlige forudsigelser fra modellen.\n",
"I sådanne tilfælde er det svært at sikre, at modellen **altid** korrekt forudsiger klassen. Der er situationer, hvor to racer er meget ens, og modellen returnerer meget lignende sandsynligheder (f.eks. 0,45 og 0,43). Hvis vi måler standardnøjagtighed, vil det blive betragtet som en fejl, selvom modellen kun lavede en meget lille fejl. Derfor måler vi ofte en anden metric - en nøjagtighed inden for de top 3 mest sandsynlige forudsigelser fra modellen.\n",
"\n",
"Vi betragter en forudsigelse som korrekt, hvis den ønskede etiket er indeholdt blandt de top 3 model-forudsigelser.\n",
"\n",
"For at beregne top-3 nøjagtighed på testdatasættet skal du manuelt gennemgå datasættet, anvende det neurale netværk for at få forudsigelsen og derefter udføre beregningerne. Nogle tips:\n",
"\n",
"* I Tensorflow kan du bruge funktionen `tf.nn.in_top_k` til at se, om `predictions` (modellens output) er blandt top-k (angiv `k=3` som parameter) i forhold til `targets`. Denne funktion returnerer en tensor af boolske værdier, som kan konverteres til `int` ved hjælp af `tf.cast` og derefter akkumuleres ved hjælp af `tf.reduce_sum`.\n",
"* I PyTorch kan du bruge funktionen `torch.topk` til at få indeks for klasser med de højeste sandsynligheder og derefter se, om den korrekte klasse er blandt dem. Se [dette](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) for flere tips.\n"
"* I Tensorflow kan du bruge funktionen `tf.nn.in_top_k` for at se, om `predictions` (modellens output) er blandt top-k (angiv `k=3` som parameter) i forhold til `targets`. Denne funktion returnerer en tensor af boolske værdier, som kan konverteres til `int` ved hjælp af `tf.cast` og derefter akkumuleres med `tf.reduce_sum`.\n",
"* I PyTorch kan du bruge funktionen `torch.topk` for at få indeksene for klasser med de højeste sandsynligheder og derefter se, om den korrekte klasse er blandt dem. Se [dette](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) for flere tips.\n"
]
},
{
@ -324,9 +344,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## Valgfrit: Byg klassifikation af katte vs. hunde\n",
"## Valgfrit: Byg klassifikation for katte vs. hunde\n",
"\n",
"Vi vil også gerne undersøge, hvor præcis vores binære klassifikation af katte vs. hunde ville være på det samme datasæt. For at gøre dette skal vi justere etiketterne:\n"
"Vi vil også gerne se, hvor præcis vores binære klassifikation af katte vs. hunde ville være på det samme datasæt. For at gøre dette skal vi justere etiketterne:\n"
]
},
{
@ -352,7 +372,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Ansvarsfraskrivelse**: \nDette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på at sikre nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os ikke ansvar for eventuelle misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse.\n"
"\n---\n\n**Ansvarsfraskrivelse**: \nDette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på at levere nøjagtige oversættelser, skal det bemærkes, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os ikke ansvar for misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse.\n"
]
}
],
@ -378,8 +398,8 @@
"version": "3.9.5"
},
"coopTranslator": {
"original_hash": "1de3ae931831253c3198d899da48bfe5",
"translation_date": "2025-08-28T16:24:29+00:00",
"original_hash": "df7d1f7da8d2617b76acd93115776ca4",
"translation_date": "2025-10-03T14:39:07+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb",
"language_code": "da"
}

View File

@ -1,27 +1,27 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "f3d2cee9cb3c52160419e560c57a690e",
"translation_date": "2025-08-28T15:14:18+00:00",
"original_hash": "b70fcf7fcee862990f848c679090943f",
"translation_date": "2025-10-03T14:55:29+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/README.md",
"language_code": "da"
}
-->
# Klassificering af kæledyrs ansigter
# Klassifikation af kæledyrs ansigter
Laboratorieopgave fra [AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners).
## Opgave
Forestil dig, at du skal udvikle en applikation til en dyrepension, der skal katalogisere alle kæledyr. En fantastisk funktion i en sådan applikation ville være automatisk at identificere racen ud fra et fotografi. Dette kan med succes gøres ved hjælp af neurale netværk.
Forestil dig, at du skal udvikle en applikation til en dyrepension for at katalogisere alle kæledyr. En af de fantastiske funktioner ved en sådan applikation ville være automatisk at identificere racen ud fra et fotografi. Dette kan med succes gøres ved hjælp af neurale netværk.
Du skal træne et konvolutionelt neuralt netværk til at klassificere forskellige racer af katte og hunde ved hjælp af **Pet Faces**-datasættet.
## Datasættet
Vi vil bruge **Pet Faces**-datasættet, som er afledt af [Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/) kæledyrs-datasættet. Det indeholder 35 forskellige racer af hunde og katte.
Vi vil bruge [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), som indeholder billeder af 37 forskellige racer af hunde og katte.
![Datasættet vi skal arbejde med](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.da.png)
![Datasæt vi skal arbejde med](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.da.png)
For at downloade datasættet, brug denne kode:
@ -31,15 +31,17 @@ For at downloade datasættet, brug denne kode:
!rm images.tar.gz
```
## Start Notebook
**Bemærk:** Billederne i Oxford-IIIT Pet Dataset er organiseret efter filnavn (f.eks. `Abyssinian_1.jpg`, `Bengal_2.jpg`). Notebogen inkluderer kode til at organisere disse billeder i race-specifikke underkataloger for lettere klassifikation.
## Startnotebook
Start laboratoriet ved at åbne [PetFaces.ipynb](PetFaces.ipynb)
## Læring
## Konklusion
Du har løst et relativt komplekst problem med billedklassificering fra bunden! Der var en hel del klasser, og du var stadig i stand til at opnå en rimelig nøjagtighed! Det giver også mening at måle top-k nøjagtighed, fordi det er nemt at forveksle nogle af klasserne, som ikke er tydeligt forskellige, selv for mennesker.
Du har løst et relativt komplekst problem med billedklassifikation fra bunden! Der var en hel del klasser, og du var stadig i stand til at opnå rimelig nøjagtighed! Det giver også mening at måle top-k nøjagtighed, fordi det er nemt at forveksle nogle af klasserne, som ikke er klart forskellige, selv for mennesker.
---
**Ansvarsfraskrivelse**:
Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi er ikke ansvarlige for eventuelle misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse.
Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på at sikre nøjagtighed, skal det bemærkes, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os ikke ansvar for misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse.

View File

@ -4,13 +4,15 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"# Klassifizierung von Tiergesichtern\n",
"# Klassifikation von Haustiergesichtern\n",
"\n",
"Laboraufgabe aus dem [AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners).\n",
"\n",
"### Beschaffung der Daten\n",
"### Datenbeschaffung\n",
"\n",
"In dieser Aufgabe konzentrieren wir uns auf eine relativ einfache Klassifizierungsaufgabe die Klassifizierung von Tiergesichtern. Dieses Datenset besteht aus ausgeschnittenen Gesichtern aus dem [Oxford-IIIT Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/). Beginnen wir damit, das Datenset zu laden und zu visualisieren.\n"
"In dieser Aufgabe konzentrieren wir uns auf eine relativ einfache Klassifikationsaufgabe die Klassifikation von Haustiergesichtern. Wir verwenden das [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), das Bilder von 37 verschiedenen Hunderassen und Katzenrassen enthält. Beginnen wir mit dem Herunterladen und Visualisieren des Datensatzes.\n",
"\n",
"**Hinweis:** Das Oxford-IIIT Pet Dataset enthält vollständige Bilder von Haustieren. Die Bilder werden im extrahierten Ordner nach Rassen organisiert.\n"
]
},
{
@ -86,6 +88,24 @@
"metadata": {},
"outputs": [],
"source": [
"# Note: The Oxford-IIIT Pet Dataset extracts to a folder named 'images'\n",
"# Images are named by breed (e.g., 'Abyssinian_1.jpg')\n",
"# We need to organize them into breed-specific subdirectories\n",
"import os\n",
"from collections import defaultdict\n",
"\n",
"# Organize images by breed\n",
"if not os.path.exists('petfaces'):\n",
" os.makedirs('petfaces')\n",
" for img_file in os.listdir('images'):\n",
" if img_file.endswith(('.jpg', '.png')):\n",
" # Extract breed name from filename (everything before the last underscore and number)\n",
" breed = '_'.join(img_file.split('_')[:-1])\n",
" breed_dir = os.path.join('petfaces', breed)\n",
" if not os.path.exists(breed_dir):\n",
" os.makedirs(breed_dir)\n",
" os.rename(os.path.join('images', img_file), os.path.join(breed_dir, img_file))\n",
"\n",
"for cls in os.listdir('petfaces'):\n",
" print(cls)\n",
" display_images([Image.open(os.path.join('petfaces',cls,x)) \n",
@ -127,10 +147,10 @@
"## Vorbereitung des Datensatzes für Deep Learning\n",
"\n",
"Um mit dem Training unseres neuronalen Netzwerks zu beginnen, müssen wir alle Bilder in Tensoren umwandeln und auch Tensoren erstellen, die den Labels (Klassennummern) entsprechen. Die meisten Frameworks für neuronale Netzwerke bieten einfache Werkzeuge zur Verarbeitung von Bildern:\n",
"* In Tensorflow verwenden Sie `tf.keras.preprocessing.image_dataset_from_directory`\n",
"* In PyTorch verwenden Sie `torchvision.datasets.ImageFolder`\n",
"* In Tensorflow: `tf.keras.preprocessing.image_dataset_from_directory`\n",
"* In PyTorch: `torchvision.datasets.ImageFolder`\n",
"\n",
"Wie Sie auf den obigen Bildern gesehen haben, haben alle ein nahezu quadratisches Seitenverhältnis. Daher müssen wir alle Bilder auf eine quadratische Größe skalieren. Außerdem können wir die Bilder in Minibatches organisieren.\n"
"Wie Sie anhand der obigen Bilder gesehen haben, haben alle ein nahezu quadratisches Seitenverhältnis. Daher müssen wir alle Bilder auf eine quadratische Größe skalieren. Außerdem können wir die Bilder in Minibatches organisieren.\n"
]
},
{
@ -146,7 +166,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Jetzt müssen wir den Datensatz in Trainings- und Testanteile aufteilen:\n"
"Jetzt müssen wir den Datensatz in Trainings- und Testabschnitte aufteilen:\n"
]
},
{
@ -162,7 +182,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Jetzt lassen wir uns die Größe der Tensoren in unserem Datensatz ausgeben. Wenn alles korrekt eingerichtet wurde, sollte die Größe der Trainingselemente wie folgt sein:\n",
"Jetzt lassen wir uns die Größe der Tensoren in unserem Datensatz ausgeben. Wenn alles korrekt umgesetzt wurde, sollte die Größe der Trainingselemente wie folgt sein:\n",
" * `(batch_size,image_size,image_size,3)` für Tensorflow, `batch_size,3,image_size,image_size` für PyTorch\n",
" * `batch_size` für Labels\n",
"\n",
@ -235,8 +255,8 @@
"* Vergiss nicht die Aktivierungsfunktionen zwischen den Schichten (ReLU) und Max Pooling.\n",
"* Der finale Klassifikator kann mit oder ohne versteckte Schichten sein, aber die Anzahl der Ausgabeneuronen sollte der Anzahl der Klassen entsprechen.\n",
"\n",
"Ein wichtiger Punkt ist, die Aktivierungsfunktion in der letzten Schicht + Verlustfunktion korrekt zu wählen:\n",
"* In Tensorflow kannst du `softmax` als Aktivierungsfunktion und `sparse_categorical_crossentropy` als Verlustfunktion verwenden. Der Unterschied zwischen sparse categorical cross-entropy und der nicht-sparschen Variante ist, dass die erstere die Ausgabe als Klassenindex erwartet und nicht als One-Hot-Vektor.\n",
"Ein wichtiger Punkt ist, die Aktivierungsfunktion in der letzten Schicht + die Verlustfunktion korrekt zu wählen:\n",
"* In Tensorflow kannst du `softmax` als Aktivierungsfunktion und `sparse_categorical_crossentropy` als Verlustfunktion verwenden. Der Unterschied zwischen sparse categorical cross-entropy und der nicht-sparschen Variante ist, dass erstere die Ausgabe als Klassenindex erwartet und nicht als One-Hot-Vektor.\n",
"* In PyTorch kannst du die letzte Schicht ohne Aktivierungsfunktion belassen und die Verlustfunktion `CrossEntropyLoss` verwenden. Diese Funktion wendet automatisch softmax an.\n"
]
},
@ -253,11 +273,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## Trainiere das neuronale Netzwerk\n",
"## Trainieren des neuronalen Netzwerks\n",
"\n",
"Jetzt sind wir bereit, das neuronale Netzwerk zu trainieren. Während des Trainings sollten Sie die Genauigkeit auf den Trainings- und Testdaten in jeder Epoche erfassen und anschließend die Genauigkeit plotten, um zu überprüfen, ob Überanpassung vorliegt.\n",
"\n",
"> Um das Training zu beschleunigen, sollten Sie eine GPU verwenden, falls verfügbar. Während TensorFlow/Keras automatisch die GPU nutzt, müssen Sie in PyTorch sowohl das Modell als auch die Daten während des Trainings mit der `.to()`-Methode auf die GPU verschieben, um die GPU-Beschleunigung zu nutzen.\n"
"> Um das Training zu beschleunigen, sollten Sie eine GPU verwenden, falls verfügbar. Während TensorFlow/Keras automatisch die GPU nutzt, müssen Sie in PyTorch sowohl das Modell als auch die Daten während des Trainings mit der Methode `.to()` auf die GPU verschieben, um von der GPU-Beschleunigung zu profitieren.\n"
]
},
{
@ -299,16 +319,16 @@
"\n",
"## Optional: Berechnung der Top-3-Genauigkeit\n",
"\n",
"In dieser Übung haben wir uns mit einer Klassifikation mit einer ziemlich hohen Anzahl von Klassen (35) beschäftigt, sodass unser Ergebnis - etwa 50 % Validierungsgenauigkeit - ziemlich gut ist. Das Standard-ImageNet-Dataset hat sogar noch mehr - 1000 Klassen.\n",
"In dieser Übung haben wir uns mit einer Klassifikation mit einer ziemlich hohen Anzahl von Klassen (35) beschäftigt, sodass unser Ergebnis etwa 50 % Validierungsgenauigkeit ziemlich gut ist. Der Standard-ImageNet-Datensatz hat sogar noch mehr 1000 Klassen.\n",
"\n",
"In solchen Fällen ist es schwierig sicherzustellen, dass das Modell **immer** die Klasse korrekt vorhersagt. Es gibt Fälle, in denen zwei Rassen einander sehr ähnlich sind und das Modell sehr ähnliche Wahrscheinlichkeiten zurückgibt (z. B. 0,45 und 0,43). Wenn wir die Standardgenauigkeit messen, wird dies als falscher Fall betrachtet, obwohl das Modell nur einen sehr kleinen Fehler gemacht hat. Daher messen wir oft eine andere Metrik - die Genauigkeit innerhalb der Top-3 der wahrscheinlichsten Vorhersagen des Modells.\n",
"In solchen Fällen ist es schwierig sicherzustellen, dass das Modell **immer** die Klasse korrekt vorhersagt. Es gibt Fälle, in denen zwei Rassen einander sehr ähnlich sind und das Modell sehr ähnliche Wahrscheinlichkeiten zurückgibt (z. B. 0,45 und 0,43). Wenn wir die Standardgenauigkeit messen, wird dies als falscher Fall betrachtet, obwohl das Modell nur einen sehr kleinen Fehler gemacht hat. Daher messen wir oft eine andere Metrik die Genauigkeit innerhalb der Top-3 der wahrscheinlichsten Vorhersagen des Modells.\n",
"\n",
"Wir betrachten den Fall als korrekt, wenn das Ziel-Label innerhalb der Top-3-Vorhersagen des Modells enthalten ist.\n",
"\n",
"Um die Top-3-Genauigkeit auf dem Test-Dataset zu berechnen, müssen Sie das Dataset manuell durchgehen, das neuronale Netzwerk anwenden, um die Vorhersage zu erhalten, und dann die Berechnungen durchführen. Einige Hinweise:\n",
"Um die Top-3-Genauigkeit auf dem Testdatensatz zu berechnen, müssen Sie den Datensatz manuell durchgehen, das neuronale Netzwerk anwenden, um die Vorhersage zu erhalten, und dann die Berechnungen durchführen. Einige Hinweise:\n",
"\n",
"* In Tensorflow können Sie die Funktion `tf.nn.in_top_k` verwenden, um zu überprüfen, ob die `predictions` (Ausgabe des Modells) in den Top-k enthalten sind (übergeben Sie `k=3` als Parameter) in Bezug auf die `targets`. Diese Funktion gibt einen Tensor mit booleschen Werten zurück, der mit `tf.cast` in `int` umgewandelt und dann mit `tf.reduce_sum` akkumuliert werden kann.\n",
"* In PyTorch können Sie die Funktion `torch.topk` verwenden, um die Indizes der Klassen mit den höchsten Wahrscheinlichkeiten zu erhalten und dann überprüfen, ob die korrekte Klasse zu diesen gehört. Weitere Hinweise finden Sie [hier](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b).\n"
"* In PyTorch können Sie die Funktion `torch.topk` verwenden, um die Indizes der Klassen mit den höchsten Wahrscheinlichkeiten zu erhalten, und dann überprüfen, ob die richtige Klasse zu diesen gehört. Weitere Hinweise finden Sie [hier](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b).\n"
]
},
{
@ -326,7 +346,7 @@
"source": [
"## Optional: Erstellen einer Klassifikation für Katzen vs. Hunde\n",
"\n",
"Wir möchten auch sehen, wie genau unsere binäre Klassifikation für Katzen vs. Hunde auf demselben Datensatz wäre. Dafür müssen wir die Labels anpassen:\n"
"Wir möchten auch sehen, wie genau unsere binäre Klassifikation von Katzen vs. Hunde auf demselben Datensatz wäre. Dafür müssen wir die Labels anpassen:\n"
]
},
{
@ -378,8 +398,8 @@
"version": "3.9.5"
},
"coopTranslator": {
"original_hash": "1de3ae931831253c3198d899da48bfe5",
"translation_date": "2025-08-31T15:54:11+00:00",
"original_hash": "df7d1f7da8d2617b76acd93115776ca4",
"translation_date": "2025-10-03T14:25:55+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb",
"language_code": "de"
}

View File

@ -1,8 +1,8 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "f3d2cee9cb3c52160419e560c57a690e",
"translation_date": "2025-08-24T09:36:20+00:00",
"original_hash": "b70fcf7fcee862990f848c679090943f",
"translation_date": "2025-10-03T14:52:02+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/README.md",
"language_code": "de"
}
@ -13,15 +13,15 @@ Laboraufgabe aus dem [AI for Beginners Curriculum](https://github.com/microsoft/
## Aufgabe
Stellen Sie sich vor, Sie müssen eine Anwendung für eine Tierpension entwickeln, um alle Haustiere zu katalogisieren. Eine großartige Funktion einer solchen Anwendung wäre, die Rasse automatisch anhand eines Fotos zu erkennen. Dies kann erfolgreich mit neuronalen Netzwerken durchgeführt werden.
Stellen Sie sich vor, Sie müssen eine Anwendung für eine Tierpension entwickeln, um alle Haustiere zu katalogisieren. Eine großartige Funktion einer solchen Anwendung wäre die automatische Erkennung der Rasse anhand eines Fotos. Dies kann erfolgreich mit neuronalen Netzwerken durchgeführt werden.
Sie müssen ein konvolutionales neuronales Netzwerk trainieren, um verschiedene Katzen- und Hunderassen mithilfe des **Pet Faces**-Datensatzes zu klassifizieren.
## Der Datensatz
Wir verwenden den **Pet Faces**-Datensatz, der aus dem [Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/) Haustierdatensatz abgeleitet wurde. Er enthält 35 verschiedene Rassen von Hunden und Katzen.
Wir verwenden den [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), der Bilder von 37 verschiedenen Hunde- und Katzenrassen enthält.
![Datensatz, mit dem wir arbeiten werden](../../../../../../lessons/4-ComputerVision/07-ConvNets/lab/images/data.png)
![Datensatz, mit dem wir arbeiten werden](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.de.png)
Um den Datensatz herunterzuladen, verwenden Sie diesen Code-Schnipsel:
@ -31,13 +31,17 @@ Um den Datensatz herunterzuladen, verwenden Sie diesen Code-Schnipsel:
!rm images.tar.gz
```
**Hinweis:** Die Bilder des Oxford-IIIT Pet Dataset sind nach Dateinamen organisiert (z. B. `Abyssinian_1.jpg`, `Bengal_2.jpg`). Das Notebook enthält Code, um diese Bilder in rassespezifische Unterverzeichnisse zu organisieren, um die Klassifikation zu erleichtern.
## Start-Notebook
Beginnen Sie das Labor, indem Sie [PetFaces.ipynb](../../../../../../lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb) öffnen.
Beginnen Sie das Labor, indem Sie [PetFaces.ipynb](PetFaces.ipynb) öffnen.
## Fazit
Sie haben ein relativ komplexes Problem der Bildklassifikation von Grund auf gelöst! Es gab eine ganze Menge Klassen, und Sie konnten trotzdem eine vernünftige Genauigkeit erreichen! Es ist auch sinnvoll, die Top-k-Genauigkeit zu messen, da es leicht ist, einige Klassen zu verwechseln, die selbst für Menschen nicht eindeutig unterschiedlich sind.
Sie haben ein relativ komplexes Problem der Bildklassifikation von Grund auf gelöst! Es gab eine Vielzahl von Klassen, und dennoch konnten Sie eine angemessene Genauigkeit erzielen! Es ist auch sinnvoll, die Top-k-Genauigkeit zu messen, da es leicht ist, einige Klassen zu verwechseln, die selbst für Menschen nicht eindeutig unterscheidbar sind.
---
**Haftungsausschluss**:
Dieses Dokument wurde mit dem KI-Übersetzungsdienst [Co-op Translator](https://github.com/Azure/co-op-translator) übersetzt. Obwohl wir uns um Genauigkeit bemühen, beachten Sie bitte, dass automatisierte Übersetzungen Fehler oder Ungenauigkeiten enthalten können. Das Originaldokument in seiner ursprünglichen Sprache sollte als maßgebliche Quelle betrachtet werden. Für kritische Informationen wird eine professionelle menschliche Übersetzung empfohlen. Wir übernehmen keine Haftung für Missverständnisse oder Fehlinterpretationen, die sich aus der Nutzung dieser Übersetzung ergeben.

View File

@ -4,13 +4,15 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"# Κατηγοριοποίηση Προσώπων Κατοικίδιων\n",
"# Ταξινόμηση Προσώπων Κατοικίδιων\n",
"\n",
"Εργαστηριακή Άσκηση από το [AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners).\n",
"Εργαστηριακή Εργασία από το [Πρόγραμμα Σπουδών AI για Αρχάριους](https://github.com/microsoft/ai-for-beginners).\n",
"\n",
"### Λήψη Δεδομένων\n",
"\n",
"Σε αυτή την άσκηση, θα επικεντρωθούμε σε μια σχετικά απλή εργασία κατηγοριοποίησης - την κατηγοριοποίηση προσώπων κατοικίδιων. Αυτό το σύνολο δεδομένων αποτελείται από αποκομμένα πρόσωπα από το [Oxford-IIIT Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/). Ας ξεκινήσουμε φορτώνοντας και οπτικοποιώντας το σύνολο δεδομένων.\n"
"Σε αυτή την εργασία, θα επικεντρωθούμε σε μια σχετικά απλή εργασία ταξινόμησης - την ταξινόμηση προσώπων κατοικίδιων. Θα χρησιμοποιήσουμε το [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), το οποίο περιέχει εικόνες από 37 διαφορετικές ράτσες σκύλων και γατών. Ας ξεκινήσουμε με τη λήψη και την οπτικοποίηση του συνόλου δεδομένων.\n",
"\n",
"**Σημείωση:** Το Oxford-IIIT Pet Dataset περιέχει πλήρεις εικόνες κατοικίδιων. Οι εικόνες θα οργανωθούν ανά ράτσα στον εξαγόμενο φάκελο.\n"
]
},
{
@ -46,7 +48,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Θα ορίσουμε μια γενική συνάρτηση για την εμφάνιση μιας σειράς εικόνων από μια λίστα:\n"
"Θα ορίσουμε μια γενική συνάρτηση για να εμφανίσουμε μια σειρά εικόνων από μια λίστα:\n"
]
},
{
@ -77,7 +79,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Τώρα ας διασχίσουμε όλους τους υποκαταλόγους της κατηγορίας και να σχεδιάσουμε τις πρώτες λίγες εικόνες κάθε κατηγορίας:\n"
"Τώρα ας διασχίσουμε όλους τους υποκαταλόγους των κλάσεων και να σχεδιάσουμε τις πρώτες εικόνες κάθε κλάσης:\n"
]
},
{
@ -86,6 +88,24 @@
"metadata": {},
"outputs": [],
"source": [
"# Note: The Oxford-IIIT Pet Dataset extracts to a folder named 'images'\n",
"# Images are named by breed (e.g., 'Abyssinian_1.jpg')\n",
"# We need to organize them into breed-specific subdirectories\n",
"import os\n",
"from collections import defaultdict\n",
"\n",
"# Organize images by breed\n",
"if not os.path.exists('petfaces'):\n",
" os.makedirs('petfaces')\n",
" for img_file in os.listdir('images'):\n",
" if img_file.endswith(('.jpg', '.png')):\n",
" # Extract breed name from filename (everything before the last underscore and number)\n",
" breed = '_'.join(img_file.split('_')[:-1])\n",
" breed_dir = os.path.join('petfaces', breed)\n",
" if not os.path.exists(breed_dir):\n",
" os.makedirs(breed_dir)\n",
" os.rename(os.path.join('images', img_file), os.path.join(breed_dir, img_file))\n",
"\n",
"for cls in os.listdir('petfaces'):\n",
" print(cls)\n",
" display_images([Image.open(os.path.join('petfaces',cls,x)) \n",
@ -130,7 +150,7 @@
"* Στο Tensorflow, χρησιμοποιήστε `tf.keras.preprocessing.image_dataset_from_directory`\n",
"* Στο PyTorch, χρησιμοποιήστε `torchvision.datasets.ImageFolder`\n",
"\n",
"Όπως είδατε από τις παραπάνω εικόνες, όλες έχουν αναλογία διαστάσεων κοντά σε τετράγωνο, οπότε πρέπει να αλλάξουμε το μέγεθος όλων των εικόνων σε τετράγωνο μέγεθος. Επίσης, μπορούμε να οργανώσουμε τις εικόνες σε minibatches.\n"
"Όπως έχετε δει από τις παραπάνω εικόνες, όλες έχουν αναλογία κοντά σε τετράγωνο, οπότε πρέπει να αλλάξουμε το μέγεθος όλων των εικόνων σε τετράγωνο μέγεθος. Επίσης, μπορούμε να οργανώσουμε τις εικόνες σε μικροπαρτίδες.\n"
]
},
{
@ -146,7 +166,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Τώρα πρέπει να διαχωρίσουμε το σύνολο δεδομένων σε τμήματα εκπαίδευσης και δοκιμής:\n"
"Τώρα πρέπει να χωρίσουμε το σύνολο δεδομένων σε τμήματα εκπαίδευσης και δοκιμής:\n"
]
},
{
@ -162,9 +182,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Τώρα ας εκτυπώσουμε το μέγεθος των tensors στο σύνολο δεδομένων μας. Εάν έχετε κάνει τα πάντα σωστά, το μέγεθος των στοιχείων εκπαίδευσης θα πρέπει να είναι\n",
" * `(batch_size,image_size,image_size,3)` για το Tensorflow, `batch_size,3,image_size,image_size` για το PyTorch\n",
" * `batch_size` για τις Ετικέτες\n",
"Τώρα ας εκτυπώσουμε το μέγεθος των tensors στο dataset μας. Εάν έχετε κάνει τα πάντα σωστά, το μέγεθος των στοιχείων εκπαίδευσης θα πρέπει να είναι\n",
" * `(batch_size,image_size,image_size,3)` για Tensorflow, `batch_size,3,image_size,image_size` για PyTorch\n",
" * `batch_size` για Ετικέτες\n",
"\n",
"Οι Ετικέτες θα πρέπει να περιέχουν αριθμούς τάξεων.\n"
]
@ -236,8 +256,8 @@
"* Ο τελικός ταξινομητής μπορεί να έχει ή να μην έχει κρυφά επίπεδα, αλλά ο αριθμός των νευρώνων εξόδου πρέπει να είναι ίσος με τον αριθμό των κατηγοριών.\n",
"\n",
"Ένα σημαντικό σημείο είναι να επιλέξετε σωστά τη συνάρτηση ενεργοποίησης στο τελευταίο επίπεδο + τη συνάρτηση απώλειας:\n",
"* Στο Tensorflow, μπορείτε να χρησιμοποιήσετε τη `softmax` ως συνάρτηση ενεργοποίησης και τη `sparse_categorical_crossentropy` ως συνάρτηση απώλειας. Η διαφορά μεταξύ της sparse categorical cross-entropy και της μη sparse είναι ότι η πρώτη αναμένει την έξοδο ως αριθμό κατηγορίας και όχι ως one-hot vector.\n",
"* Στο PyTorch, μπορείτε να έχετε το τελευταίο επίπεδο χωρίς συνάρτηση ενεργοποίησης και να χρησιμοποιήσετε τη συνάρτηση απώλειας `CrossEntropyLoss`. Αυτή η συνάρτηση εφαρμόζει αυτόματα τη softmax.\n"
"* Στο Tensorflow, μπορείτε να χρησιμοποιήσετε το `softmax` ως συνάρτηση ενεργοποίησης και το `sparse_categorical_crossentropy` ως συνάρτηση απώλειας. Η διαφορά μεταξύ της sparse categorical cross-entropy και της μη sparse είναι ότι η πρώτη αναμένει την έξοδο ως αριθμό κατηγορίας και όχι ως one-hot vector.\n",
"* Στο PyTorch, μπορείτε να έχετε το τελευταίο επίπεδο χωρίς συνάρτηση ενεργοποίησης και να χρησιμοποιήσετε τη συνάρτηση απώλειας `CrossEntropyLoss`. Αυτή η συνάρτηση εφαρμόζει αυτόματα το softmax.\n"
]
},
{
@ -255,9 +275,9 @@
"source": [
"## Εκπαίδευση του Νευρωνικού Δικτύου\n",
"\n",
"Τώρα είμαστε έτοιμοι να εκπαιδεύσουμε το νευρωνικό δίκτυο. Κατά τη διάρκεια της εκπαίδευσης, παρακαλώ συλλέξτε την ακρίβεια στα δεδομένα εκπαίδευσης και δοκιμής σε κάθε εποχή και στη συνέχεια σχεδιάστε την ακρίβεια για να δείτε αν υπάρχει υπερεκπαίδευση.\n",
"Τώρα είμαστε έτοιμοι να εκπαιδεύσουμε το νευρωνικό δίκτυο. Κατά τη διάρκεια της εκπαίδευσης, παρακαλώ συλλέξτε την ακρίβεια στα δεδομένα εκπαίδευσης και δοκιμής σε κάθε εποχή και στη συνέχεια σχεδιάστε την ακρίβεια για να δείτε αν υπάρχει υπερπροσαρμογή.\n",
"\n",
"> Για να επιταχύνετε την εκπαίδευση, πρέπει να χρησιμοποιήσετε GPU αν είναι διαθέσιμη. Ενώ το TensorFlow/Keras θα χρησιμοποιήσει αυτόματα την GPU, στο PyTorch πρέπει να μεταφέρετε τόσο το μοντέλο όσο και τα δεδομένα στη GPU κατά την εκπαίδευση χρησιμοποιώντας τη μέθοδο `.to()` για να εκμεταλλευτείτε την επιτάχυνση της GPU.\n"
"> Για να επιταχύνετε την εκπαίδευση, πρέπει να χρησιμοποιήσετε GPU αν είναι διαθέσιμη. Ενώ το TensorFlow/Keras θα χρησιμοποιήσει αυτόματα GPU, στο PyTorch πρέπει να μετακινήσετε τόσο το μοντέλο όσο και τα δεδομένα στη GPU κατά τη διάρκεια της εκπαίδευσης χρησιμοποιώντας τη μέθοδο `.to()` για να εκμεταλλευτείτε την επιτάχυνση της GPU.\n"
]
},
{
@ -295,20 +315,20 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Τι μπορούμε να πούμε για την υπερπροσαρμογή; Τι μπορεί να γίνει για να βελτιωθεί η ακρίβεια του μοντέλου;\n",
"Τι μπορείτε να πείτε για την υπερπροσαρμογή; Τι μπορεί να γίνει για να βελτιωθεί η ακρίβεια του μοντέλου;\n",
"\n",
"## Προαιρετικό: Υπολογισμός Top3 Ακρίβειας\n",
"## Προαιρετικό: Υπολογισμός Top-3 Ακρίβειας\n",
"\n",
"Σε αυτή την άσκηση, ασχοληθήκαμε με ταξινόμηση που περιλαμβάνει αρκετά μεγάλο αριθμό κατηγοριών (35), οπότε το αποτέλεσμα μας - περίπου 50% ακρίβεια επικύρωσης - είναι αρκετά καλό. Το τυπικό σύνολο δεδομένων ImageNet έχει ακόμη περισσότερες - 1000 κατηγορίες.\n",
"\n",
"Σε τέτοιες περιπτώσεις είναι δύσκολο να διασφαλιστεί ότι το μοντέλο **πάντα** προβλέπει σωστά την κατηγορία. Υπάρχουν περιπτώσεις όπου δύο φυλές είναι πολύ παρόμοιες μεταξύ τους, και το μοντέλο επιστρέφει πολύ παρόμοιες πιθανότητες (π.χ., 0.45 και 0.43). Αν μετρήσουμε την τυπική ακρίβεια, αυτό θα θεωρηθεί λάθος περίπτωση, παρόλο που το μοντέλο έκανε πολύ μικρό λάθος. Για αυτό, συχνά μετράμε μια άλλη μέτρηση - την ακρίβεια μέσα στις τρεις πιο πιθανές προβλέψεις του μοντέλου.\n",
"Σε τέτοιες περιπτώσεις είναι δύσκολο να διασφαλιστεί ότι το μοντέλο **πάντα** προβλέπει σωστά την κατηγορία. Υπάρχουν περιπτώσεις όπου δύο φυλές είναι πολύ παρόμοιες μεταξύ τους, και το μοντέλο επιστρέφει πολύ κοντινές πιθανότητες (π.χ., 0.45 και 0.43). Εάν μετρήσουμε την τυπική ακρίβεια, αυτό θα θεωρηθεί λάθος περίπτωση, παρόλο που το μοντέλο έκανε πολύ μικρό λάθος. Γι' αυτό, συχνά μετράμε μια άλλη μέτρηση - την ακρίβεια μέσα στις τρεις πιο πιθανές προβλέψεις του μοντέλου.\n",
"\n",
"Θεωρούμε την περίπτωση ακριβή αν η ετικέτα στόχου περιλαμβάνεται στις τρεις κορυφαίες προβλέψεις του μοντέλου.\n",
"\n",
"Για να υπολογίσετε την top-3 ακρίβεια στο σύνολο δεδομένων δοκιμής, πρέπει να περάσετε χειροκίνητα από το σύνολο δεδομένων, να εφαρμόσετε το νευρωνικό δίκτυο για να πάρετε την πρόβλεψη, και στη συνέχεια να κάνετε τους υπολογισμούς. Μερικές συμβουλές:\n",
"\n",
"* Στο Tensorflow, χρησιμοποιήστε τη συνάρτηση `tf.nn.in_top_k` για να δείτε αν οι `predictions` (έξοδος του μοντέλου) βρίσκονται στις top-k (περάστε `k=3` ως παράμετρο), σε σχέση με τους `targets`. Αυτή η συνάρτηση επιστρέφει έναν tensor με τιμές boolean, οι οποίες μπορούν να μετατραπούν σε `int` χρησιμοποιώντας το `tf.cast`, και στη συνέχεια να συσσωρευτούν χρησιμοποιώντας το `tf.reduce_sum`.\n",
"* Στο PyTorch, μπορείτε να χρησιμοποιήσετε τη συνάρτηση `torch.topk` για να πάρετε τους δείκτες των κατηγοριών με τις υψηλότερες πιθανότητες, και στη συνέχεια να δείτε αν η σωστή κατηγορία ανήκει σε αυτές. Δείτε [αυτό](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) για περισσότερες συμβουλές.\n"
"* Στο Tensorflow, χρησιμοποιήστε τη συνάρτηση `tf.nn.in_top_k` για να δείτε αν οι `predictions` (έξοδος του μοντέλου) είναι στις top-k (περάστε `k=3` ως παράμετρο), σε σχέση με τους `targets`. Αυτή η συνάρτηση επιστρέφει έναν τανυστή με τιμές boolean, που μπορούν να μετατραπούν σε `int` χρησιμοποιώντας `tf.cast`, και στη συνέχεια να συσσωρευτούν χρησιμοποιώντας `tf.reduce_sum`.\n",
"* Στο PyTorch, μπορείτε να χρησιμοποιήσετε τη συνάρτηση `torch.topk` για να πάρετε δείκτες των κατηγοριών με τις υψηλότερες πιθανότητες, και στη συνέχεια να δείτε αν η σωστή κατηγορία ανήκει σε αυτές. Δείτε [αυτό](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) για περισσότερες συμβουλές.\n"
]
},
{
@ -326,7 +346,7 @@
"source": [
"## Προαιρετικό: Δημιουργία ταξινόμησης Γάτες vs. Σκύλοι\n",
"\n",
"Θέλουμε επίσης να δούμε πόσο ακριβής θα είναι η δυαδική ταξινόμηση γάτες vs. σκύλοι στο ίδιο σύνολο δεδομένων. Για να το κάνουμε αυτό, πρέπει να προσαρμόσουμε τις ετικέτες:\n"
"Θέλουμε επίσης να δούμε πόσο ακριβής θα είναι η δυαδική ταξινόμηση γάτες vs. σκύλοι στο ίδιο σύνολο δεδομένων. Για να το κάνουμε, πρέπει να προσαρμόσουμε τις ετικέτες:\n"
]
},
{
@ -352,7 +372,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Αποποίηση Ευθύνης**: \nΑυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης AI [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτόματες μεταφράσεις ενδέχεται να περιέχουν σφάλματα ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.\n"
"\n---\n\n**Αποποίηση ευθύνης**: \nΑυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτόματες μεταφράσεις ενδέχεται να περιέχουν σφάλματα ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.\n"
]
}
],
@ -378,8 +398,8 @@
"version": "3.9.5"
},
"coopTranslator": {
"original_hash": "1de3ae931831253c3198d899da48bfe5",
"translation_date": "2025-08-29T09:45:56+00:00",
"original_hash": "df7d1f7da8d2617b76acd93115776ca4",
"translation_date": "2025-10-03T14:37:28+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb",
"language_code": "el"
}

View File

@ -1,25 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "f3d2cee9cb3c52160419e560c57a690e",
"translation_date": "2025-08-29T08:47:26+00:00",
"original_hash": "b70fcf7fcee862990f848c679090943f",
"translation_date": "2025-10-03T14:55:00+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/README.md",
"language_code": "el"
}
-->
# Κατηγοριοποίηση Προσώπων Κατοικίδιων
# Ταξινόμηση Προσώπων Κατοικίδιων
Εργαστηριακή Άσκηση από το [AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners).
Εργαστηριακή Άσκηση από το [Πρόγραμμα Σπουδών AI για Αρχάριους](https://github.com/microsoft/ai-for-beginners).
## Εργασία
Φανταστείτε ότι πρέπει να αναπτύξετε μια εφαρμογή για ένα βρεφονηπιακό σταθμό κατοικίδιων, ώστε να καταγράφετε όλα τα κατοικίδια. Μία από τις εξαιρετικές δυνατότητες μιας τέτοιας εφαρμογής θα ήταν η αυτόματη αναγνώριση της φυλής από μια φωτογραφία. Αυτό μπορεί να επιτευχθεί με επιτυχία χρησιμοποιώντας νευρωνικά δίκτυα.
Φανταστείτε ότι πρέπει να αναπτύξετε μια εφαρμογή για ένα βρεφονηπιακό σταθμό κατοικίδιων για την καταγραφή όλων των κατοικίδιων. Ένα από τα εξαιρετικά χαρακτηριστικά μιας τέτοιας εφαρμογής θα ήταν η αυτόματη αναγνώριση της φυλής από μια φωτογραφία. Αυτό μπορεί να επιτευχθεί με επιτυχία χρησιμοποιώντας νευρωνικά δίκτυα.
Πρέπει να εκπαιδεύσετε ένα συνελικτικό νευρωνικό δίκτυο για να ταξινομήσετε διαφορετικές φυλές γατών και σκύλων χρησιμοποιώντας το σύνολο δεδομένων **Pet Faces**.
## Το Σύνολο Δεδομένων
Θα χρησιμοποιήσουμε το σύνολο δεδομένων **Pet Faces**, το οποίο προέρχεται από το σύνολο δεδομένων κατοικίδιων [Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/). Περιέχει 35 διαφορετικές φυλές σκύλων και γατών.
Θα χρησιμοποιήσουμε το [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), το οποίο περιέχει εικόνες από 37 διαφορετικές φυλές σκύλων και γατών.
![Το σύνολο δεδομένων που θα χρησιμοποιήσουμε](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.el.png)
@ -31,15 +31,17 @@ CO_OP_TRANSLATOR_METADATA:
!rm images.tar.gz
```
## Έναρξη Σημειωματάριου
**Σημείωση:** Οι εικόνες του Oxford-IIIT Pet Dataset είναι οργανωμένες ανά όνομα αρχείου (π.χ., `Abyssinian_1.jpg`, `Bengal_2.jpg`). Το notebook περιλαμβάνει κώδικα για την οργάνωση αυτών των εικόνων σε υποκαταλόγους ανά φυλή για ευκολότερη ταξινόμηση.
## Ξεκινώντας το Notebook
Ξεκινήστε το εργαστήριο ανοίγοντας το [PetFaces.ipynb](PetFaces.ipynb)
## Συμπέρασμα
Έχετε λύσει ένα σχετικά πολύπλοκο πρόβλημα ταξινόμησης εικόνων από το μηδέν! Υπήρχαν αρκετές κατηγορίες, και παρόλα αυτά καταφέρατε να πετύχετε μια ικανοποιητική ακρίβεια! Επίσης, έχει νόημα να μετρήσετε την ακρίβεια top-k, καθώς είναι εύκολο να μπερδευτούν ορισμένες κατηγορίες που δεν είναι ξεκάθαρα διαφορετικές, ακόμα και για τους ανθρώπους.
Έχετε λύσει ένα σχετικά πολύπλοκο πρόβλημα ταξινόμησης εικόνων από το μηδέν! Υπήρχαν αρκετές κατηγορίες, και παρόλα αυτά καταφέρατε να πετύχετε μια ικανοποιητική ακρίβεια! Επίσης, έχει νόημα να μετρήσετε την ακρίβεια top-k, επειδή είναι εύκολο να μπερδευτούν ορισμένες κατηγορίες που δεν είναι ξεκάθαρα διαφορετικές ακόμα και για τους ανθρώπους.
---
**Αποποίηση Ευθύνης**:
Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτόματες μεταφράσεις ενδέχεται να περιέχουν σφάλματα ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.
**Αποποίηση ευθύνης**:
Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτόματες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.

View File

@ -10,7 +10,9 @@
"\n",
"### Getting the Data\n",
"\n",
"In this assignment, we will focus on a relatively simple classification task: classifying pet faces. This dataset consists of cropped faces from the [Oxford-IIIT Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/). Let's begin by loading and visualizing the dataset.\n"
"In this assignment, we will focus on a relatively simple classification task: classifying pet faces. We will use the [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), which includes images of 37 different breeds of dogs and cats. Let's begin by downloading and visualizing the dataset.\n",
"\n",
"**Note:** The Oxford-IIIT Pet Dataset contains full images of pets. The images will be organized by breed in the extracted folder.\n"
]
},
{
@ -77,7 +79,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Now let's traverse all class subdirectories and plot first few images of each class:\n"
"Now let's traverse all class subdirectories and plot the first few images of each class:\n"
]
},
{
@ -86,6 +88,24 @@
"metadata": {},
"outputs": [],
"source": [
"# Note: The Oxford-IIIT Pet Dataset extracts to a folder named 'images'\n",
"# Images are named by breed (e.g., 'Abyssinian_1.jpg')\n",
"# We need to organize them into breed-specific subdirectories\n",
"import os\n",
"from collections import defaultdict\n",
"\n",
"# Organize images by breed\n",
"if not os.path.exists('petfaces'):\n",
" os.makedirs('petfaces')\n",
" for img_file in os.listdir('images'):\n",
" if img_file.endswith(('.jpg', '.png')):\n",
" # Extract breed name from filename (everything before the last underscore and number)\n",
" breed = '_'.join(img_file.split('_')[:-1])\n",
" breed_dir = os.path.join('petfaces', breed)\n",
" if not os.path.exists(breed_dir):\n",
" os.makedirs(breed_dir)\n",
" os.rename(os.path.join('images', img_file), os.path.join(breed_dir, img_file))\n",
"\n",
"for cls in os.listdir('petfaces'):\n",
" print(cls)\n",
" display_images([Image.open(os.path.join('petfaces',cls,x)) \n",
@ -126,11 +146,11 @@
"source": [
"## Preparing dataset for Deep Learning\n",
"\n",
"To begin training our neural network, we need to convert all images into tensors, as well as create tensors for the labels (class numbers). Most neural network frameworks provide straightforward tools for working with images:\n",
"To begin training our neural network, we need to convert all images into tensors and also create tensors corresponding to labels (class numbers). Most neural network frameworks provide straightforward tools for working with images:\n",
"* In Tensorflow, use `tf.keras.preprocessing.image_dataset_from_directory`\n",
"* In PyTorch, use `torchvision.datasets.ImageFolder`\n",
"\n",
"As you may have noticed from the images above, they all have a nearly square aspect ratio, so we need to resize all images to a square format. Additionally, we can group images into minibatches.\n"
"As observed in the images above, most of them have a nearly square aspect ratio, so we need to resize all images to a square format. Additionally, we can organize the images into minibatches.\n"
]
},
{
@ -146,7 +166,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we need to separate dataset into train and test portions:\n"
"Now we need to separate the dataset into train and test portions:\n"
]
},
{
@ -162,11 +182,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Now let's display the size of the tensors in our dataset. If everything has been set up correctly, the size of the training elements should be:\n",
" * `(batch_size, image_size, image_size, 3)` for TensorFlow, `batch_size, 3, image_size, image_size` for PyTorch\n",
"Now let's display the size of the tensors in our dataset. If everything has been implemented correctly, the size of the training elements should be:\n",
" * `(batch_size,image_size,image_size,3)` for TensorFlow, `batch_size,3,image_size,image_size` for PyTorch\n",
" * `batch_size` for Labels\n",
"\n",
"Labels should represent the class numbers.\n"
"Labels should consist of class numbers.\n"
]
},
{
@ -230,14 +250,14 @@
"source": [
"## Define a neural network\n",
"\n",
"For image classification, you should probably define a convolutional neural network with several layers. Things to keep in mind:\n",
"* Remember the pyramid architecture, meaning the number of filters should increase as you go deeper.\n",
"* Dont forget to include activation functions (ReLU) and Max Pooling between layers.\n",
"For image classification, it's recommended to define a convolutional neural network with multiple layers. Key points to consider:\n",
"* Follow the pyramid architecture, meaning the number of filters should increase as the network goes deeper.\n",
"* Don't forget to include activation functions (ReLU) between layers and Max Pooling.\n",
"* The final classifier can include hidden layers or not, but the number of output neurons must match the number of classes.\n",
"\n",
"Its crucial to correctly set the activation function for the last layer and the loss function:\n",
"* In TensorFlow, you can use `softmax` as the activation function and `sparse_categorical_crossentropy` as the loss function. The difference between sparse categorical cross-entropy and the non-sparse version is that the former expects the output as a class number, not as a one-hot vector.\n",
"* In PyTorch, you can leave the final layer without an activation function and use the `CrossEntropyLoss` loss function. This function automatically applies softmax.\n"
"It's crucial to correctly set the activation function for the last layer and the loss function:\n",
"* In TensorFlow, you can use `softmax` as the activation function and `sparse_categorical_crossentropy` as the loss function. The difference between sparse categorical cross-entropy and the non-sparse version is that the sparse one expects the output as a class index rather than a one-hot vector.\n",
"* In PyTorch, the final layer can omit the activation function, and you can use the `CrossEntropyLoss` loss function. This function automatically applies softmax.\n"
]
},
{
@ -255,9 +275,9 @@
"source": [
"## Train the Neural Network\n",
"\n",
"Now we are ready to train the neural network. During training, make sure to collect accuracy on both the training and test data for each epoch, and then plot the accuracy to check for signs of overfitting.\n",
"Now we are ready to train the neural network. During training, make sure to record the accuracy on both the training and test data for each epoch, and then plot the accuracy to check for signs of overfitting.\n",
"\n",
"> To speed up training, you should use a GPU if one is available. While TensorFlow/Keras will automatically utilize the GPU, in PyTorch you need to explicitly move both the model and the data to the GPU during training using the `.to()` method to benefit from GPU acceleration.\n"
"> To accelerate training, use a GPU if available. While TensorFlow/Keras automatically utilizes the GPU, in PyTorch you need to explicitly move both the model and the data to the GPU during training using the `.to()` method to benefit from GPU acceleration.\n"
]
},
{
@ -299,16 +319,16 @@
"\n",
"## Optional: Calculate Top3 Accuracy\n",
"\n",
"In this exercise, we were working on a classification problem with a relatively high number of classes (35), so achieving around 50% validation accuracy is quite good. The standard ImageNet dataset has even more classes—1000.\n",
"In this exercise, we were working on classification with a relatively high number of classes (35), so our result—around 50% validation accuracy—is quite good. The standard ImageNet dataset has even more classes—1000.\n",
"\n",
"In such scenarios, it is challenging to ensure that the model **always** predicts the correct class. There are situations where two breeds are very similar, and the model outputs probabilities that are close to each other (e.g., 0.45 and 0.43). If we measure standard accuracy, this would be considered an incorrect prediction, even though the model made only a minor error. For this reason, we often use another metric: accuracy within the top 3 most probable predictions of the model.\n",
"\n",
"We consider a prediction correct if the target label is included in the top 3 predictions made by the model.\n",
"We consider a prediction accurate if the target label is included in the top 3 predictions made by the model.\n",
"\n",
"To calculate top-3 accuracy on the test dataset, you need to manually iterate through the dataset, apply the neural network to generate predictions, and then perform the calculations. Here are some tips:\n",
"To compute top-3 accuracy on the test dataset, you need to manually iterate through the dataset, apply the neural network to generate predictions, and then perform the calculations. Here are some tips:\n",
"\n",
"* In TensorFlow, use the `tf.nn.in_top_k` function to check if the `predictions` (model output) are within the top-k (set `k=3` as the parameter) relative to the `targets`. This function returns a tensor of boolean values, which can be converted to `int` using `tf.cast` and then summed using `tf.reduce_sum`.\n",
"* In PyTorch, you can use the `torch.topk` function to obtain the indices of the classes with the highest probabilities and then check if the correct class is among them. Refer to [this](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) for additional guidance.\n"
"* In TensorFlow, use the `tf.nn.in_top_k` function to check whether the `predictions` (the model's output) are within the top-k (set `k=3` as the parameter) relative to the `targets`. This function returns a tensor of boolean values, which can be converted to `int` using `tf.cast` and then summed using `tf.reduce_sum`.\n",
"* In PyTorch, you can use the `torch.topk` function to obtain the indices of the classes with the highest probabilities and then check whether the correct class is among them. Refer to [this](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) for additional guidance.\n"
]
},
{
@ -324,9 +344,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## Optional: Build Cats vs. Dogs classification\n",
"## Optional: Build Cats vs. Dogs Classification\n",
"\n",
"We also want to evaluate how accurate our binary classification of cats vs. dogs would be on the same dataset. To do this, we need to modify the labels:\n"
"We also want to evaluate the accuracy of our binary classification for cats vs. dogs using the same dataset. To do this, we need to modify the labels:\n"
]
},
{
@ -352,7 +372,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Disclaimer**: \nThis document has been translated using the AI translation service [Co-op Translator](https://github.com/Azure/co-op-translator). While we aim for accuracy, please note that automated translations may include errors or inaccuracies. The original document in its native language should be regarded as the authoritative source. For critical information, professional human translation is advised. We are not responsible for any misunderstandings or misinterpretations resulting from the use of this translation.\n"
"\n---\n\n**Disclaimer**: \nThis document has been translated using the AI translation service [Co-op Translator](https://github.com/Azure/co-op-translator). While we aim for accuracy, please note that automated translations may contain errors or inaccuracies. The original document in its native language should be regarded as the authoritative source. For critical information, professional human translation is recommended. We are not responsible for any misunderstandings or misinterpretations resulting from the use of this translation.\n"
]
}
],
@ -378,8 +398,8 @@
"version": "3.9.5"
},
"coopTranslator": {
"original_hash": "1de3ae931831253c3198d899da48bfe5",
"translation_date": "2025-08-31T18:10:12+00:00",
"original_hash": "df7d1f7da8d2617b76acd93115776ca4",
"translation_date": "2025-10-03T14:24:09+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb",
"language_code": "en"
}

View File

@ -1,8 +1,8 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "f3d2cee9cb3c52160419e560c57a690e",
"translation_date": "2025-08-31T17:36:39+00:00",
"original_hash": "b70fcf7fcee862990f848c679090943f",
"translation_date": "2025-10-03T14:51:38+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/README.md",
"language_code": "en"
}
@ -13,13 +13,13 @@ Lab Assignment from [AI for Beginners Curriculum](https://github.com/microsoft/a
## Task
Imagine you need to develop an application for a pet nursery to catalog all pets. One of the key features of such an application would be automatically identifying the breed from a photograph. This can be effectively achieved using neural networks.
Imagine you need to develop an application for a pet nursery to catalog all pets. One of the great features of such an application would be automatically identifying the breed from a photograph. This can be successfully achieved using neural networks.
Your task is to train a convolutional neural network to classify different breeds of cats and dogs using the **Pet Faces** dataset.
## The Dataset
We will use the **Pet Faces** dataset, which is derived from the [Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/) pets dataset. It includes 35 different breeds of dogs and cats.
We will use the [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), which contains images of 37 different breeds of dogs and cats.
![Dataset we will deal with](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.en.png)
@ -31,15 +31,17 @@ To download the dataset, use this code snippet:
!rm images.tar.gz
```
**Note:** The Oxford-IIIT Pet Dataset images are organized by filename (e.g., `Abyssinian_1.jpg`, `Bengal_2.jpg`). The notebook includes code to organize these images into breed-specific subdirectories for easier classification.
## Starting Notebook
Begin the lab by opening [PetFaces.ipynb](PetFaces.ipynb)
## Takeaway
You have tackled a fairly complex problem of image classification from scratch! Despite the large number of classes, you were able to achieve reasonable accuracy! Its also a good idea to measure top-k accuracy, as some classes can be easily confused, even by humans, due to their subtle differences.
You have tackled a relatively complex problem of image classification from scratch! Despite the large number of classes, you were able to achieve reasonable accuracy! Its also a good idea to measure top-k accuracy, as some classes can be easily confused, even by humans, due to their similarities.
---
**Disclaimer**:
This document has been translated using the AI translation service [Co-op Translator](https://github.com/Azure/co-op-translator). While we aim for accuracy, please note that automated translations may include errors or inaccuracies. The original document in its native language should be regarded as the authoritative source. For critical information, professional human translation is advised. We are not responsible for any misunderstandings or misinterpretations resulting from the use of this translation.
This document has been translated using the AI translation service [Co-op Translator](https://github.com/Azure/co-op-translator). While we strive for accuracy, please note that automated translations may contain errors or inaccuracies. The original document in its native language should be considered the authoritative source. For critical information, professional human translation is recommended. We are not liable for any misunderstandings or misinterpretations arising from the use of this translation.

View File

@ -4,13 +4,15 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"# Clasificación de Caras de Mascotas\n",
"# Clasificación de caras de mascotas\n",
"\n",
"Tarea de laboratorio del [Currículo de AI para Principiantes](https://github.com/microsoft/ai-for-beginners).\n",
"Asignación de laboratorio del [Currículo de IA para principiantes](https://github.com/microsoft/ai-for-beginners).\n",
"\n",
"### Obteniendo los Datos\n",
"### Obteniendo los datos\n",
"\n",
"En esta tarea, nos centraremos en una tarea de clasificación relativamente simple: la clasificación de caras de mascotas. Este conjunto de datos consiste en recortes de caras del [Conjunto de Datos Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/). Comencemos cargando y visualizando el conjunto de datos.\n"
"En esta asignación, nos centraremos en una tarea de clasificación relativamente sencilla: la clasificación de caras de mascotas. Utilizaremos el [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), que contiene imágenes de 37 razas diferentes de perros y gatos. Comencemos descargando y visualizando el conjunto de datos.\n",
"\n",
"**Nota:** El Oxford-IIIT Pet Dataset contiene imágenes completas de mascotas. Las imágenes estarán organizadas por raza en la carpeta extraída.\n"
]
},
{
@ -86,6 +88,24 @@
"metadata": {},
"outputs": [],
"source": [
"# Note: The Oxford-IIIT Pet Dataset extracts to a folder named 'images'\n",
"# Images are named by breed (e.g., 'Abyssinian_1.jpg')\n",
"# We need to organize them into breed-specific subdirectories\n",
"import os\n",
"from collections import defaultdict\n",
"\n",
"# Organize images by breed\n",
"if not os.path.exists('petfaces'):\n",
" os.makedirs('petfaces')\n",
" for img_file in os.listdir('images'):\n",
" if img_file.endswith(('.jpg', '.png')):\n",
" # Extract breed name from filename (everything before the last underscore and number)\n",
" breed = '_'.join(img_file.split('_')[:-1])\n",
" breed_dir = os.path.join('petfaces', breed)\n",
" if not os.path.exists(breed_dir):\n",
" os.makedirs(breed_dir)\n",
" os.rename(os.path.join('images', img_file), os.path.join(breed_dir, img_file))\n",
"\n",
"for cls in os.listdir('petfaces'):\n",
" print(cls)\n",
" display_images([Image.open(os.path.join('petfaces',cls,x)) \n",
@ -126,9 +146,9 @@
"source": [
"## Preparando el conjunto de datos para Aprendizaje Profundo\n",
"\n",
"Para comenzar a entrenar nuestra red neuronal, necesitamos convertir todas las imágenes en tensores y también crear tensores correspondientes a las etiquetas (números de clase). La mayoría de los marcos de trabajo para redes neuronales contienen herramientas simples para trabajar con imágenes:\n",
"* En Tensorflow, utiliza `tf.keras.preprocessing.image_dataset_from_directory`\n",
"* En PyTorch, utiliza `torchvision.datasets.ImageFolder`\n",
"Para comenzar a entrenar nuestra red neuronal, necesitamos convertir todas las imágenes en tensores y también crear tensores correspondientes a las etiquetas (números de clase). La mayoría de los marcos de redes neuronales contienen herramientas simples para trabajar con imágenes:\n",
"* En Tensorflow, usa `tf.keras.preprocessing.image_dataset_from_directory`\n",
"* En PyTorch, usa `torchvision.datasets.ImageFolder`\n",
"\n",
"Como has visto en las imágenes anteriores, todas tienen una proporción cercana a la de una imagen cuadrada, por lo que necesitamos redimensionar todas las imágenes a un tamaño cuadrado. Además, podemos organizar las imágenes en minibatches.\n"
]
@ -162,11 +182,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Ahora vamos a imprimir el tamaño de los tensores en nuestro conjunto de datos. Si has hecho todo correctamente, el tamaño de los elementos de entrenamiento debería ser:\n",
"Ahora imprimamos el tamaño de los tensores en nuestro conjunto de datos. Si has hecho todo correctamente, el tamaño de los elementos de entrenamiento debería ser:\n",
" * `(batch_size,image_size,image_size,3)` para Tensorflow, `batch_size,3,image_size,image_size` para PyTorch\n",
" * `batch_size` para las etiquetas\n",
" \n",
" Las etiquetas deben contener números de clases.\n"
"\n",
"Las etiquetas deben contener números de clases.\n"
]
},
{
@ -236,7 +256,7 @@
"* El clasificador final puede tener o no capas ocultas, pero el número de neuronas de salida debe ser igual al número de clases.\n",
"\n",
"Es importante acertar con la función de activación en la última capa + la función de pérdida:\n",
"* En Tensorflow, puedes usar `softmax` como función de activación y `sparse_categorical_crossentropy` como función de pérdida. La diferencia entre la pérdida categórica cruzada dispersa y la no dispersa es que la primera espera la salida como el número de la clase, y no como un vector one-hot.\n",
"* En Tensorflow, puedes usar `softmax` como función de activación y `sparse_categorical_crossentropy` como función de pérdida. La diferencia entre la pérdida categórica cruzada dispersa y la no dispersa es que la primera espera la salida como el número de clase, y no como un vector one-hot.\n",
"* En PyTorch, puedes tener la última capa sin función de activación y usar la función de pérdida `CrossEntropyLoss`. Esta función aplica softmax automáticamente.\n"
]
},
@ -255,7 +275,7 @@
"source": [
"## Entrenar la Red Neuronal\n",
"\n",
"Ahora estamos listos para entrenar la red neuronal. Durante el entrenamiento, por favor recopila la precisión en los datos de entrenamiento y prueba en cada época, y luego grafica la precisión para verificar si hay sobreajuste.\n",
"Ahora estamos listos para entrenar la red neuronal. Durante el entrenamiento, por favor recopila la precisión en los datos de entrenamiento y prueba en cada época, y luego grafica la precisión para ver si hay sobreajuste.\n",
"\n",
"> Para acelerar el entrenamiento, necesitas usar GPU si está disponible. Mientras que TensorFlow/Keras utilizará automáticamente la GPU, en PyTorch necesitas mover tanto el modelo como los datos a la GPU durante el entrenamiento usando el método `.to()` para aprovechar la aceleración de la GPU.\n"
]
@ -297,18 +317,18 @@
"source": [
"¿Qué puedes decir sobre el sobreajuste? ¿Qué se puede hacer para mejorar la precisión del modelo?\n",
"\n",
"## Opcional: Calcular Precisión Top-3\n",
"## Opcional: Calcular la Precisión Top3\n",
"\n",
"En este ejercicio, estábamos trabajando con una clasificación que tiene un número bastante alto de clases (35), por lo que nuestro resultado - alrededor del 50% de precisión en la validación - es bastante bueno. El conjunto de datos estándar de ImageNet tiene aún más - 1000 clases.\n",
"En este ejercicio, estamos trabajando con clasificación que incluye un número bastante alto de clases (35), por lo que nuestro resultado - alrededor del 50% de precisión en la validación - es bastante bueno. El conjunto de datos estándar de ImageNet tiene aún más clases, 1000.\n",
"\n",
"En estos casos, es difícil garantizar que el modelo **siempre** prediga correctamente la clase. Hay situaciones en las que dos razas son muy similares entre sí, y el modelo devuelve probabilidades muy parecidas (por ejemplo, 0.45 y 0.43). Si medimos la precisión estándar, esto se considerará un error, aunque el modelo haya cometido un error muy pequeño. Por ello, a menudo medimos otra métrica: una precisión dentro de las 3 predicciones más probables del modelo.\n",
"En estos casos, es difícil garantizar que el modelo **siempre** prediga correctamente la clase. Hay situaciones en las que dos razas son muy similares entre sí, y el modelo devuelve probabilidades muy parecidas (por ejemplo, 0.45 y 0.43). Si medimos la precisión estándar, esto se considerará un error, aunque el modelo haya cometido un error muy pequeño. Por esta razón, a menudo medimos otra métrica: la precisión dentro de las tres predicciones más probables del modelo.\n",
"\n",
"Consideramos que el caso es preciso si la etiqueta objetivo está contenida dentro de las 3 predicciones principales del modelo.\n",
"Consideramos que el caso es preciso si la etiqueta objetivo está contenida dentro de las tres predicciones principales del modelo.\n",
"\n",
"Para calcular la precisión top-3 en el conjunto de datos de prueba, necesitas recorrer manualmente el conjunto de datos, aplicar la red neuronal para obtener la predicción y luego realizar los cálculos. Algunas pistas:\n",
"Para calcular la precisión top-3 en el conjunto de datos de prueba, necesitas revisar manualmente el conjunto de datos, aplicar la red neuronal para obtener la predicción y luego realizar los cálculos. Algunas sugerencias:\n",
"\n",
"* En Tensorflow, utiliza la función `tf.nn.in_top_k` para verificar si las `predictions` (salida del modelo) están dentro del top-k (pasa `k=3` como parámetro), con respecto a los `targets`. Esta función devuelve un tensor de valores booleanos, que se pueden convertir a `int` usando `tf.cast`, y luego acumular usando `tf.reduce_sum`.\n",
"* En PyTorch, puedes usar la función `torch.topk` para obtener los índices de las clases con mayores probabilidades, y luego verificar si la clase correcta pertenece a ellas. Consulta [esto](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) para más pistas.\n"
"* En Tensorflow, utiliza la función `tf.nn.in_top_k` para verificar si las `predictions` (salida del modelo) están dentro del top-k (pasa `k=3` como parámetro), con respecto a los `targets`. Esta función devuelve un tensor de valores booleanos, que se puede convertir a `int` usando `tf.cast`, y luego acumular utilizando `tf.reduce_sum`.\n",
"* En PyTorch, puedes usar la función `torch.topk` para obtener los índices de las clases con mayores probabilidades y luego verificar si la clase correcta pertenece a ellas. Consulta [esto](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) para más sugerencias.\n"
]
},
{
@ -352,7 +372,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Descargo de responsabilidad**: \nEste documento ha sido traducido utilizando el servicio de traducción automática [Co-op Translator](https://github.com/Azure/co-op-translator). Aunque nos esforzamos por garantizar la precisión, tenga en cuenta que las traducciones automáticas pueden contener errores o imprecisiones. El documento original en su idioma nativo debe considerarse como la fuente autorizada. Para información crítica, se recomienda una traducción profesional realizada por humanos. No nos hacemos responsables de malentendidos o interpretaciones erróneas que puedan surgir del uso de esta traducción.\n"
"\n---\n\n**Descargo de responsabilidad**: \nEste documento ha sido traducido utilizando el servicio de traducción automática [Co-op Translator](https://github.com/Azure/co-op-translator). Aunque nos esforzamos por garantizar la precisión, tenga en cuenta que las traducciones automatizadas pueden contener errores o imprecisiones. El documento original en su idioma nativo debe considerarse como la fuente autorizada. Para información crítica, se recomienda una traducción profesional realizada por humanos. No nos hacemos responsables de malentendidos o interpretaciones erróneas que puedan surgir del uso de esta traducción.\n"
]
}
],
@ -378,8 +398,8 @@
"version": "3.9.5"
},
"coopTranslator": {
"original_hash": "1de3ae931831253c3198d899da48bfe5",
"translation_date": "2025-08-31T15:54:41+00:00",
"original_hash": "df7d1f7da8d2617b76acd93115776ca4",
"translation_date": "2025-10-03T14:25:24+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb",
"language_code": "es"
}

View File

@ -1,27 +1,27 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "f3d2cee9cb3c52160419e560c57a690e",
"translation_date": "2025-08-24T09:18:20+00:00",
"original_hash": "b70fcf7fcee862990f848c679090943f",
"translation_date": "2025-10-03T14:51:55+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/README.md",
"language_code": "es"
}
-->
# Clasificación de Caras de Mascotas
Asignación de laboratorio del [Currículo de IA para Principiantes](https://github.com/microsoft/ai-for-beginners).
Asignación de laboratorio del [Currículo de AI para Principiantes](https://github.com/microsoft/ai-for-beginners).
## Tarea
Imagina que necesitas desarrollar una aplicación para una guardería de mascotas para catalogar a todas las mascotas. Una de las grandes características de dicha aplicación sería descubrir automáticamente la raza a partir de una fotografía. Esto se puede lograr con éxito utilizando redes neuronales.
Imagina que necesitas desarrollar una aplicación para una guardería de mascotas para catalogar a todas las mascotas. Una de las grandes características de dicha aplicación sería descubrir automáticamente la raza a partir de una fotografía. Esto se puede lograr exitosamente utilizando redes neuronales.
Necesitas entrenar una red neuronal convolucional para clasificar diferentes razas de gatos y perros utilizando el conjunto de datos **Pet Faces**.
## El Conjunto de Datos
Usaremos el conjunto de datos **Pet Faces**, derivado del conjunto de datos de mascotas [Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/). Contiene 35 razas diferentes de perros y gatos.
Usaremos el [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), que contiene imágenes de 37 razas diferentes de perros y gatos.
![Conjunto de datos con el que trabajaremos](../../../../../../lessons/4-ComputerVision/07-ConvNets/lab/images/data.png)
![Conjunto de datos con el que trabajaremos](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.es.png)
Para descargar el conjunto de datos, utiliza este fragmento de código:
@ -31,13 +31,17 @@ Para descargar el conjunto de datos, utiliza este fragmento de código:
!rm images.tar.gz
```
## Cuaderno Inicial
**Nota:** Las imágenes del Oxford-IIIT Pet Dataset están organizadas por nombre de archivo (por ejemplo, `Abyssinian_1.jpg`, `Bengal_2.jpg`). El notebook incluye código para organizar estas imágenes en subdirectorios específicos de razas para facilitar la clasificación.
Comienza el laboratorio abriendo [PetFaces.ipynb](../../../../../../lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb)
## Notebook Inicial
Comienza el laboratorio abriendo [PetFaces.ipynb](PetFaces.ipynb)
## Conclusión
¡Has resuelto un problema relativamente complejo de clasificación de imágenes desde cero! Había bastantes clases, y aun así lograste obtener una precisión razonable. También tiene sentido medir la precisión top-k, porque es fácil confundir algunas de las clases que no son claramente diferentes, incluso para los seres humanos.
¡Has resuelto un problema relativamente complejo de clasificación de imágenes desde cero! Había bastantes clases, y aun así lograste obtener una precisión razonable. También tiene sentido medir la precisión top-k, porque es fácil confundir algunas clases que no son claramente diferentes incluso para los seres humanos.
---
**Descargo de responsabilidad**:
Este documento ha sido traducido utilizando el servicio de traducción automática [Co-op Translator](https://github.com/Azure/co-op-translator). Si bien nos esforzamos por lograr precisión, tenga en cuenta que las traducciones automáticas pueden contener errores o imprecisiones. El documento original en su idioma nativo debe considerarse como la fuente autorizada. Para información crítica, se recomienda una traducción profesional realizada por humanos. No nos hacemos responsables de malentendidos o interpretaciones erróneas que puedan surgir del uso de esta traducción.
Este documento ha sido traducido utilizando el servicio de traducción automática [Co-op Translator](https://github.com/Azure/co-op-translator). Aunque nos esforzamos por garantizar la precisión, tenga en cuenta que las traducciones automatizadas pueden contener errores o imprecisiones. El documento original en su idioma nativo debe considerarse como la fuente autorizada. Para información crítica, se recomienda una traducción profesional realizada por humanos. No nos hacemos responsables de malentendidos o interpretaciones erróneas que puedan surgir del uso de esta traducción.

View File

@ -6,11 +6,13 @@
"source": [
"# طبقه‌بندی چهره حیوانات خانگی\n",
"\n",
"تکلیف آزمایشگاهی از [برنامه درسی هوش مصنوعی برای مبتدیان](https://github.com/microsoft/ai-for-beginners).\n",
"تکلیف آزمایشگاهی از [برنامه درسی AI برای مبتدیان](https://github.com/microsoft/ai-for-beginners).\n",
"\n",
"### دریافت داده‌ها\n",
"\n",
"در این تکلیف، ما بر روی یک وظیفه طبقه‌بندی نسبتاً ساده تمرکز خواهیم کرد - طبقه‌بندی چهره حیوانات خانگی. این مجموعه داده شامل چهره‌های برش‌خورده از [مجموعه داده آکسفورد-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/) است. بیایید با بارگذاری و بصری‌سازی مجموعه داده شروع کنیم.\n"
"در این تکلیف، ما بر روی یک وظیفه طبقه‌بندی نسبتاً ساده تمرکز خواهیم کرد - طبقه‌بندی چهره حیوانات خانگی. ما از [مجموعه داده حیوانات خانگی آکسفورد-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/) استفاده خواهیم کرد که شامل تصاویر 37 نژاد مختلف از سگ‌ها و گربه‌ها است. بیایید با دانلود و مشاهده مجموعه داده شروع کنیم.\n",
"\n",
"**توجه:** مجموعه داده حیوانات خانگی آکسفورد-IIIT شامل تصاویر کامل حیوانات خانگی است. تصاویر در پوشه استخراج‌شده بر اساس نژاد سازماندهی خواهند شد.\n"
]
},
{
@ -46,7 +48,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"ما یک تابع عمومی برای نمایش مجموعه‌ای از تصاویر از یک لیست تعریف خواهیم کرد:\n"
"ما یک تابع عمومی تعریف خواهیم کرد تا مجموعه‌ای از تصاویر را از یک لیست نمایش دهد:\n"
]
},
{
@ -86,6 +88,24 @@
"metadata": {},
"outputs": [],
"source": [
"# Note: The Oxford-IIIT Pet Dataset extracts to a folder named 'images'\n",
"# Images are named by breed (e.g., 'Abyssinian_1.jpg')\n",
"# We need to organize them into breed-specific subdirectories\n",
"import os\n",
"from collections import defaultdict\n",
"\n",
"# Organize images by breed\n",
"if not os.path.exists('petfaces'):\n",
" os.makedirs('petfaces')\n",
" for img_file in os.listdir('images'):\n",
" if img_file.endswith(('.jpg', '.png')):\n",
" # Extract breed name from filename (everything before the last underscore and number)\n",
" breed = '_'.join(img_file.split('_')[:-1])\n",
" breed_dir = os.path.join('petfaces', breed)\n",
" if not os.path.exists(breed_dir):\n",
" os.makedirs(breed_dir)\n",
" os.rename(os.path.join('images', img_file), os.path.join(breed_dir, img_file))\n",
"\n",
"for cls in os.listdir('petfaces'):\n",
" print(cls)\n",
" display_images([Image.open(os.path.join('petfaces',cls,x)) \n",
@ -130,7 +150,7 @@
"* در Tensorflow، از `tf.keras.preprocessing.image_dataset_from_directory` استفاده کنید\n",
"* در PyTorch، از `torchvision.datasets.ImageFolder` استفاده کنید\n",
"\n",
"همان‌طور که از تصاویر بالا مشاهده کردید، نسبت همه آن‌ها نزدیک به مربع است، بنابراین باید تمام تصاویر را به اندازه مربع تغییر دهیم. همچنین می‌توانیم تصاویر را در دسته‌های کوچک سازماندهی کنیم.\n"
"همان‌طور که از تصاویر بالا مشاهده کردید، همه آن‌ها نسبت تصویری نزدیک به مربع دارند، بنابراین باید تمام تصاویر را به اندازه مربع تغییر دهیم. همچنین می‌توانیم تصاویر را در مینی‌بچ‌ها سازماندهی کنیم.\n"
]
},
{
@ -146,7 +166,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"اکنون باید مجموعه داده را به بخش‌های آموزش و آزمایش تقسیم کنیم:\n"
"حالا باید مجموعه داده را به بخش‌های آموزش و آزمون تقسیم کنیم:\n"
]
},
{
@ -166,7 +186,7 @@
" * `(batch_size,image_size,image_size,3)` برای Tensorflow، `batch_size,3,image_size,image_size` برای PyTorch\n",
" * `batch_size` برای برچسب‌ها\n",
"\n",
"برچسب‌ها باید شامل شماره‌های کلاس‌ها باشند.\n"
"برچسب‌ها باید شامل اعداد کلاس‌ها باشند.\n"
]
},
{
@ -230,12 +250,12 @@
"source": [
"## تعریف یک شبکه عصبی\n",
"\n",
"برای دسته‌بندی تصاویر، احتمالاً باید یک شبکه عصبی کانولوشنی با چندین لایه تعریف کنید. نکاتی که باید به آن توجه کنید:\n",
"* معماری هرمی را در نظر داشته باشید، یعنی تعداد فیلترها باید با عمیق‌تر شدن افزایش یابد.\n",
"برای طبقه‌بندی تصاویر، بهتر است یک شبکه عصبی کانولوشنی با چندین لایه تعریف کنید. نکاتی که باید به آن توجه کنید:\n",
"* معماری هرمی را در نظر داشته باشید، یعنی تعداد فیلترها باید با عمیق‌تر شدن لایه‌ها افزایش یابد.\n",
"* فراموش نکنید که بین لایه‌ها از توابع فعال‌سازی (مانند ReLU) و Max Pooling استفاده کنید.\n",
"* طبقه‌بند نهایی می‌تواند با یا بدون لایه‌های مخفی باشد، اما تعداد نورون‌های خروجی باید برابر با تعداد کلاس‌ها باشد.\n",
"\n",
"یک نکته مهم این است که تابع فعال‌سازی در لایه آخر و تابع خطا را به درستی انتخاب کنید:\n",
"یک نکته مهم این است که تابع فعال‌سازی در لایه آخر و همچنین تابع خطا را به درستی انتخاب کنید:\n",
"* در Tensorflow، می‌توانید از `softmax` به عنوان تابع فعال‌سازی و از `sparse_categorical_crossentropy` به عنوان تابع خطا استفاده کنید. تفاوت بین sparse categorical cross-entropy و نوع غیر sparse آن این است که اولی خروجی را به صورت شماره کلاس انتظار دارد، نه به صورت بردار one-hot.\n",
"* در PyTorch، می‌توانید لایه آخر را بدون تابع فعال‌سازی داشته باشید و از تابع خطای `CrossEntropyLoss` استفاده کنید. این تابع به صورت خودکار softmax را اعمال می‌کند.\n"
]
@ -255,9 +275,9 @@
"source": [
"## آموزش شبکه عصبی\n",
"\n",
"اکنون آماده‌ایم تا شبکه عصبی را آموزش دهیم. در طول آموزش، لطفاً دقت (accuracy) داده‌های آموزشی و آزمایشی را در هر دوره (epoch) جمع‌آوری کرده و سپس دقت را رسم کنید تا بررسی کنید آیا بیش‌برازش (overfitting) رخ داده است یا خیر.\n",
"اکنون آماده‌ایم تا شبکه عصبی را آموزش دهیم. در طول آموزش، لطفاً دقت (accuracy) داده‌های آموزش و تست را در هر دوره (epoch) جمع‌آوری کنید و سپس دقت را رسم کنید تا بررسی کنید آیا بیش‌برازش (overfitting) رخ داده است یا خیر.\n",
"\n",
"> برای سرعت بخشیدن به فرآیند آموزش، در صورت امکان باید از GPU استفاده کنید. در حالی که TensorFlow/Keras به‌طور خودکار از GPU استفاده می‌کند، در PyTorch باید هم مدل و هم داده‌ها را در طول آموزش با استفاده از متد `.to()` به GPU منتقل کنید تا از شتاب GPU بهره‌مند شوید.\n"
"> برای افزایش سرعت آموزش، باید از GPU استفاده کنید اگر در دسترس باشد. در حالی که TensorFlow/Keras به طور خودکار از GPU استفاده می‌کند، در PyTorch باید هم مدل و هم داده‌ها را در طول آموزش با استفاده از متد `.to()` به GPU منتقل کنید تا از شتاب GPU بهره‌مند شوید.\n"
]
},
{
@ -299,16 +319,16 @@
"\n",
"## اختیاری: محاسبه دقت Top3\n",
"\n",
"در این تمرین، با مسئله دسته‌بندی با تعداد نسبتاً زیادی کلاس (۳۵ کلاس) سروکار داشتیم، بنابراین نتیجه ما - حدود ۵۰٪ دقت اعتبارسنجی - کاملاً خوب است. مجموعه داده استاندارد ImageNet حتی تعداد بیشتری کلاس دارد - ۱۰۰۰ کلاس.\n",
"در این تمرین، ما با دسته‌بندی با تعداد نسبتاً زیادی کلاس (35 کلاس) سروکار داشتیم، بنابراین نتیجه ما - حدود 50% دقت اعتبارسنجی - کاملاً خوب است. مجموعه داده استاندارد ImageNet حتی بیشتر از این دارد - 1000 کلاس.\n",
"\n",
"در چنین مواردی، دشوار است که اطمینان حاصل شود مدل **همیشه** کلاس درست را پیش‌بینی می‌کند. مواردی وجود دارد که دو نژاد بسیار شبیه به یکدیگر هستند و مدل احتمال‌های بسیار مشابهی را برمی‌گرداند (مثلاً ۰.۴۵ و ۰.۴۳). اگر دقت استاندارد را اندازه‌گیری کنیم، این مورد به عنوان یک خطا در نظر گرفته می‌شود، حتی اگر مدل اشتباه بسیار کوچکی کرده باشد. به همین دلیل، اغلب معیار دیگری را اندازه‌گیری می‌کنیم - دقت در میان سه پیش‌بینی محتمل‌ترین مدل.\n",
"در چنین مواردی، دشوار است که اطمینان حاصل شود مدل **همیشه** کلاس را به درستی پیش‌بینی می‌کند. مواردی وجود دارد که دو نژاد بسیار شبیه به یکدیگر هستند و مدل احتمال‌های بسیار مشابهی را بازمی‌گرداند (مثلاً 0.45 و 0.43). اگر دقت استاندارد را اندازه‌گیری کنیم، این مورد به عنوان یک خطا در نظر گرفته می‌شود، حتی اگر مدل اشتباه بسیار کوچکی کرده باشد. به همین دلیل، اغلب معیار دیگری را اندازه‌گیری می‌کنیم - دقت در میان سه پیش‌بینی محتمل‌ترین مدل.\n",
"\n",
"ما مورد را دقیق در نظر می‌گیریم اگر برچسب هدف در میان سه پیش‌بینی برتر مدل باشد.\n",
"\n",
"برای محاسبه دقت Top-3 در مجموعه داده آزمایشی، باید به صورت دستی مجموعه داده را مرور کنید، شبکه عصبی را اعمال کنید تا پیش‌بینی را دریافت کنید، و سپس محاسبات را انجام دهید. چند نکته:\n",
"برای محاسبه دقت top-3 در مجموعه داده آزمایشی، باید به صورت دستی مجموعه داده را بررسی کنید، شبکه عصبی را اعمال کنید تا پیش‌بینی را دریافت کنید، و سپس محاسبات را انجام دهید. چند نکته:\n",
"\n",
"* در Tensorflow، از تابع `tf.nn.in_top_k` استفاده کنید تا ببینید آیا `predictions` (خروجی مدل) در میان k برتر هستند (پارامتر `k=3` را وارد کنید)، با توجه به `targets`. این تابع یک تنسور از مقادیر بولین برمی‌گرداند که می‌توان آن را با استفاده از `tf.cast` به `int` تبدیل کرد و سپس با استفاده از `tf.reduce_sum` جمع‌آوری کرد.\n",
"* در PyTorch، می‌توانید از تابع `torch.topk` استفاده کنید تا شاخص‌های کلاس‌هایی با بالاترین احتمال‌ها را دریافت کنید و سپس بررسی کنید که آیا کلاس درست در میان آن‌ها قرار دارد. برای نکات بیشتر، [این](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) را ببینید.\n"
"* در Tensorflow، از تابع `tf.nn.in_top_k` استفاده کنید تا ببینید آیا `predictions` (خروجی مدل) در top-k هستند (پارامتر `k=3` را وارد کنید)، با توجه به `targets`. این تابع یک تنسور از مقادیر بولین بازمی‌گرداند که می‌توان آن را با استفاده از `tf.cast` به `int` تبدیل کرد و سپس با استفاده از `tf.reduce_sum` جمع‌آوری کرد.\n",
"* در PyTorch، می‌توانید از تابع `torch.topk` استفاده کنید تا شاخص‌های کلاس‌هایی با بالاترین احتمال‌ها را دریافت کنید و سپس ببینید آیا کلاس صحیح در میان آن‌ها قرار دارد. برای نکات بیشتر، [این](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) را ببینید.\n"
]
},
{
@ -352,7 +372,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**سلب مسئولیت**: \nاین سند با استفاده از سرویس ترجمه هوش مصنوعی [Co-op Translator](https://github.com/Azure/co-op-translator) ترجمه شده است. در حالی که ما تلاش می‌کنیم دقت را حفظ کنیم، لطفاً توجه داشته باشید که ترجمه‌های خودکار ممکن است شامل خطاها یا نادرستی‌ها باشند. سند اصلی به زبان اصلی آن باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حساس، توصیه می‌شود از ترجمه حرفه‌ای انسانی استفاده کنید. ما مسئولیتی در قبال سوءتفاهم‌ها یا تفسیرهای نادرست ناشی از استفاده از این ترجمه نداریم.\n"
"\n---\n\n**سلب مسئولیت**: \nاین سند با استفاده از سرویس ترجمه هوش مصنوعی [Co-op Translator](https://github.com/Azure/co-op-translator) ترجمه شده است. در حالی که ما تلاش می‌کنیم دقت را حفظ کنیم، لطفاً توجه داشته باشید که ترجمه‌های خودکار ممکن است شامل خطاها یا نادرستی‌ها باشند. سند اصلی به زبان اصلی آن باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حساس، توصیه می‌شود از ترجمه حرفه‌ای انسانی استفاده کنید. ما مسئولیتی در قبال سوء تفاهم‌ها یا تفسیرهای نادرست ناشی از استفاده از این ترجمه نداریم.\n"
]
}
],
@ -378,8 +398,8 @@
"version": "3.9.5"
},
"coopTranslator": {
"original_hash": "1de3ae931831253c3198d899da48bfe5",
"translation_date": "2025-08-31T15:55:14+00:00",
"original_hash": "df7d1f7da8d2617b76acd93115776ca4",
"translation_date": "2025-10-03T14:27:31+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb",
"language_code": "fa"
}

View File

@ -1,27 +1,27 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "f3d2cee9cb3c52160419e560c57a690e",
"translation_date": "2025-08-24T10:30:47+00:00",
"original_hash": "b70fcf7fcee862990f848c679090943f",
"translation_date": "2025-10-03T14:52:26+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/README.md",
"language_code": "fa"
}
-->
# دسته‌بندی چهره حیوانات خانگی
# طبقه‌بندی چهره حیوانات خانگی
تکلیف آزمایشگاهی از [برنامه درسی AI برای مبتدیان](https://github.com/microsoft/ai-for-beginners).
## وظیفه
تصور کنید که باید یک برنامه برای پرورشگاه حیوانات خانگی طراحی کنید تا همه حیوانات را دسته‌بندی کند. یکی از ویژگی‌های عالی چنین برنامه‌ای می‌تواند شناسایی خودکار نژاد حیوان از یک عکس باشد. این کار با استفاده از شبکه‌های عصبی به‌خوبی قابل انجام است.
تصور کنید که باید یک برنامه برای یک مرکز نگهداری حیوانات خانگی توسعه دهید تا همه حیوانات را دسته‌بندی کند. یکی از ویژگی‌های عالی چنین برنامه‌ای می‌تواند شناسایی خودکار نژاد از طریق یک عکس باشد. این کار به‌طور موفقیت‌آمیز با استفاده از شبکه‌های عصبی قابل انجام است.
شما باید یک شبکه عصبی کانولوشن را آموزش دهید تا نژادهای مختلف گربه‌ها و سگ‌ها را با استفاده از مجموعه داده **چهره حیوانات خانگی** دسته‌بندی کند.
شما باید یک شبکه عصبی کانولوشن را آموزش دهید تا نژادهای مختلف گربه‌ها و سگ‌ها را با استفاده از مجموعه داده **چهره حیوانات خانگی** طبقه‌بندی کند.
## مجموعه داده
ما از مجموعه داده **چهره حیوانات خانگی** استفاده خواهیم کرد که از مجموعه داده حیوانات خانگی [Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/) استخراج شده است. این مجموعه شامل ۳۵ نژاد مختلف از سگ‌ها و گربه‌ها است.
ما از [مجموعه داده حیوانات خانگی آکسفورد-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/) استفاده خواهیم کرد که شامل تصاویر 37 نژاد مختلف از سگ‌ها و گربه‌ها است.
![مجموعه داده‌ای که با آن کار خواهیم کرد](../../../../../../lessons/4-ComputerVision/07-ConvNets/lab/images/data.png)
![مجموعه داده‌ای که با آن کار خواهیم کرد](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.fa.png)
برای دانلود مجموعه داده، از این قطعه کد استفاده کنید:
@ -31,13 +31,17 @@ CO_OP_TRANSLATOR_METADATA:
!rm images.tar.gz
```
## شروع دفترچه یادداشت
**توجه:** تصاویر مجموعه داده حیوانات خانگی آکسفورد-IIIT بر اساس نام فایل سازماندهی شده‌اند (مثلاً `Abyssinian_1.jpg`، `Bengal_2.jpg`). نوت‌بوک شامل کدی است که این تصاویر را به زیرشاخه‌های مربوط به نژادها سازماندهی می‌کند تا طبقه‌بندی آسان‌تر شود.
آزمایشگاه را با باز کردن [PetFaces.ipynb](../../../../../../lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb) شروع کنید.
## شروع نوت‌بوک
آزمایشگاه را با باز کردن [PetFaces.ipynb](PetFaces.ipynb) شروع کنید.
## نتیجه‌گیری
شما یک مسئله نسبتاً پیچیده دسته‌بندی تصاویر را از ابتدا حل کردید! تعداد کلاس‌ها زیاد بود، و شما همچنان توانستید به دقت قابل قبولی دست پیدا کنید! همچنین منطقی است که دقت top-k را اندازه‌گیری کنید، زیرا ممکن است برخی از کلاس‌ها که حتی برای انسان‌ها به‌وضوح متفاوت نیستند، به‌راحتی با یکدیگر اشتباه گرفته شوند.
شما یک مسئله نسبتاً پیچیده طبقه‌بندی تصویر را از ابتدا حل کردید! تعداد کلاس‌ها زیاد بود، و شما همچنان توانستید به دقت قابل قبولی دست پیدا کنید! همچنین منطقی است که دقت top-k را اندازه‌گیری کنید، زیرا برخی از کلاس‌ها که حتی برای انسان‌ها به‌وضوح متفاوت نیستند، به‌راحتی قابل اشتباه گرفتن هستند.
---
**سلب مسئولیت**:
این سند با استفاده از سرویس ترجمه هوش مصنوعی [Co-op Translator](https://github.com/Azure/co-op-translator) ترجمه شده است. در حالی که ما تلاش می‌کنیم دقت را حفظ کنیم، لطفاً توجه داشته باشید که ترجمه‌های خودکار ممکن است شامل خطاها یا نادرستی‌ها باشند. سند اصلی به زبان اصلی آن باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حیاتی، توصیه می‌شود از ترجمه حرفه‌ای انسانی استفاده کنید. ما مسئولیتی در قبال سوء تفاهم‌ها یا تفسیرهای نادرست ناشی از استفاده از این ترجمه نداریم.
این سند با استفاده از سرویس ترجمه هوش مصنوعی [Co-op Translator](https://github.com/Azure/co-op-translator) ترجمه شده است. در حالی که ما تلاش می‌کنیم دقت را حفظ کنیم، لطفاً توجه داشته باشید که ترجمه‌های خودکار ممکن است شامل خطاها یا نادرستی‌ها باشند. سند اصلی به زبان اصلی آن باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حساس، توصیه می‌شود از ترجمه حرفه‌ای انسانی استفاده کنید. ما مسئولیتی در قبال سوء تفاهم‌ها یا تفسیرهای نادرست ناشی از استفاده از این ترجمه نداریم.

View File

@ -10,7 +10,9 @@
"\n",
"### Datan hankinta\n",
"\n",
"Tässä tehtävässä keskitymme suhteellisen yksinkertaiseen luokittelutehtävään lemmikkien kasvojen luokitteluun. Tämä datasetti koostuu leikatuista kasvoista [Oxford-IIIT Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/) -aineistosta. Aloitetaan lataamalla ja visualisoimalla datasetti.\n"
"Tässä tehtävässä keskitymme suhteellisen yksinkertaiseen luokittelutehtävään - lemmikkien kasvojen luokitteluun. Käytämme [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/) -aineistoa, joka sisältää kuvia 37 eri koira- ja kissarodusta. Aloitetaan lataamalla ja visualisoimalla aineisto.\n",
"\n",
"**Huom:** Oxford-IIIT Pet Dataset sisältää kokonaisia kuvia lemmikeistä. Kuvat järjestetään roduittain puretussa kansiossa.\n"
]
},
{
@ -46,7 +48,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Määritämme yleisen funktion, joka näyttää sarjan kuvia listasta:\n"
"Määritämme yleisen funktion, joka näyttää kuvasarjan listasta:\n"
]
},
{
@ -86,6 +88,24 @@
"metadata": {},
"outputs": [],
"source": [
"# Note: The Oxford-IIIT Pet Dataset extracts to a folder named 'images'\n",
"# Images are named by breed (e.g., 'Abyssinian_1.jpg')\n",
"# We need to organize them into breed-specific subdirectories\n",
"import os\n",
"from collections import defaultdict\n",
"\n",
"# Organize images by breed\n",
"if not os.path.exists('petfaces'):\n",
" os.makedirs('petfaces')\n",
" for img_file in os.listdir('images'):\n",
" if img_file.endswith(('.jpg', '.png')):\n",
" # Extract breed name from filename (everything before the last underscore and number)\n",
" breed = '_'.join(img_file.split('_')[:-1])\n",
" breed_dir = os.path.join('petfaces', breed)\n",
" if not os.path.exists(breed_dir):\n",
" os.makedirs(breed_dir)\n",
" os.rename(os.path.join('images', img_file), os.path.join(breed_dir, img_file))\n",
"\n",
"for cls in os.listdir('petfaces'):\n",
" print(cls)\n",
" display_images([Image.open(os.path.join('petfaces',cls,x)) \n",
@ -124,13 +144,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## Valmistellaan aineistoa syväoppimista varten\n",
"## Datasetin valmistelu syväoppimista varten\n",
"\n",
"Ennen kuin aloitamme neuroverkon kouluttamisen, meidän täytyy muuntaa kaikki kuvat tensoreiksi ja luoda myös tensoreita, jotka vastaavat luokkien numeroita (labelit). Useimmat neuroverkkokehykset sisältävät yksinkertaisia työkaluja kuvien käsittelyyn:\n",
"Ennen kuin aloitamme neuroverkon kouluttamisen, meidän täytyy muuntaa kaikki kuvat tensoreiksi ja luoda myös tensoreita, jotka vastaavat tunnisteita (luokkanumeroita). Useimmissa neuroverkkokehitysympäristöissä on yksinkertaisia työkaluja kuvien käsittelyyn:\n",
"* Tensorflow:ssa käytä `tf.keras.preprocessing.image_dataset_from_directory`\n",
"* PyTorch:ssa käytä `torchvision.datasets.ImageFolder`\n",
"\n",
"Kuten yllä olevista kuvista näet, kaikki kuvat ovat lähellä neliömäistä kuvasuhdetta, joten meidän täytyy muuttaa kaikkien kuvien koko neliöksi. Lisäksi voimme järjestää kuvat pieniin eriin (minibatch).\n"
"Kuten yllä olevista kuvista näit, kaikki kuvat ovat lähellä neliömäistä kuvasuhdetta, joten meidän täytyy muuttaa kaikki kuvat neliön kokoisiksi. Lisäksi voimme järjestää kuvat pieniin eriin (minibatch).\n"
]
},
{
@ -146,7 +166,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Nyt meidän täytyy jakaa tietojoukko harjoitus- ja testiosuuksiin:\n"
"Nyt meidän täytyy jakaa datasetti harjoitus- ja testiosuuksiin:\n"
]
},
{
@ -162,11 +182,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Nyt tulostetaan tensorien koko datasetissämme. Jos olet tehnyt kaiken oikein, harjoituselementtien koko pitäisi olla\n",
" * `(batch_size,image_size,image_size,3)` Tensorflowille, `batch_size,3,image_size,image_size` PyTorchille\n",
" * `batch_size` Tunnisteille\n",
"Tulostetaan nyt tensorien koko datasetissämme. Jos olet tehnyt kaiken oikein, harjoituselementtien koko pitäisi olla\n",
" * `(batch_size,image_size,image_size,3)` Tensorflow'lle, `batch_size,3,image_size,image_size` PyTorchille\n",
" * `batch_size` Labelseille\n",
" \n",
" Tunnisteiden tulisi sisältää luokkien numerot.\n"
" Labelien tulisi sisältää luokkien numerot.\n"
]
},
{
@ -231,12 +251,12 @@
"## Määritä neuroverkko\n",
"\n",
"Kuvien luokittelua varten kannattaa todennäköisesti määrittää konvoluutio-neuroverkko, jossa on useita kerroksia. Mitä kannattaa huomioida:\n",
"* Muista pyramidirakenne, eli suodattimien määrän tulisi kasvaa syvemmälle mentäessä\n",
"* Älä unohda aktivointifunktioita kerrosten välillä (ReLU) ja Max Pooling -kerroksia\n",
"* Lopullinen luokittelija voi sisältää tai olla sisältämättä piilokerroksia, mutta ulostuloneuronien määrän tulee vastata luokkien määrää.\n",
"* Pidä mielessä pyramidirakenne, eli suodattimien määrä tulisi kasvaa syvemmälle mentäessä.\n",
"* Älä unohda aktivointifunktioita kerrosten välillä (ReLU) ja Max Pooling -toimintoa.\n",
"* Lopullinen luokitin voi sisältää tai olla sisältämättä piilokerroksia, mutta ulostuloneuronien määrän tulisi vastata luokkien määrää.\n",
"\n",
"On tärkeää valita oikein viimeisen kerroksen aktivointifunktio ja häviöfunktio:\n",
"* Tensorflow'ssa voit käyttää `softmax`-funktiota aktivointina ja `sparse_categorical_crossentropy`-funktiota häviönä. Sparse categorical cross-entropyn ja ei-sparse-version ero on siinä, että ensimmäinen odottaa ulostulon olevan luokan numero, ei one-hot-vektori.\n",
"* Tensorflow'ssa voit käyttää `softmax`-aktivointia ja `sparse_categorical_crossentropy`-häviöfunktiota. Sparse categorical cross-entropy eroaa ei-sparse-versiosta siten, että ensimmäinen odottaa ulostulon olevan luokan numero ei one-hot-vektori.\n",
"* PyTorchissa viimeinen kerros voi olla ilman aktivointifunktiota, ja häviöfunktioksi voi valita `CrossEntropyLoss`. Tämä funktio soveltaa softmaxia automaattisesti.\n"
]
},
@ -255,9 +275,9 @@
"source": [
"## Kouluta neuroverkko\n",
"\n",
"Nyt olemme valmiita kouluttamaan neuroverkon. Koulutuksen aikana kerää tarkkuus (accuracy) sekä koulutus- että testidatasta jokaisella epookilla ja piirrä sitten tarkkuus nähdäksesi, onko ylikoulutusta tapahtunut.\n",
"Nyt olemme valmiita kouluttamaan neuroverkon. Koulutuksen aikana kerää tarkkuus sekä koulutus- että testidatasta jokaisella epookilla ja piirrä sitten tarkkuus nähdäksesi, onko ylioppimista tapahtunut.\n",
"\n",
"> Koulutuksen nopeuttamiseksi sinun tulee käyttää GPU:ta, jos se on saatavilla. Vaikka TensorFlow/Keras käyttää GPU:ta automaattisesti, PyTorchissa sinun täytyy siirtää sekä malli että data GPU:lle koulutuksen aikana käyttämällä `.to()`-metodia hyödyntääksesi GPU:n laskentatehoa.\n"
"> Koulutuksen nopeuttamiseksi sinun tulee käyttää GPU:ta, jos se on saatavilla. Vaikka TensorFlow/Keras käyttää GPU:ta automaattisesti, PyTorchissa sinun täytyy siirtää sekä malli että data GPU:lle koulutuksen aikana `.to()`-metodin avulla, jotta voit hyödyntää GPU:n kiihdytystä.\n"
]
},
{
@ -299,16 +319,16 @@
"\n",
"## Valinnainen: Laske Top3-tarkkuus\n",
"\n",
"Tässä harjoituksessa käsittelimme luokittelua, jossa oli melko suuri määrä luokkia (35), joten tuloksemme - noin 50 % validointitarkkuus - on varsin hyvä. Standardi ImageNet-datasetissä on vielä enemmän luokkia - 1000.\n",
"Tässä harjoituksessa käsittelimme luokittelua, jossa oli melko suuri määrä luokkia (35), joten tuloksemme - noin 50 % validointitarkkuus - on varsin hyvä. Standardi ImageNet-datasetissä on vielä enemmän - 1000 luokkaa.\n",
"\n",
"Tällaisissa tapauksissa on vaikea varmistaa, että malli **aina** ennustaa luokan oikein. On tilanteita, joissa kaksi rotua ovat hyvin samankaltaisia, ja malli antaa hyvin samanlaiset todennäköisyydet (esim. 0,45 ja 0,43). Jos mittaamme tavallista tarkkuutta, tämä lasketaan virheelliseksi tapaukseksi, vaikka malli teki vain pienen virheen. Tämän vuoksi mittaamme usein toista metriikkaa - tarkkuutta mallin kolmen todennäköisimmän ennusteen joukossa.\n",
"Tällaisissa tapauksissa on vaikeaa varmistaa, että malli **aina** ennustaa luokan oikein. On tilanteita, joissa kaksi rotua ovat hyvin samankaltaisia, ja malli antaa hyvin samankaltaiset todennäköisyydet (esim. 0.45 ja 0.43). Jos mittaamme tavallista tarkkuutta, tämä katsotaan virheelliseksi tapaukseksi, vaikka malli teki vain hyvin pienen virheen. Tästä syystä mittaamme usein toista metriikkaa - tarkkuutta mallin kolmen todennäköisimmän ennusteen joukossa.\n",
"\n",
"Pidämme tapausta tarkkana, jos kohdeluokka sisältyy mallin kolmen parhaan ennusteen joukkoon.\n",
"Pidämme tapausta tarkkana, jos kohde-etiketti sisältyy mallin kolmen todennäköisimmän ennusteen joukkoon.\n",
"\n",
"Top-3-tarkkuuden laskemiseksi testidatasetillä sinun täytyy käydä datasetti manuaalisesti läpi, soveltaa neuroverkkoa saadaksesi ennusteet ja tehdä sitten laskelmat. Joitakin vinkkejä:\n",
"Top-3-tarkkuuden laskemiseksi testidatasetissä sinun täytyy käydä datasetti manuaalisesti läpi, soveltaa neuroverkkoa saadaksesi ennusteen ja tehdä laskelmat. Joitakin vinkkejä:\n",
"\n",
"* Tensorflow'ssa voit käyttää `tf.nn.in_top_k`-funktiota tarkistaaksesi, ovatko `predictions` (mallin tuotos) top-k:ssa (anna `k=3` parametrina) suhteessa `targets`:iin. Tämä funktio palauttaa boolean-arvojen tensorin, joka voidaan muuntaa `int`-muotoon käyttämällä `tf.cast`-funktiota ja sitten koota yhteen `tf.reduce_sum`-funktiolla.\n",
"* PyTorchissa voit käyttää `torch.topk`-funktiota saadaksesi luokkien indeksit, joilla on korkeimmat todennäköisyydet, ja tarkistaa sitten, kuuluuko oikea luokka näihin. Katso [tämä](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) saadaksesi lisää vinkkejä.\n"
"* Tensorflow'ssa voit käyttää `tf.nn.in_top_k`-funktiota nähdäksesi, ovatko `predictions` (mallin tuotos) top-k:ssa (anna `k=3` parametrina) suhteessa `targets`:iin. Tämä funktio palauttaa tensorin, joka sisältää totuusarvoja, jotka voidaan muuntaa `int`-muotoon käyttämällä `tf.cast`-funktiota, ja sitten koota yhteen käyttämällä `tf.reduce_sum`.\n",
"* PyTorchissa voit käyttää `torch.topk`-funktiota saadaksesi indeksit luokista, joilla on korkeimmat todennäköisyydet, ja sitten tarkistaa, kuuluuko oikea luokka näihin. Katso [tämä](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) saadaksesi lisää vinkkejä.\n"
]
},
{
@ -326,7 +346,7 @@
"source": [
"## Valinnainen: Rakenna kissojen ja koirien luokittelu\n",
"\n",
"Haluamme myös nähdä, kuinka tarkka kaksiluokkainen kissojen ja koirien luokittelu olisi samalla tietojoukolla. Tätä varten meidän täytyy muokata tunnisteita:\n"
"Haluamme myös nähdä, kuinka tarkka kaksiluokkainen kissojen ja koirien luokittelu olisi samalla aineistolla. Tätä varten meidän täytyy muokata tunnisteita:\n"
]
},
{
@ -352,7 +372,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Vastuuvapauslauseke**: \nTämä asiakirja on käännetty käyttämällä tekoälypohjaista käännöspalvelua [Co-op Translator](https://github.com/Azure/co-op-translator). Vaikka pyrimme tarkkuuteen, huomioithan, että automaattiset käännökset voivat sisältää virheitä tai epätarkkuuksia. Alkuperäinen asiakirja sen alkuperäisellä kielellä tulisi pitää ensisijaisena lähteenä. Kriittisen tiedon osalta suositellaan ammattimaista ihmiskäännöstä. Emme ole vastuussa väärinkäsityksistä tai virhetulkinnoista, jotka johtuvat tämän käännöksen käytöstä.\n"
"\n---\n\n**Vastuuvapauslauseke**: \nTämä asiakirja on käännetty käyttämällä tekoälypohjaista käännöspalvelua [Co-op Translator](https://github.com/Azure/co-op-translator). Vaikka pyrimme tarkkuuteen, huomioithan, että automaattiset käännökset voivat sisältää virheitä tai epätarkkuuksia. Alkuperäistä asiakirjaa sen alkuperäisellä kielellä tulisi pitää ensisijaisena lähteenä. Kriittisen tiedon osalta suositellaan ammattimaista ihmiskäännöstä. Emme ole vastuussa väärinkäsityksistä tai virhetulkinnoista, jotka johtuvat tämän käännöksen käytöstä.\n"
]
}
],
@ -378,8 +398,8 @@
"version": "3.9.5"
},
"coopTranslator": {
"original_hash": "1de3ae931831253c3198d899da48bfe5",
"translation_date": "2025-08-28T20:30:10+00:00",
"original_hash": "df7d1f7da8d2617b76acd93115776ca4",
"translation_date": "2025-10-03T14:40:13+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb",
"language_code": "fi"
}

View File

@ -1,8 +1,8 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "f3d2cee9cb3c52160419e560c57a690e",
"translation_date": "2025-08-28T19:25:54+00:00",
"original_hash": "b70fcf7fcee862990f848c679090943f",
"translation_date": "2025-10-03T14:55:46+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/README.md",
"language_code": "fi"
}
@ -13,13 +13,13 @@ Lab-tehtävä [AI for Beginners Curriculum](https://github.com/microsoft/ai-for-
## Tehtävä
Kuvittele, että sinun täytyy kehittää sovellus lemmikkien hoitopaikalle kaikkien lemmikkien luetteloimista varten. Yksi tällaisen sovelluksen hienoista ominaisuuksista olisi rodun automaattinen tunnistaminen valokuvasta. Tämä voidaan onnistuneesti toteuttaa käyttämällä neuroverkkoja.
Kuvittele, että sinun täytyy kehittää sovellus lemmikkien hoitolalle kaikkien lemmikkien luetteloimiseen. Yksi tällaisen sovelluksen hienoista ominaisuuksista olisi rodun automaattinen tunnistaminen valokuvasta. Tämä voidaan onnistuneesti toteuttaa käyttämällä neuroverkkoja.
Sinun täytyy kouluttaa konvoluutio-neuroverkko luokittelemaan eri kissojen ja koirien rodut käyttäen **Pet Faces** -datakokonaisuutta.
Sinun tulee kouluttaa konvoluutio-neuroverkko luokittelemaan eri kissojen ja koirien rodut käyttäen **Pet Faces** -datakokonaisuutta.
## Datakokonaisuus
Käytämme **Pet Faces** -datakokonaisuutta, joka on johdettu [Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/) lemmikkien datakokonaisuudesta. Se sisältää 35 eri koirien ja kissojen rotua.
Käytämme [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/) -datakokonaisuutta, joka sisältää kuvia 37 eri koira- ja kissarodusta.
![Datakokonaisuus, jonka kanssa työskentelemme](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.fi.png)
@ -31,15 +31,17 @@ Ladataksesi datakokonaisuuden, käytä tätä koodinpätkää:
!rm images.tar.gz
```
**Huom:** Oxford-IIIT Pet Dataset -kuvat on järjestetty tiedostonimen mukaan (esim. `Abyssinian_1.jpg`, `Bengal_2.jpg`). Notebook sisältää koodin, joka järjestää nämä kuvat rotukohtaisiin alikansioihin helpottamaan luokittelua.
## Aloitus Notebook
Aloita lab-työskentely avaamalla [PetFaces.ipynb](PetFaces.ipynb)
Aloita lab-tehtävä avaamalla [PetFaces.ipynb](PetFaces.ipynb)
## Lopputulos
## Oppimiskokemus
Olet ratkaissut suhteellisen monimutkaisen kuvaluokittelutehtävän alusta asti! Luokkia oli melko paljon, ja silti onnistuit saavuttamaan kohtuullisen tarkkuuden! On myös järkevää mitata top-k tarkkuutta, koska on helppo sekoittaa joitakin luokkia, jotka eivät ole selvästi erilaisia edes ihmisille.
Olet ratkaissut suhteellisen monimutkaisen kuvaluokittelutehtävän alusta alkaen! Luokkia oli melko paljon, ja silti pystyit saavuttamaan kohtuullisen tarkkuuden! On myös järkevää mitata top-k-tarkkuutta, koska joidenkin luokkien erottaminen voi olla vaikeaa jopa ihmisille, jos erot eivät ole selkeitä.
---
**Vastuuvapauslauseke**:
Tämä asiakirja on käännetty käyttämällä tekoälypohjaista käännöspalvelua [Co-op Translator](https://github.com/Azure/co-op-translator). Vaikka pyrimme tarkkuuteen, huomioithan, että automaattiset käännökset voivat sisältää virheitä tai epätarkkuuksia. Alkuperäinen asiakirja sen alkuperäisellä kielellä tulisi pitää ensisijaisena lähteenä. Kriittisen tiedon osalta suositellaan ammattimaista ihmiskäännöstä. Emme ole vastuussa väärinkäsityksistä tai virhetulkinnoista, jotka johtuvat tämän käännöksen käytöstä.
Tämä asiakirja on käännetty käyttämällä tekoälypohjaista käännöspalvelua [Co-op Translator](https://github.com/Azure/co-op-translator). Vaikka pyrimme tarkkuuteen, huomioithan, että automaattiset käännökset voivat sisältää virheitä tai epätarkkuuksia. Alkuperäistä asiakirjaa sen alkuperäisellä kielellä tulisi pitää ensisijaisena lähteenä. Kriittisen tiedon osalta suositellaan ammattimaista ihmiskäännöstä. Emme ole vastuussa väärinkäsityksistä tai virhetulkinnoista, jotka johtuvat tämän käännöksen käytöstä.

View File

@ -6,11 +6,13 @@
"source": [
"# Classification des visages d'animaux de compagnie\n",
"\n",
"Travail pratique issu du [programme AI for Beginners](https://github.com/microsoft/ai-for-beginners).\n",
"Travail pratique tiré du [programme AI for Beginners](https://github.com/microsoft/ai-for-beginners).\n",
"\n",
"### Obtenir les données\n",
"\n",
"Dans cet exercice, nous allons nous concentrer sur une tâche de classification relativement simple : la classification des visages d'animaux de compagnie. Ce jeu de données est composé de visages découpés provenant du [jeu de données Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/). Commençons par charger et visualiser le jeu de données.\n"
"Dans cet exercice, nous allons nous concentrer sur une tâche de classification relativement simple : la classification des visages d'animaux de compagnie. Nous utiliserons le [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), qui contient des images de 37 races différentes de chiens et de chats. Commençons par télécharger et visualiser le jeu de données.\n",
"\n",
"**Note :** Le jeu de données Oxford-IIIT Pet Dataset contient des images complètes d'animaux de compagnie. Les images seront organisées par race dans le dossier extrait.\n"
]
},
{
@ -77,7 +79,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Maintenant, parcourons tous les sous-répertoires de classe et traçons les premières images de chaque classe :\n"
"Maintenant, parcourons tous les sous-répertoires de classe et affichons les premières images de chaque classe :\n"
]
},
{
@ -86,6 +88,24 @@
"metadata": {},
"outputs": [],
"source": [
"# Note: The Oxford-IIIT Pet Dataset extracts to a folder named 'images'\n",
"# Images are named by breed (e.g., 'Abyssinian_1.jpg')\n",
"# We need to organize them into breed-specific subdirectories\n",
"import os\n",
"from collections import defaultdict\n",
"\n",
"# Organize images by breed\n",
"if not os.path.exists('petfaces'):\n",
" os.makedirs('petfaces')\n",
" for img_file in os.listdir('images'):\n",
" if img_file.endswith(('.jpg', '.png')):\n",
" # Extract breed name from filename (everything before the last underscore and number)\n",
" breed = '_'.join(img_file.split('_')[:-1])\n",
" breed_dir = os.path.join('petfaces', breed)\n",
" if not os.path.exists(breed_dir):\n",
" os.makedirs(breed_dir)\n",
" os.rename(os.path.join('images', img_file), os.path.join(breed_dir, img_file))\n",
"\n",
"for cls in os.listdir('petfaces'):\n",
" print(cls)\n",
" display_images([Image.open(os.path.join('petfaces',cls,x)) \n",
@ -126,11 +146,11 @@
"source": [
"## Préparation du jeu de données pour l'apprentissage profond\n",
"\n",
"Pour commencer l'entraînement de notre réseau de neurones, nous devons convertir toutes les images en tenseurs, et également créer des tenseurs correspondant aux étiquettes (numéros de classe). La plupart des frameworks de réseaux de neurones proposent des outils simples pour gérer les images :\n",
"Pour commencer l'entraînement de notre réseau de neurones, nous devons convertir toutes les images en tenseurs, ainsi que créer des tenseurs correspondant aux étiquettes (numéros de classe). La plupart des frameworks de réseaux de neurones contiennent des outils simples pour gérer les images :\n",
"* Dans Tensorflow, utilisez `tf.keras.preprocessing.image_dataset_from_directory`\n",
"* Dans PyTorch, utilisez `torchvision.datasets.ImageFolder`\n",
"\n",
"Comme vous l'avez vu sur les images ci-dessus, elles ont toutes un rapport d'aspect proche du carré, donc nous devons redimensionner toutes les images à une taille carrée. De plus, nous pouvons organiser les images en mini-lots.\n"
"Comme vous l'avez vu sur les images ci-dessus, toutes ont un ratio proche de celui d'une image carrée, donc nous devons redimensionner toutes les images à une taille carrée. De plus, nous pouvons organiser les images en mini-lots.\n"
]
},
{
@ -146,7 +166,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Maintenant, nous devons séparer le jeu de données en portions d'entraînement et de test :\n"
"Maintenant, nous devons diviser le jeu de données en portions d'entraînement et de test :\n"
]
},
{
@ -162,10 +182,10 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Maintenant, affichons la taille des tenseurs dans notre ensemble de données. Si vous avez tout fait correctement, la taille des éléments d'entraînement devrait être :\n",
"Imprimons maintenant la taille des tenseurs dans notre jeu de données. Si vous avez tout fait correctement, la taille des éléments d'entraînement devrait être :\n",
" * `(batch_size,image_size,image_size,3)` pour Tensorflow, `batch_size,3,image_size,image_size` pour PyTorch\n",
" * `batch_size` pour les étiquettes\n",
" \n",
"\n",
" Les étiquettes doivent contenir les numéros des classes.\n"
]
},
@ -231,13 +251,13 @@
"## Définir un réseau de neurones\n",
"\n",
"Pour la classification d'images, il est conseillé de définir un réseau de neurones convolutionnel avec plusieurs couches. Points importants à surveiller :\n",
"* Gardez à l'esprit l'architecture pyramidale, c'est-à-dire que le nombre de filtres doit augmenter à mesure que vous allez plus en profondeur.\n",
"* N'oubliez pas les fonctions d'activation entre les couches (ReLU) et le Max Pooling.\n",
"* Gardez à l'esprit l'architecture pyramidale, c'est-à-dire que le nombre de filtres doit augmenter à mesure que vous allez en profondeur.\n",
"* N'oubliez pas d'ajouter des fonctions d'activation entre les couches (ReLU) et le Max Pooling.\n",
"* Le classificateur final peut inclure ou non des couches cachées, mais le nombre de neurones en sortie doit être égal au nombre de classes.\n",
"\n",
"Un point crucial est de bien choisir la fonction d'activation de la dernière couche + la fonction de perte :\n",
"Un point crucial est de bien choisir la fonction d'activation de la dernière couche ainsi que la fonction de perte :\n",
"* Dans Tensorflow, vous pouvez utiliser `softmax` comme fonction d'activation et `sparse_categorical_crossentropy` comme fonction de perte. La différence entre la perte catégorielle croisée sparse et non-sparse est que la première attend une sortie sous forme de numéro de classe, et non sous forme de vecteur one-hot.\n",
"* Dans PyTorch, vous pouvez avoir la dernière couche sans fonction d'activation et utiliser la fonction de perte `CrossEntropyLoss`. Cette fonction applique automatiquement le softmax.\n"
"* Dans PyTorch, la dernière couche peut ne pas avoir de fonction d'activation, et vous pouvez utiliser la fonction de perte `CrossEntropyLoss`. Cette fonction applique automatiquement le softmax.\n"
]
},
{
@ -299,13 +319,13 @@
"\n",
"## Optionnel : Calculer la précision Top3\n",
"\n",
"Dans cet exercice, nous avons travaillé sur une classification avec un nombre assez élevé de classes (35), donc notre résultat - environ 50 % de précision en validation - est plutôt bon. Le jeu de données standard ImageNet en contient encore plus - 1000 classes.\n",
"Dans cet exercice, nous avons travaillé sur une classification avec un nombre assez élevé de classes (35), donc notre résultat - environ 50 % de précision en validation - est plutôt bon. Le dataset standard ImageNet en compte encore plus - 1000 classes.\n",
"\n",
"Dans de tels cas, il est difficile de garantir que le modèle **prédise toujours** correctement la classe. Il existe des situations où deux races sont très similaires, et le modèle retourne des probabilités très proches (par exemple, 0,45 et 0,43). Si nous mesurons la précision standard, cela sera considéré comme une erreur, même si le modèle a fait une très petite faute. Ainsi, nous mesurons souvent une autre métrique : une précision parmi les 3 prédictions les plus probables du modèle.\n",
"Dans de tels cas, il est difficile de garantir que le modèle **prédise toujours** correctement la classe. Il existe des situations où deux races sont très similaires, et le modèle retourne des probabilités très proches (par exemple, 0,45 et 0,43). Si nous mesurons la précision standard, cela sera considéré comme une erreur, même si le modèle a fait une très petite faute. C'est pourquoi nous mesurons souvent une autre métrique : une précision dans les trois prédictions les plus probables du modèle.\n",
"\n",
"Nous considérons le cas comme précis si l'étiquette cible est contenue dans les 3 prédictions principales du modèle.\n",
"Nous considérons le cas comme précis si l'étiquette cible est contenue dans les trois prédictions les plus probables du modèle.\n",
"\n",
"Pour calculer la précision top-3 sur le jeu de données de test, vous devez parcourir manuellement le jeu de données, appliquer le réseau de neurones pour obtenir les prédictions, puis effectuer les calculs. Quelques indications :\n",
"Pour calculer la précision top-3 sur le dataset de test, vous devez parcourir manuellement le dataset, appliquer le réseau de neurones pour obtenir les prédictions, puis effectuer les calculs. Quelques indications :\n",
"\n",
"* Dans Tensorflow, utilisez la fonction `tf.nn.in_top_k` pour vérifier si les `predictions` (sortie du modèle) sont dans le top-k (passez `k=3` comme paramètre), par rapport aux `targets`. Cette fonction retourne un tenseur de valeurs booléennes, qui peut être converti en `int` avec `tf.cast`, puis accumulé avec `tf.reduce_sum`.\n",
"* Dans PyTorch, vous pouvez utiliser la fonction `torch.topk` pour obtenir les indices des classes avec les probabilités les plus élevées, puis vérifier si la classe correcte appartient à celles-ci. Consultez [ceci](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) pour plus d'indications.\n"
@ -326,7 +346,7 @@
"source": [
"## Optionnel : Construire une classification Chats vs Chiens\n",
"\n",
"Nous souhaitons également vérifier la précision de notre classification binaire entre chats et chiens sur le même ensemble de données. Pour ce faire, nous devons ajuster les étiquettes :\n"
"Nous souhaitons également vérifier la précision de notre classification binaire chats vs chiens sur le même ensemble de données. Pour ce faire, nous devons ajuster les étiquettes :\n"
]
},
{
@ -352,7 +372,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Avertissement** : \nCe document a été traduit à l'aide du service de traduction automatique [Co-op Translator](https://github.com/Azure/co-op-translator). Bien que nous nous efforcions d'assurer l'exactitude, veuillez noter que les traductions automatisées peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue d'origine doit être considéré comme la source faisant autorité. Pour des informations critiques, il est recommandé de faire appel à une traduction professionnelle humaine. Nous déclinons toute responsabilité en cas de malentendus ou d'interprétations erronées résultant de l'utilisation de cette traduction.\n"
"\n---\n\n**Avertissement** : \nCe document a été traduit à l'aide du service de traduction automatique [Co-op Translator](https://github.com/Azure/co-op-translator). Bien que nous nous efforcions d'assurer l'exactitude, veuillez noter que les traductions automatisées peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue d'origine doit être considéré comme la source faisant autorité. Pour des informations critiques, il est recommandé de recourir à une traduction professionnelle réalisée par un humain. Nous déclinons toute responsabilité en cas de malentendus ou d'interprétations erronées résultant de l'utilisation de cette traduction.\n"
]
}
],
@ -378,8 +398,8 @@
"version": "3.9.5"
},
"coopTranslator": {
"original_hash": "1de3ae931831253c3198d899da48bfe5",
"translation_date": "2025-08-31T14:32:31+00:00",
"original_hash": "df7d1f7da8d2617b76acd93115776ca4",
"translation_date": "2025-10-03T14:24:55+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb",
"language_code": "fr"
}

View File

@ -1,29 +1,29 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "f3d2cee9cb3c52160419e560c57a690e",
"translation_date": "2025-08-24T20:52:03+00:00",
"original_hash": "b70fcf7fcee862990f848c679090943f",
"translation_date": "2025-10-03T14:51:48+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/README.md",
"language_code": "fr"
}
-->
# Classification des visages d'animaux de compagnie
# Classification des visages d'animaux
Devoir de laboratoire tiré du [programme AI for Beginners](https://github.com/microsoft/ai-for-beginners).
Travail pratique issu du [Curriculum AI pour débutants](https://github.com/microsoft/ai-for-beginners).
## Tâche
Imaginez que vous devez développer une application pour une garderie pour animaux afin de cataloguer tous les animaux. L'une des fonctionnalités intéressantes d'une telle application serait de reconnaître automatiquement la race à partir d'une photographie. Cela peut être réalisé avec succès en utilisant des réseaux neuronaux.
Imaginez que vous devez développer une application pour une garderie d'animaux afin de cataloguer tous les animaux. L'une des fonctionnalités intéressantes de cette application serait de découvrir automatiquement la race à partir d'une photographie. Cela peut être réalisé avec succès en utilisant des réseaux neuronaux.
Vous devez entraîner un réseau neuronal convolutif pour classer différentes races de chats et de chiens en utilisant le dataset **Pet Faces**.
Vous devez entraîner un réseau neuronal convolutif pour classifier différentes races de chats et de chiens en utilisant le dataset **Pet Faces**.
## Le Dataset
Nous utiliserons le dataset **Pet Faces**, dérivé du dataset [Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/) pour animaux. Il contient 35 races différentes de chiens et de chats.
Nous utiliserons le [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), qui contient des images de 37 races différentes de chiens et de chats.
![Dataset que nous allons utiliser](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.fr.png)
![Dataset avec lequel nous travaillerons](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.fr.png)
Pour télécharger le dataset, utilisez cet extrait de code :
Pour télécharger le dataset, utilisez ce fragment de code :
```python
!wget https://thor.robots.ox.ac.uk/~vgg/data/pets/images.tar.gz
@ -31,13 +31,17 @@ Pour télécharger le dataset, utilisez cet extrait de code :
!rm images.tar.gz
```
## Démarrage du Notebook
**Remarque :** Les images du Oxford-IIIT Pet Dataset sont organisées par nom de fichier (par exemple, `Abyssinian_1.jpg`, `Bengal_2.jpg`). Le notebook inclut du code pour organiser ces images dans des sous-répertoires spécifiques à chaque race afin de faciliter la classification.
Commencez le laboratoire en ouvrant [PetFaces.ipynb](../../../../../../lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb)
## Notebook de départ
Commencez le travail pratique en ouvrant [PetFaces.ipynb](PetFaces.ipynb)
## Résultat
Vous avez résolu un problème relativement complexe de classification d'images à partir de zéro ! Il y avait un grand nombre de classes, et vous avez tout de même réussi à obtenir une précision raisonnable ! Il est également pertinent de mesurer la précision top-k, car il est facile de confondre certaines classes qui ne sont pas clairement distinctes, même pour des êtres humains.
Vous avez résolu un problème relativement complexe de classification d'images à partir de zéro ! Il y avait un grand nombre de classes, et vous avez tout de même réussi à obtenir une précision raisonnable ! Il est également pertinent de mesurer la précision top-k, car il est facile de confondre certaines classes qui ne sont pas clairement distinctes, même pour les êtres humains.
---
**Avertissement** :
Ce document a été traduit à l'aide du service de traduction automatique [Co-op Translator](https://github.com/Azure/co-op-translator). Bien que nous nous efforcions d'assurer l'exactitude, veuillez noter que les traductions automatisées peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue d'origine doit être considéré comme la source faisant autorité. Pour des informations critiques, il est recommandé de recourir à une traduction humaine professionnelle. Nous déclinons toute responsabilité en cas de malentendus ou d'interprétations erronées résultant de l'utilisation de cette traduction.

View File

@ -4,13 +4,15 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"# סיווג פרצופים של חיות מחמד\n",
"# סיווג פנים של חיות מחמד\n",
"\n",
טלת מעבדה מתוך [AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners).\n",
שימת מעבדה מתוך [AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners).\n",
"\n",
"### קבלת הנתונים\n",
"### השגת הנתונים\n",
"\n",
"במטלה זו נתמקד במשימת סיווג יחסית פשוטה - סיווג פרצופים של חיות מחמד. מערך הנתונים הזה מורכב מפרצופים שנחתכו מתוך [Oxford-IIIT Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/). בואו נתחיל בטעינה והמחשה של מערך הנתונים.\n"
"במשימה זו נתמקד במשימת סיווג יחסית פשוטה - סיווג פנים של חיות מחמד. נשתמש ב-[Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), שמכיל תמונות של 37 גזעים שונים של כלבים וחתולים. נתחיל בהורדה ובוויזואליזציה של מערך הנתונים.\n",
"\n",
"**הערה:** מערך הנתונים Oxford-IIIT Pet Dataset מכיל תמונות מלאות של חיות מחמד. התמונות יהיו מאורגנות לפי גזע בתיקייה המופקת.\n"
]
},
{
@ -86,6 +88,24 @@
"metadata": {},
"outputs": [],
"source": [
"# Note: The Oxford-IIIT Pet Dataset extracts to a folder named 'images'\n",
"# Images are named by breed (e.g., 'Abyssinian_1.jpg')\n",
"# We need to organize them into breed-specific subdirectories\n",
"import os\n",
"from collections import defaultdict\n",
"\n",
"# Organize images by breed\n",
"if not os.path.exists('petfaces'):\n",
" os.makedirs('petfaces')\n",
" for img_file in os.listdir('images'):\n",
" if img_file.endswith(('.jpg', '.png')):\n",
" # Extract breed name from filename (everything before the last underscore and number)\n",
" breed = '_'.join(img_file.split('_')[:-1])\n",
" breed_dir = os.path.join('petfaces', breed)\n",
" if not os.path.exists(breed_dir):\n",
" os.makedirs(breed_dir)\n",
" os.rename(os.path.join('images', img_file), os.path.join(breed_dir, img_file))\n",
"\n",
"for cls in os.listdir('petfaces'):\n",
" print(cls)\n",
" display_images([Image.open(os.path.join('petfaces',cls,x)) \n",
@ -126,7 +146,7 @@
"source": [
"## הכנת מערך נתונים ללמידה עמוקה\n",
"\n",
"כדי להתחיל לאמן את רשת העצבים שלנו, עלינו להמיר את כל התמונות לטנסורים, וגם ליצור טנסורים שמתאימים לתוויות (מספרי הקטגוריות). רוב מסגרות העבודה של רשתות עצבים מכילות כלים פשוטים להתמודדות עם תמונות:\n",
"כדי להתחיל לאמן את הרשת העצבית שלנו, עלינו להמיר את כל התמונות לטנזורים, וגם ליצור טנזורים התואמים לתוויות (מספרי מחלקות). רוב מסגרות הרשתות העצביות מכילות כלים פשוטים להתמודדות עם תמונות:\n",
"* ב-Tensorflow, השתמשו ב-`tf.keras.preprocessing.image_dataset_from_directory`\n",
"* ב-PyTorch, השתמשו ב-`torchvision.datasets.ImageFolder`\n",
"\n",
@ -146,7 +166,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"עכשיו אנחנו צריכים להפריד את מערך הנתונים לחלקי אימון ובדיקה:\n"
":עכשיו אנחנו צריכים לחלק את מערך הנתונים לחלקי אימון ובדיקה\n"
]
},
{
@ -228,16 +248,16 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## הגדרת רשת נוירונים\n",
"## הגדרת רשת עצבית\n",
"\n",
צורך סיווג תמונות, כדאי להגדיר רשת נוירונים קונבולוציונית עם מספר שכבות. דברים שכדאי לשים לב אליהם:\n",
"* זכרו את ארכיטקטורת הפירמידה, כלומר מספר הפילטרים צריך לגדול ככל שמעמיקים בשכבות.\n",
"* אל תשכחו להוסיף פונקציות הפעלה בין השכבות (ReLU) ושכבות Max Pooling.\n",
"* הסיווג הסופי יכול להיות עם או בלי שכבות נסתרות, אך מספר הנוירונים בשכבה האחרונה צריך להיות שווה למספר הקטגוריות.\n",
"לסיווג תמונות, כדאי להגדיר רשת עצבית קונבולוציונית עם מספר שכבות. דברים שכדאי לשים לב אליהם:\n",
"* זכרו את הארכיטקטורה הפירמידלית, כלומר מספר הפילטרים צריך לגדול ככל שמעמיקים.\n",
"* אל תשכחו פונקציות הפעלה בין השכבות (ReLU) ו-Max Pooling.\n",
"* המסווג הסופי יכול להיות עם או בלי שכבות נסתרות, אך מספר הנוירונים ביציאה צריך להיות שווה למספר הקטגוריות.\n",
"\n",
"דבר חשוב הוא להגדיר נכון את פונקציית ההפעלה בשכבה האחרונה ואת פונקציית האובדן:\n",
"* ב-Tensorflow, ניתן להשתמש ב-`softmax` כפונקציית הפעלה וב-`sparse_categorical_crossentropy` כפונקציית אובדן. ההבדל בין sparse categorical cross-entropy לבין הגרסה הלא-ספארסית הוא שהראשונה מצפה לפלט כמספר הקטגוריה ולא כווקטור one-hot.\n",
"* ב-PyTorch, ניתן להגדיר את השכבה האחרונה ללא פונקציית הפעלה, ולהשתמש בפונקציית האובדן `CrossEntropyLoss`. פונקציה זו מיישמת softmax באופן אוטומטי.\n"
"דבר חשוב הוא לבחור נכון את פונקציית ההפעלה בשכבה האחרונה ואת פונקציית ההפסד:\n",
"* ב-Tensorflow, ניתן להשתמש ב-`softmax` כפונקציית הפעלה וב-`sparse_categorical_crossentropy` כפונקציית הפסד. ההבדל בין sparse categorical cross-entropy לבין הגרסה הלא-ספארסית הוא שהראשונה מצפה שהפלט יהיה כמספר הקטגוריה ולא כוקטור one-hot.\n",
"* ב-PyTorch, ניתן להגדיר את השכבה האחרונה ללא פונקציית הפעלה, ולהשתמש בפונקציית הפסד `CrossEntropyLoss`. פונקציה זו מיישמת softmax באופן אוטומטי.\n"
]
},
{
@ -253,11 +273,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## לאמן את הרשת העצבית\n",
"## אימון רשת העצבים\n",
"\n",
"עכשיו אנחנו מוכנים לאמן את הרשת העצבית. במהלך האימון, יש לאסוף את דיוק הנתונים של האימון והבדיקה בכל אפוק, ולאחר מכן לשרטט את הדיוק כדי לבדוק אם יש התאמת יתר.\n",
"עכשיו אנחנו מוכנים לאמן את רשת העצבים. במהלך האימון, אנא אספו את דיוק הנתונים של האימון והבדיקה בכל אפוק, ולאחר מכן צרו גרף של הדיוק כדי לבדוק אם יש תופעת התאמת יתר.\n",
"\n",
"> כדי להאיץ את האימון, יש להשתמש ב-GPU אם הוא זמין. בעוד ש-TensorFlow/Keras ישתמשו ב-GPU באופן אוטומטי, ב-PyTorch יש להעביר גם את המודל וגם את הנתונים ל-GPU במהלך האימון באמצעות השיטה `.to()` כדי לנצל את ההאצה של ה-GPU.\n"
"> כדי להאיץ את האימון, יש להשתמש ב-GPU אם הוא זמין. בעוד ש-TensorFlow/Keras ישתמשו ב-GPU באופן אוטומטי, ב-PyTorch יש להעביר גם את המודל וגם את הנתונים ל-GPU במהלך האימון באמצעות השיטה `.to()` כדי לנצל את יתרונות ההאצה של ה-GPU.\n"
]
},
{
@ -295,20 +315,20 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"מה ניתן לומר על אוברפיטינג? מה ניתן לעשות כדי לשפר את הדיוק של המודל\n",
"מה אפשר לומר על התאמת יתר? מה ניתן לעשות כדי לשפר את דיוק המודל?\n",
"\n",
"## אופציונלי: חישוב דיוק Top3\n",
"\n",
"בתרגיל הזה עסקנו בסיווג עם מספר די גבוה של קטגוריות (35), כך שהתוצאה שלנו - כ-50% דיוק אימות - היא די טובה. מערך הנתונים הסטנדרטי של ImageNet מכיל אפילו יותר - 1000 קטגוריות.\n",
"\n",
"במקרים כאלה קשה להבטיח שהמודל **תמיד** ינבא את הקטגוריה הנכונה. ישנם מקרים שבהם שני גזעים דומים מאוד זה לזה, והמודל מחזיר הסתברויות דומות מאוד (לדוגמה, 0.45 ו-0.43). אם נמדוד דיוק סטנדרטי, זה ייחשב כמקרה שגוי, למרות שהמודל עשה טעות קטנה מאוד. לכן, לעיתים קרובות אנו מודדים מדד אחר - דיוק בתוך שלוש התחזיות הסבירות ביותר של המודל.\n",
"במקרים כאלה קשה להבטיח שהמודל **תמיד** מנבא את הקטגוריה הנכונה. ישנם מקרים שבהם שני סוגים דומים מאוד זה לזה, והמודל מחזיר הסתברויות מאוד דומות (לדוגמה, 0.45 ו-0.43). אם נמדוד דיוק סטנדרטי, זה ייחשב כטעות, למרות שהמודל עשה טעות קטנה מאוד. לכן, לעיתים אנו מודדים מדד אחר - דיוק בתוך שלוש התחזיות הסבירות ביותר של המודל.\n",
"\n",
"אנו מחשיבים מקרה כמדויק אם התווית הנכונה נמצאת בתוך שלוש התחזיות המובילות של המודל.\n",
"אנו מחשיבים את המקרה כמדויק אם התווית הנכונה נמצאת בתוך שלוש התחזיות המובילות של המודל.\n",
"\n",
"כדי לחשב דיוק Top-3 על מערך הנתונים של הבדיקה, עליכם לעבור ידנית על מערך הנתונים, להפעיל את הרשת העצבית כדי לקבל את התחזיות, ואז לבצע את החישובים. כמה רמזים:\n",
"כדי לחשב דיוק Top-3 על מערך הנתונים של הבדיקה, עליכם לעבור ידנית על מערך הנתונים, להפעיל את הרשת העצבית כדי לקבל את התחזית, ואז לבצע את החישובים. כמה רמזים:\n",
"\n",
"* ב-Tensorflow, השתמשו בפונקציה `tf.nn.in_top_k` כדי לבדוק אם ה-`predictions` (הפלט של המודל) נמצאים ב-top-k (העבירו `k=3` כפרמטר), ביחס ל-`targets`. פונקציה זו מחזירה טנסור של ערכים בוליאניים, שניתן להמיר ל-`int` באמצעות `tf.cast`, ואז לצבור באמצעות `tf.reduce_sum`.\n",
"* ב-PyTorch, ניתן להשתמש בפונקציה `torch.topk` כדי לקבל את האינדקסים של הקטגוריות עם ההסתברויות הגבוהות ביותר, ואז לבדוק אם הקטגוריה הנכונה נמצאת ביניהן. ראו [כאן](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) לעוד רמזים.\n"
"* ב-Tensorflow, השתמשו בפונקציה `tf.nn.in_top_k` כדי לבדוק אם ה-`predictions` (תוצאת המודל) נמצאות ב-top-k (העבירו `k=3` כפרמטר), ביחס ל-`targets`. פונקציה זו מחזירה טנזור של ערכים בוליאניים, שניתן להמיר ל-`int` באמצעות `tf.cast`, ואז לצבור באמצעות `tf.reduce_sum`.\n",
"* ב-PyTorch, ניתן להשתמש בפונקציה `torch.topk` כדי לקבל אינדקסים של קטגוריות עם הסתברויות גבוהות, ואז לבדוק אם הקטגוריה הנכונה נמצאת ביניהן. ראו [כאן](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) לעוד רמזים.\n"
]
},
{
@ -326,7 +346,7 @@
"source": [
"## אופציונלי: בניית סיווג חתולים מול כלבים\n",
"\n",
"אנחנו גם רוצים לבדוק עד כמה מדויק יהיה סיווג בינארי של חתולים מול כלבים על אותו מערך נתונים. כדי לעשות זאת, עלינו להתאים את התוויות:\n"
"אנחנו גם רוצים לבדוק עד כמה מדויק הסיווג הבינארי שלנו של חתולים מול כלבים יהיה על אותו מערך נתונים. כדי לעשות זאת, אנחנו צריכים להתאים את התוויות:\n"
]
},
{
@ -352,7 +372,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**כתב ויתור**: \nמסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). בעוד שאנו שואפים לדיוק, יש להיות מודעים לכך שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.\n"
"\n---\n\n**כתב ויתור**: \nמסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור הסמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.\n"
]
}
],
@ -378,8 +398,8 @@
"version": "3.9.5"
},
"coopTranslator": {
"original_hash": "1de3ae931831253c3198d899da48bfe5",
"translation_date": "2025-08-28T20:31:23+00:00",
"original_hash": "df7d1f7da8d2617b76acd93115776ca4",
"translation_date": "2025-10-03T14:41:18+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb",
"language_code": "he"
}

View File

@ -1,27 +1,27 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "f3d2cee9cb3c52160419e560c57a690e",
"translation_date": "2025-08-28T19:26:10+00:00",
"original_hash": "b70fcf7fcee862990f848c679090943f",
"translation_date": "2025-10-03T14:56:02+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/README.md",
"language_code": "he"
}
-->
# סיווג פנים של חיות מחמד
משימת מעבדה מתוך [AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners).
משימת מעבדה מתוך [תוכנית הלימודים AI למתחילים](https://github.com/microsoft/ai-for-beginners).
## משימה
דמיינו שאתם צריכים לפתח אפליקציה למעון חיות מחמד כדי לקטלג את כל החיות. אחת התכונות המדהימות של אפליקציה כזו תהיה זיהוי אוטומטי של הגזע מתוך תמונה. ניתן לבצע זאת בהצלחה באמצעות רשתות נוירונים.
דמיינו שאתם צריכים לפתח אפליקציה למעון חיות מחמד כדי לקטלג את כל החיות. אחת התכונות הנהדרות של אפליקציה כזו תהיה זיהוי אוטומטי של הגזע מתוך תמונה. ניתן לבצע זאת בהצלחה באמצעות רשתות נוירונים.
עליכם לאמן רשת נוירונים קונבולוציונית כדי לסווג גזעים שונים של חתולים וכלבים באמצעות **מאגר הנתונים של פנים חיות מחמד**.
עליכם לאמן רשת נוירונים קונבולוציונית כדי לסווג גזעים שונים של חתולים וכלבים באמצעות **מאגר נתוני פנים של חיות מחמד**.
## מאגר הנתונים
נשתמש במאגר הנתונים **Pet Faces**, שמקורו במאגר הנתונים של חיות מחמד [Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/). הוא מכיל 35 גזעים שונים של כלבים וחתולים.
נשתמש ב-[מאגר הנתונים של Oxford-IIIT Pet](https://www.robots.ox.ac.uk/~vgg/data/pets/), המכיל תמונות של 37 גזעים שונים של כלבים וחתולים.
![מאגר הנתונים שנעבוד איתו](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.he.png)
![מאגר הנתונים שבו נעסוק](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.he.png)
כדי להוריד את מאגר הנתונים, השתמשו בקטע הקוד הבא:
@ -31,15 +31,17 @@ CO_OP_TRANSLATOR_METADATA:
!rm images.tar.gz
```
**הערה:** תמונות מאגר הנתונים של Oxford-IIIT Pet מאורגנות לפי שם הקובץ (לדוגמה, `Abyssinian_1.jpg`, `Bengal_2.jpg`). המחברת כוללת קוד לארגון התמונות הללו בתיקיות לפי גזע לצורך סיווג קל יותר.
## פתיחת המחברת
התחילו את המעבדה על ידי פתיחת [PetFaces.ipynb](PetFaces.ipynb)
## תובנות
פתרתם בעיה יחסית מורכבת של סיווג תמונות מאפס! היו לא מעט קטגוריות, ועדיין הצלחתם להגיע לדיוק סביר! בנוסף, יש היגיון למדוד דיוק top-k, מכיוון שקל להתבלבל בין חלק מהקטגוריות שאינן שונות באופן ברור אפילו עבור בני אדם.
פתרתם בעיה יחסית מורכבת של סיווג תמונות מאפס! היו לא מעט קטגוריות, ועדיין הצלחתם להגיע לדיוק סביר! יש גם היגיון למדוד דיוק top-k, מכיוון שקל להתבלבל בין כמה קטגוריות שאינן שונות באופן ברור אפילו עבור בני אדם.
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו אחראים לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

View File

@ -10,7 +10,9 @@
"\n",
"### डेटा प्राप्त करना\n",
"\n",
"इस असाइनमेंट में, हम एक अपेक्षाकृत सरल वर्गीकरण कार्य पर ध्यान केंद्रित करेंगे - पालतू जानवरों के चेहरों का वर्गीकरण। यह डेटासेट [Oxford-IIIT Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/) से कटे हुए चेहरों से बना है। चलिए डेटासेट को लोड करने और विज़ुअलाइज़ करने से शुरू करते हैं।\n"
"इस असाइनमेंट में, हम एक अपेक्षाकृत सरल वर्गीकरण कार्य पर ध्यान केंद्रित करेंगे - पालतू जानवरों के चेहरों का वर्गीकरण। हम [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/) का उपयोग करेंगे, जिसमें कुत्तों और बिल्लियों की 37 विभिन्न नस्लों की छवियां शामिल हैं। चलिए डेटा को डाउनलोड और विज़ुअलाइज़ करने से शुरू करते हैं।\n",
"\n",
"**नोट:** Oxford-IIIT Pet Dataset में पूरे पालतू जानवरों की छवियां शामिल हैं। निकाले गए फ़ोल्डर में छवियां नस्ल के अनुसार व्यवस्थित होंगी।\n"
]
},
{
@ -46,7 +48,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"हम एक सामान्य फ़ंक्शन परिभाषित करेंगे जो एक सूची से छवियों की श्रृंखला प्रदर्शित करेगा:\n"
"हम एक सामान्य फ़ंक्शन परिभाषित करेंगे जो सूची से छवियों की श्रृंखला प्रदर्शित करेगा:\n"
]
},
{
@ -86,6 +88,24 @@
"metadata": {},
"outputs": [],
"source": [
"# Note: The Oxford-IIIT Pet Dataset extracts to a folder named 'images'\n",
"# Images are named by breed (e.g., 'Abyssinian_1.jpg')\n",
"# We need to organize them into breed-specific subdirectories\n",
"import os\n",
"from collections import defaultdict\n",
"\n",
"# Organize images by breed\n",
"if not os.path.exists('petfaces'):\n",
" os.makedirs('petfaces')\n",
" for img_file in os.listdir('images'):\n",
" if img_file.endswith(('.jpg', '.png')):\n",
" # Extract breed name from filename (everything before the last underscore and number)\n",
" breed = '_'.join(img_file.split('_')[:-1])\n",
" breed_dir = os.path.join('petfaces', breed)\n",
" if not os.path.exists(breed_dir):\n",
" os.makedirs(breed_dir)\n",
" os.rename(os.path.join('images', img_file), os.path.join(breed_dir, img_file))\n",
"\n",
"for cls in os.listdir('petfaces'):\n",
" print(cls)\n",
" display_images([Image.open(os.path.join('petfaces',cls,x)) \n",
@ -95,7 +115,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"आइए हमारे डेटासेट में वर्गों की संख्या भी परिभाषित करें:\n"
]
},
{
"cell_type": "code",
@ -124,7 +146,7 @@
"source": [
"## डीप लर्निंग के लिए डेटासेट तैयार करना\n",
"\n",
"हमारे न्यूरल नेटवर्क को ट्रेनिंग शुरू करने के लिए, हमें सभी इमेज को टेन्सर में बदलना होगा, और लेबल (क्लास नंबर) के लिए भी टेन्सर बनाना होगा। अधिकांश न्यूरल नेटवर्क फ्रेमवर्क में इमेज के साथ काम करने के लिए सरल टूल्स होते हैं:\n",
"हमारे न्यूरल नेटवर्क को ट्रेनिंग शुरू करने के लिए, हमें सभी इमेज को टेंसर में बदलना होगा और लेबल (क्लास नंबर) के लिए भी टेंसर बनाना होगा। अधिकांश न्यूरल नेटवर्क फ्रेमवर्क में इमेज के साथ काम करने के लिए सरल टूल्स होते हैं:\n",
"* Tensorflow में, `tf.keras.preprocessing.image_dataset_from_directory` का उपयोग करें\n",
"* PyTorch में, `torchvision.datasets.ImageFolder` का उपयोग करें\n",
"\n",
@ -144,7 +166,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"अब हमें डेटासेट को ट्रेन और टेस्ट भागों में विभाजित करना ह:\n"
"अब हमें डेटासेट को ट्रेन और टेस्ट भागों में विभाजित करना होगा:\n"
]
},
{
@ -160,7 +182,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"अब चलिए हमारे डेटासेट में टेन्सर्स के आकार को प्रिंट करते हैं। अगर आपने सबकुछ सही तरीके से किया है, तो ट्रेनिंग एलिमेंट्स का आकार होना चाहिए:\n",
"अब चलिए हमारे डेटासेट में टेन्सर्स का आकार प्रिंट करते हैं। अगर आपने सबकुछ सही किया है, तो ट्रेनिंग एलिमेंट्स का आकार होना चाहिए:\n",
" * Tensorflow के लिए `(batch_size,image_size,image_size,3)`, PyTorch के लिए `batch_size,3,image_size,image_size`\n",
" * लेबल्स के लिए `batch_size`\n",
"\n",
@ -233,9 +255,9 @@
"* परतों के बीच सक्रियण फ़ंक्शन (ReLU) और मैक्स पूलिंग को न भूलें।\n",
"* अंतिम वर्गीकरणकर्ता छिपी हुई परतों के साथ या बिना हो सकता है, लेकिन आउटपुट न्यूरॉन्स की संख्या कक्षाओं की संख्या के बराबर होनी चाहिए।\n",
"\n",
"एक महत्वपूर्ण बात यह है कि अंतिम परत पर सक्रियण फ़ंक्शन + हानि फ़ंक्शन सही होना चाहिए:\n",
"* Tensorflow में, आप सक्रियण के रूप में `softmax` और हानि के रूप में `sparse_categorical_crossentropy` का उपयोग कर सकते हैं। स्पार्स श्रेणीगत क्रॉस-एंट्रोपी और गैर-स्पार्स के बीच का अंतर यह है कि पहला आउटपुट को कक्षा की संख्या के रूप में अपेक्षित करता है, न कि वन-हॉट वेक्टर के रूप में।\n",
"* PyTorch में, आप अंतिम परत को सक्रियण फ़ंक्शन के बिना रख सकते हैं और `CrossEntropyLoss` हानि फ़ंक्शन का उपयोग कर सकते हैं। यह फ़ंक्शन स्वचालित रूप से softmax लागू करता है।\n"
"एक महत्वपूर्ण बात यह है कि अंतिम परत पर सक्रियण फ़ंक्शन और लॉस फ़ंक्शन सही होना चाहिए:\n",
"* Tensorflow में, आप सक्रियण के रूप में `softmax` और लॉस के रूप में `sparse_categorical_crossentropy` का उपयोग कर सकते हैं। स्पार्स कैटेगोरिकल क्रॉस-एंट्रोपी और नॉन-स्पार्स के बीच अंतर यह है कि पहला आउटपुट को कक्षा की संख्या के रूप में अपेक्षित करता है, न कि वन-हॉट वेक्टर के रूप में।\n",
"* PyTorch में, आप अंतिम परत को सक्रियण फ़ंक्शन के बिना रख सकते हैं और `CrossEntropyLoss` लॉस फ़ंक्शन का उपयोग कर सकते हैं। यह फ़ंक्शन स्वचालित रूप से softmax लागू करता है।\n"
]
},
{
@ -253,9 +275,9 @@
"source": [
"## न्यूरल नेटवर्क को प्रशिक्षित करें\n",
"\n",
"अब हम न्यूरल नेटवर्क को प्रशिक्षित करने के लिए तैयार हैं। प्रशिक्षण के दौरान, कृपया प्रत्येक युग पर ट्रेन और टेस्ट डेटा की सटीकता एकत्र करें, और फिर सटीकता को प्लॉट करें ताकि यह देखा जा सके कि कहीं ओवरफिटिंग तो नहीं हो रही है।\n",
"अब हम न्यूरल नेटवर्क को प्रशिक्षित करने के लिए तैयार हैं। प्रशिक्षण के दौरान, कृपया प्रत्येक epoch पर ट्रेन और टेस्ट डेटा की सटीकता एकत्र करें, और फिर सटीकता को प्लॉट करें ताकि यह देखा जा सके कि कहीं ओवरफिटिंग तो नहीं हो रही है।\n",
"\n",
"> प्रशिक्षण को तेज करने के लिए, आपको GPU का उपयोग करना होगा यदि उपलब्ध हो। जबकि TensorFlow/Keras स्वचालित रूप से GPU का उपयोग करेगा, PyTorch में आपको प्रशिक्षण के दौरान मॉडल और डेटा दोनों को `.to()` विधि का उपयोग करके GPU पर ले जाना होगा ताकि GPU एक्सेलेरेशन का लाभ उठाया जा सके।\n"
"> प्रशिक्षण को तेज करने के लिए, यदि GPU उपलब्ध हो तो उसका उपयोग करें। जबकि TensorFlow/Keras स्वचालित रूप से GPU का उपयोग करेगा, PyTorch में आपको प्रशिक्षण के दौरान मॉडल और डेटा दोनों को `.to()` मेथड का उपयोग करके GPU पर ले जाना होगा ताकि GPU एक्सेलेरेशन का लाभ उठाया जा सके।\n"
]
},
{
@ -293,20 +315,20 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"ओवरफिटिंग के बारे में आप क्या कह सकते हैं? मॉडल की सटीकता सुधारने के लिए क्या किया जा सकता है?\n",
"ओवरफिटिंग के बारे में क्या कहा जा सकता है? मॉडल की सटीकता सुधारने के लिए क्या किया जा सकता है?\n",
"\n",
"## वैकल्पिक: टॉप-3 सटीकता की गणना करें\n",
"\n",
"इस अभ्यास में, हम उच्च संख्या वाले वर्गों (35) के साथ वर्गीकरण कर रहे थे, इसलिए हमारा परिणाम - लगभग 50% सत्यापन सटीकता - काफी अच्छा है। मानक ImageNet डेटासेट में और भी अधिक - 1000 वर्ग होते हैं।\n",
"इस अभ्यास में, हम 35 वर्गों के साथ वर्गीकरण कर रहे थे, इसलिए हमारा परिणाम - लगभग 50% सत्यापन सटीकता - काफी अच्छा है। मानक ImageNet डेटासेट में और भी अधिक वर्ग होते हैं - 1000।\n",
"\n",
"ऐसे मामलों में यह सुनिश्चित करना कठिन होता है कि मॉडल **हमेशा** सही वर्ग की भविष्यवाणी करे। कुछ मामलों में दो नस्लें एक-दूसरे से बहुत मिलती-जुलती होती हैं, और मॉडल बहुत समान संभावनाएं लौटाता है (जैसे, 0.45 और 0.43)। यदि हम मानक सटीकता को मापते हैं, तो इसे गलत मामला माना जाएगा, भले ही मॉडल ने बहुत छोटा गलती की हो। इस कारण से, हम अक्सर एक अन्य मीट्रिक मापते हैं - मॉडल की सबसे संभावित 3 भविष्यवाणियों के भीतर सटीकता।\n",
"ऐसे मामलों में यह सुनिश्चित करना कठिन होता है कि मॉडल **हमेशा** सही वर्ग की भविष्यवाणी करे। कुछ मामलों में दो नस्लें एक-दूसरे से बहुत मिलती-जुलती होती हैं, और मॉडल बहुत समान संभावनाएं लौटाता है (जैसे, 0.45 और 0.43)। यदि हम मानक सटीकता को मापते हैं, तो इसे गलत मामला माना जाएगा, भले ही मॉडल ने बहुत छोटा गलती की हो। इस कारण से, हम अक्सर एक और मीट्रिक मापते हैं - मॉडल की सबसे संभावित तीन भविष्यवाणियों के भीतर सटीकता।\n",
"\n",
"हम मामले को सटीक मानते हैं यदि लक्ष्य लेबल मॉडल की टॉप-3 भविष्यवाणियों के भीतर शामिल है।\n",
"हम उस मामले को सटीक मानते हैं यदि लक्ष्य लेबल मॉडल की टॉप-3 भविष्यवाणियों में शामिल है।\n",
"\n",
"टेस्ट डेटासेट पर टॉप-3 सटीकता की गणना करने के लिए, आपको मैन्युअल रूप से डेटासेट पर जाना होगा, न्यूरल नेटवर्क लागू करना होगा ताकि भविष्यवाणी प्राप्त हो सके, और फिर गणना करनी होगी। कुछ सुझाव:\n",
"\n",
"* Tensorflow में, `tf.nn.in_top_k` फ़ंक्शन का उपयोग करें यह देखने के लिए कि क्या `predictions` (मॉडल का आउटपुट) टॉप-k में हैं (पैरामीटर के रूप में `k=3` पास करें), `targets` के संदर्भ में। यह फ़ंक्शन बूलियन मानों का एक टेंसर लौटाता है, जिसे `tf.cast` का उपयोग करके `int` में बदला जा सकता है, और फिर `tf.reduce_sum` का उपयोग करके जोड़ा जा सकता है।\n",
"* PyTorch में, आप `torch.topk` फ़ंक्शन का उपयोग कर सकते हैं ताकि उच्चतम संभावनाओं वाले वर्गों के इंडेक्स प्राप्त कर सकें, और फिर देख सकें कि सही वर्ग उनमें शामिल है या नहीं। अधिक सुझावों के लिए [यह](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) देखें।\n"
"* Tensorflow में, `tf.nn.in_top_k` फ़ंक्शन का उपयोग करें यह देखने के लिए कि क्या `predictions` (मॉडल का आउटपुट) `targets` के संदर्भ में टॉप-k में हैं (पैरामीटर के रूप में `k=3` पास करें)। यह फ़ंक्शन बूलियन मानों का एक टेंसर लौटाता है, जिसे `tf.cast` का उपयोग करके `int` में परिवर्तित किया जा सकता है, और फिर `tf.reduce_sum` का उपयोग करके जोड़ा जा सकता है।\n",
"* PyTorch में, आप `torch.topk` फ़ंक्शन का उपयोग कर सकते हैं ताकि उच्चतम संभावनाओं वाले वर्गों के इंडेक्स प्राप्त कर सकें, और फिर देख सक हैं कि सही वर्ग उनमें शामिल है या नहीं। अधिक सुझावों के लिए [यह](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) देखें।\n"
]
},
{
@ -324,7 +346,7 @@
"source": [
"## वैकल्पिक: बिल्ली बनाम कुत्ते वर्गीकरण बनाना\n",
"\n",
"हम यह भी देखना चाहते हैं कि हमारे द्विआधारी बिल्ली बनाम कुत्ते वर्गीकरण का उसी डेटासेट पर कितना सटीक परिणाम होगा। इसे करने के लिए, हमें लेबल्स को समायोजित करना होगा:\n"
"हम यह भी देखना चाहते हैं कि हमारे बाइनरी बिल्ली बनाम कुत्ते वर्गीकरण का प्रदर्शन उसी डेटासेट पर कितना सटीक होगा। इसे करने के लिए, हमें लेबल्स को समायोजित करना होगा:\n"
]
},
{
@ -376,8 +398,8 @@
"version": "3.9.5"
},
"coopTranslator": {
"original_hash": "1de3ae931831253c3198d899da48bfe5",
"translation_date": "2025-08-31T14:33:05+00:00",
"original_hash": "df7d1f7da8d2617b76acd93115776ca4",
"translation_date": "2025-10-03T14:31:49+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb",
"language_code": "hi"
}

View File

@ -1,27 +1,27 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "f3d2cee9cb3c52160419e560c57a690e",
"translation_date": "2025-08-24T09:55:19+00:00",
"original_hash": "b70fcf7fcee862990f848c679090943f",
"translation_date": "2025-10-03T14:53:30+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/README.md",
"language_code": "hi"
}
-->
# पालतू जानवरों के चेहरे की श्रेणीकरण
# पालतू जानवरों के चेहरों का वर्गीकरण
[AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners) से लैब असाइनमेंट।
## कार्य
कल्पना करें कि आपको एक पालतू नर्सरी के लिए एक एप्लिकेशन विकसित करनी है जो सभी पालतू जानवरों को सूचीबद्ध करे। ऐसी एप्लिकेशन की एक शानदार विशेषता यह होगी कि वह तस्वीर से स्वचालित रूप से नस्ल की पहचान कर सके। यह कार्य न्यूरल नेटवर्क का उपयोग करके सफलतापूर्वक किया जा सकता है।
कल्पना करें कि आपको एक पालतू जानवरों की नर्सरी के लिए एक एप्लिकेशन विकसित करनी है ताकि सभी पालतू जानवरों को सूचीबद्ध किया जा सके। ऐसी एप्लिकेशन की एक शानदार विशेषता यह होगी कि वह तस्वीर से स्वचालित रूप से नस्ल की पहचान कर सके। यह कार्य न्यूरल नेटवर्क्स का उपयोग करके सफलतापूर्वक किया जा सकता है।
आपको **Pet Faces** डेटासेट का उपयोग करके बिल्लियों और कुत्तों की विभिन्न नस्लों को वर्गीकृत करने के लिए एक कन्वोल्यूशनल न्यूरल नेटवर्क को प्रशिक्षित करना होगा।
आपको **Pet Faces** डेटासेट का उपयोग करके बिल्लियों और कुत्तों की विभिन्न नस्लों को वर्गीकृत करने के लिए एक कन्वोल्यूशनल न्यूरल नेटवर्क को प्रशिक्षित करना होगा।
## डेटासेट
हम **Pet Faces** डेटासेट का उपयोग करेंगे, जो [Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/) पालतू जानवरों के डेटासेट से लिया गया है। इसमें कुत्तों और बिल्लियों की 35 विभिन्न नस्लें शामिल हैं।
हम [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/) का उपयोग करेंगे, जिसमें कुत्तों और बिल्लियों की 37 विभिन्न नस्लों की छवियां शामिल हैं।
![हम जिस डेटासेट से निपटेंगे](../../../../../../lessons/4-ComputerVision/07-ConvNets/lab/images/data.png)
![हम जिस डेटासेट पर काम करेंगे](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.hi.png)
डेटासेट डाउनलोड करने के लिए, इस कोड स्निपेट का उपयोग करें:
@ -31,13 +31,17 @@ CO_OP_TRANSLATOR_METADATA:
!rm images.tar.gz
```
**नोट:** Oxford-IIIT Pet Dataset की छवियां फाइलनाम के अनुसार व्यवस्थित हैं (जैसे, `Abyssinian_1.jpg`, `Bengal_2.jpg`)। नोटबुक में इन छवियों को नस्ल-विशिष्ट सबडायरेक्टरी में व्यवस्थित करने के लिए कोड शामिल है ताकि वर्गीकरण आसान हो सके।
## प्रारंभिक नोटबुक
लैब शुरू करने के लिए [PetFaces.ipynb](../../../../../../lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb) खोलें।
लैब शुरू करने के लिए [PetFaces.ipynb](PetFaces.ipynb) खोलें।
## निष्कर्ष
आपने छवि वर्गीकरण की एक अपेक्षाकृत जटिल समस्या को शुरुआत से हल किया है! यहां काफी सारी श्रेणियां थीं, और फिर भी आप उचित सटीकता प्राप्त करने में सक्षम रहे! यह भी समझ में आता है कि शीर्ष-k सटीकता को मापा जाए, क्योंकि कुछ श्रेणियों को भ्रमित करना आसान है जो इंसानों के लिए भी स्पष्ट रूप से अलग नहीं हैं।
आपने छवि वर्गीकरण की एक अपेक्षाकृत जटिल समस्या को शुरुआत से हल किया है! यहां काफी सारी श्रेणियां थीं, और फिर भी आप उचित सटीकता प्राप्त करने में सक्षम रहे! यह भी समझ में आता है कि टॉप-k सटीकता को मापा जाए, क्योंकि कुछ श्रेणियों को भ्रमित करना आसान है जो मानव दृष्टि से भी स्पष्ट रूप से अलग नहीं हैं।
---
**अस्वीकरण**:
यह दस्तावेज़ AI अनुवाद सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) का उपयोग करके अनुवादित किया गया है। जबकि हम सटीकता सुनिश्चित करने का प्रयास करते हैं, कृपया ध्यान दें कि स्वचालित अनुवाद में त्रुटियां या अशुद्धियां हो सकती हैं। मूल भाषा में उपलब्ध मूल दस्तावेज़ को प्रामाणिक स्रोत माना जाना चाहिए। महत्वपूर्ण जानकारी के लिए, पेशेवर मानव अनुवाद की सिफारिश की जाती है। इस अनुवाद के उपयोग से उत्पन्न किसी भी गलतफहमी या गलत व्याख्या के लिए हम उत्तरदायी नहीं हैं।

View File

@ -10,7 +10,9 @@
"\n",
"### 獲取數據\n",
"\n",
"在這次作業中,我們將專注於一個相對簡單的分類任務——寵物面部的分類。這個數據集包含從 [Oxford-IIIT Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/) 中裁剪出的寵物面部。讓我們先開始載入並視覺化這個數據集。\n"
"在這次作業中,我們將專注於一個相對簡單的分類任務——寵物面部的分類。我們將使用 [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/),該數據集包含 37 種不同品種的狗和貓的圖片。讓我們從下載並可視化數據集開始。\n",
"\n",
"**注意:** Oxford-IIIT Pet Dataset 包含完整的寵物圖片。提取後的文件夾中,圖片將按照品種進行組織。\n"
]
},
{
@ -86,6 +88,24 @@
"metadata": {},
"outputs": [],
"source": [
"# Note: The Oxford-IIIT Pet Dataset extracts to a folder named 'images'\n",
"# Images are named by breed (e.g., 'Abyssinian_1.jpg')\n",
"# We need to organize them into breed-specific subdirectories\n",
"import os\n",
"from collections import defaultdict\n",
"\n",
"# Organize images by breed\n",
"if not os.path.exists('petfaces'):\n",
" os.makedirs('petfaces')\n",
" for img_file in os.listdir('images'):\n",
" if img_file.endswith(('.jpg', '.png')):\n",
" # Extract breed name from filename (everything before the last underscore and number)\n",
" breed = '_'.join(img_file.split('_')[:-1])\n",
" breed_dir = os.path.join('petfaces', breed)\n",
" if not os.path.exists(breed_dir):\n",
" os.makedirs(breed_dir)\n",
" os.rename(os.path.join('images', img_file), os.path.join(breed_dir, img_file))\n",
"\n",
"for cls in os.listdir('petfaces'):\n",
" print(cls)\n",
" display_images([Image.open(os.path.join('petfaces',cls,x)) \n",
@ -96,7 +116,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"讓我們也定義我們數據集中的類別數:\n"
"讓我們也定義我們數據集中的類別數\n"
]
},
{
@ -126,11 +146,11 @@
"source": [
"## 為深度學習準備數據集\n",
"\n",
"在開始訓練我們的神經網絡之前,我們需要將所有圖片轉換為張量,並創建與標籤(類別編號)對應的張量。大多數神經網絡框架都提供了簡單的工具來處理圖片:\n",
"在開始訓練我們的神經網絡之前,我們需要將所有圖片轉換為張量,並且還需要創建與標籤(類別編號)對應的張量。大多數神經網絡框架都提供了簡單的工具來處理圖片:\n",
"* 在 Tensorflow 中,使用 `tf.keras.preprocessing.image_dataset_from_directory`\n",
"* 在 PyTorch 中,使用 `torchvision.datasets.ImageFolder`\n",
"\n",
"正如你從上面的圖片中看到的,它們的比例都接近正方形,因此我們需要將所有圖片調整為正方形大小。此外,我們還可以將圖片組織成小批量處理。\n"
"如上圖所示,所有圖片的比例都接近正方形,因此我們需要將所有圖片調整為正方形大小。此外,我們還可以將圖片組織成小批量。\n"
]
},
{
@ -146,7 +166,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"現在我們需要將數據集分訓練部分和測試部分:\n"
"現在我們需要將數據集分訓練部分和測試部分:\n"
]
},
{
@ -162,11 +182,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"現在讓我們列印數據集中張量的大小。如果你已正確完成所有步驟,訓練元素的大小應該是:\n",
" * 對於 Tensorflow為 `(batch_size,image_size,image_size,3)`;對於 PyTorch應為 `batch_size,3,image_size,image_size`\n",
" * 標籤的大小應為 `batch_size`\n",
"\n",
"標籤應包含類別的數字。\n"
"現在讓我們打印數據集中張量的大小。如果你一切都做對了,訓練元素的大小應該是:\n",
" * 對於 Tensorflow該是 `(batch_size,image_size,image_size,3)`,對於 PyTorch應該是 `batch_size,3,image_size,image_size`\n",
" * 標籤應該是 `batch_size`\n",
" \n",
" 標籤應包含類別的數字。\n"
]
},
{
@ -230,14 +250,14 @@
"source": [
"## 定義神經網絡\n",
"\n",
"對於圖像分類,可能需要定義一個具有多層的卷積神經網絡。需要注意的事項:\n",
"* 記住金字塔架構,即隨著網絡加深,濾波器的數量應該增加\n",
"* 別忘了在層之間加入激活函數ReLU最大池化Max Pooling\n",
"對於圖像分類,可能需要定義一個具有多層的卷積神經網絡。需要注意的事項:\n",
"* 記住金字塔架構,即隨著網絡加深,濾波器的數量應該增加\n",
"* 不要忘記在層之間使用激活函數(例如 ReLU以及最大池化Max Pooling\n",
"* 最終的分類器可以有或沒有隱藏層,但輸出神經元的數量應該等於類別的數量。\n",
"\n",
"一個重要的事情是要正確設置最後一層的激活函數和損失函數:\n",
"* 在 Tensorflow 中,可以使用 `softmax` 作為激活函數,並使用 `sparse_categorical_crossentropy` 作為損失函數。稀疏分類交叉熵和非稀疏交叉熵的區別在於前者期望輸出為類別的編號,而不是 one-hot 向量。\n",
"* 在 PyTorch 中,你可以在最後一層不使用激活函數,並使用 `CrossEntropyLoss` 作為損失函數。這個函數會自動應用 softmax。\n"
"一個重要的是要正確設置最後一層的激活函數和損失函數:\n",
"* 在 Tensorflow 中,可以使用 `softmax` 作為激活函數,並使用 `sparse_categorical_crossentropy` 作為損失函數。稀疏分類交叉熵和非稀疏交叉熵的區別在於前者期望輸出為類別的編號,而不是 one-hot 向量。\n",
"* 在 PyTorch 中,最後一層可以不使用激活函數,並使用 `CrossEntropyLoss` 作為損失函數。函數會自動應用 softmax。\n"
]
},
{
@ -255,9 +275,9 @@
"source": [
"## 訓練神經網絡\n",
"\n",
"現在我們準備好訓練神經網絡了。在訓練過程中,請在每個訓練週期收集訓練和測試數據的準確率,然後繪製準確率圖表,以檢查是否出現過度擬合的情況。\n",
"現在我們準備好訓練神經網絡了。在訓練過程中,請在每個 epoch 收集訓練數據和測試數據的準確率,然後繪製準確率圖表,以檢查是否存在過擬合的情況。\n",
"\n",
"> 為了加快訓練速度,如果有可用的 GPU請使用它。雖然 TensorFlow/Keras 會自動使用 GPU但在 PyTorch 中,你需要使用 `.to()` 方法將模型和數據移動到 GPU 上,才能充分利用 GPU 的加速功能。\n"
"> 為了加快訓練速度,如果有 GPU 可用,請使用 GPU。雖然 TensorFlow/Keras 會自動使用 GPU但在 PyTorch 中,您需要在訓練過程中使用 `.to()` 方法將模型和數據移動到 GPU 上,以利用 GPU 的加速功能。\n"
]
},
{
@ -295,20 +315,20 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"什麼是過度擬合?如何提升模型的準確性?\n",
"關於過度擬合,你可以怎麼說?如何提高模型的準確性?\n",
"\n",
"## 可選:計算 Top-3 準確率\n",
"## 可選:計算 Top3 準確率\n",
"\n",
"在這個練習中,我們處理的是一個分類問題且類別數量相當多35個類別因此我們的結果——大約50%的驗證準確率——已經相當不錯了。標準的 ImageNet 數據集甚至有更多類別——多達1000個。\n",
"在這個練習中,我們處理的是具有相當多類別35類的分類問題因此我們的結果——大約50%的驗證準確率——已經相當不錯了。標準的 ImageNet 數據集甚至有更多類別——1000類。\n",
"\n",
"在這種情況下,很難保證模型**總是**能正確預測類別。有時候兩個品種可能非常相似模型給出的概率也非常接近例如0.45 和 0.43)。如果我們只測量標準準確率,這種情況會被視為錯誤,即使模型只犯了一個很小的錯誤。因此,我們經常會測量另一個指標——模型在最可能的前三個預測中的準確率。\n",
"在這種情況下,很難保證模型**總是**正確地預測類別。有些情況下兩個品種非常相似而模型返回的概率也非常接近例如0.45 和 0.43)。如果我們測量標準準確率,這將被視為錯誤案例,即使模型只犯了很小的錯誤。因此,我們經常測量另一個指標——模型最可能的前三個預測中的準確率。\n",
"\n",
"如果目標標籤包含在模型的前三個預測中,我們就認為這個案例是準確的。\n",
"如果目標標籤包含在模型的前三個預測中,我們就認為案例是準確的。\n",
"\n",
"要計算測試數據集上的 Top-3 準確率,你需要手動遍歷數據集,應用神經網絡進行預測,然後進行計算。一些提示如下\n",
"要在測試數據集上計算 top-3 準確率,你需要手動遍歷數據集,應用神經網絡進行預測,然後進行計算。一些提示:\n",
"\n",
"* 在 Tensorflow 中,可以使用 `tf.nn.in_top_k` 函數來檢查 `predictions`(模型的輸出)是否在 top-k將 `k=3` 作為參數)中,並與 `targets` 進行比較。該函數返回一個布爾值的張量,可以使用 `tf.cast` 將其轉換為 `int`,然後使用 `tf.reduce_sum` 進行累加。\n",
"* 在 PyTorch 中,可以使用 `torch.topk` 函數獲取具有最高概率的類別索引,然後檢查正確的類別是否包含在其中。更多提示請參考[這裡](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b)。\n"
"* 在 Tensorflow 中,使用 `tf.nn.in_top_k` 函數來檢查 `predictions`(模型的輸出)是否在 top-k將 `k=3` 作為參數),相對於 `targets`。此函數返回布爾值的張量,可以使用 `tf.cast` 轉換為 `int`,然後使用 `tf.reduce_sum` 累加。\n",
"* 在 PyTorch 中,可以使用 `torch.topk` 函數獲取具有最高概率的類別索引,然後檢查正確的類別是否屬於其中。參考[這裡](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b)獲取更多提示。\n"
]
},
{
@ -352,7 +372,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**免責聲明** \n本文件已使用人工智能翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。原始語言的文件應被視為權威來源。對於重要信息,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋概不負責。\n"
"\n---\n\n**免責聲明** \n本文件已使用人工智能翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於重要信息,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋概不負責。\n"
]
}
],
@ -378,8 +398,8 @@
"version": "3.9.5"
},
"coopTranslator": {
"original_hash": "1de3ae931831253c3198d899da48bfe5",
"translation_date": "2025-08-31T09:36:15+00:00",
"original_hash": "df7d1f7da8d2617b76acd93115776ca4",
"translation_date": "2025-10-03T14:29:39+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb",
"language_code": "hk"
}

View File

@ -1,25 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "f3d2cee9cb3c52160419e560c57a690e",
"translation_date": "2025-08-24T22:00:15+00:00",
"original_hash": "b70fcf7fcee862990f848c679090943f",
"translation_date": "2025-10-03T14:52:58+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/README.md",
"language_code": "hk"
}
-->
# 寵物面孔分類
來自 [AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners) 的實驗課題
來自 [AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners) 的實驗作業
## 任務
假設你需要開發一個寵物托管應用程式,用來記錄所有的寵物。這個應用程式的一個重要功能是能夠根據照片自動辨識寵物的品種。這可以通過神經網絡成功實現。
假設你需要開發一個寵物托管應用程式,用於記錄所有寵物。這樣的應用程式的一個重要功能就是能夠從照片中自動識別寵物的品種。這可以通過神經網絡成功實現。
你需要訓練一個卷積神經網絡,使用 **Pet Faces** 數據集來分類不同品種的貓和狗
你需要訓練一個卷積神經網絡來分類不同品種的貓和狗,使用 **Pet Faces** 數據集。
## 數據集
我們將使用 **Pet Faces** 數據集,該數據集源自 [Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/) 寵物數據集。它包含 35 種不同品種的狗和貓
我們將使用 [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/)該數據集包含37種不同品種的狗和貓的圖片
![我們將處理的數據集](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.hk.png)
@ -31,13 +31,17 @@ CO_OP_TRANSLATOR_METADATA:
!rm images.tar.gz
```
## 啟動筆記本
**注意:** Oxford-IIIT Pet Dataset 的圖片是根據文件名組織的(例如,`Abyssinian_1.jpg``Bengal_2.jpg`)。筆記本中包含代碼,用於將這些圖片整理到按品種分類的子目錄中,以便於分類。
通過打開 [PetFaces.ipynb](../../../../../../lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb) 開始實驗。
## 開始筆記本
通過打開 [PetFaces.ipynb](PetFaces.ipynb) 開始實驗。
## 收穫
你已經成功解決了一個相對複雜的圖像分類問題!儘管有很多類別,你仍然能夠獲得合理的準確率!此外,測量 top-k 準確率也是有意義的,因為有些類別即使對人類來說也不容易區分。
你已經從零開始解決了一個相對複雜的圖像分類問題!儘管有很多類別,你仍然能夠獲得合理的準確率!同時,測量 top-k 準確率也是有意義的,因為有些類別即使對人類來說也不容易區分。
---
**免責聲明**
本文件使用人工智能翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。應以原文文件作為權威來源。對於關鍵資訊,建議尋求專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或誤釋概不負責。
本文件使用人工智能翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於重要信息,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或釋概不負責。

View File

@ -10,7 +10,9 @@
"\n",
"### Dobivanje podataka\n",
"\n",
"U ovom zadatku usredotočit ćemo se na relativno jednostavan zadatak klasifikacije - klasifikaciju lica kućnih ljubimaca. Ovaj skup podataka sastoji se od izrezanih lica iz [Oxford-IIIT skupa podataka](https://www.robots.ox.ac.uk/~vgg/data/pets/). Započnimo učitavanjem i vizualizacijom skupa podataka.\n"
"U ovom zadatku ćemo se usredotočiti na relativno jednostavan zadatak klasifikacije - klasifikaciju lica kućnih ljubimaca. Koristit ćemo [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), koji sadrži slike 37 različitih pasmina pasa i mačaka. Započnimo preuzimanjem i vizualizacijom skupa podataka.\n",
"\n",
"**Napomena:** Oxford-IIIT Pet Dataset sadrži slike cijelih kućnih ljubimaca. Slike će biti organizirane po pasminama u izdvojenoj mapi.\n"
]
},
{
@ -77,7 +79,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Sada prijeđimo sve poddirektorije razreda i prikažimo prve slike svake klase:\n"
"Sada ćemo proći kroz sve poddirektorije razreda i prikazati prvih nekoliko slika svakog razreda:\n"
]
},
{
@ -86,6 +88,24 @@
"metadata": {},
"outputs": [],
"source": [
"# Note: The Oxford-IIIT Pet Dataset extracts to a folder named 'images'\n",
"# Images are named by breed (e.g., 'Abyssinian_1.jpg')\n",
"# We need to organize them into breed-specific subdirectories\n",
"import os\n",
"from collections import defaultdict\n",
"\n",
"# Organize images by breed\n",
"if not os.path.exists('petfaces'):\n",
" os.makedirs('petfaces')\n",
" for img_file in os.listdir('images'):\n",
" if img_file.endswith(('.jpg', '.png')):\n",
" # Extract breed name from filename (everything before the last underscore and number)\n",
" breed = '_'.join(img_file.split('_')[:-1])\n",
" breed_dir = os.path.join('petfaces', breed)\n",
" if not os.path.exists(breed_dir):\n",
" os.makedirs(breed_dir)\n",
" os.rename(os.path.join('images', img_file), os.path.join(breed_dir, img_file))\n",
"\n",
"for cls in os.listdir('petfaces'):\n",
" print(cls)\n",
" display_images([Image.open(os.path.join('petfaces',cls,x)) \n",
@ -126,11 +146,11 @@
"source": [
"## Priprema skupa podataka za duboko učenje\n",
"\n",
"Za početak treniranja naše neuronske mreže, potrebno je sve slike pretvoriti u tenzore, kao i kreirati tenzore koji odgovaraju oznakama (brojevima klasa). Većina okvira za neuronske mreže sadrži jednostavne alate za rad sa slikama:\n",
"* U Tensorflowu, koristite `tf.keras.preprocessing.image_dataset_from_directory`\n",
"* U PyTorchu, koristite `torchvision.datasets.ImageFolder`\n",
"Kako bismo započeli treniranje naše neuronske mreže, potrebno je pretvoriti sve slike u tenzore, kao i stvoriti tenzore koji odgovaraju oznakama (brojevima klasa). Većina okvira za neuronske mreže sadrži jednostavne alate za rad sa slikama:\n",
"* U Tensorflowu koristite `tf.keras.preprocessing.image_dataset_from_directory`\n",
"* U PyTorchu koristite `torchvision.datasets.ImageFolder`\n",
"\n",
"Kao što ste vidjeli na slikama iznad, sve imaju omjer blizu kvadratnog, pa je potrebno promijeniti veličinu svih slika na kvadratni format. Također, možemo organizirati slike u mini serije.\n"
"Kao što ste vidjeli na slikama iznad, sve su približno kvadratnog omjera, pa je potrebno promijeniti veličinu svih slika na kvadratni format. Također, možemo organizirati slike u mini serije.\n"
]
},
{
@ -162,9 +182,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Sada ispisujemo veličinu tenzora u našem skupu podataka. Ako ste sve ispravno napravili, veličina elemenata za treniranje trebala bi biti\n",
"Sada ćemo ispisati veličinu tenzora u našem skupu podataka. Ako ste sve ispravno napravili, veličina elemenata za treniranje trebala bi biti\n",
" * `(batch_size,image_size,image_size,3)` za Tensorflow, `batch_size,3,image_size,image_size` za PyTorch\n",
" * `batch_size` za Oznake\n",
" * `batch_size` za oznake\n",
" \n",
" Oznake bi trebale sadržavati brojeve klasa.\n"
]
@ -230,14 +250,14 @@
"source": [
"## Definirajte neuronsku mrežu\n",
"\n",
"Za klasifikaciju slika, vjerojatno biste trebali definirati konvolucijsku neuronsku mrežu s nekoliko slojeva. Na što treba obratiti pažnju:\n",
"* Imajte na umu piramidalnu arhitekturu, tj. broj filtera treba se povećavati kako idete dublje.\n",
"* Ne zaboravite aktivacijske funkcije između slojeva (ReLU) i Max Pooling.\n",
"* Završni klasifikator može biti s ili bez skrivenih slojeva, ali broj izlaznih neurona treba biti jednak broju klasa.\n",
"Za klasifikaciju slika, vjerojatno biste trebali definirati konvolucijsku neuronsku mrežu s nekoliko slojeva. Na što obratiti pažnju:\n",
"* Imajte na umu piramidalnu arhitekturu, tj. broj filtera trebao bi se povećavati kako idete dublje.\n",
"* Ne zaboravite funkcije aktivacije između slojeva (ReLU) i Max Pooling.\n",
"* Završni klasifikator može biti s ili bez skrivenih slojeva, ali broj izlaznih neurona mora biti jednak broju klasa.\n",
"\n",
"Važno je pravilno postaviti aktivacijsku funkciju na zadnjem sloju + funkciju gubitka:\n",
"* U Tensorflowu možete koristiti `softmax` kao aktivaciju i `sparse_categorical_crossentropy` kao funkciju gubitka. Razlika između sparse kategorijske unakrsne entropije i nesparse verzije je u tome što prva očekuje izlaz kao broj klase, a ne kao one-hot vektor.\n",
"* U PyTorchu možete imati završni sloj bez aktivacijske funkcije i koristiti funkciju gubitka `CrossEntropyLoss`. Ova funkcija automatski primjenjuje softmax.\n"
"Važno je pravilno postaviti funkciju aktivacije na posljednjem sloju + funkciju gubitka:\n",
"* U Tensorflowu možete koristiti `softmax` kao funkciju aktivacije i `sparse_categorical_crossentropy` kao funkciju gubitka. Razlika između sparse categorical cross-entropy i nesparse verzije je u tome što prva očekuje izlaz kao broj klase, a ne kao one-hot vektor.\n",
"* U PyTorchu završni sloj može biti bez funkcije aktivacije, a možete koristiti funkciju gubitka `CrossEntropyLoss`. Ova funkcija automatski primjenjuje softmax.\n"
]
},
{
@ -257,7 +277,7 @@
"\n",
"Sada smo spremni za treniranje neuronske mreže. Tijekom treninga, molimo vas da prikupljate točnost na treniranim i testnim podacima za svaki epoch, a zatim prikažete točnost kako biste vidjeli postoji li prekomjerno prilagođavanje.\n",
"\n",
"> Za ubrzanje treninga, trebate koristiti GPU ako je dostupan. Dok TensorFlow/Keras automatski koristi GPU, u PyTorchu morate premjestiti i model i podatke na GPU tijekom treninga koristeći metodu `.to()` kako biste iskoristili prednosti GPU ubrzanja.\n"
"> Kako biste ubrzali trening, trebate koristiti GPU ako je dostupan. Dok će TensorFlow/Keras automatski koristiti GPU, u PyTorchu morate premjestiti i model i podatke na GPU tijekom treninga koristeći metodu `.to()` kako biste iskoristili prednosti ubrzanja putem GPU-a.\n"
]
},
{
@ -299,16 +319,16 @@
"\n",
"## Opcionalno: Izračunajte Top3 točnost\n",
"\n",
"U ovom zadatku bavili smo se klasifikacijom s prilično velikim brojem klasa (35), pa je naš rezultat - oko 50% točnosti validacije - prilično dobar. Standardni ImageNet dataset ima čak i više - 1000 klasa.\n",
"U ovom zadatku bavili smo se klasifikacijom s prilično velikim brojem klasa (35), pa je naš rezultat - oko 50% točnosti validacije - prilično dobar. Standardni ImageNet skup podataka ima čak i više - 1000 klasa.\n",
"\n",
"U takvim slučajevima teško je osigurati da model **uvijek** točno predvidi klasu. Postoje situacije kada su dvije pasmine vrlo slične jedna drugoj, a model vraća vrlo slične vjerojatnosti (npr., 0.45 i 0.43). Ako mjerimo standardnu točnost, to će se smatrati pogrešnim slučajem, iako je model napravio vrlo malu grešku. Zbog toga često mjerimo drugu metriku - točnost unutar top 3 najvjerojatnije predikcije modela.\n",
"U takvim slučajevima teško je osigurati da model **uvijek** točno predviđa klasu. Postoje situacije kada su dvije pasmine vrlo slične jedna drugoj, a model vraća vrlo slične vjerojatnosti (npr., 0.45 i 0.43). Ako mjerimo standardnu točnost, to će se smatrati pogrešnim slučajem, iako je model napravio vrlo malu grešku. Zbog toga često mjerimo drugu metriku - točnost unutar top 3 najvjerojatnijih predikcija modela.\n",
"\n",
"Slučaj smatramo točnim ako je ciljana oznaka sadržana unutar top 3 predikcije modela.\n",
"Slučaj smatramo točnim ako se ciljana oznaka nalazi unutar top 3 predikcije modela.\n",
"\n",
"Da biste izračunali top-3 točnost na testnom datasetu, trebate ručno proći kroz dataset, primijeniti neuronsku mrežu kako biste dobili predikciju, a zatim napraviti izračune. Nekoliko savjeta:\n",
"Za izračunavanje top-3 točnosti na testnom skupu podataka, potrebno je ručno pregledati skup podataka, primijeniti neuronsku mrežu za dobivanje predikcije i zatim napraviti izračune. Nekoliko savjeta:\n",
"\n",
"* U Tensorflowu, koristite funkciju `tf.nn.in_top_k` kako biste provjerili jesu li `predictions` (izlaz modela) u top-k (proslijedite `k=3` kao parametar), s obzirom na `targets`. Ova funkcija vraća tensor vrijednosti tipa boolean, koje se mogu pretvoriti u `int` pomoću `tf.cast`, a zatim akumulirati pomoću `tf.reduce_sum`.\n",
"* U PyTorchu, možete koristiti funkciju `torch.topk` kako biste dobili indekse klasa s najvišim vjerojatnostima, a zatim provjeriti pripada li točna klasa njima. Pogledajte [ovdje](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) za više savjeta.\n"
"* U Tensorflowu, koristite funkciju `tf.nn.in_top_k` kako biste provjerili jesu li `predictions` (izlaz modela) u top-k (proslijedite `k=3` kao parametar), u odnosu na `targets`. Ova funkcija vraća tensor vrijednosti tipa boolean, koje se mogu pretvoriti u `int` pomoću `tf.cast`, a zatim akumulirati pomoću `tf.reduce_sum`.\n",
"* U PyTorchu, možete koristiti funkciju `torch.topk` za dobivanje indeksa klasa s najvišim vjerojatnostima, a zatim provjeriti pripada li točna klasa među njima. Pogledajte [ovdje](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) za više savjeta.\n"
]
},
{
@ -326,7 +346,7 @@
"source": [
"## Opcionalno: Izgradnja klasifikacije mačke vs. psi\n",
"\n",
"Također želimo vidjeti koliko bi točna bila naša binarna klasifikacija mačke vs. psi na istom skupu podataka. Da bismo to učinili, trebamo prilagoditi oznake:\n"
"Također želimo vidjeti koliko bi naša binarna klasifikacija mačke vs. psi bila točna na istom skupu podataka. Da bismo to učinili, trebamo prilagoditi oznake:\n"
]
},
{
@ -352,7 +372,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Odricanje od odgovornosti**: \nOvaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakve nesporazume ili pogrešne interpretacije proizašle iz korištenja ovog prijevoda.\n"
"\n---\n\n**Odricanje od odgovornosti**: \nOvaj dokument je preveden pomoću AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za nesporazume ili pogrešna tumačenja koja mogu proizaći iz korištenja ovog prijevoda.\n"
]
}
],
@ -378,8 +398,8 @@
"version": "3.9.5"
},
"coopTranslator": {
"original_hash": "1de3ae931831253c3198d899da48bfe5",
"translation_date": "2025-08-30T07:18:56+00:00",
"original_hash": "df7d1f7da8d2617b76acd93115776ca4",
"translation_date": "2025-10-03T14:48:01+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb",
"language_code": "hr"
}

View File

@ -1,29 +1,29 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "f3d2cee9cb3c52160419e560c57a690e",
"translation_date": "2025-08-25T22:58:48+00:00",
"original_hash": "b70fcf7fcee862990f848c679090943f",
"translation_date": "2025-10-03T14:58:11+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/README.md",
"language_code": "hr"
}
-->
# Klasifikacija lica kućnih ljubimaca
Laboratorijska vježba iz [AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners).
Laboratorijska vježba iz [AI za početnike](https://github.com/microsoft/ai-for-beginners).
## Zadatak
Zamislite da trebate razviti aplikaciju za vrtić za kućne ljubimce kako biste katalogizirali sve ljubimce. Jedna od sjajnih značajki takve aplikacije bila bi automatsko prepoznavanje pasmine s fotografije. To se može uspješno postići korištenjem neuronskih mreža.
Zamislite da trebate razviti aplikaciju za vrtić za kućne ljubimce kako biste katalogizirali sve ljubimce. Jedna od sjajnih značajki takve aplikacije bila bi automatsko prepoznavanje pasmine s fotografije. Ovo se može uspješno postići korištenjem neuronskih mreža.
Potrebno je trenirati konvolucijsku neuronsku mrežu za klasifikaciju različitih pasmina mačaka i pasa koristeći **Pet Faces** dataset.
Vaš zadatak je trenirati konvolucijsku neuronsku mrežu za klasifikaciju različitih pasmina mačaka i pasa koristeći **Pet Faces** skup podataka.
## Dataset
## Skup podataka
Koristit ćemo **Pet Faces** dataset, izveden iz [Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/) dataset-a za kućne ljubimce. Sadrži 35 različitih pasmina pasa i mačaka.
Koristit ćemo [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), koji sadrži slike 37 različitih pasmina pasa i mačaka.
![Dataset s kojim ćemo raditi](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.hr.png)
![Skup podataka s kojim ćemo raditi](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.hr.png)
Za preuzimanje dataset-a, koristite ovaj isječak koda:
Za preuzimanje skupa podataka, koristite ovaj isječak koda:
```python
!wget https://thor.robots.ox.ac.uk/~vgg/data/pets/images.tar.gz
@ -31,13 +31,17 @@ Za preuzimanje dataset-a, koristite ovaj isječak koda:
!rm images.tar.gz
```
## Početak rada s bilježnicom
**Napomena:** Slike u Oxford-IIIT Pet Datasetu organizirane su prema nazivima datoteka (npr. `Abyssinian_1.jpg`, `Bengal_2.jpg`). Notebook uključuje kod za organizaciju ovih slika u poddirektorije specifične za pasmine radi lakše klasifikacije.
Započnite laboratorij otvaranjem [PetFaces.ipynb](../../../../../../lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb)
## Početni Notebook
Započnite laboratorij otvaranjem [PetFaces.ipynb](PetFaces.ipynb)
## Zaključak
Riješili ste relativno složen problem klasifikacije slika od nule! Bilo je prilično mnogo klasa, a ipak ste uspjeli postići razumnu točnost! Također ima smisla mjeriti top-k točnost, jer je lako zamijeniti neke klase koje čak ni ljudima nisu jasno različite.
Riješili ste relativno složen problem klasifikacije slika od nule! Postojalo je prilično mnogo klasa, a ipak ste uspjeli postići razumnu točnost! Također ima smisla mjeriti top-k točnost, jer je lako zamijeniti neke klase koje čak i ljudima nisu jasno različite.
**Odricanje od odgovornosti**:
Ovaj dokument je preveden pomoću AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za kritične informacije preporučuje se profesionalni prijevod od strane čovjeka. Ne preuzimamo odgovornost za nesporazume ili pogrešna tumačenja koja mogu proizaći iz korištenja ovog prijevoda.
---
**Izjava o odricanju odgovornosti**:
Ovaj dokument je preveden pomoću AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za nesporazume ili pogrešna tumačenja koja mogu proizaći iz korištenja ovog prijevoda.

View File

@ -10,7 +10,9 @@
"\n",
"### Az adatok beszerzése\n",
"\n",
"Ebben a feladatban egy viszonylag egyszerű osztályozási feladatra koncentrálunk - háziállatok arcainak osztályozására. Ez az adatállomány kivágott arcokat tartalmaz az [Oxford-IIIT Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/) adatbázisból. Kezdjük azzal, hogy betöltjük és vizualizáljuk az adatokat.\n"
"Ebben a feladatban egy viszonylag egyszerű osztályozási feladatra koncentrálunk - háziállatok arcainak osztályozására. Az [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/) adathalmazt fogjuk használni, amely 37 különböző kutya- és macskafajta képeit tartalmazza. Kezdjük az adathalmaz letöltésével és vizualizálásával.\n",
"\n",
"**Megjegyzés:** Az Oxford-IIIT Pet Dataset teljes háziállat képeket tartalmaz. A képek az adott fajta szerint lesznek rendszerezve a kicsomagolt mappában.\n"
]
},
{
@ -46,7 +48,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Általános függvényt fogunk definiálni, hogy képek sorozatát jelenítsük meg egy listából:\n"
"Meghatározunk egy általános függvényt, amely képek sorozatát jeleníti meg egy listából:\n"
]
},
{
@ -77,7 +79,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Most nézzük meg az összes osztály almappáját, és ábrázoljuk az egyes osztályok első néhány képét:\n"
"Most nézzük meg az összes osztály alkönyvtárát, és ábrázoljuk az egyes osztályok első néhány képét:\n"
]
},
{
@ -86,6 +88,24 @@
"metadata": {},
"outputs": [],
"source": [
"# Note: The Oxford-IIIT Pet Dataset extracts to a folder named 'images'\n",
"# Images are named by breed (e.g., 'Abyssinian_1.jpg')\n",
"# We need to organize them into breed-specific subdirectories\n",
"import os\n",
"from collections import defaultdict\n",
"\n",
"# Organize images by breed\n",
"if not os.path.exists('petfaces'):\n",
" os.makedirs('petfaces')\n",
" for img_file in os.listdir('images'):\n",
" if img_file.endswith(('.jpg', '.png')):\n",
" # Extract breed name from filename (everything before the last underscore and number)\n",
" breed = '_'.join(img_file.split('_')[:-1])\n",
" breed_dir = os.path.join('petfaces', breed)\n",
" if not os.path.exists(breed_dir):\n",
" os.makedirs(breed_dir)\n",
" os.rename(os.path.join('images', img_file), os.path.join(breed_dir, img_file))\n",
"\n",
"for cls in os.listdir('petfaces'):\n",
" print(cls)\n",
" display_images([Image.open(os.path.join('petfaces',cls,x)) \n",
@ -96,7 +116,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Határozzuk meg az osztályok számát az adatállományunkban:\n"
"Határozzuk meg a datasetünkben lévő osztályok számát is:\n"
]
},
{
@ -126,11 +146,11 @@
"source": [
"## Adatkészlet előkészítése mélytanuláshoz\n",
"\n",
"Ahhoz, hogy elkezdhessük a neurális hálózatunk tanítását, az összes képet tensorokká kell alakítanunk, valamint létre kell hoznunk a tensorokat, amelyek a címkékhez (osztályszámokhoz) tartoznak. A legtöbb neurális hálózat keretrendszer egyszerű eszközöket kínál a képek kezeléséhez:\n",
"Ahhoz, hogy elkezdjük a neurális hálózatunk tanítását, minden képet tenzorokká kell alakítanunk, valamint létre kell hoznunk a címkékhez (osztályszámokhoz) tartozó tenzorokat is. A legtöbb neurális hálózati keretrendszer egyszerű eszközöket kínál a képek kezeléséhez:\n",
"* Tensorflow-ban használja a `tf.keras.preprocessing.image_dataset_from_directory` függvényt\n",
"* PyTorch-ban használja a `torchvision.datasets.ImageFolder` osztályt\n",
"\n",
"Ahogy a fenti képeken látható, mindegyikük közel négyzetes képarányú, ezért az összes képet négyzetes méretre kell átméretezni. Emellett a képeket minibatch-ekbe is rendezhetjük.\n"
"Ahogy a fenti képeken látható, mindegyikük közel négyzetes képarányú, ezért minden képet négyzetes méretre kell átméretezni. Emellett a képeket minibatch-ekbe is rendezhetjük.\n"
]
},
{
@ -162,7 +182,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Most nézzük meg a tenzorok méretét az adatainkban. Ha mindent helyesen csináltál, a tanító elemek mérete a következő kell legyen:\n",
"Most nyomtassuk ki a tenzorok méretét az adatainkban. Ha mindent helyesen csináltál, a tanító elemek mérete a következő kell legyen:\n",
" * `(batch_size,image_size,image_size,3)` Tensorflow esetén, `batch_size,3,image_size,image_size` PyTorch esetén\n",
" * `batch_size` a címkék esetén\n",
" \n",
@ -230,13 +250,13 @@
"source": [
"## Neurális hálózat definiálása\n",
"\n",
"Képosztályozáshoz valószínűleg egy több rétegből álló konvolúciós neurális hálózatot kell definiálnod. Mire érdemes figyelni:\n",
"* Tartsd szem előtt a piramis architektúrát, azaz a szűrők számának növekednie kell, ahogy mélyebbre haladsz.\n",
"Képfelismeréshez valószínűleg egy konvolúciós neurális hálózatot kell definiálnod, amely több rétegből áll. Mire érdemes figyelni:\n",
"* Tartsd szem előtt a piramis architektúrát, azaz a szűrők száma növekedjen, ahogy mélyebbre haladsz.\n",
"* Ne felejtsd el a rétegek közötti aktivációs függvényeket (ReLU) és a Max Poolingot.\n",
"* A végső osztályozó lehet rejtett rétegekkel vagy anélkül, de a kimeneti neuronok számának meg kell egyeznie az osztályok számával.\n",
"* A végső osztályozó lehet rejtett rétegekkel vagy anélkül, de az output neuronok számának meg kell egyeznie az osztályok számával.\n",
"\n",
"Fontos, hogy az utolsó réteg aktivációs függvényét és a veszteségfüggvényt helyesen válaszd meg:\n",
"* Tensorflow-ban használhatod a `softmax`-ot aktivációként, és a `sparse_categorical_crossentropy`-t veszteségként. A különbség a sparse kategóriális keresztentrópia és a nem-sparse változata között az, hogy az előbbi az osztály számát várja kimenetként, nem pedig one-hot vektort.\n",
"Fontos, hogy a legutolsó réteg aktivációs függvényét és a veszteségfüggvényt helyesen válaszd meg:\n",
"* Tensorflow-ban használhatod a `softmax` aktivációs függvényt és a `sparse_categorical_crossentropy` veszteségfüggvényt. A különbség a sparse és a nem-sparse kategóriális keresztentrópia között az, hogy az előbbi az osztály számát várja el outputként, nem pedig one-hot vektort.\n",
"* PyTorch-ban a végső réteg lehet aktivációs függvény nélkül, és használhatod a `CrossEntropyLoss` veszteségfüggvényt. Ez a függvény automatikusan alkalmazza a softmaxot.\n"
]
},
@ -255,9 +275,9 @@
"source": [
"## Tanítsd a neurális hálózatot\n",
"\n",
"Most készen állunk arra, hogy betanítsuk a neurális hálózatot. A tanítás során gyűjtsd össze a pontosságot a tanító és teszt adatokon minden egyes epoch alatt, majd ábrázold a pontosságot, hogy megállapíthasd, van-e túlillesztés.\n",
"Most készen állunk a neurális hálózat tanítására. A tanítás során gyűjtsd össze a pontosságot a tanító és teszt adatokon minden epoch alatt, majd ábrázold a pontosságot, hogy megállapíthasd, van-e túltanulás.\n",
"\n",
"> A tanítás felgyorsítása érdekében használd a GPU-t, ha elérhető. Míg a TensorFlow/Keras automatikusan használja a GPU-t, PyTorch esetében a modell és az adatok GPU-ra mozgatása szükséges a `.to()` metódus segítségével, hogy kihasználhasd a GPU gyorsítását.\n"
"> A tanítás felgyorsítása érdekében használd a GPU-t, ha elérhető. Míg a TensorFlow/Keras automatikusan használja a GPU-t, PyTorch esetében a modellt és az adatokat is át kell helyezni a GPU-ra a `.to()` metódus segítségével, hogy kihasználhasd a GPU gyorsítását.\n"
]
},
{
@ -295,19 +315,19 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Mit mondhatunk a túltanulásról? Mit tehetünk a modell pontosságának javítása érdekében?\n",
"Mit mondhatunk a túlillesztésről? Mit tehetünk a modell pontosságának javítása érdekében?\n",
"\n",
"## Opcionális: Számítsd ki a Top3 pontosságot\n",
"\n",
"Ebben a gyakorlatban egy olyan osztályozási feladattal foglalkoztunk, amelyben meglehetősen sok osztály (35) szerepelt, így az eredményünk - körülbelül 50%-os validációs pontosság - elég jónak mondható. A standard ImageNet adatbázisban még ennél is több osztály van - 1000.\n",
"\n",
"Ilyen esetekben nehéz biztosítani, hogy a modell **mindig** helyesen jósolja meg az osztályt. Vannak olyan esetek, amikor két fajta nagyon hasonlít egymásra, és a modell nagyon hasonló valószínűségeket ad vissza (pl. 0.45 és 0.43). Ha a standard pontosságot mérjük, ez hibás esetnek számít, annak ellenére, hogy a modell csak egy nagyon kis hibát vétett. Ezért gyakran mérünk egy másik metrikát is - a pontosságot a modell három legvalószínűbb előrejelzése között.\n",
"Ilyen esetekben nehéz biztosítani, hogy a modell **mindig** helyesen jósolja meg az osztályt. Vannak olyan esetek, amikor két fajta nagyon hasonlít egymásra, és a modell nagyon hasonló valószínűségeket ad vissza (pl. 0.45 és 0.43). Ha a standard pontosságot mérjük, ez hibás esetnek számít, annak ellenére, hogy a modell csak egy nagyon kis hibát követett el. Ezért gyakran mérünk egy másik metrikát is - a pontosságot a modell három legvalószínűbb előrejelzése között.\n",
"\n",
"Egy esetet pontosnak tekintünk, ha a célcímke szerepel a modell három legvalószínűbb előrejelzése között.\n",
"\n",
"A top-3 pontosság kiszámításához a tesztadatkészleten manuálisan kell végigmenni az adatokon, alkalmazni a neurális hálót az előrejelzéshez, majd elvégezni a számításokat. Néhány tipp:\n",
"A top-3 pontosság kiszámításához a tesztadatokon manuálisan kell végigmenni az adathalmazon, alkalmazni a neurális hálót az előrejelzéshez, majd elvégezni a számításokat. Néhány tipp:\n",
"\n",
"* Tensorflow-ban használd a `tf.nn.in_top_k` függvényt, hogy megnézd, a `predictions` (a modell kimenete) benne van-e a top-k-ban (add meg a `k=3` paramétert), a `targets`-hez viszonyítva. Ez a függvény egy logikai értékeket tartalmazó tenzort ad vissza, amelyet `tf.cast` segítségével `int`-é lehet alakítani, majd `tf.reduce_sum` segítségével összegezni.\n",
"* Tensorflow-ban használd a `tf.nn.in_top_k` függvényt, hogy megnézd, a `predictions` (a modell kimenete) benne van-e a top-k-ban (add meg a `k=3` paramétert), a `targets`-hez viszonyítva. Ez a függvény egy logikai értékeket tartalmazó tenzort ad vissza, amelyet `tf.cast` segítségével `int`-é lehet alakítani, majd `tf.reduce_sum`-mal összegezni.\n",
"* PyTorch-ban használhatod a `torch.topk` függvényt, hogy megkapd a legnagyobb valószínűségekkel rendelkező osztályok indexeit, majd megnézheted, hogy a helyes osztály szerepel-e közöttük. További tippekért lásd [ezt](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b).\n"
]
},
@ -324,9 +344,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## Opcionális: Macskák és kutyák osztályozásának elkészítése\n",
"## Opcionális: Macskák vs. Kutyák osztályozásának felépítése\n",
"\n",
"Szeretnénk azt is megnézni, hogy mennyire pontos lenne a bináris macskák vs. kutyák osztályozás ugyanazon az adathalmazon. Ehhez a címkéket kell módosítanunk:\n"
"Szeretnénk megnézni, mennyire pontos lenne a bináris macskák vs. kutyák osztályozás ugyanazon az adathalmazon. Ehhez módosítanunk kell a címkéket:\n"
]
},
{
@ -352,7 +372,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Felelősségkizárás**: \nEz a dokumentum az [Co-op Translator](https://github.com/Azure/co-op-translator) AI fordítási szolgáltatás segítségével készült. Bár törekszünk a pontosságra, kérjük, vegye figyelembe, hogy az automatikus fordítások hibákat vagy pontatlanságokat tartalmazhatnak. Az eredeti dokumentum az eredeti nyelvén tekintendő hiteles forrásnak. Kritikus információk esetén javasolt professzionális, emberi fordítást igénybe venni. Nem vállalunk felelősséget a fordítás használatából eredő félreértésekért vagy téves értelmezésekért.\n"
"\n---\n\n**Felelősség kizárása**: \nEz a dokumentum az [Co-op Translator](https://github.com/Azure/co-op-translator) AI fordítási szolgáltatás segítségével lett lefordítva. Bár törekszünk a pontosságra, kérjük, vegye figyelembe, hogy az automatikus fordítások hibákat vagy pontatlanságokat tartalmazhatnak. Az eredeti dokumentum az eredeti nyelvén tekintendő hiteles forrásnak. Fontos információk esetén javasolt professzionális emberi fordítást igénybe venni. Nem vállalunk felelősséget semmilyen félreértésért vagy téves értelmezésért, amely a fordítás használatából eredhet.\n"
]
}
],
@ -378,8 +398,8 @@
"version": "3.9.5"
},
"coopTranslator": {
"original_hash": "1de3ae931831253c3198d899da48bfe5",
"translation_date": "2025-08-29T13:28:43+00:00",
"original_hash": "df7d1f7da8d2617b76acd93115776ca4",
"translation_date": "2025-10-03T14:44:37+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb",
"language_code": "hu"
}

View File

@ -1,8 +1,8 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "f3d2cee9cb3c52160419e560c57a690e",
"translation_date": "2025-08-25T22:57:52+00:00",
"original_hash": "b70fcf7fcee862990f848c679090943f",
"translation_date": "2025-10-03T14:56:53+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/README.md",
"language_code": "hu"
}
@ -13,17 +13,17 @@ Laborfeladat az [AI for Beginners Curriculum](https://github.com/microsoft/ai-fo
## Feladat
Képzeld el, hogy egy alkalmazást kell fejlesztened egy kisállat óvoda számára, amely katalogizálja az összes háziállatot. Az alkalmazás egyik nagyszerű funkciója az lenne, hogy egy fénykép alapján automatikusan felismeri a fajtát. Ez sikeresen megvalósítható neurális hálózatok segítségével.
Képzeld el, hogy egy alkalmazást kell fejlesztened egy kisállat óvoda számára, amely katalogizálja az összes háziállatot. Az alkalmazás egyik nagyszerű funkciója az lenne, hogy automatikusan felismeri a fajtát egy fénykép alapján. Ez sikeresen megvalósítható neurális hálózatok segítségével.
Egy konvolúciós neurális hálózatot kell betanítanod, amely képes különböző macska- és kutyafajtákat osztályozni a **Pet Faces** adatbázis segítségével.
Egy konvolúciós neurális hálózatot kell betanítanod, amely képes különböző macska- és kutyafajták osztályozására a **Pet Faces** adathalmaz segítségével.
## Az Adatbázis
## Az adathalmaz
A **Pet Faces** adatbázist fogjuk használni, amely az [Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/) kisállat adatbázisból származik. Ez 35 különböző kutya- és macskafajtát tartalmaz.
Az [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/) adathalmazt fogjuk használni, amely 37 különböző kutya- és macskafajta képeit tartalmazza.
![Az adatbázis, amellyel dolgozni fogunk](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.hu.png)
![Az adathalmaz, amellyel dolgozni fogunk](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.hu.png)
Az adatbázis letöltéséhez használd az alábbi kódrészletet:
Az adathalmaz letöltéséhez használd az alábbi kódrészletet:
```python
!wget https://thor.robots.ox.ac.uk/~vgg/data/pets/images.tar.gz
@ -31,13 +31,17 @@ Az adatbázis letöltéséhez használd az alábbi kódrészletet:
!rm images.tar.gz
```
## Induló Jegyzetfüzet
**Megjegyzés:** Az Oxford-IIIT Pet Dataset képei fájlnév szerint vannak rendezve (pl. `Abyssinian_1.jpg`, `Bengal_2.jpg`). A notebook tartalmaz kódot, amely segít ezeket a képeket fajtaspecifikus alkönyvtárakba rendezni az egyszerűbb osztályozás érdekében.
Kezdd a labort a [PetFaces.ipynb](../../../../../../lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb) megnyitásával.
## Induló notebook
Kezdd el a labort a [PetFaces.ipynb](PetFaces.ipynb) megnyitásával.
## Tanulság
Egy viszonylag összetett problémát oldottál meg, amely a képosztályozásról szólt, teljesen az alapoktól! Rengeteg osztály volt, és mégis sikerült elfogadható pontosságot elérned! Érdemes megmérni a top-k pontosságot is, mivel könnyű összekeverni néhány olyan osztályt, amelyek még az emberek számára sem különböztethetők meg egyértelműen.
Egy viszonylag összetett problémát oldottál meg, amely a képosztályozásról szól, teljesen az alapoktól! Rengeteg osztály volt, és mégis sikerült elfogadható pontosságot elérned! Érdemes lehet a top-k pontosságot is mérni, mivel könnyű összekeverni néhány osztályt, amelyek még az emberek számára sem különböztethetők meg egyértelműen.
**Felelősség kizárása**:
Ez a dokumentum az AI fordítási szolgáltatás, a [Co-op Translator](https://github.com/Azure/co-op-translator) segítségével lett lefordítva. Bár törekszünk a pontosságra, kérjük, vegye figyelembe, hogy az automatikus fordítások hibákat vagy pontatlanságokat tartalmazhatnak. Az eredeti dokumentum az eredeti nyelvén tekintendő hiteles forrásnak. Kritikus információk esetén javasolt professzionális emberi fordítást igénybe venni. Nem vállalunk felelősséget semmilyen félreértésért vagy téves értelmezésért, amely a fordítás használatából eredhet.
---
**Felelősségi nyilatkozat**:
Ez a dokumentum az [Co-op Translator](https://github.com/Azure/co-op-translator) AI fordítási szolgáltatás segítségével került lefordításra. Bár törekszünk a pontosságra, kérjük, vegye figyelembe, hogy az automatikus fordítások hibákat vagy pontatlanságokat tartalmazhatnak. Az eredeti dokumentum az eredeti nyelvén tekintendő hiteles forrásnak. Fontos információk esetén javasolt professzionális emberi fordítást igénybe venni. Nem vállalunk felelősséget semmilyen félreértésért vagy téves értelmezésért, amely a fordítás használatából eredhet.

View File

@ -10,7 +10,9 @@
"\n",
"### Mendapatkan Data\n",
"\n",
"Dalam tugas ini, kita akan fokus pada tugas klasifikasi yang relatif sederhana - klasifikasi wajah hewan peliharaan. Dataset ini terdiri dari potongan wajah dari [Oxford-IIIT Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/). Mari kita mulai dengan memuat dan memvisualisasikan dataset.\n"
"Dalam tugas ini, kita akan fokus pada tugas klasifikasi yang relatif sederhana - klasifikasi wajah hewan peliharaan. Kita akan menggunakan [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), yang berisi gambar dari 37 jenis ras anjing dan kucing. Mari kita mulai dengan mengunduh dan memvisualisasikan dataset.\n",
"\n",
"**Catatan:** Oxford-IIIT Pet Dataset berisi gambar lengkap hewan peliharaan. Gambar-gambar akan diorganisasi berdasarkan ras dalam folder yang diekstrak.\n"
]
},
{
@ -86,6 +88,24 @@
"metadata": {},
"outputs": [],
"source": [
"# Note: The Oxford-IIIT Pet Dataset extracts to a folder named 'images'\n",
"# Images are named by breed (e.g., 'Abyssinian_1.jpg')\n",
"# We need to organize them into breed-specific subdirectories\n",
"import os\n",
"from collections import defaultdict\n",
"\n",
"# Organize images by breed\n",
"if not os.path.exists('petfaces'):\n",
" os.makedirs('petfaces')\n",
" for img_file in os.listdir('images'):\n",
" if img_file.endswith(('.jpg', '.png')):\n",
" # Extract breed name from filename (everything before the last underscore and number)\n",
" breed = '_'.join(img_file.split('_')[:-1])\n",
" breed_dir = os.path.join('petfaces', breed)\n",
" if not os.path.exists(breed_dir):\n",
" os.makedirs(breed_dir)\n",
" os.rename(os.path.join('images', img_file), os.path.join(breed_dir, img_file))\n",
"\n",
"for cls in os.listdir('petfaces'):\n",
" print(cls)\n",
" display_images([Image.open(os.path.join('petfaces',cls,x)) \n",
@ -126,11 +146,11 @@
"source": [
"## Mempersiapkan dataset untuk Deep Learning\n",
"\n",
"Untuk mulai melatih jaringan neural kita, kita perlu mengonversi semua gambar menjadi tensor, serta membuat tensor yang sesuai dengan label (nomor kelas). Sebagian besar kerangka kerja jaringan neural memiliki alat sederhana untuk menangani gambar:\n",
"Untuk memulai pelatihan jaringan neural kita, kita perlu mengonversi semua gambar menjadi tensor, serta membuat tensor yang sesuai dengan label (nomor kelas). Sebagian besar kerangka kerja jaringan neural memiliki alat sederhana untuk menangani gambar:\n",
"* Dalam Tensorflow, gunakan `tf.keras.preprocessing.image_dataset_from_directory`\n",
"* Dalam PyTorch, gunakan `torchvision.datasets.ImageFolder`\n",
"\n",
"Seperti yang telah Anda lihat dari gambar di atas, semua gambar memiliki rasio yang mendekati persegi, jadi kita perlu mengubah ukuran semua gambar menjadi ukuran persegi. Selain itu, kita dapat mengorganisasi gambar dalam minibatch.\n"
"Seperti yang telah Anda lihat dari gambar di atas, semuanya memiliki rasio gambar yang mendekati persegi, jadi kita perlu mengubah ukuran semua gambar menjadi ukuran persegi. Selain itu, kita dapat mengatur gambar dalam minibatch.\n"
]
},
{
@ -230,14 +250,14 @@
"source": [
"## Mendefinisikan jaringan neural\n",
"\n",
"Untuk klasifikasi gambar, Anda sebaiknya mendefinisikan jaringan neural konvolusional dengan beberapa lapisan. Hal-hal yang perlu diperhatikan:\n",
"* Ingatlah arsitektur piramida, yaitu jumlah filter harus meningkat seiring dengan kedalaman jaringan.\n",
"* Jangan lupa fungsi aktivasi di antara lapisan-lapisan (ReLU) dan Max Pooling.\n",
"* Klasifikator akhir bisa menggunakan lapisan tersembunyi atau tidak, tetapi jumlah neuron output harus sama dengan jumlah kelas.\n",
"Untuk klasifikasi gambar, Anda sebaiknya mendefinisikan jaringan neural konvolusi dengan beberapa lapisan. Hal-hal yang perlu diperhatikan:\n",
"* Ingatlah arsitektur piramida, yaitu jumlah filter harus meningkat seiring dengan semakin dalamnya lapisan.\n",
"* Jangan lupa fungsi aktivasi di antara lapisan (ReLU) dan Max Pooling.\n",
"* Pengklasifikasi akhir dapat menggunakan atau tanpa lapisan tersembunyi, tetapi jumlah neuron output harus sama dengan jumlah kelas.\n",
"\n",
"Hal penting lainnya adalah memastikan fungsi aktivasi pada lapisan terakhir + fungsi loss sudah benar:\n",
"* Dalam Tensorflow, Anda dapat menggunakan `softmax` sebagai fungsi aktivasi, dan `sparse_categorical_crossentropy` sebagai fungsi loss. Perbedaan antara sparse categorical cross-entropy dan yang non-sparse adalah bahwa yang pertama mengharapkan output berupa nomor kelas, bukan vektor one-hot.\n",
"* Dalam PyTorch, Anda dapat membuat lapisan terakhir tanpa fungsi aktivasi, dan menggunakan fungsi loss `CrossEntropyLoss`. Fungsi ini secara otomatis menerapkan softmax.\n"
"Hal penting adalah memastikan fungsi aktivasi pada lapisan terakhir + fungsi loss yang tepat:\n",
"* Dalam Tensorflow, Anda dapat menggunakan `softmax` sebagai fungsi aktivasi, dan `sparse_categorical_crossentropy` sebagai fungsi loss. Perbedaan antara sparse categorical cross-entropy dan yang tidak sparse adalah bahwa yang pertama mengharapkan output berupa nomor kelas, bukan sebagai vektor one-hot.\n",
"* Dalam PyTorch, Anda dapat memiliki lapisan terakhir tanpa fungsi aktivasi, dan menggunakan fungsi loss `CrossEntropyLoss`. Fungsi ini secara otomatis menerapkan softmax.\n"
]
},
{
@ -255,9 +275,9 @@
"source": [
"## Melatih Jaringan Neural\n",
"\n",
"Sekarang kita siap untuk melatih jaringan neural. Selama pelatihan, harap kumpulkan akurasi pada data latih dan uji di setiap epoch, lalu plot akurasi tersebut untuk melihat apakah terjadi overfitting.\n",
"Sekarang kita siap untuk melatih jaringan neural. Selama pelatihan, harap kumpulkan akurasi pada data latih dan uji di setiap epoch, lalu buat plot akurasi untuk melihat apakah ada overfitting.\n",
"\n",
"> Untuk mempercepat pelatihan, Anda perlu menggunakan GPU jika tersedia. Sementara TensorFlow/Keras akan secara otomatis menggunakan GPU, di PyTorch Anda perlu memindahkan model dan data ke GPU selama pelatihan menggunakan metode `.to()` agar dapat memanfaatkan akselerasi GPU.\n"
"> Untuk mempercepat pelatihan, Anda perlu menggunakan GPU jika tersedia. Meskipun TensorFlow/Keras akan secara otomatis menggunakan GPU, dalam PyTorch Anda perlu memindahkan model dan data ke GPU selama pelatihan menggunakan metode `.to()` agar dapat memanfaatkan akselerasi GPU.\n"
]
},
{
@ -295,20 +315,20 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Apa yang bisa Anda katakan tentang overfitting? Apa yang bisa dilakukan untuk meningkatkan akurasi model?\n",
"Apa yang bisa dikatakan tentang overfitting? Apa yang bisa dilakukan untuk meningkatkan akurasi model?\n",
"\n",
"## Opsional: Menghitung Akurasi Top-3\n",
"## Opsional: Hitung Akurasi Top-3\n",
"\n",
"Dalam latihan ini, kita berurusan dengan klasifikasi dengan jumlah kelas yang cukup banyak (35), sehingga hasil kita - sekitar 50% akurasi validasi - sudah cukup baik. Dataset standar ImageNet bahkan memiliki lebih banyak kelas - 1000 kelas.\n",
"\n",
"Dalam kasus seperti ini, sulit untuk memastikan bahwa model **selalu** memprediksi kelas dengan benar. Ada situasi di mana dua jenis (breed) sangat mirip satu sama lain, dan model memberikan probabilitas yang hampir sama (misalnya, 0.45 dan 0.43). Jika kita mengukur akurasi standar, ini akan dianggap sebagai kesalahan, meskipun model hanya melakukan kesalahan kecil. Oleh karena itu, kita sering mengukur metrik lain - akurasi dalam tiga prediksi paling mungkin dari model (top-3).\n",
"Dalam kasus seperti ini, sulit untuk memastikan bahwa model **selalu** memprediksi kelas dengan benar. Ada situasi di mana dua jenis sangat mirip satu sama lain, dan model memberikan probabilitas yang hampir sama (misalnya, 0.45 dan 0.43). Jika kita mengukur akurasi standar, ini akan dianggap sebagai kesalahan, meskipun model hanya membuat kesalahan kecil. Oleh karena itu, kita sering mengukur metrik lain - akurasi dalam tiga prediksi paling mungkin dari model.\n",
"\n",
"Kita menganggap kasus tersebut akurat jika label target terdapat dalam tiga prediksi teratas model.\n",
"\n",
"Untuk menghitung akurasi top-3 pada dataset pengujian, Anda perlu secara manual memeriksa dataset, menerapkan jaringan neural untuk mendapatkan prediksi, dan kemudian melakukan perhitungan. Beberapa petunjuk:\n",
"Untuk menghitung akurasi top-3 pada dataset uji, Anda perlu secara manual memeriksa dataset, menerapkan jaringan neural untuk mendapatkan prediksi, dan kemudian melakukan perhitungan. Beberapa petunjuk:\n",
"\n",
"* Dalam Tensorflow, gunakan fungsi `tf.nn.in_top_k` untuk melihat apakah `predictions` (output dari model) ada di top-k (gunakan `k=3` sebagai parameter), dengan menghormati `targets`. Fungsi ini mengembalikan tensor nilai boolean, yang dapat dikonversi menjadi `int` menggunakan `tf.cast`, dan kemudian dijumlahkan menggunakan `tf.reduce_sum`.\n",
"* Dalam PyTorch, Anda dapat menggunakan fungsi `torch.topk` untuk mendapatkan indeks kelas dengan probabilitas tertinggi, dan kemudian memeriksa apakah kelas yang benar termasuk di dalamnya. Lihat [ini](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) untuk petunjuk lebih lanjut.\n"
"* Dalam Tensorflow, gunakan fungsi `tf.nn.in_top_k` untuk melihat apakah `predictions` (output dari model) berada dalam top-k (masukkan `k=3` sebagai parameter), dengan respect terhadap `targets`. Fungsi ini mengembalikan tensor nilai boolean, yang dapat dikonversi menjadi `int` menggunakan `tf.cast`, dan kemudian dijumlahkan menggunakan `tf.reduce_sum`.\n",
"* Dalam PyTorch, Anda dapat menggunakan fungsi `torch.topk` untuk mendapatkan indeks kelas dengan probabilitas tertinggi, dan kemudian melihat apakah kelas yang benar termasuk di dalamnya. Lihat [ini](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) untuk petunjuk lebih lanjut.\n"
]
},
{
@ -324,7 +344,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## Opsional: Membangun klasifikasi Kucing vs. Anjing\n",
"## Opsional: Membangun Klasifikasi Kucing vs. Anjing\n",
"\n",
"Kami juga ingin melihat seberapa akurat klasifikasi biner kucing vs. anjing pada dataset yang sama. Untuk melakukannya, kita perlu menyesuaikan label:\n"
]
@ -352,7 +372,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Penafian**: \nDokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berupaya untuk memberikan hasil yang akurat, harap diperhatikan bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang berwenang. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan manusia profesional. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini.\n"
"\n---\n\n**Penafian**: \nDokumen ini telah diterjemahkan menggunakan layanan terjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berupaya untuk memberikan hasil yang akurat, harap diperhatikan bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang berwenang. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa terjemahan manusia profesional. Kami tidak bertanggung jawab atas kesalahpahaman atau interpretasi yang salah yang timbul dari penggunaan terjemahan ini.\n"
]
}
],
@ -378,8 +398,8 @@
"version": "3.9.5"
},
"coopTranslator": {
"original_hash": "1de3ae931831253c3198d899da48bfe5",
"translation_date": "2025-08-29T13:26:57+00:00",
"original_hash": "df7d1f7da8d2617b76acd93115776ca4",
"translation_date": "2025-10-03T14:42:20+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb",
"language_code": "id"
}

View File

@ -1,25 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "f3d2cee9cb3c52160419e560c57a690e",
"translation_date": "2025-08-29T12:20:28+00:00",
"original_hash": "b70fcf7fcee862990f848c679090943f",
"translation_date": "2025-10-03T14:56:19+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/README.md",
"language_code": "id"
}
-->
# Klasifikasi Wajah Hewan Peliharaan
Tugas Lab dari [AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners).
Tugas Lab dari [Kurikulum AI untuk Pemula](https://github.com/microsoft/ai-for-beginners).
## Tugas
Bayangkan Anda perlu mengembangkan aplikasi untuk tempat penitipan hewan peliharaan guna mencatat semua hewan. Salah satu fitur hebat dari aplikasi semacam itu adalah kemampuan untuk secara otomatis mengenali ras dari sebuah foto. Hal ini dapat dilakukan dengan sukses menggunakan jaringan saraf.
Bayangkan Anda perlu mengembangkan aplikasi untuk tempat penitipan hewan peliharaan guna mengkatalog semua hewan. Salah satu fitur hebat dari aplikasi semacam itu adalah kemampuan untuk secara otomatis mengenali ras dari sebuah foto. Hal ini dapat dilakukan dengan sukses menggunakan jaringan saraf.
Anda perlu melatih jaringan saraf konvolusi untuk mengklasifikasikan berbagai ras kucing dan anjing menggunakan dataset **Pet Faces**.
## Dataset
Kita akan menggunakan dataset **Pet Faces**, yang berasal dari dataset hewan peliharaan [Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/). Dataset ini berisi 35 ras berbeda dari anjing dan kucing.
Kita akan menggunakan [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), yang berisi gambar dari 37 ras anjing dan kucing yang berbeda.
![Dataset yang akan kita gunakan](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.id.png)
@ -31,6 +31,8 @@ Untuk mengunduh dataset, gunakan cuplikan kode berikut:
!rm images.tar.gz
```
**Catatan:** Gambar dalam Oxford-IIIT Pet Dataset diorganisasi berdasarkan nama file (misalnya, `Abyssinian_1.jpg`, `Bengal_2.jpg`). Notebook ini mencakup kode untuk mengorganisasi gambar-gambar tersebut ke dalam subdirektori berdasarkan ras untuk mempermudah klasifikasi.
## Memulai Notebook
Mulailah lab dengan membuka [PetFaces.ipynb](PetFaces.ipynb)
@ -42,4 +44,4 @@ Anda telah menyelesaikan masalah yang cukup kompleks dalam klasifikasi gambar da
---
**Penafian**:
Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berupaya untuk memberikan hasil yang akurat, harap diperhatikan bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang berwenang. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan manusia profesional. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini.
Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diketahui bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan manusia profesional. Kami tidak bertanggung jawab atas kesalahpahaman atau interpretasi yang keliru yang timbul dari penggunaan terjemahan ini.

View File

@ -6,11 +6,13 @@
"source": [
"# Classificazione dei volti degli animali domestici\n",
"\n",
"Compito pratico tratto dal [Curriculum AI per Principianti](https://github.com/microsoft/ai-for-beginners).\n",
"Compito del laboratorio tratto dal [Curriculum AI per principianti](https://github.com/microsoft/ai-for-beginners).\n",
"\n",
"### Ottenere i dati\n",
"\n",
"In questo compito, ci concentreremo su un'attività di classificazione relativamente semplice: la classificazione dei volti degli animali domestici. Questo dataset è composto da volti ritagliati dal [Dataset Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/). Iniziamo caricando e visualizzando il dataset.\n"
"In questo compito, ci concentreremo su un compito di classificazione relativamente semplice: la classificazione dei volti degli animali domestici. Utilizzeremo il [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), che contiene immagini di 37 diverse razze di cani e gatti. Iniziamo scaricando e visualizzando il dataset.\n",
"\n",
"**Nota:** L'Oxford-IIIT Pet Dataset contiene immagini complete degli animali domestici. Le immagini saranno organizzate per razza nella cartella estratta.\n"
]
},
{
@ -86,6 +88,24 @@
"metadata": {},
"outputs": [],
"source": [
"# Note: The Oxford-IIIT Pet Dataset extracts to a folder named 'images'\n",
"# Images are named by breed (e.g., 'Abyssinian_1.jpg')\n",
"# We need to organize them into breed-specific subdirectories\n",
"import os\n",
"from collections import defaultdict\n",
"\n",
"# Organize images by breed\n",
"if not os.path.exists('petfaces'):\n",
" os.makedirs('petfaces')\n",
" for img_file in os.listdir('images'):\n",
" if img_file.endswith(('.jpg', '.png')):\n",
" # Extract breed name from filename (everything before the last underscore and number)\n",
" breed = '_'.join(img_file.split('_')[:-1])\n",
" breed_dir = os.path.join('petfaces', breed)\n",
" if not os.path.exists(breed_dir):\n",
" os.makedirs(breed_dir)\n",
" os.rename(os.path.join('images', img_file), os.path.join(breed_dir, img_file))\n",
"\n",
"for cls in os.listdir('petfaces'):\n",
" print(cls)\n",
" display_images([Image.open(os.path.join('petfaces',cls,x)) \n",
@ -130,7 +150,7 @@
"* In Tensorflow, usa `tf.keras.preprocessing.image_dataset_from_directory`\n",
"* In PyTorch, usa `torchvision.datasets.ImageFolder`\n",
"\n",
"Come hai visto dalle immagini sopra, tutte hanno un rapporto d'aspetto vicino al quadrato, quindi dobbiamo ridimensionare tutte le immagini a una dimensione quadrata. Inoltre, possiamo organizzare le immagini in minibatch.\n"
"Come hai visto dalle immagini sopra, tutte hanno un rapporto vicino a quello quadrato, quindi dobbiamo ridimensionare tutte le immagini a dimensioni quadrate. Inoltre, possiamo organizzare le immagini in minibatch.\n"
]
},
{
@ -162,11 +182,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Ora stampiamo la dimensione dei tensori nel nostro dataset. Se hai fatto tutto correttamente, la dimensione degli elementi di addestramento dovrebbe essere\n",
"Ora stampiamo la dimensione dei tensori nel nostro dataset. Se hai fatto tutto correttamente, la dimensione degli elementi di addestramento dovrebbe essere:\n",
" * `(batch_size,image_size,image_size,3)` per Tensorflow, `batch_size,3,image_size,image_size` per PyTorch\n",
" * `batch_size` per le etichette\n",
" \n",
" Le etichette dovrebbero contenere i numeri delle classi.\n"
"\n",
"Le etichette dovrebbero contenere i numeri delle classi.\n"
]
},
{
@ -235,8 +255,8 @@
"* Non dimenticare le funzioni di attivazione tra gli strati (ReLU) e il Max Pooling.\n",
"* Il classificatore finale può essere con o senza strati nascosti, ma il numero di neuroni in uscita deve essere uguale al numero di classi.\n",
"\n",
"È importante impostare correttamente la funzione di attivazione nell'ultimo strato + la funzione di perdita:\n",
"* In Tensorflow, puoi usare `softmax` come funzione di attivazione e `sparse_categorical_crossentropy` come funzione di perdita. La differenza tra sparse categorical cross-entropy e quella non sparse è che la prima si aspetta l'output come numero di classe e non come vettore one-hot.\n",
"È importante scegliere correttamente la funzione di attivazione nell'ultimo strato + la funzione di perdita:\n",
"* In Tensorflow, puoi utilizzare `softmax` come funzione di attivazione e `sparse_categorical_crossentropy` come funzione di perdita. La differenza tra sparse categorical cross-entropy e quella non-sparse è che la prima si aspetta l'output come numero di classe e non come vettore one-hot.\n",
"* In PyTorch, puoi avere l'ultimo strato senza funzione di attivazione e utilizzare la funzione di perdita `CrossEntropyLoss`. Questa funzione applica automaticamente softmax.\n"
]
},
@ -299,9 +319,9 @@
"\n",
"## Opzionale: Calcolare l'accuratezza Top3\n",
"\n",
"In questo esercizio, ci siamo occupati di una classificazione con un numero piuttosto alto di classi (35), quindi il nostro risultato - circa il 50% di accuratezza nella validazione - è abbastanza buono. Il dataset standard ImageNet ha ancora più classi - 1000.\n",
"In questo esercizio, ci siamo occupati di una classificazione con un numero piuttosto elevato di classi (35), quindi il nostro risultato - circa il 50% di accuratezza nella validazione - è abbastanza buono. Il dataset standard ImageNet ha ancora più classi - 1000.\n",
"\n",
"In casi come questi, è difficile garantire che il modello **sempre** predica correttamente la classe. Ci sono situazioni in cui due razze sono molto simili tra loro e il modello restituisce probabilità molto simili (ad esempio, 0.45 e 0.43). Se misuriamo l'accuratezza standard, questo sarà considerato un errore, anche se il modello ha commesso un errore molto piccolo. Per questo motivo, spesso misuriamo un'altra metrica: l'accuratezza entro le prime 3 previsioni più probabili del modello.\n",
"In questi casi è difficile garantire che il modello **preveda sempre** correttamente la classe. Ci sono situazioni in cui due razze sono molto simili tra loro e il modello restituisce probabilità molto simili (ad esempio, 0.45 e 0.43). Se misuriamo l'accuratezza standard, questo sarà considerato un errore, anche se il modello ha commesso un errore molto piccolo. Per questo motivo, spesso misuriamo un'altra metrica: l'accuratezza entro le prime 3 previsioni più probabili del modello.\n",
"\n",
"Consideriamo il caso accurato se l'etichetta target è contenuta nelle prime 3 previsioni del modello.\n",
"\n",
@ -324,7 +344,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## Opzionale: Costruire la classificazione Gatti vs. Cani\n",
"## Facoltativo: Costruire la classificazione Gatti vs. Cani\n",
"\n",
"Vogliamo anche verificare quanto sia accurata la nostra classificazione binaria gatti vs. cani sullo stesso dataset. Per farlo, dobbiamo modificare le etichette:\n"
]
@ -352,7 +372,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Disclaimer**: \nQuesto documento è stato tradotto utilizzando il servizio di traduzione automatica [Co-op Translator](https://github.com/Azure/co-op-translator). Sebbene ci impegniamo per garantire l'accuratezza, si prega di notare che le traduzioni automatiche possono contenere errori o imprecisioni. Il documento originale nella sua lingua nativa dovrebbe essere considerato la fonte autorevole. Per informazioni critiche, si raccomanda una traduzione professionale effettuata da un traduttore umano. Non siamo responsabili per eventuali incomprensioni o interpretazioni errate derivanti dall'uso di questa traduzione.\n"
"\n---\n\n**Disclaimer**: \nQuesto documento è stato tradotto utilizzando il servizio di traduzione AI [Co-op Translator](https://github.com/Azure/co-op-translator). Sebbene ci impegniamo per garantire l'accuratezza, si prega di notare che le traduzioni automatiche possono contenere errori o imprecisioni. Il documento originale nella sua lingua nativa dovrebbe essere considerato la fonte autorevole. Per informazioni critiche, si raccomanda una traduzione professionale effettuata da un traduttore umano. Non siamo responsabili per eventuali incomprensioni o interpretazioni errate derivanti dall'uso di questa traduzione.\n"
]
}
],
@ -378,8 +398,8 @@
"version": "3.9.5"
},
"coopTranslator": {
"original_hash": "1de3ae931831253c3198d899da48bfe5",
"translation_date": "2025-08-28T12:59:19+00:00",
"original_hash": "df7d1f7da8d2617b76acd93115776ca4",
"translation_date": "2025-10-03T14:35:44+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb",
"language_code": "it"
}

View File

@ -1,25 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "f3d2cee9cb3c52160419e560c57a690e",
"translation_date": "2025-08-26T07:03:23+00:00",
"original_hash": "b70fcf7fcee862990f848c679090943f",
"translation_date": "2025-10-03T14:54:34+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/README.md",
"language_code": "it"
}
-->
# Classificazione dei Volti degli Animali Domestici
# Classificazione delle Facce degli Animali Domestici
Compito del laboratorio tratto dal [Curriculum AI per Principianti](https://github.com/microsoft/ai-for-beginners).
Compito del laboratorio tratto dal [Curriculum AI for Beginners](https://github.com/microsoft/ai-for-beginners).
## Compito
Immagina di dover sviluppare un'applicazione per un asilo per animali domestici per catalogare tutti gli animali. Una delle funzionalità più utili di tale applicazione sarebbe identificare automaticamente la razza da una fotografia. Questo può essere fatto con successo utilizzando le reti neurali.
Immagina di dover sviluppare un'applicazione per un asilo per animali domestici per catalogare tutti gli animali. Una delle funzionalità più utili di tale applicazione sarebbe identificare automaticamente la razza da una fotografia. Questo può essere fatto con successo utilizzando reti neurali.
Devi addestrare una rete neurale convoluzionale per classificare diverse razze di gatti e cani utilizzando il dataset **Pet Faces**.
Devi addestrare una rete neurale convoluzionale per classificare le diverse razze di gatti e cani utilizzando il dataset **Pet Faces**.
## Il Dataset
Utilizzeremo il dataset **Pet Faces**, derivato dal dataset di animali domestici [Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/). Contiene 35 diverse razze di cani e gatti.
Utilizzeremo il [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), che contiene immagini di 37 diverse razze di cani e gatti.
![Dataset con cui lavoreremo](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.it.png)
@ -31,13 +31,17 @@ Per scaricare il dataset, utilizza questo frammento di codice:
!rm images.tar.gz
```
**Nota:** Le immagini del dataset Oxford-IIIT Pet sono organizzate per nome file (ad esempio, `Abyssinian_1.jpg`, `Bengal_2.jpg`). Il notebook include codice per organizzare queste immagini in sottodirectory specifiche per razza, rendendo più semplice la classificazione.
## Notebook di Partenza
Inizia il laboratorio aprendo [PetFaces.ipynb](../../../../../../lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb)
Inizia il laboratorio aprendo [PetFaces.ipynb](PetFaces.ipynb)
## Conclusione
Hai risolto un problema relativamente complesso di classificazione delle immagini da zero! C'erano molte classi, e sei comunque riuscito a ottenere una precisione ragionevole! Ha anche senso misurare la top-k accuracy, perché è facile confondere alcune classi che non sono chiaramente distinguibili nemmeno per gli esseri umani.
Hai risolto un problema relativamente complesso di classificazione delle immagini da zero! C'erano molte classi, e sei comunque riuscito a ottenere una precisione ragionevole! Ha anche senso misurare la precisione top-k, perché è facile confondere alcune classi che non sono chiaramente distinguibili nemmeno per gli esseri umani.
---
**Disclaimer**:
Questo documento è stato tradotto utilizzando il servizio di traduzione automatica [Co-op Translator](https://github.com/Azure/co-op-translator). Sebbene ci impegniamo per garantire l'accuratezza, si prega di notare che le traduzioni automatiche potrebbero contenere errori o imprecisioni. Il documento originale nella sua lingua nativa dovrebbe essere considerato la fonte autorevole. Per informazioni critiche, si raccomanda una traduzione professionale effettuata da un esperto umano. Non siamo responsabili per eventuali fraintendimenti o interpretazioni errate derivanti dall'uso di questa traduzione.
Questo documento è stato tradotto utilizzando il servizio di traduzione automatica [Co-op Translator](https://github.com/Azure/co-op-translator). Sebbene ci impegniamo per garantire l'accuratezza, si prega di notare che le traduzioni automatiche possono contenere errori o imprecisioni. Il documento originale nella sua lingua nativa dovrebbe essere considerato la fonte autorevole. Per informazioni critiche, si raccomanda una traduzione professionale effettuata da un traduttore umano. Non siamo responsabili per eventuali incomprensioni o interpretazioni errate derivanti dall'uso di questa traduzione.

View File

@ -6,11 +6,13 @@
"source": [
"# ペットの顔の分類\n",
"\n",
"[AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners) のラボ課題。\n",
"[AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners) の課題。\n",
"\n",
"### データの取得\n",
"\n",
"この課題では、比較的シンプルな分類タスクであるペットの顔の分類に取り組みます。このデータセットは、[Oxford-IIIT Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/) から切り取られた顔の画像で構成されています。それでは、データセットを読み込み、可視化するところから始めましょう。\n"
"この課題では、比較的簡単な分類タスクであるペットの顔の分類に焦点を当てます。使用するデータセットは、37種類の犬と猫の品種の画像を含む [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/) です。まずはデータセットをダウンロードして可視化してみましょう。\n",
"\n",
"**注意:** Oxford-IIIT Pet Dataset にはペット全体の画像が含まれています。抽出されたフォルダー内では、画像が品種ごとに整理されています。\n"
]
},
{
@ -46,7 +48,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"リストから一連の画像を表示するための汎用関数を定義します。\n"
"私たちはリストから一連の画像を表示するための汎用関数を定義します。\n"
]
},
{
@ -86,6 +88,24 @@
"metadata": {},
"outputs": [],
"source": [
"# Note: The Oxford-IIIT Pet Dataset extracts to a folder named 'images'\n",
"# Images are named by breed (e.g., 'Abyssinian_1.jpg')\n",
"# We need to organize them into breed-specific subdirectories\n",
"import os\n",
"from collections import defaultdict\n",
"\n",
"# Organize images by breed\n",
"if not os.path.exists('petfaces'):\n",
" os.makedirs('petfaces')\n",
" for img_file in os.listdir('images'):\n",
" if img_file.endswith(('.jpg', '.png')):\n",
" # Extract breed name from filename (everything before the last underscore and number)\n",
" breed = '_'.join(img_file.split('_')[:-1])\n",
" breed_dir = os.path.join('petfaces', breed)\n",
" if not os.path.exists(breed_dir):\n",
" os.makedirs(breed_dir)\n",
" os.rename(os.path.join('images', img_file), os.path.join(breed_dir, img_file))\n",
"\n",
"for cls in os.listdir('petfaces'):\n",
" print(cls)\n",
" display_images([Image.open(os.path.join('petfaces',cls,x)) \n",
@ -126,9 +146,9 @@
"source": [
"## ディープラーニング用データセットの準備\n",
"\n",
"ニューラルネットワークのトレーニングを始めるには、すべての画像をテンソルに変換し、ラベル(クラス番号)に対応するテンソルも作成する必要があります。ほとんどのニューラルネットワークフレームワークには、画像を扱うための簡単なツールが含まれています:\n",
"* Tensorflowでは、`tf.keras.preprocessing.image_dataset_from_directory`を使用します\n",
"* PyTorchでは、`torchvision.datasets.ImageFolder`を使用します\n",
"ニューラルネットワークのトレーニングを開始するには、すべての画像をテンソルに変換し、ラベル(クラス番号)に対応するテンソルも作成する必要があります。ほとんどのニューラルネットワークフレームワークには、画像を扱うための簡単なツールが含まれています:\n",
"* Tensorflowでは、`tf.keras.preprocessing.image_dataset_from_directory` を使用します\n",
"* PyTorchでは、`torchvision.datasets.ImageFolder` を使用します\n",
"\n",
"上記の画像からわかるように、すべての画像はほぼ正方形の比率に近いので、すべての画像を正方形サイズにリサイズする必要があります。また、画像をミニバッチに整理することもできます。\n"
]
@ -146,7 +166,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"今、データセットを訓練用とテスト用に分割する必要があります。\n"
"今、データセットをトレーニング部分とテスト部分に分割する必要があります。\n"
]
},
{
@ -162,9 +182,10 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"データセット内のテンソルのサイズを表示してみましょう。すべて正しく実行されていれば、トレーニング要素のサイズは以下のようになるはずです:\n",
" * Tensorflowの場合は `(batch_size,image_size,image_size,3)`、PyTorchの場合は `batch_size,3,image_size,image_size`\n",
" * ラベルは `batch_size`\n",
"では、データセット内のテンソルのサイズを出力してみましょう。すべて正しく実行されていれば、トレーニング要素のサイズは以下のようになります:\n",
" * Tensorflowの場合、`(batch_size,image_size,image_size,3)` \n",
" * PyTorchの場合、`batch_size,3,image_size,image_size`\n",
" * ラベルの場合、`batch_size`\n",
"\n",
"ラベルにはクラスの番号が含まれている必要があります。\n"
]
@ -231,13 +252,13 @@
"## ニューラルネットワークの定義\n",
"\n",
"画像分類を行う場合、いくつかの層を持つ畳み込みニューラルネットワークを定義するのが一般的です。注意すべきポイントは以下の通りです:\n",
"* ピラミッド構造を意識すること。つまり、層が深くなるにつれてフィルターの数を増やす。\n",
"* 層間に活性化関数ReLUやMax Poolingを忘れずに入れる。\n",
"* ピラミッド構造を意識すること。つまり、層が深くなるにつれてフィルターの数を増やすべきです。\n",
"* 層間に活性化関数ReLUやMax Poolingを忘れないようにしましょう。\n",
"* 最終的な分類器は隠れ層があってもなくても構いませんが、出力ニューロンの数はクラス数と一致させる必要があります。\n",
"\n",
"重要なのは、最後の層の活性化関数と損失関数を正しく設定することです:\n",
"特に重要なのは、最後の層の活性化関数と損失関数を正しく設定することです:\n",
"* Tensorflowでは、活性化関数として`softmax`を使用し、損失関数として`sparse_categorical_crossentropy`を使用できます。sparse categorical cross-entropyと通常のcategorical cross-entropyの違いは、前者がクラス番号を出力として期待するのに対し、後者はone-hotベクトルを期待する点です。\n",
"* PyTorchでは、最終層に活性化関数を使用せず、損失関数として`CrossEntropyLoss`を使用できます。この関数は自動的にsoftmaxを適用します。\n"
"* PyTorchでは、最終層に活性化関数を設定せず、損失関数として`CrossEntropyLoss`を使用できます。この関数は自動的にsoftmaxを適用します。\n"
]
},
{
@ -255,9 +276,9 @@
"source": [
"## ニューラルネットワークの訓練\n",
"\n",
"これでニューラルネットワークの訓練を開始する準備が整いました。訓練中は各エポックごとに訓練データとテストデータの精度を収集し、精度をプロットして過学習が発生していないか確認してください。\n",
"これでニューラルネットワークの訓練を開始する準備が整いました。訓練中は各エポックごとに訓練データとテストデータの精度を収集し、精度をプロットして過学習が発生していか確認してください。\n",
"\n",
"> 訓練を高速化するために、利用可能であればGPUを使用する必要があります。TensorFlow/Kerasでは自動的にGPUが使用されますが、PyTorchでは訓練中にモデルとデータの両方を`.to()`メソッドを使ってGPUに移動させる必要があります。これによりGPUの加速を活用できます。\n"
"> 訓練を高速化するために、GPUが利用可能であれば使用してください。TensorFlow/Kerasでは自動的にGPUが使用されますが、PyTorchでは訓練中にモデルとデータの両方を`.to()`メソッドを使ってGPUに移動させる必要があります。これによりGPUの高速化を活用できます。\n"
]
},
{
@ -295,20 +316,20 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"過学習について何が言えますか?モデルの精度を向上させるためには何ができるでしょうか?\n",
"過学習について何が言えるでしょうか?モデルの精度を向上させるためには何ができるでしょうか?\n",
"\n",
"## オプション: Top3精度を計算する\n",
"\n",
"この演習では、35クラスというかなり多いクラス数を持つ分類問題に取り組みました。そのため、約50%の検証精度という結果はかなり良いものです。標準的なImageNetデータセットではさらに多く、1000クラスがあります。\n",
"この演習では、かなり多くのクラス35クラスを扱う分類問題に取り組んでいました。そのため、約50%の検証精度という結果はかなり良いものです。標準的なImageNetデータセットではさらに多く、1000クラスがあります。\n",
"\n",
"このような場合、モデルが**常に**正確にクラスを予測することを保証するのは難しいです。例えば、2つの犬種が非常に似ている場合、モデルが非常に近い確率例: 0.45と0.43)を返すことがあります。標準的な精度を測定すると、このケースは誤りとみなされますが、モデルは非常に小さなミスしかしていません。このため、モデルの最も可能性の高い予測トップ3の中で正解ラベルが含まれているかどうかを測定する別の指標をよく使用します。\n",
"このような場合、モデルが**常に**クラスを正確に予測することを保証するのは難しいです。例えば、2つの犬種が非常に似ている場合、モデルが非常に近い確率例: 0.45と0.43)を返すことがあります。標準的な精度を測定すると、このケースは誤りとみなされますが、モデルは非常に小さなミスしかしていません。このため、モデルの予測の中で最も確率が高い上位3つの中に正解ラベルが含まれているかどうかを測定する別の指標をよく使用します。\n",
"\n",
"ターゲットラベルがモデルのトップ3予測の中に含まれている場合、そのケースを正確とみなします。\n",
"ターゲットラベルがモデルの予測の上位3つに含まれている場合、そのケースを正確とみなします。\n",
"\n",
"テストデータセットでトップ3精度を計算するには、データセットを手動で確認し、ニューラルネットワークを適用して予測を取得し、その後計算を行う必要があります。いくつかのヒント:\n",
"テストデータセットでTop-3精度を計算するには、データセットを手動で確認し、ニューラルネットワークを適用して予測を取得し、その後計算を行う必要があります。いくつかのヒント:\n",
"\n",
"* TensorFlowでは、`tf.nn.in_top_k`関数を使用して、`predictions`(モデルの出力)が`targets`に対してトップkパラメータとして`k=3`を渡す)に含まれているかどうかを確認できます。この関数はブール値のテンソルを返し、それを`tf.cast`を使って`int`に変換し、`tf.reduce_sum`を使って累積することができます。\n",
"* PyTorchでは、`torch.topk`関数を使用して、確率が高いクラスのインデックスを取得し、正しいクラスがそれらに含まれているかどうかを確認できます。詳細は[こちら](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b)を参照してください。\n"
"* TensorFlowでは、`tf.nn.in_top_k`関数を使用して、`predictions`(モデルの出力)が`targets`に対して上位kパラメータとして`k=3`を渡す)に含まれているかどうかを確認できます。この関数はブール値のテンソルを返し、それを`tf.cast`を使用して`int`に変換し、`tf.reduce_sum`を使用して累積することができます。\n",
"* PyTorchでは、`torch.topk`関数を使用して、確率が高いクラスのインデックスを取得し、正しいクラスがそれらに含まれているかどうかを確認できます。詳細については[こちら](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b)を参照してください。\n"
]
},
{
@ -324,9 +345,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## オプション: 猫 vs 犬の分類を構築する\n",
"## オプション: 猫 vs 犬の分類を構築\n",
"\n",
"同じデータセットで、猫 vs 犬の二値分類がどれほど正確かを確認したいと思います。そのためには、ラベルを調整する必要があります:\n"
"同じデータセットで猫 vs 犬の二値分類の精度を確認したいと思います。そのためには、ラベルを調整する必要があります:\n"
]
},
{
@ -352,7 +373,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**免責事項**: \nこの文書は、AI翻訳サービス [Co-op Translator](https://github.com/Azure/co-op-translator) を使用して翻訳されています。正確性を追求しておりますが、自動翻訳には誤りや不正確な部分が含まれる可能性があることをご承知ください。元の言語で記載された文書が正式な情報源とみなされるべきです。重要な情報については、専門の人間による翻訳を推奨します。この翻訳の使用に起因する誤解や誤解について、当方は一切の責任を負いません。\n"
"\n---\n\n**免責事項**: \nこの文書は、AI翻訳サービス [Co-op Translator](https://github.com/Azure/co-op-translator) を使用して翻訳されています。正確性を追求しておりますが、自動翻訳には誤りや不正確な部分が含まれる可能性があります。元の言語で記載された文書を正式な情報源としてお考えください。重要な情報については、専門の人間による翻訳を推奨します。この翻訳の使用に起因する誤解や誤解について、当方は責任を負いません。\n"
]
}
],
@ -378,8 +399,8 @@
"version": "3.9.5"
},
"coopTranslator": {
"original_hash": "1de3ae931831253c3198d899da48bfe5",
"translation_date": "2025-08-30T09:04:37+00:00",
"original_hash": "df7d1f7da8d2617b76acd93115776ca4",
"translation_date": "2025-10-03T14:30:44+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb",
"language_code": "ja"
}

View File

@ -1,8 +1,8 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "f3d2cee9cb3c52160419e560c57a690e",
"translation_date": "2025-08-24T21:10:44+00:00",
"original_hash": "b70fcf7fcee862990f848c679090943f",
"translation_date": "2025-10-03T14:53:14+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/README.md",
"language_code": "ja"
}
@ -13,13 +13,13 @@ CO_OP_TRANSLATOR_METADATA:
## 課題
ペットの保育施設向けに、すべてのペットをカタログ化するアプリケーションを開発する必要があると想像してください。このようなアプリケーションの素晴らしい機能の1つは、写真から自動的に品種を特定することです。これはニューラルネットワークを使用することで成功裏に実現できます。
ペットの託児所用のアプリケーションを開発し、すべてのペットをカタログ化する必要があると想像してください。このアプリケーションの素晴らしい機能の1つは、写真から自動的に品種を特定することです。これはニューラルネットワークを使用して成功裏に実現できます。
**Pet Faces** データセットを使用して、猫と犬のさまざまな品種を分類する畳み込みニューラルネットワークをトレーニングする必要があります。
**Pet Faces** データセットを使用して、猫と犬の異なる品種を分類する畳み込みニューラルネットワークをトレーニングする必要があります。
## データセット
使用するのは、[Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/) ペットデータセットから派生した **Pet Faces** データセットです。このデータセットには、35種類の犬と猫の品種が含まれています。
[Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/) を使用します。このデータセットには、37種類の犬と猫の品種の画像が含まれています。
![扱うデータセット](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.ja.png)
@ -31,13 +31,17 @@ CO_OP_TRANSLATOR_METADATA:
!rm images.tar.gz
```
**注:** Oxford-IIIT Pet Dataset の画像はファイル名(例: `Abyssinian_1.jpg`, `Bengal_2.jpg`)で整理されています。ノートブックには、これらの画像を品種別のサブディレクトリに整理するコードが含まれており、分類が容易になります。
## ノートブックの開始
ラボを始めるには、[PetFaces.ipynb](../../../../../../lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb) を開いてください。
[PetFaces.ipynb](PetFaces.ipynb) を開いてラボを開始してください。
## 学びのポイント
画像分類という比較的複雑な問題をゼロから解決しましたねクラスの数がかなり多かったにもかかわらず、合理的な精度を達成できました。また、top-k 精度を測定することも理にかなっています。なぜなら、人間でも明確に区別がつかないクラスを混同するのは簡単だからです。
画像分類という比較的複雑な問題をゼロから解決しましたクラス数がかなり多かったにもかかわらず、合理的な精度を達成することができました。また、top-k 精度を測定することも理にかなっています。なぜなら、人間でも明確に区別できないクラスがいくつかあり、それらを混同するのは簡単だからです。
---
**免責事項**:
この文書は、AI翻訳サービス [Co-op Translator](https://github.com/Azure/co-op-translator) を使用して翻訳されています。正確性を追求しておりますが、自動翻訳には誤りや不正確な部分が含まれる可能性があります。元の言語で記載された文書を正式な情報源としてお考えください。重要な情報については、専門の人間による翻訳を推奨します。この翻訳の使用に起因する誤解や誤解について、当社は責任を負いません。

View File

@ -4,13 +4,15 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"# 반려동물 얼굴 분류\n",
"# 애완동물 얼굴 분류\n",
"\n",
"[AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners)에서 제공하는 실습 과제입니다.\n",
"\n",
"### 데이터 가져오기\n",
"\n",
"이번 과제에서는 비교적 간단한 분류 작업인 반려동물 얼굴 분류를 다룹니다. 이 데이터셋은 [Oxford-IIIT Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/)에서 잘라낸 얼굴 이미지로 구성되어 있습니다. 데이터셋을 로드하고 시각화하는 것부터 시작해봅시다.\n"
"이번 과제에서는 비교적 간단한 분류 작업인 애완동물 얼굴 분류에 집중할 것입니다. 우리는 [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/)을 사용할 것이며, 이 데이터셋은 37가지 다른 품종의 개와 고양이 이미지를 포함하고 있습니다. 먼저 데이터셋을 다운로드하고 시각화하는 것부터 시작해봅시다.\n",
"\n",
"**참고:** Oxford-IIIT Pet Dataset은 애완동물 전체 이미지를 포함하고 있습니다. 추출된 폴더에서는 이미지가 품종별로 정리되어 있습니다.\n"
]
},
{
@ -86,6 +88,24 @@
"metadata": {},
"outputs": [],
"source": [
"# Note: The Oxford-IIIT Pet Dataset extracts to a folder named 'images'\n",
"# Images are named by breed (e.g., 'Abyssinian_1.jpg')\n",
"# We need to organize them into breed-specific subdirectories\n",
"import os\n",
"from collections import defaultdict\n",
"\n",
"# Organize images by breed\n",
"if not os.path.exists('petfaces'):\n",
" os.makedirs('petfaces')\n",
" for img_file in os.listdir('images'):\n",
" if img_file.endswith(('.jpg', '.png')):\n",
" # Extract breed name from filename (everything before the last underscore and number)\n",
" breed = '_'.join(img_file.split('_')[:-1])\n",
" breed_dir = os.path.join('petfaces', breed)\n",
" if not os.path.exists(breed_dir):\n",
" os.makedirs(breed_dir)\n",
" os.rename(os.path.join('images', img_file), os.path.join(breed_dir, img_file))\n",
"\n",
"for cls in os.listdir('petfaces'):\n",
" print(cls)\n",
" display_images([Image.open(os.path.join('petfaces',cls,x)) \n",
@ -96,7 +116,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"우리 데이터셋에서 클래스 수를 정의해 봅시다:\n"
"우리 데이터셋에서 클래스 수를 정의해 봅시다:\n"
]
},
{
@ -130,7 +150,7 @@
"* Tensorflow에서는 `tf.keras.preprocessing.image_dataset_from_directory`를 사용하세요.\n",
"* PyTorch에서는 `torchvision.datasets.ImageFolder`를 사용하세요.\n",
"\n",
"위의 사진에서 본 것처럼, 모든 이미지가 거의 정사각형 비율에 가깝기 때문에 모든 이미지를 정사각형 크기로 조정해야 합니다. 또한 이미지를 미니배치로 구성할 수도 있습니다.\n"
"위의 사진에서 본 것처럼, 모든 이미지가 거의 정사각형 비율에 가깝기 때문에 모든 이미지를 정사각형 크기로 리사이즈해야 합니다. 또한 이미지를 미니배치로 구성할 수도 있습니다.\n"
]
},
{
@ -146,7 +166,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"이제 데이터셋을 학습 및 테스트 부분으로 분리해야 합니다:\n"
"이제 데이터셋을 학습용과 테스트용으로 분리해야 합니다:\n"
]
},
{
@ -165,8 +185,8 @@
"이제 데이터셋에 있는 텐서의 크기를 출력해 봅시다. 모든 작업을 올바르게 수행했다면, 학습 요소의 크기는 다음과 같아야 합니다:\n",
" * Tensorflow의 경우 `(batch_size,image_size,image_size,3)`, PyTorch의 경우 `batch_size,3,image_size,image_size`\n",
" * 라벨의 경우 `batch_size`\n",
"\n",
"라벨은 클래스의 숫자를 포함해야 합니다.\n"
" \n",
" 라벨은 클래스 번호를 포함해야 합니다.\n"
]
},
{
@ -230,14 +250,14 @@
"source": [
"## 신경망 정의하기\n",
"\n",
"이미지 분류를 위해서는 여러 층으로 구성된 합성곱 신경망(CNN)을 정의하는 것이 좋습니다. 주의해야 할 점:\n",
"* 피라미드 아키텍처를 염두에 두세요. 즉, 깊어질수록 필터 수가 증가해야 합니다.\n",
"이미지 분류를 위해서는 여러 층으로 구성된 합성곱 신경망을 정의하는 것이 좋습니다. 주의해야 할 점:\n",
"* 피라미드 아키텍처를 염두에 두세요. 즉, 깊어질수록 필터 수가 증가해야 합니다.\n",
"* 층 사이에 활성화 함수(ReLU)와 Max Pooling을 잊지 마세요.\n",
"* 최종 분류기는 은닉층이 있을 수도, 없을 수도 있지만, 출력 뉴런의 수는 클래스 수와 같아야 합니다.\n",
"* 최종 분류기는 숨겨진 층이 있을 수도 있고 없을 수도 있지만, 출력 뉴런의 수는 클래스 수와 같아야 합니다.\n",
"\n",
"중요한 점은 마지막 층의 활성화 함수와 손실 함수를 올바르게 설정하는 것입니다:\n",
"* Tensorflow에서는 활성화 함수로 `softmax`를, 손실 함수로 `sparse_categorical_crossentropy`를 사용할 수 있습니다. Sparse categorical cross-entropy와 일반 categorical cross-entropy의 차이점은 전자는 출력이 클래스 번호로 제공되며, 원-핫 벡터가 아니라는 점입니다.\n",
"* PyTorch에서는 마지막 층에 활성화 함수를 사용하지 않고, 손실 함수로 `CrossEntropyLoss`를 사용할 수 있습니다. 이 함수는 softmax를 자동으로 적용합니다.\n"
"가장 중요한 것은 마지막 층의 활성화 함수와 손실 함수를 올바르게 설정하는 것입니다:\n",
"* Tensorflow에서는 `softmax`를 활성화 함수로 사용하고, `sparse_categorical_crossentropy`를 손실 함수로 사용할 수 있습니다. sparse categorical cross-entropy와 일반 categorical cross-entropy의 차이는 전자는 클래스 번호를 출력으로 기대하고, 후자는 원-핫 벡터를 기대한다는 점입니다.\n",
"* PyTorch에서는 마지막 층에 활성화 함수를 사용하지 않고, `CrossEntropyLoss` 손실 함수를 사용할 수 있습니다. 이 함수는 softmax를 자동으로 적용합니다.\n"
]
},
{
@ -253,11 +273,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## 신경망 훈련하기\n",
"## 신경망 학습하기\n",
"\n",
"이제 신경망을 훈련할 준비가 되었습니다. 훈련 중에는 각 에포크마다 훈련 데이터와 테스트 데이터의 정확도를 수집한 후, 정확도를 그래프로 나타내어 과적합 여부를 확인하세요.\n",
"이제 신경망을 학습시킬 준비가 되었습니다. 학습 과정에서 각 에포크마다 학습 데이터와 테스트 데이터의 정확도를 수집한 후, 정확도를 그래프로 그려 과적합 여부를 확인하세요.\n",
"\n",
"> 훈련 속도를 높이려면 GPU를 사용할 수 있는 경우 반드시 활용해야 합니다. TensorFlow/Keras는 GPU를 자동으로 사용하지만, PyTorch에서는 `.to()` 메서드를 사용해 훈련 중 모델과 데이터를 GPU로 이동시켜야 GPU 가속의 이점을 누릴 수 있습니다.\n"
"> 학습 속도를 높이기 위해 GPU를 사용할 수 있다면 반드시 활용하세요. TensorFlow/Keras는 GPU를 자동으로 사용하지만, PyTorch에서는 학습 중 모델과 데이터를 `.to()` 메서드를 사용해 GPU로 이동시켜야 GPU 가속을 활용할 수 있습니다.\n"
]
},
{
@ -297,18 +317,18 @@
"source": [
"과적합에 대해 무엇을 말할 수 있을까요? 모델의 정확도를 향상시키기 위해 무엇을 할 수 있을까요?\n",
"\n",
"## 선택 사항: Top-3 정확도 계산하기\n",
"## 선택 사항: Top3 정확도 계산하기\n",
"\n",
"이번 연습에서는 클래스 수가 많은 분류 문제(35개 클래스)를 다루었기 때문에, 약 50%의 검증 정확도는 꽤 좋은 결과라고 할 수 있습니다. 표준 ImageNet 데이터셋은 클래스가 훨씬 더 많아, 1000개에 달합니다.\n",
"이번 연습에서는 클래스 수가 상당히 많은 분류 문제(35개 클래스)를 다루었기 때문에, 약 50%의 검증 정확도는 꽤 좋은 결과입니다. 표준 ImageNet 데이터셋은 클래스 수가 훨씬 더 많아 1000개에 달합니다.\n",
"\n",
"이런 경우, 모델이 **항상** 클래스를 정확히 예측하도록 보장하기는 어렵습니다. 예를 들어, 두 품종이 매우 비슷한 경우, 모델이 매우 유사한 확률(예: 0.45와 0.43)을 반환할 수 있습니다. 표준 정확도를 측정하면, 이는 틀린 사례로 간주되지만, 사실 모델은 아주 작은 실수를 한 것입니다. 따라서, 우리는 종종 또 다른 지표를 측정합니다. 바로 모델의 상위 3개의 가장 높은 확률 예측 내에서 정확도를 측정하는 것입니다.\n",
"이러한 경우, 모델이 **항상** 올바른 클래스를 예측하도록 보장하기는 어렵습니다. 두 품종이 서로 매우 비슷한 경우가 있을 수 있으며, 모델이 매우 유사한 확률(예: 0.45와 0.43)을 반환할 수 있습니다. 표준 정확도를 측정하면 이는 잘못된 사례로 간주되지만, 모델이 아주 작은 실수를 했을 뿐입니다. 따라서 우리는 종종 또 다른 지표를 측정합니다. 모델의 가장 가능성 높은 예측 상위 3개 내에서 정확도입니다.\n",
"\n",
"목표 레이블이 모델의 상위 3개 예측에 포함되어 있다면, 이를 정확한 사례로 간주합니다.\n",
"타겟 레이블이 모델 예측 상위 3개 안에 포함되어 있다면, 해당 사례를 정확하다고 간주합니다.\n",
"\n",
"테스트 데이터셋에서 top-3 정확도를 계산하려면, 데이터셋을 수동으로 살펴보고, 신경망을 적용하여 예측을 얻은 다음 계산을 수행해야 합니다. 몇 가지 힌트는 다음과 같습니다:\n",
"테스트 데이터셋에서 top-3 정확도를 계산하려면, 데이터셋을 수동으로 검토하고, 신경망을 적용하여 예측을 얻은 다음 계산을 수행해야 합니다. 몇 가지 힌트:\n",
"\n",
"* Tensorflow에서는 `tf.nn.in_top_k` 함수를 사용하여 `predictions`(모델 출력)이 `targets`에 대해 top-k에 포함되는지 확인할 수 있습니다. 이 함수는 불리언 값의 텐서를 반환하며, 이를 `tf.cast`를 사용해 `int`로 변환한 후, `tf.reduce_sum`을 사용해 누적할 수 있습니다.\n",
"* PyTorch에서는 `torch.topk` 함수를 사용하여 가장 높은 확률을 가진 클래스의 인덱스를 얻을 수 있으며, 올바른 클래스가 그 안에 포함되어 있는지 확인할 수 있습니다. 더 많은 힌트는 [여기](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b)를 참하세요.\n"
"* Tensorflow에서는 `tf.nn.in_top_k` 함수를 사용하여 `predictions`(모델 출력)이 `targets`에 대해 top-k에 포함되는지 확인할 수 있습니다. 이 함수는 불리언 값의 텐서를 반환하며, 이를 `tf.cast`를 사용해 `int`로 변환한 후 `tf.reduce_sum`을 사용해 누적할 수 있습니다.\n",
"* PyTorch에서는 `torch.topk` 함수를 사용하여 높은 확률을 가진 클래스의 인덱스를 얻은 다음, 올바른 클래스가 그 안에 포함되어 있는지 확인할 수 있습니다. 더 많은 힌트는 [여기](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b)를 참하세요.\n"
]
},
{
@ -326,7 +346,7 @@
"source": [
"## 선택 사항: 고양이 vs. 개 분류 모델 구축\n",
"\n",
"우리는 동일한 데이터셋에서 고양이와 개를 구분하는 이진 분류 모델의 정확도를 확인하고자 합니다. 이를 위해 레이블을 조정해야 합니다:\n"
"우리는 동일한 데이터셋에서 고양이와 개를 구분하는 이진 분류 모델의 정확도를 확인하고 싶습니다. 이를 위해 레이블을 조정해야 합니다:\n"
]
},
{
@ -352,7 +372,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**면책 조항**: \n이 문서는 AI 번역 서비스 [Co-op Translator](https://github.com/Azure/co-op-translator)를 사용하여 번역되었습니다. 정확성을 위해 노력하고 있지만, 자동 번역에는 오류나 부정확성이 포함될 수 있습니다. 원본 문서를 해당 언어로 작성된 상태에서 권위 있는 자료로 간주해야 합니다. 중요한 정보의 경우, 전문적인 인간 번역을 권장합니다. 이 번역 사용으로 인해 발생하는 오해나 잘못된 해석에 대해 당사는 책임을 지지 않습니다.\n"
"\n---\n\n**면책 조항**: \n이 문서는 AI 번역 서비스 [Co-op Translator](https://github.com/Azure/co-op-translator)를 사용하여 번역되었습니다. 정확성을 위해 노력하고 있지만, 자동 번역에는 오류나 부정확성이 포함될 수 있습니다. 원본 문서를 해당 언어로 작성된 상태에서 권위 있는 자료로 간주해야 합니다. 중요한 정보의 경우, 전문적인 인간 번역을 권장합니다. 이 번역 사용으로 인해 발생하는 오해나 잘못된 해석에 대해 책임을 지지 않습니다.\n"
]
}
],
@ -378,8 +398,8 @@
"version": "3.9.5"
},
"coopTranslator": {
"original_hash": "1de3ae931831253c3198d899da48bfe5",
"translation_date": "2025-08-31T12:40:39+00:00",
"original_hash": "df7d1f7da8d2617b76acd93115776ca4",
"translation_date": "2025-10-03T14:31:14+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb",
"language_code": "ko"
}

View File

@ -1,25 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "f3d2cee9cb3c52160419e560c57a690e",
"translation_date": "2025-08-24T21:30:23+00:00",
"original_hash": "b70fcf7fcee862990f848c679090943f",
"translation_date": "2025-10-03T14:53:22+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/README.md",
"language_code": "ko"
}
-->
# 반려동물 얼굴 분류
# 애완동물 얼굴 분류
[AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners)에서 제공하는 실습 과제입니다.
## 과제
반려동물 보육원을 위한 애플리케이션을 개발해야 한다고 상상해보세요. 이 애플리케이션의 훌륭한 기능 중 하나는 사진을 통해 자동으로 품종을 식별하는 것입니다. 이는 신경망을 사용하여 성공적으로 구현할 수 있습니다.
애완동물 보육원을 위한 애플리케이션을 개발해야 한다고 상상해보세요. 이러한 애플리케이션의 훌륭한 기능 중 하나는 사진을 통해 품종을 자동으로 식별하는 것입니다. 이는 신경망을 사용하여 성공적으로 구현할 수 있습니다.
**Pet Faces** 데이터셋을 사용하여 고양이와 개의 다양한 품종을 분류하는 컨볼루션 신경망을 훈련해야 합니다.
## 데이터셋
우리는 [Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/) 반려동물 데이터셋에서 파생된 **Pet Faces** 데이터셋을 사용할 것입니다. 이 데이터셋은 35가지의 서로 다른 개와 고양이 품종을 포함하고 있습니다.
우리는 [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/)을 사용할 것입니다. 이 데이터셋은 37가지 다른 품종의 개와 고양이 이미지를 포함하고 있습니다.
![우리가 다룰 데이터셋](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.ko.png)
@ -31,13 +31,17 @@ CO_OP_TRANSLATOR_METADATA:
!rm images.tar.gz
```
**참고:** Oxford-IIIT Pet Dataset의 이미지는 파일 이름(예: `Abyssinian_1.jpg`, `Bengal_2.jpg`)으로 정리되어 있습니다. 노트북에는 이러한 이미지를 품종별 하위 디렉토리로 정리하여 분류를 더 쉽게 할 수 있도록 하는 코드가 포함되어 있습니다.
## 시작 노트북
[PetFaces.ipynb](../../../../../../lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb)를 열어 실습을 시작하세요.
[PetFaces.ipynb](PetFaces.ipynb)를 열어 실습을 시작하세요.
## 주요 성과
## 주요 학습 내용
여러분은 이미지를 분류하는 비교적 복잡한 문제를 처음부터 해결했습니다! 클래스가 꽤 많았음에도 불구하고 합리적인 정확도를 얻을 수 있었습니다. 또한, top-k 정확도를 측정하는 것도 의미가 있습니다. 왜냐하면 인간조차도 명확히 구분하기 어려운 클래스들이 있기 때문입니다.
여러분은 이미지를 분류하는 비교적 복잡한 문제를 처음부터 해결했습니다! 클래스가 꽤 많았음에도 불구하고 합리적인 정확도를 얻을 수 있었습니다! 또한, top-k 정확도를 측정하는 것이 합리적입니다. 왜냐하면 인간에게도 명확히 구분되지 않는 일부 클래스는 혼동하기 쉽기 때문입니다.
---
**면책 조항**:
이 문서는 AI 번역 서비스 [Co-op Translator](https://github.com/Azure/co-op-translator)를 사용하여 번역되었습니다. 정확성을 위해 최선을 다하고 있으나, 자동 번역에는 오류나 부정확성이 포함될 수 있습니다. 원본 문서의 원어 버전이 권위 있는 출처로 간주되어야 합니다. 중요한 정보의 경우, 전문적인 인간 번역을 권장합니다. 이 번역 사용으로 인해 발생하는 오해나 잘못된 해석에 대해 당사는 책임을 지지 않습니다.
이 문서는 AI 번역 서비스 [Co-op Translator](https://github.com/Azure/co-op-translator)를 사용하여 번역되었습니다. 정확성을 위해 최선을 다하고 있으나, 자동 번역에는 오류나 부정확성이 포함될 수 있습니다. 원본 문서의 원어 버전을 권위 있는 자료로 간주해야 합니다. 중요한 정보의 경우, 전문적인 인간 번역을 권장합니다. 이 번역 사용으로 인해 발생하는 오해나 잘못된 해석에 대해 당사는 책임을 지지 않습니다.

View File

@ -10,7 +10,9 @@
"\n",
"### Duomenų gavimas\n",
"\n",
"Šiame darbe mes susitelksime į palyginti paprastą klasifikavimo užduotį naminių gyvūnų veidų klasifikavimą. Šis duomenų rinkinys susideda iš iškirptų veidų iš [Oxford-IIIT duomenų rinkinio](https://www.robots.ox.ac.uk/~vgg/data/pets/). Pradėkime nuo duomenų įkėlimo ir vizualizavimo.\n"
"Šiame užduotyje mes susitelksime į palyginti paprastą klasifikavimo užduotį naminių gyvūnų veidų klasifikavimą. Naudosime [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), kuriame yra 37 skirtingų šunų ir kačių veislių vaizdai. Pradėkime atsisiųsdami ir vizualizuodami duomenų rinkinį.\n",
"\n",
"**Pastaba:** Oxford-IIIT Pet Dataset sudaro pilni naminių gyvūnų vaizdai. Išskleistame aplanke vaizdai bus suskirstyti pagal veisles.\n"
]
},
{
@ -77,7 +79,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Dabar pereikime per visus klasės aplankus ir nubrėžkime pirmuosius kelis kiekvienos klasės vaizdus:\n"
"Dabar pereikime per visus klas aplankus ir nubrėžkime pirmuosius kelis kiekvienos klasės vaizdus:\n"
]
},
{
@ -86,6 +88,24 @@
"metadata": {},
"outputs": [],
"source": [
"# Note: The Oxford-IIIT Pet Dataset extracts to a folder named 'images'\n",
"# Images are named by breed (e.g., 'Abyssinian_1.jpg')\n",
"# We need to organize them into breed-specific subdirectories\n",
"import os\n",
"from collections import defaultdict\n",
"\n",
"# Organize images by breed\n",
"if not os.path.exists('petfaces'):\n",
" os.makedirs('petfaces')\n",
" for img_file in os.listdir('images'):\n",
" if img_file.endswith(('.jpg', '.png')):\n",
" # Extract breed name from filename (everything before the last underscore and number)\n",
" breed = '_'.join(img_file.split('_')[:-1])\n",
" breed_dir = os.path.join('petfaces', breed)\n",
" if not os.path.exists(breed_dir):\n",
" os.makedirs(breed_dir)\n",
" os.rename(os.path.join('images', img_file), os.path.join(breed_dir, img_file))\n",
"\n",
"for cls in os.listdir('petfaces'):\n",
" print(cls)\n",
" display_images([Image.open(os.path.join('petfaces',cls,x)) \n",
@ -96,7 +116,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Apibrėžkime ir klasių skaičių mūsų duomenų rinkinyje:\n"
"Taip pat apibrėžkime klasių skaičių mūsų duomenų rinkinyje:\n"
]
},
{
@ -124,13 +144,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## Pasiruošimas duomenų rinkiniui giluminiam mokymuisi\n",
"## Duomenų rinkinio paruošimas giluminiam mokymuisi\n",
"\n",
"Norėdami pradėti treniruoti mūsų neuroninį tinklą, turime visas nuotraukas konvertuoti į tensorius, taip pat sukurti tensorius, atitinkančius žymes (klasių numerius). Dauguma neuroninių tinklų sistemų turi paprastus įrankius darbui su vaizdais:\n",
"Norėdami pradėti mokyti mūsų neuroninį tinklą, turime konvertuoti visas nuotraukas į tensorius, taip pat sukurti tensorius, atitinkančius etiketes (klasių numerius). Dauguma neuroninių tinklų sistemų turi paprastus įrankius darbui su vaizdais:\n",
"* Tensorflow naudokite `tf.keras.preprocessing.image_dataset_from_directory`\n",
"* PyTorch naudokite `torchvision.datasets.ImageFolder`\n",
"\n",
"Kaip matėte iš aukščiau pateiktų paveikslėlių, visi jie yra artimi kvadrato proporcijai, todėl turime pakeisti visų vaizdų dydį į kvadratinį. Taip pat galime organizuoti vaizdus į mini partijas.\n"
"Kaip matėte iš aukščiau pateiktų nuotraukų, visos jos yra artimos kvadratinio vaizdo proporcijai, todėl turime pakeisti visų vaizdų dydį į kvadratinį. Be to, galime organizuoti vaizdus į mažas partijas (minibatches).\n"
]
},
{
@ -162,11 +182,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Dabar atspausdinkime tensorių dydžius mūsų duomenų rinkinyje. Jei viską atlikote teisingai, mokymo elementų dydis turėtų būti:\n",
"Dabar atspausdinkime tensorių dydžius mūsų duomenų rinkinyje. Jei viską atlikote teisingai, treniravimo elementų dydis turėtų būti:\n",
" * `(batch_size,image_size,image_size,3)` Tensorflow atveju, `batch_size,3,image_size,image_size` PyTorch atveju\n",
" * `batch_size` etiketėms\n",
" \n",
" Etiketės turėtų turėti klasių numerius.\n"
"\n",
"Etiketės turėtų turėti klasių numerius.\n"
]
},
{
@ -230,12 +250,12 @@
"source": [
"## Apibrėžkite neuroninį tinklą\n",
"\n",
"Vaizdų klasifikavimui greičiausiai reikėtų apibrėžti konvoliucinį neuroninį tinklą su keliais sluoksniais. Į ką reikėtų atkreipti dėmesį:\n",
"Vaizdų klasifikavimui rekomenduojama apibrėžti konvoliucinį neuroninį tinklą su keliais sluoksniais. Į ką reikėtų atkreipti dėmesį:\n",
"* Nepamirškite piramidės architektūros, t. y. filtrų skaičius turėtų didėti, kai einate gilyn.\n",
"* Nepamirškite aktyvacijos funkcijų tarp sluoksnių (ReLU) ir maksimaliojo kaupimo (Max Pooling).\n",
"* Nepamirškite aktyvacijos funkcijų tarp sluoksnių (ReLU) ir Max Pooling.\n",
"* Galutinis klasifikatorius gali būti su paslėptais sluoksniais arba be jų, tačiau išvesties neuronų skaičius turėtų būti lygus klasių skaičiui.\n",
"\n",
"Svarbu teisingai parinkti aktyvacijos funkciją paskutiniame sluoksnyje ir nuostolių funkciją:\n",
"Svarbu teisingai pasirinkti aktyvacijos funkciją paskutiniame sluoksnyje ir nuostolių funkciją:\n",
"* Tensorflow aplinkoje galite naudoti `softmax` kaip aktyvacijos funkciją ir `sparse_categorical_crossentropy` kaip nuostolių funkciją. Skirtumas tarp sparse kategorinės kryžminės entropijos ir nesparse yra tas, kad pirmoji tikisi išvesties kaip klasės numerio, o ne kaip vieno karšto vektoriaus.\n",
"* PyTorch aplinkoje galutinis sluoksnis gali būti be aktyvacijos funkcijos, o nuostolių funkcijai naudokite `CrossEntropyLoss`. Ši funkcija automatiškai taiko softmax.\n"
]
@ -255,9 +275,9 @@
"source": [
"## Treniruokite neuroninį tinklą\n",
"\n",
"Dabar esame pasiruošę treniruoti neuroninį tinklą. Mokymo metu, prašome rinkti tikslumo duomenis tiek treniravimo, tiek testavimo rinkiniuose kiekviename epochoje, o vėliau nubraižykite tikslumo grafiką, kad pamatytumėte, ar nėra per didelio pritaikymo.\n",
"Dabar esame pasiruošę treniruoti neuroninį tinklą. Mokymo metu prašome rinkti tikslumo duomenis tiek treniravimo, tiek testavimo rinkiniuose kiekviename epochoje, o vėliau nubraižyti tikslumo grafiką, kad pamatytumėte, ar nėra per didelio pritaikymo.\n",
"\n",
"> Norėdami paspartinti mokymą, turite naudoti GPU, jei jis yra prieinamas. Nors TensorFlow/Keras automatiškai naudos GPU, PyTorch aplinkoje tiek modelį, tiek duomenis reikia perkelti į GPU mokymo metu naudojant `.to()` metodą, kad galėtumėte pasinaudoti GPU pagreitinimu.\n"
"> Norėdami pagreitinti mokymą, turite naudoti GPU, jei jis yra prieinamas. Nors TensorFlow/Keras automatiškai naudos GPU, PyTorch aplinkoje tiek modelį, tiek duomenis mokymo metu reikia perkelti į GPU naudojant `.to()` metodą, kad būtų pasinaudota GPU pagreitinimu.\n"
]
},
{
@ -295,20 +315,20 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Ką galima pasakyti apie permokymą? Ką galima padaryti, kad pagerintumėte modelio tikslumą?\n",
"Ką galima pasakyti apie permokymą? Ką galima padaryti, kad pagerintume modelio tikslumą?\n",
"\n",
"## Pasirinktinai: Apskaičiuokite Top3 Tikslumą\n",
"## Pasirinktinai: Apskaičiuokite Top-3 Tikslumą\n",
"\n",
"Šioje užduotyje dirbome su klasifikacija, kurioje yra gana daug klasių (35), todėl mūsų rezultatas - apie 50% validacijos tikslumas - yra gana geras. Standartiniame ImageNet duomenų rinkinyje yra dar daugiau - 1000 klasių.\n",
"Šiame pratime dirbome su klasifikacija, kurioje yra gana daug klasių (35), todėl mūsų rezultatas apie 50% validacijos tikslumas yra gana geras. Standartinis ImageNet duomenų rinkinys turi dar daugiau 1000 klasių.\n",
"\n",
"Tokiais atvejais sunku užtikrinti, kad modelis **visada** teisingai nuspėtų klasę. Yra atvejų, kai dvi veislės yra labai panašios viena į kitą, ir modelis grąžina labai panašias tikimybes (pvz., 0.45 ir 0.43). Jei matuosime standartinį tikslumą, tai bus laikoma klaida, nors modelis padarė labai nedidelę klaidą. Todėl dažnai matuojame kitą metriką - tikslumą tarp trijų labiausiai tikėtinų modelio prognozių.\n",
"Tokiais atvejais sunku užtikrinti, kad modelis **visada** teisingai nuspėtų klasę. Yra situacijų, kai dvi veislės yra labai panašios viena į kitą, ir modelis pateikia labai panašias tikimybes (pvz., 0.45 ir 0.43). Jei matuosime standartinį tikslumą, tai bus laikoma klaida, nors modelis padarė labai nedidelę klaidą. Dėl to dažnai matuojame kitą metriką tikslumą pagal top 3 labiausiai tikėtinas modelio prognozes.\n",
"\n",
"Atvejis laikomas tiksliu, jei tikslinė etiketė yra tarp trijų geriausių modelio prognozių.\n",
"Atvejis laikomas teisingu, jei tikslinė etiketė yra tarp top 3 modelio prognozių.\n",
"\n",
"Norėdami apskaičiuoti top-3 tikslumą testavimo duomenų rinkinyje, turite rankiniu būdu peržiūrėti duomenų rinkinį, pritaikyti neuroninį tinklą, kad gautumėte prognozę, ir tada atlikti skaičiavimus. Keletas užuominų:\n",
"Norėdami apskaičiuoti top-3 tikslumą testavimo duomenų rinkinyje, turite rankiniu būdu peržiūrėti duomenų rinkinį, pritaikyti neuroninį tinklą, kad gautumėte prognozę, ir tada atlikti skaičiavimus. Keletas patarimų:\n",
"\n",
"* Tensorflow aplinkoje naudokite `tf.nn.in_top_k` funkciją, kad patikrintumėte, ar `predictions` (modelio išvestis) yra tarp top-k (nurodykite `k=3` kaip parametrą), atsižvelgiant į `targets`. Ši funkcija grąžina boolean reikšmių tensorą, kurį galima konvertuoti į `int` naudojant `tf.cast`, o tada sumuoti naudojant `tf.reduce_sum`.\n",
"* PyTorch aplinkoje galite naudoti `torch.topk` funkciją, kad gautumėte klasių su didžiausiomis tikimybėmis indeksus, ir tada patikrinti, ar teisinga klasė yra tarp jų. Daugiau užuominų rasite [čia](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b).\n"
"* Tensorflow aplinkoje naudokite `tf.nn.in_top_k` funkciją, kad patikrintumėte, ar `predictions` (modelio išvestis) yra tarp top-k (nurodykite `k=3` kaip parametrą), atsižvelgiant į `targets`. Ši funkcija grąžina boolean reikšmių tensor, kurį galima konvertuoti į `int` naudojant `tf.cast`, o tada sumuoti naudojant `tf.reduce_sum`.\n",
"* PyTorch aplinkoje galite naudoti `torch.topk` funkciją, kad gautumėte klasių indeksus su didžiausiomis tikimybėmis, ir tada patikrinti, ar teisinga klasė yra tarp jų. Žr. [čia](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) daugiau patarimų.\n"
]
},
{
@ -352,7 +372,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Atsakomybės apribojimas**: \nŠis dokumentas buvo išverstas naudojant AI vertimo paslaugą [Co-op Translator](https://github.com/Azure/co-op-translator). Nors siekiame tikslumo, prašome atkreipti dėmesį, kad automatiniai vertimai gali turėti klaidų ar netikslumų. Originalus dokumentas jo gimtąja kalba turėtų būti laikomas autoritetingu šaltiniu. Dėl svarbios informacijos rekomenduojama profesionali žmogaus vertimo paslauga. Mes neprisiimame atsakomybės už nesusipratimus ar klaidingus interpretavimus, atsiradusius naudojant šį vertimą.\n"
"\n---\n\n**Atsakomybės atsisakymas**: \nŠis dokumentas buvo išverstas naudojant AI vertimo paslaugą [Co-op Translator](https://github.com/Azure/co-op-translator). Nors stengiamės užtikrinti tikslumą, prašome atkreipti dėmesį, kad automatiniai vertimai gali turėti klaidų ar netikslumų. Originalus dokumentas jo gimtąja kalba turėtų būti laikomas autoritetingu šaltiniu. Kritinei informacijai rekomenduojama naudoti profesionalų žmogaus vertimą. Mes neprisiimame atsakomybės už nesusipratimus ar neteisingus aiškinimus, kylančius dėl šio vertimo naudojimo.\n"
]
}
],
@ -378,8 +398,8 @@
"version": "3.9.5"
},
"coopTranslator": {
"original_hash": "1de3ae931831253c3198d899da48bfe5",
"translation_date": "2025-08-31T12:41:16+00:00",
"original_hash": "df7d1f7da8d2617b76acd93115776ca4",
"translation_date": "2025-10-03T14:51:38+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb",
"language_code": "lt"
}

View File

@ -1,25 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "f3d2cee9cb3c52160419e560c57a690e",
"translation_date": "2025-08-31T17:36:45+00:00",
"original_hash": "b70fcf7fcee862990f848c679090943f",
"translation_date": "2025-10-03T14:58:48+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/README.md",
"language_code": "lt"
}
-->
# Naminių Gyvūnų Veidų Klasifikacija
# Naminių gyvūnų veidų klasifikacija
Laboratorinis darbas iš [AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners).
Laboratorinis darbas iš [AI pradedantiesiems mokymo programos](https://github.com/microsoft/ai-for-beginners).
## Užduotis
Įsivaizduokite, kad jums reikia sukurti programą gyvūnų darželiui, kuri kataloguotų visus gyvūnus. Viena iš puikių tokios programos funkcijų būtų automatiškai nustatyti veislę iš nuotraukos. Tai galima sėkmingai atlikti naudojant neuroninius tinklus.
Įsivaizduokite, kad jums reikia sukurti programą gyvūnų darželiui, kad būtų galima kataloguoti visus gyvūnus. Viena iš puikių tokios programos funkcijų būtų automatiškai nustatyti veislę iš nuotraukos. Tai galima sėkmingai atlikti naudojant neuroninius tinklus.
Jums reikia išmokyti konvoliucinį neuroninį tinklą klasifikuoti skirtingas kačių ir šunų veisles naudojant **Pet Faces** duomenų rinkinį.
## Duomenų rinkinys
Naudosime **Pet Faces** duomenų rinkinį, kuris yra sukurtas remiantis [Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/) gyvūnų duomenų rinkiniu. Jame yra 35 skirtingos šunų ir kačių veislės.
Naudosime [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), kuriame yra 37 skirtingų šunų ir kačių veislių nuotraukos.
![Duomenų rinkinys, su kuriuo dirbsime](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.lt.png)
@ -31,15 +31,17 @@ Norėdami atsisiųsti duomenų rinkinį, naudokite šį kodo fragmentą:
!rm images.tar.gz
```
## Pradinis Užrašų Knygelės Failas
**Pastaba:** Oxford-IIIT Pet Dataset nuotraukos yra organizuotos pagal failo pavadinimą (pvz., `Abyssinian_1.jpg`, `Bengal_2.jpg`). Užrašų knygelėje yra kodas, kuris organizuoja šias nuotraukas į veislei specifinius aplankus, kad būtų lengviau klasifikuoti.
Pradėkite laboratorinį darbą atidarę [PetFaces.ipynb](PetFaces.ipynb)
## Pradžios užrašų knygelė
## Išvada
Pradėkite laboratorinį darbą atidarydami [PetFaces.ipynb](PetFaces.ipynb)
Jūs išsprendėte gana sudėtingą vaizdų klasifikavimo problemą nuo nulio! Buvo nemažai klasių, tačiau jums vis tiek pavyko pasiekti pagrįstą tikslumą! Taip pat verta išmatuoti top-k tikslumą, nes kai kurias klases lengva supainioti, ypač tas, kurios net žmonėms nėra aiškiai skirtingos.
## Rezultatas
Jūs išsprendėte gana sudėtingą vaizdų klasifikavimo problemą nuo nulio! Buvo nemažai klasių, tačiau vis tiek pavyko pasiekti pagrįstą tikslumą! Taip pat verta matuoti top-k tikslumą, nes kai kurias klases lengva supainioti, ypač tas, kurios net žmonėms nėra aiškiai skirtingos.
---
**Atsakomybės apribojimas**:
Šis dokumentas buvo išverstas naudojant AI vertimo paslaugą [Co-op Translator](https://github.com/Azure/co-op-translator). Nors siekiame tikslumo, prašome atkreipti dėmesį, kad automatiniai vertimai gali turėti klaidų ar netikslumų. Originalus dokumentas jo gimtąja kalba turėtų būti laikomas autoritetingu šaltiniu. Kritinei informacijai rekomenduojama naudoti profesionalų žmogaus vertimą. Mes neprisiimame atsakomybės už nesusipratimus ar klaidingus interpretavimus, atsiradusius dėl šio vertimo naudojimo.
**Atsakomybės atsisakymas**:
Šis dokumentas buvo išverstas naudojant AI vertimo paslaugą [Co-op Translator](https://github.com/Azure/co-op-translator). Nors siekiame tikslumo, prašome atkreipti dėmesį, kad automatiniai vertimai gali turėti klaidų ar netikslumų. Originalus dokumentas jo gimtąja kalba turėtų būti laikomas autoritetingu šaltiniu. Kritinei informacijai rekomenduojama naudoti profesionalų žmogaus vertimą. Mes neprisiimame atsakomybės už nesusipratimus ar neteisingus interpretavimus, atsiradusius dėl šio vertimo naudojimo.

View File

@ -8,9 +8,11 @@
"\n",
"來自 [AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners) 的實驗作業。\n",
"\n",
"### 獲取數據\n",
"### 獲取資料\n",
"\n",
"在這次作業中,我們將專注於一個相對簡單的分類任務——寵物臉部的分類。這個數據集包含從 [Oxford-IIIT Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/) 中裁剪出的臉部圖像。讓我們從載入並可視化這個數據集開始吧。\n"
"在這次作業中,我們將專注於一個相對簡單的分類任務——寵物臉部的分類。我們會使用 [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/),該資料集包含 37 種不同品種的狗和貓的圖片。讓我們從下載並視覺化資料集開始。\n",
"\n",
"**注意:** Oxford-IIIT Pet Dataset 包含完整的寵物圖片。提取後的資料夾中,圖片會按照品種進行整理。\n"
]
},
{
@ -46,7 +48,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"我們將定義通用函數顯示列表中的一系列圖像:\n"
"我們將定義通用函數顯示列表中的一系列圖像:\n"
]
},
{
@ -86,6 +88,24 @@
"metadata": {},
"outputs": [],
"source": [
"# Note: The Oxford-IIIT Pet Dataset extracts to a folder named 'images'\n",
"# Images are named by breed (e.g., 'Abyssinian_1.jpg')\n",
"# We need to organize them into breed-specific subdirectories\n",
"import os\n",
"from collections import defaultdict\n",
"\n",
"# Organize images by breed\n",
"if not os.path.exists('petfaces'):\n",
" os.makedirs('petfaces')\n",
" for img_file in os.listdir('images'):\n",
" if img_file.endswith(('.jpg', '.png')):\n",
" # Extract breed name from filename (everything before the last underscore and number)\n",
" breed = '_'.join(img_file.split('_')[:-1])\n",
" breed_dir = os.path.join('petfaces', breed)\n",
" if not os.path.exists(breed_dir):\n",
" os.makedirs(breed_dir)\n",
" os.rename(os.path.join('images', img_file), os.path.join(breed_dir, img_file))\n",
"\n",
"for cls in os.listdir('petfaces'):\n",
" print(cls)\n",
" display_images([Image.open(os.path.join('petfaces',cls,x)) \n",
@ -96,7 +116,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"讓我們也定義我們數據集中的類別數:\n"
"讓我們也定義我們數據集中的類別數\n"
]
},
{
@ -126,11 +146,11 @@
"source": [
"## 為深度學習準備數據集\n",
"\n",
"在開始訓練我們的神經網絡之前,我們需要將所有圖片轉換為張量,並創建與標籤(類別編號)對應的張量。大多數神經網絡框架都提供了處理圖片的簡便工具\n",
"在開始訓練我們的神經網絡之前,我們需要將所有圖片轉換為張量,並且還需要創建與標籤(類別編號)對應的張量。大多數神經網絡框架都提供了簡單的工具來處理圖片:\n",
"* 在 Tensorflow 中,使用 `tf.keras.preprocessing.image_dataset_from_directory`\n",
"* 在 PyTorch 中,使用 `torchvision.datasets.ImageFolder`\n",
"\n",
"如上圖所示,所有圖片的比例都接近正方形,因此我們需要將所有圖片調整為正方形大小。此外,我們還可以將圖片組織成小批量處理。\n"
"如上圖所示,所有圖片的比例都接近正方形,因此我們需要將所有圖片調整為正方形大小。此外,我們還可以將圖片組織成小批量。\n"
]
},
{
@ -165,8 +185,8 @@
"現在讓我們列印資料集中張量的大小。如果你已正確完成所有步驟,訓練元素的大小應該是:\n",
" * Tensorflow 的格式為 `(batch_size,image_size,image_size,3)`PyTorch 的格式為 `batch_size,3,image_size,image_size`\n",
" * 標籤的大小為 `batch_size`\n",
"\n",
"標籤應包含類別的數字。\n"
" \n",
" 標籤應包含類別的數字。\n"
]
},
{
@ -230,14 +250,14 @@
"source": [
"## 定義一個神經網路\n",
"\n",
"對於圖像分類,你可能需要定義一個具有多層結構的卷積神經網路。需要注意的事項:\n",
"* 記住金字塔結構,也就是說,隨著網路加深,濾波器的數量應該增加。\n",
"* 不要忘記在層與層之間加入激活函數(如 ReLU以及最大池化Max Pooling。\n",
"* 最終的分類器可以有隱藏層,也可以沒有,但輸出神經元數量應該等於類的類別數。\n",
"對於圖像分類,您可能需要定義一個具有多層的卷積神經網路。需要注意的事項:\n",
"* 記住金字塔結構,也就是說,隨著網路加深,濾波器的數量應該增加。\n",
"* 不要忘記在層之間加入激活函數(如 ReLU以及最大池化Max Pooling。\n",
"* 最終的分類器可以有隱藏層,也可以沒有,但輸出神經元數量應該等於類的數。\n",
"\n",
"一個重要的點是要正確設置最後一層的激活函數和損失函數:\n",
"* 在 Tensorflow 中,你可以使用 `softmax` 作為激活函數,並使用 `sparse_categorical_crossentropy` 作為損失函數。稀疏分類交叉熵sparse categorical cross-entropy與非稀疏的區別在於前者的輸出是類別的數字,而不是 one-hot 向量。\n",
"* 在 PyTorch 中,你可以讓最後一層沒有激活函數,並使用 `CrossEntropyLoss` 作為損失函數。這個函數會自動應用 softmax。\n"
"* 在 TensorFlow 中,您可以使用 `softmax` 作為激活函數,並使用 `sparse_categorical_crossentropy` 作為損失函數。稀疏分類交叉熵sparse categorical cross-entropy與非稀疏的區別在於前者期望輸出為類別的數字,而不是 one-hot 向量。\n",
"* 在 PyTorch 中,最終層可以不使用激活函數,並使用 `CrossEntropyLoss` 作為損失函數。該函數會自動應用 softmax。\n"
]
},
{
@ -255,9 +275,9 @@
"source": [
"## 訓練神經網路\n",
"\n",
"現在我們準備好訓練神經網路了。在訓練過程中,請在每個 epoch 收集訓練數據和測試數據的準確率,然後繪製準確率圖表以檢查是否有過擬合的情況。\n",
"現在我們準備好訓練神經網路了。在訓練過程中,請在每個訓練週期收集訓練和測試數據的準確率,然後繪製準確率圖表以檢查是否有過擬合的情況。\n",
"\n",
"> 為了加快訓練速度,如果有 GPU 可用,請務必使用它。雖然 TensorFlow/Keras 會自動使用 GPU但在 PyTorch 中,你需要使用 `.to()` 方法將模型和數據移動到 GPU 上,才能利用 GPU 的加速功能。\n"
"> 為了加快訓練速度,如果有 GPU 可用,請使用 GPU。雖然 TensorFlow/Keras 會自動使用 GPU但在 PyTorch 中,您需要在訓練過程中使用 `.to()` 方法將模型和數據移動到 GPU 上,以充分利用 GPU 的加速功能。\n"
]
},
{
@ -295,20 +315,20 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"什麼是過度擬合?如何提高模型的準確性?\n",
"關於過度擬合,你可以說什麼?如何改善模型的準確性?\n",
"\n",
"## 可選:計算 Top3 準確率\n",
"\n",
"在這練習中我們處理的是具有相當多類別35類的分類問題因此我們的結果——大約50%的驗證準確率——已經相當不錯了。標準的 ImageNet 數據集甚至有更多類別——1000類。\n",
"在這練習中我們處理的是具有相當多類別35類的分類問題因此我們的結果——大約50%的驗證準確率——已經相當不錯了。標準的 ImageNet 數據集甚至有更多類別——1000類。\n",
"\n",
"在這種情況下,很難保證模型**總是**正確預測類別。有些情況下,兩個品種可能非常相似,模型返回的概率也非常接近例如0.45 和 0.43)。如果我們測量標準準確率,這將被視為錯誤案例,儘管模型只犯了很小的錯誤。因此,我們通常會測量另一個指標——模型最可能的前三個預測中的準確率。\n",
"在這種情況下,很難保證模型**總是**正確預測類別。有些情況下,兩個品種非常相似,模型可能返回非常接近的概率例如0.45 和 0.43)。如果我們測量標準準確率,這將被視為錯誤案例,即使模型只犯了很小的錯誤。因此,我們通常會測量另一個指標——模型最可能的前三個預測中的準確率。\n",
"\n",
"如果目標標籤包含在模型的前三個預測中,我們就認為這個案例是準確的。\n",
"如果目標標籤包含在模型的前三個預測中,我們就認為案例是準確的。\n",
"\n",
"要在測試數據集上計算 Top-3 準確率,您需要手動遍歷數據集,應用神經網絡以獲得預測,然後進行計算。一些提示:\n",
"要在測試數據集上計算 top-3 準確率,你需要手動遍歷數據集,應用神經網絡進行預測,然後進行計算。一些提示:\n",
"\n",
"* 在 Tensorflow 中,可以使用 `tf.nn.in_top_k` 函數來檢查 `predictions`(模型的輸出)是否在 top-k將 `k=3` 作為參數),相對於 `targets`。此函數返回布爾值的張量,可以使用 `tf.cast` 轉換為 `int`,然後使用 `tf.reduce_sum` 累積。\n",
"* 在 PyTorch 中,可以使用 `torch.topk` 函數獲取具有最高概率的類別索引,然後檢查正確的類別是否屬於其中。參考[這裡](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b)以獲得更多提示。\n"
"* 在 Tensorflow 中,使用 `tf.nn.in_top_k` 函數來檢查 `predictions`(模型的輸出)是否在 top-k將 `k=3` 作為參數),相對於 `targets`。此函數返回布爾值的張量,可以使用 `tf.cast` 轉換為 `int`,然後使用 `tf.reduce_sum` 累積。\n",
"* 在 PyTorch 中,可以使用 `torch.topk` 函數獲取具有最高概率的類別索引,然後檢查正確的類別是否屬於其中。參考 [這裡](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) 獲取更多提示。\n"
]
},
{
@ -324,9 +344,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## 可選:建立貓狗分類\n",
"## 可選:建立貓 vs. 狗分類\n",
"\n",
"我們也希望了解在相同的數據集上,我們的二元貓狗分類的準確性如何。為此,我們需要調整標籤:\n"
"我們也想看看在同一個數據集上,我們的二元貓 vs. 狗分類的準確度如何。為此,我們需要調整標籤:\n"
]
},
{
@ -352,7 +372,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**免責聲明** \n本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵資訊,建議尋求專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋不承擔責任。\n"
"\n---\n\n**免責聲明** \n本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們努力確保翻譯的準確性,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵資訊,建議尋求專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋概不負責。\n"
]
}
],
@ -378,8 +398,8 @@
"version": "3.9.5"
},
"coopTranslator": {
"original_hash": "1de3ae931831253c3198d899da48bfe5",
"translation_date": "2025-08-28T10:54:27+00:00",
"original_hash": "df7d1f7da8d2617b76acd93115776ca4",
"translation_date": "2025-10-03T14:29:08+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb",
"language_code": "mo"
}

View File

@ -1,29 +1,29 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "f3d2cee9cb3c52160419e560c57a690e",
"translation_date": "2025-08-26T09:33:44+00:00",
"original_hash": "b70fcf7fcee862990f848c679090943f",
"translation_date": "2025-10-03T14:52:50+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/README.md",
"language_code": "mo"
}
-->
# 寵物臉部分類
# 寵物面孔分類
來自 [AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners) 的實驗作業。
## 任務
想像一下,你需要為寵物托育中心開發一個應用程式,用來記錄所有的寵物。這樣的應用程式其中一個很棒的功能就是能夠自動從照片中辨識寵物的品種。這可以透過神經網路成功實現。
想像一下,你需要開發一個寵物托育應用程式,用來記錄所有的寵物。這樣的應用程式其中一個很棒的功能就是能夠透過照片自動辨識寵物的品種。這可以透過神經網絡成功實現。
你需要訓練一個卷積神經網路,使用 **Pet Faces** 資料集來分類不同品種的貓和狗
你需要訓練一個卷積神經網絡來分類不同品種的貓和狗,使用 **Pet Faces** 數據集
## 資料
## 數據
我們將使用 **Pet Faces** 資料集,這是從 [Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/) 寵物資料集中衍生出來的。該資料集包含 35 種不同品種的狗和貓
我們將使用 [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/),該數據集包含 37 種不同品種的狗和貓的圖片
![我們將處理的資料集](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.mo.png)
![我們將處理的數據集](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.mo.png)
要下載資料集,請使用以下程式碼片段:
要下載數據集,請使用以下程式碼片段:
```python
!wget https://thor.robots.ox.ac.uk/~vgg/data/pets/images.tar.gz
@ -31,13 +31,17 @@ CO_OP_TRANSLATOR_METADATA:
!rm images.tar.gz
```
## 開始使用 Notebook
**注意:** Oxford-IIIT Pet Dataset 的圖片是根據檔名組織的(例如,`Abyssinian_1.jpg``Bengal_2.jpg`)。筆記本中包含了將這些圖片整理到品種特定子目錄的程式碼,以便於分類。
通過打開 [PetFaces.ipynb](../../../../../../lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb) 開始這次實驗。
## 開始筆記本
通過打開 [PetFaces.ipynb](PetFaces.ipynb) 開始實驗。
## 收穫
你已經從零開始解決了一個相對複雜的影像分類問題!雖然有相當多的分類,但你仍然能夠獲得合理的準確率!此外,測量 top-k 準確率也是有意義的,因為有些分類即使對人類來說也不容易區分清楚。
你已經從零開始解決了一個相對複雜的圖像分類問題!儘管有很多類別,你仍然能夠獲得合理的準確率!此外,測量 top-k 準確率也是有意義的,因為有些類別即使對人類來說也不容易區分,容易混淆。
---
**免責聲明**
本文件使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。應以原始語言的文件作為權威來源。對於關鍵資訊,建議尋求專業人工翻譯。我們對因使用此翻譯而產生的任何誤解或錯誤解讀概不負責
本文件使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們努力確保翻譯的準確性,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵資訊,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋不承擔責任

View File

@ -10,7 +10,9 @@
"\n",
"### डेटा मिळवणे\n",
"\n",
"या असाइनमेंटमध्ये, आपण तुलनेने सोप्या वर्गीकरणाच्या कार्यावर लक्ष केंद्रित करू - पाळीव प्राण्यांच्या चेहऱ्यांचे वर्गीकरण. हा डेटासेट [Oxford-IIIT Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/) मधून कापलेल्या चेहऱ्यांचा समावेश करतो. चला, डेटासेट लोड करून त्याचे दृश्यरूप पाहण्यास सुरुवात करूया.\n"
"या असाइनमेंटमध्ये आपण तुलनेने सोप्या वर्गीकरण कार्यावर लक्ष केंद्रित करू - पाळीव प्राण्यांच्या चेहऱ्यांचे वर्गीकरण. आपण [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/) वापरणार आहोत, ज्यामध्ये 37 वेगवेगळ्या जातींच्या कुत्रे आणि मांजरींच्या प्रतिमा आहेत. चला डेटा डाउनलोड करून त्याचे दृश्यांकन करण्यास सुरुवात करूया.\n",
"\n",
"**टीप:** Oxford-IIIT Pet Dataset मध्ये संपूर्ण पाळीव प्राण्यांच्या प्रतिमा आहेत. एक्स्ट्रॅक्ट केलेल्या फोल्डरमध्ये प्रतिमा जातींनुसार व्यवस्थित केल्या जातील.\n"
]
},
{
@ -46,7 +48,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"आम्ही यादीतील प्रतिमांची मालिका प्रदर्शित करण्यासाठी सामान्य फंक्शन परिभाषित करू.\n"
"आम्ही यादीतील प्रतिमांची मालिका प्रदर्शित करण्यासाठी सामान्य फंक्शन परिभाषित करू:\n"
]
},
{
@ -86,6 +88,24 @@
"metadata": {},
"outputs": [],
"source": [
"# Note: The Oxford-IIIT Pet Dataset extracts to a folder named 'images'\n",
"# Images are named by breed (e.g., 'Abyssinian_1.jpg')\n",
"# We need to organize them into breed-specific subdirectories\n",
"import os\n",
"from collections import defaultdict\n",
"\n",
"# Organize images by breed\n",
"if not os.path.exists('petfaces'):\n",
" os.makedirs('petfaces')\n",
" for img_file in os.listdir('images'):\n",
" if img_file.endswith(('.jpg', '.png')):\n",
" # Extract breed name from filename (everything before the last underscore and number)\n",
" breed = '_'.join(img_file.split('_')[:-1])\n",
" breed_dir = os.path.join('petfaces', breed)\n",
" if not os.path.exists(breed_dir):\n",
" os.makedirs(breed_dir)\n",
" os.rename(os.path.join('images', img_file), os.path.join(breed_dir, img_file))\n",
"\n",
"for cls in os.listdir('petfaces'):\n",
" print(cls)\n",
" display_images([Image.open(os.path.join('petfaces',cls,x)) \n",
@ -95,7 +115,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"आपल्या डेटासेटमधील वर्गांची संख्या देखील परिभाषित करूया:\n"
]
},
{
"cell_type": "code",
@ -124,11 +146,11 @@
"source": [
"## डीप लर्निंगसाठी डेटासेट तयार करणे\n",
"\n",
"आपले न्यूरल नेटवर्क प्रशिक्षण सुरू करण्यासाठी, आपल्याला सर्व प्रतिमा टेन्सर्समध्ये रूपांतरित कराव्या लागतील आणि लेबल्स (वर्ग क्रमांक) साठी संबंधित टेन्सर्स तयार करावे लागतील. बहुतेक न्यूरल नेटवर्क फ्रेमवर्कमध्ये प्रतिमांसाठी सोप्या साधनांचा समावेश असतो:\n",
"आपले न्यूरल नेटवर्क प्रशिक्षण सुरू करण्यासाठी, आपल्याला सर्व प्रतिमा टेन्सर्समध्ये रूपांतरित करणे आवश्यक आहे, तसेच लेबल्स (वर्ग क्रमांक) संबंधित टेन्सर्स तयार करणे आवश्यक आहे. बहुतेक न्यूरल नेटवर्क फ्रेमवर्कमध्ये प्रतिमांसाठी सोपे टूल्स असतात:\n",
"* Tensorflow मध्ये, `tf.keras.preprocessing.image_dataset_from_directory` वापरा\n",
"* PyTorch मध्ये, `torchvision.datasets.ImageFolder` वापरा\n",
"\n",
"वरील चित्रांमधून तुम्ही पाहिले असेल की, सर्व चित्रे जवळजवळ चौकोनी गुणोत्तरात आहेत, त्यामुळे आपल्याला सर्व प्रतिमा चौकोनी आकारात बदलणे आवश्यक आहे. तसेच, आपण प्रतिमा मिनीबॅचेसमध्ये आयोजित करू शकतो.\n"
"वर दिलेल्या चित्रांमधून तुम्ही पाहिले असेल, सर्व चित्रे जवळपास चौकोनी प्रमाणात आहेत, त्यामुळे आपल्याला सर्व प्रतिमा चौकोनी आकारात बदलणे आवश्यक आहे. तसेच, आपण प्रतिमा मिनीबॅचेसमध्ये व्यवस्थित करू शकतो.\n"
]
},
{
@ -234,8 +256,8 @@
"* अंतिम वर्गीकरणकर्ता लपवलेल्या स्तरांसह किंवा त्याशिवाय असू शकतो, परंतु आउटपुट न्यूरॉन्सची संख्या वर्गांच्या संख्येसारखीच असली पाहिजे.\n",
"\n",
"शेवटच्या स्तरावर सक्रियता फंक्शन + लॉस फंक्शन योग्य मिळवणे महत्त्वाचे आहे:\n",
"* Tensorflow मध्ये, तुम्ही सक्रियता म्हणून `softmax` वापरू शकता, आणि लॉस म्हणून `sparse_categorical_crossentropy`. Sparse categorical cross-entropy आणि non-sparse यामधील फरक म्हणजे पूर्वीचे आउटपुट वर्ग क्रमांक म्हणून अपेक्षित असते, one-hot vector म्हणून नाही.\n",
"* PyTorch मध्ये, तुम्ही अंतिम स्तर सक्रियता फंक्शनशिवाय ठेवू शकता, आणि `CrossEntropyLoss` लॉस फंक्शन वापरू शकता. हे फंक्शन आपोआप softmax लागू करते.\n"
"* Tensorflow मध्ये, तुम्ही सक्रियता म्हणून `softmax` वापरू शकता आणि लॉस म्हणून `sparse_categorical_crossentropy` वापरू शकता. sparse categorical cross-entropy आणि non-sparse यामधील फरक म्हणजे पूर्वीचे आउटपुट वर्ग क्रमांक म्हणून अपेक्षित असते, one-hot vector म्हणून नाही.\n",
"* PyTorch मध्ये, तुम्ही अंतिम स्तर सक्रियता फंक्शनशिवाय ठेवू शकता आणि `CrossEntropyLoss` लॉस फंक्शन वापरू शकता. हे फंक्शन आपोआप softmax लागू करते.\n"
]
},
{
@ -251,11 +273,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## न्यूरल नेटवर्क प्रशिक्षण द्या\n",
"## न्यूरल नेटवर्क प्रशिक्षित करा\n",
"\n",
"आता आपण न्यूरल नेटवर्क प्रशिक्षणासाठी तयार आहोत. प्रशिक्षणादरम्यान, प्रत्येक epoch वर train आणि test डेटावरची अचूकता गोळा करा आणि नंतर अचूकतेचा आलेख तयार करा, जेणेकरून overfitting आहे का ते पाहता येईल.\n",
"आता आपण न्यूरल नेटवर्क प्रशिक्षित कर्यासाठी तयार आहोत. प्रशिक्षणादरम्यान, कृपया प्रत्येक epoch वर ट्रेन आणि टेस्ट डेटावर अचूकता गोळा करा आणि नंतर अचूकतेचे प्लॉट तयार करा जेणेकरून ओव्हरफिटिंग आहे का ते पाहता येईल.\n",
"\n",
"> प्रशिक्षणाचा वेग वाढवण्यासाठी, GPU उपलब्ध असल्यास त्याचा वापर करा. TensorFlow/Keras आपोआप GPU वापरेल, परंतु PyTorch मध्ये GPU चा फायदा घेण्यासाठी, प्रशिक्षणादरम्यान मॉडेल आणि डेटा दोन्ही `.to()` पद्धतीचा वापर करून GPU वर हलवावे लागेल.\n"
"> प्रशिक्षणाचा वेग वाढवण्यासाठी, GPU उपलब्ध असल्यास त्याचा वापर करणे आवश्यक आहे. TensorFlow/Keras स्वयंचलितपणे GPU वापरेल, परंतु PyTorch मध्ये GPU acceleration चा फायदा घेण्यासाठी प्रशिक्षणादरम्यान मॉडेल आणि डेटा दोन्ही `.to()` पद्धतीचा वापर करून GPU वर हलवावे लागेल.\n"
]
},
{
@ -293,20 +315,20 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"ओव्हरफिटिंगबद्दल तुम्ही काय सांगू शकता? मॉडेलची अचूकता सुधारण्यासाठी काय करता येईल?\n",
"ओव्हरफिटिंग म्हणजे काय? मॉडेलची अचूकता सुधारण्यासाठी काय करता येईल?\n",
"\n",
"## पर्यायी: टॉप-3 अचूकता मोजा\n",
"\n",
"या सरावामध्ये, आपण 35 वर्गांसह उच्च संख्येच्या वर्गीकरणाशी व्यवहार करत होतो, त्यामुळे आपला निकाल - सुमारे 50% सत्यापन अचूकता - खूप चांगला आहे. स्टँडर्ड ImageNet डेटासेटमध्ये याहूनही जास्त - 1000 वर्ग असतात.\n",
"या व्यायामात, आपण 35 वर्गांसह वर्गीकरण करत होतो, त्यामुळे आपला निकाल - सुमारे 50% व्हॅलिडेशन अचूकता - खूप चांगला आहे. मानक ImageNet डेटासेटमध्ये याहून अधिक - 1000 वर्ग असतात.\n",
"\n",
"अशा परिस्थितीत, मॉडेलने **नेहमीच** वर्ग अचूकपणे ओळखावा याची खात्री करणे कठीण असते. काही वेळा दोन जाती एकमेकांशी खूपच साधर्म्य असतात, आणि मॉडेल अगदी जवळजवळ समान शक्यता परत करते (उदा., 0.45 आणि 0.43). जर आपण मानक अचूकता मोजली, तर ती चुकीची केस मानली जाईल, जरी मॉडेलने खूपच लहान चूक केली असेल. यामुळे, आपण अनेकदा दुसरी मेट्रिक मोजतो - मॉडेलच्या टॉप 3 सर्वाधिक संभाव्य अंदाजांमध्ये अचूकता.\n",
"अशा परिस्थितीत, मॉडेलने **नेहमीच** वर्ग योग्यरित्या ओळखावा याची खात्री करणे कठीण असते. काही वेळा दोन जाती एकमेकांशी खूपच साम्य असतात, आणि मॉडेल अतिशय जवळच्या शक्यता परत करते (उदा., 0.45 आणि 0.43). जर आपण मानक अचूकता मोजली, तर ती चुकीची केस मानली जाईल, जरी मॉडेलने खूप छोटा चुका केला असेल. त्यामुळे, आपण अनेकदा दुसरी मेट्रिक मोजतो - मॉडेलच्या सर्वाधिक शक्यतांच्या टॉप 3 अंदाजांमध्ये अचूकता.\n",
"\n",
"जर लक्ष्य लेबल मॉडेलच्या टॉप 3 अंदाजांमध्ये समाविष्ट असेल, तर आपण त्या केसला अचूक मानतो.\n",
"\n",
"टेस्ट डेटासेटवर टॉप-3 अचूकता मोजण्यासाठी, तुम्हाला डेटासेटवर मॅन्युअली जावे लागेल, न्यूरल नेटवर्क लागू करावे लागेल जेणेकरून अंदाज मिळतील, आणि नंतर गणना करावी लागेल. काही सूचना:\n",
"टेस्ट डेटासेटवर टॉप-3 अचूकता मोजण्यासाठी, तुम्हाला डेटासेटवर मॅन्युअली जावे लागेल, न्यूरल नेटवर्क लागू करावे लागेल जेणेकरून अंदाज मिळल, आणि नंतर गणना करावी लागेल. काही सूचना:\n",
"\n",
"* Tensorflow मध्ये, `tf.nn.in_top_k` फंक्शन वापरा, जे पाहते की `predictions` (मॉडेलचे आउटपुट) टॉप-k मध्ये आहेत का (`k=3` पॅरामीटर म्हणून पास करा), `targets` च्या संदर्भात. हे फंक्शन बूलियन व्हॅल्यूजचा टेन्सर परत करते, ज्याला `tf.cast` वापरून `int` मध्ये रूपांतरित करता येते, आणि नंतर `tf.reduce_sum` वापरून एकत्रित करता येते.\n",
"* PyTorch मध्ये, तुम्ही `torch.topk` फंक्शन वापरू शकता, ज्यामुळे उच्च शक्यतांच्या वर्गांचे इंडेक्स मिळता, आणि नंतर योग्य वर्ग त्यामध्ये आहे का ते पाहू शकता. अधिक सूचनांसाठी [हे](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) पहा.\n"
"* Tensorflow मध्ये, `tf.nn.in_top_k` फंक्शन वापरा जेणेकरून `predictions` (मॉडेलचे आउटपुट) टॉप-k मध्ये आहेत का हे पाहता येईल (पॅरामीटर म्हणून `k=3` पास करा), `targets` च्या संदर्भात. हे फंक्शन बूलियन व्हॅल्यूजचा टेन्सर परत करते, ज्याला `tf.cast` वापरून `int` मध्ये रूपांतरित करता येते, आणि नंतर `tf.reduce_sum` वापरून जमा करता येते.\n",
"* PyTorch मध्ये, तुम्ही `torch.topk` फंक्शन वापरू उच्च शक्यतांच्या वर्गांचे इंडेक्स मिळवू शकता, आणि नंतर योग्य वर्ग त्यामध्ये आहे का ते पाहू शकता. अधिक सूचनांसाठी [हे](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) पहा.\n"
]
},
{
@ -324,7 +346,7 @@
"source": [
"## पर्यायी: मांजरे विरुद्ध कुत्रे वर्गीकरण तयार करा\n",
"\n",
"आम्हाला हे देखील पाहायचे आहे की आमच्या द्विआधारी मांजरे विरुद्ध कुत्रे वर्गीकरणाचे अचूकता याच डेटासेटवर किती चांगले असेल. हे करण्यासाठी, आपल्याला लेबल्स समायोजित करावे लागतील:\n"
"आम्हाला हे देखील पाहायचे आहे की आमच द्विआधारी मांजरे विरुद्ध कुत्रे वर्गीकरण त्याच डेटासेटवर किती अचूक असेल. हे करण्यासाठी, आपल्याला लेबल्स समायोजित करणे आवश्यक आहे:\n"
]
},
{
@ -350,7 +372,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**अस्वीकरण**: \nहा दस्तऐवज AI भाषांतर सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) चा वापर करून भाषांतरित करण्यात आला आहे. आम्ही अचूकतेसाठी प्रयत्नशील असलो तरी कृपया लक्षात ठेवा की स्वयंचलित भाषांतरांमध्ये त्रुटी किंवा अचूकतेचा अभाव असू शकतो. मूळ भाषेतील दस्तऐवज हा अधिकृत स्रोत मानला जावा. महत्त्वाच्या माहितीसाठी व्यावसायिक मानवी भाषांतराची शिफारस केली जाते. या भाषांतराचा वापर करून निर्माण होणाऱ्या कोणत्याही गैरसमज किंवा चुकीच्या अर्थासाठी आम्ही जबाबदार राहणार नाही.\n"
"\n---\n\n**अस्वीकरण**: \nहा दस्तऐवज AI भाषांतर सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) वापरून भाषांतरित करण्यात आला आहे. आम्ही अचूकतेसाठी प्रयत्नशील असलो तरी कृपया लक्षात ठेवा की स्वयंचलित भाषांतरांमध्ये त्रुटी किंवा अचूकतेचा अभाव असू शकतो. मूळ भाषेतील दस्तऐवज हा अधिकृत स्रोत मानला जावा. महत्त्वाच्या माहितीसाठी व्यावसायिक मानवी भाषांतराची शिफारस केली जाते. या भाषांतराचा वापर करून निर्माण झालेल्या कोणत्याही गैरसमज किंवा चुकीच्या अर्थासाठी आम्ही जबाबदार राहणार नाही.\n"
]
}
],
@ -376,8 +398,8 @@
"version": "3.9.5"
},
"coopTranslator": {
"original_hash": "1de3ae931831253c3198d899da48bfe5",
"translation_date": "2025-08-28T07:47:01+00:00",
"original_hash": "df7d1f7da8d2617b76acd93115776ca4",
"translation_date": "2025-10-03T14:32:58+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb",
"language_code": "mr"
}

View File

@ -1,8 +1,8 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "f3d2cee9cb3c52160419e560c57a690e",
"translation_date": "2025-08-26T09:34:06+00:00",
"original_hash": "b70fcf7fcee862990f848c679090943f",
"translation_date": "2025-10-03T14:53:49+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/README.md",
"language_code": "mr"
}
@ -13,17 +13,17 @@ CO_OP_TRANSLATOR_METADATA:
## कार्य
कल्पना करा की तुम्हाला पाळीव प्राण्यांच्या नर्सरीसाठी एक अॅप्लिकेशन विकसित करायचे आहे, जे सर्व पाळीव प्राण्यांची नोंद ठेवेल. अशा अॅप्लिकेशनची एक उत्तम वैशिष्ट्य म्हणजे छायाचित्रावरून प्राण्याच्या जातीचा आपोआप शोध लावणे. हे कार्य न्यूरल नेटवर्क्सचा वापर करून यशस्वीरीत्या करता येते.
कल्पना करा की तुम्हाला पाळीव प्राण्यांच्या नर्सरीसाठी एक अॅप्लिकेशन विकसित करायचे आहे जे सर्व पाळीव प्राण्यांचे वर्गीकरण करेल. अशा अॅप्लिकेशनची एक उत्तम वैशिष्ट्य म्हणजे छायाचित्रावरून प्राण्याची जात आपोआप शोधणे. हे न्यूरल नेटवर्क्स वापरून यशस्वीपणे करता येते.
तुम्हाला **Pet Faces** डेटासेटचा वापर करून विविध जातींच्या मांजरी आणि कुत्र्यांचे वर्गीकरण करण्यासाठी एक कन्व्होल्यूशनल न्यूरल नेटवर्क प्रशिक्षण द्यायचे आहे.
तुम्हाला **Pet Faces** डेटासेट वापरून मांजरी आणि कुत्र्यांच्या विविध जाती वर्गीकृत करण्यासाठी एक कॉनव्होल्यूशनल न्यूरल नेटवर्क प्रशिक्षण द्यायचे आहे.
## डेटासेट
पण **Pet Faces** डेटासेट वापरणार आहोत, जो [Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/) पाळीव प्राण्यांच्या डेटासेटवरून तयार केला आहे. यात 35 वेगवेगळ्या जातींच्या कुत्र्यांचा आणि मांजरींचा समावेश आहे.
म्ही [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/) वापरणार आहोत, ज्यामध्ये 37 वेगवेगळ्या जातींच्या कुत्र्यांच्या आणि मांजरींच्या प्रतिमा आहेत.
![आपण ज्यावर काम करणार आहोत तो डेटासेट](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.mr.png)
![आपण हाताळत असलेला डेटासेट](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.mr.png)
डेटासेट डाउनलोड करण्यासाठी, खालील कोड स्निपेट वापरा:
डेटासेट डाउनलोड करण्यासाठी, हा कोड स्निपेट वापरा:
```python
!wget https://thor.robots.ox.ac.uk/~vgg/data/pets/images.tar.gz
@ -31,13 +31,17 @@ CO_OP_TRANSLATOR_METADATA:
!rm images.tar.gz
```
**टीप:** Oxford-IIIT Pet Dataset प्रतिमा फाइल नावानुसार आयोजित केल्या आहेत (उदा., `Abyssinian_1.jpg`, `Bengal_2.jpg`). वर्गीकरण सुलभ करण्यासाठी या प्रतिमा जाती-विशिष्ट उपनिर्देशिकांमध्ये आयोजित करण्यासाठी नोटबुकमध्ये कोड समाविष्ट आहे.
## प्रारंभिक नोटबुक
प्रयोगशाळा सुरू करण्यासाठी [PetFaces.ipynb](../../../../../../lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb) उघडा.
[PetFaces.ipynb](PetFaces.ipynb) उघडून प्रयोगशाळा सुरू करा.
## मुख्य मुद्दा
## महत्त्वाचे मुद्दे
तुम्ही प्रतिमांचे वर्गीकरण करण्याचा तुलनेने जटिल प्रश्न सुरुवातीपासून सोडवला आहे! येथे बऱ्याच वर्गांचा समावेश होता, तरीही तुम्ही समाधानकारक अचूकता मिळवली! तसेच, टॉप-k अचूकता मोजणे महत्त्वाचे आहे, कारण काही वर्गांमध्ये गोंधळ होणे सोपे आहे, विशेषतः जेव्हा ते वर्ग माणसांसाठीही स्पष्टपणे वेगळे दिसत नाहीत.
तुम्ही प्रतिमेचे वर्गीकरण शून्यापासून सोडवले आहे, जे तुलनेने जटिल समस्या आहे! वर्ग खूप होते, तरीही तुम्ही वाजवी अचूकता मिळवली! टॉप-k अचूकता मोजणे देखील महत्त्वाचे आहे, कारण काही वर्ग गोंधळात टाकणारे असू शकतात जे मानवांसाठीही स्पष्टपणे वेगळे नाहीत.
---
**अस्वीकरण**:
हा दस्तऐवज AI भाषांतर सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) चा वापर करून भाषांतरित करण्यात आला आहे. आम्ही अचूकतेसाठी प्रयत्नशील असलो तरी, कृपया लक्षात घ्या की स्वयंचलित भाषांतरांमध्ये त्रुटी किंवा अचूकतेचा अभाव असू शकतो. मूळ भाषेतील मूळ दस्तऐवज हा अधिकृत स्रोत मानला जावा. महत्त्वाच्या माहितीसाठी, व्यावसायिक मानवी भाषांतराची शिफारस केली जाते. या भाषांतराचा वापर केल्यामुळे उद्भवणाऱ्या कोणत्याही गैरसमज किंवा चुकीच्या अर्थासाठी आम्ही जबाबदार राहणार नाही.
हा दस्तऐवज AI भाषांतर सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) चा वापर करून भाषांतरित करण्यात आला आहे. आम्ही अचूकतेसाठी प्रयत्नशील असलो तरी कृपया लक्षात ठेवा की स्वयंचलित भाषांतरे त्रुटी किंवा अचूकतेच्या अभावाने युक्त असू शकतात. मूळ भाषेतील दस्तऐवज हा अधिकृत स्रोत मानला जावा. महत्त्वाच्या माहितीसाठी व्यावसायिक मानवी भाषांतराची शिफारस केली जाते. या भाषांतराचा वापर करून उद्भवलेल्या कोणत्याही गैरसमज किंवा चुकीच्या अर्थासाठी आम्ही जबाबदार राहणार नाही.

View File

@ -10,7 +10,9 @@
"\n",
"### Mendapatkan Data\n",
"\n",
"Dalam tugasan ini, kita akan memberi tumpuan kepada tugas pengelasan yang agak mudah - pengelasan wajah haiwan peliharaan. Dataset ini terdiri daripada wajah yang dipotong daripada [Dataset Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/). Mari kita mulakan dengan memuatkan dan memvisualisasikan dataset.\n"
"Dalam tugasan ini, kita akan memberi tumpuan kepada tugas pengelasan yang agak mudah - pengelasan wajah haiwan peliharaan. Kita akan menggunakan [Dataset Haiwan Peliharaan Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/), yang mengandungi imej 37 baka anjing dan kucing yang berbeza. Mari kita mulakan dengan memuat turun dan memvisualisasikan dataset.\n",
"\n",
"**Nota:** Dataset Haiwan Peliharaan Oxford-IIIT mengandungi imej penuh haiwan peliharaan. Imej-imej akan disusun mengikut baka dalam folder yang diekstrak.\n"
]
},
{
@ -86,6 +88,24 @@
"metadata": {},
"outputs": [],
"source": [
"# Note: The Oxford-IIIT Pet Dataset extracts to a folder named 'images'\n",
"# Images are named by breed (e.g., 'Abyssinian_1.jpg')\n",
"# We need to organize them into breed-specific subdirectories\n",
"import os\n",
"from collections import defaultdict\n",
"\n",
"# Organize images by breed\n",
"if not os.path.exists('petfaces'):\n",
" os.makedirs('petfaces')\n",
" for img_file in os.listdir('images'):\n",
" if img_file.endswith(('.jpg', '.png')):\n",
" # Extract breed name from filename (everything before the last underscore and number)\n",
" breed = '_'.join(img_file.split('_')[:-1])\n",
" breed_dir = os.path.join('petfaces', breed)\n",
" if not os.path.exists(breed_dir):\n",
" os.makedirs(breed_dir)\n",
" os.rename(os.path.join('images', img_file), os.path.join(breed_dir, img_file))\n",
"\n",
"for cls in os.listdir('petfaces'):\n",
" print(cls)\n",
" display_images([Image.open(os.path.join('petfaces',cls,x)) \n",
@ -96,7 +116,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Mari kita juga tetapkan bilangan kelas dalam set data kita:\n"
"Mari kita juga tentukan bilangan kelas dalam set data kita:\n"
]
},
{
@ -162,7 +182,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Sekarang mari kita cetak saiz tensor dalam dataset kita. Jika anda telah melakukan semuanya dengan betul, saiz elemen latihan sepatutnya\n",
"Sekarang mari cetak saiz tensor dalam dataset kita. Jika anda telah melakukan semuanya dengan betul, saiz elemen latihan sepatutnya\n",
" * `(batch_size,image_size,image_size,3)` untuk Tensorflow, `batch_size,3,image_size,image_size` untuk PyTorch\n",
" * `batch_size` untuk Label\n",
" \n",
@ -228,16 +248,16 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## Menentukan rangkaian neural\n",
"## Definisikan rangkaian neural\n",
"\n",
"Untuk pengelasan imej, anda mungkin perlu menentukan rangkaian neural konvolusi dengan beberapa lapisan. Perkara yang perlu diberi perhatian:\n",
"Untuk pengelasan imej, anda mungkin perlu mendefinisikan rangkaian neural konvolusi dengan beberapa lapisan. Perkara yang perlu diberi perhatian:\n",
"* Ingatlah seni bina piramid, iaitu bilangan penapis harus meningkat apabila anda pergi lebih dalam.\n",
"* Jangan lupa fungsi pengaktifan antara lapisan (ReLU) dan Max Pooling.\n",
"* Pengelas akhir boleh dengan atau tanpa lapisan tersembunyi, tetapi bilangan neuron output harus sama dengan bilangan kelas.\n",
"\n",
"Perkara penting adalah memastikan fungsi pengaktifan pada lapisan terakhir + fungsi kehilangan adalah betul:\n",
"* Dalam Tensorflow, anda boleh menggunakan `softmax` sebagai fungsi pengaktifan, dan `sparse_categorical_crossentropy` sebagai fungsi kehilangan. Perbezaan antara kehilangan kategori silang jarang (sparse) dan tidak jarang adalah bahawa yang pertama mengharapkan output sebagai nombor kelas, dan bukan sebagai vektor satu-panas.\n",
"* Dalam PyTorch, anda boleh mempunyai lapisan terakhir tanpa fungsi pengaktifan, dan menggunakan fungsi kehilangan `CrossEntropyLoss`. Fungsi ini secara automatik menggunakan softmax.\n"
"* Dalam Tensorflow, anda boleh menggunakan `softmax` sebagai fungsi pengaktifan, dan `sparse_categorical_crossentropy` sebagai fungsi kehilangan. Perbezaan antara kehilangan kategori silang jarang (sparse) dan tidak jarang adalah bahawa yang pertama mengharapkan output sebagai nombor kelas, dan bukan sebagai vektor one-hot.\n",
"* Dalam PyTorch, anda boleh mempunyai lapisan akhir tanpa fungsi pengaktifan, dan menggunakan fungsi kehilangan `CrossEntropyLoss`. Fungsi ini secara automatik menggunakan softmax.\n"
]
},
{
@ -253,9 +273,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## Melatih Rangkaian Neural\n",
"## Latih Rangkaian Neural\n",
"\n",
"Sekarang kita bersedia untuk melatih rangkaian neural. Semasa latihan, sila kumpulkan ketepatan pada data latihan dan ujian untuk setiap epoch, dan kemudian plotkan ketepatan tersebut untuk melihat sama ada terdapat overfitting.\n",
"Sekarang kita bersedia untuk melatih rangkaian neural. Semasa latihan, sila kumpulkan ketepatan pada data latihan dan ujian pada setiap epoch, dan kemudian plotkan ketepatan untuk melihat sama ada terdapat overfitting.\n",
"\n",
"> Untuk mempercepatkan latihan, anda perlu menggunakan GPU jika tersedia. Walaupun TensorFlow/Keras akan secara automatik menggunakan GPU, dalam PyTorch anda perlu memindahkan kedua-dua model dan data ke GPU semasa latihan menggunakan kaedah `.to()` untuk memanfaatkan pecutan GPU.\n"
]
@ -295,19 +315,19 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Apa yang boleh anda katakan tentang overfitting? Apa yang boleh dilakukan untuk meningkatkan ketepatan model?\n",
"Apa yang boleh dikatakan tentang overfitting? Apa yang boleh dilakukan untuk meningkatkan ketepatan model?\n",
"\n",
"## Pilihan: Kira Ketepatan Top-3\n",
"\n",
"Dalam latihan ini, kita berurusan dengan klasifikasi yang mempunyai bilangan kelas yang agak tinggi (35), jadi hasil kita - sekitar 50% ketepatan validasi - adalah agak baik. Dataset standard ImageNet mempunyai lebih banyak lagi - 1000 kelas.\n",
"Dalam latihan ini, kita berhadapan dengan klasifikasi yang mempunyai bilangan kelas yang agak tinggi (35), jadi hasil kita - sekitar 50% ketepatan validasi - adalah cukup baik. Dataset standard ImageNet mempunyai lebih banyak kelas - 1000 kelas.\n",
"\n",
"Dalam kes seperti ini, adalah sukar untuk memastikan bahawa model **sentiasa** meramalkan kelas dengan betul. Terdapat kes di mana dua baka sangat serupa antara satu sama lain, dan model memberikan kebarangkalian yang hampir sama (contohnya, 0.45 dan 0.43). Jika kita mengukur ketepatan standard, ia akan dianggap sebagai kesalahan, walaupun model hanya membuat kesilapan kecil. Oleh itu, kita sering mengukur metrik lain - ketepatan dalam tiga ramalan paling mungkin oleh model.\n",
"Dalam kes seperti ini, sukar untuk memastikan model **sentiasa** meramalkan kelas dengan betul. Terdapat situasi di mana dua baka sangat serupa antara satu sama lain, dan model memberikan kebarangkalian yang hampir sama (contohnya, 0.45 dan 0.43). Jika kita mengukur ketepatan standard, ia akan dianggap sebagai kesalahan, walaupun model hanya membuat kesilapan kecil. Oleh itu, kita sering mengukur metrik lain - ketepatan dalam tiga ramalan paling mungkin oleh model.\n",
"\n",
"Kita menganggap kes itu tepat jika label sasaran terkandung dalam tiga ramalan teratas model.\n",
"\n",
"Untuk mengira ketepatan top-3 pada dataset ujian, anda perlu secara manual melalui dataset, menggunakan rangkaian neural untuk mendapatkan ramalan, dan kemudian melakukan pengiraan. Beberapa petunjuk:\n",
"\n",
"* Dalam Tensorflow, gunakan fungsi `tf.nn.in_top_k` untuk melihat sama ada `predictions` (output model) berada dalam top-k (masukkan `k=3` sebagai parameter), berkenaan dengan `targets`. Fungsi ini mengembalikan tensor nilai boolean, yang boleh ditukar kepada `int` menggunakan `tf.cast`, dan kemudian dijumlahkan menggunakan `tf.reduce_sum`.\n",
"* Dalam Tensorflow, gunakan fungsi `tf.nn.in_top_k` untuk melihat sama ada `predictions` (output model) berada dalam top-k (masukkan `k=3` sebagai parameter), berkenaan dengan `targets`. Fungsi ini mengembalikan tensor nilai boolean, yang boleh ditukar kepada `int` menggunakan `tf.cast`, dan kemudian dikumpulkan menggunakan `tf.reduce_sum`.\n",
"* Dalam PyTorch, anda boleh menggunakan fungsi `torch.topk` untuk mendapatkan indeks kelas dengan kebarangkalian tertinggi, dan kemudian melihat sama ada kelas yang betul termasuk dalamnya. Lihat [ini](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) untuk lebih banyak petunjuk.\n"
]
},
@ -324,9 +344,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## Pilihan: Bina pengelasan Kucing vs. Anjing\n",
"## Pilihan: Bina klasifikasi Kucing vs. Anjing\n",
"\n",
"Kami juga ingin melihat sejauh mana ketepatan pengelasan binari kucing vs. anjing pada set data yang sama. Untuk melakukannya, kita perlu melaraskan label:\n"
"Kami juga ingin melihat sejauh mana ketepatan klasifikasi binari kucing vs. anjing pada dataset yang sama. Untuk melakukannya, kita perlu menyesuaikan label:\n"
]
},
{
@ -352,7 +372,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Penafian**: \nDokumen ini telah diterjemahkan menggunakan perkhidmatan terjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Walaupun kami berusaha untuk memastikan ketepatan, sila ambil perhatian bahawa terjemahan automatik mungkin mengandungi kesilapan atau ketidaktepatan. Dokumen asal dalam bahasa asalnya harus dianggap sebagai sumber yang berwibawa. Untuk maklumat penting, terjemahan manusia profesional adalah disyorkan. Kami tidak bertanggungjawab atas sebarang salah faham atau salah tafsir yang timbul daripada penggunaan terjemahan ini.\n"
"\n---\n\n**Penafian**: \nDokumen ini telah diterjemahkan menggunakan perkhidmatan terjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Walaupun kami berusaha untuk memastikan ketepatan, sila ambil perhatian bahawa terjemahan automatik mungkin mengandungi kesilapan atau ketidaktepatan. Dokumen asal dalam bahasa asalnya harus dianggap sebagai sumber yang berwibawa. Untuk maklumat yang kritikal, terjemahan manusia profesional adalah disyorkan. Kami tidak bertanggungjawab atas sebarang salah faham atau salah tafsir yang timbul daripada penggunaan terjemahan ini.\n"
]
}
],
@ -378,8 +398,8 @@
"version": "3.9.5"
},
"coopTranslator": {
"original_hash": "1de3ae931831253c3198d899da48bfe5",
"translation_date": "2025-08-29T13:27:31+00:00",
"original_hash": "df7d1f7da8d2617b76acd93115776ca4",
"translation_date": "2025-10-03T14:42:51+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb",
"language_code": "ms"
}

View File

@ -1,8 +1,8 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "f3d2cee9cb3c52160419e560c57a690e",
"translation_date": "2025-08-29T11:48:08+00:00",
"original_hash": "b70fcf7fcee862990f848c679090943f",
"translation_date": "2025-10-03T14:56:27+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/README.md",
"language_code": "ms"
}
@ -11,15 +11,15 @@ CO_OP_TRANSLATOR_METADATA:
Tugasan Makmal daripada [Kurikulum AI untuk Pemula](https://github.com/microsoft/ai-for-beginners).
## Tugasan
## Tugas
Bayangkan anda perlu membangunkan aplikasi untuk pusat penjagaan haiwan peliharaan bagi mengkatalogkan semua haiwan peliharaan. Salah satu ciri hebat aplikasi tersebut ialah mengenal pasti baka secara automatik daripada gambar. Ini boleh dilakukan dengan jayanya menggunakan rangkaian neural.
Anda perlu melatih rangkaian neural konvolusi untuk mengelaskan pelbagai baka kucing dan anjing menggunakan dataset **Pet Faces**.
Anda perlu melatih rangkaian neural konvolusi untuk mengklasifikasikan pelbagai baka kucing dan anjing menggunakan dataset **Pet Faces**.
## Dataset
Kita akan menggunakan dataset **Pet Faces**, yang diambil daripada dataset haiwan peliharaan [Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/). Ia mengandungi 35 baka anjing dan kucing yang berbeza.
Kita akan menggunakan [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), yang mengandungi imej 37 baka anjing dan kucing yang berbeza.
![Dataset yang akan kita gunakan](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.ms.png)
@ -31,15 +31,17 @@ Untuk memuat turun dataset, gunakan kod berikut:
!rm images.tar.gz
```
**Nota:** Imej dalam Oxford-IIIT Pet Dataset diatur mengikut nama fail (contohnya, `Abyssinian_1.jpg`, `Bengal_2.jpg`). Notebook ini termasuk kod untuk mengatur imej-imej ini ke dalam subdirektori mengikut baka untuk memudahkan pengelasan.
## Memulakan Notebook
Mulakan makmal dengan membuka [PetFaces.ipynb](PetFaces.ipynb)
## Kesimpulan
Anda telah menyelesaikan masalah pengelasan imej yang agak kompleks dari awal! Terdapat banyak kelas, dan anda masih mampu mencapai ketepatan yang munasabah! Ia juga masuk akal untuk mengukur ketepatan top-k, kerana mudah untuk mengelirukan beberapa kelas yang tidak begitu jelas berbeza walaupun kepada manusia.
Anda telah menyelesaikan masalah pengelasan imej yang agak kompleks dari awal! Terdapat banyak kelas, dan anda masih mampu mencapai ketepatan yang munasabah! Ia juga masuk akal untuk mengukur ketepatan top-k, kerana mudah untuk mengelirukan beberapa kelas yang tidak begitu berbeza walaupun bagi manusia.
---
**Penafian**:
Dokumen ini telah diterjemahkan menggunakan perkhidmatan terjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Walaupun kami berusaha untuk memastikan ketepatan, sila ambil perhatian bahawa terjemahan automatik mungkin mengandungi kesilapan atau ketidaktepatan. Dokumen asal dalam bahasa asalnya harus dianggap sebagai sumber yang berwibawa. Untuk maklumat penting, terjemahan manusia profesional adalah disyorkan. Kami tidak bertanggungjawab atas sebarang salah faham atau salah tafsir yang timbul daripada penggunaan terjemahan ini.
Dokumen ini telah diterjemahkan menggunakan perkhidmatan terjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Walaupun kami berusaha untuk memastikan ketepatan, sila ambil perhatian bahawa terjemahan automatik mungkin mengandungi kesilapan atau ketidaktepatan. Dokumen asal dalam bahasa asalnya harus dianggap sebagai sumber yang berwibawa. Untuk maklumat yang kritikal, terjemahan manusia profesional adalah disyorkan. Kami tidak bertanggungjawab atas sebarang salah faham atau salah tafsir yang timbul daripada penggunaan terjemahan ini.

View File

@ -4,13 +4,15 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"# အိမ်မွေးတိရစ္ဆာန် မျက်နှာများ၏ အမျိုးအစားခွဲခြားခြင်း\n",
"# အိမ်မွေးတိရစ္ဆာန်များ၏ မျက်နှာပုံစံ ခွဲခြားခြင်း\n",
"\n",
"[AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners) မှ လက်တွေ့လေ့ကျင့်မှုအလုပ်များ။\n",
"[AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners) မှ လက်တွေ့လေ့ကျင့်ခန်း။\n",
"\n",
"### ဒေတာရယူခြင်း\n",
"\n",
"ဒီလေ့ကျင့်မှုမှာ ကျွန်တော်တို့ အလွန်ရိုးရှင်းတဲ့ အမျိုးအစားခွဲခြားမှု အလုပ်တစ်ခုကို အာရုံစိုက်သွားမှာဖြစ်ပါတယ် - အိမ်မွေးတိရစ္ဆာန် မျက်နှာများ၏ အမျိုးအစားခွဲခြားခြင်း။ ဒီဒေတာအစုအဝေးမှာ [Oxford-IIIT Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/) မှ ဖြတ်တောက်ထားသော မျက်နှာများ ပါဝင်ပါတယ်။ ဒေတာကို စတင်တင်သွင်းပြီး မြင်တွေ့ကြည့်ရှုခြင်းမှ စတင်ကြရအောင်။\n"
"ဒီလေ့ကျင့်ခန်းမှာ အလွန်ရိုးရှင်းတဲ့ ခွဲခြားမှုအလုပ်ကို အဓိကထားလုပ်ဆောင်မှာဖြစ်ပြီး - အိမ်မွေးတိရစ္ဆာန်များ၏ မျက်နှာပုံစံ ခွဲခြားခြင်းကို လုပ်ဆောင်မှာဖြစ်ပါတယ်။ [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/) ကို အသုံးပြုမှာဖြစ်ပြီး၊ အဲဒီမှာ ခွေးနဲ့ကြောင်အမျိုးအစား ၃၇ မျိုးအထိ ပါဝင်တဲ့ ပုံများကို တွေ့ရမှာဖြစ်ပါတယ်။ ဒေတာကို ဒေါင်းလုဒ်လုပ်ပြီး၊ အရင်ဆုံး visualization လုပ်ကြည့်ရအောင်။\n",
"\n",
"**Note:** Oxford-IIIT Pet Dataset မှာ အိမ်မွေးတိရစ္ဆာန်များ၏ အပြည့်အစုံပုံများ ပါဝင်ပါတယ်။ Extract လုပ်ပြီးရတဲ့ folder မှာ ပုံတွေကို အမျိုးအစားအလိုက် စီထားပေးမှာဖြစ်ပါတယ်။\n"
]
},
{
@ -46,7 +48,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"ကျွန်ုပ်တို့သည် စာရင်းမှ ပုံများစီးရီးကို ပြသရန် အထွေထွေဖန်ရှင်ကို သတ်မှတ်မည်:\n"
"ကျွန်ုပ်တို့သည် စာရင်းမှ ပုံများစီးရီးကို ပြသရန် အထွေထွေဖန်ရှင်ကို သတ်မှတ်မည်\n"
]
},
{
@ -77,7 +79,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"အခုတော့ အတန်းခွဲဒိုင်ရက်ထဲကိုလျှောက်ပြီး အတန်းတစ်ခုချင်းစီရဲ့ ပထမဦးဆုံးပုံများကို ရှုထောင်ကြမယ်:\n"
"အခုတော့ အတန်းခွဲ subdirectories အားလုံးကို ဖြတ်သန်းပြီး အတန်းတစ်ခုချင်းစီ၏ ပထမဆုံးပုံအချို့ကို ပုံဖော်ကြည့်ပါစို့။\n"
]
},
{
@ -86,6 +88,24 @@
"metadata": {},
"outputs": [],
"source": [
"# Note: The Oxford-IIIT Pet Dataset extracts to a folder named 'images'\n",
"# Images are named by breed (e.g., 'Abyssinian_1.jpg')\n",
"# We need to organize them into breed-specific subdirectories\n",
"import os\n",
"from collections import defaultdict\n",
"\n",
"# Organize images by breed\n",
"if not os.path.exists('petfaces'):\n",
" os.makedirs('petfaces')\n",
" for img_file in os.listdir('images'):\n",
" if img_file.endswith(('.jpg', '.png')):\n",
" # Extract breed name from filename (everything before the last underscore and number)\n",
" breed = '_'.join(img_file.split('_')[:-1])\n",
" breed_dir = os.path.join('petfaces', breed)\n",
" if not os.path.exists(breed_dir):\n",
" os.makedirs(breed_dir)\n",
" os.rename(os.path.join('images', img_file), os.path.join(breed_dir, img_file))\n",
"\n",
"for cls in os.listdir('petfaces'):\n",
" print(cls)\n",
" display_images([Image.open(os.path.join('petfaces',cls,x)) \n",
@ -95,7 +115,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"ကျွန်တော်တို့ရဲ့ဒေတာစုပေါင်းမှာ အတန်းအရေအတွက်ကိုလည်း သတ်မှတ်ကြပါစို့။\n"
]
},
{
"cell_type": "code",
@ -122,13 +144,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## အနက်ရှိုင်းသော သင်ယူမှုအတွက် ဒေတာစုပုံပြင်ဆင်ခြင်း\n",
"## အနက်ရှိုင်းသော သင်ယူမှုအတွက် ဒေတာစနစ်ကို ပြင်ဆင်ခြင်း\n",
"\n",
"ကျွန်ုပ်တို့၏ နာရက်ကွန်ယက်ကို သင်ကြားခြင်းကို စတင်ရန်၊ ပုံအားလုံးကို တန်ဆာများအဖြစ် ပြောင်းလဲရန်နှင့် အမှတ်အသားများ (အတန်းနံပါတ်များ) နှင့် ကိုက်ညီသော တန်ဆာများကို ဖန်တီးရန် လိုအပ်ပါသည်။ နာရက်ကွန်ယက် ဖွံ့ဖြိုးရေးအတွက် framework များစွာတွင် ပုံများကို ကိုင်တွယ်ရန် အလွယ်ကူသော ကိရိယာများ ပါဝင်သည်။\n",
"ကျွန်ုပ်တို့၏ နာရူရယ်ကွန်ယက်ကို သင်ကြားခြင်းကို စတင်ရန်၊ ပုံများအားလုံးကို တန်ဆာများ (tensors) သို့ ပြောင်းလဲရန်လိုအပ်ပြီး၊ အမှတ်အသားများ (အတန်းနံပါတ်များ) နှင့် ကိုက်ညီသော တန်ဆာများကိုလည်း ဖန်တီးရန်လိုအပ်ပါသည်။ နာရူရယ်ကွန်ယက် ဖရိမ်းဝက်များတွင် ပုံများကို ကိုင်တွယ်ရန် ရိုးရှင်းသော ကိရိယာများ ပါဝင်သည်။\n",
"* Tensorflow တွင် `tf.keras.preprocessing.image_dataset_from_directory` ကို အသုံးပြုပါ\n",
"* PyTorch တွင် `torchvision.datasets.ImageFolder` ကို အသုံးပြုပါ\n",
"\n",
"အထက်ပါ ပုံများမှ တွေ့ရသည့်အတိုင်း၊ အားလုံးမှာ စတုရန်းပုံစံ အချိုးနီးပါးရှိသော ပုံများဖြစ်သည်။ ထို့ကြောင့် ပုံအားလုံးကို စတုရန်းအရွယ်အစားသို့ ပြောင်းလဲရန် လိုအပ်ပါသည်။ ထို့အပြင် ပုံများကို minibatch များအဖြစ် စီစဉ်နိုင်ပါသည်။\n"
"အထက်ပါ ပုံများမှ တွေ့မြင်ရသည့်အတိုင်း၊ ၎င်းတို့အားလုံးသည် စတုရန်းပုံစံ အချိုးနှင့် နီးစပ်နေသောကြောင့် ပုံအားလုံးကို စတုရန်းအရွယ်အစားသို့ ပြန်လည်အရွယ်အစားချိန်ညှိရန် လိုအပ်ပါသည်။ ထို့အပြင်၊ ပုံများကို မီနီဘတ်ချ်များအဖြစ် စီစဉ်နိုင်ပါသည်။\n"
]
},
{
@ -144,7 +166,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"အခုတော့ ကျွန်တော်တို့ dataset ကို လေ့ကျင့်မှုနှင့် စမ်းသပ်မှု အပိုင်းများအဖြစ် ခွဲထုတ်ရန် လိုအပ်ပါသည်။\n"
"အခုတော့ ကျွန်တော်တို့ dataset ကို train portion နဲ့ test portion အဖြစ် ခွဲထုတ်ဖို့ လိုအပ်ပါတယ်။\n"
]
},
{
@ -160,12 +182,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"ယခု ကျွန်ုပ်တို့၏ dataset ထဲရှိ tensors များ၏ အရွယ်အစားကို ပုံနှိပ်ကြည့်ပါမည်။ သင်မှန်ကန်စွာလုပ်ဆောင်ထားပါက၊ training elements များ၏ အရွယ်အစားသည် အောက်ပါအတိုင်းဖြစ်ရမည် -\n",
"\n",
" * Tensorflow အတွက် `(batch_size,image_size,image_size,3)`၊ PyTorch အတွက် `batch_size,3,image_size,image_size`\n",
" * Labels အတွက် `batch_size`\n",
"\n",
"Labels တွင် အတန်းအစားများ၏ နံပါတ်များ ပါဝင်ရမည်။\n"
"အခုတော့ ကျွန်တော်တို့ရဲ့ dataset ထဲမှာရှိတဲ့ tensors တွေရဲ့ အရွယ်အစားကို print လုပ်ကြမယ်။ သင်အရာအားလုံးကို မှန်ကန်စွာလုပ်ပြီးသားဆိုရင်တော့ training elements ရဲ့ အရွယ်အစားက \n",
" * Tensorflow အတွက် `(batch_size,image_size,image_size,3)` ဖြစ်ရမယ်၊ PyTorch အတွက် `batch_size,3,image_size,image_size` ဖြစ်ရမယ်\n",
" * Labels အတွက် `batch_size` ဖြစ်ရမယ်\n",
" \n",
" Labels တွေမှာ class အရေအတွက်တွေ ပါဝင်ရမယ်။\n"
]
},
{
@ -227,16 +248,16 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## နယူးရယ်နက်ဝါ့ခ်ကို သတ်မှတ်ပါ\n",
"## နယူးရယ်နက်ဝက်ကို သတ်မှတ်ခြင်း\n",
"\n",
"ပုံရိပ်ခွဲခြားမှုအတွက် သင်သည် အလွှာအများအပြားပါဝင်သော convolutional neural network ကို သတ်မှတ်သင့်ပါသည်။ အောက်ပါအချက်များကို သတိထားပါ:\n",
"* ပီရမစ်အဆောက်အအုံကို သတိထားပါ၊ ဥပမာ အလွှာနက်စေသလို filter အရေအတွက်ကို တိုးပွားသင့်သည်။\n",
"ပုံရိပ်များကို အမျိုးအစားခွဲခြားရန်အတွက် အလွှာများစွာပါဝင်သော convolutional neural network ကို သတ်မှတ်သင့်ပါတယ်။ အောက်ပါအချက်များကို သတိထားပါ:\n",
"* ပီရမစ်အဆောက်အအုံကို သတိထားပါ၊ ဥပမာ - အလွှာများပိုနက်လာသည့်အခါ filter အရေအတွက်များလာသင့်ပါတယ်။\n",
"* အလွှာများအကြား activation functions (ReLU) နှင့် Max Pooling ကို မမေ့ပါနှင့်။\n",
"* နောက်ဆုံး classifier သည် hidden layers ပါစေမပါစေ ရနိုင်ပါသည်၊ သို့သော် output neurons အရေအတွက်သည် အတန်းအရေအတွက်နှင့် တူညီရမည်။\n",
"* နောက်ဆုံး classifier သည် hidden layers ပါရှိနိုင်သော်လည်း မပါရှိနိုင်ပါ၊ သို့သော် output neurons အရေအတွက်သည် အမျိုးအစားအရေအတွက်နှင့် တူညီရမည်။\n",
"\n",
"အရေးကြီးသောအချက်တစ်ခုမှာ နောက်ဆုံးအလွှာ၏ activation function နှင့် loss function ကို မှန်ကန်စွာ ရယူရမည်ဖြစ်သည်:\n",
"* Tensorflow တွင် `softmax` ကို activation အဖြစ် အသုံးပြုနိုင်ပြီး၊ `sparse_categorical_crossentropy` ကို loss အဖြစ် အသုံးပြုနိုင်သည်။ sparse categorical cross-entropy နှင့် non-sparse တို့အကြား ကွာခြားချက်မှာ ရှေ့တစ်ခုသည် output ကို အတန်းနံပါတ်အဖြစ် မျှော်လင့်ပြီး၊ one-hot vector အဖြစ် မဟုတ်ပါ။\n",
"* PyTorch တွင် နောက်ဆုံးအလွှာကို activation function မပါဘဲထားနိုင်ပြီး၊ `CrossEntropyLoss` loss function ကို အသုံးပြုနိုင်သည်။ ဤ function သည် softmax ကို အလိုအလျောက် လုပ်ဆောင်ပေးသည်။\n"
"အရေးကြီးသောအချက်မှာ နောက်ဆုံးအလွှာ၏ activation function နှင့် loss function ကို မှန်ကန်စွာ ရယူရမည်ဖြစ်သည်:\n",
"* Tensorflow တွင် `softmax` ကို activation အဖြစ် အသုံးပြုနိုင်ပြီး၊ `sparse_categorical_crossentropy` ကို loss အဖြစ် အသုံးပြုနိုင်သည်။ sparse categorical cross-entropy နှင့် non-sparse တို့၏ ကွာခြားချက်မှာ ရလဒ် output ကို အမျိုးအစားနံပါတ်အဖြစ် မျှော်လင့်ပြီး၊ one-hot vector အဖြစ် မဟုတ်ပါ။\n",
"* PyTorch တွင် နောက်ဆုံးအလွှာကို activation function မပါရှိဘဲထားနိုင်ပြီး၊ `CrossEntropyLoss` loss function ကို အသုံးပြုနိုင်သည်။ ဒီ function က softmax ကို အလိုအလျောက် အသုံးပြုပါတယ်။\n"
]
},
{
@ -252,11 +273,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## နာရူရယ်ကွန်ယက်ကို လေ့ကျင့်ပါ\n",
"## နာရောလ်နက်ဝက်ကို လေ့ကျင့်ပါ\n",
"\n",
"အခုတော့ နာရူရယ်ကွန်ယက်ကို လေ့ကျင့်ဖို့ အဆင်သင့်ဖြစ်ပါပြီ။ လေ့ကျင့်စဉ်အတွင်း၊ အပတ်စဉ်တစ်ခုစီမှာ လေ့ကျင့်မှုဒေတာနဲ့ စမ်းသပ်မှုဒေတာပေါ်မှာ တိကျမှုကို စုဆောင်းပြီး၊ အဲဒီတိကျမှုကို ရှု့မြင်ကွက်အဖြစ် ရေးဆွဲပါ။ အဲဒီအချိန်မှာ overfitting ဖြစ်မဖြစ်ကို စစ်ဆေးနိုင်ပါမယ်။\n",
"အခုတော့ နာရောလ်နက်ဝက်ကို လေ့ကျင့်ဖို့ အဆင်သင့်ဖြစ်ပါပြီ။ လေ့ကျင့်စဉ်အတွင်းမှာ၊ အပတ်စဉ်တစ်ခုစီအတွက် လေ့ကျင့်မှုဒေတာနဲ့ စမ်းသပ်မှုဒေတာပေါ်မှာ တိကျမှုကို စုဆောင်းပြီး၊ အဲဒီတိကျမှုကို ရှုကြည့်ပြီး overfitting ဖြစ်မဖြစ်ကို စစ်ဆေးပါ။\n",
"\n",
"> လေ့ကျင့်မှုကို မြန်ဆန်စေဖို့ GPU ကို အသုံးပြုဖို့ လိုအပ်ပါတယ်။ TensorFlow/Keras မှာ GPU ကို အလိုအလျောက် အသုံးပြုနိုင်ပေမယ့်၊ PyTorch မှာတော့ GPU acceleration ကို အကျိုးရှိစွာ အသုံးပြုနိုင်ဖို့ `.to()` နည်းလမ်းကို သုံးပြီး မော်ဒယ်နဲ့ ဒေတာနှစ်ခုလုံးကို GPU သို့ ရွှေ့ရပါမယ်။\n"
"> လေ့ကျင့်မှုကို မြန်ဆန်စေဖို့ GPU ကို အသုံးပြုရပါမယ်။ TensorFlow/Keras မှာ GPU ကို အလိုအလျောက် အသုံးပြုနိုင်ပေမယ့်၊ PyTorch မှာတော့ GPU acceleration ကို အကျိုးရှိစွာ အသုံးချနိုင်ဖို့ `.to()` method ကို အသုံးပြုပြီး မော်ဒယ်နဲ့ ဒေတာနှစ်ခုလုံးကို GPU သို့ ရွှေ့ရပါမယ်။\n"
]
},
{
@ -298,16 +319,16 @@
"\n",
"## Optional: Top3 Accuracy ကိုတွက်ချက်ပါ\n",
"\n",
"ဒီလေ့ကျင့်မှုမှာ ကျွန်တော်တို့ဟာ အတန်းအများအပြား (၃၅) ပါဝင်တဲ့ classification ကို ကိုင်တွယ်နေရပါတယ် ဒါကြောင့် validation accuracy ၅၀% ဝန်းကျင်ရရှိတာဟာ အတော်လေးကောင်းပါတယ်။ ImageNet dataset မှာတော့ အတန်းပေါင်း ၁၀၀၀ ရှိပါတယ်။\n",
"ဒီလေ့ကျင့်ခန်းမှာ ကျွန်တော်တို့ဟာ အတန်းအများအပြား (၃၅) ပါဝင်တဲ့ classification ကို ကိုင်တွယ်နေရပါတယ် ဒါကြောင့် validation accuracy ၅၀% ဝန်းကျင်ရရှိတာဟာ အတော်လေးကောင်းပါတယ်။ ImageNet dataset မှာတော့ အတန်းပေါင်း ၁၀၀၀ ရှိပါတယ်။\n",
"\n",
"ဒီလိုအခြေအနေတွေမှာ မော်ဒယ်ဟာ **အမြဲတမ်း** အတိအကျ အတန်းကိုခန့်မှန်းနိုင်မယ်လို့ အာမခံဖို့ ခက်ခဲပါတယ်။ အချို့အခြေအနေတွေမှာ အမျိုးအစားနှစ်မျိုးဟာ အတော်လေးတူတူနီးနီးဖြစ်ပြီး မော်ဒယ်က အတော်လေးတူတဲ့ probability (ဥပမာ 0.45 နဲ့ 0.43) ကို ပြန်ပေးနိုင်ပါတယ်။ Standard accuracy ကိုတိုင်းတာမယ်ဆိုရင်၊ ဒီအခြေအနေကို မှားယွင်းမှုအဖြစ် သတ်မှတ်မယ်၊ မော်ဒယ်က အလွန်သေးငယ်တဲ့အမှားတစ်ခုသာလုပ်ခဲ့တာဖြစ်ပေမယ့်။ ဒီအကြောင်းကြောင့်၊ ကျွန်တော်တို့ဟာ အခြား metric တစ်ခုကို တိုင်းတာလေ့ရှိပါတယ် - မော်ဒယ်ရဲ့ အများဆုံးအနီးဆုံး ခန့်မှန်းချက် ၃ ခုအတွင်းမှာ တိကျမှုကို တိုင်းတာခြင်း။\n",
"ဒီလိုအခြေအနေတွေမှာ မော်ဒယ်က အတန်းကို **အမြဲတမ်း** မှန်ကန်စွာခန့်မှန်းနိုင်မယ်လို့ အာမခံဖို့ ခက်ခဲပါတယ်။ အချို့အခြေအနေတွေမှာ အမျိုးအစားနှစ်မျိုးဟာ အတော်လေးတူတူနီးနီးဖြစ်ပြီး မော်ဒယ်က အတော်လေးတူတဲ့ probability တွေ (ဥပမာ 0.45 နဲ့ 0.43) ပြန်ပေးနိုင်ပါတယ်။ Standard accuracy ကိုတိုင်းတာမယ်ဆိုရင် ဒီအခြေအနေဟာ မှားယွင်းမှုအဖြစ် သတ်မှတ်မယ်၊ မော်ဒယ်က အလွန်သေးငယ်တဲ့အမှားတစ်ခုသာလုပ်ခဲ့တာဖြစ်ပေမယ့်။ ဒီအတွက် ကျွန်တော်တို့ဟာ တစ်ခါတစ်ရံ accuracy metric တစ်ခုကို တိုင်းတာတတ်ပါတယ် - မော်ဒယ်ရဲ့ အများဆုံးအနီးဆုံး ခန့်မှန်းချက် ၃ ခုအတွင်းမှာ target label ပါဝင်မှုကို။\n",
"\n",
"Target label ဟာ မော်ဒယ်ရဲ့ ခန့်မှန်းချက် ၃ ခုအတွင်း ပါဝင်နေတဲ့အခါမှာ အတိအကျဖြစ်တယ်လို့ သတ်မှတ်ပါတယ်။\n",
"Target label ဟာ မော်ဒယ်ရဲ့ ခန့်မှန်းချက် ၃ ခုအတွင်းပါဝင်နေတဲ့အခါမှာ အတိအကျမှုရှိတယ်လို့ သတ်မှတ်ပါတယ်။\n",
"\n",
"Test dataset ပေါ်မှာ top-3 accuracy ကိုတွက်ချက်ဖို့အတွက် dataset ကို လက်ဖြင့်သွားကြည့်ပြီး neural network ကို အသုံးပြုပြီး ခန့်မှန်းချက်ကိုရယူပြီး calculation တွေကိုလုပ်ရပါမယ်။ အချို့အကြံပြုချက်တွေ:\n",
"Test dataset ပေါ်မှာ top-3 accuracy ကိုတွက်ချက်ဖို့အတွက် dataset ကို လက်ဖြင့်သွားကြည့်ပြီး neural network ကို အသုံးပြုကာ ခန့်မှန်းချက်ကိုရယူပြီး calculation တွေကိုလုပ်ရပါမယ်။ အချို့အကြံပြုချက်တွေ:\n",
"\n",
"* Tensorflow မှာ `tf.nn.in_top_k` function ကို အသုံးပြုပြီး `predictions` (မော်ဒယ်ရဲ့ output) ဟာ top-k (parameter အနေနဲ့ `k=3` ကိုပေးပါ) ထဲမှာပါဝင်လားဆိုတာကြည့်ပါ။ ဒီ function က boolean values ရဲ့ tensor ကိုပြန်ပေးပါမယ်၊ `tf.cast` ကိုအသုံးပြုပြီး `int` အဖြစ်ပြောင်းနိုင်ပြီး `tf.reduce_sum` ကိုအသုံးပြုပြီး စုစုပေါင်းတွက်နိုင်ပါတယ်။\n",
"* PyTorch မှာ `torch.topk` function ကို အသုံးပြုပြီး probability အမြင့်ဆုံး classes ရဲ့ indices ကိုရယူနိုင်ပြီး၊ အတိအကျ class ဟာ အဲဒီထဲမှာပါဝင်လားဆိုတာကြည့်နိုင်ပါတယ်။ [ဒီမှာ](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) အကြံပြုချက်တွေကို ကြည့်ပါ။\n"
"* Tensorflow မှာ `tf.nn.in_top_k` function ကို အသုံးပြုကာ `predictions` (မော်ဒယ်ရဲ့ output) ဟာ top-k (parameter အနေနဲ့ `k=3` ကိုပေးပါ) အတွင်းပါဝင်မလားဆိုတာကြည့်ပါ။ ဒီ function က boolean values ရဲ့ tensor ကိုပြန်ပေးပါမယ်၊ `tf.cast` ကိုအသုံးပြုပြီး `int` အဖြစ်ပြောင်းနိုင်ပြီး `tf.reduce_sum` ကိုအသုံးပြုပြီး စုစုပေါင်းတွက်နိုင်ပါတယ်။\n",
"* PyTorch မှာ `torch.topk` function ကိုအသုံးပြုပြီး အမြင့်ဆုံး probability ရှိတဲ့ class တွေရဲ့ indices ကိုရယူနိုင်ပြီး၊ အမှန်တကယ် class ဟာ အဲဒီအတွင်းပါဝင်မလားဆိုတာကြည့်နိုင်ပါတယ်။ [ဒီမှာ](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) အကြံပြုချက်တွေကိုကြည့်ပါ။\n"
]
},
{
@ -323,9 +344,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## အပေါ်ဆိုင်ရာ - ကြောင်များနှင့် ခွေးများ ခွဲခြားမှု တည်ဆောက်ခြင်း\n",
"## အလိုအလျောက်: ကြောင်များနှင့် ခွေးများ ခွဲခြားမှု တည်ဆောက်ခြင်း\n",
"\n",
"ကြောင်များနှင့် ခွေးများ ခွဲခြားမှုအတွက် အတိအကျဖြစ်နိုင်မှုကို အတူတူသော ဒေတာစနစ်ပေါ်တွင် စမ်းသပ်လိုပါသည်။ ဒါကိုလုပ်ရန်၊ label များကို ပြင်ဆင်ရန်လိုအပ်ပါသည်။\n"
"ကြောင်များနှင့် ခွေးများကို binary classification ဖြင့် ခွဲခြားမှု၏ တိကျမှုကို အတူတူသော dataset ပေါ်တွင် စမ်းသပ်လိုပါသည်။ ဒါကိုလုပ်ရန်၊ label များကို ပြင်ဆင်ရန် လိုအပ်ပါသည်:\n"
]
},
{
@ -351,7 +372,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**က်ဘ်ဆိုက်မှတ်ချက်**: \nဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေပါသော်လည်း အလိုအလျောက်ဘာသာပြန်ဆိုမှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူလဘာသာစကားဖြင့် အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသောအချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ အတည်ပြုထားသော ဘာသာပြန်ဆိုမှုကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်ဆိုမှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပယ်မှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။\n"
"\n---\n\n**န်ခံချက်**: \nဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးစားနေသော်လည်း အလိုအလျောက်ဘာသာပြန်ခြင်းတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို သတိပြုပါ။ မူလဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတည်သောရင်းမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ ဘာသာပြန်ခြင်းကို အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုမှားများ သို့မဟုတ် အဓိပ္ပယ်မှားများအတွက် ကျွန်ုပ်တို့ တာဝန်မယူပါ။\n"
]
}
],
@ -377,8 +398,8 @@
"version": "3.9.5"
},
"coopTranslator": {
"original_hash": "1de3ae931831253c3198d899da48bfe5",
"translation_date": "2025-08-30T09:06:00+00:00",
"original_hash": "df7d1f7da8d2617b76acd93115776ca4",
"translation_date": "2025-10-03T14:49:59+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb",
"language_code": "my"
}

View File

@ -1,29 +1,29 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "f3d2cee9cb3c52160419e560c57a690e",
"translation_date": "2025-08-25T22:59:13+00:00",
"original_hash": "b70fcf7fcee862990f848c679090943f",
"translation_date": "2025-10-03T14:58:29+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/README.md",
"language_code": "my"
}
-->
# အိမ်မွေးတိရစ္ဆာန် မျက်နှာများ အမျိုးအစားခွဲခြင်း
# အိမ်မွေးတိရစ္ဆာန်မျက်နှာများ အမျိုးအစားခွဲခြားခြင်း
[AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners) မှ လက်တွေ့လေ့ကျင့်ခန်း
[AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners) မှ Lab Assignment
## တာဝန်
သင်သည် အိမ်မွေးတိရစ္ဆာန် စောင့်ရှောက်ရေးအတွက် အိမ်မွေးတိရစ္ဆာန်များကို စာရင်းသွင်းရန် အက်ပ်တစ်ခု ဖန်တီးရန် လိုအပ်သည်ဟု စိတ်ကူးပါစေ။ ထိုအက်ပ်၏ အထူးအင်္ဂါရပ်တစ်ခုမှာ ဓာတ်ပုံမှ အမျိုးအစားကို အလိုအလျောက် ရှာဖွေနိုင်ခြင်းဖြစ်မည်။ ၎င်းကို နယူးရယ်နက်ဝက်များ (neural networks) အသုံးပြု၍ အောင်မြင်စွာ ပြုလုပ်နိုင်ပါသည်။
သင်သည် အိမ်မွေးတိရစ္ဆာန်များကို စုစည်းရန်အတွက် application တစ်ခု ဖန်တီးရန်လိုအပ်သည်ဟု စဉ်းစားပါ။ ထို application ၏ အထူးအင်္ဂါရပ်တစ်ခုမှာ ဓာတ်ပုံမှ အမျိုးအစားကို အလိုအလျောက် ရှာဖွေခြင်းဖြစ်နိုင်ပါသည်။ ဤအရာကို နယူးရယ်နက်ဝက်များကို အသုံးပြု၍ အောင်မြင်စွာ ပြုလုပ်နိုင်ပါသည်။
သင်သည် **Pet Faces** ဒေတာစနစ်ကို အသုံးပြု၍ ကြောင်နှင့် ခွေး အမျိုးအစားများကို ခွဲခြားနိုင်ရန် convolutional neural network တစ်ခုကို လေ့ကျင့်ရည်။
သင်သည် **Pet Faces** dataset ကို အသုံးပြု၍ ကြောင်များနှင့် ခွေးများ၏ အမျိုးအစားများကို ခွဲခြားရန် convolutional neural network တစ်ခုကို လေ့ကျင့်ရန်လိုအပ်ပါသည်။
## ဒေတာစနစ်
## Dataset
ကျွန်ုပ်တို့သည် [Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/) အိမ်မွေးတိရစ္ဆာန် ဒေတာစနစ်မှ ဆင်းသက်လာသော **Pet Faces** ဒေတာစနစ်ကို အသုံးပြုမည်။ ၎င်းတွင် ခွေးနှင့် ကြောင် အမျိုးအစား ၃၅ မျိုး ပါဝင်သည်။
ကျွန်ုပ်တို့သည် [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/) ကို အသုံးပြုမည်ဖြစ်ပြီး၊ ၎င်းတွင် ခွေးနှင့် ကြောင်အမျိုးအစား ၃၇ မျိုး၏ ဓာတ်ပုံများ ပါဝင်ပါသည်။
![ကျွန်ုပ်တို့ကိုင်တွယ်မည့် ဒေတာ](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.my.png)
![ကျွန်ုပ်တို့ကို ကိုင်တွယ်ရမည့် Dataset](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.my.png)
ဒေတာစနစ်ကို ဒေါင်းလုဒ်လုပ်ရန် အောက်ပါ ကုဒ်ကို အသုံးပြုပါ-
Dataset ကို download လုပ်ရန် အောက်ပါ code snippet ကို အသုံးပြုပါ:
```python
!wget https://thor.robots.ox.ac.uk/~vgg/data/pets/images.tar.gz
@ -31,13 +31,17 @@ CO_OP_TRANSLATOR_METADATA:
!rm images.tar.gz
```
## စတင်ရန် Notebook
**မှတ်ချက်:** Oxford-IIIT Pet Dataset ၏ ဓာတ်ပုံများကို filename (ဥပမာ - `Abyssinian_1.jpg`, `Bengal_2.jpg`) အလိုက် စီစဉ်ထားပါသည်။ Notebook တွင် ဤဓာတ်ပုံများကို classification လုပ်ရန် အလွယ်ကူဆုံးဖြစ်စေရန် အမျိုးအစား-specific subdirectories များသို့ စီစဉ်ရန် code ပါဝင်သည်။
[PetFaces.ipynb](../../../../../../lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb) ကို ဖွင့်၍ လက်တွေ့လေ့ကျင့်ခန်းကို စတင်ပါ။
## Notebook စတင်ခြင်း
## အဓိက အချက်
Lab ကို [PetFaces.ipynb](PetFaces.ipynb) ဖွင့်၍ စတင်ပါ။
သင်သည် ပုံမှန်အခြေခံမှ စတင်၍ ပုံရိပ်ခွဲခြားမှု၏ အတော်လေး ရှုပ်ထွေးသော ပြဿနာကို ဖြေရှင်းနိုင်ခဲ့ပါပြီ! အတန်းများ အတော်များများ ရှိသော်လည်း သင့်အနေဖြင့် သင့်လျော်သော တိကျမှုကို ရရှိနိုင်ခဲ့ပါသည်။ ထို့အပြင် လူသားများအတွက်ပါ အလွန်တူညီသော အတန်းများကို ခွဲခြားရန် ခက်ခဲနိုင်သောကြောင့် top-k accuracy ကို တိုင်းတာခြင်းသည် အဓိကကျပါသည်။
## အဓိကအချက်
သင်သည် image classification အတွက် အခြေခံမှ စ၍ တော်တော်လေး ရှုပ်ထွေးသော ပြဿနာကို ဖြေရှင်းနိုင်ခဲ့ပါသည်! အမျိုးအစားများ အတော်များစွာ ရှိခဲ့ပြီး၊ သင်သည် သင့်လျော်သော တိကျမှုကို ရရှိနိုင်ခဲ့ပါသည်! ထို့အပြင် top-k accuracy ကို တိုင်းတာခြင်းသည်လည်း make sense ဖြစ်ပါသည်၊ အကြောင်းမှာ လူသားများအတွက်ပင် အလွန်တူညီသော အမျိုးအစားများကို ရှုပ်ထွေးနိုင်သောကြောင့် ဖြစ်ပါသည်။
---
**အကြောင်းကြားချက်**:
ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက် ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူရင်းဘာသာစကားဖြင့် အာဏာတရားရှိသော အရင်းအမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ ပရော်ဖက်ရှင်နယ် ဘာသာပြန်မှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော အလွဲအမှားများ သို့မဟုတ် အနားလွဲမှုများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။
ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှုအတွက် ကြိုးစားနေသော်လည်း အလိုအလျောက် ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို သတိပြုပါ။ မူရင်းဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတရ အရင်းအမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူက ဘာသာပြန်မှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော အလွဲအမှားများ သို့မဟုတ် အနားလွဲမှုများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။

View File

@ -8,9 +8,11 @@
"\n",
"[AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners) बाट ल्याब असाइनमेन्ट।\n",
"\n",
"### डटा प्राप्त गर्दै\n",
"### डटा प्राप्त गर्दै\n",
"\n",
"यस असाइनमेन्टमा, हामी तुलनात्मक रूपमा सरल वर्गीकरण कार्यमा केन्द्रित हुनेछौं - पाल्तु जनावरको अनुहारको वर्गीकरण। यो डाटासेट [Oxford-IIIT Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/) बाट काटिएका अनुहारहरूको समावेश गर्दछ। आउनुहोस्, डाटासेट लोड गरेर र भिजुअलाइज गरेर सुरु गरौं।\n"
"यस असाइनमेन्टमा, हामी तुलनात्मक रूपमा सरल वर्गीकरण कार्यमा ध्यान केन्द्रित गर्नेछौं - पाल्तु जनावरको अनुहारको वर्गीकरण। हामी [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/) प्रयोग गर्नेछौं, जसमा कुकुर र बिरालोका ३७ विभिन्न प्रजातिका छविहरू समावेश छन्। सुरु गरौं डेटा डाउनलोड गरेर र त्यसलाई दृश्यात्मक रूपमा हेरेर।\n",
"\n",
"**नोट:** Oxford-IIIT Pet Dataset मा पाल्तु जनावरको पूर्ण छविहरू समावेश छन्। निकालिएको फोल्डरमा छविहरू प्रजाति अनुसार व्यवस्थित गरिनेछ।\n"
]
},
{
@ -86,6 +88,24 @@
"metadata": {},
"outputs": [],
"source": [
"# Note: The Oxford-IIIT Pet Dataset extracts to a folder named 'images'\n",
"# Images are named by breed (e.g., 'Abyssinian_1.jpg')\n",
"# We need to organize them into breed-specific subdirectories\n",
"import os\n",
"from collections import defaultdict\n",
"\n",
"# Organize images by breed\n",
"if not os.path.exists('petfaces'):\n",
" os.makedirs('petfaces')\n",
" for img_file in os.listdir('images'):\n",
" if img_file.endswith(('.jpg', '.png')):\n",
" # Extract breed name from filename (everything before the last underscore and number)\n",
" breed = '_'.join(img_file.split('_')[:-1])\n",
" breed_dir = os.path.join('petfaces', breed)\n",
" if not os.path.exists(breed_dir):\n",
" os.makedirs(breed_dir)\n",
" os.rename(os.path.join('images', img_file), os.path.join(breed_dir, img_file))\n",
"\n",
"for cls in os.listdir('petfaces'):\n",
" print(cls)\n",
" display_images([Image.open(os.path.join('petfaces',cls,x)) \n",
@ -95,7 +115,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"हामी हाम्रो डेटासेटमा कक्षाहरूको संख्या पनि परिभाषित गरौं:\n"
]
},
{
"cell_type": "code",
@ -122,13 +144,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## डीप लर्निङक लागि डेटासेट तयार गर्दै\n",
"## डीप लर्निङक लागि डेटासेट तयार गर्दै\n",
"\n",
"हाम्रो न्युरल नेटवर्कलाई प्रशिक्षण दिन सुरु गर्न, हामीले सबै छविहरूलाई टेन्सरमा रूपान्तरण गर्नुपर्छ, र लेबलहरू (क्लास नम्बरहरू) सँग सम्बन्धित टेन्सरहरू पनि सिर्जना गर्नुपर्छ। अधिकांश न्युरल नेटवर्क फ्रेमवर्कहरूले छविहरूसँग काम गर्नका लागि सरल उपकरणहरू समावेश गर्छन्:\n",
"हाम्रो न्युरल नेटवर्कलाई प्रशिक्षण दिन सुरु गर्न, हामीले सबै छविहरूलाई टेन्सरमा रूपान्तरण गर्न आवश्यक छ, साथै लेबलहरू (क्लास नम्बरहरू) सँग सम्बन्धित टेन्सरहरू पनि सिर्जना गर्नुपर्छ। अधिकांश न्युरल नेटवर्क फ्रेमवर्कहरूले छविहरूलाई व्यवस्थापन गर्नका लागि सरल उपकरणहरू समावेश गर्छन्:\n",
"* Tensorflow मा, `tf.keras.preprocessing.image_dataset_from_directory` प्रयोग गर्नुहोस्\n",
"* PyTorch मा, `torchvision.datasets.ImageFolder` प्रयोग गर्नुहोस्\n",
"\n",
"जस्तो तपाईंले माथिका चित्रहरूबाट देख्नुभएको छ, ती सबै लगभग वर्गाकार छवि अनुपातमा छन्, त्यसैले हामीले सबै छविहरूलाई वर्गाकार आकारमा पुनःआकार दिनुपर्छ। साथै, हामी छविहरूलाई मिनिब्याचहरूमा व्यवस्थित गर्न सक्छौं।\n"
"जस्तो कि माथिका चित्रहरूबाट देख्न सकिन्छ, तिनीहरू सबै लगभग वर्गाकार छवि अनुपातमा छन्, त्यसैले हामीले सबै छविहरूलाई वर्गाकार आकारमा पुन: आकार दिन आवश्यक छ। साथै, हामी छविहरूलाई मिनिब्याचहरूमा व्यवस्थित गर्न सक्छौं।\n"
]
},
{
@ -144,7 +166,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"अब हामीले डेटासेटलाई प्रशिक्षण र परीक्षण भागमा विभाजन गर्न आवश्यक छ:\n"
"अब हामीले डेटासेटलाई ट्रेन र टेस्ट भागमा विभाजन गर्न आवश्यक छ:\n"
]
},
{
@ -160,8 +182,8 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"अब हाम्रो डेटासेटमा रहेका टेन्सरहरूको आकार प्रिन्ट गरौं। यदि तपाईंले सबै कुरा सही तरिकाले गर्नुभएको छ भने, प्रशिक्षण तत्वहरूको आकार यस्तो हुनुपर्छ:\n",
" * Tensorflow को लागि `(batch_size,image_size,image_size,3)`, PyTorch को लागि `batch_size,3,image_size,image_size`\n",
"अब हाम्रो डेटासेटमा रहेका टेन्सरहरूको आकार प्रिन्ट गरौं। यदि तपाईंले सबै कुरा सही रूपमा गर्नुभएको छ भने, प्रशिक्षण तत्वहरूको आकार यस प्रकारको हुनुपर्छ:\n",
" * Tensorflow को लागि `(batch_size,image_size,image_size,3)` PyTorch को लागि `batch_size,3,image_size,image_size`\n",
" * लेबलहरूको लागि `batch_size`\n",
"\n",
"लेबलहरूले कक्षाहरूको संख्या समावेश गर्नुपर्छ।\n"
@ -228,14 +250,14 @@
"source": [
"## न्यूरल नेटवर्क परिभाषित गर्नुहोस्\n",
"\n",
"तस्वीर वर्गीकरणको लागि, तपाईंले सम्भवतः धेरै तहहरू भएको एक कनभोल्युसनल न्यूरल नेटवर्क परिभाषित गर्नुपर्छ। ध्यान दिनुपर्ने कुराहरू:\n",
"* पिरामिड आर्किटेक्चरलाई ध्यानमा राख्नुहोस्, अर्थात् तहहरू गहिरो हुँदै जाँदा फिल्टरहरूको संख्या बढ्नुपर्छ।\n",
"* तहहरू बीचमा सक्रियता कार्यहरू (ReLU) र अधिकतम पूलिङ (Max Pooling) बिर्सनु हुँदैन।\n",
"* अन्तिम वर्गीकरणकर्ता लुकेका तहहरू सहित वा बिना हुन सक्छ, तर आउटपुट न्यूरोनहरूको संख्या कक्षाहरूको संख्यासँग बराबर हुनुपर्छ।\n",
"तस्बिर वर्गीकरणको लागि, तपाईंले सम्भवतः धेरै तहहरू भएको एक कनभोल्युसनल न्यूरल नेटवर्क परिभाषित गर्नुपर्छ। ध्यान दिनुपर्ने कुराहरू:\n",
"* पिरामिड आर्किटेक्चरलाई ध्यानमा राख्नुहोस्, अर्थात् तहहरू गहिरो जाँदा फिल्टरहरूको संख्या बढ्नुपर्छ।\n",
"* तहहरू बीच सक्रियता कार्यहरू (ReLU) र अधिकतम पूलिङ (Max Pooling) बिर्सनु हुँदैन।\n",
"* अन्तिम वर्गीकरणकर्ता लुकेका तहहरू सहित वा बिना हुन सक्छ, तर आउटपुट न्यूरोनहरूको संख्या वर्गहरूको संख्यासँग बराबर हुनुपर्छ।\n",
"\n",
"एक महत्त्वपूर्ण कुरा भनेको अन्तिम तहमा सक्रियता कार्य + हानिको कार्य (loss function) सही हुनु हो:\n",
"* Tensorflow मा, तपाईंले सक्रियता कार्यको रूपमा `softmax` र हानिको रूपमा `sparse_categorical_crossentropy` प्रयोग गर्न सक्नुहुन्छ। Sparse categorical cross-entropy र non-sparse को बीचको फरक भनेको पहिलोले आउटपुटलाई कक्षाको संख्या (class number) को रूपमा अपेक्षा गर्छ, नकि one-hot भेक्टरको रूपमा।\n",
"* PyTorch मा, तपाईंले अन्तिम तहलाई सक्रियता कार्य बिना राख्न सक्नुहुन्छ, र `CrossEntropyLoss` हानिको कार्य प्रयोग गर्न सक्नुहुन्छ। यो कार्यले स्वचालित रूपमा softmax लागू गर्छ।\n"
"अन्तिम तहमा सक्रियता कार्य + हानिको कार्य सही बनाउनु महत्त्वपूर्ण छ:\n",
"* Tensorflow मा, तपाईं `softmax` लाई सक्रियता कार्यको रूपमा प्रयोग गर्न सक्नुहुन्छ, र `sparse_categorical_crossentropy` लाई हानिको रूपमा। स्पार्स क्याटेगोरिकल क्रस-एन्ट्रोपी र गैर-स्पार्सको बीचको फरक भनेको स्पार्सले आउटपुटलाई वर्गको संख्या (एक-हट भेक्टर होइन) को रूपमा अपेक्षा गर्छ।\n",
"* PyTorch मा, तपाईं अन्तिम तहलाई सक्रियता कार्य बिना राख्न सक्नुहुन्छ, र `CrossEntropyLoss` हानिको कार्य प्रयोग गर्न सक्नुहुन्छ। यो कार्यले स्वचालित रूपमा softmax लागू गर्छ।\n"
]
},
{
@ -253,7 +275,7 @@
"source": [
"## न्युरल नेटवर्कलाई प्रशिक्षण दिनुहोस्\n",
"\n",
"अब हामी न्युरल नेटवर्कलाई प्रशिक्षण दिन तयार छौं। प्रशिक्षणको क्रममा, प्रत्येक इपोकमा ट्रेन र टेस्ट डाटामा एक्युरेसी सङ्कलन गर्नुहोस्, र त्यसपछि एक्युरेसीको ग्राफ बनाउनुहोस् ताकि ओभरफिटिङ छ कि छैन भनेर हेर्न सकियोस्।\n",
"अब हामी न्युरल नेटवर्कलाई प्रशिक्षण दिन तयार छौं। प्रशिक्षणको क्रममा, कृपया प्रत्येक इपोकमा ट्रेन र टेस्ट डाटामा सटीकता संकलन गर्नुहोस्, र त्यसपछि सटीकतामा आधारित ग्राफ बनाउनुहोस् ताकि ओभरफिटिङ भएको छ कि छैन हेर्न सकियोस्।\n",
"\n",
"> प्रशिक्षणलाई छिटो बनाउन, GPU उपलब्ध भएमा प्रयोग गर्नु आवश्यक छ। TensorFlow/Keras ले GPU स्वचालित रूपमा प्रयोग गर्नेछ, तर PyTorch मा GPU को फाइदा लिनको लागि प्रशिक्षणको क्रममा मोडेल र डाटालाई `.to()` मेथड प्रयोग गरेर GPU मा सार्नुपर्छ।\n"
]
@ -297,16 +319,16 @@
"\n",
"## वैकल्पिक: टप-३ शुद्धता गणना गर्नुहोस्\n",
"\n",
"यस अभ्यासमा, हामी धेरै उच्च संख्याका वर्गहरू (३५) सहितको वर्गीकरणसँग काम गरिरहेका थियौं, त्यसैले हाम्रो परिणाम - लगभग ५०% मान्यता शुद्धता - निकै राम्रो हो। मानक ImageNet डेटासेटमा अझ धेरै - १००० वर्गहरू हुन्छन्।\n",
"यस अभ्यासमा, हामी धेरै उच्च संख्याका वर्गहरू (३५) भएको वर्गीकरणसँग काम गरिरहेका थियौं, त्यसैले हाम्रो नतिजा - लगभग ५०% मान्यता शुद्धता - निकै राम्रो हो। मानक ImageNet डेटासेटमा अझ धेरै वर्गहरू छन् - १०००।\n",
"\n",
"यस्ता अवस्थामा मोडेलले **सधैं** सही वर्गको भविष्यवाणी गर्ने सुनिश्चित गर्न गाह्रो हुन्छ। केही अवस्थामा दुई प्रजातिहरू एकअर्कासँग धेरै मिल्दोजुल्दो हुन्छन्, र मोडेलले धेरै मिल्दोजुल्दो सम्भावनाहरू फर्काउँछ (जस्तै, .४५ र .४३)। यदि हामी मानक शुद्धता मापन गर्छौं भने, यसलाई गलत मानिनेछ, यद्यपि मोडेलले धेरै सानो गल्ती गरेको छ। यस कारणले, हामी प्रायः अर्को मेट्रिक मापन गर्छौं - मोडेलको सबैभन्दा सम्भावित तीन भविष्यवाणीहरूभित्रको शुद्धता।\n",
"यस्ता अवस्थामा मोडेलले **सधैं** सही वर्गको भविष्यवाणी गर्ने सुनिश्चित गर्न गाह्रो हुन्छ। केही अवस्थामा दुई प्रजातिहरू एकअर्कासँग धेरै मिल्दोजुल्दो हुन्छन्, र मोडेलले धेरै मिल्दोजुल्दो सम्भावनाहरू फर्काउँछ (जस्तै, .४५ र .४३)। यदि हामी मानक शुद्धता मापन गर्छौं भने, यो गलत मानिन्छ, यद्यपि मोडेलले धेरै सानो गल्ती गरेको छ। यस कारणले गर्दा, हामी प्रायः अर्को मेट्रिक मापन गर्छौं - मोडेलको सबैभन्दा सम्भावित तीन भविष्यवाणीहरू भित्रको शुद्धता।\n",
"\n",
"यदि लक्ष्य लेबल मोडेलको टप-३ भविष्यवाणीहरूभित्र समावेश छ भने हामी उक्त केसलाई सही मान्छौं।\n",
"हामी यो केसलाई सही मान्छौं यदि लक्ष्य लेबल मोडेलको टप-३ भविष्यवाणीहरू भित्र समावेश छ भने।\n",
"\n",
"टेस्ट डेटासेटमा टप-३ शुद्धता गणना गर्न, तपाईंले डेटासेटलाई म्यानुअली हेर्नु पर्नेछ, न्युरल नेटवर्कलाई लागू गरेर भविष्यवाणी प्राप्त गर्नु पर्नेछ, र त्यसपछि गणना गर्नु पर्नेछ। केही सुझावहरू:\n",
"टेस्ट डेटासेटमा टप-३ शुद्धता गणना गर्न, तपाईंले डेटासेटलाई म्यानुअली हेर्नु पर्नेछ, न्युरल नेटवर्क लागू गरेर भविष्यवाणी प्राप्त गर्नु पर्नेछ, र त्यसपछि गणना गर्नु पर्नेछ। केही सुझावहरू:\n",
"\n",
"* Tensorflow मा, `tf.nn.in_top_k` प्रयोग गर्नुहोस् ताकि `predictions` (मोडेलको आउटपुट) टप-k मा छ कि छैन हेर्न सकियोस् (प्यारामिटरको रूपमा `k=3` पास गर्नुहोस्), `targets` को सन्दर्भमा। यो फङ्सनले बूलियन मानहरूको टेन्सर फर्काउँछ, जसलाई `tf.cast` प्रयोग गरेर `int` मा परिवर्तन गर्न सकिन्छ, र त्यसपछि `tf.reduce_sum` प्रयोग गरेर जम्मा गर्न सकिन्छ।\n",
"* PyTorch मा, तपाईं `torch.topk` फङ्सन प्रयोग गर्न सक्नुहुन्छ ताकि उच्च सम्भावनाका वर्गहरूको इन्डेक्स प्राप्त गर्न सकियोस्, र त्यसपछि सही वर्ग तीमध्ये समावेश छ कि छैन हेर्न सकियोस्। थप सुझावहरूको लागि [यो](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) हेर्नुहोस्।\n"
"* Tensorflow मा, `tf.nn.in_top_k` फङ्सन प्रयोग गरेर हेर्न सकिन्छ कि `predictions` (मोडेलको आउटपुट) टप-k भित्र छ कि छैन (प्यारामिटरको रूपमा `k=3` पास गर्नुहोस्), `targets` को सन्दर्भमा। यो फङ्सनले बूलियन मानहरूको टेन्सर फर्काउँछ, जसलाई `tf.cast` प्रयोग गरेर `int` मा परिवर्तन गर्न सकिन्छ, र त्यसपछि `tf.reduce_sum` प्रयोग गरेर जम्मा गर्न सकिन्छ।\n",
"* PyTorch मा, तपाईं `torch.topk` फङ्सन प्रयोग गरेर उच्च सम्भावनाहरू भएका वर्गहरूको इन्डेक्स प्राप्त गर्न सक्नुहुन्छ, र त्यसपछि सही वर्ग तिनीहरूमा समावेश छ कि छैन हेर्न सक्नुहुन्छ। थप सुझावहरूको लागि [यो](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) हेर्नुहोस्।\n"
]
},
{
@ -324,7 +346,7 @@
"source": [
"## वैकल्पिक: बिरालो बनाम कुकुर वर्गीकरण निर्माण गर्नुहोस्\n",
"\n",
"हामी पनि हेर्न चाहन्छौं कि हाम्रो द्विपक्षीय बिरालो बनाम कुकुर वर्गीकरण उही डेटासेटमा कति सही हुनेछ। यसलाई गर्नका लागि, हामीले लेबलहरू समायोजन गर्नुपर्छ:\n"
"हामी हाम्रो द्विपक्षीय बिरालो बनाम कुकुर वर्गीकरणको सटीकता सोही डेटासेटमा कस्तो हुन्छ हेर्न चाहन्छौं। यसलाई गर्नका लागि, हामीले लेबलहरू समायोजन गर्न आवश्यक छ:\n"
]
},
{
@ -350,7 +372,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**अस्वीकरण**: \nयो दस्तावेज़ AI अनुवाद सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) प्रयोग गरेर अनुवाद गरिएको हो। हामी शुद्धताको लागि प्रयास गर्छौं, तर कृपया ध्यान दिनुहोस् कि स्वचालित अनुवादमा त्रुटिहरू वा अशुद्धताहरू हुन सक्छ। यसको मूल भाषा मा रहेको मूल दस्तावेज़लाई आधिकारिक स्रोत मानिनुपर्छ। महत्वपूर्ण जानकारीको लागि, व्यावसायिक मानव अनुवाद सिफारिस गरिन्छ। यस अनुवादको प्रयोगबाट उत्पन्न हुने कुनै पनि गलतफहमी वा गलत व्याख्याको लागि हामी जिम्मेवार हुने छैनौं।\n"
"\n---\n\n**अस्वीकरण**: \nयो दस्तावेज़ AI अनुवाद सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) प्रयोग गरेर अनुवाद गरिएको हो। हामी यथासम्भव शुद्धता सुनिश्चित गर्न प्रयास गर्छौं, तर कृपया ध्यान दिनुहोस् कि स्वचालित अनुवादमा त्रुटिहरू वा अशुद्धताहरू हुन सक्छ। मूल दस्तावेज़ यसको मातृभाषामा आधिकारिक स्रोत मानिनुपर्छ। महत्वपूर्ण जानकारीको लागि, व्यावसायिक मानव अनुवाद सिफारिस गरिन्छ। यस अनुवादको प्रयोगबाट उत्पन्न हुने कुनै पनि गलतफहमी वा गलत व्याख्याको लागि हामी जिम्मेवार हुनेछैनौं।\n"
]
}
],
@ -376,8 +398,8 @@
"version": "3.9.5"
},
"coopTranslator": {
"original_hash": "1de3ae931831253c3198d899da48bfe5",
"translation_date": "2025-08-28T07:47:42+00:00",
"original_hash": "df7d1f7da8d2617b76acd93115776ca4",
"translation_date": "2025-10-03T14:33:33+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb",
"language_code": "ne"
}

View File

@ -1,29 +1,29 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "f3d2cee9cb3c52160419e560c57a690e",
"translation_date": "2025-08-26T09:34:18+00:00",
"original_hash": "b70fcf7fcee862990f848c679090943f",
"translation_date": "2025-10-03T14:53:58+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/README.md",
"language_code": "ne"
}
-->
# पाल्तु जनावरहरूको अनुहारको वर्गीकरण
# पाल्तु जनावरको अनुहारको वर्गीकरण
[AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners) बाट ल्याब असाइनमेन्ट।
## कार्य
कल्पना गर्नुहोस् कि तपाईंले पाल्तु जनावरहरूको नर्सरीको लागि सबै जनावरहरूको सूची बनाउन एउटा एप्लिकेसन विकास गर्नुपर्नेछ। यस्तो एप्लिकेसनको एक उत्कृष्ट विशेषता भनेको फोटोबाट स्वचालित रूपमा प्रजाति पत्ता लगाउने क्षमता हुनेछ। यो कार्य न्यूरल नेटवर्कहरूको प्रयोग गरेर सफलतापूर्वक गर्न सकिन्छ।
कल्पना गर्नुहोस् कि तपाईंले पाल्तु जनावरको नर्सरीको लागि सबै जनावरहरूको सूची तयार गर्न एप्लिकेसन विकास गर्नुपर्नेछ। यस्तो एप्लिकेसनको एक उत्कृष्ट विशेषता फोटोबाट स्वतः प्रजाति पत्ता लगाउने क्षमता हुनेछ। यो कार्य न्यूरल नेटवर्कको प्रयोग गरेर सफलतापूर्वक गर्न सकिन्छ।
तपाईंले **Pet Faces**ाटासेट प्रयोग गरेर बिरालो र कुकुरका विभिन्न प्रजातिहरूलाई वर्गीकरण गर्न एक कनभोल्युसनल न्यूरल नेटवर्क प्रशिक्षण गर्नुपर्नेछ।
तपाईंले **Pet Faces**ेटासेटको प्रयोग गरेर बिरालो र कुकुरका विभिन्न प्रजातिहरूलाई वर्गीकरण गर्न एक convolutional neural network प्रशिक्षण गर्नुपर्नेछ।
## डटासेट
## डटासेट
हामी **Pet Faces** डाटासेट प्रयोग गर्नेछौं, जुन [Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/) पाल्तु जनावरहरूको डाटासेटबाट लिइएको हो। यसमा कुकुर र बिरालोका ३५ विभिन्न प्रजातिहरू समावेश छन्।
हामी [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/) प्रयोग गर्नेछौं, जसमा कुकुर र बिरालोका ३७ विभिन्न प्रजातिहरूका छविहरू समावेश छन्।
![हामीले प्रयोग गर्ने डटासेट](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.ne.png)
![हामीले प्रयोग गर्ने डटासेट](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.ne.png)
टासेट डाउनलोड गर्न, यो कोड स्निपेट प्रयोग गर्नुहोस्:
टासेट डाउनलोड गर्न, यो कोड स्निपेट प्रयोग गर्नुहोस्:
```python
!wget https://thor.robots.ox.ac.uk/~vgg/data/pets/images.tar.gz
@ -31,13 +31,17 @@ CO_OP_TRANSLATOR_METADATA:
!rm images.tar.gz
```
## नोटबुक सुरु गर्नुहोस्
**नोट:** Oxford-IIIT Pet Dataset का छविहरू फाइलनामद्वारा व्यवस्थित छन् (जस्तै, `Abyssinian_1.jpg`, `Bengal_2.jpg`)। नोटबुकमा यी छविहरूलाई प्रजाति-विशिष्ट उपनिर्देशिकामा वर्गीकरण गर्न कोड समावेश छ, जसले वर्गीकरणलाई सजिलो बनाउँछ।
[PetFaces.ipynb](../../../../../../lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb) खोल्दै ल्याब सुरु गर्नुहोस्।
## प्रारम्भिक नोटबुक
## मुख्य सिकाइ
ल्याब सुरु गर्न [PetFaces.ipynb](PetFaces.ipynb) खोल्नुहोस्।
तपाईंले सुरुबाट नै छविको वर्गीकरणको जटिल समस्या समाधान गर्नुभयो! धेरै वर्गहरू थिए, तर तपाईंले अझै पनि राम्रो सटीकता प्राप्त गर्न सक्नुभयो! साथै, शीर्ष-k सटीकता मापन गर्नु पनि महत्त्वपूर्ण छ, किनभने केही वर्गहरूलाई छुट्याउन मानिसहरूलाई पनि गाह्रो हुन सक्छ।
## मुख्य कुरा
तपाईंले स्क्र्याचबाट छवि वर्गीकरणको एकदम जटिल समस्या समाधान गर्नुभएको छ! धेरै वर्गहरू थिए, तर तपाईंले अझै पनि उचित शुद्धता प्राप्त गर्न सक्नुभयो! साथै, top-k accuracy मापन गर्नु पनि उपयुक्त हुन्छ, किनकि केही वर्गहरूलाई छुट्याउन मानिसहरूलाई पनि गाह्रो हुन सक्छ।
---
**अस्वीकरण**:
यो दस्तावेज़ AI अनुवाद सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) प्रयोग गरी अनुवाद गरिएको हो। हामी यथासम्भव सटीकता सुनिश्चित गर्न प्रयास गर्छौं, तर कृपया ध्यान दिनुहोस् कि स्वचालित अनुवादहरूमा त्रुटि वा अशुद्धता हुन सक्छ। यसको मूल भाषामा रहेको मूल दस्तावेजलाई आधिकारिक स्रोत मानिनुपर्छ। महत्वपूर्ण जानकारीका लागि, व्यावसायिक मानव अनुवाद सिफारिस गरिन्छ। यस अनुवादको प्रयोगबाट उत्पन्न हुने कुनै पनि गलतफहमी वा गलत व्याख्याको लागि हामी जिम्मेवार हुने छैनौं।
यो दस्तावेज़ AI अनुवाद सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) प्रयोग गरेर अनुवाद गरिएको छ। हामी यथार्थताको लागि प्रयास गर्छौं, तर कृपया ध्यान दिनुहोस् कि स्वचालित अनुवादहरूमा त्रुटिहरू वा अशुद्धताहरू हुन सक्छ। यसको मूल भाषा मा रहेको मूल दस्तावेजलाई आधिकारिक स्रोत मानिनुपर्छ। महत्वपूर्ण जानकारीक लागि, व्यावसायिक मानव अनुवाद सिफारिस गरिन्छ। यस अनुवादको प्रयोगबाट उत्पन्न हुने कुनै पनि गलतफहमी वा गलत व्याख्याको लागि हामी जिम्मेवार हुने छैनौं।

View File

@ -10,7 +10,9 @@
"\n",
"### Het verkrijgen van de data\n",
"\n",
"In deze opdracht richten we ons op een relatief eenvoudige classificatietaak - classificatie van gezichten van huisdieren. Deze dataset bestaat uit uitgeknipte gezichten uit de [Oxford-IIIT Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/). Laten we beginnen met het laden en visualiseren van de dataset.\n"
"In deze opdracht richten we ons op een relatief eenvoudige classificatietaak: de classificatie van gezichten van huisdieren. We maken gebruik van de [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), die afbeeldingen bevat van 37 verschillende rassen van honden en katten. Laten we beginnen met het downloaden en visualiseren van de dataset.\n",
"\n",
"**Opmerking:** De Oxford-IIIT Pet Dataset bevat volledige afbeeldingen van huisdieren. De afbeeldingen worden in de uitgepakte map georganiseerd per ras.\n"
]
},
{
@ -86,6 +88,24 @@
"metadata": {},
"outputs": [],
"source": [
"# Note: The Oxford-IIIT Pet Dataset extracts to a folder named 'images'\n",
"# Images are named by breed (e.g., 'Abyssinian_1.jpg')\n",
"# We need to organize them into breed-specific subdirectories\n",
"import os\n",
"from collections import defaultdict\n",
"\n",
"# Organize images by breed\n",
"if not os.path.exists('petfaces'):\n",
" os.makedirs('petfaces')\n",
" for img_file in os.listdir('images'):\n",
" if img_file.endswith(('.jpg', '.png')):\n",
" # Extract breed name from filename (everything before the last underscore and number)\n",
" breed = '_'.join(img_file.split('_')[:-1])\n",
" breed_dir = os.path.join('petfaces', breed)\n",
" if not os.path.exists(breed_dir):\n",
" os.makedirs(breed_dir)\n",
" os.rename(os.path.join('images', img_file), os.path.join(breed_dir, img_file))\n",
"\n",
"for cls in os.listdir('petfaces'):\n",
" print(cls)\n",
" display_images([Image.open(os.path.join('petfaces',cls,x)) \n",
@ -127,10 +147,10 @@
"## Dataset voorbereiden voor Deep Learning\n",
"\n",
"Om te beginnen met het trainen van ons neuraal netwerk, moeten we alle afbeeldingen omzetten naar tensors en ook tensors maken die overeenkomen met labels (klassenummers). De meeste frameworks voor neurale netwerken bevatten eenvoudige tools om met afbeeldingen te werken:\n",
"* In Tensorflow kun je `tf.keras.preprocessing.image_dataset_from_directory` gebruiken\n",
"* In PyTorch kun je `torchvision.datasets.ImageFolder` gebruiken\n",
"* In Tensorflow, gebruik `tf.keras.preprocessing.image_dataset_from_directory`\n",
"* In PyTorch, gebruik `torchvision.datasets.ImageFolder`\n",
"\n",
"Zoals je hebt gezien in de bovenstaande afbeeldingen, hebben ze allemaal een beeldverhouding die dicht bij vierkant ligt. Daarom moeten we alle afbeeldingen aanpassen naar een vierkante grootte. Daarnaast kunnen we de afbeeldingen organiseren in minibatches.\n"
"Zoals je hebt gezien in de bovenstaande afbeeldingen, hebben ze allemaal een beeldverhouding die dicht bij vierkant ligt, dus we moeten alle afbeeldingen naar een vierkante grootte aanpassen. Daarnaast kunnen we de afbeeldingen organiseren in minibatches.\n"
]
},
{
@ -146,7 +166,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Nu moeten we de dataset scheiden in train- en testgedeeltes:\n"
"Nu moeten we de dataset opdelen in train- en testgedeeltes:\n"
]
},
{
@ -232,11 +252,11 @@
"\n",
"Voor beeldclassificatie kun je het beste een convolutioneel neuraal netwerk met meerdere lagen definiëren. Waar je op moet letten:\n",
"* Houd rekening met de piramide-architectuur, d.w.z. het aantal filters moet toenemen naarmate je dieper gaat.\n",
"* Vergeet niet de activatiefuncties tussen de lagen (ReLU) en Max Pooling.\n",
"* Vergeet niet om activatiefuncties tussen de lagen toe te voegen (ReLU) en Max Pooling.\n",
"* De uiteindelijke classifier kan met of zonder verborgen lagen zijn, maar het aantal outputneuronen moet gelijk zijn aan het aantal klassen.\n",
"\n",
"Een belangrijk punt is om de activatiefunctie in de laatste laag + verliesfunctie correct te krijgen:\n",
"* In Tensorflow kun je `softmax` gebruiken als activatie en `sparse_categorical_crossentropy` als verliesfunctie. Het verschil tussen sparse categorische cross-entropy en de niet-sparse variant is dat de eerste de output verwacht als het nummer van de klasse, en niet als een one-hot vector.\n",
"Een belangrijk punt is om de activatiefunctie in de laatste laag + verliesfunctie correct te kiezen:\n",
"* In Tensorflow kun je `softmax` gebruiken als activatie en `sparse_categorical_crossentropy` als verliesfunctie. Het verschil tussen sparse categorical cross-entropy en de niet-sparse variant is dat de eerste de output verwacht als het nummer van de klasse, en niet als een one-hot vector.\n",
"* In PyTorch kun je de laatste laag zonder activatiefunctie hebben en de verliesfunctie `CrossEntropyLoss` gebruiken. Deze functie past automatisch softmax toe.\n"
]
},
@ -253,11 +273,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## Het Neuraal Netwerk Trainen\n",
"## Train het Neuraal Netwerk\n",
"\n",
"Nu zijn we klaar om het neuraal netwerk te trainen. Verzamel tijdens de training de nauwkeurigheid op zowel de trainings- als testgegevens bij elke epoch, en plot vervolgens de nauwkeurigheid om te zien of er sprake is van overfitting.\n",
"Nu zijn we klaar om het neuraal netwerk te trainen. Tijdens de training, verzamel de nauwkeurigheid op zowel de trainings- als testdata bij elke epoch, en maak vervolgens een grafiek van de nauwkeurigheid om te zien of er sprake is van overfitting.\n",
"\n",
"> Om de training te versnellen, moet je een GPU gebruiken als die beschikbaar is. Terwijl TensorFlow/Keras automatisch de GPU zal gebruiken, moet je in PyTorch zowel het model als de data naar de GPU verplaatsen tijdens de training met behulp van de `.to()`-methode om te profiteren van GPU-versnelling.\n"
"> Om de training te versnellen, moet je een GPU gebruiken als deze beschikbaar is. Terwijl TensorFlow/Keras automatisch de GPU zal gebruiken, moet je in PyTorch zowel het model als de data naar de GPU verplaatsen tijdens de training met behulp van de `.to()`-methode om te profiteren van GPU-versnelling.\n"
]
},
{
@ -299,16 +319,16 @@
"\n",
"## Optioneel: Bereken Top-3 Nauwkeurigheid\n",
"\n",
"In deze oefening werkten we met classificatie waarbij het aantal klassen vrij hoog was (35), dus ons resultaat - ongeveer 50% validatienauwkeurigheid - is behoorlijk goed. De standaard ImageNet-dataset heeft zelfs nog meer - 1000 klassen.\n",
"In deze oefening hebben we gewerkt met classificatie waarbij er een behoorlijk groot aantal klassen is (35), dus ons resultaat - ongeveer 50% validatienauwkeurigheid - is best goed. De standaard ImageNet dataset heeft zelfs nog meer - 1000 klassen.\n",
"\n",
"In zulke gevallen is het moeilijk om ervoor te zorgen dat het model **altijd** de juiste klasse voorspelt. Er zijn situaties waarin twee rassen erg op elkaar lijken, en het model zeer vergelijkbare waarschijnlijkheden retourneert (bijvoorbeeld 0,45 en 0,43). Als we de standaardnauwkeurigheid meten, wordt dit als een fout beschouwd, ook al heeft het model een zeer kleine fout gemaakt. Daarom meten we vaak een andere metriek - een nauwkeurigheid binnen de top 3 meest waarschijnlijke voorspellingen van het model.\n",
"In zulke gevallen is het moeilijk om ervoor te zorgen dat het model **altijd** de juiste klasse voorspelt. Er zijn situaties waarin twee rassen erg op elkaar lijken en het model zeer vergelijkbare waarschijnlijkheden retourneert (bijvoorbeeld 0.45 en 0.43). Als we de standaard nauwkeurigheid meten, wordt dit als een fout beschouwd, ook al heeft het model slechts een kleine vergissing gemaakt. Daarom meten we vaak een andere metriek - een nauwkeurigheid binnen de top 3 meest waarschijnlijke voorspellingen van het model.\n",
"\n",
"We beschouwen het geval als accuraat als het doel-label zich binnen de top 3 voorspellingen van het model bevindt.\n",
"We beschouwen het geval als nauwkeurig als het doel-label zich bevindt binnen de top 3 voorspellingen van het model.\n",
"\n",
"Om de top-3 nauwkeurigheid op de testdataset te berekenen, moet je handmatig de dataset doorlopen, het neurale netwerk toepassen om de voorspelling te krijgen, en vervolgens de berekeningen uitvoeren. Enkele tips:\n",
"\n",
"* In Tensorflow kun je de functie `tf.nn.in_top_k` gebruiken om te controleren of de `predictions` (output van het model) in de top-k zitten (geef `k=3` als parameter), met betrekking tot de `targets`. Deze functie retourneert een tensor van booleaanse waarden, die kunnen worden omgezet naar `int` met behulp van `tf.cast`, en vervolgens kunnen worden opgeteld met `tf.reduce_sum`.\n",
"* In PyTorch kun je de functie `torch.topk` gebruiken om indices te krijgen van klassen met de hoogste waarschijnlijkheden, en vervolgens controleren of de juiste klasse daartussen zit. Zie [dit](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) voor meer tips.\n"
"* In Tensorflow kun je de functie `tf.nn.in_top_k` gebruiken om te controleren of de `predictions` (output van het model) zich in de top-k bevinden (geef `k=3` als parameter), met betrekking tot de `targets`. Deze functie retourneert een tensor van booleaanse waarden, die kan worden omgezet naar `int` met `tf.cast`, en vervolgens opgeteld met `tf.reduce_sum`.\n",
"* In PyTorch kun je de functie `torch.topk` gebruiken om indices te krijgen van klassen met de hoogste waarschijnlijkheden, en vervolgens controleren of de juiste klasse daartussen zit. Zie [deze](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) voor meer tips.\n"
]
},
{
@ -326,7 +346,7 @@
"source": [
"## Optioneel: Bouw een classificatie voor katten versus honden\n",
"\n",
"We willen ook zien hoe nauwkeurig onze binaire classificatie van katten versus honden zou zijn op dezelfde dataset. Om dit te doen, moeten we de labels aanpassen:\n"
"We willen ook zien hoe nauwkeurig onze binaire classificatie voor katten versus honden zou zijn op dezelfde dataset. Om dit te doen, moeten we de labels aanpassen:\n"
]
},
{
@ -352,7 +372,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Disclaimer**: \nDit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, dient u zich ervan bewust te zijn dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in zijn oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor cruciale informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor eventuele misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.\n"
"\n---\n\n**Disclaimer**: \nDit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, dient u zich ervan bewust te zijn dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in de oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor cruciale informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.\n"
]
}
],
@ -378,8 +398,8 @@
"version": "3.9.5"
},
"coopTranslator": {
"original_hash": "1de3ae931831253c3198d899da48bfe5",
"translation_date": "2025-08-28T20:30:46+00:00",
"original_hash": "df7d1f7da8d2617b76acd93115776ca4",
"translation_date": "2025-10-03T14:40:44+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb",
"language_code": "nl"
}

View File

@ -1,15 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "f3d2cee9cb3c52160419e560c57a690e",
"translation_date": "2025-08-28T19:26:02+00:00",
"original_hash": "b70fcf7fcee862990f848c679090943f",
"translation_date": "2025-10-03T14:55:55+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/README.md",
"language_code": "nl"
}
-->
# Classificatie van Huisdiergezichten
Labopdracht uit de [AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners).
Labopdracht uit [AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners).
## Taak
@ -19,11 +19,11 @@ Je moet een convolutioneel neuraal netwerk trainen om verschillende rassen van k
## De Dataset
We zullen de **Pet Faces** dataset gebruiken, afgeleid van de [Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/) huisdieren-dataset. Deze bevat 35 verschillende rassen van honden en katten.
We gebruiken de [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), die afbeeldingen bevat van 37 verschillende rassen van honden en katten.
![Dataset waarmee we werken](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.nl.png)
Gebruik de volgende codefragment om de dataset te downloaden:
Om de dataset te downloaden, gebruik deze codefragment:
```python
!wget https://thor.robots.ox.ac.uk/~vgg/data/pets/images.tar.gz
@ -31,15 +31,17 @@ Gebruik de volgende codefragment om de dataset te downloaden:
!rm images.tar.gz
```
**Opmerking:** De afbeeldingen in de Oxford-IIIT Pet Dataset zijn georganiseerd op bestandsnaam (bijv. `Abyssinian_1.jpg`, `Bengal_2.jpg`). Het notebook bevat code om deze afbeeldingen te organiseren in ras-specifieke submappen voor eenvoudigere classificatie.
## Start Notebook
Begin het lab door [PetFaces.ipynb](PetFaces.ipynb) te openen.
Begin de labopdracht door [PetFaces.ipynb](PetFaces.ipynb) te openen.
## Belangrijkste Leerpunten
Je hebt een relatief complex probleem van beeldclassificatie vanaf nul opgelost! Er waren behoorlijk veel klassen, en je hebt toch een redelijke nauwkeurigheid weten te behalen! Het is ook logisch om de top-k nauwkeurigheid te meten, omdat het gemakkelijk is om sommige klassen te verwarren die zelfs voor mensen niet duidelijk verschillend zijn.
Je hebt een relatief complex probleem van beeldclassificatie vanaf nul opgelost! Er waren behoorlijk veel klassen, en je hebt toch een redelijke nauwkeurigheid weten te behalen! Het is ook zinvol om de top-k nauwkeurigheid te meten, omdat het gemakkelijk is om sommige klassen te verwarren die zelfs voor mensen niet duidelijk verschillend zijn.
---
**Disclaimer**:
Dit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we ons best doen voor nauwkeurigheid, dient u zich ervan bewust te zijn dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in zijn oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor cruciale informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor eventuele misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.
Dit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, dient u zich ervan bewust te zijn dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in de oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor cruciale informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.

View File

@ -10,7 +10,9 @@
"\n",
"### Hente data\n",
"\n",
"I denne oppgaven skal vi fokusere på en relativt enkel klassifiseringsoppgave klassifisering av kjæledyrs ansikter. Dette datasettet består av utskårne ansikter fra [Oxford-IIIT Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/). La oss starte med å laste inn og visualisere datasettet.\n"
"I denne oppgaven skal vi fokusere på en relativt enkel klassifiseringsoppgave klassifisering av kjæledyrs ansikter. Vi skal bruke [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), som inneholder bilder av 37 forskjellige hunde- og katteraser. La oss starte med å laste ned og visualisere datasettet.\n",
"\n",
"**Merk:** Oxford-IIIT Pet Dataset inneholder bilder av hele kjæledyret. Bildene vil være organisert etter rase i den utpakkede mappen.\n"
]
},
{
@ -77,7 +79,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Nå la oss gå gjennom alle underkatalogene for klasser og plotte de første bildene av hver klasse:\n"
"La oss nå gå gjennom alle klassens underkataloger og plotte de første bildene av hver klasse:\n"
]
},
{
@ -86,6 +88,24 @@
"metadata": {},
"outputs": [],
"source": [
"# Note: The Oxford-IIIT Pet Dataset extracts to a folder named 'images'\n",
"# Images are named by breed (e.g., 'Abyssinian_1.jpg')\n",
"# We need to organize them into breed-specific subdirectories\n",
"import os\n",
"from collections import defaultdict\n",
"\n",
"# Organize images by breed\n",
"if not os.path.exists('petfaces'):\n",
" os.makedirs('petfaces')\n",
" for img_file in os.listdir('images'):\n",
" if img_file.endswith(('.jpg', '.png')):\n",
" # Extract breed name from filename (everything before the last underscore and number)\n",
" breed = '_'.join(img_file.split('_')[:-1])\n",
" breed_dir = os.path.join('petfaces', breed)\n",
" if not os.path.exists(breed_dir):\n",
" os.makedirs(breed_dir)\n",
" os.rename(os.path.join('images', img_file), os.path.join(breed_dir, img_file))\n",
"\n",
"for cls in os.listdir('petfaces'):\n",
" print(cls)\n",
" display_images([Image.open(os.path.join('petfaces',cls,x)) \n",
@ -95,7 +115,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"La oss også definere antall klasser i datasettet vårt:\n"
]
},
{
"cell_type": "code",
@ -128,7 +150,7 @@
"* I Tensorflow, bruk `tf.keras.preprocessing.image_dataset_from_directory`\n",
"* I PyTorch, bruk `torchvision.datasets.ImageFolder`\n",
"\n",
"Som du har sett fra bildene ovenfor, har alle en nær kvadratisk bildeforhold, så vi må endre størrelsen på alle bilder til kvadratisk størrelse. I tillegg kan vi organisere bildene i minibatcher.\n"
"Som du har sett fra bildene ovenfor, har alle en bildeforhold som er nær kvadratisk, så vi må endre størrelsen på alle bilder til kvadratisk størrelse. I tillegg kan vi organisere bildene i minibatcher.\n"
]
},
{
@ -164,7 +186,7 @@
" * `(batch_size,image_size,image_size,3)` for Tensorflow, `batch_size,3,image_size,image_size` for PyTorch\n",
" * `batch_size` for etiketter\n",
" \n",
" Etiketter bør inneholde antall klasser.\n"
" Etiketter bør inneholde klassenumre.\n"
]
},
{
@ -228,14 +250,14 @@
"source": [
"## Definer et nevralt nettverk\n",
"\n",
"For bildeklassifisering bør du sannsynligvis definere et konvolusjonelt nevralt nettverk med flere lag. Hva du bør være oppmerksom på:\n",
"For bildeklassifisering bør du sannsynligvis definere et konvolusjonsnevralt nettverk med flere lag. Hva du bør være oppmerksom på:\n",
"* Husk pyramidearkitekturen, dvs. antall filtre bør øke jo dypere du går.\n",
"* Ikke glem aktiveringsfunksjoner mellom lagene (ReLU) og Max Pooling.\n",
"* Den endelige klassifisereren kan være med eller uten skjulte lag, men antall utgangsnevroner bør være lik antall klasser.\n",
"* Den endelige klassifisereren kan være med eller uten skjulte lag, men antall utgangsneuroner bør være lik antall klasser.\n",
"\n",
"En viktig ting er å få aktiveringsfunksjonen på det siste laget + tapsfunksjonen riktig:\n",
"* I Tensorflow kan du bruke `softmax` som aktivering og `sparse_categorical_crossentropy` som tap. Forskjellen mellom sparse kategorisk krysstap og ikke-sparse er at den første forventer utgangen som klassens nummer, og ikke som en one-hot vektor.\n",
"* I PyTorch kan du ha det siste laget uten aktiveringsfunksjon og bruke `CrossEntropyLoss` som tapsfunksjon. Denne funksjonen anvender softmax automatisk.\n"
"* I Tensorflow kan du bruke `softmax` som aktivering og `sparse_categorical_crossentropy` som tapsfunksjon. Forskjellen mellom sparse categorical cross-entropy og den ikke-sparse er at den førstnevnte forventer utgangen som klassens nummer, og ikke som en one-hot vektor.\n",
"* I PyTorch kan du ha det siste laget uten aktiveringsfunksjon og bruke tapsfunksjonen `CrossEntropyLoss`. Denne funksjonen anvender softmax automatisk.\n"
]
},
{
@ -253,9 +275,9 @@
"source": [
"## Tren det nevrale nettverket\n",
"\n",
"Nå er vi klare til å trene det nevrale nettverket. Under treningen, samle inn nøyaktighet på trenings- og testdata for hver epoke, og deretter plott nøyaktigheten for å se om det oppstår overtilpasning.\n",
"Nå er vi klare til å trene det nevrale nettverket. Under treningen, vennligst samle inn nøyaktighet på trenings- og testdata for hver epoke, og deretter plott nøyaktigheten for å se om det er overtilpasning.\n",
"\n",
"> For å raskere gjennomføre treningen, bør du bruke GPU hvis tilgjengelig. Mens TensorFlow/Keras automatisk vil bruke GPU, må du i PyTorch flytte både modellen og dataene til GPU under treningen ved hjelp av `.to()`-metoden for å dra nytte av GPU-akselerasjon.\n"
"> For å øke hastigheten på treningen, må du bruke GPU hvis tilgjengelig. Mens TensorFlow/Keras automatisk vil bruke GPU, må du i PyTorch flytte både modellen og dataene til GPU under treningen ved hjelp av `.to()`-metoden for å dra nytte av GPU-akselerasjon.\n"
]
},
{
@ -299,13 +321,13 @@
"\n",
"I denne øvelsen jobbet vi med klassifisering med et ganske høyt antall klasser (35), så vårt resultat - rundt 50% valideringsnøyaktighet - er ganske bra. Det standard ImageNet-datasettet har enda flere - 1000 klasser.\n",
"\n",
"I slike tilfeller er det vanskelig å sikre at modellen **alltid** korrekt forutsier klassen. Det finnes tilfeller der to raser er veldig like hverandre, og modellen returnerer svært like sannsynligheter (f.eks. 0.45 og 0.43). Hvis vi måler standard nøyaktighet, vil det bli betraktet som en feil, selv om modellen gjorde en veldig liten feil. Derfor måler vi ofte en annen metrikk - en nøyaktighet innenfor de tre mest sannsynlige forutsigelsene til modellen.\n",
"I slike tilfeller er det vanskelig å sikre at modellen **alltid** korrekt forutsier klassen. Det finnes tilfeller der to raser er svært like hverandre, og modellen returnerer svært like sannsynligheter (f.eks. 0.45 og 0.43). Hvis vi måler standard nøyaktighet, vil dette bli betraktet som en feil, selv om modellen gjorde en veldig liten feil. Derfor måler vi ofte en annen metrikk - en nøyaktighet innenfor de tre mest sannsynlige forutsigelsene til modellen.\n",
"\n",
"Vi anser tilfellet som korrekt hvis måletiketten er inneholdt blant de tre mest sannsynlige modellforutsigelsene.\n",
"\n",
"For å beregne top-3 nøyaktighet på testdatasettet, må du manuelt gå gjennom datasettet, bruke nevralt nettverk for å få forutsigelsen, og deretter gjøre beregningene. Noen tips:\n",
"For å beregne top-3-nøyaktighet på testdatasettet, må du manuelt gå gjennom datasettet, bruke nevralt nettverk for å få forutsigelsen, og deretter gjøre beregningene. Noen tips:\n",
"\n",
"* I Tensorflow, bruk funksjonen `tf.nn.in_top_k` for å se om `predictions` (utgangen fra modellen) er blant de topp-k (pass `k=3` som parameter), med hensyn til `targets`. Denne funksjonen returnerer en tensor av boolske verdier, som kan konverteres til `int` ved hjelp av `tf.cast`, og deretter akkumuleres ved hjelp av `tf.reduce_sum`.\n",
"* I Tensorflow, bruk funksjonen `tf.nn.in_top_k` for å se om `predictions` (modellens output) er blant de topp-k (pass `k=3` som parameter), med hensyn til `targets`. Denne funksjonen returnerer en tensor av boolske verdier, som kan konverteres til `int` ved hjelp av `tf.cast`, og deretter akkumuleres ved hjelp av `tf.reduce_sum`.\n",
"* I PyTorch, kan du bruke funksjonen `torch.topk` for å få indekser for klasser med høyest sannsynligheter, og deretter se om den korrekte klassen tilhører dem. Se [dette](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) for flere tips.\n"
]
},
@ -350,7 +372,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Ansvarsfraskrivelse**: \nDette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiserte oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen.\n"
"\n---\n\n**Ansvarsfraskrivelse**: \nDette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vær oppmerksom på at automatiserte oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen.\n"
]
}
],
@ -376,8 +398,8 @@
"version": "3.9.5"
},
"coopTranslator": {
"original_hash": "1de3ae931831253c3198d899da48bfe5",
"translation_date": "2025-08-28T16:25:02+00:00",
"original_hash": "df7d1f7da8d2617b76acd93115776ca4",
"translation_date": "2025-10-03T14:39:40+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb",
"language_code": "no"
}

View File

@ -1,8 +1,8 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "f3d2cee9cb3c52160419e560c57a690e",
"translation_date": "2025-08-28T15:14:27+00:00",
"original_hash": "b70fcf7fcee862990f848c679090943f",
"translation_date": "2025-10-03T14:55:38+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/README.md",
"language_code": "no"
}
@ -13,13 +13,13 @@ Laboppgave fra [AI for Beginners Curriculum](https://github.com/microsoft/ai-for
## Oppgave
Tenk deg at du må utvikle en applikasjon for en dyrebarnehage for å katalogisere alle kjæledyr. En av de flotte funksjonene i en slik applikasjon ville være å automatisk identifisere rasen fra et fotografi. Dette kan gjøres med suksess ved hjelp av nevrale nettverk.
Tenk deg at du må utvikle en applikasjon for en dyrebarnehage for å katalogisere alle kjæledyrene. En av de flotte funksjonene i en slik applikasjon ville være å automatisk identifisere rasen fra et fotografi. Dette kan gjøres med suksess ved hjelp av nevrale nettverk.
Du må trene et konvolusjonelt nevralt nettverk for å klassifisere forskjellige raser av katter og hunder ved hjelp av **Pet Faces**-datasettet.
Du må trene et konvolusjonsnevralt nettverk for å klassifisere forskjellige raser av katter og hunder ved hjelp av **Pet Faces**-datasettet.
## Datasettet
Vi skal bruke **Pet Faces**-datasettet, som er avledet fra [Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/) kjæledyrsdatasettet. Det inneholder 35 forskjellige raser av hunder og katter.
Vi skal bruke [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), som inneholder bilder av 37 forskjellige raser av hunder og katter.
![Datasettet vi skal jobbe med](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.no.png)
@ -31,15 +31,17 @@ For å laste ned datasettet, bruk denne kodebiten:
!rm images.tar.gz
```
**Merk:** Bildene i Oxford-IIIT Pet Dataset er organisert etter filnavn (f.eks. `Abyssinian_1.jpg`, `Bengal_2.jpg`). Notatboken inneholder kode for å organisere disse bildene i rasespesifikke underkataloger for enklere klassifisering.
## Startnotatbok
Start laben ved å åpne [PetFaces.ipynb](PetFaces.ipynb)
## Oppsummering
Du har løst et relativt komplekst problem med bildeklassifisering fra bunnen av! Det var ganske mange klasser, og du klarte likevel å oppnå rimelig nøyaktighet! Det gir også mening å måle top-k nøyaktighet, fordi det er lett å forveksle noen av klassene som ikke er tydelig forskjellige, selv for mennesker.
Du har løst et relativt komplekst problem med bildegjenkjenning fra bunnen av! Det var ganske mange klasser, og du klarte likevel å oppnå rimelig nøyaktighet! Det gir også mening å måle top-k nøyaktighet, fordi det er lett å forveksle noen av klassene som ikke er tydelig forskjellige, selv for mennesker.
---
**Ansvarsfraskrivelse**:
Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiserte oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen.
Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vær oppmerksom på at automatiserte oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen.

View File

@ -10,7 +10,9 @@
"\n",
"### ਡਾਟਾ ਪ੍ਰਾਪਤ ਕਰਨਾ\n",
"\n",
"ਇਸ ਅਸਾਈਨਮੈਂਟ ਵਿੱਚ, ਅਸੀਂ ਇੱਕ ਸਧਾਰਣ ਵਰਗੀਕਰਨ ਕੰਮ 'ਤੇ ਧਿਆਨ ਦੇਵਾਂਗੇ - ਪਾਲਤੂ ਜਾਨਵਰਾਂ ਦੇ ਚਿਹਰਿਆਂ ਦੀ ਵਰਗੀਕਰਨ। ਇਹ ਡਾਟਾਸੈੱਟ [Oxford-IIIT Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/) ਤੋਂ ਕੱਟੇ ਹੋਏ ਚਿਹਰਿਆਂ 'ਤੇ ਆਧਾਰਿਤ ਹੈ। ਆਓ ਡਾਟਾਸੈੱਟ ਨੂੰ ਲੋਡ ਕਰਨ ਅਤੇ ਵਿਜੁਅਲਾਈਜ਼ ਕਰਨ ਨਾਲ ਸ਼ੁਰੂ ਕਰੀਏ।\n"
"ਇਸ ਅਸਾਈਨਮੈਂਟ ਵਿੱਚ, ਅਸੀਂ ਇੱਕ ਸਧਾਰਨ ਵਰਗੀਕਰਨ ਕੰਮ 'ਤੇ ਧਿਆਨ ਦੇਵਾਂਗੇ - ਪਾਲਤੂ ਜਾਨਵਰਾਂ ਦੇ ਚਿਹਰਿਆਂ ਦੀ ਵਰਗੀਕਰਨ। ਅਸੀਂ [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/) ਦੀ ਵਰਤੋਂ ਕਰਾਂਗੇ, ਜਿਸ ਵਿੱਚ ਕੁੱਤਿਆਂ ਅਤੇ ਬਿਲੀਆਂ ਦੀਆਂ 37 ਵੱਖ-ਵੱਖ ਬਰੀਡਾਂ ਦੀਆਂ ਤਸਵੀਰਾਂ ਸ਼ਾਮਲ ਹਨ। ਆਓ ਡਾਟਾਸੈਟ ਨੂੰ ਡਾਊਨਲੋਡ ਅਤੇ ਵਿਜੁਅਲਾਈਜ਼ ਕਰਨਾ ਸ਼ੁਰੂ ਕਰੀਏ।\n",
"\n",
"**ਨੋਟ:** Oxford-IIIT Pet Dataset ਵਿੱਚ ਪਾਲਤੂ ਜਾਨਵਰਾਂ ਦੀਆਂ ਪੂਰੀਆਂ ਤਸਵੀਰਾਂ ਸ਼ਾਮਲ ਹਨ। ਕੈਟੇਗਰੀ ਦੇ ਅਨੁਸਾਰ ਤਸਵੀਰਾਂ ਨੂੰ ਐਕਸਟ੍ਰੈਕਟ ਕੀਤੇ ਗਏ ਫੋਲਡਰ ਵਿੱਚ ਸੰਗਠਿਤ ਕੀਤਾ ਜਾਵੇਗਾ।\n"
]
},
{
@ -46,7 +48,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"ਅਸੀਂ ਇੱਕ ਸਧਾਰਣ ਫੰਕਸ਼ਨ ਪਰਿਭਾਸ਼ਿਤ ਕਰਾਂਗੇ ਜੋ ਸੂਚੀ ਵਿੱਚੋਂ ਤਸਵੀਰਾਂ ਦੀ ਇੱਕ ਲੜੀ ਦਿਖਾਉਣ ਲਈ ਹੈ:\n"
"ਅਸੀਂ ਇੱਕ ਸੂਚੀ ਵਿੱਚੋਂ ਚਿੱਤਰਾਂ ਦੀ ਲੜੀ ਦਿਖਾਉਣ ਲਈ ਇੱਕ ਜਨਰਲ ਫੰਕਸ਼ਨ ਪਰਿਭਾਸ਼ਿਤ ਕਰਾਂਗੇ:\n"
]
},
{
@ -77,7 +79,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"ਚਲੋ ਹੁਣ ਸਾਰੇ ਕਲਾਸ ਸਬਡਾਇਰੈਕਟਰੀਜ਼ ਨੂੰ ਪਾਰ ਕਰਦੇ ਹਾਂ ਅਤੇ ਹਰ ਕਲਾਸ ਦੀਆਂ ਪਹਿਲੀਆਂ ਕੁਝ ਤਸਵੀਰਾਂ ਨੂੰ ਪਲਾਟ ਕਰਦੇ ਹਾਂ:\n"
"ਹੁਣ ਆਓ ਸਾਰੇ ਕਲਾਸ ਸਬਡਾਇਰੈਕਟਰੀਜ਼ ਨੂੰ ਤਵਾਰਨਾ ਕਰੀਏ ਅਤੇ ਹਰ ਕਲਾਸ ਦੀਆਂ ਪਹਿਲੀਆਂ ਕੁਝ ਤਸਵੀਰਾਂ ਨੂੰ ਪਲਾਟ ਕਰੀਏ:\n"
]
},
{
@ -86,6 +88,24 @@
"metadata": {},
"outputs": [],
"source": [
"# Note: The Oxford-IIIT Pet Dataset extracts to a folder named 'images'\n",
"# Images are named by breed (e.g., 'Abyssinian_1.jpg')\n",
"# We need to organize them into breed-specific subdirectories\n",
"import os\n",
"from collections import defaultdict\n",
"\n",
"# Organize images by breed\n",
"if not os.path.exists('petfaces'):\n",
" os.makedirs('petfaces')\n",
" for img_file in os.listdir('images'):\n",
" if img_file.endswith(('.jpg', '.png')):\n",
" # Extract breed name from filename (everything before the last underscore and number)\n",
" breed = '_'.join(img_file.split('_')[:-1])\n",
" breed_dir = os.path.join('petfaces', breed)\n",
" if not os.path.exists(breed_dir):\n",
" os.makedirs(breed_dir)\n",
" os.rename(os.path.join('images', img_file), os.path.join(breed_dir, img_file))\n",
"\n",
"for cls in os.listdir('petfaces'):\n",
" print(cls)\n",
" display_images([Image.open(os.path.join('petfaces',cls,x)) \n",
@ -96,7 +116,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"ਆਓ ਆਪਣੇ ਡੇਟਾਸੈਟ ਵਿੱਚ ਕਲਾਸਾਂ ਦੀ ਗਿਣਤੀ ਨੂੰ ਵੀ ਪਰਿਭਾਸ਼ਿਤ ਕਰੀਏ:\n"
"ਆਓ ਆਪਣੇ ਡੇਟਾਸੈਟ ਵਿੱਚ ਕਲਾਸਾਂ ਦੀ ਗਿਣਤੀ ਨੂੰ ਵੀ ਪਰਿਭਾਸ਼ਿਤ ਕਰੀਏ:\n"
]
},
{
@ -124,13 +144,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## ਡੀਪ ਲਰਨਿੰਗ ਲਈ ਡੇਟਾਸੈਟ ਤਿਆਰ ਕਰਨਾ\n",
"## ਡੀਪ ਲਰਨਿੰਗ ਲਈ ਡੇਟਾਸੈਟ ਤਿਆਰ ਕਰਨਾ\n",
"\n",
"ਸਾਡਾ ਨਿਊਰਲ ਨੈਟਵਰਕ ਟ੍ਰੇਨਿੰਗ ਸ਼ੁਰੂ ਕਰਨ ਲਈ, ਸਾਨੂੰ ਸਾਰੀਆਂ ਤਸਵੀਰਾਂ ਨੂੰ ਟੈਂਸਰ ਵਿੱਚ ਬਦਲਣਾ ਪਵੇਗਾ, ਅਤੇ ਲੇਬਲ (ਕਲਾਸ ਨੰਬਰ) ਦੇ ਨਾਲ ਸੰਬੰਧਿਤ ਟੈਂਸਰ ਵੀ ਬਣਾਉਣੇ ਪੈਣਗੇ। ਜ਼ਿਆਦਾਤਰ ਨਿਊਰਲ ਨੈਟਵਰਕ ਫਰੇਮਵਰਕ ਤਸਵੀਰਾਂ ਨਾਲ ਨਿਪਟਣ ਲਈ ਸਧਾਰਨ ਟੂਲ ਪ੍ਰਦਾਨ ਕਰਦੇ ਹਨ:\n",
"ਸਾਡਾ ਨਿਊਰਲ ਨੈਟਵਰਕ ਟ੍ਰੇਨਿੰਗ ਸ਼ੁਰੂ ਕਰਨ ਲਈ, ਸਾਨੂੰ ਸਾਰੀਆਂ ਤਸਵੀਰਾਂ ਨੂੰ ਟੈਂਸਰ ਵਿੱਚ ਬਦਲਣਾ ਪਵੇਗਾ ਅਤੇ ਲੇਬਲ (ਕਲਾਸ ਨੰਬਰ) ਦੇ ਅਨੁਸਾਰ ਟੈਂਸਰ ਬਣਾਉਣੇ ਪੈਣਗੇ। ਜ਼ਿਆਦਾਤਰ ਨਿਊਰਲ ਨੈਟਵਰਕ ਫਰੇਮਵਰਕਸ ਵਿੱਚ ਤਸਵੀਰਾਂ ਨਾਲ ਨਿਪਟਣ ਲਈ ਸਧਾਰਨ ਟੂਲ ਹੁੰਦੇ ਹਨ:\n",
"* Tensorflow ਵਿੱਚ, `tf.keras.preprocessing.image_dataset_from_directory` ਵਰਤੋ\n",
"* PyTorch ਵਿੱਚ, `torchvision.datasets.ImageFolder` ਵਰਤੋ\n",
"\n",
"ਜਿਵੇਂ ਤੁਸੀਂ ਉੱਪਰ ਦਿੱਤੀਆਂ ਤਸਵੀਰਾਂ ਵਿੱਚ ਵੇਖਿਆ ਹੈ, ਉਹ ਸਾਰੀਆਂ ਲਗਭਗ ਵਰਗ ਆਕਾਰ ਦੇ ਅਨੁਪਾਤ ਵਿੱਚ ਹਨ, ਇਸ ਲਈ ਸਾਨੂੰ ਸਾਰੀਆਂ ਤਸਵੀਰਾਂ ਨੂੰ ਵਰਗ ਆਕਾਰ ਵਿੱਚ ਰੀਸਾਈਜ਼ ਕਰਨ ਦੀ ਲੋੜ ਹੈ। ਇਸ ਤੋਂ ਇਲਾਵਾ, ਅਸੀਂ ਤਸਵੀਰਾਂ ਨੂੰ ਛੋਟੇ ਬੈਚਾਂ ਵਿੱਚ ਸੰਗਠਿਤ ਕਰ ਸਕਦੇ ਹਾਂ।\n"
"ਜਿਵੇਂ ਤੁਸੀਂ ਉੱਪਰ ਦਿੱਤੀਆਂ ਤਸਵੀਰਾਂ ਵਿੱਚ ਵੇਖਿਆ ਹੈ, ਸਾਰੀਆਂ ਤਸਵੀਰਾਂ ਦਾ ਅਨੁਪਾਤ ਲਗਭਗ ਵਰਗ ਦੇ ਨੇੜੇ ਹੈ, ਇਸ ਲਈ ਸਾਨੂੰ ਸਾਰੀਆਂ ਤਸਵੀਰਾਂ ਨੂੰ ਵਰਗ ਆਕਾਰ ਵਿੱਚ ਰੀਸਾਈਜ਼ ਕਰਨ ਦੀ ਲੋੜ ਹੈ। ਇਸ ਤੋਂ ਇਲਾਵਾ, ਅਸੀਂ ਤਸਵੀਰਾਂ ਨੂੰ ਮਿਨੀਬੈਚ ਵਿੱਚ ਸੰਗਠਿਤ ਕਰ ਸਕਦੇ ਹਾਂ।\n"
]
},
{
@ -146,7 +166,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"ਹੁਣ ਸਾਨੂੰ ਡੇਟਾਸੈੱਟ ਨੂੰ ਟ੍ਰੇਨ ਅਤੇ ਟੈਸਟ ਹਿੱਸਿਆਂ ਵਿੱਚ ਵੰਡਣ ਦੀ ਲੋੜ ਹੈ:\n"
"ਹੁਣ ਸਾਨੂੰ ਡੇਟਾਸੈੱਟ ਨੂੰ ਟ੍ਰੇਨ ਅਤੇ ਟੈਸਟ ਹਿੱਸਿਆਂ ਵਿੱਚ ਵੱਖ ਕਰਨਾ ਚਾਹੀਦਾ ਹੈ:\n"
]
},
{
@ -162,11 +182,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"ਆਓ ਹੁਣ ਅਸੀਂ ਆਪਣੇ ਡੇਟਾਸੈੱਟ ਵਿੱਚ ਟੈਂਸਰਾਂ ਦੇ ਆਕਾਰ ਨੂੰ ਪ੍ਰਿੰਟ ਕਰੀਏ। ਜੇ ਤੁਸੀਂ ਸਾਰਾ ਕੁਝ ਠੀਕ ਕੀਤਾ ਹੈ, ਤਾਂ ਟ੍ਰੇਨਿੰਗ ਐਲਿਮੈਂਟਸ ਦਾ ਆਕਾਰ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ: \n",
" * ਟੈਂਸਰਫਲੋ ਲਈ `(batch_size,image_size,image_size,3)`, ਪਾਈਟਾਰਚ ਲਈ `batch_size,3,image_size,image_size` \n",
" * ਲੇਬਲ ਲਈ `batch_size` \n",
"ਹੁਣ ਆਓ ਆਪਣੇ ਡੇਟਾਸੈੱਟ ਵਿੱਚ ਟੈਂਸਰਾਂ ਦਾ ਆਕਾਰ ਪ੍ਰਿੰਟ ਕਰੀਏ। ਜੇਕਰ ਤੁਸੀਂ ਸਭ ਕੁਝ ਸਹੀ ਕੀਤਾ ਹੈ, ਤਾਂ ਟ੍ਰੇਨਿੰਗ ਐਲਿਮੈਂਟਸ ਦਾ ਆਕਾਰ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ:\n",
" * ਟੈਂਸਰਫਲੋ ਲਈ `(batch_size,image_size,image_size,3)`, ਪਾਈਟਾਰਚ ਲਈ `batch_size,3,image_size,image_size`\n",
" * ਲੇਬਲ ਲਈ `batch_size`\n",
"\n",
"ਲੇਬਲ ਵਿੱਚ ਕਲਾਸਾਂ ਦੀ ਗਿਣਤੀ ਹੋਣੀ ਚਾਹੀਦੀ ਹੈ। \n"
"ਲੇਬਲ ਵਿੱਚ ਕਲਾਸਾਂ ਦੀ ਗਿਣਤੀ ਹੋਣੀ ਚਾਹੀਦੀ ਹੈ।\n"
]
},
{
@ -228,16 +248,16 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## ਨਿਊਰਲ ਨੈਟਵਰਕ ਨੂੰ ਪਰਿਭਾਸ਼ਿਤ ਕਰੋ\n",
"## ਨਿਊਰਲ ਨੈਟਵਰਕ ਨੂੰ ਪਰਿਭਾਸ਼ਿਤ ਕਰੋ\n",
"\n",
"ਚਿੱਤਰ ਵਰਗੀਕਰਨ ਲਈ, ਤੁਹਾਨੂੰ ਸੰਭਵਤ: ਕਈ ਲੇਅਰਾਂ ਵਾਲੇ ਇੱਕ ਕਨਵੋਲੂਸ਼ਨਲ ਨਿਊਰਲ ਨੈਟਵਰਕ ਨੂੰ ਪਰਿਭਾਸ਼ਿਤ ਕਰਨਾ ਚਾਹੀਦਾ ਹੈ। ਧਿਆਨ ਵਿੱਚ ਰੱਖਣ ਵਾਲੀਆਂ ਗੱਲਾਂ:\n",
"* ਪਿਰਾਮਿਡ ਆਰਕੀਟੈਕਚਰ ਨੂੰ ਯਾਦ ਰੱਖੋ, ਜਿਵੇਂ ਕਿ ਫਿਲਟਰਾਂ ਦੀ ਗਿਣਤੀ ਵਧਦੀ ਜਾਣੀ ਚਾਹੀਦੀ ਹੈ ਜਿਵੇਂ ਤੁਸੀਂ ਡੂੰਘੇ ਜਾਂਦੇ ਹੋ।\n",
"* ਲੇਅਰਾਂ ਦੇ ਵਿਚਕਾਰ ਐਕਟੀਵੇਸ਼ਨ ਫੰਕਸ਼ਨ (ReLU) ਅਤੇ ਮੈਕਸ ਪੂਲਿੰਗ ਨੂੰ ਭੁੱਲਣਾ ਨਹੀਂ।\n",
"* ਆਖਰੀ ਵਰਗੀਕਰਨ ਲੁਕਵੇਂ ਲੇਅਰਾਂ ਦੇ ਨਾਲ ਜਾਂ ਬਿਨਾਂ ਹੋ ਸਕਦਾ ਹੈ, ਪਰ ਆਉਟਪੁੱਟ ਨਿਊਰੋਨ ਦੀ ਗਿਣਤੀ ਕਲਾਸਾਂ ਦੀ ਗਿਣਤੀ ਦੇ ਬਰਾਬਰ ਹੋਣੀ ਚਾਹੀਦੀ ਹੈ।\n",
"ਚਿੱਤਰ ਵਰਗੀਕਰਨ ਲਈ, ਤੁਹਾਨੂੰ ਸੰਭਵਤ: ਕਈ ਲੇਅਰਾਂ ਵਾਲੇ ਇੱਕ ਕਨਵੋਲੂਸ਼ਨਲ ਨਿਊਰਲ ਨੈਟਵਰਕ ਨੂੰ ਪਰਿਭਾਸ਼ਿਤ ਕਰਨਾ ਚਾਹੀਦਾ ਹੈ। ਧਿਆਨ ਵਿੱਚ ਰੱਖਣ ਵਾਲੀਆਂ ਗੱਲਾਂ:\n",
"* ਪਿਰਾਮਿਡ ਆਰਕੀਟੈਕਚਰ ਨੂੰ ਯਾਦ ਰੱਖੋ, ਜਿਵੇਂ ਕਿ ਫਿਲਟਰਾਂ ਦੀ ਗਿਣਤੀ ਗਹਿਰਾਈ ਵਿੱਚ ਵਧਦੀ ਹੈ।\n",
"* ਲੇਅਰਾਂ ਦੇ ਵਿਚਕਾਰ ਐਕਟੀਵੇਸ਼ਨ ਫੰਕਸ਼ਨ (ReLU) ਅਤੇ ਮੈਕਸ ਪੂਲਿੰਗ ਨੂੰ ਭੁੱਲੋ ਨਾ।\n",
"* ਅੰਤਮ ਵਰਗੀਕਰਨ ਲੁਕਵੇਂ ਲੇਅਰਾਂ ਨਾਲ ਜਾਂ ਬਿਨਾਂ ਹੋ ਸਕਦਾ ਹੈ, ਪਰ ਆਉਟਪੁੱਟ ਨਿਊਰੋਨ ਦੀ ਗਿਣਤੀ ਕਲਾਸਾਂ ਦੀ ਗਿਣਤੀ ਦੇ ਬਰਾਬਰ ਹੋਣੀ ਚਾਹੀਦੀ ਹੈ।\n",
"\n",
"ਇੱਕ ਮਹੱਤਵਪੂਰਨ ਗੱਲ ਇਹ ਹੈ ਕਿ ਆਖਰੀ ਲੇਅਰ 'ਤੇ ਐਕਟੀਵੇਸ਼ਨ ਫੰਕਸ਼ਨ + ਲਾਸ ਫੰਕਸ਼ਨ ਨੂੰ ਸਹੀ ਤਰੀਕੇ ਨਾਲ ਲਗਾ:\n",
"* Tensorflow ਵਿੱਚ, ਤੁਸੀਂ ਐਕਟੀਵੇਸ਼ਨ ਲਈ `softmax` ਅਤੇ ਲਾਸ ਲਈ `sparse_categorical_crossentropy` ਵਰਤ ਸਕਦੇ ਹੋ। ਸਪਾਰਸ ਕੈਟਗੋਰਿਕਲ ਕ੍ਰਾਸ-ਐਂਟ੍ਰੋਪੀ ਅਤੇ ਨਾਨ-ਸਪਾਰਸ ਕੈਟੇਗੋਰਿਕਲ ਕ੍ਰਾਸ-ਐਂਟ੍ਰੋਪੀ ਵਿੱਚ ਫਰਕ ਇਹ ਹੈ ਕਿ ਪਹਿਲਾ ਆਉਟਪੁੱਟ ਨੂੰ ਕਲਾਸ ਦੀ ਗਿਣਤੀ ਦੇ ਰੂਪ ਵਿੱਚ ਉਮੀਦ ਕਰਦਾ ਹੈ, ਨਾ ਕਿ ਇੱਕ-ਹਾਟ ਵੈਕਟਰ ਦੇ ਰੂਪ ਵਿੱਚ।\n",
"* PyTorch ਵਿੱਚ, ਤੁਸੀਂ ਆਖਰੀ ਲੇਅਰ ਨੂੰ ਬਿਨਾਂ ਐਕਟੀਵੇਸ਼ਨ ਫੰਕਸ਼ਨ ਦੇ ਰੱਖ ਸਕਦੇ ਹੋ ਅਤੇ `CrossEntropyLoss` ਲਾਸ ਫੰਕਸ਼ਨ ਵਰਤ ਸਕਦੇ ਹੋ। ਇਹ ਫੰਕਸ਼ਨ ਆਪਣੇ ਆਪ ਹੀ softmax ਲਗਾਉਂਦਾ ਹੈ।\n"
"ਇੱਕ ਮਹੱਤਵਪੂਰਨ ਗੱਲ ਇਹ ਹੈ ਕਿ ਆਖਰੀ ਲੇਅਰ 'ਤੇ ਐਕਟੀਵੇਸ਼ਨ ਫੰਕਸ਼ਨ + ਲਾਸ ਫੰਕਸ਼ਨ ਨੂੰ ਸਹੀ ਤਰੀਕੇ ਨਾਲ ਲਗਾਉਣਾ:\n",
"* Tensorflow ਵਿੱਚ, ਤੁਸੀਂ ਐਕਟੀਵੇਸ਼ਨ ਲਈ `softmax` ਅਤੇ ਲਾਸ ਲਈ `sparse_categorical_crossentropy` ਵਰਤ ਸਕਦੇ ਹੋ। ਸਪਾਰਸ ਕੈਟਗੋਰਿਕਲ ਕ੍ਰਾਸ-ਐਂਟ੍ਰੋਪੀ ਅਤੇ ਨਾਨ-ਸਪਾਰਸ ਵਿੱਚ ਫਰਕ ਇਹ ਹੈ ਕਿ ਪਹਿਲਾ ਆਉਟਪੁੱਟ ਨੂੰ ਕਲਾਸ ਦੀ ਗਿਣਤੀ ਵਜੋਂ ਉਮੀਦ ਕਰਦਾ ਹੈ, ਨਾ ਕਿ ਇੱਕ-ਹਾਟ ਵੈਕਟਰ ਵਜੋਂ।\n",
"* PyTorch ਵਿੱਚ, ਤੁਸੀਂ ਆਖਰੀ ਲੇਅਰ ਨੂੰ ਐਕਟੀਵੇਸ਼ਨ ਫੰਕਸ਼ਨ ਤੋਂ ਬਿਨਾਂ ਰੱਖ ਸਕਦੇ ਹੋ ਅਤੇ `CrossEntropyLoss` ਲਾਸ ਫੰਕਸ਼ਨ ਵਰਤ ਸਕਦੇ ਹੋ। ਇਹ ਫੰਕਸ਼ਨ ਆਪਣੇ ਆਪ ਸੌਫਟਮੈਕਸ ਲਗਾਉਂਦਾ ਹੈ।\n"
]
},
{
@ -253,11 +273,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## ਨਿਊਰਲ ਨੈਟਵਰਕ ਨੂੰ ਟ੍ਰੇਨ ਕਰੋ\n",
"## ਨਿਊਰਲ ਨੈਟਵਰਕ ਨੂੰ ਟ੍ਰੇਨ ਕਰੋ\n",
"\n",
"ਹੁਣ ਅਸੀਂ ਨਿਊਰਲ ਨੈਟਵਰਕ ਨੂੰ ਟ੍ਰੇਨ ਕਰਨ ਲਈ ਤਿਆਰ ਹਾਂ। ਟ੍ਰੇਨਿੰਗ ਦੌਰਾਨ, ਹਰ ਇੱਕ epoch 'ਤੇ ਟ੍ਰੇਨ ਅਤੇ ਟੈਸਟ ਡਾਟਾ ਉੱਤੇ accuracy ਇਕੱਠੀ ਕਰੋ, ਅਤੇ ਫਿਰ accuracy ਨੂੰ ਪਲਾਟ ਕਰੋ ਤਾਂ ਜੋ ਵੇਖ ਸਕੋ ਕਿ ਕੀ overfitting ਹੋ ਰਿਹਾ ਹੈ।\n",
"ਹੁਣ ਅਸੀਂ ਨਿਊਰਲ ਨੈਟਵਰਕ ਨੂੰ ਟ੍ਰੇਨ ਕਰਨ ਲਈ ਤਿਆਰ ਹਾਂ। ਟ੍ਰੇਨਿੰਗ ਦੌਰਾਨ, ਕਿਰਪਾ ਕਰਕੇ ਹਰ epoch 'ਤੇ ਟ੍ਰੇਨ ਅਤੇ ਟੈਸਟ ਡਾਟਾ 'ਤੇ ਸਹੀਤਾ ਇਕੱਠੀ ਕਰੋ, ਅਤੇ ਫਿਰ ਸਹੀਤਾ ਨੂੰ ਪਲਾਟ ਕਰੋ ਤਾਂ ਜੋ ਦੇਖਿਆ ਜਾ ਸਕੇ ਕਿ ਕੀ overfitting ਹੋ ਰਿਹਾ ਹੈ।\n",
"\n",
"> ਟ੍ਰੇਨਿੰਗ ਨੂੰ ਤੇਜ਼ ਕਰਨ ਲਈ, ਜੇ GPU ਉਪਲਬਧ ਹੈ ਤਾਂ ਇਸਦਾ ਇਸਤੇਮਾਲ ਕਰੋ। ਜਿੱਥੇ TensorFlow/Keras ਆਪਣੇ ਆਪ GPU ਦਾ ਇਸਤੇਮਾਲ ਕਰ ਲੈਂਦਾ ਹੈ, ਉੱਥੇ PyTorch ਵਿੱਚ ਤੁਹਾਨੂੰ ਮਾਡਲ ਅਤੇ ਡਾਟਾ ਦੋਵਾਂ ਨੂੰ `.to()` ਮੈਥਡ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਟ੍ਰੇਨਿੰਗ ਦੌਰਾਨ GPU 'ਤੇ ਮੂਵ ਕਰਨਾ ਪਵੇਗਾ ਤਾਂ ਜੋ GPU ਦੇ acceleration ਦਾ ਫਾਇਦਾ ਲਿਆ ਜਾ ਸਕੇ।\n"
"> ਟ੍ਰੇਨਿੰਗ ਨੂੰ ਤੇਜ਼ ਕਰਨ ਲਈ, ਤੁਹਾਨੂੰ GPU ਦੀ ਵਰਤੋਂ ਕਰਨੀ ਚਾਹੀਦੀ ਹੈ ਜੇ ਉਪਲਬਧ ਹੋਵੇ। ਜਦਕਿ TensorFlow/Keras ਆਪਣੇ ਆਪ GPU ਦੀ ਵਰਤੋਂ ਕਰੇਗਾ, PyTorch ਵਿੱਚ ਤੁਹਾਨੂੰ ਟ੍ਰੇਨਿੰਗ ਦੌਰਾਨ `.to()` ਵਿਧੀ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਮਾਡਲ ਅਤੇ ਡਾਟਾ ਦੋਵਾਂ ਨੂੰ GPU 'ਤੇ ਮੂਵ ਕਰਨਾ ਪਵੇਗਾ ਤਾਂ ਜੋ GPU ਤੇਜ਼ੀ ਦਾ ਫਾਇਦਾ ਲਿਆ ਜਾ ਸਕੇ।\n"
]
},
{
@ -295,20 +315,20 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"ਤੁਸੀਂ ਓਵਰਫਿਟਿੰਗ ਬਾਰੇ ਕੀ ਕਹਿ ਸਕਦੇ ਹੋ? ਮਾਡਲ ਦੀ ਸ਼ੁੱਧਤਾ ਨੂੰ ਸੁਧਾਰਨ ਲਈ ਕੀ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ\n",
"ਓਵਰਫਿਟਿੰਗ ਬਾਰੇ ਕੀ ਕਹਿ ਸਕਦੇ ਹੋ? ਮਾਡਲ ਦੀ ਸਹੀਤਾ ਨੂੰ ਸੁਧਾਰਨ ਲਈ ਕੀ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ?\n",
"\n",
"## ਵਿਕਲਪਿਕ: ਟੌਪ-3 ਸ਼ੁੱਧਤਾ ਦੀ ਗਣਨਾ ਕਰੋ\n",
"## ਵਿਕਲਪਿਕ: ਟੌਪ-3 ਸਹੀਤਾ ਦੀ ਗਣਨਾ ਕਰੋ\n",
"\n",
"ਇਸ ਅਭਿਆਸ ਵਿੱਚ, ਅਸੀਂ ਕਾਫ਼ੀ ਵੱਡੀ ਗਿਣਤੀ ਵਾਲੀਆਂ ਕਲਾਸਾਂ (35) ਦੇ ਨਾਲ ਵਰਗੀਕਰਨ ਕਰ ਰਹੇ ਸਾਂ, ਇਸ ਲਈ ਸਾਡਾ ਨਤੀਜਾ - ਲਗਭਗ 50% ਵੈਲੀਡੇਸ਼ਨ ਸ਼ੁੱਧਤਾ - ਕਾਫ਼ੀ ਵਧੀਆ ਹੈ। ਸਟੈਂਡਰਡ ImageNet ਡੇਟਾਸੈਟ ਵਿੱਚ ਇਸ ਤੋਂ ਵੀ ਵੱਧ - 1000 ਕਲਾਸਾਂ ਹੁੰਦੀਆਂ ਹਨ।\n",
"ਇਸ ਅਭਿਆਸ ਵਿੱਚ, ਅਸੀਂ ਕਲਾਸੀਫਿਕੇਸ਼ਨ ਨਾਲ ਨਜਿੱਠ ਰਹੇ ਸੀ ਜਿਸ ਵਿੱਚ ਕਲਾਸਾਂ ਦੀ ਗਿਣਤੀ ਕਾਫ਼ੀ ਜ਼ਿਆਦਾ ਸੀ (35), ਇਸ ਲਈ ਸਾਡਾ ਨਤੀਜਾ - ਲਗਭਗ 50% ਵੈਲੀਡੇਸ਼ਨ ਸਹੀਤਾ - ਕਾਫ਼ੀ ਵਧੀਆ ਹੈ। ਸਟੈਂਡਰਡ ImageNet ਡਾਟਾਸੈਟ ਵਿੱਚ ਇਸ ਤੋਂ ਵੀ ਜ਼ਿਆਦਾ - 1000 ਕਲਾਸਾਂ ਹੁੰਦੀਆਂ ਹਨ।\n",
"\n",
"ਇਹੋ ਜਿਹੇ ਮਾਮਲਿਆਂ ਵਿੱਚ ਇਹ ਯਕੀਨੀ ਬਣਾਉਣਾ ਮੁਸ਼ਕਲ ਹੁੰਦਾ ਹੈ ਕਿ ਮਾਡਲ **ਹਮੇਸ਼ਾ** ਸਹੀ ਕਲਾਸ ਦੀ ਪੇਸ਼ਗੋਈ ਕਰੇ। ਕੁਝ ਮਾਮਲਿਆਂ ਵਿੱਚ ਦੋ ਬ੍ਰੀਡਜ਼ ਇੱਕ ਦੂਜੇ ਨਾਲ ਬਹੁਤ ਮਿਲਦੀਆਂ ਜਾਪਦੀਆਂ ਹਨ, ਅਤੇ ਮਾਡਲ ਬਹੁਤ ਮਿਲਦੀਆਂ ਸੰਭਾਵਨਾਵਾਂ ਵਾਪਸ ਕਰਦਾ ਹੈ (ਉਦਾਹਰਨ ਲਈ, 0.45 ਅਤੇ 0.43)। ਜੇ ਅਸੀਂ ਸਟੈਂਡਰਡ ਸ਼ੁੱਧਤਾ ਨੂੰ ਮਾਪਦੇ ਹਾਂ, ਤਾਂ ਇਸਨੂੰ ਗਲਤ ਮਾਮਲਾ ਮੰਨਿਆ ਜਾਵੇਗਾ, ਭਾਵੇਂ ਮਾਡਲ ਨੇ ਬਹੁਤ ਛੋਟੀ ਗਲਤੀ ਕੀਤੀ ਹੋਵੇ। ਇਸ ਲਈ, ਅਸੀਂ ਅਕਸਰ ਇੱਕ ਹੋਰ ਮਾਪਦੰਡ ਮਾਪਦੇ ਹਾਂ - ਮਾਡਲ ਦੀ ਸਭ ਤੋਂ ਉੱਚੀਆਂ 3 ਸੰਭਾਵਨਾਵਾਂ ਵਿੱਚ ਸ਼ੁੱਧਤਾ।\n",
"ਇਹਨਾਂ ਹਾਲਾਤਾਂ ਵਿੱਚ ਇਹ ਯਕੀਨੀ ਬਣਾਉਣਾ ਮੁਸ਼ਕਲ ਹੁੰਦਾ ਹੈ ਕਿ ਮਾਡਲ **ਹਮੇਸ਼ਾ** ਸਹੀ ਕਲਾਸ ਦੀ ਪੇਸ਼ਕਸ਼ ਕਰੇ। ਕੁਝ ਹਾਲਾਤਾਂ ਵਿੱਚ ਦੋ ਬ੍ਰੀਡਜ਼ ਇੱਕ ਦੂਜੇ ਨਾਲ ਬਹੁਤ ਮਿਲਦੀਆਂ ਹੁੰਦੀਆਂ ਹਨ, ਅਤੇ ਮਾਡਲ ਬਹੁਤ ਹੀ ਮਿਲਦੇ ਜੁਲਦੇ ਸੰਭਾਵਨਾਵਾਂ (ਜਿਵੇਂ, 0.45 ਅਤੇ 0.43) ਵਾਪਸ ਕਰਦਾ ਹੈ। ਜੇਕਰ ਅਸੀਂ ਸਟੈਂਡਰਡ ਸਹੀਤਾ ਨੂੰ ਮਾਪਦੇ ਹਾਂ, ਤਾਂ ਇਸਨੂੰ ਗਲਤ ਮਾਮਲਾ ਮੰਨਿਆ ਜਾਵੇਗਾ, ਹਾਲਾਂਕਿ ਮਾਡਲ ਨੇ ਬਹੁਤ ਛੋਟੀ ਗਲਤੀ ਕੀਤੀ। ਇਸ ਲਈ, ਅਸੀਂ ਅਕਸਰ ਇੱਕ ਹੋਰ ਮੈਟਰਿਕ ਮਾਪਦੇ ਹਾਂ - ਮਾਡਲ ਦੀ ਸਭ ਤੋਂ ਸੰਭਾਵਨਾ ਵਾਲੀਆਂ 3 ਪੇਸ਼ਕਸ਼ਾਂ ਵਿੱਚ ਸਹੀਤਾ।\n",
"\n",
"ਅਸੀਂ ਮਾਮਲੇ ਨੂੰ ਸਹੀ ਮੰਨਦੇ ਹਾਂ ਜੇ ਲਕਸ਼ ਭੇਟਾ ਮਾਡਲ ਦੀਆਂ ਟੌਪ 3 ਪੇਸ਼ਗੋਈਆਂ ਵਿੱਚ ਸ਼ਾਮਲ ਹੋਵੇ।\n",
"ਅਸੀਂ ਮਾਮਲੇ ਨੂੰ ਸਹੀ ਮੰਨਦੇ ਹਾਂ ਜੇਕਰ ਟਾਰਗੇਟ ਲੇਬਲ ਮਾਡਲ ਦੀ ਟੌਪ-3 ਪੇਸ਼ਕਸ਼ਾਂ ਵਿੱਚ ਸ਼ਾਮਲ ਹੋਵੇ।\n",
"\n",
"ਟੈਸਟ ਡੇਟਾਸੈਟ 'ਤੇ ਟੌਪ-3 ਸ਼ੁੱਧਤਾ ਦੀ ਗਣਨਾ ਕਰਨ ਲਈ, ਤੁਹਾਨੂੰ ਹੱਥੋਂ ਡੇਟਾਸੈਟ 'ਤੇ ਜਾਣਾ ਪਵੇਗਾ, ਨਿਊਰਲ ਨੈੱਟਵਰਕ ਲਾਗੂ ਕਰਕੇ ਪੇਸ਼ਗੋਈ ਪ੍ਰਾਪਤ ਕਰਨੀ ਪਵੇਗੀ, ਅਤੇ ਫਿਰ ਗਣਨਾਵਾਂ ਕਰਨੀਆਂ ਪੈਣਗੀਆਂ। ਕੁਝ ਸੁਝਾਵ:\n",
"ਟੈਸਟ ਡਾਟਾਸੈਟ 'ਤੇ ਟੌਪ-3 ਸਹੀਤਾ ਦੀ ਗਣਨਾ ਕਰਨ ਲਈ, ਤੁਹਾਨੂੰ ਹੱਥੋਂ-ਹੱਥ ਡਾਟਾਸੈਟ 'ਤੇ ਜਾਣਾ ਪਵੇਗਾ, ਨਿਊਰਲ ਨੈਟਵਰਕ ਨੂੰ ਲਾਗੂ ਕਰਕੇ ਪੇਸ਼ਕਸ਼ ਪ੍ਰਾਪਤ ਕਰਨੀ ਪਵੇਗੀ, ਅਤੇ ਫਿਰ ਗਣਨਾਵਾਂ ਕਰਨੀ ਪਵੇਗੀ। ਕੁਝ ਸੁਝਾਅ:\n",
"\n",
"* Tensorflow ਵਿੱਚ, `tf.nn.in_top_k` ਫੰਕਸ਼ਨ ਦੀ ਵਰਤੋਂ ਕਰੋ ਇਹ ਵੇਖਣ ਲਈ ਕਿ ਕੀ `predictions` (ਮਾਡਲ ਦਾ ਆਉਟਪੁੱਟ) ਟੌਪ-k ਵਿੱਚ ਹਨ (ਪੈਰਾਮੀਟਰ ਵਜੋਂ `k=3` ਪਾਸ ਕਰੋ), `targets` ਦੇ ਸਬੰਧ ਵਿੱਚ। ਇਹ ਫੰਕਸ਼ਨ ਬੂਲੀਅਨ ਮੁੱਲਾਂ ਦਾ ਟੈਂਸਰ ਵਾਪਸ ਕਰਦਾ ਹੈ, ਜਿਸਨੂੰ `tf.cast` ਦੀ ਵਰਤੋਂ ਕਰਕੇ `int` ਵਿੱਚ ਬਦਲਿਆ ਜਾ ਸਕਦਾ ਹੈ, ਅਤੇ ਫਿਰ `tf.reduce_sum` ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਜੋੜਿਆ ਜਾ ਸਕਦਾ ਹੈ।\n",
"* PyTorch ਵਿੱਚ, ਤੁਸੀਂ `torch.topk` ਫੰਕਸ਼ਨ ਦੀ ਵਰਤੋਂ ਕਰ ਸਕਦੇ ਹੋ ਉੱਚੀਆਂ ਸੰਭਾਵਨਾਵਾਂ ਵਾਲੀਆਂ ਕਲਾਸਾਂ ਦੇ ਇੰਡੈਕਸ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ, ਅਤੇ ਫਿਰ ਵੇਖ ਸਕਦੇ ਹੋ ਕਿ ਸਹੀ ਕਲਾਸ ਉਨ੍ਹਾਂ ਵਿੱਚ ਸ਼ਾਮਲ ਹੈ ਜਾਂ ਨਹੀਂ। ਹੋਰ ਸੁਝਾਵਾਂ ਲਈ [ਇਹ](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) ਵੇਖੋ।\n"
"* Tensorflow ਵਿੱਚ, `tf.nn.in_top_k` ਫੰਕਸ਼ਨ ਦੀ ਵਰਤੋਂ ਕਰੋ ਇਹ ਦੇਖਣ ਲਈ ਕਿ `predictions` (ਮਾਡਲ ਦਾ ਆਉਟਪੁੱਟ) ਟੌਪ-k ਵਿੱਚ ਹਨ ਜਾਂ ਨਹੀਂ (ਪੈਰਾਮੀਟਰ ਵਜੋਂ `k=3` ਪਾਸ ਕਰੋ), `targets` ਦੇ ਸਬੰਧ ਵਿੱਚ। ਇਹ ਫੰਕਸ਼ਨ ਬੂਲੀਅਨ ਮੁੱਲਾਂ ਦਾ ਟੈਂਸਰ ਵਾਪਸ ਕਰਦਾ ਹੈ, ਜਿਸਨੂੰ `tf.cast` ਦੀ ਵਰਤੋਂ ਕਰਕੇ `int` ਵਿੱਚ ਬਦਲਿਆ ਜਾ ਸਕਦਾ ਹੈ, ਅਤੇ ਫਿਰ `tf.reduce_sum` ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਜੋੜਿਆ ਜਾ ਸਕਦਾ ਹੈ।\n",
"* PyTorch ਵਿੱਚ, ਤੁਸੀਂ `torch.topk` ਫੰਕਸ਼ਨ ਦੀ ਵਰਤੋਂ ਕਰ ਸਕਦੇ ਹੋ ਕਲਾਸਾਂ ਦੇ ਇੰਡੈਕਸ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ ਜਿਨ੍ਹਾਂ ਦੀ ਸੰਭਾਵਨਾ ਸਭ ਤੋਂ ਉੱਚੀ ਹੈ, ਅਤੇ ਫਿਰ ਦੇਖ ਸਕਦੇ ਹੋ ਕਿ ਸਹੀ ਕਲਾਸ ਉਨ੍ਹਾਂ ਵਿੱਚ ਸ਼ਾਮਲ ਹੈ ਜਾਂ ਨਹੀਂ। ਹੋਰ ਸੁਝਾਅਾਂ ਲਈ [ਇਸ](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) ਨੂੰ ਵੇਖੋ।\n"
]
},
{
@ -324,9 +344,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## ਵਿਕਲਪਿਕ: ਬਿਲੀਆਂ ਵਿਰੁੱਧ ਕੁੱਤਿਆਂ ਦੀ ਵਰਗੀਕਰਨ ਬਣਾਉਣਾ\n",
"## ਵਿਕਲਪਿਕ: ਬਿਲੀਆਂ ਵਿਰੁੱਧ ਕੁੱਤ ਵਰਗੀਕਰਨ ਬਣਾਉਣਾ\n",
"\n",
"ਅਸੀਂ ਇਹ ਵੀ ਦੇਖਣਾ ਚਾਹੁੰਦੇ ਹਾਂ ਕਿ ਸਾਡੇ ਬਾਈਨਰੀ ਬਿਲੀਆਂ ਵਿਰੁੱਧ ਕੁੱਤਿਆਂ ਦੀ ਵਰਗੀਕਰਨ ਇੱਕੋ ਹੀ ਡੇਟਾਸੈਟ 'ਤੇ ਕਿੰਨੀ ਸਹੀ ਹੋਵੇਗੀ। ਇਸਨੂੰ ਕਰਨ ਲਈ, ਸਾਨੂੰ ਲੇਬਲਾਂ ਨੂੰ ਢਾਲਣ ਦੀ ਲੋੜ ਹੈ:\n"
"ਅਸੀਂ ਇਹ ਵੀ ਦੇਖਣਾ ਚਾਹੁੰਦੇ ਹਾਂ ਕਿ ਸਾਡੇ ਬਾਈਨਰੀ ਬਿਲੀਆਂ ਵਿਰੁੱਧ ਕੁੱਤੇ ਵਰਗੀਕਰਨ ਦੀ ਸਹੀਤਾ ਇਸੇ ਡੇਟਾਸੈਟ 'ਤੇ ਕਿੰਨੀ ਹੋਵੇਗੀ। ਇਸ ਨੂੰ ਕਰਨ ਲਈ, ਸਾਨੂੰ ਲੇਬਲਾਂ ਨੂੰ ਸਮਾਯੋਜਿਤ ਕਰਨ ਦੀ ਲੋੜ ਹੈ:\n"
]
},
{
@ -352,7 +372,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**ਅਸਵੀਕਰਤੀ**: \nਇਹ ਦਸਤਾਵੇਜ਼ AI ਅਨੁਵਾਦ ਸੇਵਾ [Co-op Translator](https://github.com/Azure/co-op-translator) ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਅਨੁਵਾਦ ਕੀਤਾ ਗਿਆ ਹੈ। ਜਦੋਂ ਕਿ ਅਸੀਂ ਸਹੀ ਹੋਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਦੇ ਹਾਂ, ਕਿਰਪਾ ਕਰਕੇ ਧਿਆਨ ਦਿਓ ਕਿ ਸਵੈਚਾਲਿਤ ਅਨੁਵਾਦਾਂ ਵਿੱਚ ਗਲਤੀਆਂ ਜਾਂ ਅਸੁਚੱਜੇਪਣ ਹੋ ਸਕਦੇ ਹਨ। ਮੂਲ ਦਸਤਾਵੇਜ਼ ਨੂੰ ਇਸਦੀ ਮੂਲ ਭਾਸ਼ਾ ਵਿੱਚ ਅਧਿਕਾਰਤ ਸਰੋਤ ਮੰਨਿਆ ਜਾਣਾ ਚਾਹੀਦਾ ਹੈ। ਮਹੱਤਵਪੂਰਨ ਜਾਣਕਾਰੀ ਲਈ, ਪੇਸ਼ੇਵਰ ਮਨੁੱਖੀ ਅਨੁਵਾਦ ਦੀ ਸਿਫਾਰਸ਼ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਇਸ ਅਨੁਵਾਦ ਦੀ ਵਰਤੋਂ ਤੋਂ ਪੈਦਾ ਹੋਣ ਵਾਲੇ ਕਿਸੇ ਵੀ ਗਲਤਫਹਿਮੀ ਜਾਂ ਗਲਤ ਵਿਆਖਿਆ ਲਈ ਅਸੀਂ ਜ਼ਿੰਮੇਵਾਰ ਨਹੀਂ ਹਾਂ।\n"
"\n---\n\n**ਅਸਵੀਕਰਤੀ**: \nਇਹ ਦਸਤਾਵੇਜ਼ AI ਅਨੁਵਾਦ ਸੇਵਾ [Co-op Translator](https://github.com/Azure/co-op-translator) ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਅਨੁਵਾਦ ਕੀਤਾ ਗਿਆ ਹੈ। ਜਦੋਂ ਕਿ ਅਸੀਂ ਸਹੀ ਹੋਣ ਦਾ ਯਤਨ ਕਰਦੇ ਹਾਂ, ਕਿਰਪਾ ਕਰਕੇ ਧਿਆਨ ਦਿਓ ਕਿ ਸਵੈਚਾਲਿਤ ਅਨੁਵਾਦਾਂ ਵਿੱਚ ਗਲਤੀਆਂ ਜਾਂ ਅਸੁਚੀਤਤਾਵਾਂ ਹੋ ਸਕਦੀਆਂ ਹਨ। ਇਸ ਦੀ ਮੂਲ ਭਾਸ਼ਾ ਵਿੱਚ ਮੌਜੂਦ ਦਸਤਾਵੇਜ਼ ਨੂੰ ਅਧਿਕਾਰਤ ਸਰੋਤ ਮੰਨਿਆ ਜਾਣਾ ਚਾਹੀਦਾ ਹੈ। ਮਹੱਤਵਪੂਰਨ ਜਾਣਕਾਰੀ ਲਈ, ਪੇਸ਼ੇਵਰ ਮਨੁੱਖੀ ਅਨੁਵਾਦ ਦੀ ਸਿਫਾਰਸ਼ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਅਸੀਂ ਇਸ ਅਨੁਵਾਦ ਦੀ ਵਰਤੋਂ ਤੋਂ ਪੈਦਾ ਹੋਣ ਵਾਲੇ ਕਿਸੇ ਵੀ ਗਲਤ ਫਹਿਮੀ ਜਾਂ ਗਲਤ ਵਿਆਖਿਆ ਲਈ ਜ਼ਿੰਮੇਵਾਰ ਨਹੀਂ ਹਾਂ।\n"
]
}
],
@ -378,8 +398,8 @@
"version": "3.9.5"
},
"coopTranslator": {
"original_hash": "1de3ae931831253c3198d899da48bfe5",
"translation_date": "2025-08-28T07:48:39+00:00",
"original_hash": "df7d1f7da8d2617b76acd93115776ca4",
"translation_date": "2025-10-03T14:34:14+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb",
"language_code": "pa"
}

View File

@ -1,8 +1,8 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "f3d2cee9cb3c52160419e560c57a690e",
"translation_date": "2025-08-26T09:34:30+00:00",
"original_hash": "b70fcf7fcee862990f848c679090943f",
"translation_date": "2025-10-03T14:54:07+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/README.md",
"language_code": "pa"
}
@ -13,17 +13,17 @@ CO_OP_TRANSLATOR_METADATA:
## ਕੰਮ
ਕਲਪਨਾ ਕਰੋ ਕਿ ਤੁਹਾਨੂੰ ਪਾਲਤੂ ਜਾਨਵਰਾਂ ਦੇ ਨਰਸਰੀ ਲਈ ਇੱਕ ਐਪਲੀਕੇਸ਼ਨ ਵਿਕਸਿਤ ਕਰਨੀ ਹੈ ਜੋ ਸਾਰੇ ਪਾਲਤੂ ਜਾਨਵਰਾਂ ਨੂੰ ਕੈਟਾਲੌਗ ਕਰ ਸਕੇ। ਇਸ ਤਰ੍ਹਾਂ ਦੀ ਐਪਲੀਕੇਸ਼ਨ ਦੀ ਇੱਕ ਸ਼ਾਨਦਾਰ ਵਿਸ਼ੇਸ਼ਤਾ ਇਹ ਹੋਵੇਗੀ ਕਿ ਫੋਟੋ ਤੋਂ ਬ੍ਰੀਡ ਨੂੰ ਆਟੋਮੈਟਿਕ ਤੌਰ 'ਤੇ ਪਛਾਣਿਆ ਜਾ ਸਕੇ। ਇਹ ਕੰਮ ਨਿਊਰਲ ਨੈਟਵਰਕ ਦੀ ਮਦਦ ਨਾਲ ਸਫਲਤਾਪੂਰਵਕ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ।
ਕਲਪਨਾ ਕਰੋ ਕਿ ਤੁਹਾਨੂੰ ਪਾਲਤੂ ਜਾਨਵਰਾਂ ਦੇ ਨਰਸਰੀ ਲਈ ਇੱਕ ਐਪਲੀਕੇਸ਼ਨ ਵਿਕਸਿਤ ਕਰਨੀ ਹੈ ਜੋ ਸਾਰੇ ਪਾਲਤੂ ਜਾਨਵਰਾਂ ਨੂੰ ਕੈਟਾਲੌਗ ਕਰ ਸਕੇ। ਇਸ ਤਰ੍ਹਾਂ ਦੀ ਐਪਲੀਕੇਸ਼ਨ ਦੀ ਇੱਕ ਸ਼ਾਨਦਾਰ ਵਿਸ਼ੇਸ਼ਤਾ ਇਹ ਹੋਵੇਗੀ ਕਿ ਫੋਟੋ ਤੋਂ ਬਰੀਡ ਨੂੰ ਆਪਣੇ ਆਪ ਪਛਾਣਨਾ। ਇਹ ਕੰਮ ਨਿਊਰਲ ਨੈਟਵਰਕ ਦੀ ਮਦਦ ਨਾਲ ਸਫਲਤਾਪੂਰਵਕ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ।
ਤੁਹਾਨੂੰ **Pet Faces** ਡੇਟਾਸੈੱਟ ਦੀ ਵਰਤੋਂ ਕਰਦਿਆਂ ਬਿੱਲੀਆਂ ਅਤੇ ਕੁੱਤਿਆਂ ਦੀਆਂ ਵੱਖ-ਵੱਖ ਬਰੀਡਾਂ ਨੂੰ ਵਰਗੀਕ੍ਰਿਤ ਕਰਨ ਲਈ ਇੱਕ ਕਨਵੋਲੂਸ਼ਨਲ ਨਿਊਰਲ ਨੈਟਵਰਕ ਨੂੰ ਟ੍ਰੇਨ ਕਰਨਾ ਹੈ।
ਤੁਹਾਨੂੰ **Pet Faces** ਡੇਟਾਸੈਟ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਬਿੱਲੀਆਂ ਅਤੇ ਕੁੱਤਿਆਂ ਦੀਆਂ ਵੱਖ-ਵੱਖ ਬਰੀਡਾਂ ਨੂੰ ਵਰਗੀਕ੍ਰਿਤ ਕਰਨ ਲਈ ਇੱਕ ਕਨਵੋਲੂਸ਼ਨਲ ਨਿਊਰਲ ਨੈਟਵਰਕ ਨੂੰ ਟ੍ਰੇਨ ਕਰਨਾ ਹੈ।
## ਡੇਟਾਸੈ
## ਡੇਟਾਸੈਟ
ਅਸੀਂ **Pet Faces** ਡੇਟਾਸੈੱਟ ਦੀ ਵਰਤੋਂ ਕਰਾਂਗੇ, ਜੋ ਕਿ [Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/) ਪਾਲਤੂ ਜਾਨਵਰਾਂ ਦੇ ਡੇਟਾਸੈੱਟ ਤੋਂ ਲਿਆ ਗਿਆ ਹੈ। ਇਸ ਵਿੱਚ ਕੁੱਤਿਆਂ ਅਤੇ ਬਿੱਲੀਆਂ ਦੀਆਂ 35 ਵੱਖ-ਵੱਖ ਬ੍ਰੀਡਾਂ ਸ਼ਾਮਲ ਹਨ।
ਅਸੀਂ [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/) ਦੀ ਵਰਤੋਂ ਕਰਾਂਗੇ, ਜਿਸ ਵਿੱਚ ਕੁੱਤਿਆਂ ਅਤੇ ਬਿੱਲੀਆਂ ਦੀਆਂ 37 ਵੱਖ-ਵੱਖ ਬਰੀਡਾਂ ਦੀਆਂ ਤਸਵੀਰਾਂ ਸ਼ਾਮਲ ਹਨ।
![ਜਿਸ ਡੇਟਾਸੈੱਟ ਨਾਲ ਅਸੀਂ ਕੰਮ ਕਰਾਂਗੇ](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.pa.png)
![ਜਿਸ ਡੇਟਾ ਨਾਲ ਅਸੀਂ ਕੰਮ ਕਰਨ ਜਾ ਰਹੇ ਹਾਂ](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.pa.png)
ਡੇਟਾਸੈੱਟ ਡਾਊਨਲੋਡ ਕਰਨ ਲਈ, ਹੇਠਾਂ ਦਿੱਤੇ ਕੋਡ ਸਨਿੱਪਟ ਦੀ ਵਰਤੋਂ ਕਰੋ:
ਡੇਟਾਸੈਟ ਡਾਊਨਲੋਡ ਕਰਨ ਲਈ, ਇਸ ਕੋਡ ਸਨਿੱਪਟ ਦੀ ਵਰਤੋਂ ਕਰੋ:
```python
!wget https://thor.robots.ox.ac.uk/~vgg/data/pets/images.tar.gz
@ -31,13 +31,17 @@ CO_OP_TRANSLATOR_METADATA:
!rm images.tar.gz
```
## ਨੋਟਬੁੱਕ ਸ਼ੁਰੂ ਕਰਨਾ
**ਨੋਟ:** Oxford-IIIT Pet Dataset ਦੀਆਂ ਤਸਵੀਰਾਂ ਫਾਈਲਨਾਮ ਦੁਆਰਾ ਆਯੋਜਿਤ ਕੀਤੀਆਂ ਗਈਆਂ ਹਨ (ਜਿਵੇਂ `Abyssinian_1.jpg`, `Bengal_2.jpg`)। ਨੋਟਬੁੱਕ ਵਿੱਚ ਇਹ ਤਸਵੀਰਾਂ ਨੂੰ ਬਰੀਡ-ਸਪੇਸਿਫਿਕ ਸਬਡਾਇਰੈਕਟਰੀਜ਼ ਵਿੱਚ ਆਯੋਜਿਤ ਕਰਨ ਲਈ ਕੋਡ ਸ਼ਾਮਲ ਹੈ, ਜਿਸ ਨਾਲ ਵਰਗੀਕਰਨ ਆਸਾਨ ਬਣਦਾ ਹੈ।
ਲੈਬ ਸ਼ੁਰੂ ਕਰਨ ਲਈ [PetFaces.ipynb](../../../../../../lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb) ਖੋਲ੍ਹੋ।
## ਸ਼ੁਰੂਆਤੀ ਨੋਟਬੁੱਕ
ਲੈਬ ਸ਼ੁਰੂ ਕਰਨ ਲਈ [PetFaces.ipynb](PetFaces.ipynb) ਖੋਲ੍ਹੋ।
## ਸਿੱਖਣ ਵਾਲੀ ਗੱਲ
ਤੁਸੀਂ ਸ਼ੁਰੂ ਤੋਂ ਇੱਕ ਸੰਕਲਨਾਤਮਕ ਸਮੱਸਿਆ ਨੂੰ ਹੱਲ ਕੀਤਾ ਹੈ ਜੋ ਚਿੱਤਰ ਵਰਗੀਕਰਨ ਨਾਲ ਸੰਬੰਧਿਤ ਹੈ! ਕਾਫ਼ੀ ਸਾਰੀਆਂ ਕਲਾਸਾਂ ਸਨ, ਪਰ ਫਿਰ ਵੀ ਤੁਸੀਂ ਵਧੀਆ ਸਹੀ ਨਤੀਜੇ ਪ੍ਰਾਪਤ ਕੀਤੇ! ਇਹ ਵੀ ਸਮਝਦਾਰੀ ਵਾਲੀ ਗੱਲ ਹੈ ਕਿ ਟੌਪ-k ਸਹੀਤਾ ਨੂੰ ਮਾਪਿਆ ਜਾਵੇ, ਕਿਉਂਕਿ ਕੁਝ ਕਲਾਸਾਂ ਨੂੰ ਗਲਤ ਸਮਝਣਾ ਆਸਾਨ ਹੈ, ਜਿਹਨਾਂ ਵਿੱਚ ਮਨੁੱਖਾਂ ਲਈ ਵੀ ਸਪਸ਼ਟ ਅੰਤਰ ਨਹੀਂ ਹੈ
ਤੁਸੀਂ ਸ਼ੁਰੂ ਤੋਂ ਇੱਕ ਮੁਸ਼ਕਲ ਸਮੱਸਿਆ ਨੂੰ ਹੱਲ ਕੀਤਾ ਹੈ ਜੋ ਚਿੱਤਰ ਵਰਗੀਕਰਨ ਨਾਲ ਸੰਬੰਧਿਤ ਹੈ! ਕਾਫ਼ੀ ਸਾਰੀਆਂ ਕਲਾਸਾਂ ਸਨ, ਅਤੇ ਤੁਸੀਂ ਫਿਰ ਵੀ ਵਾਜਬ ਸਹੀਤਾ ਪ੍ਰਾਪਤ ਕਰਨ ਵਿੱਚ ਸਫਲ ਰਹੇ! ਇਹ ਵੀ ਮਹੱਤਵਪੂਰਨ ਹੈ ਕਿ top-k ਸਹੀਤਾ ਨੂੰ ਮਾਪਿਆ ਜਾਵੇ, ਕਿਉਂਕਿ ਕੁਝ ਕਲਾਸਾਂ ਨੂੰ ਗਲਤ ਸਮਝਣਾ ਆਸਾਨ ਹੈ ਜੋ ਮਨੁੱਖਾਂ ਲਈ ਵੀ ਸਪਸ਼ਟ ਤੌਰ 'ਤੇ ਵੱਖਰੀਆਂ ਨਹੀਂ ਹਨ
**ਅਸਵੀਕਰਤੀ**:
ਇਹ ਦਸਤਾਵੇਜ਼ AI ਅਨੁਵਾਦ ਸੇਵਾ [Co-op Translator](https://github.com/Azure/co-op-translator) ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਅਨੁਵਾਦ ਕੀਤਾ ਗਿਆ ਹੈ। ਜਦੋਂ ਕਿ ਅਸੀਂ ਸਹੀ ਹੋਣ ਦਾ ਯਤਨ ਕਰਦੇ ਹਾਂ, ਕਿਰਪਾ ਕਰਕੇ ਧਿਆਨ ਦਿਓ ਕਿ ਸਵੈਚਾਲਿਤ ਅਨੁਵਾਦਾਂ ਵਿੱਚ ਗਲਤੀਆਂ ਜਾਂ ਅਸੁਣਤੀਆਂ ਹੋ ਸਕਦੀਆਂ ਹਨ। ਇਸ ਦੀ ਮੂਲ ਭਾਸ਼ਾ ਵਿੱਚ ਮੌਜੂਦ ਮੂਲ ਦਸਤਾਵੇਜ਼ ਨੂੰ ਪ੍ਰਮਾਣਿਕ ਸਰੋਤ ਮੰਨਿਆ ਜਾਣਾ ਚਾਹੀਦਾ ਹੈ। ਮਹੱਤਵਪੂਰਨ ਜਾਣਕਾਰੀ ਲਈ, ਪੇਸ਼ੇਵਰ ਮਨੁੱਖੀ ਅਨੁਵਾਦ ਦੀ ਸਿਫਾਰਸ਼ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਇਸ ਅਨੁਵਾਦ ਦੇ ਪ੍ਰਯੋਗ ਤੋਂ ਪੈਦਾ ਹੋਣ ਵਾਲੇ ਕਿਸੇ ਵੀ ਗਲਤਫਹਮੀਆਂ ਜਾਂ ਗਲਤ ਵਿਆਖਿਆਵਾਂ ਲਈ ਅਸੀਂ ਜ਼ਿੰਮੇਵਾਰ ਨਹੀਂ ਹਾਂ।
---
**ਅਸਵੀਕਰਤਾ**:
ਇਹ ਦਸਤਾਵੇਜ਼ AI ਅਨੁਵਾਦ ਸੇਵਾ [Co-op Translator](https://github.com/Azure/co-op-translator) ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਅਨੁਵਾਦ ਕੀਤਾ ਗਿਆ ਹੈ। ਜਦੋਂ ਕਿ ਅਸੀਂ ਸਹੀਤਾ ਲਈ ਯਤਨਸ਼ੀਲ ਹਾਂ, ਕਿਰਪਾ ਕਰਕੇ ਧਿਆਨ ਦਿਓ ਕਿ ਸਵੈਚਾਲਿਤ ਅਨੁਵਾਦਾਂ ਵਿੱਚ ਗਲਤੀਆਂ ਜਾਂ ਅਸੁੱਤੀਆਂ ਹੋ ਸਕਦੀਆਂ ਹਨ। ਇਸ ਦੀ ਮੂਲ ਭਾਸ਼ਾ ਵਿੱਚ ਮੌਜੂਦ ਅਸਲ ਦਸਤਾਵੇਜ਼ ਨੂੰ ਅਧਿਕਾਰਤ ਸਰੋਤ ਮੰਨਿਆ ਜਾਣਾ ਚਾਹੀਦਾ ਹੈ। ਮਹੱਤਵਪੂਰਨ ਜਾਣਕਾਰੀ ਲਈ, ਪੇਸ਼ੇਵਰ ਮਨੁੱਖੀ ਅਨੁਵਾਦ ਦੀ ਸਿਫਾਰਸ਼ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਇਸ ਅਨੁਵਾਦ ਦੀ ਵਰਤੋਂ ਤੋਂ ਪੈਦਾ ਹੋਣ ਵਾਲੇ ਕਿਸੇ ਵੀ ਗਲਤ ਫਹਿਮੀ ਜਾਂ ਗਲਤ ਵਿਆਖਿਆ ਲਈ ਅਸੀਂ ਜ਼ਿੰਮੇਵਾਰ ਨਹੀਂ ਹਾਂ।

View File

@ -6,11 +6,13 @@
"source": [
"# Klasyfikacja Twarzy Zwierząt Domowych\n",
"\n",
"Zadanie laboratoryjne z [AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners).\n",
"Zadanie laboratoryjne z [Kursu AI dla Początkujących](https://github.com/microsoft/ai-for-beginners).\n",
"\n",
"### Pobieranie Danych\n",
"\n",
"W tym zadaniu skupimy się na stosunkowo prostym zadaniu klasyfikacji - klasyfikacji twarzy zwierząt domowych. Ten zestaw danych składa się z wyciętych twarzy z [Oxford-IIIT Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/). Zacznijmy od załadowania i wizualizacji zestawu danych.\n"
"W tym zadaniu skupimy się na stosunkowo prostym zadaniu klasyfikacji - klasyfikacji twarzy zwierząt domowych. Skorzystamy z [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), który zawiera obrazy 37 różnych ras psów i kotów. Zacznijmy od pobrania i wizualizacji zestawu danych.\n",
"\n",
"**Uwaga:** Zestaw danych Oxford-IIIT Pet Dataset zawiera pełne obrazy zwierząt domowych. Obrazy będą zorganizowane według ras w wyodrębnionym folderze.\n"
]
},
{
@ -77,7 +79,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Teraz przejdźmy przez wszystkie podkatalogi klas i wyświetlmy kilka pierwszych obrazów każdej klasy:\n"
"Teraz przejdźmy przez wszystkie podkatalogi klas i wyświetlmy pierwsze kilka obrazów każdej klasy:\n"
]
},
{
@ -86,6 +88,24 @@
"metadata": {},
"outputs": [],
"source": [
"# Note: The Oxford-IIIT Pet Dataset extracts to a folder named 'images'\n",
"# Images are named by breed (e.g., 'Abyssinian_1.jpg')\n",
"# We need to organize them into breed-specific subdirectories\n",
"import os\n",
"from collections import defaultdict\n",
"\n",
"# Organize images by breed\n",
"if not os.path.exists('petfaces'):\n",
" os.makedirs('petfaces')\n",
" for img_file in os.listdir('images'):\n",
" if img_file.endswith(('.jpg', '.png')):\n",
" # Extract breed name from filename (everything before the last underscore and number)\n",
" breed = '_'.join(img_file.split('_')[:-1])\n",
" breed_dir = os.path.join('petfaces', breed)\n",
" if not os.path.exists(breed_dir):\n",
" os.makedirs(breed_dir)\n",
" os.rename(os.path.join('images', img_file), os.path.join(breed_dir, img_file))\n",
"\n",
"for cls in os.listdir('petfaces'):\n",
" print(cls)\n",
" display_images([Image.open(os.path.join('petfaces',cls,x)) \n",
@ -126,11 +146,11 @@
"source": [
"## Przygotowanie zbioru danych do uczenia głębokiego\n",
"\n",
"Aby rozpocząć trenowanie naszej sieci neuronowej, musimy przekonwertować wszystkie obrazy na tensory, a także stworzyć tensory odpowiadające etykietom (numerom klas). Większość frameworków sieci neuronowych zawiera proste narzędzia do pracy z obrazami:\n",
"Aby rozpocząć trenowanie naszej sieci neuronowej, musimy przekształcić wszystkie obrazy na tensory, a także stworzyć tensory odpowiadające etykietom (numerom klas). Większość frameworków sieci neuronowych zawiera proste narzędzia do pracy z obrazami:\n",
"* W Tensorflow użyj `tf.keras.preprocessing.image_dataset_from_directory`\n",
"* W PyTorch użyj `torchvision.datasets.ImageFolder`\n",
"\n",
"Jak widzieliście na powyższych obrazkach, wszystkie mają proporcje zbliżone do kwadratu, więc musimy zmienić rozmiar wszystkich obrazów na kwadratowy. Dodatkowo możemy zorganizować obrazy w mini-batche.\n"
"Jak widzieliście na powyższych obrazach, wszystkie mają proporcje zbliżone do kwadratu, więc musimy zmienić rozmiar wszystkich obrazów na kwadratowy. Dodatkowo możemy zorganizować obrazy w minibatchach.\n"
]
},
{
@ -162,7 +182,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Teraz wydrukujmy rozmiar tensorów w naszym zbiorze danych. Jeśli wszystko zostało wykonane poprawnie, rozmiar elementów treningowych powinien wynosić:\n",
"Teraz wydrukujmy rozmiar tensora w naszym zbiorze danych. Jeśli wszystko zostało wykonane poprawnie, rozmiar elementów treningowych powinien być:\n",
" * `(batch_size,image_size,image_size,3)` dla Tensorflow, `batch_size,3,image_size,image_size` dla PyTorch\n",
" * `batch_size` dla etykiet\n",
" \n",
@ -233,11 +253,11 @@
"Do klasyfikacji obrazów warto zdefiniować konwolucyjną sieć neuronową z kilkoma warstwami. Na co zwrócić uwagę:\n",
"* Pamiętaj o architekturze piramidy, czyli liczba filtrów powinna wzrastać wraz z głębokością sieci.\n",
"* Nie zapomnij o funkcjach aktywacji między warstwami (ReLU) oraz Max Poolingu.\n",
"* Końcowy klasyfikator może mieć lub nie mieć warstw ukrytych, ale liczba neuronów wyjściowych powinna być równa liczbie klas.\n",
"* Końcowy klasyfikator może mieć lub nie mieć warstw ukrytych, ale liczba neuronów wyjściowych powinna odpowiadać liczbie klas.\n",
"\n",
"Ważne jest, aby poprawnie dobrać funkcję aktywacji w ostatniej warstwie oraz funkcję straty:\n",
"* W Tensorflow możesz użyć `softmax` jako funkcji aktywacji oraz `sparse_categorical_crossentropy` jako funkcji straty. Różnica między sparse categorical cross-entropy a jej niesparowaną wersją polega na tym, że pierwsza oczekuje wyjścia w formie numeru klasy, a nie jako wektora one-hot.\n",
"* W PyTorch możesz mieć ostatnią warstwę bez funkcji aktywacji i użyć funkcji straty `CrossEntropyLoss`. Ta funkcja automatycznie stosuje softmax.\n"
"* W Tensorflow możesz użyć `softmax` jako funkcji aktywacji oraz `sparse_categorical_crossentropy` jako funkcji straty. Różnica między sparse categorical cross-entropy a jej niesparse wersją polega na tym, że pierwsza oczekuje wyjścia w formie numeru klasy, a nie jako wektora one-hot.\n",
"* W PyTorch ostatnia warstwa może być bez funkcji aktywacji, a jako funkcję straty możesz użyć `CrossEntropyLoss`. Ta funkcja automatycznie stosuje softmax.\n"
]
},
{
@ -257,7 +277,7 @@
"\n",
"Teraz możemy przejść do trenowania sieci neuronowej. Podczas treningu zbieraj dane dotyczące dokładności na zbiorze treningowym i testowym w każdej epoce, a następnie przedstaw je na wykresie, aby sprawdzić, czy występuje przeuczenie.\n",
"\n",
"> Aby przyspieszyć proces treningu, należy użyć GPU, jeśli jest dostępne. Podczas gdy TensorFlow/Keras automatycznie korzysta z GPU, w PyTorch trzeba przenieść zarówno model, jak i dane na GPU podczas treningu, używając metody `.to()`, aby skorzystać z przyspieszenia oferowanego przez GPU.\n"
"> Aby przyspieszyć trening, należy użyć GPU, jeśli jest dostępne. Podczas gdy TensorFlow/Keras automatycznie korzysta z GPU, w PyTorch trzeba przenieść zarówno model, jak i dane na GPU podczas treningu za pomocą metody `.to()`, aby skorzystać z przyspieszenia GPU.\n"
]
},
{
@ -305,7 +325,7 @@
"\n",
"Uważamy przypadek za poprawny, jeśli docelowa etykieta znajduje się wśród trzech najlepszych przewidywań modelu.\n",
"\n",
"Aby obliczyć top-3 accuracy na zbiorze testowym, musisz ręcznie przejść przez zbiór danych, zastosować sieć neuronową, aby uzyskać przewidywania, a następnie wykonać obliczenia. Kilka wskazówek:\n",
"Aby obliczyć top-3 accuracy na zbiorze testowym, należy ręcznie przejść przez zbiór danych, zastosować sieć neuronową, aby uzyskać przewidywania, a następnie wykonać obliczenia. Kilka wskazówek:\n",
"\n",
"* W Tensorflow użyj funkcji `tf.nn.in_top_k`, aby sprawdzić, czy `predictions` (wynik modelu) znajdują się w top-k (przekaż `k=3` jako parametr) w odniesieniu do `targets`. Funkcja ta zwraca tensor wartości logicznych, które można przekonwertować na `int` za pomocą `tf.cast`, a następnie zsumować za pomocą `tf.reduce_sum`.\n",
"* W PyTorch możesz użyć funkcji `torch.topk`, aby uzyskać indeksy klas o najwyższych prawdopodobieństwach, a następnie sprawdzić, czy poprawna klasa należy do nich. Zobacz [tutaj](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) więcej wskazówek.\n"
@ -324,7 +344,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## Opcjonalne: Klasyfikacja koty vs. psy\n",
"## Opcjonalnie: Zbuduj klasyfikację koty vs. psy\n",
"\n",
"Chcemy również sprawdzić, jak dokładna będzie nasza binarna klasyfikacja koty vs. psy na tym samym zbiorze danych. Aby to zrobić, musimy dostosować etykiety:\n"
]
@ -352,7 +372,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Zastrzeżenie**: \nTen dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby zapewnić poprawność tłumaczenia, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za wiarygodne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia.\n"
"\n---\n\n**Zastrzeżenie**: \nTen dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż staramy się zapewnić dokładność, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za wiarygodne źródło. W przypadku informacji krytycznych zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia.\n"
]
}
],
@ -378,8 +398,8 @@
"version": "3.9.5"
},
"coopTranslator": {
"original_hash": "1de3ae931831253c3198d899da48bfe5",
"translation_date": "2025-08-31T12:41:48+00:00",
"original_hash": "df7d1f7da8d2617b76acd93115776ca4",
"translation_date": "2025-10-03T14:36:18+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb",
"language_code": "pl"
}

View File

@ -1,27 +1,27 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "f3d2cee9cb3c52160419e560c57a690e",
"translation_date": "2025-08-24T10:30:56+00:00",
"original_hash": "b70fcf7fcee862990f848c679090943f",
"translation_date": "2025-10-03T14:54:42+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/README.md",
"language_code": "pl"
}
-->
# Klasyfikacja Twarzy Zwierząt Domowych
Zadanie laboratoryjne z [AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners).
Zadanie laboratoryjne z [Kursu AI dla Początkujących](https://github.com/microsoft/ai-for-beginners).
## Zadanie
Wyobraź sobie, że musisz stworzyć aplikację dla przedszkola dla zwierząt, która kataloguje wszystkie zwierzęta. Jedną z świetnych funkcji takiej aplikacji byłoby automatyczne rozpoznawanie rasy na podstawie fotografii. Można to skutecznie osiągnąć za pomocą sieci neuronowych.
Wyobraź sobie, że musisz stworzyć aplikację dla przedszkola dla zwierząt, aby katalogować wszystkie zwierzęta. Jedną z świetnych funkcji takiej aplikacji byłoby automatyczne rozpoznawanie rasy na podstawie fotografii. Można to skutecznie osiągnąć za pomocą sieci neuronowych.
Twoim zadaniem jest wytrenowanie konwolucyjnej sieci neuronowej do klasyfikacji różnych ras kotów i psów, korzystając z zestawu danych **Pet Faces**.
## Zestaw Danych
Użyjemy zestawu danych **Pet Faces**, który pochodzi z [Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/) pets dataset. Zawiera on 35 różnych ras psów i kotów.
Użyjemy [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), który zawiera obrazy 37 różnych ras psów i kotów.
![Zestaw danych, z którym będziemy pracować](../../../../../../lessons/4-ComputerVision/07-ConvNets/lab/images/data.png)
![Zestaw danych, z którym będziemy pracować](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.pl.png)
Aby pobrać zestaw danych, użyj tego fragmentu kodu:
@ -31,13 +31,17 @@ Aby pobrać zestaw danych, użyj tego fragmentu kodu:
!rm images.tar.gz
```
**Uwaga:** Obrazy w zestawie danych Oxford-IIIT Pet Dataset są zorganizowane według nazw plików (np. `Abyssinian_1.jpg`, `Bengal_2.jpg`). Notebook zawiera kod do organizacji tych obrazów w podkatalogi specyficzne dla ras, co ułatwia klasyfikację.
## Rozpoczęcie Pracy z Notebookiem
Rozpocznij pracę z laboratorium, otwierając [PetFaces.ipynb](../../../../../../lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb)
Rozpocznij pracę z laboratorium, otwierając [PetFaces.ipynb](PetFaces.ipynb)
## Wnioski
Rozwiązałeś stosunkowo złożony problem klasyfikacji obrazów od podstaw! Było całkiem sporo klas, a mimo to udało Ci się osiągnąć rozsądną dokładność! Warto również zmierzyć top-k accuracy, ponieważ łatwo pomylić niektóre klasy, które nawet dla ludzi nie są wyraźnie różne.
Rozwiązałeś stosunkowo złożony problem klasyfikacji obrazów od podstaw! Było całkiem sporo klas, a mimo to udało Ci się osiągnąć rozsądną dokładność! Warto również zmierzyć dokładność top-k, ponieważ łatwo pomylić niektóre klasy, które nawet dla ludzi nie są wyraźnie różne.
---
**Zastrzeżenie**:
Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby zapewnić poprawność tłumaczenia, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za autorytatywne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia.
Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby tłumaczenie było precyzyjne, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego języku źródłowym powinien być uznawany za autorytatywne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia wykonanego przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia.

View File

@ -10,7 +10,9 @@
"\n",
"### Obtendo os Dados\n",
"\n",
"Neste trabalho, vamos focar numa tarefa de classificação relativamente simples - classificação de rostos de animais de estimação. Este conjunto de dados consiste em recortes de rostos do [Conjunto de Dados Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/). Vamos começar por carregar e visualizar o conjunto de dados.\n"
"Neste trabalho, vamos concentrar-nos numa tarefa de classificação relativamente simples - a classificação de rostos de animais de estimação. Utilizaremos o [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), que contém imagens de 37 raças diferentes de cães e gatos. Vamos começar por fazer o download e visualizar o conjunto de dados.\n",
"\n",
"**Nota:** O Oxford-IIIT Pet Dataset contém imagens completas de animais de estimação. As imagens serão organizadas por raça na pasta extraída.\n"
]
},
{
@ -77,7 +79,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Agora vamos percorrer todos os subdiretórios de classes e plotar as primeiras imagens de cada classe:\n"
"Agora vamos percorrer todos os subdiretórios das classes e plotar as primeiras imagens de cada classe:\n"
]
},
{
@ -86,6 +88,24 @@
"metadata": {},
"outputs": [],
"source": [
"# Note: The Oxford-IIIT Pet Dataset extracts to a folder named 'images'\n",
"# Images are named by breed (e.g., 'Abyssinian_1.jpg')\n",
"# We need to organize them into breed-specific subdirectories\n",
"import os\n",
"from collections import defaultdict\n",
"\n",
"# Organize images by breed\n",
"if not os.path.exists('petfaces'):\n",
" os.makedirs('petfaces')\n",
" for img_file in os.listdir('images'):\n",
" if img_file.endswith(('.jpg', '.png')):\n",
" # Extract breed name from filename (everything before the last underscore and number)\n",
" breed = '_'.join(img_file.split('_')[:-1])\n",
" breed_dir = os.path.join('petfaces', breed)\n",
" if not os.path.exists(breed_dir):\n",
" os.makedirs(breed_dir)\n",
" os.rename(os.path.join('images', img_file), os.path.join(breed_dir, img_file))\n",
"\n",
"for cls in os.listdir('petfaces'):\n",
" print(cls)\n",
" display_images([Image.open(os.path.join('petfaces',cls,x)) \n",
@ -124,13 +144,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## Preparar o conjunto de dados para Deep Learning\n",
"## Preparação do conjunto de dados para Deep Learning\n",
"\n",
"Para começar a treinar a nossa rede neural, precisamos converter todas as imagens em tensores e também criar tensores correspondentes aos rótulos (números das classes). A maioria dos frameworks de redes neurais contém ferramentas simples para lidar com imagens:\n",
"* No Tensorflow, use `tf.keras.preprocessing.image_dataset_from_directory`\n",
"* No PyTorch, use `torchvision.datasets.ImageFolder`\n",
"\n",
"Como pode ver nas imagens acima, todas têm uma proporção próxima de quadrado, por isso precisamos redimensionar todas as imagens para um tamanho quadrado. Além disso, podemos organizar as imagens em minibatches.\n"
"Como pode ver nas imagens acima, todas têm uma proporção próxima de quadrada, por isso precisamos redimensionar todas as imagens para um tamanho quadrado. Além disso, podemos organizar as imagens em minibatches.\n"
]
},
{
@ -166,7 +186,7 @@
" * `(batch_size,image_size,image_size,3)` para Tensorflow, `batch_size,3,image_size,image_size` para PyTorch\n",
" * `batch_size` para Labels\n",
" \n",
" Os Labels devem conter os números das classes.\n"
" Os Labels devem conter números das classes.\n"
]
},
{
@ -230,14 +250,14 @@
"source": [
"## Definir uma rede neural\n",
"\n",
"Para classificação de imagens, provavelmente deve-se definir uma rede neural convolucional com várias camadas. O que deve ter em atenção:\n",
"Para classificação de imagens, é recomendável definir uma rede neural convolucional com várias camadas. O que deve ter em atenção:\n",
"* Tenha em mente a arquitetura em pirâmide, ou seja, o número de filtros deve aumentar à medida que aprofunda.\n",
"* Não se esqueça das funções de ativação entre as camadas (ReLU) e do Max Pooling.\n",
"* O classificador final pode ter ou não camadas ocultas, mas o número de neurónios de saída deve ser igual ao número de classes.\n",
"\n",
"É importante acertar na função de ativação da última camada + função de perda:\n",
"* No Tensorflow, pode usar `softmax` como ativação e `sparse_categorical_crossentropy` como função de perda. A diferença entre a perda categórica cruzada esparsa e a não esparsa é que a primeira espera a saída como o número da classe, e não como um vetor one-hot.\n",
"* No PyTorch, pode ter a última camada sem função de ativação e usar a função de perda `CrossEntropyLoss`. Esta função aplica softmax automaticamente.\n"
"* No Tensorflow, pode usar `softmax` como função de ativação e `sparse_categorical_crossentropy` como função de perda. A diferença entre sparse categorical cross-entropy e a versão não-sparse é que a primeira espera a saída como o número da classe, e não como um vetor one-hot.\n",
"* No PyTorch, pode ter a camada final sem função de ativação e usar a função de perda `CrossEntropyLoss`. Esta função aplica softmax automaticamente.\n"
]
},
{
@ -257,7 +277,7 @@
"\n",
"Agora estamos prontos para treinar a rede neural. Durante o treino, por favor, recolha a precisão nos dados de treino e teste em cada época e, em seguida, faça um gráfico da precisão para verificar se há overfitting.\n",
"\n",
"> Para acelerar o treino, é necessário usar GPU, se disponível. Enquanto o TensorFlow/Keras utiliza automaticamente a GPU, no PyTorch é necessário mover tanto o modelo como os dados para a GPU durante o treino utilizando o método `.to()` para aproveitar a aceleração da GPU.\n"
"> Para acelerar o treino, é necessário usar GPU, se disponível. Enquanto o TensorFlow/Keras utiliza automaticamente a GPU, no PyTorch é necessário mover tanto o modelo como os dados para a GPU durante o treino utilizando o método `.to()` para tirar proveito da aceleração da GPU.\n"
]
},
{
@ -297,18 +317,18 @@
"source": [
"O que pode dizer sobre overfitting? O que pode ser feito para melhorar a precisão do modelo?\n",
"\n",
"## Opcional: Calcular a Precisão Top3\n",
"## Opcional: Calcular Top3 Accuracy\n",
"\n",
"Neste exercício, estávamos a lidar com classificação com um número bastante elevado de classes (35), por isso o nosso resultado - cerca de 50% de precisão na validação - é bastante bom. O conjunto de dados padrão do ImageNet tem ainda mais - 1000 classes.\n",
"\n",
"Nestes casos, é difícil garantir que o modelo **sempre** prevê corretamente a classe. Há situações em que duas raças são muito semelhantes entre si, e o modelo retorna probabilidades muito próximas (por exemplo, 0.45 e 0.43). Se medirmos a precisão padrão, isso será considerado um erro, mesmo que o modelo tenha cometido um erro muito pequeno. Por isso, muitas vezes medimos outra métrica - uma precisão dentro das 3 previsões mais prováveis do modelo.\n",
"Nestes casos, é difícil garantir que o modelo **sempre** prevê corretamente a classe. Há situações em que duas raças são muito semelhantes entre si, e o modelo devolve probabilidades muito próximas (por exemplo, 0.45 e 0.43). Se medirmos a precisão padrão, será considerado um erro, mesmo que o modelo tenha cometido um erro muito pequeno. Por isso, muitas vezes medimos outra métrica - uma precisão dentro das 3 previsões mais prováveis do modelo.\n",
"\n",
"Consideramos o caso como correto se o rótulo alvo estiver contido nas 3 principais previsões do modelo.\n",
"Consideramos o caso como correto se o rótulo alvo estiver contido nas 3 previsões principais do modelo.\n",
"\n",
"Para calcular a precisão top-3 no conjunto de dados de teste, é necessário percorrer manualmente o conjunto de dados, aplicar a rede neural para obter a previsão e, em seguida, fazer os cálculos. Algumas dicas:\n",
"Para calcular a top-3 accuracy no conjunto de dados de teste, é necessário percorrer manualmente o conjunto de dados, aplicar a rede neural para obter a previsão e depois fazer os cálculos. Algumas dicas:\n",
"\n",
"* No Tensorflow, use a função `tf.nn.in_top_k` para verificar se as `predictions` (saída do modelo) estão no top-k (passe `k=3` como parâmetro), em relação aos `targets`. Esta função retorna um tensor de valores booleanos, que pode ser convertido em `int` usando `tf.cast`, e depois acumulado usando `tf.reduce_sum`.\n",
"* No PyTorch, pode usar a função `torch.topk` para obter os índices das classes com maiores probabilidades e, em seguida, verificar se a classe correta pertence a elas. Veja [isto](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) para mais dicas.\n"
"* No Tensorflow, use a função `tf.nn.in_top_k` para verificar se as `predictions` (saída do modelo) estão no top-k (passe `k=3` como parâmetro), em relação aos `targets`. Esta função devolve um tensor de valores booleanos, que pode ser convertido em `int` usando `tf.cast`, e depois acumulado usando `tf.reduce_sum`.\n",
"* No PyTorch, pode usar a função `torch.topk` para obter os índices das classes com maiores probabilidades e depois verificar se a classe correta pertence a elas. Veja [isto](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) para mais dicas.\n"
]
},
{
@ -352,7 +372,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Aviso Legal**: \nEste documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, é importante notar que traduções automáticas podem conter erros ou imprecisões. O documento original na sua língua nativa deve ser considerado a fonte autoritária. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações incorretas decorrentes da utilização desta tradução.\n"
"\n---\n\n**Aviso**: \nEste documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos pela precisão, tenha em atenção que traduções automáticas podem conter erros ou imprecisões. O documento original na sua língua nativa deve ser considerado a fonte autoritária. Para informações críticas, recomenda-se uma tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações incorretas decorrentes da utilização desta tradução.\n"
]
}
],
@ -378,8 +398,8 @@
"version": "3.9.5"
},
"coopTranslator": {
"original_hash": "1de3ae931831253c3198d899da48bfe5",
"translation_date": "2025-08-31T11:38:33+00:00",
"original_hash": "df7d1f7da8d2617b76acd93115776ca4",
"translation_date": "2025-10-03T14:34:44+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb",
"language_code": "pt"
}

View File

@ -1,27 +1,27 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "f3d2cee9cb3c52160419e560c57a690e",
"translation_date": "2025-08-24T09:00:11+00:00",
"original_hash": "b70fcf7fcee862990f848c679090943f",
"translation_date": "2025-10-03T14:54:19+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/README.md",
"language_code": "pt"
}
-->
# Classificação de Rostos de Animais de Estimação
Trabalho de Laboratório do [Currículo de IA para Iniciantes](https://github.com/microsoft/ai-for-beginners).
Trabalho de laboratório do [Currículo de IA para Iniciantes](https://github.com/microsoft/ai-for-beginners).
## Tarefa
Imagine que precisa desenvolver uma aplicação para um berçário de animais de estimação para catalogar todos os animais. Uma das grandes funcionalidades de tal aplicação seria identificar automaticamente a raça a partir de uma fotografia. Isto pode ser feito com sucesso utilizando redes neuronais.
Precisa treinar uma rede neuronal convolucional para classificar diferentes raças de cães e gatos utilizando o dataset **Pet Faces**.
Precisa treinar uma rede neuronal convolucional para classificar diferentes raças de gatos e cães utilizando o dataset **Pet Faces**.
## O Dataset
Vamos utilizar o dataset **Pet Faces**, derivado do dataset de animais de estimação [Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/). Este contém 35 raças diferentes de cães e gatos.
Vamos utilizar o [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), que contém imagens de 37 raças diferentes de cães e gatos.
![Dataset com o qual iremos trabalhar](../../../../../../lessons/4-ComputerVision/07-ConvNets/lab/images/data.png)
![Dataset com que iremos trabalhar](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.pt.png)
Para descarregar o dataset, utilize este trecho de código:
@ -31,13 +31,17 @@ Para descarregar o dataset, utilize este trecho de código:
!rm images.tar.gz
```
**Nota:** As imagens do Oxford-IIIT Pet Dataset estão organizadas por nome de ficheiro (por exemplo, `Abyssinian_1.jpg`, `Bengal_2.jpg`). O notebook inclui código para organizar estas imagens em subdiretórios específicos de cada raça para facilitar a classificação.
## Notebook Inicial
Comece o laboratório abrindo [PetFaces.ipynb](../../../../../../lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb)
Comece o laboratório abrindo [PetFaces.ipynb](PetFaces.ipynb)
## Conclusão
Conseguiu resolver um problema relativamente complexo de classificação de imagens do zero! Havia bastantes classes, e ainda assim conseguiu obter uma precisão razoável! Também faz sentido medir a precisão top-k, porque é fácil confundir algumas classes que não são claramente diferentes, mesmo para seres humanos.
**Aviso Legal**:
Este documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, é importante notar que traduções automáticas podem conter erros ou imprecisões. O documento original na sua língua nativa deve ser considerado a fonte autoritária. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações incorretas decorrentes do uso desta tradução.
---
**Aviso**:
Este documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automáticas podem conter erros ou imprecisões. O documento original na sua língua nativa deve ser considerado a fonte autoritária. Para informações críticas, recomenda-se uma tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações incorretas decorrentes do uso desta tradução.

View File

@ -6,11 +6,13 @@
"source": [
"# Clasificarea Fețelor Animalelor de Companie\n",
"\n",
"Temă de laborator din [AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners).\n",
"Temă de laborator din [Curriculum AI pentru Începători](https://github.com/microsoft/ai-for-beginners).\n",
"\n",
"### Obținerea Datelor\n",
"\n",
"În această temă, ne vom concentra pe o sarcină de clasificare relativ simplă - clasificarea fețelor animalelor de companie. Acest set de date constă în fețe decupate din [Oxford-IIIT Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/). Să începem prin a încărca și vizualiza setul de date.\n"
"În această temă, ne vom concentra pe o sarcină relativ simplă de clasificare - clasificarea fețelor animalelor de companie. Vom folosi [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), care conține imagini ale 37 de rase diferite de câini și pisici. Să începem prin descărcarea și vizualizarea setului de date.\n",
"\n",
"**Notă:** Setul de date Oxford-IIIT Pet conține imagini complete ale animalelor de companie. Imaginile vor fi organizate pe rase în folderul extras.\n"
]
},
{
@ -86,6 +88,24 @@
"metadata": {},
"outputs": [],
"source": [
"# Note: The Oxford-IIIT Pet Dataset extracts to a folder named 'images'\n",
"# Images are named by breed (e.g., 'Abyssinian_1.jpg')\n",
"# We need to organize them into breed-specific subdirectories\n",
"import os\n",
"from collections import defaultdict\n",
"\n",
"# Organize images by breed\n",
"if not os.path.exists('petfaces'):\n",
" os.makedirs('petfaces')\n",
" for img_file in os.listdir('images'):\n",
" if img_file.endswith(('.jpg', '.png')):\n",
" # Extract breed name from filename (everything before the last underscore and number)\n",
" breed = '_'.join(img_file.split('_')[:-1])\n",
" breed_dir = os.path.join('petfaces', breed)\n",
" if not os.path.exists(breed_dir):\n",
" os.makedirs(breed_dir)\n",
" os.rename(os.path.join('images', img_file), os.path.join(breed_dir, img_file))\n",
"\n",
"for cls in os.listdir('petfaces'):\n",
" print(cls)\n",
" display_images([Image.open(os.path.join('petfaces',cls,x)) \n",
@ -130,7 +150,7 @@
"* În Tensorflow, folosiți `tf.keras.preprocessing.image_dataset_from_directory`\n",
"* În PyTorch, folosiți `torchvision.datasets.ImageFolder`\n",
"\n",
"Așa cum ați observat din imaginile de mai sus, toate au un raport apropiat de cel al imaginilor pătrate, așa că trebuie să redimensionăm toate imaginile la dimensiunea pătrată. De asemenea, putem organiza imaginile în minibatch-uri.\n"
"După cum ați observat din imaginile de mai sus, toate au un raport apropiat de cel al imaginilor pătrate, așa că trebuie să redimensionăm toate imaginile la dimensiunea pătrată. De asemenea, putem organiza imaginile în minibatch-uri.\n"
]
},
{
@ -230,14 +250,14 @@
"source": [
"## Definirea unei rețele neuronale\n",
"\n",
"Pentru clasificarea imaginilor, ar trebui să definești probabil o rețea neuronală convoluțională cu mai multe straturi. Ce trebuie să ai în vedere:\n",
"* Ține cont de arhitectura piramidală, adică numărul de filtre ar trebui să crească pe măsură ce mergi mai adânc.\n",
"* Nu uita funcțiile de activare între straturi (ReLU) și Max Pooling.\n",
"Pentru clasificarea imaginilor, ar trebui să defini probabil o rețea neuronală convoluțională cu mai multe straturi. Ce trebuie să aveți în vedere:\n",
"* Țineți cont de arhitectura piramidală, adică numărul de filtre ar trebui să crească pe măsură ce mergi mai adânc.\n",
"* Nu uitați funcțiile de activare între straturi (ReLU) și Max Pooling.\n",
"* Clasificatorul final poate fi cu sau fără straturi ascunse, dar numărul de neuroni de ieșire trebuie să fie egal cu numărul de clase.\n",
"\n",
"Un aspect important este să alegi corect funcția de activare pentru ultimul strat + funcția de pierdere:\n",
"* În Tensorflow, poți folosi `softmax` ca funcție de activare și `sparse_categorical_crossentropy` ca funcție de pierdere. Diferența dintre sparse categorical cross-entropy și cea non-sparse este că prima așteaptă ca ieșirea să fie numărul clasei, nu un vector one-hot.\n",
"* În PyTorch, poți avea stratul final fără funcție de activare și să folosești funcția de pierdere `CrossEntropyLoss`. Această funcție aplică automat softmax.\n"
"Un aspect important este să setați corect funcția de activare pe ultimul strat + funcția de pierdere:\n",
"* În Tensorflow, puteți utiliza `softmax` ca funcție de activare și `sparse_categorical_crossentropy` ca funcție de pierdere. Diferența dintre sparse categorical cross-entropy și varianta non-sparse este că prima așteaptă ieșirea sub formă de număr al clasei, și nu ca vector one-hot.\n",
"* În PyTorch, puteți avea stratul final fără funcție de activare și să utilizați funcția de pierdere `CrossEntropyLoss`. Această funcție aplică automat softmax.\n"
]
},
{
@ -255,9 +275,9 @@
"source": [
"## Antrenează Rețeaua Neurală\n",
"\n",
"Acum suntem pregătiți să antrenăm rețeaua neurală. În timpul antrenamentului, te rog să colectezi acuratețea pe datele de antrenament și test pentru fiecare epocă, apoi să reprezinți grafic acuratețea pentru a verifica dacă apare overfitting.\n",
"Acum suntem pregătiți să antrenăm rețeaua neurală. În timpul antrenării, te rog să colectezi acuratețea pe datele de antrenament și test la fiecare epocă, și apoi să reprezinți grafic acuratețea pentru a verifica dacă există supraînvățare.\n",
"\n",
"> Pentru a accelera antrenamentul, este necesar să folosești GPU, dacă este disponibil. În timp ce TensorFlow/Keras va utiliza automat GPU-ul, în PyTorch trebuie să muți atât modelul, cât și datele pe GPU în timpul antrenamentului folosind metoda `.to()` pentru a beneficia de accelerarea oferită de GPU.\n"
"> Pentru a accelera procesul de antrenare, trebuie să folosești GPU dacă este disponibil. În timp ce TensorFlow/Keras va utiliza automat GPU-ul, în PyTorch trebuie să muți atât modelul, cât și datele pe GPU în timpul antrenării folosind metoda `.to()` pentru a beneficia de accelerarea GPU.\n"
]
},
{
@ -295,20 +315,20 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Ce poți spune despre overfitting? Ce se poate face pentru a îmbunătăți acuratețea modelului?\n",
"Ce poți spune despre supraînvățare? Ce se poate face pentru a îmbunătăți acuratețea modelului?\n",
"\n",
"## Opțional: Calcularea Acurateței Top-3\n",
"## Opțional: Calculați Acuratețea Top3\n",
"\n",
"În acest exercițiu, am lucrat cu o clasificare care implică un număr destul de mare de clase (35), așa că rezultatul nostru - aproximativ 50% acuratețe pe setul de validare - este destul de bun. Setul de date standard ImageNet are chiar mai multe clase - 1000.\n",
"În acest exercițiu, ne-am ocupat de clasificare cu un număr destul de mare de clase (35), astfel încât rezultatul nostru - aproximativ 50% acuratețe pe setul de validare - este destul de bun. Dataset-ul standard ImageNet are chiar mai multe - 1000 de clase.\n",
"\n",
"În astfel de cazuri, este dificil să ne asigurăm că modelul **întotdeauna** prezice corect clasa. Există situații în care două rase sunt foarte similare între ele, iar modelul returnează probabilități foarte apropiate (de exemplu, 0.45 și 0.43). Dacă măsurăm acuratețea standard, acest caz va fi considerat greșit, chiar dacă modelul a făcut o greșeală foarte mică. Din acest motiv, măsurăm adesea o altă metrică - o acuratețe în cadrul celor mai probabile 3 predicții ale modelului.\n",
"În astfel de cazuri, este dificil să ne asigurăm că modelul **întotdeauna** prezice corect clasa. Există situații în care două rase sunt foarte asemănătoare între ele, iar modelul returnează probabilități foarte apropiate (de exemplu, 0.45 și 0.43). Dacă măsurăm acuratețea standard, acest caz va fi considerat greșit, chiar dacă modelul a făcut o eroare foarte mică. De aceea, măsurăm adesea o altă metrică - acuratețea în cadrul celor mai probabile 3 predicții ale modelului.\n",
"\n",
"Considerăm cazul ca fiind corect dacă eticheta țintă se află în primele 3 predicții ale modelului.\n",
"\n",
"Pentru a calcula acuratețea top-3 pe setul de date de testare, trebuie să parcurgi manual setul de date, să aplici rețeaua neuronală pentru a obține predicția și apoi să faci calculele. Câteva sugestii:\n",
"Pentru a calcula acuratețea top-3 pe setul de date de testare, trebuie să parcurgi manual setul de date, să aplici rețeaua neuronală pentru a obține predicția și apoi să faci calculele. Câteva sugestii:\n",
"\n",
"* În Tensorflow, folosește funcția `tf.nn.in_top_k` pentru a verifica dacă `predictions` (ieșirea modelului) se află în top-k (transmite `k=3` ca parametru), în raport cu `targets`. Această funcție returnează un tensor de valori booleene, care pot fi convertite în `int` folosind `tf.cast`, și apoi acumulate folosind `tf.reduce_sum`.\n",
"* În PyTorch, poți folosi funcția `torch.topk` pentru a obține indicii claselor cu cele mai mari probabilități și apoi să verifici dacă clasa corectă se află printre acestea. Vezi [aici](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) pentru mai multe sugestii.\n"
"* În Tensorflow, utilizați funcția `tf.nn.in_top_k` pentru a verifica dacă `predictions` (ieșirea modelului) se află în top-k (treceți `k=3` ca parametru), în raport cu `targets`. Această funcție returnează un tensor de valori booleene, care poate fi convertit în `int` folosind `tf.cast`, și apoi acumulat folosind `tf.reduce_sum`.\n",
"* În PyTorch, puteți utiliza funcția `torch.topk` pentru a obține indicii claselor cu cele mai mari probabilități și apoi să verificați dacă clasa corectă se află printre acestea. Consultați [acest](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) link pentru mai multe sugestii.\n"
]
},
{
@ -326,7 +346,7 @@
"source": [
"## Opțional: Construirea clasificării Pisici vs. Câini\n",
"\n",
"De asemenea, vrem să vedem cât de precisă ar fi clasificarea noastră binară pisici vs. câini pe același set de date. Pentru a face acest lucru, trebuie să ajustăm etichetele:\n"
"De asemenea, dorim să vedem cât de precisă ar fi clasificarea noastră binară Pisici vs. Câini pe același set de date. Pentru a face acest lucru, trebuie să ajustăm etichetele:\n"
]
},
{
@ -352,7 +372,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Declinare de responsabilitate**: \nAcest document a fost tradus folosind serviciul de traducere AI [Co-op Translator](https://github.com/Azure/co-op-translator). Deși ne străduim să asigurăm acuratețea, vă rugăm să rețineți că traducerile automate pot conține erori sau inexactități. Documentul original în limba sa natală ar trebui considerat sursa autoritară. Pentru informații critice, se recomandă traducerea profesională realizată de un specialist uman. Nu ne asumăm responsabilitatea pentru eventualele neînțelegeri sau interpretări greșite care pot apărea din utilizarea acestei traduceri.\n"
"\n---\n\n**Declinare de responsabilitate**: \nAcest document a fost tradus folosind serviciul de traducere AI [Co-op Translator](https://github.com/Azure/co-op-translator). Deși ne străduim să asigurăm acuratețea, vă rugăm să fiți conștienți că traducerile automate pot conține erori sau inexactități. Documentul original în limba sa natală ar trebui considerat sursa autoritară. Pentru informații critice, se recomandă traducerea profesională realizată de un specialist. Nu ne asumăm responsabilitatea pentru eventualele neînțelegeri sau interpretări greșite care pot apărea din utilizarea acestei traduceri.\n"
]
}
],
@ -378,8 +398,8 @@
"version": "3.9.5"
},
"coopTranslator": {
"original_hash": "1de3ae931831253c3198d899da48bfe5",
"translation_date": "2025-08-29T23:13:16+00:00",
"original_hash": "df7d1f7da8d2617b76acd93115776ca4",
"translation_date": "2025-10-03T14:46:17+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb",
"language_code": "ro"
}

View File

@ -1,29 +1,29 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "f3d2cee9cb3c52160419e560c57a690e",
"translation_date": "2025-08-25T22:58:20+00:00",
"original_hash": "b70fcf7fcee862990f848c679090943f",
"translation_date": "2025-10-03T14:57:43+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/README.md",
"language_code": "ro"
}
-->
# Clasificarea Fețelor Animalelor de Companie
Temă de laborator din [AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners).
Temă de laborator din [Curriculum AI pentru Începători](https://github.com/microsoft/ai-for-beginners).
## Sarcina
Imaginează-ți că trebuie să dezvolți o aplicație pentru o grădiniță de animale de companie, pentru a cataloga toate animalele. Una dintre funcționalitățile grozave ale unei astfel de aplicații ar fi identificarea automată a rasei dintr-o fotografie. Acest lucru poate fi realizat cu succes folosind rețele neuronale.
Imaginează-ți că trebuie să dezvolți o aplicație pentru o grădiniță de animale de companie pentru a cataloga toate animalele. Una dintre funcțiile grozave ale unei astfel de aplicații ar fi identificarea automată a rasei dintr-o fotografie. Acest lucru poate fi realizat cu succes folosind rețele neuronale.
Trebuie să antrenezi o rețea neuronală convoluțională pentru a clasifica diferite rase de pisici și câini utilizând setul de date **Pet Faces**.
Trebuie să antrenezi o rețea neuronală convoluțională pentru a clasifica diferite rase de pisici și câini utilizând dataset-ul **Pet Faces**.
## Setul de Date
## Dataset-ul
Vom folosi setul de date **Pet Faces**, derivat din setul de date pentru animale de companie [Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/). Acesta conține 35 de rase diferite de câini și pisici.
Vom folosi [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), care conține imagini ale 37 de rase diferite de câini și pisici.
![Setul de date cu care vom lucra](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.ro.png)
![Dataset-ul cu care vom lucra](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.ro.png)
Pentru a descărca setul de date, folosește acest fragment de cod:
Pentru a descărca dataset-ul, folosește acest fragment de cod:
```python
!wget https://thor.robots.ox.ac.uk/~vgg/data/pets/images.tar.gz
@ -31,13 +31,17 @@ Pentru a descărca setul de date, folosește acest fragment de cod:
!rm images.tar.gz
```
**Notă:** Imaginile din Oxford-IIIT Pet Dataset sunt organizate după numele fișierului (de exemplu, `Abyssinian_1.jpg`, `Bengal_2.jpg`). Notebook-ul include cod pentru organizarea acestor imagini în subdirectoare specifice rasei pentru o clasificare mai ușoară.
## Notebook-ul de Start
Începe laboratorul deschizând [PetFaces.ipynb](../../../../../../lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb)
Începe laboratorul deschizând [PetFaces.ipynb](PetFaces.ipynb)
## Concluzie
Ai rezolvat o problemă relativ complexă de clasificare a imaginilor de la zero! Au fost destul de multe clase, și totuși ai reușit să obții o acuratețe rezonabilă! De asemenea, are sens să măsori acuratețea top-k, deoarece este ușor să confunzi unele clase care nu sunt clar diferite nici măcar pentru oameni.
---
**Declinare de responsabilitate**:
Acest document a fost tradus folosind serviciul de traducere AI [Co-op Translator](https://github.com/Azure/co-op-translator). Deși ne străduim să asigurăm acuratețea, vă rugăm să fiți conștienți că traducerile automate pot conține erori sau inexactități. Documentul original în limba sa natală ar trebui considerat sursa autoritară. Pentru informații critice, se recomandă traducerea profesională realizată de un specialist uman. Nu ne asumăm responsabilitatea pentru eventualele neînțelegeri sau interpretări greșite care pot apărea din utilizarea acestei traduceri.
Acest document a fost tradus folosind serviciul de traducere AI [Co-op Translator](https://github.com/Azure/co-op-translator). Deși ne străduim să asigurăm acuratețea, vă rugăm să fiți conștienți că traducerile automate pot conține erori sau inexactități. Documentul original în limba sa maternă ar trebui considerat sursa autoritară. Pentru informații critice, se recomandă traducerea profesională realizată de un specialist. Nu ne asumăm responsabilitatea pentru eventualele neînțelegeri sau interpretări greșite care pot apărea din utilizarea acestei traduceri.

View File

@ -10,7 +10,9 @@
"\n",
"### Получение данных\n",
"\n",
"В этом задании мы сосредоточимся на относительно простой задаче классификации — классификации лиц домашних животных. Этот набор данных состоит из вырезанных лиц из [Oxford-IIIT Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/). Давайте начнем с загрузки и визуализации набора данных.\n"
"В этом задании мы сосредоточимся на относительно простой задаче — классификации лиц домашних животных. Мы будем использовать [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), который содержит изображения 37 различных пород собак и кошек. Давайте начнем с загрузки и визуализации набора данных.\n",
"\n",
"**Примечание:** Набор данных Oxford-IIIT Pet Dataset содержит изображения домашних животных целиком. В извлеченной папке изображения будут организованы по породам.\n"
]
},
{
@ -46,7 +48,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Мы определим универсальную функцию для отображения серии изображений из списка:\n"
"Мы определим общую функцию для отображения серии изображений из списка:\n"
]
},
{
@ -77,7 +79,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Теперь давайте пройдемся по всем подкаталогам классов и построим графики первых нескольких изображений каждого класса:\n"
"Теперь давайте пройдем по всем подкаталогам классов и построим графики первых нескольких изображений каждого класса:\n"
]
},
{
@ -86,6 +88,24 @@
"metadata": {},
"outputs": [],
"source": [
"# Note: The Oxford-IIIT Pet Dataset extracts to a folder named 'images'\n",
"# Images are named by breed (e.g., 'Abyssinian_1.jpg')\n",
"# We need to organize them into breed-specific subdirectories\n",
"import os\n",
"from collections import defaultdict\n",
"\n",
"# Organize images by breed\n",
"if not os.path.exists('petfaces'):\n",
" os.makedirs('petfaces')\n",
" for img_file in os.listdir('images'):\n",
" if img_file.endswith(('.jpg', '.png')):\n",
" # Extract breed name from filename (everything before the last underscore and number)\n",
" breed = '_'.join(img_file.split('_')[:-1])\n",
" breed_dir = os.path.join('petfaces', breed)\n",
" if not os.path.exists(breed_dir):\n",
" os.makedirs(breed_dir)\n",
" os.rename(os.path.join('images', img_file), os.path.join(breed_dir, img_file))\n",
"\n",
"for cls in os.listdir('petfaces'):\n",
" print(cls)\n",
" display_images([Image.open(os.path.join('petfaces',cls,x)) \n",
@ -230,13 +250,13 @@
"source": [
"## Определение нейронной сети\n",
"\n",
"Для классификации изображений, скорее всего, вам нужно определить сверточную нейронную сеть с несколькими слоями. На что стоит обратить внимание:\n",
"Для классификации изображений лучше всего определить сверточную нейронную сеть с несколькими слоями. На что стоит обратить внимание:\n",
"* Учитывайте пирамидальную архитектуру, то есть количество фильтров должно увеличиваться с углублением сети.\n",
"* Не забывайте про функции активации между слоями (ReLU) и Max Pooling.\n",
"* Финальный классификатор может быть с скрытыми слоями или без них, но количество выходных нейронов должно соответствовать количеству классов.\n",
"\n",
"Важно правильно настроить функцию активации на последнем слое и функцию потерь:\n",
"* В Tensorflow можно использовать `softmax` в качестве функции активации и `sparse_categorical_crossentropy` в качестве функции потерь. Разница между sparse categorical cross-entropy и обычной заключается в том, что первая ожидает выход в виде номера класса, а не в виде one-hot вектора.\n",
"Важно правильно выбрать функцию активации на последнем слое и функцию потерь:\n",
"* В Tensorflow можно использовать `softmax` как функцию активации и `sparse_categorical_crossentropy` как функцию потерь. Разница между sparse categorical cross-entropy и обычной заключается в том, что первая ожидает выход в виде номера класса, а не в виде one-hot вектора.\n",
"* В PyTorch финальный слой может быть без функции активации, а в качестве функции потерь можно использовать `CrossEntropyLoss`. Эта функция автоматически применяет softmax.\n"
]
},
@ -255,9 +275,9 @@
"source": [
"## Обучение нейронной сети\n",
"\n",
"Теперь мы готовы приступить к обучению нейронной сети. Во время обучения собирайте данные об accuracy на обучающем и тестовом наборах на каждой эпохе, а затем постройте график accuracy, чтобы проверить, нет ли переобучения.\n",
"Теперь мы готовы обучить нейронную сеть. Во время обучения собирайте данные о точности на обучающей и тестовой выборках на каждой эпохе, а затем постройте график точности, чтобы проверить, есть ли переобучение.\n",
"\n",
"> Чтобы ускорить процесс обучения, необходимо использовать GPU, если он доступен. В то время как TensorFlow/Keras автоматически используют GPU, в PyTorch нужно вручную перенести как модель, так и данные на GPU во время обучения с помощью метода `.to()`, чтобы воспользоваться ускорением GPU.\n"
"> Чтобы ускорить обучение, необходимо использовать GPU, если он доступен. В то время как TensorFlow/Keras автоматически используют GPU, в PyTorch нужно переместить как модель, так и данные на GPU во время обучения с помощью метода `.to()`, чтобы воспользоваться ускорением GPU.\n"
]
},
{
@ -295,20 +315,20 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Что можно сказать о переобучении? Что можно сделать для улучшения точности модели?\n",
"Что можно сказать о переобучении? Что можно сделать для повышения точности модели?\n",
"\n",
"## Опционально: Рассчитать Top-3 точность\n",
"\n",
"В этом упражнении мы работали с классификацией, где было довольно много классов (35), поэтому наш результат - около 50% точности на валидации - довольно хороший. Стандартный набор данных ImageNet содержит еще больше - 1000 классов.\n",
"В этом упражнении мы работали с классификацией, где довольно большое количество классов (35), поэтому наш результат — около 50% точности на валидации — довольно хороший. Стандартный набор данных ImageNet содержит еще больше 1000 классов.\n",
"\n",
"В таких случаях сложно гарантировать, что модель **всегда** правильно предсказывает класс. Бывают ситуации, когда две породы очень похожи друг на друга, и модель возвращает очень близкие вероятности (например, 0.45 и 0.43). Если мы измеряем стандартную точность, это будет считаться ошибкой, даже если модель допустила совсем небольшую погрешность. Поэтому часто измеряют другую метрику - точность в пределах трех наиболее вероятных предсказаний модели.\n",
"В таких случаях сложно гарантировать, что модель **всегда** правильно предсказывает класс. Бывают ситуации, когда две породы очень похожи друг на друга, и модель возвращает очень близкие вероятности (например, 0.45 и 0.43). Если мы измеряем стандартную точность, это будет считаться ошибкой, хотя модель допустила совсем небольшую погрешность. Поэтому часто измеряют другую метрику точность в пределах трех наиболее вероятных предсказаний модели.\n",
"\n",
"Мы считаем случай точным, если целевая метка содержится в топ-3 предсказаниях модели.\n",
"Мы считаем случай точным, если целевая метка содержится в трех наиболее вероятных предсказаниях модели.\n",
"\n",
"Чтобы вычислить top-3 точность на тестовом наборе данных, нужно вручную пройтись по набору данных, применить нейронную сеть для получения предсказаний, а затем выполнить расчеты. Несколько подсказок:\n",
"Чтобы вычислить top-3 точность на тестовом наборе данных, вам нужно вручную пройтись по набору данных, применить нейронную сеть для получения предсказаний, а затем выполнить расчеты. Несколько подсказок:\n",
"\n",
"* В Tensorflow используйте функцию `tf.nn.in_top_k`, чтобы проверить, находятся ли `predictions` (выход модели) в топ-k (передайте `k=3` в качестве параметра) относительно `targets`. Эта функция возвращает тензор булевых значений, который можно преобразовать в `int` с помощью `tf.cast`, а затем накопить с использованием `tf.reduce_sum`.\n",
"* В PyTorch можно использовать функцию `torch.topk`, чтобы получить индексы классов с наибольшими вероятностями, а затем проверить, принадлежит ли правильный класс этим индексам. Смотрите [здесь](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) для дополнительных подсказок.\n"
"* В Tensorflow используйте функцию `tf.nn.in_top_k`, чтобы проверить, находятся ли `predictions` (выход модели) в top-k (передайте `k=3` в качестве параметра) относительно `targets`. Эта функция возвращает тензор булевых значений, который можно преобразовать в `int` с помощью `tf.cast`, а затем накопить с использованием `tf.reduce_sum`.\n",
"* В PyTorch можно использовать функцию `torch.topk`, чтобы получить индексы классов с наибольшими вероятностями, а затем проверить, принадлежит ли правильный класс к этим индексам. Смотрите [здесь](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) для дополнительных подсказок.\n"
]
},
{
@ -324,9 +344,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## Дополнительно: Создание классификации \"Кошки против собак\"\n",
"## Дополнительно: Создание классификации «Кошки против собак»\n",
"\n",
"Мы также хотим проверить, насколько точной будет наша бинарная классификация \"кошки против собак\" на том же наборе данных. Для этого нам нужно изменить метки:\n"
"Мы также хотим проверить, насколько точной будет наша бинарная классификация «кошки против собак» на том же наборе данных. Для этого нам нужно изменить метки:\n"
]
},
{
@ -352,7 +372,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Отказ от ответственности**: \nЭтот документ был переведен с помощью сервиса автоматического перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Несмотря на наши усилия по обеспечению точности, пожалуйста, учитывайте, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникшие в результате использования данного перевода.\n"
"\n---\n\n**Отказ от ответственности**: \nЭтот документ был переведен с использованием сервиса автоматического перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Хотя мы стремимся к точности, пожалуйста, учитывайте, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникшие в результате использования данного перевода.\n"
]
}
],
@ -378,8 +398,8 @@
"version": "3.9.5"
},
"coopTranslator": {
"original_hash": "1de3ae931831253c3198d899da48bfe5",
"translation_date": "2025-08-28T10:53:49+00:00",
"original_hash": "df7d1f7da8d2617b76acd93115776ca4",
"translation_date": "2025-10-03T14:26:28+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb",
"language_code": "ru"
}

View File

@ -1,25 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "f3d2cee9cb3c52160419e560c57a690e",
"translation_date": "2025-08-26T06:42:15+00:00",
"original_hash": "b70fcf7fcee862990f848c679090943f",
"translation_date": "2025-10-03T14:52:11+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/README.md",
"language_code": "ru"
}
-->
# Классификация лиц домашних животных
Лабораторная работа из [AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners).
Лабораторная работа из [Учебной программы "ИИ для начинающих"](https://github.com/microsoft/ai-for-beginners).
## Задача
Представьте, что вам нужно разработать приложение для питомника, чтобы каталогизировать всех животных. Одной из замечательных функций такого приложения может быть автоматическое определение породы по фотографии. Это можно успешно реализовать с помощью нейронных сетей.
Представьте, что вам нужно разработать приложение для питомника, чтобы каталогизировать всех животных. Одной из замечательных функций такого приложения могла бы быть автоматическая идентификация породы по фотографии. Это можно успешно реализовать с помощью нейронных сетей.
Вам нужно обучить сверточную нейронную сеть для классификации различных пород кошек и собак, используя набор данных **Pet Faces**.
## Набор данных
Мы будем использовать набор данных **Pet Faces**, созданный на основе [Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/) набора данных о домашних животных. Он содержит 35 различных пород собак и кошек.
Мы будем использовать [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), который содержит изображения 37 различных пород собак и кошек.
![Набор данных, с которым мы будем работать](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.ru.png)
@ -31,13 +31,17 @@ CO_OP_TRANSLATOR_METADATA:
!rm images.tar.gz
```
**Примечание:** Изображения в наборе данных Oxford-IIIT Pet Dataset организованы по имени файла (например, `Abyssinian_1.jpg`, `Bengal_2.jpg`). В ноутбуке есть код, который организует эти изображения в подкаталоги, соответствующие породам, для упрощения классификации.
## Начало работы с ноутбуком
Начните лабораторную работу, открыв [PetFaces.ipynb](../../../../../../lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb)
Начните лабораторную работу, открыв [PetFaces.ipynb](PetFaces.ipynb)
## Итог
Вы решили достаточно сложную задачу классификации изображений с нуля! Было довольно много классов, и вам удалось достичь разумной точности! Также имеет смысл измерить top-k точность, так как легко перепутать некоторые классы, которые даже для человека не очевидно различимы.
Вы решили достаточно сложную задачу классификации изображений с нуля! Было довольно много классов, и вам все равно удалось достичь разумной точности! Также имеет смысл измерять точность top-k, потому что легко спутать некоторые классы, которые даже для человека не очевидно различимы.
---
**Отказ от ответственности**:
Этот документ был переведен с использованием сервиса автоматического перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Хотя мы стремимся к точности, пожалуйста, учитывайте, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникающие в результате использования данного перевода.
Этот документ был переведен с помощью сервиса автоматического перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Несмотря на наши усилия обеспечить точность, автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникшие в результате использования данного перевода.

View File

@ -4,13 +4,15 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"# Klasifikácia tvárí domácich miláčikov\n",
"# Klasifikácia tvárí domácich zvierat\n",
"\n",
"Laboratórna úloha z [AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners).\n",
"\n",
"### Získavanie údajov\n",
"### Získanie údajov\n",
"\n",
"V tejto úlohe sa zameriame na relatívne jednoduchú klasifikačnú úlohu - klasifikáciu tvárí domácich miláčikov. Tento dataset pozostáva z výrezov tvárí z [Oxford-IIIT Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/). Začnime načítaním a vizualizáciou datasetu.\n"
"V tejto úlohe sa zameriame na relatívne jednoduchú klasifikačnú úlohu - klasifikáciu tvárí domácich zvierat. Použijeme [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), ktorý obsahuje obrázky 37 rôznych plemien psov a mačiek. Začnime stiahnutím a vizualizáciou datasetu.\n",
"\n",
"**Note:** Dataset Oxford-IIIT Pet obsahuje kompletné obrázky domácich zvierat. Obrázky budú v extrahovanom priečinku usporiadané podľa plemien.\n"
]
},
{
@ -46,7 +48,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Definujeme generickú funkciu na zobrazenie série obrázkov zo zoznamu:\n"
"Definujeme všeobecnú funkciu na zobrazenie série obrázkov zo zoznamu:\n"
]
},
{
@ -86,6 +88,24 @@
"metadata": {},
"outputs": [],
"source": [
"# Note: The Oxford-IIIT Pet Dataset extracts to a folder named 'images'\n",
"# Images are named by breed (e.g., 'Abyssinian_1.jpg')\n",
"# We need to organize them into breed-specific subdirectories\n",
"import os\n",
"from collections import defaultdict\n",
"\n",
"# Organize images by breed\n",
"if not os.path.exists('petfaces'):\n",
" os.makedirs('petfaces')\n",
" for img_file in os.listdir('images'):\n",
" if img_file.endswith(('.jpg', '.png')):\n",
" # Extract breed name from filename (everything before the last underscore and number)\n",
" breed = '_'.join(img_file.split('_')[:-1])\n",
" breed_dir = os.path.join('petfaces', breed)\n",
" if not os.path.exists(breed_dir):\n",
" os.makedirs(breed_dir)\n",
" os.rename(os.path.join('images', img_file), os.path.join(breed_dir, img_file))\n",
"\n",
"for cls in os.listdir('petfaces'):\n",
" print(cls)\n",
" display_images([Image.open(os.path.join('petfaces',cls,x)) \n",
@ -96,7 +116,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Definujme tiež počet tried v našej dátovej množine:\n"
"Poďme tiež definovať počet tried v našej dátovej sade:\n"
]
},
{
@ -162,7 +182,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Teraz si vypíšme veľkosti tenzorov v našej dátovej sade. Ak ste všetko vykonali správne, veľkosti tréningových prvkov by mali byť:\n",
"Teraz si vypíšme veľkosť tenzorov v našej dátovej sade. Ak ste všetko urobili správne, veľkosť tréningových prvkov by mala byť:\n",
" * `(batch_size,image_size,image_size,3)` pre Tensorflow, `batch_size,3,image_size,image_size` pre PyTorch\n",
" * `batch_size` pre štítky\n",
" \n",
@ -228,16 +248,16 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## Definovanie neurónovej siete\n",
"## Definujte neurónovú sieť\n",
"\n",
"Pre klasifikáciu obrázkov by ste pravdepodobne mali definovať konvolučnú neurónovú sieť s viacerými vrstvami. Na čo si dať pozor:\n",
"* Majte na pamäti pyramídovú architektúru, t.j. počet filtrov by sa mal zvyšovať, čím hlbšie idete.\n",
"Pre klasifikáciu obrázkov by ste mali pravdepodobne definovať konvolučnú neurónovú sieť s viacerými vrstvami. Na čo si dať pozor:\n",
"* Pamätajte na pyramídovú architektúru, t.j. počet filtrov by sa mal zvyšovať, čím idete hlbšie.\n",
"* Nezabudnite na aktivačné funkcie medzi vrstvami (ReLU) a Max Pooling.\n",
"* Konečný klasifikátor môže byť s alebo bez skrytých vrstiev, ale počet výstupných neurónov by mal byť rovný počtu tried.\n",
"\n",
"Dôležité je správne nastaviť aktivačnú funkciu na poslednej vrstve + stratovú funkciu:\n",
"* V Tensorflow môžete použiť `softmax` ako aktivačnú funkciu a `sparse_categorical_crossentropy` ako stratu. Rozdiel medzi sparse kategóriovou krížovou entropiou a nekategóriovou je v tom, že prvá očakáva výstup ako číslo triedy, a nie ako one-hot vektor.\n",
"* V PyTorch môžete mať poslednú vrstvu bez aktivačnej funkcie a použiť stratovú funkciu `CrossEntropyLoss`. Táto funkcia automaticky aplikuje softmax.\n"
"Dôležité je správne nastaviť aktivačnú funkciu na poslednej vrstve + funkciu straty:\n",
"* V Tensorflow môžete použiť `softmax` ako aktivačnú funkciu a `sparse_categorical_crossentropy` ako funkciu straty. Rozdiel medzi sparse categorical cross-entropy a nesparse verziou je v tom, že prvá očakáva výstup ako číslo triedy, nie ako one-hot vektor.\n",
"* V PyTorch môžete mať poslednú vrstvu bez aktivačnej funkcie a použiť funkciu straty `CrossEntropyLoss`. Táto funkcia automaticky aplikuje softmax.\n"
]
},
{
@ -255,9 +275,9 @@
"source": [
"## Trénovanie neurónovej siete\n",
"\n",
"Teraz sme pripravení na trénovanie neurónovej siete. Počas trénovania zbierajte presnosť na tréningových a testovacích dátach v každej epoche a následne vykreslite presnosť, aby ste zistili, či dochádza k pretrénovaniu.\n",
"Teraz sme pripravení na trénovanie neurónovej siete. Počas trénovania prosím zbierajte presnosť na tréningových a testovacích dátach v každej epoche a následne vykreslite presnosť, aby ste zistili, či dochádza k preťaženiu modelu.\n",
"\n",
"> Na urýchlenie trénovania je potrebné použiť GPU, ak je dostupné. Zatiaľ čo TensorFlow/Keras automaticky využijú GPU, v PyTorch je potrebné presunúť model aj dáta na GPU počas trénovania pomocou metódy `.to()`, aby ste využili akceleráciu GPU.\n"
"> Na urýchlenie trénovania je potrebné použiť GPU, ak je k dispozícii. Zatiaľ čo TensorFlow/Keras automaticky využije GPU, v PyTorch je potrebné presunúť model aj dáta na GPU počas trénovania pomocou metódy `.to()`, aby ste mohli využiť akceleráciu GPU.\n"
]
},
{
@ -297,17 +317,17 @@
"source": [
"Čo môžete povedať o overfittingu? Čo sa dá urobiť na zlepšenie presnosti modelu?\n",
"\n",
"## Voliteľné: Vypočítajte Top3 presnosť\n",
"## Voliteľné: Výpočet Top3 presnosti\n",
"\n",
"V tomto cvičení sme sa zaoberali klasifikáciou s pomerne vysokým počtom tried (35), takže náš výsledok - približne 50% validačná presnosť - je celkom dobrý. Štandardný dataset ImageNet má dokonca ešte viac - 1000 tried.\n",
"V tomto cvičení sme sa zaoberali klasifikáciou s pomerne vysokým počtom tried (35), takže náš výsledok - približne 50% validačná presnosť - je celkom dobrý. Štandardná ImageNet databáza má dokonca ešte viac - 1000 tried.\n",
"\n",
"V takýchto prípadoch je ťažké zabezpečiť, aby model **vždy** správne predpovedal triedu. Existujú situácie, keď sú dve plemená veľmi podobné a model vráti veľmi podobné pravdepodobnosti (napr. 0.45 a 0.43). Ak meriame štandardnú presnosť, bude to považované za nesprávny prípad, aj keď model urobil len malú chybu. Preto často meriame inú metriku - presnosť v rámci top 3 najpravdepodobnejších predpovedí modelu.\n",
"V takýchto prípadoch je ťažké zabezpečiť, aby model **vždy** správne predpovedal triedu. Existujú situácie, keď sú dve plemená veľmi podobné a model vráti veľmi podobné pravdepodobnosti (napr. 0,45 a 0,43). Ak meriame štandardnú presnosť, bude to považované za nesprávny prípad, aj keď model urobil len veľmi malú chybu. Preto často meriame inú metriku - presnosť v rámci top 3 najpravdepodobnejších predpovedí modelu.\n",
"\n",
"Prípad považujeme za presný, ak cieľový štítok je obsiahnutý v top 3 predpovediach modelu.\n",
"Prípad považujeme za presný, ak cieľová značka je obsiahnutá v top 3 predpovediach modelu.\n",
"\n",
"Na výpočet top-3 presnosti na testovacom datasete je potrebné manuálne prejsť dataset, aplikovať neurónovú sieť na získanie predpovede a potom vykonať výpočty. Niekoľko tipov:\n",
"Na výpočet top-3 presnosti na testovacej množine je potrebné manuálne prejsť dataset, aplikovať neurónovú sieť na získanie predpovede a potom vykonať výpočty. Niekoľko tipov:\n",
"\n",
"* V Tensorflow použite funkciu `tf.nn.in_top_k` na zistenie, či `predictions` (výstup modelu) sú v top-k (zadajte `k=3` ako parameter) vzhľadom na `targets`. Táto funkcia vráti tenzor boolean hodnôt, ktoré je možné konvertovať na `int` pomocou `tf.cast` a potom akumulovať pomocou `tf.reduce_sum`.\n",
"* V Tensorflow použite funkciu `tf.nn.in_top_k`, aby ste zistili, či `predictions` (výstup modelu) sú v top-k (zadajte `k=3` ako parameter) vzhľadom na `targets`. Táto funkcia vráti tenzor s hodnotami typu boolean, ktoré je možné konvertovať na `int` pomocou `tf.cast` a následne akumulovať pomocou `tf.reduce_sum`.\n",
"* V PyTorch môžete použiť funkciu `torch.topk` na získanie indexov tried s najvyššími pravdepodobnosťami a potom zistiť, či správna trieda patrí medzi ne. Pozrite si [toto](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) pre ďalšie tipy.\n"
]
},
@ -324,9 +344,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## Voliteľné: Vytvorte klasifikáciu Mačky vs. Psy\n",
"## Voliteľné: Vytvorte klasifikáciu mačky vs. psy\n",
"\n",
"Chceme tiež zistiť, aká presná by bola naša binárna klasifikácia mačky vs. psy na rovnakom datasete. Aby sme to dosiahli, musíme upraviť štítky:\n"
"Chceme tiež zistiť, aká presná by bola naša binárna klasifikácia mačky vs. psy na rovnakom datasete. Na to musíme upraviť štítky:\n"
]
},
{
@ -352,7 +372,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Upozornenie**: \nTento dokument bol preložený pomocou služby AI prekladu [Co-op Translator](https://github.com/Azure/co-op-translator). Aj keď sa snažíme o presnosť, prosím, berte na vedomie, že automatizované preklady môžu obsahovať chyby alebo nepresnosti. Pôvodný dokument v jeho rodnom jazyku by mal byť považovaný za autoritatívny zdroj. Pre kritické informácie sa odporúča profesionálny ľudský preklad. Nie sme zodpovední za žiadne nedorozumenia alebo nesprávne interpretácie vyplývajúce z použitia tohto prekladu.\n"
"\n---\n\n**Upozornenie**: \nTento dokument bol preložený pomocou služby AI prekladu [Co-op Translator](https://github.com/Azure/co-op-translator). Hoci sa snažíme o presnosť, prosím, berte na vedomie, že automatizované preklady môžu obsahovať chyby alebo nepresnosti. Pôvodný dokument v jeho rodnom jazyku by mal byť považovaný za autoritatívny zdroj. Pre kritické informácie sa odporúča profesionálny ľudský preklad. Nenesieme zodpovednosť za akékoľvek nedorozumenia alebo nesprávne interpretácie vyplývajúce z použitia tohto prekladu.\n"
]
}
],
@ -378,8 +398,8 @@
"version": "3.9.5"
},
"coopTranslator": {
"original_hash": "1de3ae931831253c3198d899da48bfe5",
"translation_date": "2025-08-29T23:12:42+00:00",
"original_hash": "df7d1f7da8d2617b76acd93115776ca4",
"translation_date": "2025-10-03T14:45:44+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb",
"language_code": "sk"
}

View File

@ -1,29 +1,29 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "f3d2cee9cb3c52160419e560c57a690e",
"translation_date": "2025-08-25T22:58:09+00:00",
"original_hash": "b70fcf7fcee862990f848c679090943f",
"translation_date": "2025-10-03T14:57:12+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/README.md",
"language_code": "sk"
}
-->
# Klasifikácia tvárí domácich miláčikov
# Klasifikácia tvárí domácich zvierat
Laboratórna úloha z [AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners).
## Úloha
Predstavte si, že potrebujete vyvinúť aplikáciu pre škôlku domácich miláčikov na katalogizáciu všetkých zvierat. Jednou z vynikajúcich funkcií takejto aplikácie by bolo automatické rozpoznávanie plemena z fotografie. Toto je možné úspešne dosiahnuť pomocou neurónových sietí.
Predstavte si, že potrebujete vyvinúť aplikáciu pre škôlku domácich zvierat na katalogizáciu všetkých zvierat. Jednou z výnimočných funkcií takejto aplikácie by bolo automatické rozpoznanie plemena z fotografie. Toto je možné úspešne dosiahnuť pomocou neurónových sietí.
Vašou úlohou je natrénovať konvolučnú neurónovú sieť na klasifikáciu rôznych plemien mačiek a psov pomocou datasetu **Pet Faces**.
Vašou úlohou je vytrénovať konvolučnú neurónovú sieť na klasifikáciu rôznych plemien mačiek a psov pomocou datasetu **Pet Faces**.
## Dataset
Použijeme dataset **Pet Faces**, ktorý je odvodený z datasetu domácich miláčikov [Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/). Obsahuje 35 rôznych plemien psov a mačiek.
Použijeme [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), ktorý obsahuje obrázky 37 rôznych plemien psov a mačiek.
![Dataset, s ktorým budeme pracovať](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.sk.png)
Na stiahnutie datasetu použite tento úryvok kódu:
Na stiahnutie datasetu použite tento kód:
```python
!wget https://thor.robots.ox.ac.uk/~vgg/data/pets/images.tar.gz
@ -31,13 +31,17 @@ Na stiahnutie datasetu použite tento úryvok kódu:
!rm images.tar.gz
```
**Poznámka:** Obrázky v Oxford-IIIT Pet Dataset sú organizované podľa názvu súboru (napr. `Abyssinian_1.jpg`, `Bengal_2.jpg`). Notebook obsahuje kód na usporiadanie týchto obrázkov do podadresárov podľa plemien pre jednoduchšiu klasifikáciu.
## Začiatok práce s notebookom
Začnite laboratórnu úlohu otvorením [PetFaces.ipynb](../../../../../../lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb)
Začnite laboratórnu úlohu otvorením [PetFaces.ipynb](PetFaces.ipynb)
## Záver
Vyriešili ste pomerne zložitý problém klasifikácie obrázkov od základov! Bolo tu veľa tried, a napriek tomu ste dokázali dosiahnuť rozumnú presnosť! Má tiež zmysel merať top-k presnosť, pretože je ľahké zameniť niektoré triedy, ktoré nie sú jasne odlišné ani pre ľudské oko.
Podarilo sa vám vyriešiť pomerne zložitý problém klasifikácie obrázkov od základu! Bolo tu veľa tried, a napriek tomu ste dokázali dosiahnuť rozumnú presnosť! Má tiež zmysel merať top-k presnosť, pretože je ľahké zameniť niektoré triedy, ktoré nie sú jasne odlišné ani pre ľudí.
---
**Upozornenie**:
Tento dokument bol preložený pomocou služby AI prekladu [Co-op Translator](https://github.com/Azure/co-op-translator). Aj keď sa snažíme o presnosť, prosím, berte na vedomie, že automatizované preklady môžu obsahovať chyby alebo nepresnosti. Pôvodný dokument v jeho rodnom jazyku by mal byť považovaný za autoritatívny zdroj. Pre kritické informácie sa odporúča profesionálny ľudský preklad. Nie sme zodpovední za akékoľvek nedorozumenia alebo nesprávne interpretácie vyplývajúce z použitia tohto prekladu.
Tento dokument bol preložený pomocou služby AI prekladu [Co-op Translator](https://github.com/Azure/co-op-translator). Hoci sa snažíme o presnosť, prosím, uvedomte si, že automatizované preklady môžu obsahovať chyby alebo nepresnosti. Pôvodný dokument v jeho pôvodnom jazyku by mal byť považovaný za autoritatívny zdroj. Pre kritické informácie sa odporúča profesionálny ľudský preklad. Nezodpovedáme za žiadne nedorozumenia alebo nesprávne interpretácie vyplývajúce z použitia tohto prekladu.

View File

@ -4,13 +4,15 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"# Klasifikacija obrazov hišnih ljubljenčkov\n",
"# Razvrščanje obrazov hišnih ljubljenčkov\n",
"\n",
"Laboratorijska naloga iz [Učnega načrta za začetnike v umetni inteligenci](https://github.com/microsoft/ai-for-beginners).\n",
"Laboratorijska naloga iz [Učnega načrta za začetnike v AI](https://github.com/microsoft/ai-for-beginners).\n",
"\n",
"### Pridobivanje podatkov\n",
"\n",
"V tej nalogi se bomo osredotočili na razmeroma preprosto nalogo klasifikacije - klasifikacijo obrazov hišnih ljubljenčkov. Ta podatkovni niz vsebuje izrezane obraze iz [Oxford-IIIT podatkovnega niza](https://www.robots.ox.ac.uk/~vgg/data/pets/). Začnimo z nalaganjem in vizualizacijo podatkovnega niza.\n"
"V tej nalogi se bomo osredotočili na razmeroma preprosto nalogo razvrščanja - razvrščanje obrazov hišnih ljubljenčkov. Uporabili bomo [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), ki vsebuje slike 37 različnih pasem psov in mačk. Začnimo z nalaganjem in vizualizacijo podatkovnega nabora.\n",
"\n",
"**Opomba:** Oxford-IIIT Pet Dataset vsebuje slike celotnih hišnih ljubljenčkov. Slike bodo v izvlečeni mapi organizirane po pasmah.\n"
]
},
{
@ -46,7 +48,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Opredelili bomo splošno funkcijo za prikaz serije slik iz seznama:\n"
"Opredelili bomo generično funkcijo za prikaz serije slik iz seznama:\n"
]
},
{
@ -86,6 +88,24 @@
"metadata": {},
"outputs": [],
"source": [
"# Note: The Oxford-IIIT Pet Dataset extracts to a folder named 'images'\n",
"# Images are named by breed (e.g., 'Abyssinian_1.jpg')\n",
"# We need to organize them into breed-specific subdirectories\n",
"import os\n",
"from collections import defaultdict\n",
"\n",
"# Organize images by breed\n",
"if not os.path.exists('petfaces'):\n",
" os.makedirs('petfaces')\n",
" for img_file in os.listdir('images'):\n",
" if img_file.endswith(('.jpg', '.png')):\n",
" # Extract breed name from filename (everything before the last underscore and number)\n",
" breed = '_'.join(img_file.split('_')[:-1])\n",
" breed_dir = os.path.join('petfaces', breed)\n",
" if not os.path.exists(breed_dir):\n",
" os.makedirs(breed_dir)\n",
" os.rename(os.path.join('images', img_file), os.path.join(breed_dir, img_file))\n",
"\n",
"for cls in os.listdir('petfaces'):\n",
" print(cls)\n",
" display_images([Image.open(os.path.join('petfaces',cls,x)) \n",
@ -124,13 +144,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## Priprava nabora podatkov za globoko učenje\n",
"## Priprava podatkovnega nabora za globoko učenje\n",
"\n",
"Za začetek treniranja naše nevronske mreže moramo vse slike pretvoriti v tenzorje, prav tako pa ustvariti tenzorje, ki ustrezajo oznakam (številkam razredov). Večina ogrodij za nevronske mreže vsebuje preprosta orodja za delo s slikami:\n",
"* V Tensorflow uporabite `tf.keras.preprocessing.image_dataset_from_directory`\n",
"* V PyTorch uporabite `torchvision.datasets.ImageFolder`\n",
"\n",
"Kot ste videli na zgornjih slikah, imajo vse slike razmeroma kvadratno razmerje, zato moramo vse slike spremeniti na kvadratno velikost. Prav tako lahko slike organiziramo v mini serije.\n"
"Kot ste videli na zgornjih slikah, imajo vse približno kvadratno razmerje, zato moramo vse slike spremeniti na kvadratno velikost. Prav tako lahko slike organiziramo v mini serije.\n"
]
},
{
@ -146,7 +166,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Zdaj moramo razdeliti podatkovni niz na učni in testni del:\n"
"Zdaj moramo razdeliti podatkovni niz na dele za učenje in testiranje:\n"
]
},
{
@ -162,7 +182,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Zdaj natisnimo velikost tenzorjev v našem podatkovnem naboru. Če ste vse naredili pravilno, bi morala biti velikost učnih elementov:\n",
"Zdaj natisnimo velikost tenzorjev v našem naboru podatkov. Če ste vse naredili pravilno, bi morala biti velikost elementov za učenje:\n",
" * `(batch_size,image_size,image_size,3)` za Tensorflow, `batch_size,3,image_size,image_size` za PyTorch\n",
" * `batch_size` za oznake\n",
" \n",
@ -228,16 +248,16 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## Določite nevronsko mrežo\n",
"## Definirajte nevronsko mrežo\n",
"\n",
"Za razvrščanje slik je priporočljivo definirati konvolucijsko nevronsko mrežo z več plastmi. Na kaj morate biti pozorni:\n",
"* Upoštevajte piramidno arhitekturo, tj. število filtrov naj se povečuje, ko greste globlje.\n",
"* Ne pozabite na aktivacijske funkcije med plastmi (ReLU) in Max Pooling.\n",
"* Končni klasifikator je lahko z ali brez skritih plasti, vendar mora število izhodnih nevronov ustrezati številu razredov.\n",
"* Končni klasifikator lahko vključuje ali ne vključuje skritih plasti, vendar mora biti število izhodnih nevronov enako številu razredov.\n",
"\n",
"Pomembno je pravilno nastaviti aktivacijsko funkcijo na zadnji plasti + funkcijo izgube:\n",
"* V Tensorflow lahko uporabite `softmax` kot aktivacijo in `sparse_categorical_crossentropy` kot funkcijo izgube. Razlika med sparse categorical cross-entropy in nesparse različico je v tem, da prva pričakuje izhod kot številko razreda, ne pa kot one-hot vektor.\n",
"* V PyTorch lahko zadnjo plast pustite brez aktivacijske funkcije in uporabite funkcijo izgube `CrossEntropyLoss`. Ta funkcija samodejno uporabi softmax.\n"
"Pomembno je pravilno nastaviti aktivacijsko funkcijo v zadnji plasti + funkcijo izgube:\n",
"* V Tensorflowu lahko uporabite `softmax` kot aktivacijsko funkcijo in `sparse_categorical_crossentropy` kot funkcijo izgube. Razlika med sparse categorical cross-entropy in nesparse različico je v tem, da prva pričakuje izhod kot številko razreda, ne kot one-hot vektor.\n",
"* V PyTorchu lahko zadnja plast nima aktivacijske funkcije, pri čemer uporabite funkcijo izgube `CrossEntropyLoss`. Ta funkcija samodejno uporabi softmax.\n"
]
},
{
@ -255,9 +275,9 @@
"source": [
"## Učite nevronsko mrežo\n",
"\n",
"Zdaj smo pripravljeni na učenje nevronske mreže. Med učenjem zbirajte natančnost na učnih in testnih podatkih za vsako epoho, nato pa narišite graf natančnosti, da preverite, ali prihaja do prekomernega prileganja.\n",
"Zdaj smo pripravljeni na učenje nevronske mreže. Med učenjem zbirajte natančnost na učnih in testnih podatkih za vsako epoho ter nato narišite graf natančnosti, da preverite, ali prihaja do prekomernega prileganja.\n",
"\n",
"> Za pospešitev učenja morate uporabiti GPU, če je na voljo. Medtem ko TensorFlow/Keras samodejno uporablja GPU, morate v PyTorch-u tako model kot podatke med učenjem premakniti na GPU z uporabo metode `.to()`, da izkoristite pospešek GPU.\n"
"> Za hitrejše učenje morate uporabiti GPU, če je na voljo. Medtem ko TensorFlow/Keras samodejno uporablja GPU, morate v PyTorch-u med učenjem model in podatke premakniti na GPU z uporabo metode `.to()`, da izkoristite pospešek GPU.\n"
]
},
{
@ -297,18 +317,18 @@
"source": [
"Kaj lahko povemo o prekomernem prileganju? Kaj lahko storimo za izboljšanje natančnosti modela?\n",
"\n",
"## Neobvezno: Izračunajte Top3 natančnost\n",
"## Izbirno: Izračunajte Top3 natančnost\n",
"\n",
"V tej vaji smo se ukvarjali s klasifikacijo z dokaj velikim številom razredov (35), zato je naš rezultat - približno 50 % natančnost validacije - kar dober. Standardni ImageNet nabor podatkov ima še več - 1000 razredov.\n",
"V tej vaji smo se ukvarjali s klasifikacijo z dokaj velikim številom razredov (35), zato je naš rezultat - približno 50 % natančnost validacije - precej dober. Standardni ImageNet nabor podatkov ima še več - 1000 razredov.\n",
"\n",
"V takšnih primerih je težko zagotoviti, da model **vedno** pravilno napove razred. Obstajajo primeri, ko sta si dve pasmi zelo podobni, in model vrne zelo podobne verjetnosti (npr. 0,45 in 0,43). Če merimo standardno natančnost, bo to obravnavano kot napačen primer, čeprav je model naredil zelo majhno napako. Zato pogosto merimo drugo metriko - natančnost znotraj top 3 najbolj verjetnih napovedi modela.\n",
"V takšnih primerih je težko zagotoviti, da model **vedno** pravilno napove razred. Obstajajo primeri, ko sta dve pasmi zelo podobni, model pa vrne zelo podobne verjetnosti (npr. 0.45 in 0.43). Če merimo standardno natančnost, bo to obravnavano kot napačen primer, čeprav je model naredil zelo majhno napako. Zato pogosto merimo drugo metriko - natančnost znotraj top 3 najbolj verjetnih napovedi modela.\n",
"\n",
"Primer štejemo za natančen, če je ciljna oznaka vsebovana znotraj top 3 napovedi modela.\n",
"\n",
"Za izračun top-3 natančnosti na testnem naboru podatkov morate ročno pregledati nabor podatkov, uporabiti nevronsko mrežo za pridobitev napovedi in nato opraviti izračune. Nekaj namigov:\n",
"\n",
"* V Tensorflow lahko uporabite funkcijo `tf.nn.in_top_k`, da preverite, ali so `predictions` (izhod modela) v top-k (podajte `k=3` kot parameter) glede na `targets`. Ta funkcija vrne tenzor logičnih vrednosti, ki jih lahko pretvorite v `int` z uporabo `tf.cast`, nato pa jih seštejete z `tf.reduce_sum`.\n",
"* V PyTorch lahko uporabite funkcijo `torch.topk`, da pridobite indekse razredov z najvišjimi verjetnostmi, nato pa preverite, ali pravilni razred spada med njih. Več namigov najdete [tukaj](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b).\n"
"* V Tensorflowu uporabite funkcijo `tf.nn.in_top_k`, da preverite, ali so `predictions` (izhod modela) v top-k (podajte `k=3` kot parameter) glede na `targets`. Ta funkcija vrne tenzor logičnih vrednosti, ki jih lahko pretvorite v `int` z uporabo `tf.cast`, nato pa jih seštejete z uporabo `tf.reduce_sum`.\n",
"* V PyTorchu lahko uporabite funkcijo `torch.topk`, da pridobite indekse razredov z najvišjimi verjetnostmi, nato pa preverite, ali pravilni razred spada med njih. Oglejte si [to](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) za več namigov.\n"
]
},
{
@ -324,9 +344,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## Izbirno: Zgradite klasifikacijo mačke proti psom\n",
"## Neobvezno: Zgradite klasifikacijo mačke proti psi\n",
"\n",
"Prav tako želimo preveriti, kako natančna bi bila naša binarna klasifikacija mačke proti psom na istem naboru podatkov. Da to dosežemo, moramo prilagoditi oznake:\n"
"Prav tako želimo preveriti, kako natančna bi bila naša binarna klasifikacija mačke proti psi na istem naboru podatkov. Da to storimo, moramo prilagoditi oznake:\n"
]
},
{
@ -352,7 +372,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Omejitev odgovornosti**: \nTa dokument je bil preveden z uporabo storitve za strojno prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo strokovno človeško prevajanje. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda.\n"
"\n---\n\n**Omejitev odgovornosti**: \nTa dokument je bil preveden z uporabo storitve za prevajanje z umetno inteligenco [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatski prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo profesionalni človeški prevod. Ne prevzemamo odgovornosti za morebitne nesporazume ali napačne razlage, ki izhajajo iz uporabe tega prevoda.\n"
]
}
],
@ -378,8 +398,8 @@
"version": "3.9.5"
},
"coopTranslator": {
"original_hash": "1de3ae931831253c3198d899da48bfe5",
"translation_date": "2025-08-30T07:19:30+00:00",
"original_hash": "df7d1f7da8d2617b76acd93115776ca4",
"translation_date": "2025-10-03T14:49:10+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb",
"language_code": "sl"
}

View File

@ -1,15 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "f3d2cee9cb3c52160419e560c57a690e",
"translation_date": "2025-08-25T22:58:55+00:00",
"original_hash": "b70fcf7fcee862990f848c679090943f",
"translation_date": "2025-10-03T14:58:19+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/README.md",
"language_code": "sl"
}
-->
# Razvrščanje obrazov hišnih ljubljenčkov
Laboratorijska naloga iz [Učnega načrta za začetnike v umetni inteligenci](https://github.com/microsoft/ai-for-beginners).
Laboratorijska naloga iz [Učnega načrta za začetnike v AI](https://github.com/microsoft/ai-for-beginners).
## Naloga
@ -19,7 +19,7 @@ Vaša naloga je, da usposobite konvolucijsko nevronsko mrežo za razvrščanje r
## Podatkovna zbirka
Uporabili bomo podatkovno zbirko **Pet Faces**, ki je izpeljana iz podatkovne zbirke hišnih ljubljenčkov [Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/). Vsebuje 35 različnih pasem psov in mačk.
Uporabili bomo [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), ki vsebuje slike 37 različnih pasem psov in mačk.
![Podatkovna zbirka, s katero bomo delali](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.sl.png)
@ -31,13 +31,17 @@ Za prenos podatkovne zbirke uporabite naslednji del kode:
!rm images.tar.gz
```
## Začetek zvezka
**Opomba:** Slike v podatkovni zbirki Oxford-IIIT Pet Dataset so organizirane po imenu datoteke (npr. `Abyssinian_1.jpg`, `Bengal_2.jpg`). Zvezek vključuje kodo za organizacijo teh slik v podimenike, specifične za pasme, kar olajša razvrščanje.
Začnite laboratorijsko nalogo z odpiranjem [PetFaces.ipynb](../../../../../../lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb)
## Začetni zvezek
Začnite laboratorijsko nalogo z odpiranjem [PetFaces.ipynb](PetFaces.ipynb)
## Ključne ugotovitve
Rešili ste razmeroma zapleten problem razvrščanja slik od začetka! Kljub velikemu številu razredov ste uspeli doseči razumno natančnost! Smiselno je tudi meriti top-k natančnost, saj je enostavno zamenjati nekatere razrede, ki tudi ljudem niso jasno različni.
Rešili ste razmeroma zapleten problem razvrščanja slik od začetka! Kljub velikemu številu razredov ste uspeli doseči razumno natančnost! Smiselno je tudi meriti top-k natančnost, saj je enostavno zamenjati nekatere razrede, ki niso jasno različni niti za ljudi.
---
**Omejitev odgovornosti**:
Ta dokument je bil preveden z uporabo storitve AI za prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo profesionalni človeški prevod. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki bi nastale zaradi uporabe tega prevoda.
Ta dokument je bil preveden z uporabo storitve AI za prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem maternem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo profesionalni človeški prevod. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda.

View File

@ -6,11 +6,13 @@
"source": [
"# Класификација лица кућних љубимаца\n",
"\n",
"Лабораторијски задатак из [AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners).\n",
"Задатак из лабораторијске вежбе из [AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners).\n",
"\n",
"### Преузимање података\n",
"\n",
"У овом задатку ћемо се фокусирати на релативно једноставан задатак класификације - класификацију лица кућних љубимаца. Овај скуп података се састоји од изрезаних лица из [Oxford-IIIT Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/). Хајде да почнемо са учитавањем и визуализацијом скупа података.\n"
"У овом задатку, фокусираћемо се на релативно једноставан задатак класификације - класификацију лица кућних љубимаца. Користићемо [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), који садржи слике 37 различитих раса паса и мачака. Хајде да почнемо са преузимањем и визуализацијом скупа података.\n",
"\n",
"**Напомена:** Oxford-IIIT Pet Dataset садржи целе слике кућних љубимаца. Слике ће бити организоване по расама у издвојеном фолдеру.\n"
]
},
{
@ -46,7 +48,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Дефинисаћемо општу функцију за приказивање серије слика из листе:\n"
"Ми ћемо дефинисати општу функцију за приказ серије слика из листе:\n"
]
},
{
@ -86,6 +88,24 @@
"metadata": {},
"outputs": [],
"source": [
"# Note: The Oxford-IIIT Pet Dataset extracts to a folder named 'images'\n",
"# Images are named by breed (e.g., 'Abyssinian_1.jpg')\n",
"# We need to organize them into breed-specific subdirectories\n",
"import os\n",
"from collections import defaultdict\n",
"\n",
"# Organize images by breed\n",
"if not os.path.exists('petfaces'):\n",
" os.makedirs('petfaces')\n",
" for img_file in os.listdir('images'):\n",
" if img_file.endswith(('.jpg', '.png')):\n",
" # Extract breed name from filename (everything before the last underscore and number)\n",
" breed = '_'.join(img_file.split('_')[:-1])\n",
" breed_dir = os.path.join('petfaces', breed)\n",
" if not os.path.exists(breed_dir):\n",
" os.makedirs(breed_dir)\n",
" os.rename(os.path.join('images', img_file), os.path.join(breed_dir, img_file))\n",
"\n",
"for cls in os.listdir('petfaces'):\n",
" print(cls)\n",
" display_images([Image.open(os.path.join('petfaces',cls,x)) \n",
@ -130,7 +150,7 @@
"* У Tensorflow-у, користите `tf.keras.preprocessing.image_dataset_from_directory`\n",
"* У PyTorch-у, користите `torchvision.datasets.ImageFolder`\n",
"\n",
"Као што сте видели на горњим сликама, све оне имају однос страна близак квадратном, па је потребно променити величину свих слика на квадратни формат. Такође, можемо организовати слике у мини-бачеве.\n"
"Као што сте видели на сликама изнад, све су приближно квадратног односа, па је потребно да променимо величину свих слика на квадратни формат. Такође, можемо организовати слике у мини серије.\n"
]
},
{
@ -146,7 +166,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Сада треба да раздвојимо скуп података на делове за тренирање и тестирање:\n"
"Сада треба да поделимо скуп података на делове за обуку и тестирање:\n"
]
},
{
@ -162,7 +182,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Сада ћемо исписати величину тензора у нашем скупу података. Ако сте све урадили исправно, величина елемената за тренирање треба да буде\n",
"Сада да испишемо величину тензора у нашем скупу података. Ако сте све урадили исправно, величина елемената за тренинг треба да буде\n",
" * `(batch_size,image_size,image_size,3)` за Tensorflow, `batch_size,3,image_size,image_size` за PyTorch\n",
" * `batch_size` за Ознаке\n",
" \n",
@ -235,9 +255,9 @@
"* Не заборавите функције активације између слојева (ReLU) и Max Pooling.\n",
"* Завршни класификатор може бити са или без скривених слојева, али број излазних неурона треба да буде једнак броју класа.\n",
"\n",
"Важно је правилно поставити функцију активације на последњем слоју + функцију губитка:\n",
"* У Tensorflow-у можете користити `softmax` као функцију активације и `sparse_categorical_crossentropy` као функцију губитка. Разлика између sparse categorical cross-entropy и не-sparse верзије је у томе што прва очекује излаз као број класе, а не као one-hot вектор.\n",
"* У PyTorch-у можете имати последњи слој без функције активације и користити функцију губитка `CrossEntropyLoss`. Ова функција аутоматски примењује softmax.\n"
"Важна ствар је да правилно подесите функцију активације на последњем слоју + функцију губитка:\n",
"* У Tensorflow-у, можете користити `softmax` као функцију активације и `sparse_categorical_crossentropy` као функцију губитка. Разлика између sparse categorical cross-entropy и неспарсне верзије је у томе што прва очекује излаз као број класе, а не као one-hot вектор.\n",
"* У PyTorch-у, можете имати последњи слој без функције активације и користити функцију губитка `CrossEntropyLoss`. Ова функција аутоматски примењује softmax.\n"
]
},
{
@ -255,9 +275,9 @@
"source": [
"## Тренирање неуронске мреже\n",
"\n",
"Сада смо спремни да тренирамо неуронску мрежу. Током тренинга, прикупљајте тачност на подацима за тренирање и тестирање у свакој епохи, а затим прикажите графикон тачности како бисте проверили да ли долази до претренираности.\n",
"Сада смо спремни да тренирамо неуронску мрежу. Током тренинга, молимо вас да прикупљате тачност на тренинг и тест подацима за сваку епоху, а затим графички прикажете тачност како бисте видели да ли долази до пренатренираности.\n",
"\n",
"> Да бисте убрзали тренинг, потребно је да користите GPU ако је доступан. Док TensorFlow/Keras аутоматски користи GPU, у PyTorch-у је неопходно да и модел и податке преместите на GPU током тренинга користећи `.to()` метод како бисте искористили предности GPU убрзања.\n"
"> Да бисте убрзали тренинг, потребно је да користите GPU ако је доступан. Док TensorFlow/Keras аутоматски користи GPU, у PyTorch-у је потребно да и модел и податке преместите на GPU током тренинга користећи `.to()` метод како бисте искористили предности GPU убрзања.\n"
]
},
{
@ -295,20 +315,20 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Шта можете рећи о преопшивању? Шта се може урадити да се побољша тачност модела?\n",
"Шта можете рећи о преопштавању? Шта се може урадити да се побољша тачност модела?\n",
"\n",
"## Опционо: Израчунати Top3 тачност\n",
"\n",
"У овом задатку, радили смо са класификацијом која укључује прилично велики број класа (35), па је наш резултат - око 50% тачности на валидационом сету - прилично добар. Стандардни ImageNet сет података има још више - 1000 класа.\n",
"У овом задатку, радили смо на класификацији са прилично великим бројем класа (35), тако да је наш резултат - око 50% тачности на валидационом сету - прилично добар. Стандардни ImageNet сет података има још више - 1000 класа.\n",
"\n",
"У таквим случајевима је тешко осигурати да модел **увек** тачно предвиди класу. Постоје ситуације када су две расе веома сличне једна другој, и модел враћа веома сличне вероватноће (нпр., 0.45 и 0.43). Ако меримо стандардну тачност, то ће се сматрати погрешним случајем, иако је модел направио веома малу грешку. Због тога често меримо другу метрику - тачност унутар топ 3 највероватније предвиђене класе модела.\n",
"\n",
"Сматрамо да је случај тачан ако је циљна ознака садржана унутар топ 3 предвиђања модела.\n",
"\n",
"Да бисте израчунали топ-3 тачност на тест сету података, потребно је ручно проћи кроз сет података, применити неуронску мрежу да добијете предвиђање, а затим урадити прорачуне. Неколико савета:\n",
"Да бисте израчунали топ-3 тачност на тест сету, потребно је ручно проћи кроз сет података, применити неуронску мрежу да добијете предвиђање, а затим урадити прорачуне. Неколико савета:\n",
"\n",
"* У Tensorflow-у, користите функцију `tf.nn.in_top_k` да проверите да ли су `predictions` (излаз модела) у топ-к (проследите `k=3` као параметар), у односу на `targets`. Ова функција враћа тензор са вредностима типа boolean, који се могу конвертовати у `int` помоћу `tf.cast`, а затим акумулирати помоћу `tf.reduce_sum`.\n",
"* У PyTorch-у, можете користити функцију `torch.topk` да добијете индексе класа са највишим вероватноћама, а затим проверити да ли исправна класа припада њима. Погледајте [овде](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) за више савета.\n"
"* У Tensorflow-у, користите функцију `tf.nn.in_top_k` да проверите да ли су `predictions` (излаз модела) у топ-k (проследите `k=3` као параметар), у односу на `targets`. Ова функција враћа тензор са вредностима типа boolean, који се могу конвертовати у `int` помоћу `tf.cast`, а затим акумулирати помоћу `tf.reduce_sum`.\n",
"* У PyTorch-у, можете користити функцију `torch.topk` да добијете индексе класа са највећим вероватноћама, а затим проверите да ли исправна класа припада њима. Погледајте [овде](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) за више савета.\n"
]
},
{
@ -326,7 +346,7 @@
"source": [
"## Опционо: Направите класификацију мачке против паса\n",
"\n",
"Желимо да проверимо колико је тачна наша бинарна класификација мачке против паса на истом скупу података. Да бисмо то урадили, потребно је да прилагодимо ознаке:\n"
"Такође желимо да видимо колико би наша бинарна класификација мачке против паса била тачна на истом скупу података. Да бисмо то урадили, потребно је да прилагодимо ознаке:\n"
]
},
{
@ -352,7 +372,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Одрицање од одговорности**: \nОвај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако се трудимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати меродавним извором. За критичне информације, препоручује се професионални превод од стране људи. Не преузимамо одговорност за било каква погрешна тумачења или неспоразуме који могу настати услед коришћења овог превода.\n"
"\n---\n\n**Одрицање од одговорности**: \nОвај документ је преведен помоћу услуге за превођење уз помоћ вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако се трудимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква погрешна тумачења или неспоразуме који могу произаћи из коришћења овог превода.\n"
]
}
],
@ -378,8 +398,8 @@
"version": "3.9.5"
},
"coopTranslator": {
"original_hash": "1de3ae931831253c3198d899da48bfe5",
"translation_date": "2025-08-29T23:14:23+00:00",
"original_hash": "df7d1f7da8d2617b76acd93115776ca4",
"translation_date": "2025-10-03T14:47:28+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb",
"language_code": "sr"
}

View File

@ -1,8 +1,8 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "f3d2cee9cb3c52160419e560c57a690e",
"translation_date": "2025-08-25T22:58:37+00:00",
"original_hash": "b70fcf7fcee862990f848c679090943f",
"translation_date": "2025-10-03T14:58:02+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/README.md",
"language_code": "sr"
}
@ -13,15 +13,15 @@ CO_OP_TRANSLATOR_METADATA:
## Задатак
Замислите да треба да развијете апликацију за вртић за кућне љубимце како бисте каталогизовали све љубимце. Једна од одличних функција такве апликације била би аутоматско откривање расе са фотографије. Ово се успешно може урадити коришћењем неуронских мрежа.
Замислите да треба да развијете апликацију за расадник кућних љубимаца како бисте каталогизовали све љубимце. Једна од одличних функција такве апликације била би аутоматско откривање расе са фотографије. Ово се успешно може урадити помоћу неуронских мрежа.
Потребно је да обучите конволуциону неуронску мрежу за класификацију различитих раса мачака и паса користећи **Pet Faces** скуп података.
## Скуп података
Користићемо **Pet Faces** скуп података, који је изведен из [Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/) скупа података о кућним љубимцима. Садржи 35 различитих раса паса и мачака.
Користићемо [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), који садржи слике 37 различитих раса паса и мачака.
![Скуп података којим ћемо се бавити](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.sr.png)
![Скуп података са којим ћемо радити](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.sr.png)
Да бисте преузели скуп података, користите овај код:
@ -31,13 +31,17 @@ CO_OP_TRANSLATOR_METADATA:
!rm images.tar.gz
```
## Почетна свеска
**Напомена:** Слике у Oxford-IIIT Pet Dataset су организоване по имену датотеке (нпр. `Abyssinian_1.jpg`, `Bengal_2.jpg`). У нотебуку је укључен код за организовање ових слика у поддиректоријуме специфичне за расу ради лакше класификације.
Започните лабораторију отварањем [PetFaces.ipynb](../../../../../../lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb)
## Почетни нотебук
Започните лабораторију отварањем [PetFaces.ipynb](PetFaces.ipynb)
## Закључак
Решили сте релативно сложен проблем класификације слика од самог почетка! Било је прилично много класа, а ипак сте успели да постигнете разумну тачност! Такође има смисла мерити top-k тачност, јер је лако помешати неке класе које нису јасно различите чак ни за људско око.
Решили сте релативно сложен проблем класификације слика од нуле! Било је прилично много класа, а ипак сте успели да постигнете разумну тачност! Такође има смисла мерити top-k тачност, јер је лако помешати неке класе које нису јасно различите чак ни за људско око.
---
**Одрицање од одговорности**:
Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако се трудимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати меродавним извором. За критичне информације препоручује се професионални превод од стране људи. Не преузимамо одговорност за било каква погрешна тумачења или неспоразуме који могу настати услед коришћења овог превода.
Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако се трудимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не преузимамо одговорност за било каква погрешна тумачења или неспоразуме који могу настати услед коришћења овог превода.

View File

@ -6,11 +6,13 @@
"source": [
"# Klassificering av husdjurs ansikten\n",
"\n",
"Laborationsuppgift från [AI för nybörjare-kursplan](https://github.com/microsoft/ai-for-beginners).\n",
"Labuppgift från [AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners).\n",
"\n",
"### Hämta data\n",
"\n",
"I den här uppgiften kommer vi att fokusera på en relativt enkel klassificeringsuppgift - klassificering av husdjurs ansikten. Denna dataset består av utskurna ansikten från [Oxford-IIIT Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/). Låt oss börja med att ladda och visualisera datasetet.\n"
"I denna uppgift kommer vi att fokusera på en relativt enkel klassificeringsuppgift - klassificering av husdjurs ansikten. Vi kommer att använda [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), som innehåller bilder av 37 olika hund- och kattraser. Låt oss börja med att ladda ner och visualisera datasetet.\n",
"\n",
"**Obs:** Oxford-IIIT Pet Dataset innehåller hela bilder av husdjur. Bilderna kommer att vara organiserade efter ras i den extraherade mappen.\n"
]
},
{
@ -46,7 +48,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Vi kommer att definiera en generisk funktion för att visa en serie bilder från en lista:\n"
"Vi kommer att definiera en generell funktion för att visa en serie bilder från en lista:\n"
]
},
{
@ -77,7 +79,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Låt oss nu gå igenom alla klassundermappar och plotta de första bilderna i varje klass:\n"
"Nu låt oss gå igenom alla klassundermappar och plotta de första bilderna i varje klass:\n"
]
},
{
@ -86,6 +88,24 @@
"metadata": {},
"outputs": [],
"source": [
"# Note: The Oxford-IIIT Pet Dataset extracts to a folder named 'images'\n",
"# Images are named by breed (e.g., 'Abyssinian_1.jpg')\n",
"# We need to organize them into breed-specific subdirectories\n",
"import os\n",
"from collections import defaultdict\n",
"\n",
"# Organize images by breed\n",
"if not os.path.exists('petfaces'):\n",
" os.makedirs('petfaces')\n",
" for img_file in os.listdir('images'):\n",
" if img_file.endswith(('.jpg', '.png')):\n",
" # Extract breed name from filename (everything before the last underscore and number)\n",
" breed = '_'.join(img_file.split('_')[:-1])\n",
" breed_dir = os.path.join('petfaces', breed)\n",
" if not os.path.exists(breed_dir):\n",
" os.makedirs(breed_dir)\n",
" os.rename(os.path.join('images', img_file), os.path.join(breed_dir, img_file))\n",
"\n",
"for cls in os.listdir('petfaces'):\n",
" print(cls)\n",
" display_images([Image.open(os.path.join('petfaces',cls,x)) \n",
@ -126,11 +146,11 @@
"source": [
"## Förbereda dataset för djupinlärning\n",
"\n",
"För att börja träna vårt neurala nätverk behöver vi konvertera alla bilder till tensorer och även skapa tensorer som motsvarar etiketter (klassnummer). De flesta ramverk för neurala nätverk innehåller enkla verktyg för att hantera bilder:\n",
"För att börja träna vårt neurala nätverk behöver vi konvertera alla bilder till tensorer, samt skapa tensorer som motsvarar etiketter (klassnummer). De flesta ramverk för neurala nätverk innehåller enkla verktyg för att hantera bilder:\n",
"* I Tensorflow, använd `tf.keras.preprocessing.image_dataset_from_directory`\n",
"* I PyTorch, använd `torchvision.datasets.ImageFolder`\n",
"\n",
"Som du har sett bilderna ovan, har alla en bildförhållande som är nära kvadratiskt, så vi behöver ändra storlek på alla bilder till kvadratisk storlek. Dessutom kan vi organisera bilder i minibatcher.\n"
"Som du har sett från bilderna ovan, har alla en bildförhållande som är nära kvadratiskt, så vi behöver ändra storlek på alla bilder till kvadratisk storlek. Dessutom kan vi organisera bilder i minibatcher.\n"
]
},
{
@ -230,13 +250,13 @@
"source": [
"## Definiera ett neuralt nätverk\n",
"\n",
"För bildklassificering bör du förmodligen definiera ett konvolutionellt neuralt nätverk med flera lager. Vad du bör tänka på:\n",
"* Kom ihåg pyramidarkitekturen, dvs. antalet filter bör öka ju djupare du går.\n",
"För bildklassificering bör du förmodligen definiera ett konvolutionellt neuralt nätverk med flera lager. Saker att hålla koll på:\n",
"* Tänk på pyramidarkitekturen, dvs. antalet filter bör öka ju djupare du går.\n",
"* Glöm inte aktiveringsfunktioner mellan lagren (ReLU) och Max Pooling.\n",
"* Den slutliga klassificeraren kan ha eller inte ha dolda lager, men antalet utgångsneuroner bör vara lika med antalet klasser.\n",
"* Den slutliga klassificeraren kan vara med eller utan dolda lager, men antalet utgångsneuroner bör vara lika med antalet klasser.\n",
"\n",
"En viktig sak är att få aktiveringsfunktionen i det sista lagret + förlustfunktionen rätt:\n",
"* I Tensorflow kan du använda `softmax` som aktivering och `sparse_categorical_crossentropy` som förlust. Skillnaden mellan sparsam kategorisk korsentropi och icke-sparsam är att den förstnämnda förväntar sig utgången som klassnummer och inte som en one-hot-vektor.\n",
"* I Tensorflow kan du använda `softmax` som aktiveringsfunktion och `sparse_categorical_crossentropy` som förlustfunktion. Skillnaden mellan sparse categorical cross-entropy och den icke-sparse varianten är att den förstnämnda förväntar sig utgången som klassnummer och inte som en one-hot-vektor.\n",
"* I PyTorch kan du ha det sista lagret utan aktiveringsfunktion och använda förlustfunktionen `CrossEntropyLoss`. Denna funktion tillämpar softmax automatiskt.\n"
]
},
@ -255,9 +275,9 @@
"source": [
"## Träna det neurala nätverket\n",
"\n",
"Nu är vi redo att träna det neurala nätverket. Under träningen, samla in noggrannhet för tränings- och testdata vid varje epok och plotta sedan noggrannheten för att se om det finns överanpassning.\n",
"Nu är vi redo att träna det neurala nätverket. Under träningen, samla in noggrannhet på tränings- och testdata för varje epok och plotta sedan noggrannheten för att se om det finns överanpassning.\n",
"\n",
"> För att påskynda träningen behöver du använda GPU om det är tillgängligt. Medan TensorFlow/Keras automatiskt använder GPU, måste du i PyTorch flytta både modellen och datan till GPU under träningen med hjälp av `.to()`-metoden för att dra nytta av GPU-acceleration.\n"
"> För att snabba upp träningen behöver du använda GPU om det finns tillgängligt. Medan TensorFlow/Keras automatiskt använder GPU, måste du i PyTorch flytta både modellen och datan till GPU under träningen med hjälp av `.to()`-metoden för att dra nytta av GPU-acceleration.\n"
]
},
{
@ -295,20 +315,20 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Vad kan du säga om överanpassning? Vad kan göras för att förbättra modellens noggrannhet?\n",
"Vad kan man säga om överanpassning? Vad kan göras för att förbättra modellens noggrannhet?\n",
"\n",
"## Valfritt: Beräkna Top-3 Noggrannhet\n",
"\n",
"I den här övningen arbetade vi med klassificering med ett ganska stort antal klasser (35), så vårt resultat - cirka 50% valideringsnoggrannhet - är ganska bra. Det standardiserade ImageNet-datasetet har ännu fler - 1000 klasser.\n",
"I denna övning arbetade vi med klassificering med ett ganska stort antal klasser (35), så vårt resultat - cirka 50% valideringsnoggrannhet - är ganska bra. Den standardiserade ImageNet-datasetet har ännu fler - 1000 klasser.\n",
"\n",
"I sådana fall är det svårt att säkerställa att modellen **alltid** förutsäger rätt klass. Det finns situationer där två raser är mycket lika varandra, och modellen returnerar mycket liknande sannolikheter (t.ex. 0,45 och 0,43). Om vi mäter standardnoggrannhet kommer detta att betraktas som ett fel, även om modellen gjorde ett mycket litet misstag. Därför mäter vi ofta en annan metrik - en noggrannhet inom de tre mest sannolika förutsägelserna från modellen.\n",
"I sådana fall är det svårt att säkerställa att modellen **alltid** korrekt förutsäger klassen. Det finns situationer där två raser är mycket lika varandra, och modellen returnerar mycket liknande sannolikheter (t.ex. 0.45 och 0.43). Om vi mäter standardnoggrannhet kommer det att betraktas som ett fel, även om modellen gjorde ett mycket litet misstag. Därför mäter vi ofta en annan metrisk - en noggrannhet inom de tre mest sannolika förutsägelserna från modellen.\n",
"\n",
"Vi anser att fallet är korrekt om måletiketten finns bland de tre bästa förutsägelserna från modellen.\n",
"Vi betraktar fallet som korrekt om måletiketten finns inom de tre mest sannolika förutsägelserna från modellen.\n",
"\n",
"För att beräkna top-3 noggrannhet på testdatasetet behöver du manuellt gå igenom datasetet, applicera det neurala nätverket för att få förutsägelsen och sedan göra beräkningarna. Några tips:\n",
"För att beräkna top-3 noggrannhet på testdatasetet behöver du manuellt gå igenom datasetet, tillämpa det neurala nätverket för att få förutsägelsen och sedan göra beräkningarna. Några tips:\n",
"\n",
"* I Tensorflow, använd funktionen `tf.nn.in_top_k` för att se om `predictions` (modellens utdata) finns bland de tre bästa (ange `k=3` som parameter) i förhållande till `targets`. Denna funktion returnerar en tensor av booleska värden, som kan konverteras till `int` med `tf.cast` och sedan ackumuleras med `tf.reduce_sum`.\n",
"* I PyTorch kan du använda funktionen `torch.topk` för att få index för klasser med högst sannolikheter och sedan kontrollera om den korrekta klassen finns bland dem. Se [detta](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) för fler tips.\n"
"* I Tensorflow, använd funktionen `tf.nn.in_top_k` för att se om `predictions` (modellens output) finns bland de topp-k (ange `k=3` som parameter) med avseende på `targets`. Denna funktion returnerar en tensor av booleska värden, som kan konverteras till `int` med `tf.cast`, och sedan ackumuleras med `tf.reduce_sum`.\n",
"* I PyTorch kan du använda funktionen `torch.topk` för att få index för klasser med högst sannolikheter, och sedan se om den korrekta klassen finns bland dem. Se [detta](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) för fler tips.\n"
]
},
{
@ -378,8 +398,8 @@
"version": "3.9.5"
},
"coopTranslator": {
"original_hash": "1de3ae931831253c3198d899da48bfe5",
"translation_date": "2025-08-28T16:23:55+00:00",
"original_hash": "df7d1f7da8d2617b76acd93115776ca4",
"translation_date": "2025-10-03T14:38:33+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb",
"language_code": "sv"
}

View File

@ -1,25 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "f3d2cee9cb3c52160419e560c57a690e",
"translation_date": "2025-08-28T15:14:10+00:00",
"original_hash": "b70fcf7fcee862990f848c679090943f",
"translation_date": "2025-10-03T14:55:20+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/README.md",
"language_code": "sv"
}
-->
# Klassificering av husdjurs ansikten
# Klassificering av husdjursansikten
Labuppgift från [AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners).
Labuppgift från [AI för nybörjare-kursen](https://github.com/microsoft/ai-for-beginners).
## Uppgift
Föreställ dig att du behöver utveckla en applikation för ett djurpensionat för att katalogisera alla husdjur. En fantastisk funktion i en sådan applikation skulle vara att automatiskt identifiera rasen från ett fotografi. Detta kan framgångsrikt göras med hjälp av neurala nätverk.
Föreställ dig att du behöver utveckla en applikation för ett djurdagis för att katalogisera alla husdjur. En fantastisk funktion i en sådan applikation skulle vara att automatiskt identifiera rasen från ett fotografi. Detta kan framgångsrikt göras med hjälp av neurala nätverk.
Du behöver träna ett konvolutionellt neuralt nätverk för att klassificera olika raser av katter och hundar med hjälp av datasetet **Pet Faces**.
## Datasetet
Vi kommer att använda datasetet **Pet Faces**, som är hämtat från [Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/) husdjursdataset. Det innehåller 35 olika raser av hundar och katter.
Vi kommer att använda [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), som innehåller bilder av 37 olika raser av hundar och katter.
![Datasetet vi kommer att arbeta med](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.sv.png)
@ -31,7 +31,9 @@ För att ladda ner datasetet, använd följande kodsnutt:
!rm images.tar.gz
```
## Starta Notebook
**Obs:** Bilderna i Oxford-IIIT Pet Dataset är organiserade efter filnamn (t.ex. `Abyssinian_1.jpg`, `Bengal_2.jpg`). Notebooken innehåller kod för att organisera dessa bilder i ras-specifika underkataloger för enklare klassificering.
## Starta Notebooken
Börja labben genom att öppna [PetFaces.ipynb](PetFaces.ipynb)
@ -42,4 +44,4 @@ Du har löst ett relativt komplext problem med bildklassificering från grunden!
---
**Ansvarsfriskrivning**:
Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, bör du vara medveten om att automatiserade översättningar kan innehålla fel eller inexaktheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning.
Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, bör det noteras att automatiserade översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning.

View File

@ -6,11 +6,13 @@
"source": [
"# Uainishaji wa Nyuso za Wanyama Kipenzi\n",
"\n",
"Kazi ya maabara kutoka [Mtaala wa AI kwa Kompyuta](https://github.com/microsoft/ai-for-beginners).\n",
"Kazi ya Maabara kutoka [Mtaala wa AI kwa Kompyuta](https://github.com/microsoft/ai-for-beginners).\n",
"\n",
"### Kupata Data\n",
"\n",
"Katika kazi hii, tutazingatia jukumu rahisi la uainishaji - uainishaji wa nyuso za wanyama kipenzi. Seti hii ya data inajumuisha nyuso zilizokatwa kutoka [Oxford-IIIT Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/). Hebu tuanze kwa kupakia na kuonyesha seti ya data.\n"
"Katika kazi hii, tutazingatia jukumu rahisi la uainishaji - uainishaji wa nyuso za wanyama kipenzi. Tutatumia [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), ambayo ina picha za aina 37 tofauti za mbwa na paka. Hebu tuanze kwa kupakua na kuangalia dataset.\n",
"\n",
"**Kumbuka:** Oxford-IIIT Pet Dataset ina picha kamili za wanyama kipenzi. Picha zitapangwa kulingana na aina katika folda iliyotolewa.\n"
]
},
{
@ -77,7 +79,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Sasa wacha tupitie folda ndogo za kila darasa na kuchora picha chache za kwanza za kila darasa:\n"
"Sasa hebu pitia folda ndogo za kila darasa na uchore picha chache za kwanza za kila darasa:\n"
]
},
{
@ -86,6 +88,24 @@
"metadata": {},
"outputs": [],
"source": [
"# Note: The Oxford-IIIT Pet Dataset extracts to a folder named 'images'\n",
"# Images are named by breed (e.g., 'Abyssinian_1.jpg')\n",
"# We need to organize them into breed-specific subdirectories\n",
"import os\n",
"from collections import defaultdict\n",
"\n",
"# Organize images by breed\n",
"if not os.path.exists('petfaces'):\n",
" os.makedirs('petfaces')\n",
" for img_file in os.listdir('images'):\n",
" if img_file.endswith(('.jpg', '.png')):\n",
" # Extract breed name from filename (everything before the last underscore and number)\n",
" breed = '_'.join(img_file.split('_')[:-1])\n",
" breed_dir = os.path.join('petfaces', breed)\n",
" if not os.path.exists(breed_dir):\n",
" os.makedirs(breed_dir)\n",
" os.rename(os.path.join('images', img_file), os.path.join(breed_dir, img_file))\n",
"\n",
"for cls in os.listdir('petfaces'):\n",
" print(cls)\n",
" display_images([Image.open(os.path.join('petfaces',cls,x)) \n",
@ -124,7 +144,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## Kuandaa dataset kwa Deep Learning\n",
"## Kuandaa dataset kwa Kujifunza Kina\n",
"\n",
"Ili kuanza kufundisha mtandao wetu wa neva, tunahitaji kubadilisha picha zote kuwa tensors, na pia kuunda tensors zinazolingana na lebo (namba za darasa). Mfumo mwingi wa mtandao wa neva una zana rahisi za kushughulikia picha:\n",
"* Katika Tensorflow, tumia `tf.keras.preprocessing.image_dataset_from_directory`\n",
@ -146,7 +166,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Sasa tunahitaji kugawanya seti ya data kuwa sehemu za mafunzo na majaribio:\n"
"Sasa tunahitaji kugawanya seti ya data katika sehemu za mafunzo na majaribio:\n"
]
},
{
@ -162,11 +182,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Sasa tuangalie ukubwa wa tensors katika seti yetu ya data. Ikiwa umefanya kila kitu kwa usahihi, ukubwa wa vipengele vya mafunzo unapaswa kuwa\n",
"Sasa tuchapishe ukubwa wa tensors katika seti yetu ya data. Ikiwa umefanya kila kitu kwa usahihi, ukubwa wa vipengele vya mafunzo unapaswa kuwa\n",
" * `(batch_size,image_size,image_size,3)` kwa Tensorflow, `batch_size,3,image_size,image_size` kwa PyTorch\n",
" * `batch_size` kwa Lebo\n",
" \n",
" Lebo zinapaswa kuwa na namba za madarasa.\n"
"\n",
"Lebo zinapaswa kuwa na namba za madarasa.\n"
]
},
{
@ -228,10 +248,10 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## Eleza mtandao wa neva\n",
"## Kufafanua mtandao wa neva\n",
"\n",
"Kwa uainishaji wa picha, unapaswa kufafanua mtandao wa neva wa convolutional wenye tabaka kadhaa. Mambo ya kuzingatia:\n",
"* Kumbuka usanifu wa piramidi, yaani idadi ya vichujio inapaswa kuongezeka unavyozama zaidi.\n",
"* Kumbuka usanifu wa piramidi, yaani idadi ya vichujio inapaswa kuongezeka unavyozidi kwenda ndani.\n",
"* Usisahau kazi za uanzishaji kati ya tabaka (ReLU) na Max Pooling.\n",
"* Kifasiri cha mwisho kinaweza kuwa na au bila tabaka zilizofichwa, lakini idadi ya neurons za matokeo inapaswa kuwa sawa na idadi ya madarasa.\n",
"\n",
@ -255,7 +275,7 @@
"source": [
"## Fanya Mazoezi ya Mtandao wa Neural\n",
"\n",
"Sasa tuko tayari kufundisha mtandao wa neural. Wakati wa mazoezi, tafadhali kusanya usahihi kwenye data ya mafunzo na majaribio kwa kila kipindi, kisha chora usahihi ili kuona kama kuna overfitting.\n",
"Sasa tuko tayari kufundisha mtandao wa neural. Wakati wa mazoezi, tafadhali kusanya usahihi wa data ya mafunzo na majaribio kwa kila kipindi, kisha chora usahihi ili kuona kama kuna overfitting.\n",
"\n",
"> Ili kuharakisha mazoezi, unahitaji kutumia GPU ikiwa inapatikana. Ingawa TensorFlow/Keras itatumia GPU moja kwa moja, katika PyTorch unahitaji kuhamisha modeli na data zote kwenye GPU wakati wa mazoezi kwa kutumia njia ya `.to()` ili kufaidika na kasi ya GPU.\n"
]
@ -299,9 +319,9 @@
"\n",
"## Hiari: Hesabu Usahihi wa Juu-3\n",
"\n",
"Katika zoezi hili, tulikuwa tunashughulika na uainishaji wenye idadi kubwa ya madarasa (35), kwa hivyo matokeo yetu - takriban 50% usahihi wa uthibitishaji - ni mazuri. Dataset ya kawaida ya ImageNet ina hata zaidi - madarasa 1000.\n",
"Katika zoezi hili, tulikuwa tunashughulika na uainishaji wenye idadi kubwa ya madarasa (35), kwa hivyo matokeo yetu - takriban 50% usahihi wa uthibitishaji - ni mazuri sana. Dataset ya kawaida ya ImageNet ina hata zaidi - madarasa 1000.\n",
"\n",
"Katika hali kama hizi ni vigumu kuhakikisha kwamba modeli **daima** inatabiri darasa sahihi. Kuna hali ambapo aina mbili zinafanana sana, na modeli inarudisha uwezekano unaofanana sana (mfano, 0.45 na 0.43). Ikiwa tunapima usahihi wa kawaida, itachukuliwa kuwa kesi isiyo sahihi, ingawa modeli ilifanya kosa dogo sana. Kwa sababu hii, mara nyingi tunapima kipimo kingine - usahihi ndani ya utabiri wa juu-3 wa modeli.\n",
"Katika hali kama hizi ni vigumu kuhakikisha kwamba modeli **daima** inatabiri darasa kwa usahihi. Kuna hali ambapo aina mbili zinafanana sana, na modeli inarudisha uwezekano unaofanana sana (mfano, 0.45 na 0.43). Ikiwa tunapima usahihi wa kawaida, itachukuliwa kuwa ni kosa, ingawa modeli ilifanya kosa dogo sana. Kwa sababu hii, mara nyingi tunapima kipimo kingine - usahihi ndani ya utabiri wa juu-3 wa modeli.\n",
"\n",
"Tunachukulia kesi kuwa sahihi ikiwa lebo lengwa iko ndani ya utabiri wa juu-3 wa modeli.\n",
"\n",
@ -352,7 +372,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Kanusho**: \nHati hii imetafsiriwa kwa kutumia huduma ya tafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kwa usahihi, tafadhali fahamu kuwa tafsiri za kiotomatiki zinaweza kuwa na makosa au kutokuwa sahihi. Hati ya asili katika lugha yake ya awali inapaswa kuzingatiwa kama chanzo cha mamlaka. Kwa taarifa muhimu, inashauriwa kutumia tafsiri ya kitaalamu ya binadamu. Hatutawajibika kwa maelewano mabaya au tafsiri zisizo sahihi zinazotokana na matumizi ya tafsiri hii.\n"
"\n---\n\n**Kanusho**: \nHati hii imetafsiriwa kwa kutumia huduma ya tafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kuhakikisha usahihi, tafadhali fahamu kuwa tafsiri za kiotomatiki zinaweza kuwa na makosa au kutokuwa sahihi. Hati ya asili katika lugha yake ya awali inapaswa kuzingatiwa kama chanzo cha mamlaka. Kwa taarifa muhimu, tafsiri ya kitaalamu ya binadamu inapendekezwa. Hatutawajibika kwa kutoelewana au tafsiri zisizo sahihi zinazotokana na matumizi ya tafsiri hii.\n"
]
}
],
@ -378,8 +398,8 @@
"version": "3.9.5"
},
"coopTranslator": {
"original_hash": "1de3ae931831253c3198d899da48bfe5",
"translation_date": "2025-08-29T13:28:05+00:00",
"original_hash": "df7d1f7da8d2617b76acd93115776ca4",
"translation_date": "2025-10-03T14:43:59+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb",
"language_code": "sw"
}

View File

@ -1,29 +1,29 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "f3d2cee9cb3c52160419e560c57a690e",
"translation_date": "2025-08-25T20:55:46+00:00",
"original_hash": "b70fcf7fcee862990f848c679090943f",
"translation_date": "2025-10-03T14:56:44+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/README.md",
"language_code": "sw"
}
-->
# Uainishaji wa Nyuso za Wanyama wa Kipenzi
# Uainishaji wa Nyuso za Wanyama Kipenzi
Kazi ya Maabara kutoka [Mtaala wa AI kwa Kompyuta](https://github.com/microsoft/ai-for-beginners).
## Kazi
Fikiria unahitaji kuunda programu kwa ajili ya kitalu cha wanyama wa kipenzi ili kuorodhesha wanyama wote. Moja ya vipengele bora vya programu kama hiyo itakuwa kugundua moja kwa moja aina ya mnyama kutoka kwenye picha. Hili linaweza kufanikiwa kwa kutumia mitandao ya neva.
Fikiria unahitaji kuunda programu kwa ajili ya kituo cha kulelea wanyama kipenzi ili kuorodhesha wanyama wote. Moja ya vipengele bora vya programu kama hiyo itakuwa kugundua aina ya mnyama moja kwa moja kutoka kwenye picha. Hili linaweza kufanikiwa kwa kutumia mitandao ya neva.
Unahitaji kufundisha mtandao wa neva wa convolutional ili kuainisha aina tofauti za paka na mbwa kwa kutumia seti ya data ya **Pet Faces**.
Unahitaji kufundisha mtandao wa neva wa convolutional ili kuainisha aina tofauti za paka na mbwa kwa kutumia dataset ya **Nyuso za Wanyama Kipenzi**.
## Seti ya Data
## Dataset
Tutatumia seti ya data ya **Pet Faces**, inayotokana na seti ya data ya wanyama wa kipenzi ya [Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/). Inayo aina 35 tofauti za mbwa na paka.
Tutatumia [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), ambayo ina picha za aina 37 tofauti za mbwa na paka.
![Seti ya data tutakayoshughulikia](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.sw.png)
![Dataset tutakayoshughulikia](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.sw.png)
Ili kupakua seti ya data, tumia kipande hiki cha msimbo:
Ili kupakua dataset, tumia kipande hiki cha msimbo:
```python
!wget https://thor.robots.ox.ac.uk/~vgg/data/pets/images.tar.gz
@ -31,13 +31,17 @@ Ili kupakua seti ya data, tumia kipande hiki cha msimbo:
!rm images.tar.gz
```
## Kuanzisha Daftari
**Kumbuka:** Picha za Oxford-IIIT Pet Dataset zimepangwa kwa jina la faili (mfano, `Abyssinian_1.jpg`, `Bengal_2.jpg`). Notebook inajumuisha msimbo wa kupanga picha hizi katika folda maalum za aina ili kurahisisha uainishaji.
Anza maabara kwa kufungua [PetFaces.ipynb](../../../../../../lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb)
## Kuanzisha Notebook
## Jambo la Kujifunza
Anza maabara kwa kufungua [PetFaces.ipynb](PetFaces.ipynb)
Umesuluhisha tatizo changamani la uainishaji wa picha kutoka mwanzo! Kulikuwa na madarasa mengi, na bado uliweza kupata usahihi wa kuridhisha! Pia inafaa kupima usahihi wa top-k, kwa sababu ni rahisi kuchanganya baadhi ya madarasa ambayo hata kwa wanadamu si rahisi kuyatofautisha wazi.
## Mafanikio
Umesuluhisha tatizo gumu la uainishaji wa picha kutoka mwanzo! Kulikuwa na madarasa mengi, na bado uliweza kupata usahihi wa kuridhisha! Pia ina maana kupima usahihi wa top-k, kwa sababu ni rahisi kuchanganya baadhi ya madarasa ambayo hata kwa binadamu si rahisi kutofautisha.
---
**Kanusho**:
Hati hii imetafsiriwa kwa kutumia huduma ya kutafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kuhakikisha usahihi, tafadhali fahamu kuwa tafsiri za kiotomatiki zinaweza kuwa na makosa au kutokuwa sahihi. Hati ya asili katika lugha yake ya awali inapaswa kuzingatiwa kama chanzo cha mamlaka. Kwa taarifa muhimu, tafsiri ya kitaalamu ya binadamu inapendekezwa. Hatutawajibika kwa kutoelewana au tafsiri zisizo sahihi zinazotokana na matumizi ya tafsiri hii.
Hati hii imetafsiriwa kwa kutumia huduma ya tafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kuhakikisha usahihi, tafadhali fahamu kuwa tafsiri za kiotomatiki zinaweza kuwa na makosa au kutokuwa sahihi. Hati ya asili katika lugha yake ya awali inapaswa kuzingatiwa kama chanzo cha mamlaka. Kwa taarifa muhimu, tafsiri ya kitaalamu ya binadamu inapendekezwa. Hatutawajibika kwa kutoelewana au tafsiri zisizo sahihi zinazotokana na matumizi ya tafsiri hii.

View File

@ -4,13 +4,15 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"# การจำแนกใบหน้าของสัตว์เลี้ยง\n",
"# การจำแนกใบหน้าสัตว์เลี้ยง\n",
"\n",
"งานในห้องปฏิบัติการจาก [AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners).\n",
"\n",
"### การเตรียมข้อมูล\n",
"\n",
"ในงานนี้ เราจะมุ่งเน้นไปที่งานการจำแนกที่ค่อนข้างง่าย - การจำแนกใบหน้าของสัตว์เลี้ยง ชุดข้อมูลนี้ประกอบด้วยใบหน้าที่ถูกตัดออกจาก [Oxford-IIIT Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/). มาเริ่มต้นด้วยการโหลดและแสดงผลชุดข้อมูลกันเถอะ\n"
"ในงานนี้ เราจะมุ่งเน้นไปที่งานการจำแนกที่ค่อนข้างง่าย - การจำแนกใบหน้าสัตว์เลี้ยง เราจะใช้ [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/) ซึ่งประกอบด้วยภาพของสุนัขและแมวจาก 37 สายพันธุ์ที่แตกต่างกัน มาเริ่มต้นด้วยการดาวน์โหลดและแสดงผลข้อมูลชุดนี้กันเถอะ\n",
"\n",
"**หมายเหตุ:** Oxford-IIIT Pet Dataset ประกอบด้วยภาพสัตว์เลี้ยงทั้งตัว ภาพจะถูกจัดเรียงตามสายพันธุ์ในโฟลเดอร์ที่ถูกแยกออกมา\n"
]
},
{
@ -77,7 +79,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"ตอนนี้เรามาสำรวจไดเรกทอรีย่อยของแต่ละคลาสและแสดงภาพแรกๆ ของแต่ละคลาส:\n"
"ตอนนี้เรามาสำรวจไดเรกทอรีย่อยของแต่ละคลาสและพล็อตภาพแรกๆ ของแต่ละคลาส:\n"
]
},
{
@ -86,6 +88,24 @@
"metadata": {},
"outputs": [],
"source": [
"# Note: The Oxford-IIIT Pet Dataset extracts to a folder named 'images'\n",
"# Images are named by breed (e.g., 'Abyssinian_1.jpg')\n",
"# We need to organize them into breed-specific subdirectories\n",
"import os\n",
"from collections import defaultdict\n",
"\n",
"# Organize images by breed\n",
"if not os.path.exists('petfaces'):\n",
" os.makedirs('petfaces')\n",
" for img_file in os.listdir('images'):\n",
" if img_file.endswith(('.jpg', '.png')):\n",
" # Extract breed name from filename (everything before the last underscore and number)\n",
" breed = '_'.join(img_file.split('_')[:-1])\n",
" breed_dir = os.path.join('petfaces', breed)\n",
" if not os.path.exists(breed_dir):\n",
" os.makedirs(breed_dir)\n",
" os.rename(os.path.join('images', img_file), os.path.join(breed_dir, img_file))\n",
"\n",
"for cls in os.listdir('petfaces'):\n",
" print(cls)\n",
" display_images([Image.open(os.path.join('petfaces',cls,x)) \n",
@ -124,13 +144,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## การเตรียมชุดข้อมูลสำหรับ Deep Learning\n",
"## การเตรียมชุดข้อมูลสำหรับการเรียนรู้เชิงลึก\n",
"\n",
"เพื่อเริ่มการฝึกสอนเครือข่ายประสาทเทียม เราจำเป็นต้องแปลงภาพทั้งหมดให้เป็นเทนเซอร์ และสร้างเทนเซอร์ที่สอดคล้องกับป้ายกำกับ (หมายเลขคลาส) เฟรมเวิร์กของเครือข่ายประสาทเทียมส่วนใหญ่มีเครื่องมือที่ใช้งานง่ายสำหรับจัดการกับภาพ:\n",
"เพื่อเริ่มต้นการฝึกฝนเครือข่ายประสาทเทียม เราจำเป็นต้องแปลงภาพทั้งหมดเป็นเทนเซอร์ และสร้างเทนเซอร์ที่สอดคล้องกับป้ายกำกับ (หมายเลขคลาส) เฟรมเวิร์กเครือข่ายประสาทเทียมส่วนใหญ่มีเครื่องมือที่ง่ายต่อการจัดการกับภาพ:\n",
"* ใน Tensorflow ใช้ `tf.keras.preprocessing.image_dataset_from_directory`\n",
"* ใน PyTorch ใช้ `torchvision.datasets.ImageFolder`\n",
"\n",
"จากที่คุณเห็นในภาพด้านบน ภาพทั้งหมดมีอัตราส่วนใกล้เคียงกับสี่เหลี่ยมจัตุรัส ดังนั้นเราจำเป็นต้องปรับขนาดภาพทั้งหมดให้เป็นขนาดสี่เหลี่ยมจัตุรัส นอกจากนี้ เรายังสามารถจัดระเบียบภาพในรูปแบบของมินิแบตช์ได้อีกด้วย\n"
"ดังที่คุณเห็นจากภาพด้านบน ภาพทั้งหมดมีอัตราส่วนใกล้เคียงกับรูปทรงสี่เหลี่ยมจัตุรัส ดังนั้นเราจำเป็นต้องปรับขนาดภาพทั้งหมดให้เป็นขนาดสี่เหลี่ยมจัตุรัส นอกจากนี้ เรายังสามารถจัดระเบียบภาพในรูปแบบมินิแบตช์ได้อีกด้วย\n"
]
},
{
@ -162,11 +182,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"ตอนนี้เรามาดูขนาดของเทนเซอร์ในชุดข้อมูลของเรากัน หากคุณทำทุกอย่างถูกต้อง ขนาดขององค์ประกอบการฝึกอบรมควรเป็น\n",
"ตอนนี้เรามาพิมพ์ขนาดของเทนเซอร์ในชุดข้อมูลของเรา หากคุณทำทุกอย่างถูกต้อง ขนาดขององค์ประกอบการฝึกอบรมควรเป็น\n",
" * `(batch_size,image_size,image_size,3)` สำหรับ Tensorflow, `batch_size,3,image_size,image_size` สำหรับ PyTorch\n",
" * `batch_size` สำหรับ Labels\n",
"\n",
"Labels ควรประกอบด้วยตัวเลขที่แสดงจำนวนคลาส\n"
" \n",
" Labels ควรมีตัวเลขที่แสดงจำนวนคลาส\n"
]
},
{
@ -231,13 +251,13 @@
"## กำหนดเครือข่ายประสาทเทียม\n",
"\n",
"สำหรับการจำแนกภาพ คุณควรพิจารณากำหนดเครือข่ายประสาทเทียมแบบคอนโวลูชันที่มีหลายชั้น สิ่งที่ควรระวัง:\n",
"* คำนึงถึงโครงสร้างแบบพีระมิด เช่น จำนวนฟิลเตอร์ควรเพิ่มขึ้นเมื่อชั้นลึกลง\n",
"* คำนึงถึงโครงสร้างแบบพีระมิด เช่น จำนวนฟิลเตอร์ควรเพิ่มขึ้นเมื่อชั้นลึกลงไป\n",
"* อย่าลืมฟังก์ชันการกระตุ้นระหว่างชั้น (ReLU) และ Max Pooling\n",
"* ตัวจำแนกสุดท้ายสามารถมีหรือไม่มีชั้นซ่อนก็ได้ แต่จำนวนเซลล์ประสาทในชั้นเอาต์พุตควรเท่ากับจำนวนคลาส\n",
"\n",
"สิ่งสำคัญคือการตั้งค่าฟังก์ชันการกระตุ้นในชั้นสุดท้าย + ฟังก์ชันการสูญเสียให้ถูกต้อง:\n",
"สิ่งสำคัญคือการตั้งค่าฟังก์ชันการกระตุ้นในชั้นสุดท้ายและฟังก์ชันการสูญเสียให้ถูกต้อง:\n",
"* ใน Tensorflow คุณสามารถใช้ `softmax` เป็นฟังก์ชันการกระตุ้น และ `sparse_categorical_crossentropy` เป็นฟังก์ชันการสูญเสีย ความแตกต่างระหว่าง sparse categorical cross-entropy และแบบไม่ sparse คือแบบแรกคาดหวังผลลัพธ์เป็นหมายเลขคลาส ไม่ใช่เวกเตอร์แบบ one-hot\n",
"* ใน PyTorch คุณสามารถตั้งค่าชั้นสุดท้ายโดยไม่มีฟังก์ชันการกระตุ้น และใช้ฟังก์ชันการสูญเสีย `CrossEntropyLoss` ฟังก์ชันนี้จะใช้ softmax โดยอัตโนมัติ\n"
"* ใน PyTorch คุณสามารถมีชั้นสุดท้ายโดยไม่มีฟังก์ชันการกระตุ้น และใช้ฟังก์ชันการสูญเสีย `CrossEntropyLoss` ฟังก์ชันนี้จะใช้ softmax โดยอัตโนมัติ\n"
]
},
{
@ -253,11 +273,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## ฝึกอบรมเครือข่ายประสาทเทียม\n",
"## ฝึกฝนเครือข่ายประสาทเทียม\n",
"\n",
"ตอนนี้เราพร้อมที่จะฝึกอบรมเครือข่ายประสาทเทียมแล้ว ในระหว่างการฝึกอบรม โปรดเก็บข้อมูลความแม่นยำ (accuracy) ของข้อมูลการฝึก (train data) และข้อมูลการทดสอบ (test data) ในแต่ละ epoch จากนั้นสร้างกราฟความแม่นยำเพื่อดูว่ามีการ overfitting หรือไม่\n",
"ตอนนี้เราพร้อมที่จะฝึกฝนเครือข่ายประสาทเทียมแล้ว ในระหว่างการฝึกฝน โปรดรวบรวมค่าความแม่นยำของข้อมูลการฝึกและข้อมูลการทดสอบในแต่ละรอบ และจากนั้นสร้างกราฟแสดงค่าความแม่นยำเพื่อดูว่ามีการเกิด overfitting หรือไม่\n",
"\n",
"> เพื่อเร่งความเร็วในการฝึกอบรม คุณจำเป็นต้องใช้ GPU หากมีให้ใช้งาน โดย TensorFlow/Keras จะใช้ GPU โดยอัตโนมัติ แต่ใน PyTorch คุณจำเป็นต้องย้ายทั้งโมเดลและข้อมูลไปยัง GPU ระหว่างการฝึกอบรมด้วยวิธี `.to()` เพื่อใช้ประโยชน์จากการเร่งความเร็วของ GPU\n"
"> เพื่อเร่งความเร็วในการฝึกฝน คุณจำเป็นต้องใช้ GPU หากมีให้ใช้งาน ในขณะที่ TensorFlow/Keras จะใช้ GPU โดยอัตโนมัติ ใน PyTorch คุณต้องย้ายทั้งโมเดลและข้อมูลไปยัง GPU ระหว่างการฝึกฝนโดยใช้เมธอด `.to()` เพื่อใช้ประโยชน์จากการเร่งความเร็วของ GPU\n"
]
},
{
@ -295,20 +315,20 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"คุณสามารถพูดอะไรเกี่ยวกับการเกิด Overfitting? และมีวิธีใดบ้างที่สามารถปรับปรุงความแม่นยำของโมเดลได้\n",
"คุณสามารถพูดถึงเรื่องการเกิด Overfitting ได้อย่างไร? และมีวิธีใดบ้างที่สามารถปรับปรุงความแม่นยำของโมเดลได้\n",
"\n",
"## ตัวเลือกเพิ่มเติม: คำนวณ Top3 Accuracy\n",
"## ตัวเลือก: คำนวณ Top-3 Accuracy\n",
"\n",
"ในแบบฝึกหัดนี้ เรากำลังจัดการกับการจำแนกประเภทที่มีจำนวนคลาสค่อนข้างมาก (35 คลาส) ดังนั้นผลลัพธ์ของเรา - ความแม่นยำในการตรวจสอบประมาณ 50% - ถือว่าดีมาก ชุดข้อมูลมาตรฐานอย่าง ImageNet มีจำนวนคลาสมากกว่านี้อีก - ถึง 1000 คลาส\n",
"ในแบบฝึกหัดนี้ เรากำลังจัดการกับการจำแนกประเภทที่มีจำนวนคลาสค่อนข้างมาก (35 คลาส) ดังนั้นผลลัพธ์ของเรา - ความแม่นยำในการตรวจสอบประมาณ 50% - ถือว่าดีทีเดียว ชุดข้อมูลมาตรฐาน ImageNet มีจำนวนคลาสมากกว่านี้อีก - ถึง 1000 คลาส\n",
"\n",
"ในกรณีเช่นนี้ การทำให้โมเดล **ทำนายคลาสได้ถูกต้องเสมอ** เป็นเรื่องยาก มีบางกรณีที่สายพันธุ์สองสายพันธุ์มีความคล้ายคลึงกันมาก และโมเดลให้ค่าความน่าจะเป็นที่ใกล้เคียงกัน (เช่น 0.45 และ 0.43) หากเราวัดความแม่นยำแบบมาตรฐาน กรณีนี้จะถือว่าเป็นข้อผิดพลาด แม้ว่าโมเดลจะทำผิดพลาดเพียงเล็กน้อยก็ตาม ด้วยเหตุนี้ เรามักจะวัดอีกหนึ่งตัวชี้วัด - ความแม่นยำภายใน 3 การทำนายที่มีความน่าจะเป็นสูงที่สุดของโมเดล\n",
"ในกรณีเช่นนี้ การทำให้โมเดล **ทำนายคลาสได้ถูกต้องเสมอ** เป็นเรื่องยาก มีบางกรณีที่สายพันธุ์สองสายพันธุ์มีความคล้ายคลึงกันมาก และโมเดลให้ค่าความน่าจะเป็นที่ใกล้เคียงกัน (เช่น 0.45 และ 0.43) หากเราวัดความแม่นยำแบบมาตรฐาน กรณีนี้จะถือว่าเป็นข้อผิดพลาด แม้ว่าโมเดลจะทำผิดพลาดเพียงเล็กน้อยก็ตาม ด้วยเหตุนี้ เรามักจะวัดเมตริกอีกตัวหนึ่ง - ความแม่นยำภายใน 3 การทำนายที่มีความน่าจะเป็นสูงที่สุดของโมเดล\n",
"\n",
"เราจะถือว่ากรณีนี้ถูกต้อง หากป้ายกำกับเป้าหมายอยู่ภายใน 3 การทำนายที่มีความน่าจะเป็นสูงที่สุดของโมเดล\n",
"เราจะถือว่ากรณีนี้ถูกต้องหากป้ายกำกับเป้าหมายอยู่ภายใน 3 การทำนายที่มีความน่าจะเป็นสูงที่สุดของโมเดล\n",
"\n",
"ในการคำนวณ Top-3 Accuracy บนชุดข้อมูลทดสอบ คุณจำเป็นต้องตรวจสอบชุดข้อมูลด้วยตนเอง ใช้เครือข่ายประสาทเทียมเพื่อรับการทำนาย และจากนั้นทำการคำนวณ คำแนะนำบางประการ:\n",
"ในการคำนวณ Top-3 Accuracy บนชุดข้อมูลทดสอบ คุณจำเป็นต้องตรวจสอบชุดข้อมูลด้วยตนเอง ใช้เครือข่ายประสาทเทียมเพื่อรับการทำนาย และทำการคำนวณตามคำแนะนำดังนี้:\n",
"\n",
"* ใน Tensorflow ใช้ฟังก์ชัน `tf.nn.in_top_k` เพื่อตรวจสอบว่า `predictions` (ผลลัพธ์ของโมเดล) อยู่ใน top-k (ส่ง `k=3` เป็นพารามิเตอร์) โดยสัมพันธ์กับ `targets` ฟังก์ชันนี้จะคืนค่า tensor ของค่าบูลีน ซึ่งสามารถแปลงเป็น `int` ด้วย `tf.cast` และสะสมค่าด้วย `tf.reduce_sum`\n",
"* ใน PyTorch คุณสามารถใช้ฟังก์ชัน `torch.topk` เพื่อรับดัชนีของคลาสที่มีความน่าจะเป็นสูงสุด และจากนั้นตรวจสอบว่าคลาสที่ถูกต้องอยู่ในนั้นหรือไม่ ดู [ลิงก์นี้](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) สำหรับคำแนะนำเพิ่มเติม\n"
"* ใน Tensorflow ใช้ฟังก์ชัน `tf.nn.in_top_k` เพื่อตรวจสอบว่า `predictions` (ผลลัพธ์ของโมเดล) อยู่ใน top-k หรือไม่ (ส่ง `k=3` เป็นพารามิเตอร์) โดยเปรียบเทียบกับ `targets` ฟังก์ชันนี้จะคืนค่า tensor ของค่าบูลีน ซึ่งสามารถแปลงเป็น `int` ได้โดยใช้ `tf.cast` และสะสมค่าด้วย `tf.reduce_sum`\n",
"* ใน PyTorch คุณสามารถใช้ฟังก์ชัน `torch.topk` เพื่อรับดัชนีของคลาสที่มีความน่าจะเป็นสูงสุด และตรวจสอบว่าคลาสที่ถูกต้องอยู่ในนั้นหรือไม่ ดู [ลิงก์นี้](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) สำหรับคำแนะนำเพิ่มเติม\n"
]
},
{
@ -326,7 +346,7 @@
"source": [
"## ตัวเลือกเพิ่มเติม: สร้างการจำแนกประเภทแมวกับสุนัข\n",
"\n",
"เรายังต้องการดูว่าการจำแนกประเภทแบบไบนารีระหว่างแมวกับสุนัขของเราจะมีความแม่นยำเพียงใดบนชุดข้อมูลเดียวกันนี้ ในการทำเช่นนี้ เราจำเป็นต้องปรับเปลี่ยนป้ายกำกับ:\n"
"เราต้องการดูว่าการจำแนกประเภทแบบไบนารีระหว่างแมวกับสุนัขจะมีความแม่นยำแค่ไหนในชุดข้อมูลเดียวกัน เพื่อทำสิ่งนี้ เราจำเป็นต้องปรับป้ายกำกับ:\n"
]
},
{
@ -352,7 +372,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**ข้อจำกัดความรับผิดชอบ**: \nเอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาต้นทางควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้\n"
"\n---\n\n**ข้อจำกัดความรับผิดชอบ**: \nเอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้องมากที่สุด แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความผิดที่เกิดจากการใช้การแปลนี้\n"
]
}
],
@ -378,8 +398,8 @@
"version": "3.9.5"
},
"coopTranslator": {
"original_hash": "1de3ae931831253c3198d899da48bfe5",
"translation_date": "2025-08-29T09:46:38+00:00",
"original_hash": "df7d1f7da8d2617b76acd93115776ca4",
"translation_date": "2025-10-03T14:38:03+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb",
"language_code": "th"
}

View File

@ -1,29 +1,29 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "f3d2cee9cb3c52160419e560c57a690e",
"translation_date": "2025-08-29T08:47:36+00:00",
"original_hash": "b70fcf7fcee862990f848c679090943f",
"translation_date": "2025-10-03T14:55:11+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/README.md",
"language_code": "th"
}
-->
# การจำแนกใบหน้าของสัตว์เลี้ยง
# การจำแนกใบหน้าสัตว์เลี้ยง
งานในห้องปฏิบัติการจาก [AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners)
## ภารกิจ
## งานที่ต้องทำ
ลองจินตนาการว่าคุณต้องพัฒนาแอปพลิเคชันสำหรับสถานรับเลี้ยงสัตว์เลี้ยงเพื่อจัดเก็บข้อมูลสัตว์ทั้งหมด หนึ่งในฟีเจอร์ที่ยอดเยี่ยมของแอปพลิเคชันนี้คือการค้นหาสายพันธุ์จากภาพถ่ายโดยอัตโนมัติ ซึ่งสามารถทำได้สำเร็จด้วยการใช้โครงข่ายประสาทเทียม
ลองจินตนาการว่าคุณต้องพัฒนาแอปพลิเคชันสำหรับสถานรับเลี้ยงสัตว์เลี้ยงเพื่อจัดเก็บข้อมูลสัตว์เลี้ยงทั้งหมด หนึ่งในฟีเจอร์ที่ยอดเยี่ยมของแอปพลิเคชันนี้คือการค้นหาสายพันธุ์จากภาพถ่ายโดยอัตโนมัติ ซึ่งสามารถทำได้สำเร็จโดยใช้เครือข่ายประสาทเทียม
คุณจำเป็นต้องฝึกโครงข่ายประสาทเทียมแบบคอนโวลูชันเพื่อจำแนกสายพันธุ์ต่าง ๆ ของแมวและสุนัขโดยใช้ชุดข้อมูล **Pet Faces**
คุณต้องฝึกเครือข่ายประสาทเทียมแบบคอนโวลูชันเพื่อจำแนกสายพันธุ์ต่าง ๆ ของแมวและสุนัขโดยใช้ชุดข้อมูล **Pet Faces**
## ชุดข้อมูล
เราจะใช้ชุดข้อมูล **Pet Faces** ซึ่งได้มาจากชุดข้อมูลสัตว์เลี้ยง [Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/) ชุดข้อมูลนี้ประกอบด้วยสายพันธุ์สุนัขและแมวทั้งหมด 35 สายพันธุ์
เราจะใช้ [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/) ซึ่งมีภาพของสุนัขและแมวจาก 37 สายพันธุ์ที่แตกต่างกัน
![ชุดข้อมูลที่เราจะใช้งาน](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.th.png)
![ชุดข้อมูลที่เราจะใช้](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.th.png)
ในการดาวน์โหลดชุดข้อมูล ให้ใช้โค้ดนี้:
เพื่อดาวน์โหลดชุดข้อมูล ให้ใช้โค้ดนี้:
```python
!wget https://thor.robots.ox.ac.uk/~vgg/data/pets/images.tar.gz
@ -31,15 +31,17 @@ CO_OP_TRANSLATOR_METADATA:
!rm images.tar.gz
```
## เริ่มต้นด้วย Notebook
**หมายเหตุ:** ภาพในชุดข้อมูล Oxford-IIIT Pet Dataset ถูกจัดเรียงตามชื่อไฟล์ (เช่น `Abyssinian_1.jpg`, `Bengal_2.jpg`) โน้ตบุ๊กนี้มีโค้ดสำหรับจัดระเบียบภาพเหล่านี้ลงในไดเรกทอรีเฉพาะสายพันธุ์เพื่อให้ง่ายต่อการจำแนก
เริ่มต้นการทดลองในห้องปฏิบัติการโดยเปิด [PetFaces.ipynb](PetFaces.ipynb)
## เริ่มต้นโน้ตบุ๊ก
เริ่มต้นงานในห้องปฏิบัติการโดยเปิด [PetFaces.ipynb](PetFaces.ipynb)
## สิ่งที่ได้เรียนรู้
คุณได้แก้ปัญหาที่ค่อนข้างซับซ้อนเกี่ยวกับการจำแนกรูปภาพตั้งแต่เริ่มต้น! แม้ว่าจะมีจำนวนคลาสที่ค่อนข้างมาก แต่คุณก็ยังสามารถได้ความแม่นยำที่น่าพอใจ! นอกจากนี้ การวัดความแม่นยำแบบ top-k ก็มีเหตุผล เพราะบางคลาสอาจสร้างความสับสนได้ง่าย แม้แต่สำหรับมนุษย์เองก็ตาม
คุณได้แก้ปัญหาที่ค่อนข้างซับซ้อนเกี่ยวกับการจำแนกภาพตั้งแต่เริ่มต้น! มีคลาสจำนวนมาก และคุณยังสามารถได้ความแม่นยำที่เหมาะสม! นอกจากนี้ยังสมเหตุสมผลที่จะวัดความแม่นยำแบบ top-k เพราะบางคลาสอาจสับสนได้ง่าย ซึ่งแม้แต่มนุษย์เองก็อาจแยกแยะไม่ชัดเจน
---
**ข้อจำกัดความรับผิดชอบ**:
เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาต้นทางควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญ เราจะไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้
เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้องมากที่สุด แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามนุษย์ที่มีความเชี่ยวชาญ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความผิดที่เกิดจากการใช้การแปลนี้

View File

@ -6,11 +6,13 @@
"source": [
"# Pag-uuri ng Mukha ng Alagang Hayop\n",
"\n",
"Takdang-Aralin mula sa [AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners).\n",
"Takdang-aralin mula sa [AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners).\n",
"\n",
"### Pagkuha ng Datos\n",
"### Pagkuha ng Data\n",
"\n",
"Sa takdang-araling ito, magtutuon tayo sa isang medyo simpleng gawain ng pag-uuri - ang pag-uuri ng mukha ng alagang hayop. Ang dataset na ito ay binubuo ng mga hiwa-hiwalay na mukha mula sa [Oxford-IIIT Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/). Magsimula tayo sa pag-load at pag-visualize ng dataset.\n"
"Sa takdang-araling ito, magtutuon tayo sa isang medyo simpleng gawain ng pag-uuri - ang pag-uuri ng mukha ng alagang hayop. Gagamitin natin ang [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), na naglalaman ng mga larawan ng 37 iba't ibang lahi ng aso at pusa. Magsimula tayo sa pag-download at pag-visualize ng dataset.\n",
"\n",
"**Tandaan:** Ang Oxford-IIIT Pet Dataset ay naglalaman ng buong larawan ng mga alagang hayop. Ang mga larawan ay iaayos ayon sa lahi sa na-extract na folder.\n"
]
},
{
@ -86,6 +88,24 @@
"metadata": {},
"outputs": [],
"source": [
"# Note: The Oxford-IIIT Pet Dataset extracts to a folder named 'images'\n",
"# Images are named by breed (e.g., 'Abyssinian_1.jpg')\n",
"# We need to organize them into breed-specific subdirectories\n",
"import os\n",
"from collections import defaultdict\n",
"\n",
"# Organize images by breed\n",
"if not os.path.exists('petfaces'):\n",
" os.makedirs('petfaces')\n",
" for img_file in os.listdir('images'):\n",
" if img_file.endswith(('.jpg', '.png')):\n",
" # Extract breed name from filename (everything before the last underscore and number)\n",
" breed = '_'.join(img_file.split('_')[:-1])\n",
" breed_dir = os.path.join('petfaces', breed)\n",
" if not os.path.exists(breed_dir):\n",
" os.makedirs(breed_dir)\n",
" os.rename(os.path.join('images', img_file), os.path.join(breed_dir, img_file))\n",
"\n",
"for cls in os.listdir('petfaces'):\n",
" print(cls)\n",
" display_images([Image.open(os.path.join('petfaces',cls,x)) \n",
@ -126,11 +146,11 @@
"source": [
"## Paghahanda ng dataset para sa Deep Learning\n",
"\n",
"Upang masimulan ang pagsasanay ng ating neural network, kailangan nating i-convert ang lahat ng mga larawan sa tensors, at gumawa rin ng mga tensors na tumutugma sa mga label (mga numero ng klase). Karamihan sa mga neural network frameworks ay may simpleng mga tool para sa pagproseso ng mga larawan:\n",
"Para masimulan ang pag-train ng ating neural network, kailangan nating i-convert ang lahat ng larawan sa tensors, at gumawa rin ng tensors na tumutugma sa mga label (mga numero ng klase). Karamihan sa mga neural network frameworks ay may simpleng mga tool para sa pagproseso ng mga larawan:\n",
"* Sa Tensorflow, gamitin ang `tf.keras.preprocessing.image_dataset_from_directory`\n",
"* Sa PyTorch, gamitin ang `torchvision.datasets.ImageFolder`\n",
"\n",
"Tulad ng nakita mo mula sa mga larawan sa itaas, karamihan sa mga ito ay may halos parisukat na ratio ng larawan, kaya kailangan nating i-resize ang lahat ng mga larawan sa parisukat na sukat. Bukod dito, maaari rin nating ayusin ang mga larawan sa minibatches.\n"
"Tulad ng nakita mo sa mga larawan sa itaas, karamihan sa mga ito ay malapit sa square image ratio, kaya kailangan nating i-resize ang lahat ng larawan sa square size. Bukod dito, maaari nating ayusin ang mga larawan sa minibatches.\n"
]
},
{
@ -162,11 +182,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Ngayon, ipapakita natin ang laki ng mga tensor sa ating dataset. Kung nagawa mo nang tama ang lahat, ang laki ng mga training elements ay dapat na:\n",
"Ngayon, ipapakita natin ang laki ng mga tensor sa ating dataset. Kung nagawa mo nang tama ang lahat, ang laki ng mga elemento ng pagsasanay ay dapat na\n",
" * `(batch_size,image_size,image_size,3)` para sa Tensorflow, `batch_size,3,image_size,image_size` para sa PyTorch\n",
" * `batch_size` para sa Labels\n",
" \n",
" Ang Labels ay dapat maglaman ng mga numero ng klase.\n"
"\n",
"Ang Labels ay dapat maglaman ng mga numero ng mga klase.\n"
]
},
{
@ -255,9 +275,9 @@
"source": [
"## Sanayin ang Neural Network\n",
"\n",
"Ngayon, handa na tayong sanayin ang neural network. Habang nagsasanay, mangyaring kolektahin ang accuracy sa train at test data sa bawat epoch, at pagkatapos ay i-plot ang accuracy upang makita kung may overfitting.\n",
"Ngayon, handa na tayong sanayin ang neural network. Sa panahon ng pagsasanay, mangyaring kolektahin ang accuracy sa train at test data sa bawat epoch, at pagkatapos ay i-plot ang accuracy upang makita kung may overfitting.\n",
"\n",
"> Upang mapabilis ang pagsasanay, kailangan mong gumamit ng GPU kung ito ay magagamit. Habang ang TensorFlow/Keras ay awtomatikong gagamit ng GPU, sa PyTorch kailangan mong ilipat ang parehong model at data sa GPU habang nagsasanay gamit ang `.to()` method upang magamit ang bilis ng GPU.\n"
"> Para mapabilis ang pagsasanay, kailangan mong gumamit ng GPU kung available. Habang awtomatikong gagamitin ng TensorFlow/Keras ang GPU, sa PyTorch kailangan mong ilipat ang parehong modelo at data sa GPU sa panahon ng pagsasanay gamit ang `.to()` method upang magamit ang GPU acceleration.\n"
]
},
{
@ -295,20 +315,20 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Ano ang masasabi mo tungkol sa overfitting? Ano ang maaaring gawin upang mapabuti ang accuracy ng modelo?\n",
"Ano ang masasabi mo tungkol sa overfitting? Ano ang maaaring gawin upang mapabuti ang katumpakan ng modelo?\n",
"\n",
"## Opsyonal: Kalkulahin ang Top-3 Accuracy\n",
"\n",
"Sa ehersisyong ito, ang ating tinatrabaho ay classification na may medyo mataas na bilang ng mga klase (35), kaya ang ating resulta - humigit-kumulang 50% validation accuracy - ay maituturing na maganda. Ang karaniwang ImageNet dataset ay may mas marami pa - 1000 klase.\n",
"Sa ehersisyong ito, ang ating tinatrabaho ay isang classification na may medyo mataas na bilang ng mga klase (35), kaya ang ating resulta - humigit-kumulang 50% validation accuracy - ay medyo maganda. Ang karaniwang dataset ng ImageNet ay may mas marami pa - 1000 klase.\n",
"\n",
"Sa ganitong mga kaso, mahirap tiyakin na ang modelo ay **palaging** tama sa pag-predict ng klase. May mga pagkakataon na ang dalawang breed ay halos magkapareho, at ang modelo ay nagbibigay ng halos magkaparehong probabilidad (hal., 0.45 at 0.43). Kung susukatin natin ang standard accuracy, ito ay ituturing na maling kaso, kahit na napakaliit lang ng pagkakamali ng modelo. Dahil dito, madalas tayong gumagamit ng ibang metric - ang accuracy sa loob ng top 3 pinaka-probable na predictions ng modelo.\n",
"Sa ganitong mga kaso, mahirap tiyakin na ang modelo ay **palaging** tama sa pag-predict ng klase. May mga pagkakataon na ang dalawang breed ay halos magkapareho, at ang modelo ay nagbibigay ng halos magkaparehong probabilidad (hal., 0.45 at 0.43). Kung susukatin natin ang karaniwang accuracy, ito ay ituturing na maling kaso, kahit na napakaliit ng pagkakamali ng modelo. Dahil dito, madalas nating sinusukat ang isa pang metric - ang accuracy sa loob ng top 3 pinaka-probable na prediksyon ng modelo.\n",
"\n",
"Itinuturing natin na tama ang kaso kung ang target label ay nasa loob ng top 3 predictions ng modelo.\n",
"Itinuturing nating tama ang kaso kung ang target label ay nasa loob ng top 3 prediksyon ng modelo.\n",
"\n",
"Upang makalkula ang top-3 accuracy sa test dataset, kailangan mong manu-manong suriin ang dataset, i-apply ang neural network upang makuha ang prediction, at pagkatapos ay gawin ang mga kalkulasyon. Narito ang ilang mga pahiwatig:\n",
"Upang makalkula ang top-3 accuracy sa test dataset, kailangan mong manu-manong suriin ang dataset, i-apply ang neural network upang makuha ang prediksyon, at pagkatapos ay gawin ang mga kalkulasyon. Ilang mga pahiwatig:\n",
"\n",
"* Sa Tensorflow, gamitin ang `tf.nn.in_top_k` function upang makita kung ang `predictions` (output ng modelo) ay nasa top-k (ipasa ang `k=3` bilang parameter), kaugnay ng `targets`. Ang function na ito ay nagbabalik ng tensor ng boolean values, na maaaring i-convert sa `int` gamit ang `tf.cast`, at pagkatapos ay i-accumulate gamit ang `tf.reduce_sum`.\n",
"* Sa PyTorch, maaari mong gamitin ang `torch.topk` function upang makuha ang mga indices ng mga klase na may pinakamataas na probabilidad, at pagkatapos ay tingnan kung ang tamang klase ay kabilang sa mga ito. Tingnan ang [ito](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) para sa karagdagang pahiwatig.\n"
"* Sa Tensorflow, gamitin ang `tf.nn.in_top_k` na function upang makita kung ang `predictions` (output ng modelo) ay nasa top-k (ipasa ang `k=3` bilang parameter), kaugnay sa `targets`. Ang function na ito ay nagbabalik ng tensor ng mga boolean values, na maaaring i-convert sa `int` gamit ang `tf.cast`, at pagkatapos ay i-accumulate gamit ang `tf.reduce_sum`.\n",
"* Sa PyTorch, maaari mong gamitin ang `torch.topk` na function upang makuha ang mga indices ng mga klase na may pinakamataas na probabilidad, at pagkatapos ay tingnan kung ang tamang klase ay kabilang sa mga ito. Tingnan ang [ito](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) para sa higit pang mga pahiwatig.\n"
]
},
{
@ -324,9 +344,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## Opsyonal: Gumawa ng klasipikasyon ng Pusa vs. Aso\n",
"## Opsyonal: Gumawa ng klasipikasyon ng Pusa laban sa Aso\n",
"\n",
"Gusto rin naming makita kung gaano katumpak ang aming binary na klasipikasyon ng pusa vs. aso sa parehong dataset. Para magawa ito, kailangan nating ayusin ang mga label:\n"
"Gusto rin naming makita kung gaano katumpak ang aming binary na klasipikasyon ng pusa laban sa aso sa parehong dataset. Upang gawin ito, kailangan nating ayusin ang mga label:\n"
]
},
{
@ -352,7 +372,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Paunawa**: \nAng dokumentong ito ay isinalin gamit ang AI translation service na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't sinisikap naming maging tumpak, tandaan na ang mga awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa kanyang katutubong wika ang dapat ituring na opisyal na sanggunian. Para sa mahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang hindi pagkakaunawaan o maling interpretasyon na dulot ng paggamit ng pagsasaling ito.\n"
"\n---\n\n**Paunawa**: \nAng dokumentong ito ay isinalin gamit ang AI translation service na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't sinisikap naming maging tumpak, mangyaring tandaan na ang mga awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa kanyang katutubong wika ang dapat ituring na opisyal na sanggunian. Para sa mahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang hindi pagkakaunawaan o maling interpretasyon na dulot ng paggamit ng pagsasaling ito.\n"
]
}
],
@ -378,8 +398,8 @@
"version": "3.9.5"
},
"coopTranslator": {
"original_hash": "1de3ae931831253c3198d899da48bfe5",
"translation_date": "2025-08-28T03:05:04+00:00",
"original_hash": "df7d1f7da8d2617b76acd93115776ca4",
"translation_date": "2025-10-03T14:43:26+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb",
"language_code": "tl"
}

View File

@ -1,8 +1,8 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "f3d2cee9cb3c52160419e560c57a690e",
"translation_date": "2025-08-28T02:30:12+00:00",
"original_hash": "b70fcf7fcee862990f848c679090943f",
"translation_date": "2025-10-03T14:56:35+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/README.md",
"language_code": "tl"
}
@ -13,15 +13,15 @@ Takdang-Aralin mula sa [AI for Beginners Curriculum](https://github.com/microsof
## Gawain
Isipin na kailangan mong bumuo ng isang aplikasyon para sa nursery ng mga alagang hayop upang i-catalog ang lahat ng mga alaga. Isa sa mga magagandang tampok ng ganitong aplikasyon ay ang awtomatikong pagtukoy ng lahi mula sa isang litrato. Magagawa ito nang matagumpay gamit ang neural networks.
Isipin na kailangan mong gumawa ng isang aplikasyon para sa nursery ng mga alagang hayop upang i-catalog ang lahat ng mga alaga. Isa sa mga magagandang tampok ng ganitong aplikasyon ay ang awtomatikong pagtukoy ng lahi mula sa isang litrato. Magagawa ito nang matagumpay gamit ang neural networks.
Kailangan mong sanayin ang isang convolutional neural network upang uriin ang iba't ibang lahi ng pusa at aso gamit ang **Pet Faces** dataset.
## Ang Dataset
Gagamitin natin ang **Pet Faces** dataset, na nagmula sa [Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/) pets dataset. Naglalaman ito ng 35 iba't ibang lahi ng aso at pusa.
Gagamitin natin ang [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), na naglalaman ng mga larawan ng 37 iba't ibang lahi ng aso at pusa.
![Dataset na ating gagamitin](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.tl.png)
![Dataset na gagamitin natin](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.tl.png)
Upang i-download ang dataset, gamitin ang code snippet na ito:
@ -31,15 +31,17 @@ Upang i-download ang dataset, gamitin ang code snippet na ito:
!rm images.tar.gz
```
**Tandaan:** Ang mga larawan sa Oxford-IIIT Pet Dataset ay nakaayos ayon sa filename (hal., `Abyssinian_1.jpg`, `Bengal_2.jpg`). Ang notebook ay may kasamang code upang ayusin ang mga larawang ito sa mga subdirectory na partikular sa lahi para sa mas madaling pag-uuri.
## Simula ng Notebook
Simulan ang lab sa pamamagitan ng pagbukas ng [PetFaces.ipynb](PetFaces.ipynb)
## Aral
Nalutas mo ang isang medyo komplikadong problema ng pag-uuri ng imahe mula sa simula! Maraming klase, ngunit nagawa mo pa ring makamit ang makatwirang katumpakan! Makatuwiran din na sukatin ang top-k accuracy, dahil madali itong malito sa ilang mga klase na hindi gaanong naiiba kahit para sa mga tao.
Nalutas mo ang isang medyo komplikadong problema ng pag-uuri ng imahe mula sa simula! Maraming klase, ngunit nagawa mo pa rin makamit ang makatwirang katumpakan! Makatuwiran din na sukatin ang top-k accuracy, dahil madali itong malito sa ilang mga klase na hindi malinaw na magkaiba kahit sa mga tao.
---
**Paunawa**:
Ang dokumentong ito ay isinalin gamit ang AI translation service na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't sinisikap naming maging tumpak, pakitandaan na ang mga awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa kanyang katutubong wika ang dapat ituring na opisyal na sanggunian. Para sa mahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang hindi pagkakaunawaan o maling interpretasyon na dulot ng paggamit ng pagsasaling ito.
Ang dokumentong ito ay isinalin gamit ang AI translation service na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't sinisikap naming maging tumpak, mangyaring tandaan na ang mga awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa kanyang katutubong wika ang dapat ituring na opisyal na sanggunian. Para sa mahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang hindi pagkakaunawaan o maling interpretasyon na dulot ng paggamit ng pagsasaling ito.

View File

@ -6,11 +6,13 @@
"source": [
"# Evcil Hayvan Yüzlerinin Sınıflandırılması\n",
"\n",
"[AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners) kapsamında bir laboratuvar ödevi.\n",
"[AI for Beginners Müfredatı](https://github.com/microsoft/ai-for-beginners) kapsamında bir laboratuvar ödevi.\n",
"\n",
"### Veriyi Alma\n",
"\n",
"Bu ödevde, nispeten basit bir sınıflandırma görevi olan evcil hayvan yüzlerinin sınıflandırılmasına odaklanacağız. Bu veri seti, [Oxford-IIIT Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/) içinden kesilmiş yüzlerden oluşmaktadır. Hadi veri setini yükleyip görselleştirmeye başlayalım.\n"
"Bu ödevde, nispeten basit bir sınıflandırma görevi olan evcil hayvan yüzlerinin sınıflandırılmasına odaklanacağız. [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/) adlı veri setini kullanacağız. Bu veri seti, 37 farklı köpek ve kedi türüne ait görüntüler içerir. Hadi veri setini indirip görselleştirmeye başlayalım.\n",
"\n",
"**Not:** Oxford-IIIT Pet Dataset, tam evcil hayvan görüntüleri içerir. Görüntüler, çıkarılan klasörde türlerine göre organize edilecektir.\n"
]
},
{
@ -46,7 +48,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Bir listedeki bir dizi görüntüyü göstermek için genel bir işlev tanımlayacağız:\n"
"Bir listedeki bir dizi görüntüyü göstermek için genel bir fonksiyon tanımlayacağız:\n"
]
},
{
@ -77,7 +79,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Şimdi tüm sınıf alt dizinlerini gezelim ve her sınıfın ilk birkaç görüntüsünü çizelim:\n"
"Şimdi tüm sınıf alt dizinlerini dolaşalım ve her sınıfın ilk birkaç görüntüsünü çizelim:\n"
]
},
{
@ -86,6 +88,24 @@
"metadata": {},
"outputs": [],
"source": [
"# Note: The Oxford-IIIT Pet Dataset extracts to a folder named 'images'\n",
"# Images are named by breed (e.g., 'Abyssinian_1.jpg')\n",
"# We need to organize them into breed-specific subdirectories\n",
"import os\n",
"from collections import defaultdict\n",
"\n",
"# Organize images by breed\n",
"if not os.path.exists('petfaces'):\n",
" os.makedirs('petfaces')\n",
" for img_file in os.listdir('images'):\n",
" if img_file.endswith(('.jpg', '.png')):\n",
" # Extract breed name from filename (everything before the last underscore and number)\n",
" breed = '_'.join(img_file.split('_')[:-1])\n",
" breed_dir = os.path.join('petfaces', breed)\n",
" if not os.path.exists(breed_dir):\n",
" os.makedirs(breed_dir)\n",
" os.rename(os.path.join('images', img_file), os.path.join(breed_dir, img_file))\n",
"\n",
"for cls in os.listdir('petfaces'):\n",
" print(cls)\n",
" display_images([Image.open(os.path.join('petfaces',cls,x)) \n",
@ -126,11 +146,11 @@
"source": [
"## Derin Öğrenme için Veri Seti Hazırlama\n",
"\n",
"Sinir ağımızı eğitmeye başlamak için, tüm görüntüleri tensörlere dönüştürmemiz ve ayrıca etiketlere (sınıf numaralarına) karşılık gelen tensörler oluşturmamız gerekiyor. Çoğu sinir ağı framework'ü, görüntülerle çalışmak için basit araçlar içerir:\n",
"Sinir ağımızı eğitmeye başlamak için tüm görüntüleri tensörlere dönüştürmemiz ve ayrıca etiketlere (sınıf numaralarına) karşılık gelen tensörler oluşturmamız gerekiyor. Çoğu sinir ağı çerçevesi, görüntülerle çalışmak için basit araçlar içerir:\n",
"* Tensorflow'da, `tf.keras.preprocessing.image_dataset_from_directory` kullanın\n",
"* PyTorch'ta, `torchvision.datasets.ImageFolder` kullanın\n",
"\n",
"Yukarıdaki resimlerden gördüğünüz gibi, hepsi kareye yakın bir görüntü oranına sahip, bu yüzden tüm görüntüleri kare boyutuna yeniden boyutlandırmamız gerekiyor. Ayrıca, görüntüleri mini gruplar halinde organize edebiliriz.\n"
"Yukarıdaki resimlerden gördüğünüz gibi, hepsi kareye yakın bir görüntü oranına sahip, bu yüzden tüm görüntüleri kare boyutuna yeniden boyutlandırmamız gerekiyor. Ayrıca, görüntüleri mini gruplar halinde düzenleyebiliriz.\n"
]
},
{
@ -162,11 +182,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Şimdi veri setimizdeki tensörlerin boyutlarını yazdıralım. Eğer her şeyi doğru yaptıysanız, eğitim öğelerinin boyutları şu şekilde olmalıdır:\n",
"Şimdi veri setimizdeki tensörlerin boyutlarını yazdıralım. Eğer her şeyi doğru yaptıysanız, eğitim elemanlarının boyutları şu şekilde olmalıdır:\n",
" * Tensorflow için `(batch_size,image_size,image_size,3)`, PyTorch için `batch_size,3,image_size,image_size`\n",
" * Etiketler için `batch_size`\n",
"\n",
"Etiketler sınıf numaralarını içermelidir.\n"
" Etiketler sınıf numaralarını içermelidir.\n"
]
},
{
@ -230,14 +250,14 @@
"source": [
"## Bir sinir ağı tanımlayın\n",
"\n",
"Görüntü sınıflandırması için, muhtemelen birkaç katmanlı bir evrişimli sinir ağı tanımlamalısınız. Dikkat edilmesi gerekenler:\n",
"* Piramit mimarisini aklınızda bulundurun, yani daha derine indikçe filtre sayısı artmalı.\n",
"Görüntü sınıflandırması için, muhtemelen birkaç katmanlı bir evrişimli sinir ağı tanımlamalısınız. Dikkat etmeniz gerekenler:\n",
"* Piramit mimarisini aklınızda bulundurun, yani katmanlar derinleştikçe filtre sayısı artmalı.\n",
"* Katmanlar arasında aktivasyon fonksiyonlarını (ReLU) ve Maksimum Havuzlama'yı (Max Pooling) unutmayın.\n",
"* Son sınıflandırıcı gizli katmanlarla veya gizli katmanlar olmadan olabilir, ancak çıktı nöronlarının sayısı sınıf sayısına eşit olmalıdır.\n",
"* Son sınıflandırıcı gizli katmanlarla veya gizli katmanlar olmadan olabilir, ancak çıkış nöronlarının sayısı sınıf sayısına eşit olmalıdır.\n",
"\n",
"Son katmandaki aktivasyon fonksiyonunu ve kayıp fonksiyonunu doğru ayarlamak önemlidir:\n",
"* Tensorflow'da, aktivasyon olarak `softmax` ve kayıp fonksiyonu olarak `sparse_categorical_crossentropy` kullanabilirsiniz. Sparse kategorik çapraz entropi ile normal kategorik çapraz entropi arasındaki fark, ilkinin çıktıyı bir sınıf numarası olarak beklemesi ve bir one-hot vektörü olarak beklememesidir.\n",
"* PyTorch'ta, son katman aktivasyon fonksiyonu olmadan olabilir ve `CrossEntropyLoss` kayıp fonksiyonunu kullanabilirsiniz. Bu fonksiyon otomatik olarak softmax uygular.\n"
"Son katmandaki aktivasyon fonksiyonunu ve kayıp fonksiyonunu doğru ayarlamak çok önemlidir:\n",
"* Tensorflow'da, aktivasyon olarak `softmax` ve kayıp fonksiyonu olarak `sparse_categorical_crossentropy` kullanabilirsiniz. Sparse kategorik çapraz entropi ile normal kategorik çapraz entropi arasındaki fark, ilkinin çıktıyı bir sınıf numarası olarak beklemesi, bir one-hot vektörü olarak beklememesidir.\n",
"* PyTorch'ta, son katman aktivasyon fonksiyonu olmadan olabilir ve `CrossEntropyLoss` kayıp fonksiyonu kullanılabilir. Bu fonksiyon softmax'i otomatik olarak uygular.\n"
]
},
{
@ -253,11 +273,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## Sinir Ağını Eğit\n",
"## Sinir Ağını Eğitme\n",
"\n",
"Artık sinir ağını eğitmeye hazırız. Eğitim sırasında, her epoch için eğitim ve test verilerindeki doğruluğu toplayın ve ardından aşırı öğrenme olup olmadığını görmek için doğruluğu grafikte gösterin.\n",
"Artık sinir ağını eğitmeye hazırız. Eğitim sırasında, her epoch'ta eğitim ve test verileri üzerindeki doğruluğu toplamalı ve ardından aşırı öğrenme olup olmadığını görmek için doğruluğu grafikle göstermelisiniz.\n",
"\n",
"> Eğitimi hızlandırmak için, varsa GPU kullanmanız gerekir. TensorFlow/Keras GPU'yu otomatik olarak kullanırken, PyTorch'ta GPU hızlandırmasından yararlanmak için hem modeli hem de veriyi `.to()` yöntemiyle GPU'ya taşımanız gerekir.\n"
"> Eğitimi hızlandırmak için, varsa GPU kullanmanız gerekir. TensorFlow/Keras GPU'yu otomatik olarak kullanırken, PyTorch'ta GPU hızlandırmasından yararlanmak için eğitim sırasında hem modeli hem de veriyi `.to()` yöntemiyle GPU'ya taşımanız gerekir.\n"
]
},
{
@ -295,20 +315,20 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"ırı öğrenme hakkında ne söyleyebilirsiniz? Modelin doğruluğunu artırmak için neler yapılabilir?\n",
"Overfitting hakkında ne söyleyebilirsiniz? Modelin doğruluğunu artırmak için neler yapılabilir?\n",
"\n",
"## Opsiyonel: Top3 Doğruluğu Hesaplama\n",
"## Opsiyonel: Top-3 Doğruluğu Hesaplama\n",
"\n",
"Bu alıştırmada, oldukça fazla sayıda sınıf (35) içeren bir sınıflandırma problemiyle uğraşıyorduk, bu yüzden elde ettiğimiz sonuç - yaklaşık %50 doğrulama doğruluğu - oldukça iyi. Standart ImageNet veri seti daha da fazla sınıfa sahiptir - 1000 sınıf.\n",
"\n",
"Bu tür durumlarda modelin **her zaman** doğru sınıfı tahmin etmesini sağlamak zordur. Bazı durumlarda iki tür birbirine çok benzer olabilir ve model çok yakın olasılıklar döndürebilir (örneğin, 0.45 ve 0.43). Standart doğruluğu ölçersek, bu yanlış bir durum olarak kabul edilir, ancak model çok küçük bir hata yapmıştır. Bu nedenle, genellikle başka bir metriği ölçeriz - modelin en olası 3 tahmini içinde doğruluk.\n",
"Bu tür durumlarda, modelin **her zaman** doğru sınıfı tahmin etmesini sağlamak zordur. Bazı durumlarda iki tür birbirine çok benzer olabilir ve model çok yakın olasılıklar döndürebilir (örneğin, 0.45 ve 0.43). Standart doğruluğu ölçersek, bu durum yanlış bir tahmin olarak kabul edilir, ancak model aslında çok küçük bir hata yapmıştır. Bu nedenle, genellikle başka bir metriği ölçeriz - modelin en olası 3 tahmini içinde doğruluğu.\n",
"\n",
"Hedef etiketin modelin en olası 3 tahmini içinde yer aldığı durumları doğru kabul ederiz.\n",
"\n",
"Test veri setinde top-3 doğruluğu hesaplamak için veri setini manuel olarak incelemeniz, sinir ağını uygulayarak tahmin almanız ve ardından hesaplamaları yapmanız gerekir. Bazı ipuçları:\n",
"Test veri setinde top-3 doğruluğu hesaplamak için, veri setini manuel olarak gözden geçirmeniz, sinir ağını uygulayarak tahminleri almanız ve ardından hesaplamaları yapmanız gerekir. Bazı ipuçları:\n",
"\n",
"* Tensorflow'da, `tf.nn.in_top_k` fonksiyonunu kullanarak `predictions` (modelin çıktısı) değerlerinin `targets` ile ilişkili olarak top-k içinde olup olmadığını kontrol edebilirsiniz (parametre olarak `k=3` geçirin). Bu fonksiyon, `int`'e dönüştürülebilen bir boolean değerler tensörü döndürür ve ardından `tf.reduce_sum` kullanılarak biriktirilebilir.\n",
"* PyTorch'ta, `torch.topk` fonksiyonunu kullanarak en yüksek olasılıklara sahip sınıfların indekslerini alabilir ve ardından doğru sınıfın bunlara ait olup olmadığını kontrol edebilirsiniz. Daha fazla ipucu için [buraya](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) bakabilirsiniz.\n"
"* Tensorflow'da, `tf.nn.in_top_k` fonksiyonunu kullanarak `predictions` (modelin çıktısı) değerlerinin `targets` ile ilgili olarak top-k içinde olup olmadığını kontrol edebilirsiniz (parametre olarak `k=3` geçirin). Bu fonksiyon, `tf.cast` kullanılarak `int` değerlerine dönüştürülebilen ve ardından `tf.reduce_sum` ile biriktirilebilen bir boolean tensörü döndürür.\n",
"* PyTorch'ta, `torch.topk` fonksiyonunu kullanarak en yüksek olasılıklara sahip sınıfların indekslerini alabilir ve ardından doğru sınıfın bunlar arasında olup olmadığını kontrol edebilirsiniz. Daha fazla ipucu için [buraya](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) bakabilirsiniz.\n"
]
},
{
@ -324,9 +344,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## Opsiyonel: Kediler ve Köpekler sınıflandırmasını oluşturun\n",
"## İsteğe Bağlı: Kediler ve Köpekler Sınıflandırması Oluşturma\n",
"\n",
"Aynı veri seti üzerinde ikili kediler ve köpekler sınıflandırmamızın ne kadar doğru olacağını görmek istiyoruz. Bunu yapmak için, etiketleri ayarlamamız gerekiyor:\n"
"Aynı veri kümesinde kediler ve köpekler arasındaki ikili sınıflandırmamızın ne kadar doğru olacağını görmek istiyoruz. Bunu yapmak için etiketleri ayarlamamız gerekiyor:\n"
]
},
{
@ -352,7 +372,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Feragatname**: \nBu belge, AI çeviri hizmeti [Co-op Translator](https://github.com/Azure/co-op-translator) kullanılarak çevrilmiştir. Doğruluk için çaba göstersek de, otomatik çevirilerin hata veya yanlışlıklar içerebileceğini lütfen unutmayın. Belgenin orijinal dili, yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi önerilir. Bu çevirinin kullanımından kaynaklanan yanlış anlamalar veya yanlış yorumlamalar için sorumluluk kabul etmiyoruz.\n"
"\n---\n\n**Feragatname**: \nBu belge, AI çeviri hizmeti [Co-op Translator](https://github.com/Azure/co-op-translator) kullanılarak çevrilmiştir. Doğruluk için çaba göstersek de, otomatik çevirilerin hata veya yanlışlık içerebileceğini lütfen unutmayın. Belgenin orijinal dili, yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi önerilir. Bu çevirinin kullanımından kaynaklanan yanlış anlamalar veya yanlış yorumlamalar için sorumluluk kabul edilmemektedir.\n"
]
}
],
@ -378,8 +398,8 @@
"version": "3.9.5"
},
"coopTranslator": {
"original_hash": "1de3ae931831253c3198d899da48bfe5",
"translation_date": "2025-08-28T12:59:53+00:00",
"original_hash": "df7d1f7da8d2617b76acd93115776ca4",
"translation_date": "2025-10-03T14:36:51+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb",
"language_code": "tr"
}

View File

@ -1,29 +1,29 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "f3d2cee9cb3c52160419e560c57a690e",
"translation_date": "2025-08-26T07:29:00+00:00",
"original_hash": "b70fcf7fcee862990f848c679090943f",
"translation_date": "2025-10-03T14:54:50+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/README.md",
"language_code": "tr"
}
-->
# Evcil Hayvan Yüzlerinin Sınıflandırılması
[AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners) kapsamında bir laboratuvar ödevi.
[AI for Beginners Müfredatı](https://github.com/microsoft/ai-for-beginners) kapsamında bir laboratuvar görevi.
## Görev
Bir evcil hayvan yuvası için tüm evcil hayvanları kataloglayacak bir uygulama geliştirmeniz gerektiğini hayal edin. Böyle bir uygulamanın harika özelliklerinden biri, bir fotoğraftan otomatik olarak cinsin tespit edilmesi olurdu. Bu, sinir ağları kullanılarak başarıyla yapılabilir.
Bir evcil hayvan yuvası için tüm evcil hayvanları kataloglamak amacıyla bir uygulama geliştirmeniz gerektiğini hayal edin. Böyle bir uygulamanın harika özelliklerinden biri, bir fotoğraftan otomatik olarak cinsin keşfedilmesi olacaktır. Bu, sinir ağları kullanılarak başarıyla yapılabilir.
**Pet Faces** veri kümesini kullanarak farklı kedi ve köpek cinslerini sınıflandırmak için bir evrişimli sinir ağı eğitmeniz gerekiyor.
**Pet Faces** veri setini kullanarak farklı kedi ve köpek cinslerini sınıflandırmak için bir evrişimli sinir ağı eğitmeniz gerekiyor.
## Veri Kümesi
## Veri Seti
**Pet Faces** veri kümesini kullanacağız. Bu veri kümesi, [Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/) evcil hayvan veri kümesinden türetilmiştir. 35 farklı köpek ve kedi cinsini içerir.
[Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/) veri setini kullanacağız. Bu veri seti, 37 farklı köpek ve kedi cinsine ait görüntüler içerir.
![Ele alacağımız veri kümesi](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.tr.png)
![Çalışacağımız veri seti](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.tr.png)
Veri kümesini indirmek için şu kod parçasını kullanın:
Veri setini indirmek için şu kod parçacığını kullanın:
```python
!wget https://thor.robots.ox.ac.uk/~vgg/data/pets/images.tar.gz
@ -31,13 +31,17 @@ Veri kümesini indirmek için şu kod parçasını kullanın:
!rm images.tar.gz
```
## Başlangıç Not Defteri
**Not:** Oxford-IIIT Pet Dataset görüntüleri dosya adına göre düzenlenmiştir (örneğin, `Abyssinian_1.jpg`, `Bengal_2.jpg`). Notebook, bu görüntüleri daha kolay sınıflandırma için cinslere özgü alt dizinlere organize etmek üzere kod içerir.
Laboratuvara [PetFaces.ipynb](../../../../../../lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb) dosyasını açarak başlayın.
## Başlangıç Notebook'u
Laboratuvara [PetFaces.ipynb](PetFaces.ipynb) dosyasını açarak başlayın.
## Çıkarım
Sıfırdan bir görüntü sınıflandırma problemini çözmeyi başardınız! Oldukça fazla sınıf vardı ve yine de makul bir doğruluk elde edebildiniz! Ayrıca, top-k doğruluğunu ölçmek mantıklıdır, çünkü insanlar için bile açıkça farklı olmayan bazı sınıfları karıştırmak kolaydır.
Sıfırdan nispeten karmaşık bir görüntü sınıflandırma problemini çözdünüz! Oldukça fazla sınıf vardı ve yine de makul bir doğruluk elde edebildiniz! Ayrıca, top-k doğruluğu ölçmek mantıklıdır, çünkü bazı sınıfları karıştırmak kolaydır; hatta insanlar için bile açıkça farklı olmayan sınıflar olabilir.
---
**Feragatname**:
Bu belge, AI çeviri hizmeti [Co-op Translator](https://github.com/Azure/co-op-translator) kullanılarak çevrilmiştir. Doğruluk için çaba göstersek de, otomatik çevirilerin hata veya yanlışlıklar içerebileceğini lütfen unutmayın. Belgenin orijinal dili, yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi önerilir. Bu çevirinin kullanımından kaynaklanan yanlış anlamalar veya yanlış yorumlamalar için sorumluluk kabul etmiyoruz.
Bu belge, AI çeviri hizmeti [Co-op Translator](https://github.com/Azure/co-op-translator) kullanılarak çevrilmiştir. Doğruluk için çaba göstersek de, otomatik çevirilerin hata veya yanlışlık içerebileceğini lütfen unutmayın. Belgenin orijinal dili, yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi önerilir. Bu çevirinin kullanımından kaynaklanan yanlış anlamalar veya yanlış yorumlamalar için sorumluluk kabul etmiyoruz.

View File

@ -10,7 +10,9 @@
"\n",
"### 獲取數據\n",
"\n",
"在這次作業中,我們將專注於一個相對簡單的分類任務——寵物臉部的分類。這個數據集包含從 [Oxford-IIIT Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/) 中裁剪出的臉部圖像。讓我們從載入並可視化數據集開始。\n"
"在這次作業中,我們將專注於一個相對簡單的分類任務——寵物臉部的分類。我們將使用 [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/),該數據集包含 37 種不同品種的狗和貓的圖片。讓我們從下載並可視化數據集開始。\n",
"\n",
"**注意:** Oxford-IIIT Pet Dataset 包含完整的寵物圖片。提取後的文件夾中,圖片將按照品種進行整理。\n"
]
},
{
@ -46,7 +48,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"我們將定義通用函數以顯示列表中的一系列圖像:\n"
"我們將定義通用函數以從列表中顯示一系列圖像:\n"
]
},
{
@ -86,6 +88,24 @@
"metadata": {},
"outputs": [],
"source": [
"# Note: The Oxford-IIIT Pet Dataset extracts to a folder named 'images'\n",
"# Images are named by breed (e.g., 'Abyssinian_1.jpg')\n",
"# We need to organize them into breed-specific subdirectories\n",
"import os\n",
"from collections import defaultdict\n",
"\n",
"# Organize images by breed\n",
"if not os.path.exists('petfaces'):\n",
" os.makedirs('petfaces')\n",
" for img_file in os.listdir('images'):\n",
" if img_file.endswith(('.jpg', '.png')):\n",
" # Extract breed name from filename (everything before the last underscore and number)\n",
" breed = '_'.join(img_file.split('_')[:-1])\n",
" breed_dir = os.path.join('petfaces', breed)\n",
" if not os.path.exists(breed_dir):\n",
" os.makedirs(breed_dir)\n",
" os.rename(os.path.join('images', img_file), os.path.join(breed_dir, img_file))\n",
"\n",
"for cls in os.listdir('petfaces'):\n",
" print(cls)\n",
" display_images([Image.open(os.path.join('petfaces',cls,x)) \n",
@ -96,7 +116,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"讓我們也定義我們數據集中的類別數:\n"
"讓我們也定義我們數據集中的類別數\n"
]
},
{
@ -124,9 +144,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## 準備深度學習的數據集\n",
"## 為深度學習準備數據集\n",
"\n",
"在開始訓練神經網絡之前,我們需要將所有圖片轉換為張量,並且創建與標籤(類別編號)對應的張量。大多數神經網絡框架都提供了簡單的工具來處理圖片:\n",
"在開始訓練我們的神經網絡之前,我們需要將所有圖片轉換為張量,並且還需要創建與標籤(類別編號)對應的張量。大多數神經網絡框架都包含一些簡單的工具來處理圖片:\n",
"* 在 Tensorflow 中,使用 `tf.keras.preprocessing.image_dataset_from_directory`\n",
"* 在 PyTorch 中,使用 `torchvision.datasets.ImageFolder`\n",
"\n",
@ -146,7 +166,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"現在我們需要將數據集分成訓練部分和測試部分\n"
"現在我們需要將數據集分成訓練集和測試集\n"
]
},
{
@ -165,8 +185,8 @@
"現在讓我們列印資料集中張量的大小。如果你已正確完成所有步驟,訓練元素的大小應該是:\n",
" * 對於 Tensorflow應為 `(batch_size,image_size,image_size,3)`;對於 PyTorch應為 `batch_size,3,image_size,image_size`\n",
" * 標籤的大小應為 `batch_size`\n",
"\n",
"標籤應包含類別的數字。\n"
" \n",
" 標籤應包含類別的數字。\n"
]
},
{
@ -228,16 +248,16 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## 定義一個神經網路\n",
"## 定義神經網路\n",
"\n",
"對於圖像分類,你可能需要定義一個具有多層的卷積神經網路。需要注意的事項:\n",
"* 請記住金字塔構,也就是說,隨著網路加深,濾波器的數量應該增加。\n",
"* 不要忘記在層與層之間加入激活函數(如 ReLU以及最大池化Max Pooling。\n",
"針對影像分類,您可能需要定義一個具有多層的卷積神經網路。需要注意的事項:\n",
"* 請記住金字塔構,也就是說,隨著網路加深,濾波器的數量應該增加。\n",
"* 別忘了在層之間加入激活函數(例如 ReLU以及最大池化Max Pooling。\n",
"* 最終的分類器可以有隱藏層,也可以沒有,但輸出神經元的數量應該等於分類的類別數。\n",
"\n",
"一個重要的點是要正確設置最後一層的激活函數和損失函數:\n",
"* 在 Tensorflow 中,可以使用 `softmax` 作為激活函數,並使用 `sparse_categorical_crossentropy` 作為損失函數。稀疏類交叉熵sparse categorical cross-entropy與非稀疏的區別在於,前者的輸出是類別的數字,而不是 one-hot 向量。\n",
"* 在 PyTorch 中,你可以讓最後一層沒有激活函數,並使用 `CrossEntropyLoss` 作為損失函數。這個函數會自動應用 softmax。\n"
"一個重要的部分是正確設置最後一層的激活函數和損失函數:\n",
"* 在 Tensorflow 中,可以使用 `softmax` 作為激活函數,並使用 `sparse_categorical_crossentropy` 作為損失函數。稀疏類交叉熵sparse categorical cross-entropy與非稀疏的差異在於前者期望輸出為類別的編號,而不是 one-hot 向量。\n",
"* 在 PyTorch 中,最後一層可以不使用激活函數,並使用 `CrossEntropyLoss` 作為損失函數。此函數會自動應用 softmax。\n"
]
},
{
@ -255,9 +275,9 @@
"source": [
"## 訓練神經網路\n",
"\n",
"現在我們準備開始訓練神經網路。在訓練過程中請在每個訓練週期epoch收集訓練數據和測試數據的準確率,然後繪製準確率圖表,以檢查是否出現過擬合的情況。\n",
"現在我們準備好訓練神經網路了。在訓練過程中,請在每個訓練週期收集訓練和測試數據的準確率,然後繪製準確率圖表,以檢查是否出現過擬合的情況。\n",
"\n",
"> 為了加快訓練速度,如果有可用的 GPU請務必使用它。雖然 TensorFlow/Keras 會自動使用 GPU但在使用 PyTorch 時,您需要在訓練過程中使用 `.to()` 方法將模型和數據移動到 GPU 上,才能利用 GPU 的加速功能。\n"
"> 為了加快訓練速度,如果有 GPU 可用,請使用 GPU。雖然 TensorFlow/Keras 會自動使用 GPU但在 PyTorch 中,您需要在訓練過程中使用 `.to()` 方法將模型和數據移動到 GPU 上,以充分利用 GPU 的加速功能。\n"
]
},
{
@ -301,14 +321,14 @@
"\n",
"在這次練習中我們處理的是具有相當多類別35類的分類問題因此我們的結果——大約50%的驗證準確率——已經相當不錯了。標準的 ImageNet 數據集甚至有更多類別——1000類。\n",
"\n",
"在這種情況下,很難保證模型**總是**正確預測類別。有些情況下,兩個品種可能非常相似,模型返回的概率也非常接近例如0.45 和 0.43)。如果我們測量標準準確率,這將被視為錯誤案例,儘管模型只犯了很小的錯誤。因此,我們經常測量另一個指標——模型最可能的前三個預測中的準確率。\n",
"在這種情況下,很難保證模型**總是**正確預測類別。有些情況下,兩個品種非常相似,模型可能返回非常接近的概率例如0.45 和 0.43)。如果我們測量標準準確率,這將被視為錯誤案例,儘管模型只犯了很小的錯誤。因此,我們通常會測量另一個指標——模型最可能的前三個預測中的準確率。\n",
"\n",
"如果目標標籤包含在模型的前三個預測中,我們就認為該案例是準確的。\n",
"\n",
"要在測試數據集上計算 top-3 準確率,您需要手動遍歷數據集,應用神經網絡以獲得預測,然後進行計算。一些提示:\n",
"要在測試數據集上計算 top-3 準確率,您需要手動遍歷數據集,應用神經網絡進行預測,然後進行計算。一些提示:\n",
"\n",
"* 在 Tensorflow 中,使用 `tf.nn.in_top_k` 函數來檢查 `predictions`(模型的輸出)是否在 top-k將 `k=3` 作為參數),相對於 `targets`。此函數返回布爾值的張量,可以使用 `tf.cast` 轉換為 `int`,然後使用 `tf.reduce_sum` 累加。\n",
"* 在 PyTorch 中,可以使用 `torch.topk` 函數獲取具有最高概率的類別索引,然後檢查正確的類別是否屬於其中。請參考[這裡](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b)以獲取更多提示。\n"
"* 在 Tensorflow 中,可以使用 `tf.nn.in_top_k` 函數來檢查 `predictions`(模型的輸出)是否在 top-k將 `k=3` 作為參數),相對於 `targets`。此函數返回布爾值的張量,可以使用 `tf.cast` 轉換為 `int`,然後使用 `tf.reduce_sum` 累加。\n",
"* 在 PyTorch 中,可以使用 `torch.topk` 函數獲取具有最高概率的類別索引,然後檢查正確的類別是否屬於其中。請參考[這裡](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b)以獲取更多提示。\n"
]
},
{
@ -326,7 +346,7 @@
"source": [
"## 可選:建立貓 vs. 狗分類\n",
"\n",
"我們也想看看在相同的數據集上,我們的二元貓 vs. 狗分類的準確性如何。為此,我們需要調整標籤:\n"
"我們也希望了解在相同的數據集上,我們的二元貓 vs. 狗分類的準確性如何。為此,我們需要調整標籤:\n"
]
},
{
@ -352,7 +372,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**免責聲明** \n本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們努力確保翻譯的準確性,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵信息,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋不承擔責任。\n"
"\n---\n\n**免責聲明** \n本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵資訊,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋不承擔責任。\n"
]
}
],
@ -378,8 +398,8 @@
"version": "3.9.5"
},
"coopTranslator": {
"original_hash": "1de3ae931831253c3198d899da48bfe5",
"translation_date": "2025-08-31T09:35:15+00:00",
"original_hash": "df7d1f7da8d2617b76acd93115776ca4",
"translation_date": "2025-10-03T14:30:11+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb",
"language_code": "tw"
}

View File

@ -1,25 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "f3d2cee9cb3c52160419e560c57a690e",
"translation_date": "2025-08-24T22:00:06+00:00",
"original_hash": "b70fcf7fcee862990f848c679090943f",
"translation_date": "2025-10-03T14:53:05+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/README.md",
"language_code": "tw"
}
-->
# 寵物面孔分類
來自 [AI 初學者課程](https://github.com/microsoft/ai-for-beginners) 的實驗作業。
來自 [AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners) 的實驗作業。
## 任務
想像一下,你需要開發一個寵物托育應用程式來記錄所有的寵物。這樣的應用程式的一個重要功能就是能夠根據照片自動識寵物的品種。這可以通過神經網絡成功實現。
想像一下,你需要開發一個寵物托育應用程式,用來記錄所有的寵物。這樣的應用程式的一個重要功能就是能夠根據照片自動識寵物的品種。這可以通過神經網絡成功實現。
你需要訓練一個卷積神經網絡來使用 **Pet Faces** 數據集分類不同品種的貓和狗
你需要訓練一個卷積神經網絡來分類不同品種的貓和狗,使用 **Pet Faces** 數據集。
## 數據集
我們將使用 **Pet Faces** 數據集,該數據集源自 [Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/) 寵物數據集。它包含 35 種不同品種的狗和貓
我們將使用 [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/),該數據集包含 37 種不同品種的狗和貓的圖片
![我們將處理的數據集](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.tw.png)
@ -31,13 +31,17 @@ CO_OP_TRANSLATOR_METADATA:
!rm images.tar.gz
```
**注意:** Oxford-IIIT Pet Dataset 的圖片是按照檔名組織的(例如,`Abyssinian_1.jpg``Bengal_2.jpg`)。筆記本中包含了將這些圖片整理到按品種分類的子目錄中的程式碼,以便於分類。
## 啟動筆記本
通過打開 [PetFaces.ipynb](../../../../../../lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb) 開始實驗。
通過打開 [PetFaces.ipynb](PetFaces.ipynb) 開始實驗。
## 收穫
你已經從零開始解決了一個相對複雜的圖像分類問題!儘管有很多類別,你仍然能夠獲得合理的準確率!同時,測量 top-k 準確率也是有意義的,因為有些類別即使對人類來說也不容易區分。
你已經從零開始解決了一個相對複雜的圖像分類問題!儘管有很多類別,你仍然能夠獲得合理的準確率!此外,測量 top-k 準確率也是有意義的,因為有些類別即使對人類來說也不容易區分,容易混淆。
---
**免責聲明**
本文件使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。應以原始語言的文件作為權威來源。對於關鍵資訊,建議尋求專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或誤讀概不負責
本文件使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們努力確保翻譯的準確性,但請注意,自動翻譯可能包含錯誤或不精確之處。原始文件的母語版本應被視為權威來源。對於關鍵資訊,建議使用專業人工翻譯。我們對因使用此翻譯而產生的任何誤解或錯誤解釋不承擔責任

View File

@ -10,7 +10,9 @@
"\n",
"### Отримання даних\n",
"\n",
"У цьому завданні ми зосередимося на відносно простій задачі класифікації - класифікації облич домашніх тварин. Цей набір даних складається з вирізаних облич із [Oxford-IIIT Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/). Давайте почнемо з завантаження та візуалізації набору даних.\n"
"У цьому завданні ми зосередимося на відносно простій задачі класифікації — класифікації облич домашніх тварин. Ми будемо використовувати [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), який містить зображення 37 різних порід собак і котів. Почнемо з завантаження та візуалізації набору даних.\n",
"\n",
"**Примітка:** Набір даних Oxford-IIIT Pet Dataset містить повні зображення домашніх тварин. Зображення будуть організовані за породами у витягнутій папці.\n"
]
},
{
@ -86,6 +88,24 @@
"metadata": {},
"outputs": [],
"source": [
"# Note: The Oxford-IIIT Pet Dataset extracts to a folder named 'images'\n",
"# Images are named by breed (e.g., 'Abyssinian_1.jpg')\n",
"# We need to organize them into breed-specific subdirectories\n",
"import os\n",
"from collections import defaultdict\n",
"\n",
"# Organize images by breed\n",
"if not os.path.exists('petfaces'):\n",
" os.makedirs('petfaces')\n",
" for img_file in os.listdir('images'):\n",
" if img_file.endswith(('.jpg', '.png')):\n",
" # Extract breed name from filename (everything before the last underscore and number)\n",
" breed = '_'.join(img_file.split('_')[:-1])\n",
" breed_dir = os.path.join('petfaces', breed)\n",
" if not os.path.exists(breed_dir):\n",
" os.makedirs(breed_dir)\n",
" os.rename(os.path.join('images', img_file), os.path.join(breed_dir, img_file))\n",
"\n",
"for cls in os.listdir('petfaces'):\n",
" print(cls)\n",
" display_images([Image.open(os.path.join('petfaces',cls,x)) \n",
@ -126,11 +146,11 @@
"source": [
"## Підготовка набору даних для глибокого навчання\n",
"\n",
"Щоб розпочати навчання нашої нейронної мережі, нам потрібно перетворити всі зображення на тензори, а також створити тензори, що відповідають міткам (номерам класів). Більшість фреймворків для нейронних мереж містять прості інструменти для роботи із зображеннями:\n",
"Щоб розпочати навчання нашої нейронної мережі, необхідно перетворити всі зображення на тензори, а також створити тензори, що відповідають міткам (номерам класів). Більшість фреймворків для нейронних мереж мають прості інструменти для роботи із зображеннями:\n",
"* У Tensorflow використовуйте `tf.keras.preprocessing.image_dataset_from_directory`\n",
"* У PyTorch використовуйте `torchvision.datasets.ImageFolder`\n",
"\n",
"Як ви могли помітити на зображеннях вище, усі вони мають співвідношення сторін, близьке до квадратного, тому нам потрібно змінити розмір усіх зображень до квадратного формату. Також ми можемо організувати зображення в мініпакети.\n"
"Як ви могли побачити на зображеннях вище, всі вони мають співвідношення сторін, близьке до квадратного, тому нам потрібно змінити розмір усіх зображень до квадратного формату. Також ми можемо організувати зображення в мініпакети.\n"
]
},
{
@ -162,7 +182,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Тепер давайте виведемо розмір тензорів у нашому наборі даних. Якщо ви все зробили правильно, розмір елементів навчання має бути\n",
"Тепер давайте виведемо розмір тензорів у нашому наборі даних. Якщо ви все зробили правильно, розмір елементів навчання має бути:\n",
" * `(batch_size,image_size,image_size,3)` для Tensorflow, `batch_size,3,image_size,image_size` для PyTorch\n",
" * `batch_size` для міток\n",
" \n",
@ -230,14 +250,14 @@
"source": [
"## Визначення нейронної мережі\n",
"\n",
"Для класифікації зображень, ймовірно, слід визначити згорткову нейронну мережу з кількома шарами. На що варто звернути увагу:\n",
"* Памятайте про пірамідальну архітектуру, тобто кількість фільтрів має збільшуватися з глибиною мережі.\n",
"* Не забувайте про активаційні функції між шарами (ReLU) та Max Pooling.\n",
"* Фінальний класифікатор може бути як із прихованими шарами, так і без них, але кількість вихідних нейронів повинна дорівнювати кількості класів.\n",
"Для класифікації зображень варто визначити згорткову нейронну мережу з кількома шарами. На що слід звернути увагу:\n",
"* Пам'ятайте про пірамідальну архітектуру, тобто кількість фільтрів має збільшуватися з глибиною.\n",
"* Не забувайте про функції активації між шарами (ReLU) та Max Pooling.\n",
"* Фінальний класифікатор може бути з прихованими шарами або без них, але кількість вихідних нейронів має дорівнювати кількості класів.\n",
"\n",
"Важливо правильно налаштувати активаційну функцію на останньому шарі та функцію втрат:\n",
"* У Tensorflow можна використовувати `softmax` як активаційну функцію та `sparse_categorical_crossentropy` як функцію втрат. Різниця між sparse categorical cross-entropy та не sparse полягає в тому, що перша очікує вихід у вигляді номера класу, а не у вигляді one-hot вектора.\n",
"* У PyTorch фінальний шар може бути без активаційної функції, а функцію втрат можна використовувати `CrossEntropyLoss`. Ця функція автоматично застосовує softmax.\n"
"Важливо правильно налаштувати функцію активації на останньому шарі + функцію втрат:\n",
"* У Tensorflow можна використовувати `softmax` як функцію активації та `sparse_categorical_crossentropy` як функцію втрат. Різниця між sparse categorical cross-entropy та несжатою версією полягає в тому, що перша очікує вихід у вигляді номера класу, а не у вигляді one-hot вектора.\n",
"* У PyTorch фінальний шар може бути без функції активації, а функцію втрат можна використовувати `CrossEntropyLoss`. Ця функція автоматично застосовує softmax.\n"
]
},
{
@ -255,9 +275,9 @@
"source": [
"## Навчання нейронної мережі\n",
"\n",
"Тепер ми готові до навчання нейронної мережі. Під час навчання, будь ласка, збирайте точність на навчальних і тестових даних на кожній епосі, а потім будуйте графік точності, щоб перевірити, чи немає перенавчання.\n",
"Тепер ми готові до навчання нейронної мережі. Під час навчання, будь ласка, збирайте точність на тренувальних і тестових даних на кожній епосі, а потім побудуйте графік точності, щоб перевірити, чи є перенавчання.\n",
"\n",
"> Щоб прискорити навчання, необхідно використовувати GPU, якщо він доступний. У той час як TensorFlow/Keras автоматично використовуватимуть GPU, у PyTorch потрібно перемістити як модель, так і дані на GPU під час навчання за допомогою методу `.to()`, щоб скористатися перевагами прискорення GPU.\n"
"> Щоб прискорити навчання, необхідно використовувати GPU, якщо він доступний. Хоча TensorFlow/Keras автоматично використовуватиме GPU, у PyTorch потрібно перемістити як модель, так і дані на GPU під час навчання за допомогою методу `.to()`, щоб скористатися прискоренням GPU.\n"
]
},
{
@ -297,18 +317,18 @@
"source": [
"Що можна сказати про перенавчання? Що можна зробити для покращення точності моделі\n",
"\n",
"## Опціонально: Розрахунок Top-3 Точності\n",
"## Додатково: Розрахунок Top-3 точності\n",
"\n",
"У цьому завданні ми працювали з класифікацією, яка включає досить велику кількість класів (35), тому наш результат - близько 50% точності на валідаційному наборі - є досить хорошим. Стандартний набір даних ImageNet має ще більше - 1000 класів.\n",
"У цьому завданні ми працювали з класифікацією, яка має досить велику кількість класів (35), тому наш результат - близько 50% точності на валідаційному наборі - є досить хорошим. Стандартний набір даних ImageNet має ще більше - 1000 класів.\n",
"\n",
"У таких випадках важко забезпечити, щоб модель **завжди** правильно передбачала клас. Бувають ситуації, коли дві породи дуже схожі одна на одну, і модель повертає дуже близькі ймовірності (наприклад, 0.45 і 0.43). Якщо ми вимірюємо стандартну точність, це буде вважатися помилковим випадком, навіть якщо модель зробила дуже невелику помилку. Тому часто вимірюють іншу метрику - точність у межах трьох найбільш ймовірних передбачень моделі.\n",
"У таких випадках важко гарантувати, що модель **завжди** правильно передбачає клас. Є випадки, коли дві породи дуже схожі одна на одну, і модель повертає дуже схожі ймовірності (наприклад, 0.45 і 0.43). Якщо ми вимірюємо стандартну точність, це буде вважатися помилковим випадком, навіть якщо модель зробила дуже маленьку помилку. Тому ми часто вимірюємо іншу метрику - точність у межах трьох найбільш ймовірних передбачень моделі.\n",
"\n",
"Ми вважаємо випадок точним, якщо цільова мітка міститься серед трьох найімовірніших передбачень моделі.\n",
"Ми вважаємо випадок точним, якщо цільова мітка міститься в трьох найімовірніших передбаченнях моделі.\n",
"\n",
"Щоб обчислити top-3 точність на тестовому наборі даних, потрібно вручну пройтися по набору даних, застосувати нейронну мережу для отримання передбачень, а потім виконати розрахунки. Декілька підказок:\n",
"Щоб обчислити top-3 точність на тестовому наборі даних, вам потрібно вручну пройтися по набору даних, застосувати нейронну мережу для отримання передбачення, а потім виконати розрахунки. Деякі підказки:\n",
"\n",
"* У Tensorflow використовуйте функцію `tf.nn.in_top_k`, щоб перевірити, чи знаходяться `predictions` (вихід моделі) у top-k (передайте `k=3` як параметр) відносно `targets`. Ця функція повертає тензор булевих значень, які можна перетворити на `int` за допомогою `tf.cast`, а потім накопичити за допомогою `tf.reduce_sum`.\n",
"* У PyTorch можна використовувати функцію `torch.topk`, щоб отримати індекси класів із найвищими ймовірностями, а потім перевірити, чи належить правильний клас до них. Дивіться [тут](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) для додаткових підказок.\n"
"* У Tensorflow використовуйте функцію `tf.nn.in_top_k`, щоб перевірити, чи `predictions` (вихід моделі) входять до top-k (передайте `k=3` як параметр) щодо `targets`. Ця функція повертає тензор булевих значень, який можна перетворити на `int` за допомогою `tf.cast`, а потім накопичити за допомогою `tf.reduce_sum`.\n",
"* У PyTorch ви можете використовувати функцію `torch.topk`, щоб отримати індекси класів із найвищими ймовірностями, а потім перевірити, чи правильний клас належить до них. Дивіться [це](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) для додаткових підказок.\n"
]
},
{
@ -326,7 +346,7 @@
"source": [
"## Додатково: Побудова класифікації \"Коти проти собак\"\n",
"\n",
"Ми також хочемо перевірити, наскільки точною буде наша бінарна класифікація \"Коти проти собак\" на тому ж наборі даних. Для цього потрібно змінити мітки:\n"
"Ми також хочемо перевірити, наскільки точною буде наша бінарна класифікація \"Коти проти собак\" на тому ж наборі даних. Для цього нам потрібно змінити мітки:\n"
]
},
{
@ -378,8 +398,8 @@
"version": "3.9.5"
},
"coopTranslator": {
"original_hash": "1de3ae931831253c3198d899da48bfe5",
"translation_date": "2025-08-30T09:05:15+00:00",
"original_hash": "df7d1f7da8d2617b76acd93115776ca4",
"translation_date": "2025-10-03T14:50:46+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb",
"language_code": "uk"
}

View File

@ -1,8 +1,8 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "f3d2cee9cb3c52160419e560c57a690e",
"translation_date": "2025-08-25T22:59:03+00:00",
"original_hash": "b70fcf7fcee862990f848c679090943f",
"translation_date": "2025-10-03T14:58:41+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/README.md",
"language_code": "uk"
}
@ -13,15 +13,15 @@ CO_OP_TRANSLATOR_METADATA:
## Завдання
Уявіть, що вам потрібно розробити додаток для дитячого садка домашніх тварин, щоб каталогізувати всіх тварин. Однією з чудових функцій такого додатка буде автоматичне визначення породи за фотографією. Це можна успішно реалізувати за допомогою нейронних мереж.
Уявіть, що вам потрібно розробити додаток для притулку домашніх тварин, щоб каталогізувати всіх тварин. Однією з чудових функцій такого додатка було б автоматичне визначення породи за фотографією. Це можна успішно реалізувати за допомогою нейронних мереж.
Вам потрібно навчити згорткову нейронну мережу класифікувати різні породи котів і собак, використовуючи набір даних **Pet Faces**.
## Набір даних
Ми будемо використовувати набір даних **Pet Faces**, створений на основі набору даних домашніх тварин [Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/). Він містить 35 різних порід собак і котів.
Ми будемо використовувати [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), який містить зображення 37 різних порід собак і котів.
![Набір даних, з яким ми працюватимемо](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.uk.png)
![Набір даних, з яким ми будемо працювати](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.uk.png)
Щоб завантажити набір даних, скористайтеся цим фрагментом коду:
@ -31,13 +31,17 @@ CO_OP_TRANSLATOR_METADATA:
!rm images.tar.gz
```
**Примітка:** Зображення в наборі даних Oxford-IIIT Pet Dataset організовані за назвами файлів (наприклад, `Abyssinian_1.jpg`, `Bengal_2.jpg`). У ноутбуці є код для організації цих зображень у підкаталоги за породами для зручнішої класифікації.
## Початок роботи з ноутбуком
Розпочніть лабораторну роботу, відкривши [PetFaces.ipynb](../../../../../../lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb)
Розпочніть лабораторну роботу, відкривши [PetFaces.ipynb](PetFaces.ipynb)
## Висновок
Ви вирішили досить складну задачу класифікації зображень з нуля! Було досить багато класів, і вам вдалося досягти прийнятної точності! Також має сенс вимірювати top-k точність, оскільки легко сплутати деякі класи, які навіть для людей не є чітко відмінними.
Ви вирішили досить складну задачу класифікації зображень з нуля! Було досить багато класів, і вам вдалося досягти прийнятної точності! Також має сенс вимірювати точність top-k, оскільки легко сплутати деякі класи, які навіть для людей не є чітко відмінними.
---
**Відмова від відповідальності**:
Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, звертаємо вашу увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ на його рідній мові слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу.
Цей документ був перекладений за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, будь ласка, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ на його рідній мові слід вважати авторитетним джерелом. Для критичної інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу.

View File

@ -10,7 +10,9 @@
"\n",
"### ڈیٹا حاصل کرنا\n",
"\n",
"اس اسائنمنٹ میں، ہم ایک نسبتاً آسان درجہ بندی کے کام پر توجہ دیں گے - پالتو جانوروں کے چہروں کی درجہ بندی۔ یہ ڈیٹا سیٹ [Oxford-IIIT Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/) سے چہروں کے کٹ آؤٹ پر مشتمل ہے۔ آئیے ڈیٹا سیٹ کو لوڈ کرنے اور دیکھنے سے شروع کرتے ہیں۔\n"
"اس اسائنمنٹ میں، ہم ایک نسبتاً آسان درجہ بندی کے کام پر توجہ دیں گے - پالتو جانوروں کے چہروں کی درجہ بندی۔ ہم [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/) استعمال کریں گے، جس میں کتوں اور بلیوں کی 37 مختلف نسلوں کی تصاویر شامل ہیں۔ آئیے ڈیٹا سیٹ کو ڈاؤن لوڈ کرنے اور اس کا جائزہ لینے سے شروع کرتے ہیں۔\n",
"\n",
"**نوٹ:** Oxford-IIIT Pet Dataset میں مکمل پالتو جانوروں کی تصاویر شامل ہیں۔ نکالی گئی فولڈر میں تصاویر نسل کے لحاظ سے ترتیب دی جائیں گی۔\n"
]
},
{
@ -46,7 +48,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"ہم ایک عمومی فنکشن کی وضاحت کریں گے تاکہ فہرست سے تصاویر کی ایک سیریز دکھائی جا سکے:\n"
"ہم ایک عمومی فنکشن کی وضاحت کریں گے تاکہ ایک فہرست سے تصاویر کی ایک سیریز دکھائی جا سکے:\n"
]
},
{
@ -77,7 +79,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"اب آئیے تمام کلاس ذیلی ڈائریکٹریز کا جائزہ لیں اور ہر کلاس کی چند ابتدائی تصاویر کو پلاٹ کریں:\n"
"چلو اب تمام کلاس ذیلی ڈائریکٹریز کو عبور کرتے ہیں اور ہر کلاس کی پہلی چند تصاویر کو پلاٹ کرتے ہیں۔\n"
]
},
{
@ -86,6 +88,24 @@
"metadata": {},
"outputs": [],
"source": [
"# Note: The Oxford-IIIT Pet Dataset extracts to a folder named 'images'\n",
"# Images are named by breed (e.g., 'Abyssinian_1.jpg')\n",
"# We need to organize them into breed-specific subdirectories\n",
"import os\n",
"from collections import defaultdict\n",
"\n",
"# Organize images by breed\n",
"if not os.path.exists('petfaces'):\n",
" os.makedirs('petfaces')\n",
" for img_file in os.listdir('images'):\n",
" if img_file.endswith(('.jpg', '.png')):\n",
" # Extract breed name from filename (everything before the last underscore and number)\n",
" breed = '_'.join(img_file.split('_')[:-1])\n",
" breed_dir = os.path.join('petfaces', breed)\n",
" if not os.path.exists(breed_dir):\n",
" os.makedirs(breed_dir)\n",
" os.rename(os.path.join('images', img_file), os.path.join(breed_dir, img_file))\n",
"\n",
"for cls in os.listdir('petfaces'):\n",
" print(cls)\n",
" display_images([Image.open(os.path.join('petfaces',cls,x)) \n",
@ -96,7 +116,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"آئیے اپنے ڈیٹاسیٹ میں کلاسز کی تعداد بھی متعین کریں:\n"
"آئیے اپنے ڈیٹا سیٹ میں کلاسز کی تعداد بھی متعین کریں:\n"
]
},
{
@ -126,11 +146,11 @@
"source": [
"## ڈیپ لرننگ کے لیے ڈیٹاسیٹ تیار کرنا\n",
"\n",
"ہماری نیورل نیٹ ورک کی تربیت شروع کرنے کے لیے، ہمیں تمام تصاویر کو ٹینسرز میں تبدیل کرنا ہوگا، اور لیبلز (کلاس نمبرز) کے مطابق بھی ٹینسرز بنانا ہوں گے۔ زیادہ تر نیورل نیٹ ورک فریم ورک تصاویر کے ساتھ کام کرنے کے لیے آسان ٹولز فراہم کرتے ہیں:\n",
"نیورل نیٹ ورک کی تربیت شروع کرنے کے لیے، ہمیں تمام تصاویر کو ٹینسرز میں تبدیل کرنا ہوگا، اور لیبلز (کلاس نمبرز) کے مطابق ٹینسرز بھی بنانا ہوں گے۔ زیادہ تر نیورل نیٹ ورک فریم ورک تصاویر کے ساتھ کام کرنے کے لیے آسان ٹولز فراہم کرتے ہیں:\n",
"* Tensorflow میں، `tf.keras.preprocessing.image_dataset_from_directory` استعمال کریں\n",
"* PyTorch میں، `torchvision.datasets.ImageFolder` استعمال کریں\n",
"\n",
"جیسا کہ آپ نے اوپر دی گئی تصاویر میں دیکھا، ان سب کا تناسب مربع کے قریب ہے، اس لیے ہمیں تمام تصاویر کو مربع سائز میں تبدیل کرنا ہوگا۔ اس کے علاوہ، ہم تصاویر کو منی بیچز میں بھی ترتیب دے سکتے ہیں۔\n"
"جیسا کہ آپ نے اوپر دی گئی تصاویر سے دیکھا، ان سب کا تناسب مربع تصویر کے قریب ہے، لہذا ہمیں تمام تصاویر کو مربع سائز میں تبدیل کرنا ہوگا۔ اس کے علاوہ، ہم تصاویر کو منی بیچز میں منظم کر سکتے ہیں۔\n"
]
},
{
@ -146,7 +166,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"اب ہمیں ڈیٹاسیٹ کو تربیت اور ٹیسٹ حصوں میں تقسیم کرنا ہوگا:\n"
"اب ہمیں ڈیٹاسیٹ کو تربیتی اور آزمائشی حصوں میں تقسیم کرنا ہوگا۔\n"
]
},
{
@ -162,11 +182,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"اب آئیے اپنے ڈیٹا سیٹ میں موجود ٹینسرز کے سائز کو پرنٹ کریں۔ اگر آپ نے سب کچھ درست طریقے سے کیا ہے، تو تربیتی عناصر کا سائز ہونا چاہیے:\n",
" * `(batch_size,image_size,image_size,3)` Tensorflow کے لیے، `batch_size,3,image_size,image_size` PyTorch کے لیے\n",
"اب آئیے اپنے ڈیٹا سیٹ میں ٹینسرز کے سائز کو پرنٹ کرتے ہیں۔ اگر آپ نے سب کچھ درست طریقے سے کیا ہے، تو تربیتی عناصر کا سائز ہونا چاہیے:\n",
" * ٹینسر فلو کے لیے `(batch_size,image_size,image_size,3)`، اور پائی ٹارچ کے لیے `batch_size,3,image_size,image_size`\n",
" * لیبلز کے لیے `batch_size`\n",
"\n",
"لیبلز میں کلاسز کی تعداد شامل ہونی چاہیے۔\n"
"لیبلز میں کلاسز کی تعداد ہونی چاہیے۔\n"
]
},
{
@ -230,13 +250,13 @@
"source": [
"## نیورل نیٹ ورک کی تعریف کریں\n",
"\n",
"تصویری درجہ بندی کے لیے، آپ کو شاید کئی تہوں کے ساتھ ایک کنولوشنل نیورل نیٹ ورک کی تعریف کرنی چاہیے۔ جن چیزوں پر نظر رکھنی ہے:\n",
"تصویری درجہ بندی کے لیے، آپ کو شاید کئی تہوں کے ساتھ ایک کنولوشنل نیورل نیٹ ورک کی تعریف کرنی چاہیے۔ جن باتوں کا خیال رکھنا ضروری ہے:\n",
"* اہرامی ساخت کو ذہن میں رکھیں، یعنی فلٹرز کی تعداد گہرائی کے ساتھ بڑھنی چاہیے۔\n",
"* تہوں کے درمیان ایکٹیویشن فنکشنز (ReLU) اور میکس پولنگ کو نہ بھولیں۔\n",
"* آخری درجہ بندی کرنے والا نیٹ ورک چھپے ہوئے تہوں کے ساتھ یا بغیر ہو سکتا ہے، لیکن آؤٹ پٹ نیورونز کی تعداد کلاسز کی تعداد کے برابر ہونی چاہیے۔\n",
"* آخری درجہ بندی کرنے والا نیٹ ورک چھپی ہوئی تہوں کے ساتھ یا بغیر ہو سکتا ہے، لیکن آؤٹ پٹ نیورونز کی تعداد کلاسز کی تعداد کے برابر ہونی چاہیے۔\n",
"\n",
"ایک اہم بات یہ ہے کہ آخری تہہ پر ایکٹیویشن فنکشن اور نقصان کا فنکشن درست ہو:\n",
"* Tensorflow میں، آپ `softmax` کو ایکٹیویشن کے طور پر اور `sparse_categorical_crossentropy` کو نقصان کے طور پر استعمال کر سکتے ہیں۔ اسپارس کیٹیگوریکل کراس اینٹروپی اور نان اسپارس کے درمیان فرق یہ ہے کہ پہلا آؤٹ پٹ کو کلاس کی تعداد کے طور پر توقع کرتا ہے، نہ کہ ون-ہاٹ ویکٹر کے طور پر۔\n",
"* Tensorflow میں، آپ `softmax` کو ایکٹیویشن کے طور پر اور `sparse_categorical_crossentropy` کو نقصان کے طور پر استعمال کر سکتے ہیں۔ اسپارس کیٹیگوریکل کراس اینٹروپی اور غیر اسپارس کے درمیان فرق یہ ہے کہ پہلا آؤٹ پٹ کو کلاس نمبر کے طور پر توقع کرتا ہے، نہ کہ ون-ہاٹ ویکٹر کے طور پر۔\n",
"* PyTorch میں، آپ آخری تہہ کو بغیر ایکٹیویشن فنکشن کے رکھ سکتے ہیں اور `CrossEntropyLoss` نقصان کا فنکشن استعمال کر سکتے ہیں۔ یہ فنکشن خود بخود softmax کو لاگو کرتا ہے۔\n"
]
},
@ -255,9 +275,9 @@
"source": [
"## نیورل نیٹ ورک کو تربیت دیں\n",
"\n",
"اب ہم نیورل نیٹ ورک کو تربیت دینے کے لیے تیار ہیں۔ تربیت کے دوران، ہر ایپوک پر ٹرین اور ٹیسٹ ڈیٹا پر درستگی جمع کریں، اور پھر درستگی کو پلاٹ کریں تاکہ یہ دیکھ سکیں کہ آیا اوورفٹنگ ہو رہی ہے۔\n",
"اب ہم نیورل نیٹ ورک کو تربیت دینے کے لیے تیار ہیں۔ تربیت کے دوران، براہ کرم ہر ایپوک پر ٹرین اور ٹیسٹ ڈیٹا پر درستگی جمع کریں، اور پھر درستگی کا گراف بنائیں تاکہ یہ دیکھا جا سکے کہ آیا اوورفٹنگ ہو رہی ہے۔\n",
"\n",
"> تربیت کو تیز کرنے کے لیے، اگر دستیاب ہو تو GPU کا استعمال کریں۔ جبکہ TensorFlow/Keras خود بخود GPU کا استعمال کرے گا، PyTorch میں آپ کو تربیت کے دوران ماڈل اور ڈیٹا دونوں کو `.to()` میتھڈ کا استعمال کرتے ہوئے GPU پر منتقل کرنا ہوگا تاکہ GPU کی تیز رفتاری کا فائدہ اٹھایا جا سکے۔\n"
"> تربیت کو تیز کرنے کے لیے، اگر GPU دستیاب ہو تو اسے استعمال کرنا ضروری ہے۔ جبکہ TensorFlow/Keras خودکار طور پر GPU استعمال کرے گا، PyTorch میں آپ کو تربیت کے دوران ماڈل اور ڈیٹا دونوں کو `.to()` طریقہ استعمال کرتے ہوئے GPU پر منتقل کرنا ہوگا تاکہ GPU کی تیز رفتاری کا فائدہ اٹھایا جا سکے۔\n"
]
},
{
@ -295,20 +315,20 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"اوورفٹنگ کے بارے میں آپ کیا کہہ سکتے ہیں؟ ماڈل کی درستگی کو بہتر بنانے کے لیے کیا کیا جا سکتا ہے؟\n",
"اوورفٹنگ کے بارے میں کیا کہا جا سکتا ہے؟ ماڈل کی درستگی کو بہتر بنانے کے لیے کیا کیا جا سکتا ہے؟\n",
"\n",
"## اختیاری: ٹاپ 3 درستگی کا حساب لگائیں\n",
"\n",
"اس مشق میں، ہم نے ایک ایسی درجہ بندی کے ساتھ کام کیا جس میں کافی زیادہ کلاسز (35) تھیں، اس لیے ہمارا نتیجہ - تقریباً 50% ویلیڈیشن درستگی - کافی اچھا ہے۔ معیاری ImageNet ڈیٹا سیٹ میں اس سے بھی زیادہ - 1000 کلاسز ہوتی ہیں۔\n",
"\n",
"ایسے معاملات میں یہ یقینی بنانا مشکل ہوتا ہے کہ ماڈل **ہمیشہ** کلاس کو صحیح طور پر پیشگوئی کرے۔ کچھ صورتوں میں دو اقسام ایک دوسرے سے بہت زیادہ مشابہت رکھتی ہیں، اور ماڈل بہت قریب قریب امکانات واپس کرتا ہے (جیسے، 0.45 اور 0.43)۔ اگر ہم معیاری درستگی کو ناپیں، تو اسے غلط کیس سمجھا جائے گا، حالانکہ ماڈل نے بہت چھوٹی سی غلطی کی ہے۔ اس لیے، ہم اکثر ایک اور میٹرک ناپتے ہیں - ماڈل کی سب سے زیادہ ممکنہ تین پیشگوئیوں کے اندر درستگی۔\n",
"ایسے معاملات میں یہ یقینی بنانا مشکل ہوتا ہے کہ ماڈل **ہمیشہ** کلاس کو صحیح طور پر پیش گوئی کرے۔ کچھ صورتوں میں دو اقسام ایک دوسرے سے بہت مشابہ ہوتی ہیں، اور ماڈل بہت قریب کی احتمالات واپس کرتا ہے (جیسے، 0.45 اور 0.43)۔ اگر ہم معیاری درستگی کو ناپیں، تو اسے غلط کیس سمجھا جائے گا، حالانکہ ماڈل نے بہت چھوٹی سی غلطی کی ہے۔ اس لیے، ہم اکثر ایک اور میٹرک ناپتے ہیں - ماڈل کی سب سے زیادہ ممکنہ تین پیش گوئیوں کے اندر درستگی۔\n",
"\n",
"ہم کیس کو درست سمجھتے ہیں اگر ہدف لیبل ماڈل کی ٹاپ 3 پیشگوئیوں میں شامل ہو۔\n",
"ہم کیس کو درست سمجھتے ہیں اگر ہدف لیبل ماڈل کی ٹاپ 3 پیش گوئیوں میں شامل ہو۔\n",
"\n",
"ٹیسٹ ڈیٹا سیٹ پر ٹاپ-3 درستگی کا حساب لگانے کے لیے، آپ کو ڈیٹا سیٹ کو دستی طور پر دیکھنا ہوگا، نیورل نیٹ ورک کو لاگو کرنا ہوگا تاکہ پیشگوئی حاصل ہو، اور پھر حساب کتاب کرنا ہوگا۔ کچھ تجاویز:\n",
"ٹیسٹ ڈیٹا سیٹ پر ٹاپ-3 درستگی کا حساب لگانے کے لیے، آپ کو ڈیٹا سیٹ کو دستی طور پر دیکھنا ہوگا، نیورل نیٹ ورک کو لاگو کرنا ہوگا تاکہ پیش گوئی حاصل ہو، اور پھر حساب کرنا ہوگا۔ کچھ اشارے:\n",
"\n",
"* Tensorflow میں، `tf.nn.in_top_k` فنکشن استعمال کریں تاکہ یہ دیکھ سکیں کہ آیا `predictions` (ماڈل کا آؤٹ پٹ) ٹاپ-k میں ہیں (پیرامیٹر کے طور پر `k=3` پاس کریں)، `targets` کے لحاظ سے۔ یہ فنکشن بُولین ویلیوز کا ایک ٹینسر واپس کرتا ہے، جسے `tf.cast` استعمال کرکے `int` میں تبدیل کیا جا سکتا ہے، اور پھر `tf.reduce_sum` کے ذریعے جمع کیا جا سکتا ہے۔\n",
"* PyTorch میں، آپ `torch.topk` فنکشن استعمال کر سکتے ہیں تاکہ زیادہ امکانات والی کلاسز کے انڈیکس حاصل کریں، اور پھر دیکھیں کہ آیا درست کلاس ان میں شامل ہے۔ مزید تجاویز کے لیے [یہ](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) دیکھیں۔\n"
"* Tensorflow میں، `tf.nn.in_top_k` فنکشن استعمال کریں تاکہ یہ دیکھ سکیں کہ آیا `predictions` (ماڈل کا آؤٹ پٹ) ٹاپ-k میں ہیں (پیرامیٹر کے طور پر `k=3` پاس کریں)، `targets` کے لحاظ سے۔ یہ فنکشن بولین ویلیوز کا ایک ٹینسر واپس کرتا ہے، جسے `tf.cast` استعمال کرتے ہوئے `int` میں تبدیل کیا جا سکتا ہے، اور پھر `tf.reduce_sum` کے ذریعے جمع کیا جا سکتا ہے۔\n",
"* PyTorch میں، آپ `torch.topk` فنکشن استعمال کر سکتے ہیں تاکہ ان کلاسز کے انڈیکس حاصل کریں جن کی احتمالات زیادہ ہیں، اور پھر دیکھیں کہ آیا صحیح کلاس ان میں شامل ہے۔ مزید اشارے کے لیے [یہ](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) دیکھیں۔\n"
]
},
{
@ -326,7 +346,7 @@
"source": [
"## اختیاری: بلیوں اور کتوں کی درجہ بندی بنائیں\n",
"\n",
"ہم یہ بھی دیکھنا چاہتے ہیں کہ ہمارے بائنری بلیوں اور کتوں کی درجہ بندی اسی ڈیٹاسیٹ پر کتنی درست ہوگی۔ اس کے لیے، ہمیں لیبلز کو ایڈجسٹ کرنے کی ضرورت ہے:\n"
"ہم یہ بھی دیکھنا چاہتے ہیں کہ اسی ڈیٹاسیٹ پر ہماری بائنری بلیوں اور کتوں کی درجہ بندی کتنی درست ہوگی۔ ایسا کرنے کے لیے، ہمیں لیبلز کو ایڈجسٹ کرنا ہوگا:\n"
]
},
{
@ -352,7 +372,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**ڈسکلیمر**: \nیہ دستاویز AI ترجمہ سروس [Co-op Translator](https://github.com/Azure/co-op-translator) کا استعمال کرتے ہوئے ترجمہ کی گئی ہے۔ ہم درستگی کے لیے کوشش کرتے ہیں، لیکن براہ کرم آگاہ رہیں کہ خودکار ترجمے میں غلطیاں یا غیر درستیاں ہو سکتی ہیں۔ اصل دستاویز کو اس کی اصل زبان میں مستند ذریعہ سمجھا جانا چاہیے۔ اہم معلومات کے لیے، پیشہ ور انسانی ترجمہ کی سفارش کی جاتی ہے۔ ہم اس ترجمے کے استعمال سے پیدا ہونے والی کسی بھی غلط فہمی یا غلط تشریح کے ذمہ دار نہیں ہیں۔\n"
"\n---\n\n**ڈسکلیمر**: \nیہ دستاویز AI ترجمہ سروس [Co-op Translator](https://github.com/Azure/co-op-translator) کا استعمال کرتے ہوئے ترجمہ کی گئی ہے۔ ہم درستگی کی بھرپور کوشش کرتے ہیں، لیکن براہ کرم یہ بات ذہن میں رکھیں کہ خودکار ترجمے میں غلطیاں یا غیر درستیاں ہو سکتی ہیں۔ اصل دستاویز کو اس کی اصل زبان میں مستند ذریعہ سمجھا جانا چاہیے۔ اہم معلومات کے لیے، پیشہ ور انسانی ترجمہ کی سفارش کی جاتی ہے۔ اس ترجمے کے استعمال سے پیدا ہونے والی کسی بھی غلط فہمی یا غلط تشریح کے لیے ہم ذمہ دار نہیں ہیں۔\n"
]
}
],
@ -378,8 +398,8 @@
"version": "3.9.5"
},
"coopTranslator": {
"original_hash": "1de3ae931831253c3198d899da48bfe5",
"translation_date": "2025-08-28T03:04:28+00:00",
"original_hash": "df7d1f7da8d2617b76acd93115776ca4",
"translation_date": "2025-10-03T14:28:06+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb",
"language_code": "ur"
}

View File

@ -1,8 +1,8 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "f3d2cee9cb3c52160419e560c57a690e",
"translation_date": "2025-08-26T09:33:35+00:00",
"original_hash": "b70fcf7fcee862990f848c679090943f",
"translation_date": "2025-10-03T14:52:35+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/README.md",
"language_code": "ur"
}
@ -15,11 +15,11 @@ CO_OP_TRANSLATOR_METADATA:
تصور کریں کہ آپ کو ایک ایپلیکیشن تیار کرنی ہے جو پالتو جانوروں کی نرسری کے لیے تمام جانوروں کو کیٹلاگ کرے۔ ایسی ایپلیکیشن کی ایک بہترین خصوصیت یہ ہوگی کہ تصویر سے خود بخود نسل کا پتہ لگایا جا سکے۔ یہ کام نیورل نیٹ ورکس کے ذریعے کامیابی سے کیا جا سکتا ہے۔
آپ کو ایک کنوولوشنل نیورل نیٹ ورک کو تربیت دینی ہے تاکہ **Pet Faces** ڈیٹا سیٹ کا استعمال کرتے ہوئے مختلف نسلوں کی بلیوں اور کتوں کی درجہ بندی کی جا سکے۔
آپ کو **Pet Faces** ڈیٹا سیٹ کا استعمال کرتے ہوئے مختلف نسلوں کے بلیوں اور کتوں کی درجہ بندی کے لیے ایک convolutional neural network کو تربیت دینا ہوگا۔
## ڈیٹا سیٹ
ہم **Pet Faces** ڈیٹا سیٹ استعمال کریں گے، جو [Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/) پالتو جانوروں کے ڈیٹا سیٹ سے حاصل کیا گیا ہے۔ اس میں کتوں اور بلیوں کی 35 مختلف نسلیں شامل ہیں۔
ہم [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/) استعمال کریں گے، جس میں کتوں اور بلیوں کی 37 مختلف نسلوں کی تصاویر شامل ہیں۔
![ہم جس ڈیٹا سیٹ سے نمٹیں گے](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.ur.png)
@ -31,13 +31,17 @@ CO_OP_TRANSLATOR_METADATA:
!rm images.tar.gz
```
**نوٹ:** Oxford-IIIT Pet Dataset کی تصاویر فائل نام کے ذریعے منظم ہیں (جیسے `Abyssinian_1.jpg`, `Bengal_2.jpg`)۔ نوٹ بک میں کوڈ شامل ہے جو ان تصاویر کو نسل کے لحاظ سے مخصوص سب ڈائریکٹریز میں منظم کرتا ہے تاکہ درجہ بندی آسان ہو۔
## نوٹ بک شروع کرنا
لیب شروع کرنے کے لیے [PetFaces.ipynb](../../../../../../lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb) کھولیں۔
لیب شروع کرنے کے لیے [PetFaces.ipynb](PetFaces.ipynb) کھولیں۔
## نتیجہ
آپ نے تصویر کی درجہ بندی کا ایک نسبتاً پیچیدہ مسئلہ شروع سے حل کر لیا ہے! کلاسز کی تعداد کافی زیادہ تھی، اور پھر بھی آپ نے معقول درستگی حاصل کی! یہ بھی سمجھ میں آتا ہے کہ ٹاپ-k درستگی کو ماپنا ضروری ہے، کیونکہ کچھ کلاسز کو الجھانا آسان ہے جو انسانوں کے لیے بھی واضح طور پر مختلف نہیں ہیں۔
آپ نے تصویر کی درجہ بندی کا ایک نسبتاً پیچیدہ مسئلہ شروع سے حل کر لیا ہے! کلاسز کی تعداد کافی زیادہ تھی، اور پھر بھی آپ نے معقول درستگی حاصل کی! یہ بھی سمجھ میں آتا ہے کہ top-k درستگی کو ماپیں، کیونکہ کچھ کلاسز کو الجھانا آسان ہے جو انسانوں کے لیے بھی واضح طور پر مختلف نہیں ہیں۔
---
**ڈسکلیمر**:
یہ دستاویز AI ترجمہ سروس [Co-op Translator](https://github.com/Azure/co-op-translator) کا استعمال کرتے ہوئے ترجمہ کی گئی ہے۔ ہم درستگی کے لیے کوشش کرتے ہیں، لیکن براہ کرم آگاہ رہیں کہ خودکار ترجمے میں غلطیاں یا عدم درستگی ہو سکتی ہیں۔ اصل دستاویز، جو اس کی مقامی زبان میں ہے، کو مستند ذریعہ سمجھا جانا چاہیے۔ اہم معلومات کے لیے، پیشہ ور انسانی ترجمہ کی سفارش کی جاتی ہے۔ اس ترجمے کے استعمال سے پیدا ہونے والی کسی بھی غلط فہمی یا غلط تشریح کے لیے ہم ذمہ دار نہیں ہیں۔
یہ دستاویز AI ترجمہ سروس [Co-op Translator](https://github.com/Azure/co-op-translator) کا استعمال کرتے ہوئے ترجمہ کی گئی ہے۔ ہم درستگی کے لیے کوشش کرتے ہیں، لیکن براہ کرم آگاہ رہیں کہ خودکار ترجمے میں غلطیاں یا غیر درستیاں ہو سکتی ہیں۔ اصل دستاویز کو اس کی اصل زبان میں مستند ذریعہ سمجھا جانا چاہیے۔ اہم معلومات کے لیے، پیشہ ور انسانی ترجمہ کی سفارش کی جاتی ہے۔ ہم اس ترجمے کے استعمال سے پیدا ہونے والی کسی بھی غلط فہمی یا غلط تشریح کے ذمہ دار نہیں ہیں۔

View File

@ -6,11 +6,13 @@
"source": [
"# Phân loại khuôn mặt thú cưng\n",
"\n",
"Bài tập thực hành từ [AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners).\n",
"Bài tập từ [AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners).\n",
"\n",
"### Lấy dữ liệu\n",
"\n",
"Trong bài tập này, chúng ta sẽ tập trung vào một nhiệm vụ phân loại tương đối đơn giản - phân loại khuôn mặt thú cưng. Bộ dữ liệu này bao gồm các khuôn mặt được cắt ra từ [Oxford-IIIT Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/). Hãy bắt đầu bằng cách tải và trực quan hóa bộ dữ liệu.\n"
"Trong bài tập này, chúng ta sẽ tập trung vào một nhiệm vụ phân loại tương đối đơn giản - phân loại khuôn mặt thú cưng. Chúng ta sẽ sử dụng [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/), bộ dữ liệu chứa hình ảnh của 37 giống chó và mèo khác nhau. Hãy bắt đầu bằng việc tải xuống và trực quan hóa bộ dữ liệu.\n",
"\n",
"**Lưu ý:** Bộ dữ liệu Oxford-IIIT Pet Dataset chứa hình ảnh đầy đủ của thú cưng. Các hình ảnh sẽ được sắp xếp theo giống trong thư mục đã giải nén.\n"
]
},
{
@ -77,7 +79,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Bây giờ hãy duyệt qua tất cả các thư mục con của lớp và vẽ biểu đồ một vài hình ảnh đầu tiên của mỗi lớp:\n"
"Bây giờ hãy duyệt qua tất cả các thư mục con của lớp và vẽ biểu đồ vài hình ảnh đầu tiên của mỗi lớp:\n"
]
},
{
@ -86,6 +88,24 @@
"metadata": {},
"outputs": [],
"source": [
"# Note: The Oxford-IIIT Pet Dataset extracts to a folder named 'images'\n",
"# Images are named by breed (e.g., 'Abyssinian_1.jpg')\n",
"# We need to organize them into breed-specific subdirectories\n",
"import os\n",
"from collections import defaultdict\n",
"\n",
"# Organize images by breed\n",
"if not os.path.exists('petfaces'):\n",
" os.makedirs('petfaces')\n",
" for img_file in os.listdir('images'):\n",
" if img_file.endswith(('.jpg', '.png')):\n",
" # Extract breed name from filename (everything before the last underscore and number)\n",
" breed = '_'.join(img_file.split('_')[:-1])\n",
" breed_dir = os.path.join('petfaces', breed)\n",
" if not os.path.exists(breed_dir):\n",
" os.makedirs(breed_dir)\n",
" os.rename(os.path.join('images', img_file), os.path.join(breed_dir, img_file))\n",
"\n",
"for cls in os.listdir('petfaces'):\n",
" print(cls)\n",
" display_images([Image.open(os.path.join('petfaces',cls,x)) \n",
@ -96,7 +116,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Hãy cùng xác định số lượng lớp trong tập dữ liệu của chúng ta:\n"
"Hãy xác định số lượng lớp trong tập dữ liệu của chúng ta:\n"
]
},
{
@ -124,7 +144,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## Chuẩn bị tập dữ liệu cho Học sâu\n",
"## Chuẩn bị tập dữ liệu cho Deep Learning\n",
"\n",
"Để bắt đầu huấn luyện mạng nơ-ron, chúng ta cần chuyển đổi tất cả hình ảnh thành tensor, đồng thời tạo các tensor tương ứng với nhãn (số lớp). Hầu hết các framework mạng nơ-ron đều có công cụ đơn giản để xử lý hình ảnh:\n",
"* Trong Tensorflow, sử dụng `tf.keras.preprocessing.image_dataset_from_directory`\n",
@ -146,7 +166,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Bây giờ chúng ta cần tách tập dữ liệu thành phần huấn luyện và phần kiểm tra:\n"
"Bây giờ chúng ta cần tách tập dữ liệu thành phần huấn luyện và kiểm tra:\n"
]
},
{
@ -162,11 +182,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Bây giờ, hãy in kích thước của các tensor trong tập dữ liệu của chúng ta. Nếu bạn đã thực hiện mọi thứ đúng, kích thước của các phần tử huấn luyện sẽ là \n",
" * `(batch_size,image_size,image_size,3)` đối với Tensorflow, `batch_size,3,image_size,image_size` đối với PyTorch \n",
" * `batch_size` đối với Nhãn \n",
"\n",
"Nhãn nên chứa số lượng các lớp.\n"
"Bây giờ hãy in kích thước của các tensor trong tập dữ liệu của chúng ta. Nếu bạn đã làm đúng mọi thứ, kích thước của các phần tử huấn luyện sẽ là\n",
" * `(batch_size,image_size,image_size,3)` đối với Tensorflow, `batch_size,3,image_size,image_size` đối với PyTorch\n",
" * `batch_size` đối với Nhãn\n",
" \n",
" Nhãn nên chứa các số đại diện cho các lớp.\n"
]
},
{
@ -228,15 +248,15 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## Định nghĩa mạng nơ-ron\n",
"## Định nghĩa một mạng nơ-ron\n",
"\n",
"Đối với phân loại hình ảnh, bạn nên định nghĩa một mạng nơ-ron tích chập với nhiều lớp. Những điều cần chú ý:\n",
"* Hãy nhớ kiến trúc hình kim tự tháp, tức là số lượng bộ lọc nên tăng lên khi bạn đi sâu hơn.\n",
"* Đừng quên các hàm kích hoạt giữa các lớp (ReLU) và Max Pooling.\n",
"* Bộ phân loại cuối cùng có thể có hoặc không có các lớp ẩn, nhưng số lượng nơ-ron đầu ra phải bằng với số lượng lớp.\n",
"\n",
"Một điều quan trọng là phải thiết lập đúng hàm kích hoạt ở lớp cuối cùng + hàm mất mát:\n",
"* Trong Tensorflow, bạn có thể sử dụng `softmax` làm hàm kích hoạt và `sparse_categorical_crossentropy` làm hàm mất mát. Sự khác biệt giữa sparse categorical cross-entropy và loại không sparse là loại đầu tiên yêu cầu đầu ra dưới dạng số lớp, không phải vector one-hot.\n",
"Một điều quan trọng là phải chọn đúng hàm kích hoạt ở lớp cuối cùng + hàm mất mát:\n",
"* Trong Tensorflow, bạn có thể sử dụng `softmax` làm hàm kích hoạt và `sparse_categorical_crossentropy` làm hàm mất mát. Sự khác biệt giữa hàm mất mát sparse categorical cross-entropy và hàm không sparse là hàm đầu tiên yêu cầu đầu ra dưới dạng số lớp, không phải vector one-hot.\n",
"* Trong PyTorch, bạn có thể để lớp cuối cùng không có hàm kích hoạt và sử dụng hàm mất mát `CrossEntropyLoss`. Hàm này tự động áp dụng softmax.\n"
]
},
@ -253,11 +273,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## Huấn luyện Mạng Nơ-ron\n",
"## Huấn luyện Mạng Neural\n",
"\n",
"Bây giờ chúng ta đã sẵn sàng để huấn luyện mạng nơ-ron. Trong quá trình huấn luyện, hãy thu thập độ chính xác trên dữ liệu huấn luyện và dữ liệu kiểm tra ở mỗi epoch, sau đó vẽ biểu đồ độ chính xác để xem liệu có hiện tượng overfitting hay không.\n",
"Bây giờ chúng ta đã sẵn sàng để huấn luyện mạng neural. Trong quá trình huấn luyện, hãy thu thập độ chính xác trên dữ liệu huấn luyện và kiểm tra ở mỗi epoch, sau đó vẽ biểu đồ độ chính xác để xem liệu có xảy ra hiện tượng overfitting hay không.\n",
"\n",
"> Để tăng tốc độ huấn luyện, bạn cần sử dụng GPU nếu có sẵn. Trong khi TensorFlow/Keras sẽ tự động sử dụng GPU, với PyTorch, bạn cần di chuyển cả mô hình và dữ liệu sang GPU trong quá trình huấn luyện bằng phương thức `.to()` để tận dụng khả năng tăng tốc của GPU.\n"
"> Để tăng tốc độ huấn luyện, bạn cần sử dụng GPU nếu có. Trong khi TensorFlow/Keras sẽ tự động sử dụng GPU, thì với PyTorch bạn cần chuyển cả mô hình và dữ liệu sang GPU trong quá trình huấn luyện bằng phương pháp `.to()` để tận dụng khả năng tăng tốc của GPU.\n"
]
},
{
@ -297,18 +317,18 @@
"source": [
"Bạn có thể nói gì về hiện tượng overfitting? Làm thế nào để cải thiện độ chính xác của mô hình?\n",
"\n",
"## Tùy chọn: Tính toán độ chính xác Top3\n",
"## Tùy chọn: Tính toán Độ chính xác Top 3\n",
"\n",
"Trong bài tập này, chúng ta đang xử lý bài toán phân loại với số lượng lớp khá lớn (35), vì vậy kết quả của chúng ta - khoảng 50% độ chính xác trên tập kiểm tra - là khá tốt. Bộ dữ liệu ImageNet tiêu chuẩn thậm chí còn có nhiều lớp hơn - 1000 lớp.\n",
"Trong bài tập này, chúng ta đang làm việc với bài toán phân loại có số lượng lớp khá lớn (35), vì vậy kết quả của chúng ta - khoảng 50% độ chính xác trên tập kiểm tra - là khá tốt. Bộ dữ liệu ImageNet tiêu chuẩn thậm chí còn có nhiều lớp hơn - 1000 lớp.\n",
"\n",
"Trong những trường hợp như vậy, rất khó để đảm bảo rằng mô hình **luôn** dự đoán chính xác lớp. Có những trường hợp hai giống loài rất giống nhau, và mô hình trả về các xác suất rất gần nhau (ví dụ: 0.45 và 0.43). Nếu chúng ta đo độ chính xác tiêu chuẩn, trường hợp này sẽ bị coi là sai, mặc dù mô hình chỉ mắc một lỗi rất nhỏ. Vì vậy, chúng ta thường đo một chỉ số khác - độ chính xác trong top 3 dự đoán có xác suất cao nhất của mô hình.\n",
"Trong những trường hợp như vậy, rất khó để đảm bảo rằng mô hình **luôn luôn** dự đoán chính xác lớp. Có những trường hợp hai giống loài rất giống nhau, và mô hình trả về xác suất rất gần nhau (ví dụ: 0.45 và 0.43). Nếu chúng ta đo độ chính xác tiêu chuẩn, điều này sẽ được coi là một trường hợp sai, mặc dù mô hình chỉ mắc một lỗi rất nhỏ. Vì vậy, chúng ta thường đo một chỉ số khác - độ chính xác trong top 3 dự đoán có xác suất cao nhất của mô hình.\n",
"\n",
"Chúng ta coi trường hợp là chính xác nếu nhãn mục tiêu nằm trong top 3 dự đoán của mô hình.\n",
"\n",
"Để tính toán độ chính xác top-3 trên tập dữ liệu kiểm tra, bạn cần tự mình duyệt qua tập dữ liệu, áp dụng mạng nơ-ron để lấy dự đoán, và sau đó thực hiện các phép tính. Một số gợi ý:\n",
"\n",
"* Trong Tensorflow, sử dụng hàm `tf.nn.in_top_k` để kiểm tra xem `predictions` (đầu ra của mô hình) có nằm trong top-k (truyền `k=3` làm tham số) với `targets` hay không. Hàm này trả về một tensor các giá trị boolean, có thể được chuyển đổi thành `int` bằng cách sử dụng `tf.cast`, và sau đó tích lũy bằng cách sử dụng `tf.reduce_sum`.\n",
"* Trong PyTorch, bạn có thể sử dụng hàm `torch.topk` để lấy các chỉ số của các lớp có xác suất cao nhất, và sau đó kiểm tra xem lớp chính xác có nằm trong đó hay không. Xem [đây](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) để biết thêm gợi ý.\n"
"* Trong Tensorflow, sử dụng hàm `tf.nn.in_top_k` để kiểm tra xem `predictions` (đầu ra của mô hình) có nằm trong top-k (truyền `k=3` làm tham số) so với `targets` hay không. Hàm này trả về một tensor các giá trị boolean, có thể được chuyển đổi thành `int` bằng cách sử dụng `tf.cast`, và sau đó tích lũy bằng `tf.reduce_sum`.\n",
"* Trong PyTorch, bạn có thể sử dụng hàm `torch.topk` để lấy chỉ số của các lớp có xác suất cao nhất, và sau đó kiểm tra xem lớp chính xác có nằm trong số đó hay không. Xem [đây](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) để biết thêm gợi ý.\n"
]
},
{
@ -324,9 +344,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## Tùy chọn: Xây dựng phân loại Mèo và Chó\n",
"## Tùy chọn: Xây dựng phân loại Mèo vs. Chó\n",
"\n",
"Chúng ta cũng muốn kiểm tra độ chính xác của mô hình phân loại nhị phân mèo và chó trên cùng tập dữ liệu. Để thực hiện điều này, chúng ta cần điều chỉnh nhãn:\n"
"Chúng tôi cũng muốn xem độ chính xác của việc phân loại nhị phân mèo vs. chó trên cùng bộ dữ liệu. Để thực hiện điều này, chúng ta cần điều chỉnh nhãn:\n"
]
},
{
@ -352,7 +372,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Tuyên bố miễn trừ trách nhiệm**: \nTài liệu này đã được dịch bằng dịch vụ dịch thuật AI [Co-op Translator](https://github.com/Azure/co-op-translator). Mặc dù chúng tôi cố gắng đảm bảo độ chính xác, xin lưu ý rằng các bản dịch tự động có thể chứa lỗi hoặc không chính xác. Tài liệu gốc bằng ngôn ngữ bản địa nên được coi là nguồn tham khảo chính thức. Đối với các thông tin quan trọng, nên sử dụng dịch vụ dịch thuật chuyên nghiệp từ con người. Chúng tôi không chịu trách nhiệm cho bất kỳ sự hiểu lầm hoặc diễn giải sai nào phát sinh từ việc sử dụng bản dịch này.\n"
"\n---\n\n**Tuyên bố miễn trừ trách nhiệm**: \nTài liệu này đã được dịch bằng dịch vụ dịch thuật AI [Co-op Translator](https://github.com/Azure/co-op-translator). Mặc dù chúng tôi cố gắng đảm bảo độ chính xác, xin lưu ý rằng các bản dịch tự động có thể chứa lỗi hoặc không chính xác. Tài liệu gốc bằng ngôn ngữ bản địa nên được coi là nguồn thông tin chính thức. Đối với các thông tin quan trọng, khuyến nghị sử dụng dịch vụ dịch thuật chuyên nghiệp bởi con người. Chúng tôi không chịu trách nhiệm về bất kỳ sự hiểu lầm hoặc diễn giải sai nào phát sinh từ việc sử dụng bản dịch này.\n"
]
}
],
@ -378,8 +398,8 @@
"version": "3.9.5"
},
"coopTranslator": {
"original_hash": "1de3ae931831253c3198d899da48bfe5",
"translation_date": "2025-08-29T13:26:21+00:00",
"original_hash": "df7d1f7da8d2617b76acd93115776ca4",
"translation_date": "2025-10-03T14:41:51+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb",
"language_code": "vi"
}

View File

@ -1,29 +1,29 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "f3d2cee9cb3c52160419e560c57a690e",
"translation_date": "2025-08-29T12:20:20+00:00",
"original_hash": "b70fcf7fcee862990f848c679090943f",
"translation_date": "2025-10-03T14:56:10+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/README.md",
"language_code": "vi"
}
-->
# Phân loại khuôn mặt thú cưng
# Phân Loại Khuôn Mặt Thú Cưng
Bài tập thực hành từ [AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners).
Bài tập thực hành từ [Chương trình AI cho Người Mới Bắt Đầu](https://github.com/microsoft/ai-for-beginners).
## Nhiệm v
## Nhiệm V
Hãy tưởng tượng bạn cần phát triển một ứng dụng cho trung tâm chăm sóc thú cưng để lập danh mục tất cả các thú nuôi. Một trong những tính năng tuyệt vời của ứng dụng này là tự động nhận diện giống loài từ một bức ảnh. Điều này có thể được thực hiện thành công bằng cách sử dụng mạng nơ-ron.
Hãy tưởng tượng bạn cần phát triển một ứng dụng cho nhà trẻ thú cưng để lập danh mục tất cả các thú nuôi. Một trong những tính năng tuyệt vời của ứng dụng này là tự động nhận diện giống loài từ một bức ảnh. Điều này có thể được thực hiện thành công bằng cách sử dụng mạng nơ-ron.
Bạn cần huấn luyện một mạng nơ-ron tích chập để phân loại các giống loài khác nhau của mèo và chó bằng cách sử dụng bộ dữ liệu **Pet Faces**.
## Bộ dữ liệu
## Bộ Dữ Liệu
Chúng ta sẽ sử dụng bộ dữ liệu **Pet Faces**, được lấy từ bộ dữ liệu thú cưng [Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/). Bộ dữ liệu này chứa 35 giống loài khác nhau của chó và mèo.
Chúng ta sẽ sử dụng [Bộ Dữ Liệu Thú Cưng Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/), bộ dữ liệu này chứa hình ảnh của 37 giống loài chó và mèo khác nhau.
![Bộ dữ liệu chúng ta sẽ làm việc](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.vi.png)
Để tải bộ dữ liệu, hãy sử dụng đoạn mã sau:
Để tải bộ dữ liệu, sử dụng đoạn mã sau:
```python
!wget https://thor.robots.ox.ac.uk/~vgg/data/pets/images.tar.gz
@ -31,15 +31,17 @@ Chúng ta sẽ sử dụng bộ dữ liệu **Pet Faces**, được lấy từ b
!rm images.tar.gz
```
## Bắt đầu với Notebook
**Lưu ý:** Các hình ảnh trong Bộ Dữ Liệu Thú Cưng Oxford-IIIT được tổ chức theo tên tệp (ví dụ: `Abyssinian_1.jpg`, `Bengal_2.jpg`). Notebook bao gồm mã để tổ chức các hình ảnh này vào các thư mục con theo từng giống loài để dễ dàng phân loại hơn.
## Bắt Đầu Notebook
Bắt đầu bài thực hành bằng cách mở [PetFaces.ipynb](PetFaces.ipynb)
## Kết quả đạt được
## Kết Quả Đạt Được
Bạn đã giải quyết một vấn đề tương đối phức tạp về phân loại hình ảnh từ đầu! Có khá nhiều lớp, nhưng bạn vẫn có thể đạt được độ chính xác hợp lý! Ngoài ra, việc đo lường độ chính xác top-k cũng rất hợp lý, vì một số lớp có thể dễ bị nhầm lẫn, ngay cả đối với con người.
Bạn đã giải quyết một vấn đề tương đối phức tạp về phân loại hình ảnh từ đầu! Có khá nhiều lớp, nhưng bạn vẫn có thể đạt được độ chính xác hợp lý! Ngoài ra, việc đo lường độ chính xác top-k cũng rất hợp lý, bởi vì một số lớp có thể dễ bị nhầm lẫn ngay cả đối với con người.
---
**Tuyên bố miễn trừ trách nhiệm**:
Tài liệu này đã được dịch bằng dịch vụ dịch thuật AI [Co-op Translator](https://github.com/Azure/co-op-translator). Mặc dù chúng tôi cố gắng đảm bảo độ chính xác, xin lưu ý rằng các bản dịch tự động có thể chứa lỗi hoặc không chính xác. Tài liệu gốc bằng ngôn ngữ bản địa nên được coi là nguồn tham khảo chính thức. Đối với các thông tin quan trọng, nên sử dụng dịch vụ dịch thuật chuyên nghiệp từ con người. Chúng tôi không chịu trách nhiệm cho bất kỳ sự hiểu lầm hoặc diễn giải sai nào phát sinh từ việc sử dụng bản dịch này.
Tài liệu này đã được dịch bằng dịch vụ dịch thuật AI [Co-op Translator](https://github.com/Azure/co-op-translator). Mặc dù chúng tôi cố gắng đảm bảo độ chính xác, xin lưu ý rằng các bản dịch tự động có thể chứa lỗi hoặc không chính xác. Tài liệu gốc bằng ngôn ngữ bản địa nên được coi là nguồn thông tin chính thức. Đối với các thông tin quan trọng, khuyến nghị sử dụng dịch vụ dịch thuật chuyên nghiệp bởi con người. Chúng tôi không chịu trách nhiệm cho bất kỳ sự hiểu lầm hoặc diễn giải sai nào phát sinh từ việc sử dụng bản dịch này.

View File

@ -10,7 +10,9 @@
"\n",
"### 获取数据\n",
"\n",
"在本次任务中,我们将专注于一个相对简单的分类任务——宠物面部的分类。该数据集由 [Oxford-IIIT 数据集](https://www.robots.ox.ac.uk/~vgg/data/pets/) 中裁剪出的面部组成。让我们从加载和可视化数据集开始。\n"
"在本次任务中,我们将专注于一个相对简单的分类任务——宠物面部分类。我们将使用 [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/)该数据集包含37种不同品种的猫狗的图片。让我们从下载并可视化数据集开始。\n",
"\n",
"**注意:** Oxford-IIIT Pet Dataset 包含完整的宠物图片。提取后的文件夹中,图片将按品种进行组织。\n"
]
},
{
@ -77,7 +79,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"现在让我们遍历所有类别子目录并绘制每个类别的前几张图\n"
"现在让我们遍历所有类别子目录并绘制每个类别的前几张图\n"
]
},
{
@ -86,6 +88,24 @@
"metadata": {},
"outputs": [],
"source": [
"# Note: The Oxford-IIIT Pet Dataset extracts to a folder named 'images'\n",
"# Images are named by breed (e.g., 'Abyssinian_1.jpg')\n",
"# We need to organize them into breed-specific subdirectories\n",
"import os\n",
"from collections import defaultdict\n",
"\n",
"# Organize images by breed\n",
"if not os.path.exists('petfaces'):\n",
" os.makedirs('petfaces')\n",
" for img_file in os.listdir('images'):\n",
" if img_file.endswith(('.jpg', '.png')):\n",
" # Extract breed name from filename (everything before the last underscore and number)\n",
" breed = '_'.join(img_file.split('_')[:-1])\n",
" breed_dir = os.path.join('petfaces', breed)\n",
" if not os.path.exists(breed_dir):\n",
" os.makedirs(breed_dir)\n",
" os.rename(os.path.join('images', img_file), os.path.join(breed_dir, img_file))\n",
"\n",
"for cls in os.listdir('petfaces'):\n",
" print(cls)\n",
" display_images([Image.open(os.path.join('petfaces',cls,x)) \n",
@ -96,7 +116,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"让我们也定义数据集中类别数量:\n"
"让我们也定义数据集中类别数量:\n"
]
},
{
@ -124,9 +144,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## 准备深度学习的数据集\n",
"## 为深度学习准备数据集\n",
"\n",
"为了开始训练我们的神经网络,我们需要将所有图像转换为张量,同时创建与标签(类别编号)对应的张量。大多数神经网络框架都包含处理图像的简单工具:\n",
"在开始训练我们的神经网络之前,我们需要将所有图像转换为张量,并创建与标签(类别编号)对应的张量。大多数神经网络框架都包含处理图像的简单工具:\n",
"* 在 Tensorflow 中,使用 `tf.keras.preprocessing.image_dataset_from_directory`\n",
"* 在 PyTorch 中,使用 `torchvision.datasets.ImageFolder`\n",
"\n",
@ -163,10 +183,10 @@
"metadata": {},
"source": [
"现在让我们打印数据集中张量的大小。如果你一切都设置正确,训练元素的大小应该是:\n",
" * 对于 Tensorflow`(batch_size,image_size,image_size,3)`;对于 PyTorch`batch_size,3,image_size,image_size`\n",
" * 标签的大小 `batch_size`\n",
" * 对于 Tensorflow应该是 `(batch_size,image_size,image_size,3)`;对于 PyTorch应该是 `batch_size,3,image_size,image_size`\n",
" * 标签的大小应该是 `batch_size`\n",
"\n",
"标签应包含类别的数字。\n"
"标签应该包含类别的编号。\n"
]
},
{
@ -228,16 +248,16 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## 定义一个神经网络\n",
"## 定义神经网络\n",
"\n",
"对于图像分类,你可能需要定义一个具有多层的卷积神经网络。需要注意以下几点:\n",
"* 牢记金字塔结构,也就是说,随着网络的加深,滤波器的数量应该增加。\n",
"* 不要忘记在层之间添加激活函数(如 ReLU和最大池化Max Pooling。\n",
"* 最的分类器可以有隐藏层,也可以没有,但输出神经元的数量应等于类别的数量。\n",
"对于图像分类,通常需要定义一个具有多层的卷积神经网络。需要注意以下几点:\n",
"* 牢记金字塔架构,即随着网络加深,滤波器的数量应该增加。\n",
"* 不要忘记在层之间使用激活函数(如 ReLU和最大池化。\n",
"* 最的分类器可以有隐藏层,也可以没有,但输出神经元的数量应等于类别的数量。\n",
"\n",
"一个重要的点是要正确设置最后一层的激活函数和损失函数:\n",
"* 在 Tensorflow 中,可以使用 `softmax` 作为激活函数,并使用 `sparse_categorical_crossentropy` 作为损失函数。稀疏分类交叉熵和非稀疏的区别在于,前者期望输出是类别的编号,而不是 one-hot 向量。\n",
"* 在 PyTorch 中,你可以在最后一层不使用激活函数,并使用 `CrossEntropyLoss` 作为损失函数。这个函数会自动应用 softmax。\n"
"* 在 Tensorflow 中,可以使用 `softmax` 作为激活函数,并使用 `sparse_categorical_crossentropy` 作为损失函数。稀疏类别交叉熵与非稀疏的区别在于,前者期望输出为类别编号,而不是独热向量。\n",
"* 在 PyTorch 中,最后一层可以不使用激活函数,并使用 `CrossEntropyLoss` 作为损失函数。函数会自动应用 softmax。\n"
]
},
{
@ -255,9 +275,9 @@
"source": [
"## 训练神经网络\n",
"\n",
"现在我们可以开始训练神经网络了。在训练过程中,请在每个epoch收集训练集和测试集的准确率然后绘制准确率曲线,以观察是否存在过拟合现象。\n",
"现在我们可以开始训练神经网络了。在训练过程中,请在每个训练周期收集训练数据和测试数据的准确率,然后绘制准确率图表,以观察是否存在过拟合现象。\n",
"\n",
"> 为了加快训练速度,如果有GPU可用请务必使用它。虽然TensorFlow/Keras会自动使用GPU但在PyTorch中你需要在训练时使用`.to()`方法将模型和数据都移动到GPU上以利用GPU加速。\n"
"> 为了加快训练速度,如果有 GPU 可用,请务必使用 GPU。虽然 TensorFlow/Keras 会自动使用 GPU但在 PyTorch 中,你需要在训练过程中使用 `.to()` 方法将模型和数据都移到 GPU 上,以利用 GPU 加速。\n"
]
},
{
@ -295,20 +315,20 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"关于过拟合你能说些什么?如何提高模型的准确性?\n",
"关于过拟合,你可以说什么?如何提高模型的准确性?\n",
"\n",
"## 可选:计算 Top3 准确率\n",
"\n",
"在本次练习中我们处理的是一个类别数量较多的分类问题35个类别因此我们的结果——大约50%的验证准确率——已经相当不错了。标准的 ImageNet 数据集甚至有更多类别——1000个。\n",
"\n",
"在这种情况下,很难确保模型**总是**能够正确预测类别。有些情况下,两种类别非常相似,模型给出的概率也非常接近例如0.45 和 0.43)。如果我们仅仅测量标准准确率,这种情况会被视为错误,即使模型只犯了一个很小的错误。因此,我们经常测量另一种指标——模型预测中最可能的前三个类别的准确率。\n",
"在这种情况下,很难确保模型**总是**正确预测类别。有些情况下,两种类别非常相似,模型返回的概率也非常接近例如0.45和0.43)。如果我们测量标准准确率,这种情况会被认为是错误的,即使模型只犯了一个很小的错误。因此,我们经常测量另一种指标——模型预测中最可能的前三个类别的准确率。\n",
"\n",
"如果目标标签包含在模型预测的前三个类别中,我们就认为是准确的。\n",
"如果目标标签包含在模型预测的前三个类别中,我们就认为该情况是准确的。\n",
"\n",
"要计算测试数据集上的 Top-3 准确率,你需要手动遍历数据集,应用神经网络获取预测结果,然后进行计算。一些提示:\n",
"要在测试数据集上计算 Top-3 准确率,你需要手动遍历数据集,应用神经网络获取预测结果,然后进行计算。一些提示:\n",
"\n",
"* 在 TensorFlow 中,可以使用 `tf.nn.in_top_k` 函数来检查 `predictions`(模型的输出)是否在 top-k将 `k=3` 作为参数)中,与 `targets` 进行比较。该函数返回一个布尔值的张量,可以通过 `tf.cast` 转换为 `int`,然后使用 `tf.reduce_sum` 累加。\n",
"* 在 PyTorch 中,可以使用 `torch.topk` 函数获取具有最高概率的类别索引,然后检查正确类别是否包含在其中。更多提示请参考[这里](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b)。\n"
"* 在 Tensorflow 中,可以使用 `tf.nn.in_top_k` 函数来查看 `predictions`(模型的输出)是否在 top-k将 `k=3` 作为参数),与 `targets` 相比。此函数返回一个布尔值的张量,可以使用 `tf.cast` 转换为 `int`,然后使用 `tf.reduce_sum` 累积。\n",
"* 在 PyTorch 中,可以使用 `torch.topk` 函数获取具有最高概率的类别索引,然后查看正确类别是否属于其中。请参阅 [此处](https://gist.github.com/weiaicunzai/2a5ae6eac6712c70bde0630f3e76b77b) 获取更多提示。\n"
]
},
{
@ -324,9 +344,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## 可选:构建猫狗分类\n",
"## 可选:构建猫狗分类\n",
"\n",
"我们还想看看在同一数据集上,我们的二分类猫狗分类的准确性如何。为此,我们需要调整标签:\n"
"我们还想看看在同一数据集上,我们的二元猫与狗分类的准确性如何。为此,我们需要调整标签:\n"
]
},
{
@ -352,7 +372,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**免责声明** \n本文档使用AI翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。原始语言的文档应被视为权威来源。对于关键信息,建议使用专业人工翻译。我们对因使用此翻译而产生的任何误解或误读承担责任。\n"
"\n---\n\n**免责声明** \n本文档使用AI翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。原始语言的文档应被视为权威来源。对于关键信息,建议使用专业人工翻译。我们对因使用此翻译而产生的任何误解或误读承担责任。\n"
]
}
],
@ -378,8 +398,8 @@
"version": "3.9.5"
},
"coopTranslator": {
"original_hash": "1de3ae931831253c3198d899da48bfe5",
"translation_date": "2025-08-31T09:35:44+00:00",
"original_hash": "df7d1f7da8d2617b76acd93115776ca4",
"translation_date": "2025-10-03T14:28:35+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb",
"language_code": "zh"
}

View File

@ -1,8 +1,8 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "f3d2cee9cb3c52160419e560c57a690e",
"translation_date": "2025-08-24T20:34:26+00:00",
"original_hash": "b70fcf7fcee862990f848c679090943f",
"translation_date": "2025-10-03T14:52:43+00:00",
"source_file": "lessons/4-ComputerVision/07-ConvNets/lab/README.md",
"language_code": "zh"
}
@ -13,13 +13,13 @@ CO_OP_TRANSLATOR_METADATA:
## 任务
想象一下,你需要开发一个宠物托管应用程序,用来记录所有的宠物信息。这个应用程序的一个重要功能是能够通过照片自动识别宠物的品种。这可以通过神经网络成功实现。
假设你需要开发一个宠物托管应用程序,用于记录所有宠物信息。该应用程序的一个重要功能是通过照片自动识别宠物的品种。这可以通过神经网络成功实现。
你需要训练一个卷积神经网络,使用 **Pet Faces** 数据集对不同品种的猫和狗进行分类。
## 数据集
我们将使用 **Pet Faces** 数据集,该数据集来源于 [Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/) 宠物数据集。它包含35种不同品种的猫和狗
我们将使用 [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/)该数据集包含37种不同品种的猫和狗的图像
![我们将处理的数据集](../../../../../../translated_images/data.50b2a9d5484bdbf0f52f5765b381cec9efe2bd296a98f007f90bedb6ac67f2a8.zh.png)
@ -31,13 +31,17 @@ CO_OP_TRANSLATOR_METADATA:
!rm images.tar.gz
```
**注意:** Oxford-IIIT Pet Dataset 的图像是按文件名组织的(例如,`Abyssinian_1.jpg``Bengal_2.jpg`)。笔记本中包含代码,将这些图像组织到按品种分类的子目录中,以便于分类。
## 启动笔记本
通过打开 [PetFaces.ipynb](../../../../../../lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb) 开始实验。
通过打开 [PetFaces.ipynb](PetFaces.ipynb) 开始实验。
## 收获
你已经从零开始解决了一个相对复杂的图像分类问题!尽管有很多类别,你仍然能够获得不错的准确率!同时,测量 top-k 准确率也是有意义的,因为有些类别即使是人类也很难区分清楚,容易混淆。
你已经从零开始解决了一个相对复杂的图像分类问题!尽管类别很多,你仍然能够获得合理的准确率!同时,测量 top-k 准确率也是有意义的,因为有些类别即使对人类来说也不容易区分。
---
**免责声明**
本文档使用AI翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言的文档作为权威来源。对于关键信息,建议使用专业人工翻译。我们对于因使用本翻译而引起的任何误解或误读不承担责任。
本文档使用AI翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。原始语言的文档应被视为权威来源。对于关键信息,建议使用专业人工翻译。我们不对因使用此翻译而产生的任何误解或误读承担责任。