chore(i18n): sync translations with latest source changes (chunk 1/1, 17 changes)
This commit is contained in:
parent
10b6d23c56
commit
a2589d6f13
|
|
@ -5,6 +5,12 @@
|
|||
"source_file": "AGENTS.md",
|
||||
"language_code": "ar"
|
||||
},
|
||||
"CONTRIBUTING.md": {
|
||||
"original_hash": "c6fd7e781b67111a90abd166d0ce4aa0",
|
||||
"translation_date": "2026-07-08T21:37:35+00:00",
|
||||
"source_file": "CONTRIBUTING.md",
|
||||
"language_code": "ar"
|
||||
},
|
||||
"README.md": {
|
||||
"original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b",
|
||||
"translation_date": "2026-04-06T21:13:43+00:00",
|
||||
|
|
@ -17,6 +23,30 @@
|
|||
"source_file": "SECURITY.md",
|
||||
"language_code": "ar"
|
||||
},
|
||||
"__translation_failures__": {
|
||||
"examples/README.md": {
|
||||
"original_hash": "7883d52c2e2a221e0b07a7b112a149b9",
|
||||
"source_file": "examples/README.md",
|
||||
"language_code": "ar",
|
||||
"failure_date": "2026-07-08T21:27:31+00:00",
|
||||
"status": "failed",
|
||||
"error_type": "TranslationIncompleteError",
|
||||
"error_message": "Markdown translation remained incomplete for chunk 1 of 'README.md', and the chunk could not be split further.",
|
||||
"translator_version": "0.20.0",
|
||||
"failure_policy_version": 1
|
||||
},
|
||||
"lessons/sketchnotes/LICENSE.md": {
|
||||
"original_hash": "45ab63a2cd8f5faef6c9b150618837a4",
|
||||
"source_file": "lessons/sketchnotes/LICENSE.md",
|
||||
"language_code": "ar",
|
||||
"failure_date": "2026-07-08T21:31:56+00:00",
|
||||
"status": "failed",
|
||||
"error_type": "TranslationIncompleteError",
|
||||
"error_message": "Markdown translation remained incomplete for chunk 1.1.1 of 'LICENSE.md', and the chunk could not be split further.",
|
||||
"translator_version": "0.20.0",
|
||||
"failure_policy_version": 1
|
||||
}
|
||||
},
|
||||
"etc/CODE_OF_CONDUCT.md": {
|
||||
"original_hash": "c06b12caf3c901eb3156e3dd5b0aea56",
|
||||
"translation_date": "2025-08-26T11:16:50+00:00",
|
||||
|
|
@ -66,8 +96,8 @@
|
|||
"language_code": "ar"
|
||||
},
|
||||
"lessons/0-course-setup/how-to-run.md": {
|
||||
"original_hash": "a4717bd9103b9f6cd84d534b83534689",
|
||||
"translation_date": "2026-01-15T10:59:18+00:00",
|
||||
"original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1",
|
||||
"translation_date": "2026-07-08T21:27:52+00:00",
|
||||
"source_file": "lessons/0-course-setup/how-to-run.md",
|
||||
"language_code": "ar"
|
||||
},
|
||||
|
|
@ -191,6 +221,12 @@
|
|||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md",
|
||||
"language_code": "ar"
|
||||
},
|
||||
"lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": {
|
||||
"original_hash": "99b816b6a4957ef4100cee4c4221dff9",
|
||||
"translation_date": "2026-07-08T21:20:25+00:00",
|
||||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb",
|
||||
"language_code": "ar"
|
||||
},
|
||||
"lessons/4-ComputerVision/08-TransferLearning/lab/README.md": {
|
||||
"original_hash": "7765935c35fcee69b9fe2d0cfd6963e2",
|
||||
"translation_date": "2025-08-26T09:52:25+00:00",
|
||||
|
|
@ -330,8 +366,8 @@
|
|||
"language_code": "ar"
|
||||
},
|
||||
"lessons/5-NLP/README.md": {
|
||||
"original_hash": "8ef02a9318257ea140ed3ed74442096d",
|
||||
"translation_date": "2025-08-26T08:01:26+00:00",
|
||||
"original_hash": "038df6f1a73e49f6430740da083bfd6d",
|
||||
"translation_date": "2026-07-08T21:28:18+00:00",
|
||||
"source_file": "lessons/5-NLP/README.md",
|
||||
"language_code": "ar"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -0,0 +1,29 @@
|
|||
# المساهمة في AI-For-Beginners
|
||||
|
||||
شكرًا لك على اهتمامك بالمساهمة في AI-For-Beginners! نحن نرحب بالترجمات، وتصحيحات الدروس، وتصحيحات التنسيق.
|
||||
|
||||
## اتفاقية ترخيص المساهمين من مايكروسوفت (CLA)
|
||||
|
||||
يرحب هذا المشروع بالمساهمات والاقتراحات. تتطلب معظم المساهمات منك الموافقة على اتفاقية ترخيص المساهمين (CLA) التي تعلن فيها أن لديك الحق وأنك فعلاً تمنحنا حقوق استخدام مساهمتك. لمزيد من التفاصيل، قم بزيارة [https://cla.microsoft.com](https://cla.microsoft.com).
|
||||
|
||||
عند تقديم طلب سحب، سيقوم بوت CLA تلقائيًا بتحديد ما إذا كنت بحاجة لتقديم اتفاقية ترخيص المساهمين وتزيين طلب السحب بالشكل المناسب (مثل وسم، تعليق). ما عليك سوى اتباع التعليمات التي يقدمها البوت. ستحتاج إلى القيام بذلك مرة واحدة فقط عبر جميع المستودعات التي تستخدم اتفاقية الترخيص الخاصة بنا.
|
||||
|
||||
## كيفية المساهمة
|
||||
|
||||
### 1. تصحيح الأخطاء المطبعية / أخطاء الكود
|
||||
إذا وجدت خطأ مطبعيًا أو خللاً في أي ملف Jupyter notebook أو ملف درس مكتوب بـ markdown:
|
||||
1. قم بعمل فورك للمستودع.
|
||||
2. صحح الخطأ المطبعي أو الرابط المعطّل.
|
||||
3. قدم طلب سحب مع وصف واضح للتصحيح.
|
||||
|
||||
### 2. تقديم الترجمات
|
||||
نحن نرحب بترجمات الدروس إلى لغات أخرى! يرجى وضع الترجمات تحت مجلد `translations/` مستخدمًا أسماء المجلدات الموجودة هناك (على سبيل المثال `translations/es/`, `translations/pt-BR/`, `translations/zh-CN/`).
|
||||
|
||||
للمزيد من التفاصيل، راجع [etc/CONTRIBUTING.md](etc/CONTRIBUTING.md).
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**تنويه**:
|
||||
تمت ترجمة هذا المستند باستخدام خدمة الترجمة بالذكاء الاصطناعي [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى للدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو عدم دقة. يجب اعتبار المستند الأصلي بلغته الأصلية المصدر الرسمي والمعتمد. للمعلومات الهامة، يُنصح بالاستعانة بترجمة بشرية محترفة. نحن غير مسؤولين عن أي سوء فهم أو تفسير ناتج عن استخدام هذه الترجمة.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -1,10 +1,10 @@
|
|||
# كيفية تشغيل الكود
|
||||
|
||||
يتضمن هذا المنهج العديد من الأمثلة التنفيذية والمختبرات التي سترغب في تشغيلها. للقيام بذلك، تحتاج إلى القدرة على تنفيذ كود بايثون في دفاتر Jupyter التي تُقدم كجزء من هذا المنهج. لديك عدة خيارات لتشغيل الكود:
|
||||
يحتوي هذا المنهج على الكثير من الأمثلة والمختبرات القابلة للتنفيذ التي قد ترغب في تشغيلها. للقيام بذلك، تحتاج إلى القدرة على تنفيذ كود Python في دفاتر Jupyter المقدمة كجزء من هذا المنهج. لديك عدة خيارات لتشغيل الكود:
|
||||
|
||||
## التشغيل محليًا على جهاز الكمبيوتر الخاص بك
|
||||
|
||||
لتشغيل الكود محليًا على جهاز الكمبيوتر الخاص بك، يلزم وجود تثبيت لبايثون. أحد التوصيات هو تثبيت **[miniconda](https://conda.io/en/latest/miniconda.html)** - وهو تثبيت خفيف الوزن يدعم مدير الحزم `conda` لإنشاء **بيئات افتراضية** مختلفة لبايثون.
|
||||
لتشغيل الكود محليًا على جهاز الكمبيوتر الخاص بك، يلزم وجود تثبيت Python. أحد التوصيات هو تثبيت **[miniconda](https://conda.io/en/latest/miniconda.html)** - فهو تثبيت خفيف يدعم مدير الحزم `conda` لبيئات Python **الافتراضية** المختلفة.
|
||||
|
||||
بعد تثبيت miniconda، قم باستنساخ المستودع وأنشئ بيئة افتراضية لاستخدامها في هذه الدورة:
|
||||
|
||||
|
|
@ -15,19 +15,19 @@ conda env create --name ai4beg --file .devcontainer/environment.yml
|
|||
conda activate ai4beg
|
||||
```
|
||||
|
||||
### استخدام Visual Studio Code مع امتداد بايثون
|
||||
### استخدام Visual Studio Code مع إضافة Python
|
||||
|
||||
يُفضل استخدام هذا المنهج عند فتحه في [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) مع [امتداد بايثون](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste).
|
||||
يُفضل استخدام هذا المنهج عند فتحه في [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) مع [إضافة Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste).
|
||||
|
||||
> **ملاحظة**: بمجرد استنساخ المستودع وفتح الدليل في VS Code، سيقترح عليك تلقائيًا تثبيت امتدادات بايثون. كما يجب عليك أيضًا تثبيت miniconda كما هو موضح أعلاه.
|
||||
> **ملاحظة**: بمجرد استنساخ وفتح الدليل في VS Code، سيقترح عليك تلقائيًا تثبيت إضافات Python. كما يجب عليك تثبيت miniconda كما هو موضح أعلاه.
|
||||
|
||||
> **ملاحظة**: إذا اقترح VS Code عليك إعادة فتح المستودع داخل حاوية، فيجب عليك رفض ذلك لاستخدام تثبيت بايثون المحلي.
|
||||
> **ملاحظة**: إذا اقترح VS Code إعادة فتح المستودع في حاوية، ينبغي عليك رفض ذلك لاستخدام تثبيت Python المحلي.
|
||||
|
||||
### استخدام Jupyter في المتصفح
|
||||
|
||||
يمكنك أيضًا استخدام بيئة Jupyter من المتصفح على جهاز الكمبيوتر الخاص بك. يوفر كل من Jupyter الكلاسيكي وJupyterHub بيئة تطوير ملائمة مع الإكمال التلقائي، تمييز الكود، وغيرها.
|
||||
يمكنك أيضًا استخدام بيئة Jupyter من المتصفح على جهاز الكمبيوتر الخاص بك. يوفر كل من Jupyter الكلاسيكي وJupyterHub بيئة تطوير مريحة مع الإكمال التلقائي، تمييز الكود، وغيرها.
|
||||
|
||||
لبدء Jupyter محليًا، انتقل إلى دليل الدورة، ونفذ:
|
||||
لبدء Jupyter محليًا، انتقل إلى دليل الدورة ونفذ الأمر التالي:
|
||||
|
||||
```bash
|
||||
jupyter notebook
|
||||
|
|
@ -36,36 +36,36 @@ jupyter notebook
|
|||
```bash
|
||||
jupyterhub
|
||||
```
|
||||
يمكنك بعد ذلك التنقل إلى أي من ملفات `.ipynb`، وفتحها والبدء في العمل.
|
||||
يمكنك بعدها التنقل إلى أي من ملفات `.ipynb`، فتحها والبدء في العمل.
|
||||
|
||||
### التشغيل في الحاوية
|
||||
### التشغيل داخل حاوية
|
||||
|
||||
أحد البدائل لتثبيت بايثون هو تشغيل الكود داخل حاوية. نظرًا لأن مستودعنا يوفر مجلد `.devcontainer` خاص يشرح كيفية بناء حاوية لهذا المستودع، يقدم VS Code فرصة لإعادة فتح الكود داخل حاوية. سيتطلب هذا تثبيت Docker، وسيكون أكثر تعقيدًا، لذا نوصي بذلك للمستخدمين الأكثر خبرة.
|
||||
بديل آخر لتثبيت Python هو تشغيل الكود داخل حاوية. بما أن مستودعنا يزود مجلد `.devcontainer` خاص يوضح كيفية بناء حاوية لهذا المستودع، يقدم VS Code فرصة لإعادة فتح الكود داخل الحاوية. سيتطلب هذا تثبيت Docker، كما سيكون أكثر تعقيدًا، لذلك نوصي بذلك للمستخدمين الأكثر خبرة.
|
||||
|
||||
## التشغيل في السحابة
|
||||
|
||||
إذا لم ترغب في تثبيت بايثون محليًا، ولديك وصول إلى بعض موارد السحابة - فإن بديلًا جيدًا هو تشغيل الكود في السحابة. هناك عدة طرق يمكنك القيام بذلك:
|
||||
إذا لم ترغب في تثبيت Python محليًا ولديك إمكانية الوصول إلى موارد سحابية، فإن بديلًا جيدًا هو تشغيل الكود في السحابة. هناك عدة طرق للقيام بذلك:
|
||||
|
||||
* استخدام **[GitHub Codespaces](https://github.com/features/codespaces)**، وهي بيئة افتراضية تُنشأ لك على GitHub، يمكن الوصول إليها من خلال واجهة VS Code في المتصفح. إذا كان لديك وصول إلى Codespaces، يمكنك فقط الضغط على زر **Code** في المستودع، وبدء مساحة الكود، والبدء في التشغيل بسرعة.
|
||||
* استخدام **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. يقدم [Binder](https://mybinder.org) موارد حوسبة مجانية مقدمة في السحابة للأشخاص مثلك لتجربة بعض الأكواد على GitHub. هناك زر في الصفحة الرئيسية لفتح المستودع في Binder - يجب أن يأخذك هذا بسرعة إلى موقع Binder، الذي سيبني حاوية أساسية ويبدأ واجهة ويب Jupyter بسلاسة.
|
||||
* استخدام **[GitHub Codespaces](https://github.com/features/codespaces)**، وهي بيئة افتراضية تُنشأ لك على GitHub، يمكن الوصول إليها عبر واجهة VS Code في المتصفح. إذا كان لديك حق الوصول إلى Codespaces، يمكنك ببساطة النقر على زر **Code** في المستودع، بدء codespace، والبدء في التشغيل فورًا.
|
||||
* استخدام **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. توفر [Binder](https://mybinder.org) موارد حوسبة مجانية مقدمة في السحابة للأشخاص مثلك لاختبار الأكواد على GitHub. هناك زر في الصفحة الرئيسية لفتح المستودع في Binder - وسينقلك ذلك بسرعة إلى موقع binder، الذي سيبني حاوية أساسية ويبدأ واجهة Jupyter على الويب بسلاسة.
|
||||
|
||||
> **ملاحظة**: لمنع سوء الاستخدام، يفرض Binder حجب بعض موارد الويب. قد يمنع هذا عمل بعض الأكواد التي تقوم بجلب نماذج و/أو مجموعات بيانات من الإنترنت العام. قد تحتاج إلى إيجاد حلول بديلة. أيضًا، موارد الحوسبة التي يقدمها Binder أساسية جدًا، لذا سيكون التدريب بطيئًا، خاصة في الدروس الأكثر تعقيدًا لاحقًا.
|
||||
> **ملاحظة**: لمنع سوء الاستخدام، يتم حظر بعض موارد الويب في Binder. قد يمنع هذا عمل بعض الأكواد التي تجلب النماذج و/أو مجموعات البيانات من الإنترنت العام. قد تحتاج إلى إيجاد حلول بديلة. أيضًا، موارد الحوسبة المقدمة من Binder أساسية جدًا، لذا سيكون التدريب بطيئًا، خاصة في الدروس المتقدمة والأكثر تعقيدًا.
|
||||
|
||||
## التشغيل في السحابة مع دعم GPU
|
||||
## التشغيل في السحابة باستخدام GPU
|
||||
|
||||
بعض الدروس اللاحقة في هذا المنهج ستستفيد كثيرًا من دعم GPU. فمثلاً، قد يكون تدريب النماذج بطيئًا جدًا بدون دعم GPU. هناك عدة خيارات يمكنك اتباعها، خاصة إذا كان لديك وصول إلى السحابة إما عبر [Azure للطلاب](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste)، أو من خلال مؤسستك:
|
||||
بعض الدروس المتقدمة في هذا المنهج ستستفيد كثيرًا من دعم GPU. تدريب النماذج، على سبيل المثال، يمكن أن يكون بطيئًا جدًا بدون GPU. هناك عدة خيارات يمكنك اتباعها، خاصة إذا كان لديك وصول للسحابة عبر [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste)، أو من خلال مؤسستك:
|
||||
|
||||
* إنشاء [جهاز افتراضي لعلوم البيانات](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) والاتصال به عبر Jupyter. يمكنك بعد ذلك استنساخ المستودع مباشرة على الجهاز، والبدء بالتعلم. تدعم الأجهزة الافتراضية من سلسلة NC دعم GPU.
|
||||
* إنشاء [جهاز افتراضي لعلوم البيانات](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) والاتصال به عبر Jupyter. يمكنك بعدها استنساخ المستودع مباشرة على الجهاز، والبدء في التعلم. تدعم أجهزة NC-series الافتراضية وجود GPU.
|
||||
|
||||
> **ملاحظة**: بعض الاشتراكات، بما في ذلك Azure للطلاب، لا توفر دعم GPU بشكل افتراضي. قد تحتاج إلى طلب المزيد من أنوية GPU عبر طلب دعم فني.
|
||||
> **ملاحظة**: بعض الاشتراكات، بما في ذلك Azure for Students، لا توفر دعم GPU بشكل افتراضي. قد تحتاج إلى طلب أنوية GPU إضافية عن طريق طلب الدعم الفني.
|
||||
|
||||
* إنشاء [مساحة عمل Azure Machine Learning](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) ثم استخدام ميزة الدفتر هناك. يوضح [هذا الفيديو](https://azure-for-academics.github.io/quickstart/azureml-papers/) كيفية استنساخ مستودع في دفاتر Azure ML والبدء باستخدامه.
|
||||
* إنشاء [مساحة عمل Azure Machine Learning](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) ثم استخدام ميزة الدفتر هناك. يُظهر [هذا الفيديو](https://azure-for-academics.github.io/quickstart/azureml-papers/) كيفية استنساخ مستودع إلى دفتر Azure ML والبدء في استخدامه.
|
||||
|
||||
يمكنك أيضًا استخدام Google Colab، الذي يأتي مع دعم GPU مجاني محدود، ورفع دفاتر Jupyter هناك لتنفيذها واحدة تلو الأخرى.
|
||||
يمكنك أيضًا استخدام Google Colab، الذي يأتي مع دعم GPU مجاني، ورفع دفاتر Jupyter هناك لتنفيذها واحدًا تلو الآخر.
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**تنويه**:
|
||||
تمت ترجمة هذا المستند باستخدام خدمة الترجمة الآلية [Co-op Translator](https://github.com/Azure/co-op-translator). على الرغم من أننا نسعى لضمان الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو عدم دقة. يجب اعتبار المستند الأصلي بلغته الأصلية المصدر الرسمي والمعتمد. للمعلومات الحيوية، يُنصح بالاستعانة بالترجمة البشرية الاحترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسير خاطئ ينشأ عن استخدام هذه الترجمة.
|
||||
تمت ترجمة هذا المستند باستخدام خدمة الترجمة بالذكاء الاصطناعي [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى للدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو عدم دقة. يجب اعتبار المستند الأصلي بلغته الأصلية المصدر الرسمي والمعتمد. للمعلومات الهامة، يُنصح بالاستعانة بترجمة بشرية محترفة. نحن غير مسؤولين عن أي سوء فهم أو تفسير ناتج عن استخدام هذه الترجمة.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -6,9 +6,9 @@
|
|||
"source": [
|
||||
"# النماذج المدربة مسبقًا والتعلم بالنقل\n",
|
||||
"\n",
|
||||
"يمكن أن يستغرق تدريب الشبكات العصبية الالتفافية (CNNs) وقتًا طويلًا، ويتطلب كمية كبيرة من البيانات لهذه المهمة. ومع ذلك، يتم قضاء معظم الوقت في تعلم أفضل المرشحات منخفضة المستوى التي تستخدمها الشبكة لاستخراج الأنماط من الصور. يبرز سؤال طبيعي - هل يمكننا استخدام شبكة عصبية تم تدريبها على مجموعة بيانات معينة وتكييفها لتصنيف صور مختلفة دون الحاجة إلى عملية تدريب كاملة؟\n",
|
||||
"قد يستغرق تدريب الشبكات العصبية التلافيفية وقتًا طويلاً، ويتطلب ذلك كمية كبيرة من البيانات. ومع ذلك، يُقضى الكثير من الوقت في تعلم أفضل المرشحات منخفضة المستوى التي يستخدمها الشبكة لاستخلاص الأنماط من الصور. هنا يطرح سؤال طبيعي - هل يمكننا استخدام شبكة عصبية مدربة على مجموعة بيانات واحدة وتكييفها لتصنيف صور مختلفة دون عملية تدريب كاملة؟\n",
|
||||
"\n",
|
||||
"يُطلق على هذا النهج اسم **التعلم بالنقل**، لأنه يتم نقل بعض المعرفة من نموذج شبكة عصبية إلى آخر. في التعلم بالنقل، نبدأ عادةً بنموذج مدرب مسبقًا، والذي تم تدريبه على مجموعة بيانات صور كبيرة، مثل **ImageNet**. هذه النماذج تكون قادرة بالفعل على استخراج ميزات مختلفة من الصور العامة بشكل جيد، وفي كثير من الحالات، يمكن أن يؤدي بناء مصنف فوق هذه الميزات المستخرجة إلى تحقيق نتائج جيدة.\n"
|
||||
"يُطلق على هذا الأسلوب اسم **التعلم بالنقل**، لأننا ننقل بعض المعرفة من نموذج شبكة عصبية إلى آخر. في التعلم بالنقل، نبدأ عادة بنموذج مدرب مسبقًا، تم تدريبه على مجموعة بيانات صور كبيرة مثل **ImageNet**. تلك النماذج قادرة بالفعل على القيام بعمل جيد في استخراج الميزات المختلفة من الصور العامة، وفي كثير من الحالات، يمكن فقط بناء مصنف فوق تلك الميزات المستخرجة للحصول على نتيجة جيدة.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -31,9 +31,9 @@
|
|||
"source": [
|
||||
"## مجموعة بيانات القطط مقابل الكلاب\n",
|
||||
"\n",
|
||||
"في هذه الوحدة، سنحل مشكلة حقيقية تتعلق بتصنيف صور القطط والكلاب. لهذا السبب، سنستخدم [مجموعة بيانات Kaggle Cats vs. Dogs](https://www.kaggle.com/c/dogs-vs-cats)، والتي يمكن تنزيلها أيضًا [من مايكروسوفت](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n",
|
||||
"في هذه الوحدة، سنقوم بحل مشكلة حقيقية تتمثل في تصنيف صور القطط والكلاب. لهذا السبب، سنستخدم [مجموعة بيانات القطط مقابل الكلاب من كاجل](https://www.kaggle.com/c/dogs-vs-cats)، والتي يمكن تنزيلها أيضًا [من مايكروسوفت](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n",
|
||||
"\n",
|
||||
"لنقم بتنزيل هذه المجموعة من البيانات واستخراجها في دليل `data` (قد تستغرق هذه العملية بعض الوقت!):\n"
|
||||
"لنقم بتحميل هذه المجموعة واستخراجها في مجلد `data` (قد تستغرق هذه العملية بعض الوقت!):\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -64,7 +64,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"للأسف، هناك بعض ملفات الصور التالفة في مجموعة البيانات. نحتاج إلى تنظيف سريع للتحقق من الملفات التالفة. لكي لا نربك هذا الدليل، قمنا بنقل الكود للتحقق من مجموعة البيانات إلى وحدة.\n"
|
||||
"للأسف، هناك بعض ملفات الصور التالفة في مجموعة البيانات. نحتاج إلى إجراء تنظيف سريع للتحقق من الملفات التالفة. لكي لا نعبث بهذا الدرس، نقلنا الكود الخاص بالتحقق من مجموعة البيانات إلى وحدة. \n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -335,11 +335,11 @@
|
|||
"source": [
|
||||
"## تحميل مجموعة البيانات\n",
|
||||
"\n",
|
||||
"في الأمثلة السابقة، كنا نقوم بتحميل مجموعات البيانات المدمجة في Keras. الآن نحن على وشك التعامل مع مجموعة بيانات خاصة بنا، والتي نحتاج إلى تحميلها من دليل يحتوي على الصور.\n",
|
||||
"في الأمثلة السابقة، كنا نقوم بتحميل مجموعات بيانات مدمجة في Keras. الآن نحن على وشك التعامل مع مجموعة البيانات الخاصة بنا، والتي نحتاج إلى تحميلها من دليل يحتوي على صور.\n",
|
||||
"\n",
|
||||
"في الحياة الواقعية، يمكن أن تكون أحجام مجموعات بيانات الصور كبيرة جدًا، ولا يمكن الاعتماد على أن جميع البيانات ستتناسب مع الذاكرة. لذلك، غالبًا ما يتم تمثيل مجموعات البيانات كـ **مولدات** يمكنها إرجاع البيانات على دفعات صغيرة مناسبة للتدريب.\n",
|
||||
"في الحياة الواقعية، يمكن أن يكون حجم مجموعات بيانات الصور كبيرًا جدًا، ولا يمكن الاعتماد على إمكانية تحميل جميع البيانات في الذاكرة دفعة واحدة. لذلك، تُمثَّل مجموعات البيانات غالبًا على شكل **مولدات** يمكنها إرجاع البيانات على دفعات صغيرة مناسبة للتدريب.\n",
|
||||
"\n",
|
||||
"للتعامل مع تصنيف الصور، يتضمن Keras وظيفة خاصة تسمى `image_dataset_from_directory`، والتي يمكنها تحميل الصور من أدلة فرعية تمثل الفئات المختلفة. هذه الوظيفة تهتم أيضًا بتغيير حجم الصور، ويمكنها كذلك تقسيم مجموعة البيانات إلى مجموعات تدريب واختبار:\n"
|
||||
"للتعامل مع تصنيف الصور، يتضمن Keras دالة خاصة `image_dataset_from_directory`، التي يمكنها تحميل الصور من الأدلة الفرعية التي تمثل الفئات المختلفة. هذه الدالة تهتم أيضًا بتحجيم الصور، ويمكنها أيضًا تقسيم مجموعة البيانات إلى مجموعات تدريب واختبار:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -383,9 +383,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"من المهم تعيين نفس قيمة `seed` لكلتا الاستدعاءين، لأن ذلك يؤثر على تقسيم الصور بين مجموعة التدريب ومجموعة الاختبار.\n",
|
||||
"من المهم تعيين نفس قيمة الـ`seed` لكلتا النداءين، لأنها تؤثر على تقسيم الصور بين مجموعة التدريب ومجموعة الاختبار.\n",
|
||||
"\n",
|
||||
"يقوم مجموعة البيانات تلقائيًا بالتعرف على أسماء الفئات من المجلدات، ويمكنك الوصول إليها إذا لزم الأمر عن طريق الاستدعاء:\n"
|
||||
"يلتقط مجموعة البيانات أسماء الفئات تلقائيًا من المجلدات، ويمكنك الوصول إليها إذا لزم الأمر عن طريق استدعاء:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -412,7 +412,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"يمكن تمرير مجموعات البيانات التي حصلنا عليها مباشرة إلى وظيفة `fit` لتدريب النموذج. تحتوي على الصور والتسميات المقابلة، والتي يمكن تكرارها باستخدام البناء التالي:\n"
|
||||
"يمكن تمرير مجموعات البيانات التي حصلنا عليها مباشرة إلى دالة `fit` لتدريب النموذج. تحتوي على كل من الصور والتسميات المقابلة، والتي يمكن التكرار عليها باستخدام البناء التالي:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -453,16 +453,16 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"> **ملاحظة**: يتم تمثيل جميع الصور في مجموعة البيانات كموترات ذات نقاط عائمة بنطاق 0-255. قبل تمريرها إلى الشبكة العصبية، نحتاج إلى تحويل تلك القيم إلى نطاق 0-1. عند رسم الصور، نحتاج إما إلى القيام بنفس الشيء، أو تحويل القيم إلى النوع `int` (كما نفعل في الكود أعلاه)، لإظهار لـ `matplotlib` أننا نريد رسم الصورة الأصلية غير المحولة.\n"
|
||||
"> **ملاحظة**: جميع الصور في مجموعة البيانات ممثلة كمتجهات نقاط عائمة ضمن النطاق 0-255. قبل تمريرها إلى الشبكة العصبية، نحتاج إلى تحويل تلك القيم إلى النطاق 0-1. عند رسم الصور، نحتاج إما إلى القيام بنفس الشيء، أو تحويل القيم إلى نوع `int` (كما نفعل في الكود أعلاه)، من أجل إظهار لـ `matplotlib` أننا نريد رسم الصورة الأصلية غير المحولة.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## النماذج المدربة مسبقًا\n",
|
||||
"## النماذج المُدربة مسبقًا\n",
|
||||
"\n",
|
||||
"بالنسبة للعديد من مهام تصنيف الصور، يمكن العثور على نماذج شبكات عصبية مدربة مسبقًا. العديد من هذه النماذج متوفرة داخل مساحة الأسماء `keras.applications`، ويمكن العثور على المزيد من النماذج على الإنترنت. لنرى كيف يمكن تحميل واستخدام نموذج VGG-16 الأبسط:\n"
|
||||
"بالنسبة للعديد من مهام تصنيف الصور، يمكن العثور على نماذج شبكات عصبية مدربة مسبقًا. العديد من هذه النماذج متاحة داخل مساحة الأسماء `keras.applications`، ويمكن العثور على المزيد من النماذج على الإنترنت. لنرَ كيف يمكن تحميل أبسط نموذج VGG-16 واستخدامه:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -497,7 +497,17 @@
|
|||
}
|
||||
],
|
||||
"source": [
|
||||
"vgg = keras.applications.VGG16()\n",
|
||||
"# SHA-256 of VGG16 weights (with top)\n",
|
||||
"VGG16_WEIGHTS_SHA256 = '64373286793e3c8b2b4e3219cbf3544bce2f55ab4682710a29f5e7af8f5e4f61'\n",
|
||||
"\n",
|
||||
"_weights_path = keras.utils.get_file(\n",
|
||||
" 'vgg16_weights_tf_dim_ordering_tf_kernels.h5',\n",
|
||||
" 'https://storage.googleapis.com/tensorflow/keras-applications/vgg16/vgg16_weights_tf_dim_ordering_tf_kernels.h5',\n",
|
||||
" file_hash=VGG16_WEIGHTS_SHA256,\n",
|
||||
" hash_algorithm='sha256',\n",
|
||||
")\n",
|
||||
"\n",
|
||||
"vgg = keras.applications.VGG16(weights=_weights_path)\n",
|
||||
"inp = keras.applications.vgg16.preprocess_input(x_sample[:1])\n",
|
||||
"\n",
|
||||
"res = vgg(inp)\n",
|
||||
|
|
@ -510,10 +520,10 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"هناك بعض الأمور المهمة هنا:\n",
|
||||
"* قبل تمرير أي مدخل إلى أي شبكة مدربة مسبقًا، يجب أن يتم معالجته مسبقًا بطريقة معينة. يتم ذلك عن طريق استدعاء دالة `preprocess_input` المناسبة، والتي تستقبل دفعة من الصور وتعيد شكلها المعالج. في حالة VGG-16، يتم تطبيع الصور ويتم طرح قيمة متوسطة محددة مسبقًا لكل قناة. السبب في ذلك هو أن VGG-16 تم تدريبه في الأصل باستخدام هذه المعالجة المسبقة.\n",
|
||||
"* يتم تطبيق الشبكة العصبية على دفعة المدخلات، ونحصل كنتيجة على دفعة من مصفوفات تحتوي على 1000 عنصر، تمثل احتمالية كل فئة. يمكننا العثور على رقم الفئة الأكثر احتمالًا عن طريق استدعاء `argmax` على هذه المصفوفة.\n",
|
||||
"* النتيجة التي نحصل عليها هي [رقم فئة من `ImageNet`](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). لفهم هذه النتيجة، يمكننا أيضًا استخدام دالة `decode_predictions` التي تعيد أعلى n فئات مع أسمائها.\n"
|
||||
"هناك بعض الأشياء المهمة هنا:\n",
|
||||
"* قبل تمرير إدخال إلى أي شبكة مدربة مسبقًا يجب أن تتم معالجته مسبقًا بطريقة معينة. يتم ذلك عن طريق استدعاء دالة `preprocess_input` المقابلة، التي تستقبل دفعة من الصور، وتعيد صورتها بعد المعالجة. في حالة VGG-16، يتم تطبيع الصور، وطرح قيمة متوسطة محددة مسبقًا لكل قناة. ذلك لأن VGG-16 تم تدريبه أصلاً مع هذا المعالجة المسبقة.\n",
|
||||
"* يتم تطبيق الشبكة العصبية على دفعة الإدخال، ونحصل كنتيجة على دفعة من التنسورات ذات 1000 عنصر تبين احتمال كل فئة. يمكننا إيجاد رقم الفئة الأكثر احتمالًا عن طريق استدعاء `argmax` على هذا التنسور.\n",
|
||||
"* النتيجة المحصل عليها هي [رقم فئة من `ImageNet`](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). لجعل هذه النتيجة ذات معنى، يمكننا أيضًا استخدام دالة `decode_predictions`، التي تعيد أعلى n فئات مع أسمائها.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -597,9 +607,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## الحسابات باستخدام وحدة معالجة الرسومات (GPU)\n",
|
||||
"## حسابات وحدة معالجة الرسومات (GPU)\n",
|
||||
"\n",
|
||||
"الشبكات العصبية العميقة، مثل VGG-16 وغيرها من الهياكل الحديثة، تتطلب قوة حسابية كبيرة لتشغيلها. من المنطقي استخدام تسريع وحدة معالجة الرسومات (GPU) إذا كان متاحًا. لحسن الحظ، يقوم Keras تلقائيًا بتسريع العمليات الحسابية على وحدة معالجة الرسومات إذا كانت متوفرة. يمكننا التحقق مما إذا كان Tensorflow قادرًا على استخدام وحدة معالجة الرسومات باستخدام الكود التالي:\n"
|
||||
"تتطلب الشبكات العصبية العميقة، مثل VGG-16 والهياكل الأحدث الأخرى، الكثير من قوة الحوسبة للتشغيل. من المنطقي استخدام تسريع وحدة معالجة الرسومات إذا كانت متاحة. لحسن الحظ، يقوم Keras تلقائيًا بتسريع العمليات الحسابية على وحدة معالجة الرسومات إذا كانت متوفرة. يمكننا التحقق مما إذا كان Tensorflow قادرًا على استخدام وحدة معالجة الرسومات باستخدام الكود التالي:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -626,9 +636,10 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n",
|
||||
"## استخراج ميزات VGG\n",
|
||||
"\n",
|
||||
"إذا أردنا استخدام VGG-16 لاستخراج الميزات من صورنا، فنحن بحاجة إلى النموذج بدون الطبقات النهائية للتصنيف. يمكننا إنشاء نموذج VGG-16 بدون الطبقات العليا باستخدام هذا الكود:\n"
|
||||
"إذا كنا نريد استخدام VGG-16 لاستخراج الميزات من صورنا، نحتاج إلى النموذج بدون طبقات التصنيف النهائية. يمكننا إنشاء نموذج VGG-16 بدون الطبقات العليا باستخدام هذا الكود:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -680,9 +691,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"أبعاد مصفوفة الميزات هي 7x7x512، ولكن من أجل تصورها كان علينا إعادة تشكيلها إلى شكل ثنائي الأبعاد.\n",
|
||||
"أبعاد موتر الميزات هو 7x7x512، ولكن من أجل تصوريه كان علينا إعادة تشكيله إلى شكل ثنائي الأبعاد.\n",
|
||||
"\n",
|
||||
"الآن دعونا نحاول معرفة ما إذا كان يمكن استخدام هذه الميزات لتصنيف الصور. سنقوم يدويًا بأخذ جزء من الصور (50 دفعة صغيرة، في حالتنا)، وحساب متجهات الميزات مسبقًا. يمكننا استخدام واجهة برمجة التطبيقات **dataset** الخاصة بـ Tensorflow للقيام بذلك. وظيفة `map` تأخذ مجموعة بيانات وتطبق دالة لامبدا معينة لتحويلها. نستخدم هذه الآلية لإنشاء مجموعات بيانات جديدة، `ds_features_train` و `ds_features_test`، التي تحتوي على الميزات المستخرجة بواسطة VGG بدلاً من الصور الأصلية.\n"
|
||||
"لنحاول الآن أن نرى إذا كان يمكن استخدام هذه الميزات لتصنيف الصور. دعونا نأخذ يدويًا جزءًا من الصور (50 مجموعة صغيرة، في حالتنا)، ونحسب مسبقًا متجهات الميزات الخاصة بها. يمكننا استخدام واجهة برمجة تطبيقات **dataset** الخاصة بـ Tensorflow للقيام بذلك. تقوم دالة `map` بأخذ مجموعة بيانات وتطبيق دالة لامبدا معينة لتحويلها. نستخدم هذه الآلية لبناء مجموعات بيانات جديدة، `ds_features_train` و`ds_features_test`، التي تحتوي على ميزات مستخرجة من VGG بدلاً من الصور الأصلية.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -712,9 +723,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"استخدمنا البناء `.take(50)` لتقليل حجم مجموعة البيانات، لتسريع العرض التوضيحي. بالطبع يمكنك إجراء هذا التجربة على مجموعة البيانات الكاملة.\n",
|
||||
"استخدمنا البناء `.take(50)` لتحديد حجم مجموعة البيانات، لتسريع العرض التوضيحي الخاص بنا. يمكنك بالطبع إجراء هذه التجربة على مجموعة البيانات الكاملة.\n",
|
||||
"\n",
|
||||
"الآن بعد أن أصبح لدينا مجموعة بيانات مع الميزات المستخرجة، يمكننا تدريب مصنف بسيط كثيف للتمييز بين القطط والكلاب. ستأخذ هذه الشبكة متجه ميزات بالشكل (7,7,512)، وتنتج مخرجًا واحدًا يشير إما إلى كلب أو قطة. نظرًا لأنها تصنيف ثنائي، نستخدم دالة التفعيل `sigmoid` وخسارة `binary_crossentropy`.\n"
|
||||
"الآن بعد أن أصبح لدينا مجموعة بيانات مع الميزات المستخرجة، يمكننا تدريب مصنف كثيف بسيط للتمييز بين القطط والكلاب. سيأخذ هذا الشبكة متجه الميزات بأبعاد (7,7,512)، ويُنتج مخرجًا واحدًا يتوافق إما مع كلب أو قطة. وبما أنها تصنيف ثنائي، نستخدم دالة التنشيط `sigmoid` وخسارة `binary_crossentropy`.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -743,13 +754,13 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"النتيجة رائعة، يمكننا التمييز بين القطط والكلاب بنسبة تصل إلى 95%! ومع ذلك، قمنا باختبار هذا النهج فقط على مجموعة فرعية من جميع الصور، لأن استخراج الميزات يدويًا يبدو أنه يستغرق وقتًا طويلاً.\n",
|
||||
"النتيجة رائعة، يمكننا التمييز بين قطة وكلب بنسبة تقارب 95٪! ومع ذلك، لقد اختبرنا هذه الطريقة فقط على مجموعة فرعية من جميع الصور، لأن استخراج الميزات يدويًا يبدو أنه يستغرق وقتًا طويلاً.\n",
|
||||
"\n",
|
||||
"## التعلم بالنقل باستخدام شبكة VGG واحدة\n",
|
||||
"\n",
|
||||
"يمكننا أيضًا تجنب عملية استخراج الميزات يدويًا من خلال استخدام شبكة VGG-16 الأصلية بالكامل أثناء التدريب، عن طريق إضافة مستخرج ميزات إلى شبكتنا كطبقة أولى.\n",
|
||||
"يمكننا أيضًا تجنب حساب الميزات يدويًا مسبقًا باستخدام شبكة VGG-16 الأصلية ككل أثناء التدريب، عن طريق إضافة مستخرج الميزات إلى شبكتنا كطبقة أولى.\n",
|
||||
"\n",
|
||||
"جمال بنية Keras يكمن في أن نموذج VGG-16 الذي قمنا بتعريفه أعلاه يمكن استخدامه أيضًا كطبقة في شبكة عصبية أخرى! كل ما علينا فعله هو بناء شبكة تحتوي على مصنف كثيف فوقها، ثم تدريب الشبكة بأكملها باستخدام الانتشار العكسي.\n"
|
||||
"جمال هندسة كيراس هو أن نموذج VGG-16 الذي قمنا بتعريفه أعلاه يمكن استخدامه أيضًا كطبقة في شبكة عصبية أخرى! فقط نحتاج إلى بناء شبكة مع مصنف كثيف فوقها، ثم تدريب الشبكة بأكملها باستخدام الانتشار العكسي.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -793,13 +804,13 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"هذا النموذج يشبه شبكة تصنيف شاملة، حيث يأخذ صورة ويعيد الفئة. ومع ذلك، الشيء الصعب هو أننا نريد أن يعمل VGG16 كمستخرج ميزات، وليس أن يتم إعادة تدريبه. لذلك، نحتاج إلى **تجميد أوزان مستخرج الميزات التلافيفي**. يمكننا الوصول إلى الطبقة الأولى من الشبكة عن طريق استدعاء `model.layers[0]`، وكل ما علينا فعله هو ضبط خاصية `trainable` إلى `False`.\n",
|
||||
"يبدو هذا النموذج كشبكة تصنيف شاملة، تأخذ صورة وتُرجع الفئة. ومع ذلك، الأمر المثير هو أننا نريد أن يعمل VGG16 كاستخلاص للميزات، وليس أن يتم إعادة تدريبه. لذلك، نحتاج إلى **تجميد أوزان مستخرج الميزات الالتفافي**. يمكننا الوصول إلى الطبقة الأولى من الشبكة عن طريق استدعاء `model.layers[0]`، وكل ما نحتاجه هو تعيين خاصية `trainable` إلى `False`.\n",
|
||||
"\n",
|
||||
"> **ملاحظة**: تجميد أوزان مستخرج الميزات ضروري، لأنه بخلاف ذلك يمكن أن تقوم طبقة التصنيف غير المدربة بتدمير الأوزان الأصلية المدربة مسبقًا لمستخرج الميزات التلافيفي.\n",
|
||||
"> **ملاحظة**: تجميد أوزان مستخرج الميزات ضروري، لأنه بخلاف ذلك فإن طبقة المصنف غير المدربة قد تدمر الأوزان المدربة مسبقاً لمستخرج التلافيف الأصلي.\n",
|
||||
"\n",
|
||||
"يمكنك ملاحظة أنه بينما العدد الإجمالي للمعاملات في شبكتنا حوالي 15 مليون، نحن نقوم بتدريب 25 ألف معامل فقط. جميع المعاملات الأخرى لمرشحات التلافيفي العليا مدربة مسبقًا. هذا أمر جيد، لأننا قادرون على تحسين عدد أقل من المعاملات باستخدام عدد أقل من الأمثلة.\n",
|
||||
"يمكنك أن تلاحظ بينما أن إجمالي عدد المعاملات في شبكتنا حوالي 15 مليون، نحن ندرب فقط 25 ألف معلمة. جميع المعلمات الأخرى لمرشحات التلافيف على المستوى الأعلى مدربة مسبقًا. وهذا جيد، لأننا قادرون على ضبط عدد أقل من المعلمات بعدد أقل من الأمثلة.\n",
|
||||
"\n",
|
||||
"سنقوم الآن بتدريب شبكتنا ونرى مدى جودة النتائج التي يمكننا تحقيقها. توقع وقت تشغيل طويل نسبيًا، ولا تقلق إذا بدا التنفيذ متوقفًا لبعض الوقت.\n"
|
||||
"سنقوم الآن بتدريب شبكتنا ونرى إلى أي مدى يمكننا أن نصل. توقع وقت تشغيل طويل نوعًا ما، ولا تقلق إذا بدا التنفيذ مجمداً لفترة من الوقت.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -824,11 +835,11 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"يبدو أننا حصلنا على مصنف دقيق إلى حد ما للتمييز بين القطط والكلاب!\n",
|
||||
"يبدو أننا حصلنا على مصنف للقطط مقابل الكلاب بدقة معقولة! \n",
|
||||
"\n",
|
||||
"## حفظ وتحميل النموذج\n",
|
||||
"\n",
|
||||
"بعد أن نقوم بتدريب النموذج، يمكننا حفظ هيكل النموذج والأوزان المدربة في ملف لاستخدامه في المستقبل:\n"
|
||||
"بمجرد أن نقوم بتدريب النموذج، يمكننا حفظ تركيب النموذج والأوزان المدربة في ملف لاستخدامه في المستقبل:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -852,7 +863,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"يمكننا بعد ذلك تحميل النموذج من الملف في أي وقت. قد تجد ذلك مفيدًا في حالة أن التجربة التالية تدمر النموذج - لن تضطر إلى البدء من الصفر.\n"
|
||||
"يمكننا بعد ذلك تحميل النموذج من الملف في أي وقت. قد تجده مفيدًا في حال دمر التجربة التالية النموذج - فلن تضطر إلى البدء من الصفر.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -868,15 +879,15 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## تحسين التعلم بالنقل\n",
|
||||
"## الضبط الدقيق لتعلم النقل\n",
|
||||
"\n",
|
||||
"في القسم السابق، قمنا بتدريب الطبقة النهائية للمصنف لتصنيف الصور في مجموعة البيانات الخاصة بنا. ومع ذلك، لم نقم بإعادة تدريب مستخرج الميزات، واعتمد نموذجنا على الميزات التي تعلمها من بيانات ImageNet. إذا كانت الكائنات الخاصة بك تختلف بصريًا عن الصور العادية في ImageNet، فقد لا تكون هذه المجموعة من الميزات هي الأفضل. لذلك، من المنطقي البدء في تدريب الطبقات الالتفافية أيضًا.\n",
|
||||
"في القسم السابق، قمنا بتدريب طبقة المصنف النهائية لتصنيف الصور في مجموعة البيانات الخاصة بنا. ومع ذلك، لم نعد ندرب مستخرج الميزات، واعتمد نموذجنا على الميزات التي تعلمها النموذج على بيانات ImageNet. إذا كانت الأشياء التي لديك تختلف بصريًا عن صور ImageNet العادية، فقد لا يعمل هذا المزيج من الميزات بأفضل شكل. لذا من المنطقي البدء في تدريب طبقات الالتفاف أيضًا.\n",
|
||||
"\n",
|
||||
"للقيام بذلك، يمكننا إلغاء تجميد معلمات مرشحات الالتفاف التي قمنا بتجميدها سابقًا.\n",
|
||||
"للقيام بذلك، يمكننا إلغاء تجميد معلمات مرشح الالتفاف التي قمنا بتجميدها سابقًا.\n",
|
||||
"\n",
|
||||
"> **ملاحظة:** من المهم أن تقوم بتجميد المعلمات أولاً وتنفيذ عدة دورات تدريبية لتثبيت الأوزان في طبقة التصنيف. إذا بدأت مباشرة في تدريب الشبكة من البداية إلى النهاية مع معلمات غير مجمدة، فمن المحتمل أن تؤدي الأخطاء الكبيرة إلى تدمير الأوزان المدربة مسبقًا في الطبقات الالتفافية.\n",
|
||||
"> **ملاحظة:** من المهم أن تقوم بتجميد المعلمات أولاً وأداء عدة عصور من التدريب من أجل تحقيق استقرار الأوزان في طبقة التصنيف. إذا بدأت على الفور في تدريب الشبكة من النهاية إلى النهاية مع المعلمات غير المجمدة، فمن المحتمل أن تتسبب الأخطاء الكبيرة في تدمير الأوزان المدربة مسبقًا في طبقات الالتفاف.\n",
|
||||
"\n",
|
||||
"نموذج VGG-16 الالتفافي الخاص بنا موجود داخل الطبقة الأولى، وهو يتكون من العديد من الطبقات بحد ذاته. يمكننا إلقاء نظرة على هيكله:\n"
|
||||
"نموذج VGG-16 الالتفافي الخاص بنا موجود داخل الطبقة الأولى، ويتألف من العديد من الطبقات بنفسه. يمكننا إلقاء نظرة على هيكله:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -945,7 +956,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"يمكننا إلغاء تجميد جميع طبقات القاعدة الالتفافية:\n"
|
||||
"يمكننا إلغاء تجميد كل طبقات قاعدة الالتفاف:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -961,7 +972,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"ومع ذلك، فإن فك تجميد جميعها دفعة واحدة ليس فكرة جيدة. يمكننا أولاً فك تجميد بعض الطبقات النهائية فقط من الالتفافات، لأنها تحتوي على أنماط عالية المستوى ذات صلة بصورنا. على سبيل المثال، يمكننا في البداية تجميد جميع الطبقات باستثناء الأربع الأخيرة:\n"
|
||||
"ومع ذلك، فإن إلغاء تجميدها كلها دفعة واحدة ليس أفضل فكرة. يمكننا أولاً إلغاء تجميد بعض الطبقات النهائية فقط من الالتفافات، لأنها تحتوي على أنماط عالية المستوى ذات صلة بصورنا. على سبيل المثال، للبدء، يمكننا تجميد جميع الطبقات ما عدا الأربع الأخيرة:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1000,11 +1011,11 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"لاحظ أن عدد المعاملات القابلة للتدريب قد زاد بشكل كبير، ولكنه لا يزال حوالي 50% من إجمالي المعاملات.\n",
|
||||
"لاحظ أن عدد المعاملات القابلة للتدريب زاد بشكل كبير، لكنه لا يزال حوالي 50% من جميع المعاملات.\n",
|
||||
"\n",
|
||||
"بعد فك التجميد، يمكننا إجراء بضع دورات تدريبية إضافية (في مثالنا، سنقوم بدورة واحدة فقط). يمكنك أيضًا اختيار معدل تعلم أقل لتقليل التأثير على الأوزان المدربة مسبقًا. ومع ذلك، حتى مع معدل تعلم منخفض، يمكنك توقع انخفاض الدقة في بداية التدريب، إلى أن تصل في النهاية إلى مستوى أعلى قليلاً مقارنة بحالة الأوزان الثابتة.\n",
|
||||
"بعد فك التجميد، يمكننا إجراء بعض الحقبات التدريبية الإضافية (في مثالنا، سنقوم بجولة واحدة فقط). يمكنك أيضًا اختيار معدل تعلم أقل، لتقليل التأثير على الأوزان المدربة مسبقًا. ومع ذلك، حتى مع معدل تعلم منخفض، يمكنك توقع انخفاض الدقة في بداية التدريب، حتى تصل في النهاية إلى مستوى أعلى قليلاً مقارنة بحالة الأوزان الثابتة.\n",
|
||||
"\n",
|
||||
"> **ملاحظة:** هذا التدريب يحدث بشكل أبطأ بكثير، لأننا نحتاج إلى نشر التدرجات عبر العديد من طبقات الشبكة!\n"
|
||||
"> **ملاحظة:** يحدث هذا التدريب أبطأ بكثير، لأننا بحاجة إلى نشر التدرجات عبر العديد من طبقات الشبكة!\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1028,18 +1039,18 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"من المحتمل أن نحقق دقة أعلى في التدريب، لأننا نستخدم شبكة أكثر قوة تحتوي على المزيد من المعاملات، ولكن دقة التحقق لن ترتفع بنفس القدر.\n",
|
||||
"من المرجح أن نحقق دقة تدريب أعلى، لأننا نستخدم شبكة أكثر قوة تحتوي على مزيد من المعلمات، ولكن دقة التحقق لن تزيد بنفس القدر.\n",
|
||||
"\n",
|
||||
"يمكنك فك تجميد المزيد من طبقات الشبكة والتدريب أكثر، لترى ما إذا كنت قادرًا على تحقيق دقة أعلى!\n"
|
||||
"لا تتردد في إلغاء تجميد المزيد من طبقات الشبكة والتدريب أكثر، لترى ما إذا كنت قادرًا على تحقيق دقة أعلى!\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## نماذج رؤية حاسوبية أخرى\n",
|
||||
"## نماذج أخرى لرؤية الكمبيوتر\n",
|
||||
"\n",
|
||||
"VGG-16 هي واحدة من أبسط معماريات الرؤية الحاسوبية. توفر Keras العديد من الشبكات المدربة مسبقًا. من بين الأكثر استخدامًا منها هي معماريات **ResNet** التي طورتها Microsoft، و**Inception** من Google. على سبيل المثال، دعونا نستكشف بنية نموذج ResNet-50 الأبسط (ResNet هي عائلة من النماذج ذات أعماق مختلفة، يمكنك تجربة ResNet-152 إذا كنت تريد رؤية نموذج عميق جدًا):\n"
|
||||
"يعتبر VGG-16 واحدًا من أبسط هياكل رؤية الكمبيوتر. يوفر Keras العديد من الشبكات المدربة مسبقًا. وأكثرها استخدامًا من بينها هي معماريات **ResNet** التي طورتها مايكروسوفت، و**Inception** من جوجل. على سبيل المثال، دعونا نستكشف هيكل أبسط نموذج ResNet-50 (ResNet هي عائلة نماذج بأعماق مختلفة، يمكنك تجربة ResNet-152 إذا أردت رؤية شكل نموذج عميق حقًا):\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1441,29 +1452,29 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"كما ترى، يحتوي النموذج على نفس المكونات المألوفة: طبقات الالتفاف، طبقات التجميع، والمصنف النهائي الكثيف. يمكننا استخدام هذا النموذج بنفس الطريقة التي كنا نستخدم بها VGG-16 للتعلم بالنقل. يمكنك تجربة الكود أعلاه باستخدام نماذج ResNet مختلفة كنموذج أساسي، وملاحظة كيف تتغير الدقة.\n",
|
||||
"كما ترى، يحتوي النموذج على نفس الكتل البنائية المألوفة: طبقات الالتفاف، طبقات التجميع والمصنف النهائي الكثيف. يمكننا استخدام هذا النموذج بنفس الطريقة بالضبط التي استخدمنا بها VGG-16 للتعلم بالنقل. يمكنك تجربة تعديل الكود أعلاه، باستخدام نماذج ResNet مختلفة كنموذج أساسي، ومراقبة كيفية تغير الدقة.\n",
|
||||
"\n",
|
||||
"## التطبيع الدفعي\n",
|
||||
"\n",
|
||||
"يحتوي هذا الشبكة على نوع آخر من الطبقات: **التطبيع الدفعي**. فكرة التطبيع الدفعي هي جلب القيم التي تمر عبر الشبكة العصبية إلى النطاق الصحيح. عادةً ما تعمل الشبكات العصبية بشكل أفضل عندما تكون جميع القيم في النطاق [-1,1] أو [0,1]، ولهذا السبب نقوم بتوسيع/تطبيع بيانات الإدخال وفقًا لذلك. ومع ذلك، أثناء تدريب شبكة عميقة، قد يحدث أن تخرج القيم بشكل كبير عن هذا النطاق، مما يجعل التدريب صعبًا. تقوم طبقة التطبيع الدفعي بحساب المتوسط والانحراف المعياري لجميع قيم الدفعة الحالية، وتستخدمها لتطبيع الإشارة قبل تمريرها عبر طبقة الشبكة العصبية. هذا يحسن بشكل كبير من استقرار الشبكات العميقة.\n"
|
||||
"يحتوي هذا الشبك على نوع آخر من الطبقات: **التطبيع الدفعي**. فكرة التطبيع الدفعي هي جلب القيم التي تتدفق عبر الشبكة العصبية إلى نطاق صحيح. عادةً ما تعمل الشبكات العصبية بأفضل شكل عندما تكون كل القيم في النطاق [-1,1] أو [0,1]، وهذا هو السبب في أننا نقوم بمقياس/تطبيع بيانات الإدخال لدينا وفقًا لذلك. ومع ذلك، أثناء تدريب شبكة عميقة، قد يحدث أن تخرج القيم بشكل كبير عن هذا النطاق، مما يجعل التدريب إشكاليًا. تقوم طبقة التطبيع الدفعي بحساب المتوسط والانحراف المعياري لكل القيم في الدفعة المصغرة الحالية، وتستخدمها لتطبيع الإشارة قبل تمريرها عبر طبقة الشبكة العصبية. هذا يحسن بشكل كبير من استقرار الشبكات العميقة.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## خلاصة\n",
|
||||
"## الخلاصة\n",
|
||||
"\n",
|
||||
"باستخدام التعلم بالنقل، تمكنا بسرعة من إنشاء مصنف لمهمة تصنيف الكائنات المخصصة الخاصة بنا، وحققنا دقة عالية. ومع ذلك، لم يكن هذا المثال عادلاً تمامًا، لأن شبكة VGG-16 الأصلية تم تدريبها مسبقًا للتعرف على القطط والكلاب، وبالتالي كنا نعيد استخدام معظم الأنماط الموجودة بالفعل في الشبكة. يمكنك توقع دقة أقل عند التعامل مع كائنات أكثر تخصصًا وغير مألوفة، مثل تفاصيل خطوط الإنتاج في مصنع، أو أنواع مختلفة من أوراق الأشجار.\n",
|
||||
"باستخدام التعلم النقلي، استطعنا بسرعة إعداد مصنف لمهمة تصنيف الكائنات المخصصة لدينا، وتحقيق دقة عالية. ومع ذلك، لم يكن هذا المثال عادلاً تمامًا، لأن شبكة VGG-16 الأصلية قد تم تدريبها مسبقًا للتعرف على القطط والكلاب، وبالتالي كنا نعيد استخدام معظم الأنماط الموجودة بالفعل في الشبكة. يمكنك توقع دقة أقل على الأشياء الخاصة بالمجالات الغريبة، مثل التفاصيل على خط الإنتاج في مصنع، أو أوراق أشجار مختلفة.\n",
|
||||
"\n",
|
||||
"يمكنك ملاحظة أن المهام الأكثر تعقيدًا التي نقوم بحلها الآن تتطلب قدرة حوسبة أعلى، ولا يمكن حلها بسهولة باستخدام وحدة المعالجة المركزية (CPU). في الوحدة التالية، سنحاول استخدام تنفيذ أخف وزنًا لتدريب نفس النموذج باستخدام موارد حوسبة أقل، مما يؤدي إلى انخفاض طفيف فقط في الدقة.\n"
|
||||
"يمكنك أن ترى أن المهام الأكثر تعقيدًا التي نحلها الآن تتطلب قوة حوسبة أعلى، ولا يمكن حلها بسهولة على وحدة المعالجة المركزية. في الوحدة التالية، سنحاول استخدام تنفيذ أخف وزنًا لتدريب نفس النموذج باستخدام موارد حوسبة أقل، مما يؤدي إلى دقة أقل قليلاً فقط.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**إخلاء المسؤولية**: \nتم ترجمة هذا المستند باستخدام خدمة الترجمة بالذكاء الاصطناعي [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو عدم دقة. يجب اعتبار المستند الأصلي بلغته الأصلية المصدر الرسمي. للحصول على معلومات حاسمة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة تنشأ عن استخدام هذه الترجمة.\n"
|
||||
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**تنويه**:\nتمت ترجمة هذا المستند باستخدام خدمة الترجمة بالذكاء الاصطناعي [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى للدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو عدم دقة. يجب اعتبار المستند الأصلي بلغته الأصلية المصدر الرسمي والمعتمد. للمعلومات الهامة، يُنصح بالاستعانة بترجمة بشرية محترفة. نحن غير مسؤولين عن أي سوء فهم أو تفسير ناتج عن استخدام هذه الترجمة.\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
|
|
@ -1484,12 +1495,6 @@
|
|||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.8.10"
|
||||
},
|
||||
"coopTranslator": {
|
||||
"original_hash": "c189abc107848f96051085cc30945129",
|
||||
"translation_date": "2025-08-28T03:08:28+00:00",
|
||||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb",
|
||||
"language_code": "ar"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
|
|
|||
|
|
@ -1,51 +1,51 @@
|
|||
# معالجة اللغة الطبيعية
|
||||
|
||||

|
||||

|
||||
|
||||
في هذا القسم، سنركز على استخدام الشبكات العصبية لمعالجة المهام المتعلقة بـ **معالجة اللغة الطبيعية (NLP)**. هناك العديد من مشاكل معالجة اللغة الطبيعية التي نرغب في أن تتمكن الحواسيب من حلها:
|
||||
في هذا القسم، سنركز على استخدام الشبكات العصبية للتعامل مع المهام المتعلقة ب**معالجة اللغة الطبيعية (NLP)**. هناك العديد من مشكلات الـNLP التي نريد من الحواسيب أن تكون قادرة على حلها:
|
||||
|
||||
* **تصنيف النصوص** هو مشكلة تصنيف نموذجية تتعلق بتسلسلات النصوص. تشمل الأمثلة تصنيف رسائل البريد الإلكتروني كرسائل مزعجة أو غير مزعجة، أو تصنيف المقالات كرياضة، أعمال، سياسة، إلخ. أيضًا، عند تطوير روبوتات المحادثة، غالبًا ما نحتاج إلى فهم ما يريد المستخدم قوله - في هذه الحالة نتعامل مع **تصنيف النوايا**. غالبًا ما يتطلب تصنيف النوايا التعامل مع العديد من الفئات.
|
||||
* **تحليل المشاعر** هو مشكلة انحدار نموذجية، حيث نحتاج إلى إسناد رقم (مشاعر) يعبر عن مدى إيجابية/سلبية معنى الجملة. نسخة أكثر تقدمًا من تحليل المشاعر هي **تحليل المشاعر القائم على الجوانب** (ABSA)، حيث نُسند المشاعر ليس إلى الجملة بأكملها، بل إلى أجزاء مختلفة منها (الجوانب)، مثل: *في هذا المطعم، أعجبتني المأكولات، لكن الجو كان سيئًا للغاية*.
|
||||
* **التعرف على الكيانات المسماة** (NER) يشير إلى مشكلة استخراج كيانات معينة من النصوص. على سبيل المثال، قد نحتاج إلى فهم أن الكلمة *غدًا* في العبارة *أحتاج إلى السفر إلى باريس غدًا* تشير إلى تاريخ، و*باريس* هي موقع.
|
||||
* **استخراج الكلمات المفتاحية** يشبه NER، لكننا نحتاج إلى استخراج الكلمات المهمة لمعنى الجملة تلقائيًا، دون تدريب مسبق على أنواع الكيانات المحددة.
|
||||
* **تجميع النصوص** يمكن أن يكون مفيدًا عندما نريد تجميع الجمل المتشابهة معًا، على سبيل المثال، الطلبات المتشابهة في محادثات الدعم الفني.
|
||||
* **الإجابة على الأسئلة** تشير إلى قدرة النموذج على الإجابة على سؤال محدد. يتلقى النموذج مقطع نصي وسؤال كمدخلات، ويحتاج إلى تحديد مكان في النص يحتوي على الإجابة (أو، في بعض الأحيان، توليد نص الإجابة).
|
||||
* **توليد النصوص** هي قدرة النموذج على توليد نص جديد. يمكن اعتبارها مهمة تصنيف تتنبأ بالحرف/الكلمة التالية بناءً على *موجه نصي*. نماذج توليد النصوص المتقدمة، مثل GPT-3، قادرة على حل مهام معالجة اللغة الطبيعية الأخرى مثل التصنيف باستخدام تقنية تسمى [برمجة الموجهات](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) أو [هندسة الموجهات](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29).
|
||||
* **تلخيص النصوص** هي تقنية نريد فيها أن يقوم الحاسوب بـ "قراءة" نص طويل وتلخيصه في بضع جمل.
|
||||
* **الترجمة الآلية** يمكن اعتبارها مزيجًا من فهم النص بلغة واحدة، وتوليد النص بلغة أخرى.
|
||||
* **تصنيف النصوص** هو مشكلة تصنيف نموذجية تتعلق بتسلسلات النصوص. تشمل الأمثلة تصنيف رسائل البريد الإلكتروني كبريد مزعج مقابل غير مزعج، أو تصنيف المقالات كرياضة أو أعمال أو سياسة وما إلى ذلك. أيضًا، عند تطوير روبوتات المحادثة، نحتاج غالبًا إلى فهم ما أراد المستخدم قوله — في هذه الحالة نتعامل مع **تصنيف النية**. غالبًا، في تصنيف النية نحتاج إلى التعامل مع العديد من الفئات.
|
||||
* **تحليل المشاعر** هو مشكلة انحدار نموذجية، حيث نحتاج إلى إسناد رقم (مشاعر) يعبر عن مدى إيجابية/سلبية معنى الجملة. نسخة متقدمة من تحليل المشاعر هي **تحليل المشاعر بناءً على الجوانب** (ABSA)، حيث ننسب المشاعر ليس إلى الجملة بأكملها، بل إلى أجزاء مختلفة منها (الجوانب)، مثل *في هذا المطعم، أحببت المأكولات، لكن كان الجو رهيبًا*.
|
||||
* **التعرف على الكيانات المسماة** (NER) تشير إلى مشكلة استخراج كيانات معينة من النص. على سبيل المثال، قد نحتاج إلى فهم أن في العبارة *أحتاج للسفر إلى باريس غدًا* كلمة *غدًا* تشير إلى التاريخ، و*باريس* هي موقع.
|
||||
* **استخراج الكلمات المفتاحية** مشابه لـNER، لكننا نحتاج إلى استخراج الكلمات المهمة لمعنى الجملة تلقائيًا، بدون تدريب مسبق لأنواع كيانات محددة.
|
||||
* **تجميع النصوص** يمكن أن يكون مفيدًا عندما نريد جمع جمل متشابهة معًا، على سبيل المثال، طلبات متشابهة في محادثات دعم فني.
|
||||
* **الإجابة على الأسئلة** تشير إلى قدرة نموذج على الإجابة عن سؤال محدد. يستقبل النموذج مقطع نص وسؤال كمدخلات، ويحتاج إلى توفير مكان في النص يحتوي على إجابة السؤال (أو، أحيانًا، توليد نص الإجابة).
|
||||
* **توليد النصوص** هي قدرة نموذج على توليد نص جديد. يمكن اعتبارها مهمة تصنيف تتنبأ بالحرف/الكلمة التالية بناءً على *موجه نصي* معين. النماذج المتقدمة لتوليد النصوص، مثل GPT-3، قادرة على حل مهام NLP أخرى مثل التصنيف باستخدام تقنية تسمى [برمجة الموجهات](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) أو [هندسة الموجهات](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29)
|
||||
* **تلخيص النصوص** هي تقنية نريد فيها من الحاسوب "قراءة" نص طويل وتلخيصه في بضع جمل.
|
||||
* **الترجمة الآلية** يمكن رؤيتها كمزيج من فهم النص بلغة معينة، وتوليد النص بلغة أخرى.
|
||||
|
||||
في البداية، تم حل معظم مهام معالجة اللغة الطبيعية باستخدام طرق تقليدية مثل القواعد. على سبيل المثال، في الترجمة الآلية، تم استخدام المحللات لتحويل الجملة الأولية إلى شجرة تركيبية، ثم تم استخراج هياكل دلالية أعلى لتمثيل معنى الجملة، وبناءً على هذا المعنى وقواعد اللغة المستهدفة تم توليد النتيجة. في الوقت الحاضر، يتم حل العديد من مهام معالجة اللغة الطبيعية بشكل أكثر فعالية باستخدام الشبكات العصبية.
|
||||
في البداية، كانت معظم مهام NLP تُحل باستخدام طرق تقليدية مثل القواعد اللغوية. على سبيل المثال، في الترجمة الآلية كان يُستخدم المحللون اللغويون لتحويل الجملة الأولية إلى شجرة تركيب، ثم تُستخرج هياكل معنوية أعلى مستوى لتمثيل معنى الجملة، وبناءً على هذا المعنى وقواعد اللغة الهدف تُنشأ النتيجة. اليوم، تُحل العديد من مهام NLP بشكل أكثر فعالية باستخدام الشبكات العصبية.
|
||||
|
||||
> يتم تنفيذ العديد من طرق معالجة اللغة الطبيعية الكلاسيكية في مكتبة Python [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org). هناك [كتاب NLTK](https://www.nltk.org/book/) رائع متاح عبر الإنترنت يغطي كيفية حل مهام معالجة اللغة الطبيعية المختلفة باستخدام NLTK.
|
||||
> العديد من طرق NLP التقليدية مُنفذة في مكتبة بايثون [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org). هناك كتاب رائع [NLTK Book](https://www.nltk.org/book/) متاح عبر الإنترنت يشرح كيف يمكن حل مهام NLP المختلفة باستخدام NLTK.
|
||||
|
||||
في دورتنا، سنركز بشكل أساسي على استخدام الشبكات العصبية لمعالجة اللغة الطبيعية، وسنستخدم NLTK عند الحاجة.
|
||||
|
||||
لقد تعلمنا بالفعل كيفية استخدام الشبكات العصبية للتعامل مع البيانات الجدولية والصور. الفرق الرئيسي بين تلك الأنواع من البيانات والنصوص هو أن النصوص عبارة عن تسلسل بطول متغير، بينما يكون حجم المدخلات في حالة الصور معروفًا مسبقًا. بينما يمكن للشبكات الالتفافية استخراج الأنماط من البيانات المدخلة، فإن الأنماط في النصوص أكثر تعقيدًا. على سبيل المثال، يمكن أن تكون النفي مفصولة عن الموضوع بعدد كبير من الكلمات (مثل: *أنا لا أحب البرتقال*، مقابل *أنا لا أحب تلك البرتقالة الكبيرة الملونة اللذيذة*)، ويجب أن يتم تفسير ذلك كأنه نمط واحد. لذلك، لمعالجة اللغة، نحتاج إلى تقديم أنواع جديدة من الشبكات العصبية، مثل *الشبكات المتكررة* و*المحولات*.
|
||||
لقد تعلمنا بالفعل عن استخدام الشبكات العصبية للتعامل مع البيانات الجدولية والصور. الفرق الرئيسي بين تلك الأنواع من البيانات والنص هو أن النص سلسلة ذات طول متغير، بينما حجم الإدخال في حالة الصور معروف مسبقًا. بينما يمكن للشبكات الالتفافية استخراج أنماط من بيانات الإدخال، الأنماط في النص أكثر تعقيدًا. على سبيل المثال، يمكن أن يكون النفي مفصولًا عن الموضوع بكلمات متعددة (مثلًا *أنا لا أحب البرتقال*، مقابل *أنا لا أحب تلك البرتقالات الكبيرة الملونة اللذيذة*)، ويجب أن يُفسر ذلك كنمط واحد. لذا، للتعامل مع اللغة نحتاج إلى إدخال أنواع جديدة من الشبكات العصبية، مثل *الشبكات العودية* و*المحولات*.
|
||||
|
||||
## تثبيت المكتبات
|
||||
|
||||
إذا كنت تستخدم تثبيت Python محلي لتشغيل هذه الدورة، قد تحتاج إلى تثبيت جميع المكتبات المطلوبة لمعالجة اللغة الطبيعية باستخدام الأوامر التالية:
|
||||
إذا كنت تستخدم تثبيت بايثون محلي لتشغيل هذه الدورة، قد تحتاج إلى تثبيت جميع المكتبات المطلوبة لـNLP باستخدام الأوامر التالية:
|
||||
|
||||
**لـ PyTorch**
|
||||
**لـPyTorch**
|
||||
```bash
|
||||
pip install -r requirements-torch.txt
|
||||
pip install -r requirements-pytorch.txt
|
||||
```
|
||||
**لـ TensorFlow**
|
||||
**لـTensorFlow**
|
||||
```bash
|
||||
pip install -r requirements-tf.txt
|
||||
```
|
||||
|
||||
> يمكنك تجربة معالجة اللغة الطبيعية باستخدام TensorFlow على [Microsoft Learn](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste)
|
||||
> يمكنك تجربة NLP مع TensorFlow على [Microsoft Learn](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste)
|
||||
|
||||
## تحذير حول GPU
|
||||
## تحذير بشأن وحدة معالجة الرسومات (GPU)
|
||||
|
||||
في هذا القسم، في بعض الأمثلة سنقوم بتدريب نماذج كبيرة جدًا.
|
||||
* **استخدام حاسوب مزود بـ GPU**: يُنصح بتشغيل دفاتر الملاحظات على حاسوب مزود بـ GPU لتقليل أوقات الانتظار عند العمل مع نماذج كبيرة.
|
||||
* **قيود ذاكرة GPU**: قد يؤدي التشغيل على GPU إلى حالات نفاد ذاكرة GPU، خاصة عند تدريب نماذج كبيرة.
|
||||
* **استهلاك ذاكرة GPU**: يعتمد مقدار ذاكرة GPU المستهلكة أثناء التدريب على عوامل مختلفة، بما في ذلك حجم الدفعة الصغيرة.
|
||||
* **تقليل حجم الدفعة الصغيرة**: إذا واجهت مشاكل في ذاكرة GPU، فكر في تقليل حجم الدفعة الصغيرة في الكود الخاص بك كحل محتمل.
|
||||
* **إصدار ذاكرة GPU في TensorFlow**: قد لا تقوم الإصدارات القديمة من TensorFlow بإصدار ذاكرة GPU بشكل صحيح عند تدريب نماذج متعددة داخل نواة Python واحدة. لإدارة استخدام ذاكرة GPU بشكل فعال، يمكنك تكوين TensorFlow لتخصيص ذاكرة GPU فقط عند الحاجة.
|
||||
* **إدراج الكود**: لتعيين TensorFlow لتوسيع تخصيص ذاكرة GPU فقط عند الحاجة، قم بإدراج الكود التالي في دفاتر الملاحظات الخاصة بك:
|
||||
في هذا القسم، في بعض الأمثلة سنقوم بتدريب نماذج كبيرة إلى حد ما.
|
||||
* **استخدم جهاز مزود بوحدة معالجة رسومات**: من المستحسن تشغيل دفاتر الملاحظات الخاصة بك على جهاز مزود بوحدة معالجة رسومات لتقليل أوقات الانتظار عند العمل مع النماذج الكبيرة.
|
||||
* **قيود ذاكرة وحدة معالجة الرسومات**: التشغيل على GPU قد يؤدي إلى مواقف حيث تنفد ذاكرة GPU، خاصة عند تدريب نماذج كبيرة.
|
||||
* **استهلاك ذاكرة GPU**: كمية ذاكرة GPU المستهلكة أثناء التدريب تعتمد على عوامل مختلفة، بما في ذلك حجم الحزمة الجزئية.
|
||||
* **تقليل حجم الحزمة الجزئية**: إذا واجهت مشكلات في ذاكرة GPU، فكر في تقليل حجم الحزمة الجزئية في كودك كحل محتمل.
|
||||
* **تحرير ذاكرة GPU في TensorFlow**: الإصدارات القديمة من TensorFlow قد لا تحرر ذاكرة GPU بشكل صحيح عند تدريب نماذج متعددة داخل نواة بايثون واحدة. لإدارة استخدام ذاكرة GPU بفعالية، يمكنك تكوين TensorFlow لتخصيص ذاكرة GPU فقط عند الحاجة.
|
||||
* **شمول الكود**: لتعيين TensorFlow للنمو التدريجي في تخصيص ذاكرة GPU فقط عند الحاجة، أدرج الكود التالي في دفاتر ملاحظاتك:
|
||||
|
||||
```python
|
||||
physical_devices = tf.config.list_physical_devices('GPU')
|
||||
|
|
@ -53,17 +53,21 @@ if len(physical_devices)>0:
|
|||
tf.config.experimental.set_memory_growth(physical_devices[0], True)
|
||||
```
|
||||
|
||||
إذا كنت مهتمًا بتعلم معالجة اللغة الطبيعية من منظور تعلم الآلة الكلاسيكي، قم بزيارة [هذه المجموعة من الدروس](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP)
|
||||
إذا كنت مهتمًا بتعلم NLP من منظور تعلّم الآلة الكلاسيكي، قم بزيارة [هذه المجموعة من الدروس](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP)
|
||||
|
||||
## في هذا القسم
|
||||
في هذا القسم سنتعلم عن:
|
||||
|
||||
* [تمثيل النصوص كـ Tensors](13-TextRep/README.md)
|
||||
* [تمثيلات الكلمات](14-Emdeddings/README.md)
|
||||
* [تمثيل النصوص كمصفوفات](13-TextRep/README.md)
|
||||
* [تضمين الكلمات](14-Emdeddings/README.md)
|
||||
* [نمذجة اللغة](15-LanguageModeling/README.md)
|
||||
* [الشبكات العصبية المتكررة](16-RNN/README.md)
|
||||
* [الشبكات العصبية العودية](16-RNN/README.md)
|
||||
* [الشبكات التوليدية](17-GenerativeNetworks/README.md)
|
||||
* [المحولات](18-Transformers/README.md)
|
||||
|
||||
**إخلاء المسؤولية**:
|
||||
تم ترجمة هذا المستند باستخدام خدمة الترجمة بالذكاء الاصطناعي [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو معلومات غير دقيقة. يجب اعتبار المستند الأصلي بلغته الأصلية المصدر الرسمي. للحصول على معلومات حاسمة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة تنشأ عن استخدام هذه الترجمة.
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**تنويه**:
|
||||
تمت ترجمة هذا المستند باستخدام خدمة الترجمة بالذكاء الاصطناعي [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى للدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو عدم دقة. يجب اعتبار المستند الأصلي بلغته الأصلية المصدر الرسمي والمعتمد. للمعلومات الهامة، يُنصح بالاستعانة بترجمة بشرية محترفة. نحن غير مسؤولين عن أي سوء فهم أو تفسير ناتج عن استخدام هذه الترجمة.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -5,6 +5,12 @@
|
|||
"source_file": "AGENTS.md",
|
||||
"language_code": "fa"
|
||||
},
|
||||
"CONTRIBUTING.md": {
|
||||
"original_hash": "c6fd7e781b67111a90abd166d0ce4aa0",
|
||||
"translation_date": "2026-07-08T21:37:43+00:00",
|
||||
"source_file": "CONTRIBUTING.md",
|
||||
"language_code": "fa"
|
||||
},
|
||||
"README.md": {
|
||||
"original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b",
|
||||
"translation_date": "2026-04-06T21:15:32+00:00",
|
||||
|
|
@ -17,6 +23,19 @@
|
|||
"source_file": "SECURITY.md",
|
||||
"language_code": "fa"
|
||||
},
|
||||
"__translation_failures__": {
|
||||
"lessons/sketchnotes/LICENSE.md": {
|
||||
"original_hash": "45ab63a2cd8f5faef6c9b150618837a4",
|
||||
"source_file": "lessons/sketchnotes/LICENSE.md",
|
||||
"language_code": "fa",
|
||||
"failure_date": "2026-07-08T21:37:14+00:00",
|
||||
"status": "failed",
|
||||
"error_type": "TranslationIncompleteError",
|
||||
"error_message": "Markdown translation remained incomplete for chunk 1.1.1 of 'LICENSE.md', and the chunk could not be split further.",
|
||||
"translator_version": "0.20.0",
|
||||
"failure_policy_version": 1
|
||||
}
|
||||
},
|
||||
"etc/CODE_OF_CONDUCT.md": {
|
||||
"original_hash": "c06b12caf3c901eb3156e3dd5b0aea56",
|
||||
"translation_date": "2025-08-24T10:50:16+00:00",
|
||||
|
|
@ -54,8 +73,8 @@
|
|||
"language_code": "fa"
|
||||
},
|
||||
"examples/README.md": {
|
||||
"original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7",
|
||||
"translation_date": "2025-10-03T11:27:04+00:00",
|
||||
"original_hash": "7883d52c2e2a221e0b07a7b112a149b9",
|
||||
"translation_date": "2026-07-08T21:32:16+00:00",
|
||||
"source_file": "examples/README.md",
|
||||
"language_code": "fa"
|
||||
},
|
||||
|
|
@ -66,8 +85,8 @@
|
|||
"language_code": "fa"
|
||||
},
|
||||
"lessons/0-course-setup/how-to-run.md": {
|
||||
"original_hash": "a4717bd9103b9f6cd84d534b83534689",
|
||||
"translation_date": "2026-01-15T11:02:39+00:00",
|
||||
"original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1",
|
||||
"translation_date": "2026-07-08T21:32:38+00:00",
|
||||
"source_file": "lessons/0-course-setup/how-to-run.md",
|
||||
"language_code": "fa"
|
||||
},
|
||||
|
|
@ -191,6 +210,12 @@
|
|||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md",
|
||||
"language_code": "fa"
|
||||
},
|
||||
"lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": {
|
||||
"original_hash": "99b816b6a4957ef4100cee4c4221dff9",
|
||||
"translation_date": "2026-07-08T21:22:07+00:00",
|
||||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb",
|
||||
"language_code": "fa"
|
||||
},
|
||||
"lessons/4-ComputerVision/08-TransferLearning/lab/README.md": {
|
||||
"original_hash": "7765935c35fcee69b9fe2d0cfd6963e2",
|
||||
"translation_date": "2025-08-24T10:34:57+00:00",
|
||||
|
|
@ -330,8 +355,8 @@
|
|||
"language_code": "fa"
|
||||
},
|
||||
"lessons/5-NLP/README.md": {
|
||||
"original_hash": "8ef02a9318257ea140ed3ed74442096d",
|
||||
"translation_date": "2025-08-24T10:11:26+00:00",
|
||||
"original_hash": "038df6f1a73e49f6430740da083bfd6d",
|
||||
"translation_date": "2026-07-08T21:33:43+00:00",
|
||||
"source_file": "lessons/5-NLP/README.md",
|
||||
"language_code": "fa"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -0,0 +1,29 @@
|
|||
# مشارکت در AI-For-Beginners
|
||||
|
||||
از علاقه شما به مشارکت در AI-For-Beginners سپاسگزاریم! ما از ترجمهها، رفع اشتباهات در درسها و اصلاحات قالببندی استقبال میکنیم.
|
||||
|
||||
## قرارداد مجوز همکاری مایکروسافت (CLA)
|
||||
|
||||
این پروژه از مشارکتها و پیشنهادات استقبال میکند. اکثر مشارکتها نیاز دارند که شما با قرارداد مجوز همکاری (CLA) موافقت کنید که اعلام میکند شما حق دارید و در واقع به ما اجازه استفاده از مشارکتتان را میدهید. برای جزئیات بیشتر، به [https://cla.microsoft.com](https://cla.microsoft.com) مراجعه کنید.
|
||||
|
||||
هنگام ارسال درخواست pull، یک روبات CLA بطور خودکار تعیین میکند که آیا نیاز دارید یک CLA ارائه دهید و به درخواست PR علامتگذاری مناسب (مثلاً برچسب، نظر) اضافه میکند. فقط کافی است دستورالعملهای ارائهشده توسط روبات را دنبال کنید. شما فقط یکبار در تمام مخازنی که از CLA ما استفاده میکنند باید این کار را انجام دهید.
|
||||
|
||||
## چگونه مشارکت کنیم
|
||||
|
||||
### 1. رفع اشتباهات تایپی / خطاهای کد
|
||||
اگر اشتباه تایپی یا باگی در هر دفترچه Jupyter یا فایل markdown یک درس یافتید:
|
||||
1. مخزن را فورک کنید.
|
||||
2. اشتباه تایپی یا لینک خراب را اصلاح کنید.
|
||||
3. یک Pull Request با توضیح واضح از اصلاح ارسال کنید.
|
||||
|
||||
### 2. ارسال ترجمهها
|
||||
ما از ترجمه درسها به زبانهای دیگر استقبال میکنیم! لطفاً ترجمهها را در زیر شاخه `translations/` و با استفاده از نام پوشههای موجود قرار دهید (برای مثال `translations/es/`، `translations/pt-BR/`، `translations/zh-CN/`).
|
||||
|
||||
برای جزئیات بیشتر، به [etc/CONTRIBUTING.md](etc/CONTRIBUTING.md) مراجعه کنید.
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**سلب مسئولیت**:
|
||||
این سند با استفاده از سرویس ترجمه هوش مصنوعی [Co-op Translator](https://github.com/Azure/co-op-translator) ترجمه شده است. در حالی که ما در تلاش برای دقت هستیم، لطفاً توجه داشته باشید که ترجمههای خودکار ممکن است شامل خطاها یا نادرستیهایی باشند. سند اصلی به زبان مادری خود باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حیاتی، ترجمه حرفهای انسانی توصیه میشود. ما در قبال هرگونه سوء تفاهم یا برداشت نادرست ناشی از استفاده از این ترجمه مسئولیتی نداریم.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -1,31 +1,31 @@
|
|||
# مثالهای هوش مصنوعی برای مبتدیان
|
||||
# مثالهای آسان برای مبتدیان در هوش مصنوعی
|
||||
|
||||
خوش آمدید! این فهرست شامل مثالهای ساده و مستقل است که به شما کمک میکند با هوش مصنوعی و یادگیری ماشین شروع کنید. هر مثال به گونهای طراحی شده که برای مبتدیان مناسب باشد و شامل توضیحات گامبهگام و نظرات دقیق است.
|
||||
خوش آمدید! این پوشه شامل مثالهای ساده و مستقل است که به شما کمک میکند با هوش مصنوعی و یادگیری ماشین شروع کنید. هر مثال به گونهای طراحی شده که برای مبتدیان مناسب باشد و با توضیحات دقیق و گام به گام ارائه شده است.
|
||||
|
||||
## 📚 مرور مثالها
|
||||
|
||||
| مثال | توضیحات | سختی | پیشنیازها |
|
||||
|------|---------|-------|------------|
|
||||
| [Hello AI World](../../../examples/01-hello-ai-world.py) | اولین برنامه هوش مصنوعی شما - شناسایی الگوهای ساده | ⭐ مبتدی | اصول اولیه پایتون |
|
||||
| [Simple Neural Network](../../../examples/02-simple-neural-network.py) | ساخت یک شبکه عصبی از ابتدا | ⭐⭐ مبتدی+ | پایتون، ریاضیات پایه |
|
||||
| [Image Classifier](./03-image-classifier.ipynb) | طبقهبندی تصاویر با یک مدل از پیش آموزشدیده | ⭐⭐ مبتدی+ | پایتون، numpy |
|
||||
| [Text Sentiment](../../../examples/04-text-sentiment.py) | تحلیل احساسات متن (مثبت/منفی) | ⭐⭐ مبتدی+ | پایتون |
|
||||
| مثال | توضیحات | سطح سختی | پیشنیازها |
|
||||
|---------|-------------|------------|---------------|
|
||||
| [Hello AI World](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/01-hello-ai-world.py) | اولین برنامه هوش مصنوعی شما - تشخیص الگوی ساده | ⭐ مبتدی | مبانی پایتون |
|
||||
| [Simple Neural Network](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/02-simple-neural-network.py) | ساخت شبکه عصبی از صفر | ⭐⭐ مبتدی+ | پایتون، ریاضیات پایه |
|
||||
| [Image Classifier](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/03-image-classifier.ipynb) | دستهبندی تصاویر با مدل از پیش آموزش دیده | ⭐⭐ مبتدی+ | پایتون، numpy |
|
||||
| [Text Sentiment](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/04-text-sentiment.py) | تحلیل احساسات متن (مثبت/منفی) | ⭐⭐ مبتدی+ | پایتون |
|
||||
|
||||
## 🚀 شروع به کار
|
||||
## 🚀 شروع کار
|
||||
|
||||
### پیشنیازها
|
||||
|
||||
اطمینان حاصل کنید که پایتون نصب شده باشد (نسخه 3.8 یا بالاتر توصیه میشود). بستههای مورد نیاز را نصب کنید:
|
||||
اطمینان حاصل کنید که پایتون نصب شده است (نسخه ۳.۸ یا بالاتر توصیه میشود). بستههای مورد نیاز را نصب کنید:
|
||||
|
||||
```bash
|
||||
# For Python scripts
|
||||
# برای اسکریپتهای پایتون
|
||||
pip install numpy
|
||||
|
||||
# For Jupyter notebooks (image classifier)
|
||||
# برای نوتبوکهای Jupyter (طبقهبندیکننده تصویر)
|
||||
pip install jupyter numpy pillow tensorflow
|
||||
```
|
||||
|
||||
یا از محیط conda در برنامه اصلی استفاده کنید:
|
||||
یا از محیط conda موجود در برنامه اصلی استفاده کنید:
|
||||
|
||||
```bash
|
||||
conda env create --name ai4beg --file ../environment.yml
|
||||
|
|
@ -34,12 +34,12 @@ conda activate ai4beg
|
|||
|
||||
### اجرای مثالها
|
||||
|
||||
**برای اسکریپتهای پایتون (.py):**
|
||||
**برای فایلهای پایتون (.py):**
|
||||
```bash
|
||||
python 01-hello-ai-world.py
|
||||
```
|
||||
|
||||
**برای نوتبوکهای Jupyter (.ipynb):**
|
||||
**برای دفترچههای Jupyter (.ipynb):**
|
||||
```bash
|
||||
jupyter notebook 03-image-classifier.ipynb
|
||||
```
|
||||
|
|
@ -48,38 +48,40 @@ jupyter notebook 03-image-classifier.ipynb
|
|||
|
||||
پیشنهاد میکنیم مثالها را به ترتیب دنبال کنید:
|
||||
|
||||
1. **با "Hello AI World" شروع کنید** - اصول شناسایی الگوها را یاد بگیرید
|
||||
2. **یک شبکه عصبی ساده بسازید** - نحوه کار شبکههای عصبی را درک کنید
|
||||
3. **طبقهبندی تصاویر را امتحان کنید** - هوش مصنوعی را با تصاویر واقعی ببینید
|
||||
4. **تحلیل احساسات متن را انجام دهید** - پردازش زبان طبیعی را کشف کنید
|
||||
۱. **شروع با "Hello AI World"** - یادگیری مبانی تشخیص الگو
|
||||
۲. **ساخت شبکه عصبی ساده** - فهمیدن نحوه کارکرد شبکههای عصبی
|
||||
۳. **آزمایش دستهبند تصاویر** - مشاهده هوش مصنوعی با تصاویر واقعی
|
||||
۴. **تحلیل احساسات متن** - کاوش در پردازش زبان طبیعی
|
||||
|
||||
## 💡 نکات برای مبتدیان
|
||||
|
||||
- **نظرات کد را با دقت بخوانید** - توضیح میدهند که هر خط چه کاری انجام میدهد
|
||||
- **کدها را با دقت بخوانید** - توضیح میدهند هر خط چه کاری انجام میدهد
|
||||
- **آزمایش کنید!** - مقادیر را تغییر دهید و ببینید چه اتفاقی میافتد
|
||||
- **نگران فهمیدن همه چیز نباشید** - یادگیری زمان میبرد
|
||||
- **سوال بپرسید** - از [صفحه بحث و گفتگو](https://github.com/microsoft/AI-For-Beginners/discussions) استفاده کنید
|
||||
- **نگران نفهمیدن همه چیز نباشید** - یادگیری زمان میبرد
|
||||
- **پرسش کنید** - از [برد بحث](https://github.com/microsoft/AI-For-Beginners/discussions) استفاده کنید
|
||||
|
||||
## 🔗 مراحل بعدی
|
||||
|
||||
پس از تکمیل این مثالها، برنامه کامل را بررسی کنید:
|
||||
پس از اتمام این مثالها، برنامه کامل را بررسی کنید:
|
||||
- [مقدمهای بر هوش مصنوعی](../lessons/1-Intro/README.md)
|
||||
- [شبکههای عصبی](../lessons/3-NeuralNetworks/README.md)
|
||||
- [بینایی کامپیوتر](../lessons/4-ComputerVision/README.md)
|
||||
- [بینایی ماشین](../lessons/4-ComputerVision/README.md)
|
||||
- [پردازش زبان طبیعی](../lessons/5-NLP/README.md)
|
||||
|
||||
## 🤝 مشارکت
|
||||
## 🤝 همکاری
|
||||
|
||||
آیا این مثالها برای شما مفید بودند؟ به ما کمک کنید آنها را بهبود دهیم:
|
||||
- مشکلات را گزارش دهید یا پیشنهادات خود را ارائه کنید
|
||||
- مثالهای بیشتری برای مبتدیان اضافه کنید
|
||||
- مستندات و نظرات را بهبود دهید
|
||||
آیا این مثالها برای شما مفید بودند؟ به ما کمک کنید آنها را بهتر کنیم:
|
||||
- ارسال گزارش مشکلات یا پیشنهاد بهبود
|
||||
- اضافه کردن مثالهای بیشتر برای مبتدیان
|
||||
- بهبود مستندسازی و توضیحات
|
||||
|
||||
---
|
||||
|
||||
*به یاد داشته باشید: هر متخصص زمانی یک مبتدی بوده است. یادگیری خوشایند! 🎓*
|
||||
*یادتان باشد: هر کارشناس زمانی مبتدی بوده است. یادگیری خوش بگذرد! 🎓*
|
||||
|
||||
---
|
||||
|
||||
**سلب مسئولیت**:
|
||||
این سند با استفاده از سرویس ترجمه هوش مصنوعی [Co-op Translator](https://github.com/Azure/co-op-translator) ترجمه شده است. در حالی که ما تلاش میکنیم دقت را حفظ کنیم، لطفاً توجه داشته باشید که ترجمههای خودکار ممکن است شامل خطاها یا نادرستیها باشند. سند اصلی به زبان اصلی آن باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حساس، توصیه میشود از ترجمه حرفهای انسانی استفاده کنید. ما مسئولیتی در قبال سوء تفاهمها یا تفسیرهای نادرست ناشی از استفاده از این ترجمه نداریم.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**سلب مسئولیت**:
|
||||
این سند با استفاده از سرویس ترجمه هوش مصنوعی [Co-op Translator](https://github.com/Azure/co-op-translator) ترجمه شده است. در حالی که ما در تلاش برای دقت هستیم، لطفاً توجه داشته باشید که ترجمههای خودکار ممکن است شامل خطاها یا نادرستیهایی باشند. سند اصلی به زبان مادری خود باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حیاتی، ترجمه حرفهای انسانی توصیه میشود. ما در قبال هرگونه سوء تفاهم یا برداشت نادرست ناشی از استفاده از این ترجمه مسئولیتی نداریم.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -1,12 +1,12 @@
|
|||
# چگونه کد را اجرا کنیم
|
||||
# نحوه اجرای کد
|
||||
|
||||
این برنامه آموزشی حاوی مثالها و آزمایشهای قابل اجرا زیادی است که احتمالاً میخواهید اجرا کنید. برای انجام این کار، باید توانایی اجرای کد پایتون در دفترچههای Jupyter ارائه شده به عنوان بخشی از این برنامه آموزشی را داشته باشید. چند گزینه برای اجرای کد دارید:
|
||||
این برنامه آموزشی شامل مثالها و آزمایشهای قابل اجرایی است که احتمالا میخواهید اجرا کنید. برای این منظور، باید توانایی اجرای کد پایتون را در نوت بوکهای جیوپیتر داشته باشید که بخشی از این برنامه آموزشی هستند. برای اجرای کد چندین گزینه دارید:
|
||||
|
||||
## اجرا به صورت محلی روی کامپیوتر خود
|
||||
## اجرا به صورت محلی روی کامپیوتر خودتان
|
||||
|
||||
برای اجرای کد به صورت محلی روی کامپیوتر خود، نیاز به نصب پایتون دارید. یکی از توصیهها نصب **[miniconda](https://conda.io/en/latest/miniconda.html)** است - این یک نصب نسبتاً سبک است که از مدیر بسته `conda` برای **محیطهای مجازی** مختلف پایتون پشتیبانی میکند.
|
||||
برای اجرای کد به صورت محلی روی کامپیوتر خود، نیاز به نصب پایتون دارید. یکی از پیشنهادها نصب **[miniconda](https://conda.io/en/latest/miniconda.html)** است - که یک نصب نسبتاً سبک بوده و از مدیر بسته `conda` برای محیطهای مجازی مختلف پایتون پشتیبانی میکند.
|
||||
|
||||
پس از نصب miniconda، مخزن را کلون کنید و یک محیط مجازی برای استفاده در این دوره ایجاد کنید:
|
||||
پس از نصب miniconda، مخزن را کلون کرده و یک محیط مجازی برای استفاده در این دوره ایجاد کنید:
|
||||
|
||||
```bash
|
||||
git clone http://github.com/microsoft/ai-for-beginners
|
||||
|
|
@ -17,17 +17,17 @@ conda activate ai4beg
|
|||
|
||||
### استفاده از Visual Studio Code با افزونه پایتون
|
||||
|
||||
این برنامه آموزشی بهترین بهره را زمانی دارد که در [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) با افزونه [Python Extension](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste) باز شود.
|
||||
بهترین استفاده از این برنامه آموزشی وقتی است که آن را در [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) با [افزونه پایتون](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste) باز کنید.
|
||||
|
||||
> **توجه**: پس از کلون کردن و باز کردن دایرکتوری در VS Code، به طور خودکار به شما پیشنهاد نصب افزونههای پایتون داده میشود. همچنین باید miniconda را طبق توضیحات بالا نصب کنید.
|
||||
> **توجه**: پس از کلون کردن و باز کردن پوشه در VS Code، به صورت خودکار نصب افزونههای پایتون به شما پیشنهاد داده میشود. همچنین باید miniconda را طبق توضیحات بالا نصب کنید.
|
||||
|
||||
> **توجه**: اگر VS Code به شما پیشنهاد داد که مخزن را در یک کانتینر باز کنید، باید این پیشنهاد را رد کنید تا از نصب محلی پایتون استفاده کنید.
|
||||
|
||||
### استفاده از Jupyter در مرورگر
|
||||
### استفاده از جیوپیتر در مرورگر
|
||||
|
||||
شما همچنین میتوانید از محیط Jupyter از طریق مرورگر روی کامپیوتر خود استفاده کنید. هم Jupyter کلاسیک و هم JupyterHub محیط توسعه راحتی با تکمیل خودکار، برجستهسازی کد و غیره ارائه میدهند.
|
||||
شما میتوانید از محیط جیوپیتر از طریق مرورگر هم روی کامپیوتر خودتان استفاده کنید. هر دو نسخه کلاسیک و JupyterHub محیط توسعه مناسبی با تکمیل خودکار کد، برجستهسازی کد و غیره فراهم میکنند.
|
||||
|
||||
برای شروع Jupyter به صورت محلی، به دایرکتوری دوره بروید و دستور زیر را اجرا کنید:
|
||||
برای شروع جیوپیتر به صورت محلی، به پوشه دوره بروید و دستور زیر را اجرا کنید:
|
||||
|
||||
```bash
|
||||
jupyter notebook
|
||||
|
|
@ -36,36 +36,36 @@ jupyter notebook
|
|||
```bash
|
||||
jupyterhub
|
||||
```
|
||||
سپس میتوانید به هر یک از فایلهای `.ipynb` بروید، آنها را باز کنید و شروع به کار کنید.
|
||||
سپس میتوانید به هر یک از فایلهای `.ipynb` بروید، آنها را باز کنید و شروع به کار کنید.
|
||||
|
||||
### اجرا در کانتینر
|
||||
|
||||
یکی از جایگزینهای نصب پایتون، اجرای کد در یک کانتینر است. از آنجا که مخزن ما پوشه ویژه `.devcontainer` را فراهم میکند که نحوه ساخت کانتینر برای این مخزن را آموزش میدهد، VS Code این امکان را به شما میدهد که کد را در یک کانتینر باز کنید. این کار نیاز به نصب Docker دارد و همچنین پیچیدهتر است، بنابراین این روش را به کاربران باتجربهتر توصیه میکنیم.
|
||||
یکی از جایگزینهای نصب پایتون، اجرای کد در یک کانتینر است. از آنجا که مخزن ما فولدری به نام `.devcontainer` دارد که نحوه ساخت کانتینر برای این مخزن را مشخص میکند، VS Code این امکان را فراهم میکند که کد را در یک کانتینر باز کنید. این روش نیازمند نصب Docker است و کمی پیچیدهتر است، بنابراین آن را به کاربران دارای تجربهتر توصیه میکنیم.
|
||||
|
||||
## اجرا در فضای ابری
|
||||
|
||||
اگر نمیخواهید پایتون را به صورت محلی نصب کنید و به برخی منابع ابری دسترسی دارید، گزینه خوبی اجرای کد در فضای ابری است. چند روش برای انجام این کار وجود دارد:
|
||||
اگر نمیخواهید پایتون را به صورت محلی نصب کنید و به منابع ابری دسترسی دارید، جایگزین خوبی اجرای کد در فضای ابری است. راههای مختلفی برای انجام این کار وجود دارد:
|
||||
|
||||
* استفاده از **[GitHub Codespaces](https://github.com/features/codespaces)** که یک محیط مجازی است که برای شما در GitHub ایجاد میشود و از طریق رابط مرورگر VS Code قابل دسترسی است. اگر به Codespaces دسترسی دارید، فقط کافی است روی دکمه **Code** در مخزن کلیک کنید، یک codespace راهاندازی کنید و بدون اتلاف وقت شروع به کار کنید.
|
||||
* استفاده از **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) منابع رایگان پردازشی در فضای ابری را برای افرادی مانند شما فراهم میکند تا کدهایی را که در گیتهاب هستند تست کنند. در صفحه اول دکمهای برای باز کردن مخزن در Binder وجود دارد - این شما را سریع به سایت Binder منتقل میکند، جایی که کانتینر زیرساختی ساخته میشود و رابط وب Jupyter بهطور بیوقفه شروع میشود.
|
||||
* استفاده از **[GitHub Codespaces](https://github.com/features/codespaces)** که محیط مجازی است و روی گیتهاب برای شما ایجاد میشود و از طریق رابط مرورگر VS Code قابل دسترسی است. اگر به Codespaces دسترسی دارید، کافی است روی دکمه **Code** در مخزن کلیک کنید، یک codespace راهاندازی کنید و سریع شروع به کار کنید.
|
||||
* استفاده از **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) منابع رایگان پردازشی را به صورت ابری ارائه میدهد تا کدهای روی گیتهاب را برای شما اجرا کند. روی صفحه اصلی دکمهای برای باز کردن مخزن در Binder وجود دارد - این به سرعت شما را به سایت binder میبرد، که کانتینر زیرساختی را میسازد و رابط وب جیوپیتر را برای شما به صورت بیوقفه راهاندازی میکند.
|
||||
|
||||
> **توجه**: برای جلوگیری از سوء استفاده، استفاده Binder از برخی منابع وب مسدود شده است. این ممکن است مانع اجرای برخی کدها شود که مدلها و/یا دادهها را از اینترنت عمومی دریافت میکنند. ممکن است نیاز به راهحلهای جایگزین داشته باشید. همچنین منابع محاسباتی ارائه شده توسط Binder بسیار پایهای است، بنابراین آموزش بهخصوص در درسهای پیچیدهتر و بعدی کند خواهد بود.
|
||||
> **توجه**: برای جلوگیری از سوءاستفاده، Binder به برخی منابع وب دسترسی ندارد. این ممکن است باعث شود برخی کدهایی که مدلها و/یا دادهها را از اینترنت عمومی میگیرند کار نکنند. شاید لازم باشد راهحلی بیابید. همچنین منابع پردازشی Binder پایهای هستند، بنابراین آموزش مدلها به کندی انجام میشود، به ویژه در درسهای بعدی که پیچیدهتر هستند.
|
||||
|
||||
## اجرا در فضای ابری با GPU
|
||||
## اجرا در فضای ابری با استفاده از GPU
|
||||
|
||||
برخی از درسهای بعدی این برنامه آموزشی به شدت از پشتیبانی GPU بهرهمند میشوند. آموزش مدل، برای مثال، در غیر این صورت میتواند بسیار کند باشد. چند گزینه میتوانید دنبال کنید، به ویژه اگر به فضای ابری از طریق [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) یا از طریق مؤسسه خود دسترسی دارید:
|
||||
برخی از درسهای بعدی این برنامه آموزشی استفاده زیادی از پشتیبانی GPU میکنند. آموزش مدلها، برای مثال، بدون آن بسیار کند خواهد بود. چند گزینه وجود دارد که میتوانید دنبال کنید، به خصوص اگر از طریق [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) یا موسسه خود به فضای ابری دسترسی دارید:
|
||||
|
||||
* ایجاد [ماشین مجازی دادهکاوی](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) و اتصال به آن از طریق Jupyter. میتوانید سپس مخزن را مستقیماً روی ماشین کلون کنید و شروع به یادگیری کنید. ماشینهای مجازی سری NC از GPU پشتیبانی میکنند.
|
||||
* ایجاد [ماشین مجازی علوم داده](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) و اتصال به آن از طریق جیوپیتر. سپس میتوانید مخزن را مستقیماً روی ماشین کلون کنید و شروع به یادگیری کنید. ماشینهای سری NC از GPU پشتیبانی میکنند.
|
||||
|
||||
> **توجه**: برخی اشتراکها از جمله Azure for Students به طور پیشفرض پشتیبانی GPU ارائه نمیدهند. ممکن است نیاز به درخواست هستههای GPU اضافی از طریق پشتیبانی فنی داشته باشید.
|
||||
> **توجه**: برخی اشتراکها، از جمله Azure for Students، به طور پیشفرض از GPU پشتیبانی نمیکنند. ممکن است لازم باشد برای دریافت هستههای GPU بیشتر درخواست پشتیبانی فنی کنید.
|
||||
|
||||
* ایجاد [محیط کاری Azure Machine Learning](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) و سپس استفاده از قابلیت Notebook در آنجا. [این ویدیو](https://azure-for-academics.github.io/quickstart/azureml-papers/) نحوه کلون کردن یک مخزن در نوتبوک Azure ML و شروع استفاده از آن را نشان میدهد.
|
||||
* ایجاد [محیط یادگیری ماشین Azure](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) و سپس استفاده از قابلیت نوتبوک آنجا. [این ویدیو](https://azure-for-academics.github.io/quickstart/azureml-papers/) نشان میدهد چطور یک مخزن را به نوتبوک Azure ML کلون کرده و شروع به استفاده کنید.
|
||||
|
||||
شما همچنین میتوانید از Google Colab استفاده کنید که همراه با پشتیبانی رایگان GPU ارائه میشود و دفترچههای Jupyter را آنجا آپلود کرده و یکییکی اجرا کنید.
|
||||
همچنین میتوانید از Google Colab استفاده کنید که دارای پشتیبانی رایگان محدود از GPU است و نوتبوکهای جیوپیتر را یک به یک آنجا آپلود و اجرا کنید.
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**سلب مسئولیت**:
|
||||
این سند با استفاده از خدمات ترجمه ماشین (AI) [Co-op Translator](https://github.com/Azure/co-op-translator) ترجمه شده است. در حالی که ما برای دقت تلاش میکنیم، لطفاً آگاه باشید که ترجمههای خودکار ممکن است حاوی خطاها یا نواقصی باشند. سند اصلی به زبان بومی آن باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حیاتی، ترجمه حرفهای انسانی توصیه میشود. ما مسئول هیچ گونه سوءتفاهم یا تفسیر نادرستی که از استفاده این ترجمه ناشی شود، نیستیم.
|
||||
**سلب مسئولیت**:
|
||||
این سند با استفاده از سرویس ترجمه هوش مصنوعی [Co-op Translator](https://github.com/Azure/co-op-translator) ترجمه شده است. در حالی که ما در تلاش برای دقت هستیم، لطفاً توجه داشته باشید که ترجمههای خودکار ممکن است شامل خطاها یا نادرستیهایی باشند. سند اصلی به زبان مادری خود باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حیاتی، ترجمه حرفهای انسانی توصیه میشود. ما در قبال هرگونه سوء تفاهم یا برداشت نادرست ناشی از استفاده از این ترجمه مسئولیتی نداریم.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -6,9 +6,9 @@
|
|||
"source": [
|
||||
"# مدلهای از پیش آموزشدیده و یادگیری انتقالی\n",
|
||||
"\n",
|
||||
"آموزش شبکههای عصبی کانولوشنی (CNN) میتواند زمان زیادی ببرد و برای این کار دادههای زیادی مورد نیاز است. با این حال، بخش زیادی از زمان صرف یادگیری بهترین فیلترهای سطح پایین میشود که شبکه برای استخراج الگوها از تصاویر از آنها استفاده میکند. یک سؤال طبیعی پیش میآید - آیا میتوانیم از یک شبکه عصبی که روی یک مجموعه داده آموزش دیده استفاده کنیم و آن را برای طبقهبندی تصاویر متفاوت بدون طی کردن فرآیند کامل آموزش تطبیق دهیم؟\n",
|
||||
"آموزش شبکههای عصبی کانولوشنی (CNN) میتواند زمان زیادی ببرد، و برای این کار دادههای زیادی لازم است. با این حال، بخش زیادی از زمان صرف یادگیری بهترین فیلترهای سطح پایین میشود که شبکه برای استخراج الگوها از تصاویر استفاده میکند. یک سوال طبیعی مطرح میشود - آیا میتوانیم از شبکه عصبی آموزشدیده روی یک مجموعه داده استفاده کنیم و آن را برای طبقهبندی تصاویر مختلف بدون طی کردن فرایند کامل آموزش، سازگار کنیم؟\n",
|
||||
"\n",
|
||||
"این رویکرد **یادگیری انتقالی** نامیده میشود، زیرا ما مقداری از دانش یک مدل شبکه عصبی را به مدل دیگری منتقل میکنیم. در یادگیری انتقالی، معمولاً با یک مدل از پیش آموزشدیده شروع میکنیم که روی یک مجموعه داده تصویری بزرگ، مانند **ImageNet**، آموزش دیده است. این مدلها از قبل توانایی خوبی در استخراج ویژگیهای مختلف از تصاویر عمومی دارند و در بسیاری از موارد، تنها با ساختن یک طبقهبند روی این ویژگیهای استخراجشده میتوان به نتایج خوبی دست یافت.\n"
|
||||
"این رویکرد به نام **یادگیری انتقالی** شناخته میشود، زیرا ما قسمتی از دانش را از یک مدل شبکه عصبی به مدل دیگر منتقل میکنیم. در یادگیری انتقالی، معمولاً با یک مدل از پیش آموزشدیده شروع میکنیم که روی مجموعه داده بزرگی از تصاویر مانند **ImageNet** آموزش دیده است. این مدلها میتوانند کار استخراج ویژگیهای مختلف از تصاویر عمومی را به خوبی انجام دهند، و در بسیاری از موارد فقط ساختن یک طبقهبند روی این ویژگیهای استخراجشده میتواند نتیجه خوبی بدهد.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -31,9 +31,9 @@
|
|||
"source": [
|
||||
"## مجموعه داده گربهها در مقابل سگها\n",
|
||||
"\n",
|
||||
"در این بخش، ما یک مسئله واقعی را برای طبقهبندی تصاویر گربهها و سگها حل خواهیم کرد. به همین منظور، از [مجموعه داده گربهها در مقابل سگها در Kaggle](https://www.kaggle.com/c/dogs-vs-cats) استفاده خواهیم کرد که همچنین میتوان آن را [از مایکروسافت](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste) دانلود کرد.\n",
|
||||
"در این واحد، ما یک مسئله واقعی طبقهبندی تصاویر گربهها و سگها را حل خواهیم کرد. برای این منظور، از [مجموعه داده گربهها در مقابل سگها کگل](https://www.kaggle.com/c/dogs-vs-cats) استفاده خواهیم کرد، که همچنین میتوان آن را [از مایکروسافت دانلود کرد](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n",
|
||||
"\n",
|
||||
"بیایید این مجموعه داده را دانلود کرده و در پوشه `data` استخراج کنیم (این فرآیند ممکن است کمی زمانبر باشد!):\n"
|
||||
"بیایید این مجموعه داده را دانلود کرده و آن را در دایرکتوری `data` استخراج کنیم (این فرایند ممکن است کمی زمان ببرد!):\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -64,7 +64,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"متأسفانه، برخی فایلهای تصویر خراب در مجموعه داده وجود دارند. ما باید پاکسازی سریعی انجام دهیم تا فایلهای خراب را بررسی کنیم. برای جلوگیری از شلوغ شدن این آموزش، کد بررسی مجموعه داده را به یک ماژول منتقل کردیم.\n"
|
||||
"متأسفانه، تعدادی فایل تصویر خراب در مجموعه داده وجود دارد. ما باید پاکسازی سریع انجام دهیم تا به دنبال فایلهای خراب بگردیم. برای اینکه این آموزش را به هم نریزیم، کد بررسی مجموعه داده را به یک ماژول منتقل کردیم.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -335,11 +335,11 @@
|
|||
"source": [
|
||||
"## بارگذاری مجموعه داده\n",
|
||||
"\n",
|
||||
"در مثالهای قبلی، مجموعه دادههایی را بارگذاری میکردیم که در Keras تعبیه شده بودند. اکنون قرار است با مجموعه داده خودمان کار کنیم که باید از یک پوشه تصاویر بارگذاری شود.\n",
|
||||
"در مثالهای قبلی، ما مجموعه دادههایی را بارگذاری میکردیم که در Keras تعبیه شده بودند. حالا قرار است به مجموعه داده شخصی خود بپردازیم که باید آن را از یک پوشه تصاویر بارگذاری کنیم.\n",
|
||||
"\n",
|
||||
"در دنیای واقعی، اندازه مجموعه دادههای تصویری میتواند بسیار بزرگ باشد و نمیتوان انتظار داشت که تمام دادهها بتوانند در حافظه جا شوند. بنابراین، مجموعه دادهها اغلب به صورت **تولیدکنندهها** نمایش داده میشوند که میتوانند دادهها را در دستههای کوچک مناسب برای آموزش بازگردانند.\n",
|
||||
"در دنیای واقعی، اندازه مجموعه دادههای تصویری میتواند بسیار بزرگ باشد و نمیتوان به جا شدن همه دادهها در حافظه اعتماد کرد. بنابراین، مجموعه دادهها اغلب بهصورت **ژنراتورها** نمایش داده میشوند که میتوانند دادهها را در قالب مینیبچهایی مناسب آموزش بازگردانند.\n",
|
||||
"\n",
|
||||
"برای کار با طبقهبندی تصاویر، Keras شامل تابع ویژهای به نام `image_dataset_from_directory` است که میتواند تصاویر را از زیرپوشههایی که به کلاسهای مختلف مربوط هستند بارگذاری کند. این تابع همچنین وظیفه مقیاسبندی تصاویر را بر عهده دارد و میتواند مجموعه داده را به زیرمجموعههای آموزش و آزمایش تقسیم کند:\n"
|
||||
"برای کار با طبقهبندی تصاویر، Keras تابع مخصوص `image_dataset_from_directory` را ارائه میدهد که میتواند تصاویر را از زیرپوشههایی بارگذاری کند که به کلاسهای مختلف مرتبط هستند. این تابع همچنین به مقیاسبندی تصاویر میپردازد و میتواند مجموعه داده را به زیرمجموعههای آموزش و آزمون تقسیم کند:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -383,9 +383,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"مهم است که مقدار `seed` را برای هر دو فراخوانی یکسان تنظیم کنید، زیرا این مقدار بر تقسیم تصاویر بین مجموعه دادههای آموزش و آزمایش تأثیر میگذارد.\n",
|
||||
"بسیار مهم است که مقدار `seed` یکسان برای هر دو فراخوانی تنظیم شود، زیرا این مقدار بر تقسیم تصاویر بین مجموعههای آموزش و آزمایش تأثیر میگذارد.\n",
|
||||
"\n",
|
||||
"مجموعه داده بهطور خودکار نام کلاسها را از پوشهها دریافت میکند و در صورت نیاز میتوانید با فراخوانی به آنها دسترسی داشته باشید:\n"
|
||||
"دیتاست به طور خودکار نام کلاسها را از پوشهها میگیرد، و در صورت نیاز میتوانید با فراخوانی موارد زیر به آنها دسترسی داشته باشید:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -412,7 +412,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"مجموعه دادههایی که به دست آوردهایم میتوانند مستقیماً به تابع `fit` منتقل شوند تا مدل آموزش داده شود. این مجموعهها شامل تصاویر و برچسبهای مربوطه هستند که میتوان با استفاده از ساختار زیر بر روی آنها حلقه زد:\n"
|
||||
"دادههایی که به دست آوردهایم میتوانند مستقیماً به تابع `fit` برای آموزش مدل داده شوند. آنها شامل تصاویر و برچسبهای مربوطه هستند که میتوان با استفاده از ساختار زیر بر روی آنها حلقه زد:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -453,16 +453,16 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"> **توجه**: تمام تصاویر در مجموعه داده به صورت تنسورهای نقطه شناور با محدوده ۰-۲۵۵ نمایش داده میشوند. قبل از ارسال آنها به شبکه عصبی، باید این مقادیر را به محدوده ۰-۱ مقیاسبندی کنیم. هنگام رسم تصاویر، یا باید همین کار را انجام دهیم، یا مقادیر را به نوع `int` تبدیل کنیم (که در کد بالا انجام میدهیم)، تا به `matplotlib` نشان دهیم که میخواهیم تصویر اصلی بدون مقیاسبندی را رسم کنیم.\n"
|
||||
"> **توجه**: همه تصاویر در دیتاست به صورت تنسورهای عدد اعشاری با محدوده ۰-۲۵۵ نمایش داده شدهاند. قبل از عبور دادن آنها به شبکه عصبی، باید این مقادیر را به محدوده ۰-۱ نرمال کنیم. هنگام رسم تصاویر نیز باید همین کار را انجام دهیم، یا مقادیر را به نوع `int` تبدیل کنیم (که در کد بالا این کار را انجام دادهایم)، تا به `matplotlib` نشان دهیم که میخواهیم تصویر اصلی بدون مقیاسبندی را رسم کنیم.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## مدلهای از پیش آموزشدیده\n",
|
||||
"## مدلهای پیشآموزشدیده \n",
|
||||
"\n",
|
||||
"برای بسیاری از وظایف طبقهبندی تصاویر میتوان مدلهای شبکه عصبی از پیش آموزشدیده پیدا کرد. بسیاری از این مدلها در فضای نام `keras.applications` در دسترس هستند و مدلهای بیشتری نیز میتوان در اینترنت یافت. بیایید ببینیم چگونه سادهترین مدل VGG-16 میتواند بارگذاری و استفاده شود:\n"
|
||||
"برای بسیاری از وظایف طبقهبندی تصویر، میتوان مدلهای شبکه عصبی پیشآموزشدیده پیدا کرد. بسیاری از این مدلها در فضای نام `keras.applications` موجود هستند و مدلهای بیشتری را میتوان در اینترنت یافت. بیایید ببینیم چطور سادهترین مدل VGG-16 را میتوان بارگذاری و استفاده کرد: \n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -497,7 +497,17 @@
|
|||
}
|
||||
],
|
||||
"source": [
|
||||
"vgg = keras.applications.VGG16()\n",
|
||||
"# SHA-256 of VGG16 weights (with top)\n",
|
||||
"VGG16_WEIGHTS_SHA256 = '64373286793e3c8b2b4e3219cbf3544bce2f55ab4682710a29f5e7af8f5e4f61'\n",
|
||||
"\n",
|
||||
"_weights_path = keras.utils.get_file(\n",
|
||||
" 'vgg16_weights_tf_dim_ordering_tf_kernels.h5',\n",
|
||||
" 'https://storage.googleapis.com/tensorflow/keras-applications/vgg16/vgg16_weights_tf_dim_ordering_tf_kernels.h5',\n",
|
||||
" file_hash=VGG16_WEIGHTS_SHA256,\n",
|
||||
" hash_algorithm='sha256',\n",
|
||||
")\n",
|
||||
"\n",
|
||||
"vgg = keras.applications.VGG16(weights=_weights_path)\n",
|
||||
"inp = keras.applications.vgg16.preprocess_input(x_sample[:1])\n",
|
||||
"\n",
|
||||
"res = vgg(inp)\n",
|
||||
|
|
@ -511,9 +521,9 @@
|
|||
"metadata": {},
|
||||
"source": [
|
||||
"چند نکته مهم در اینجا وجود دارد:\n",
|
||||
"* قبل از اینکه ورودی به هر شبکه از پیشآموزشدادهشدهای ارسال شود، باید به شیوه خاصی پیشپردازش شود. این کار با فراخوانی تابع مربوطه `preprocess_input` انجام میشود که یک دسته از تصاویر را دریافت کرده و نسخه پردازششده آنها را برمیگرداند. در مورد VGG-16، تصاویر نرمالسازی میشوند و مقداری میانگین از پیشتعریفشده برای هر کانال از آنها کم میشود. دلیل این کار این است که VGG-16 در ابتدا با این نوع پیشپردازش آموزش داده شده است.\n",
|
||||
"* شبکه عصبی روی دسته ورودی اعمال میشود و نتیجهای که دریافت میکنیم یک دسته از تنسورهای ۱۰۰۰ عنصری است که احتمال هر کلاس را نشان میدهد. میتوانیم با فراخوانی `argmax` روی این تنسور، شماره کلاسی که بیشترین احتمال را دارد پیدا کنیم.\n",
|
||||
"* نتیجه بهدستآمده [شماره یک کلاس `ImageNet`](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a) است. برای درک بهتر این نتیجه، میتوانیم از تابع `decode_predictions` استفاده کنیم که n کلاس برتر را همراه با نامهای آنها برمیگرداند.\n"
|
||||
"* قبل از اینکه ورودی را به هر شبکه از پیش آموزشدیده شده بدهیم، باید به شیوهای خاص پیشپردازش شود. این کار با فراخوانی تابع متناسب `preprocess_input` انجام میشود، که یک دسته تصاویر را دریافت کرده و شکل پردازش شده آنها را برمیگرداند. در مورد VGG-16، تصاویر نرمالسازی میشوند و مقدار متوسط از پیش تعریف شده برای هر کانال از آنها کم میشود. این به این دلیل است که VGG-16 در اصل با این پیشپردازش آموزش دیده است.\n",
|
||||
"* شبکه عصبی بر روی دسته ورودی اعمال میشود و ما به عنوان نتیجه یک دسته تنسور ۱۰۰۰ عنصری دریافت میکنیم که احتمال هر کلاس را نشان میدهد. میتوانیم با فراخوانی `argmax` روی این تنسور، شماره کلاس با بیشترین احتمال را پیدا کنیم.\n",
|
||||
"* نتیجه به دست آمده، [شماره یک کلاس از `ImageNet`](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a) است. برای درک این نتیجه، میتوانیم از تابع `decode_predictions` نیز استفاده کنیم که n کلاس برتر را همراه با نامهای آنها برمیگرداند.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -599,7 +609,7 @@
|
|||
"source": [
|
||||
"## محاسبات GPU\n",
|
||||
"\n",
|
||||
"شبکههای عصبی عمیق، مانند VGG-16 و معماریهای مدرنتر، برای اجرا به قدرت محاسباتی زیادی نیاز دارند. منطقی است که در صورت امکان از شتابدهی GPU استفاده کنیم. خوشبختانه، Keras بهطور خودکار محاسبات را روی GPU در صورت موجود بودن سرعت میبخشد. میتوانیم با استفاده از کد زیر بررسی کنیم که آیا Tensorflow قادر به استفاده از GPU هست یا خیر:\n"
|
||||
"شبکههای عصبی عمیق، مانند VGG-16 و سایر معماریهای مدرنتر نیازمند قدرت محاسباتی زیادی برای اجرا هستند. منطقی است که از شتابدهی GPU استفاده کنیم، اگر در دسترس باشد. خوشبختانه، Keras بهطور خودکار محاسبات را در GPU سرعت میبخشد اگر در دسترس باشد. ما میتوانیم بررسی کنیم که آیا Tensorflow قادر به استفاده از GPU هست یا خیر با استفاده از کد زیر:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -626,9 +636,10 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n",
|
||||
"## استخراج ویژگیهای VGG\n",
|
||||
"\n",
|
||||
"اگر بخواهیم از VGG-16 برای استخراج ویژگیها از تصاویرمان استفاده کنیم، به مدلی بدون لایههای نهایی طبقهبندی نیاز داریم. میتوانیم مدل VGG-16 را بدون لایههای بالایی با استفاده از این کد ایجاد کنیم:\n"
|
||||
"اگر بخواهیم از VGG-16 برای استخراج ویژگی از تصاویرمان استفاده کنیم، به مدل بدون لایههای نهایی طبقهبندی نیاز داریم. میتوانیم مدل VGG-16 را بدون لایههای بالا با استفاده از این کد نمونهسازی کنیم:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -680,9 +691,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"ابعاد تنسور ویژگی برابر با ۷x۷x۵۱۲ است، اما برای اینکه بتوانیم آن را بصریسازی کنیم، مجبور شدیم آن را به فرم دوبعدی تغییر دهیم.\n",
|
||||
"ابعاد تنسور ویژگی 7x7x512 است، اما برای تجسم آن باید آن را به فرم دوبعدی تبدیل میکردیم.\n",
|
||||
"\n",
|
||||
"حالا بیایید ببینیم آیا میتوان از این ویژگیها برای دستهبندی تصاویر استفاده کرد. بیایید به صورت دستی بخشی از تصاویر (در مورد ما، ۵۰ مینیبچ) را انتخاب کنیم و بردارهای ویژگی آنها را از پیش محاسبه کنیم. برای این کار میتوانیم از API **dataset** در Tensorflow استفاده کنیم. تابع `map` یک دیتاست را میگیرد و یک تابع لامبدا مشخص را اعمال میکند تا آن را تغییر دهد. ما از این مکانیزم برای ساخت دیتاستهای جدید، `ds_features_train` و `ds_features_test`، استفاده میکنیم که به جای تصاویر اصلی، ویژگیهای استخراجشده توسط VGG را شامل میشوند.\n"
|
||||
"حالا بیایید ببینیم آیا میتوان از آن ویژگیها برای طبقهبندی تصاویر استفاده کرد. بیایید به صورت دستی بخشی از تصاویر (۵۰ مینیبچ، در مورد ما) را برداریم و بردارهای ویژگی آنها را پیشمحاسبه کنیم. میتوانیم از API **dataset** تنسورفلو برای این کار استفاده کنیم. تابع `map` یک دیتاست میگیرد و یک تابع لامبدا داده شده را برای تبدیل آن اعمال میکند. ما از این مکانیزم برای ساخت دیتاستهای جدید، `ds_features_train` و `ds_features_test`، استفاده میکنیم که به جای تصاویر اصلی، ویژگیهای استخراجشده از VGG را دربر دارند.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -712,9 +723,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"ما از ساختار `.take(50)` استفاده کردیم تا اندازه مجموعه داده را محدود کنیم و سرعت نمایش را افزایش دهیم. البته میتوانید این آزمایش را روی مجموعه داده کامل انجام دهید.\n",
|
||||
"ما از سازه `.take(50)` برای محدود کردن اندازه مجموعه داده استفاده کردیم تا سرعت نمایش خود را افزایش دهیم. البته شما میتوانید این آزمایش را روی مجموعه داده کامل نیز انجام دهید.\n",
|
||||
"\n",
|
||||
"حالا که یک مجموعه داده با ویژگیهای استخراجشده داریم، میتوانیم یک طبقهبند ساده و متراکم را برای تشخیص بین گربهها و سگها آموزش دهیم. این شبکه یک بردار ویژگی با شکل (7,7,512) دریافت میکند و یک خروجی تولید میکند که یا به سگ یا به گربه مربوط میشود. از آنجا که این یک طبقهبندی دودویی است، از تابع فعالسازی `sigmoid` و تابع زیان `binary_crossentropy` استفاده میکنیم.\n"
|
||||
"حال که مجموعه دادهای با ویژگیهای استخراجشده داریم، میتوانیم یک طبقهبند ساده و متراکم آموزش دهیم تا بین گربهها و سگها تمایز قائل شود. این شبکه یک بردار ویژگی به شکل (7,7,512) میگیرد و یک خروجی تولید میکند که یا به سگ یا به گربه مربوط است. چون این یک مسئله طبقهبندی دودویی است، از تابع فعالسازی `sigmoid` و خسارت `binary_crossentropy` استفاده میکنیم.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -743,13 +754,13 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"نتیجه فوقالعاده است، ما میتوانیم با احتمال تقریباً ۹۵٪ بین یک گربه و یک سگ تمایز قائل شویم! با این حال، ما این روش را فقط روی یک زیرمجموعه از تمام تصاویر آزمایش کردهایم، زیرا استخراج دستی ویژگیها به نظر زمان زیادی میبرد.\n",
|
||||
"نتیجه عالی است، میتوانیم با تقریباً ۹۵٪ احتمال بین گربه و سگ تمایز قائل شویم! با این حال، ما فقط این روش را روی زیرمجموعهای از تمام تصاویر آزمایش کردهایم، چرا که استخراج دستی ویژگیها به نظر زمان زیادی میبرد.\n",
|
||||
"\n",
|
||||
"## یادگیری انتقالی با استفاده از یک شبکه VGG\n",
|
||||
"\n",
|
||||
"ما همچنین میتوانیم از پیشمحاسبه دستی ویژگیها اجتناب کنیم و در طول آموزش از شبکه اصلی VGG-16 به طور کامل استفاده کنیم، با اضافه کردن استخراجکننده ویژگی به عنوان لایه اول شبکه خود.\n",
|
||||
"همچنین میتوانیم با استفاده از شبکه اصلی VGG-16 به عنوان یک کل در طول آموزش، از پیشمحاسبه دستی ویژگیها خودداری کنیم، با اضافه کردن استخراجکننده ویژگی به شبکهمان به عنوان اولین لایه.\n",
|
||||
"\n",
|
||||
"زیبایی معماری Keras این است که مدل VGG-16 که در بالا تعریف کردهایم، میتواند به عنوان یک لایه در یک شبکه عصبی دیگر نیز استفاده شود! تنها کاری که باید انجام دهیم این است که یک شبکه با طبقهبند متراکم روی آن بسازیم و سپس کل شبکه را با استفاده از پسانتشار آموزش دهیم.\n"
|
||||
"زیبایی معماری Keras این است که مدل VGG-16 که در بالا تعریف کردیم میتواند به عنوان یک لایه در شبکه عصبی دیگری نیز استفاده شود! تنها کافی است شبکهای با طبقهبند متراکم در بالای آن ساخته و سپس کل شبکه را با استفاده از پسانتشار آموزش دهیم.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -793,13 +804,13 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"این مدل شبیه یک شبکه طبقهبندی انتها به انتها است که یک تصویر را دریافت کرده و کلاس آن را بازمیگرداند. با این حال، نکته چالشبرانگیز این است که ما میخواهیم VGG16 بهعنوان یک استخراجکننده ویژگی عمل کند و دوباره آموزش داده نشود. بنابراین، باید **وزنهای استخراجکننده ویژگیهای کانولوشنی را ثابت کنیم**. میتوانیم به لایه اول شبکه با فراخوانی `model.layers[0]` دسترسی پیدا کنیم و فقط کافی است ویژگی `trainable` را به مقدار `False` تنظیم کنیم.\n",
|
||||
"این مدل شبیه یک شبکه طبقهبندی انتها به انتها است که یک تصویر میگیرد و کلاس را برمیگرداند. با این حال، نکته ظریف این است که ما میخواهیم VGG16 به عنوان استخراجکننده ویژگی عمل کند و دوباره آموزش داده نشود. بنابراین، نیاز داریم تا **وزنهای استخراجکننده ویژگی کانولوشنی را ثابت کنیم**. میتوانیم به لایه اول شبکه با فراخوانی `model.layers[0]` دسترسی پیدا کنیم، و فقط باید ویژگی `trainable` را روی `False` تنظیم کنیم.\n",
|
||||
"\n",
|
||||
"> **توجه**: ثابت کردن وزنهای استخراجکننده ویژگی ضروری است، زیرا در غیر این صورت، لایه طبقهبندی آموزشندیده میتواند وزنهای از پیش آموزشدیده استخراجکننده کانولوشنی را تخریب کند.\n",
|
||||
"> **توجه**: ثابت کردن وزنهای استخراجکننده ویژگی لازم است، زیرا در غیر اینصورت لایه طبقهبندی آموزشندیده میتواند وزنهای پیشآموزشدیده اصلی استخراجکننده کانولوشنی را خراب کند.\n",
|
||||
"\n",
|
||||
"میتوانید متوجه شوید که در حالی که تعداد کل پارامترهای شبکه ما حدود ۱۵ میلیون است، ما فقط ۲۵ هزار پارامتر را آموزش میدهیم. تمام پارامترهای دیگر فیلترهای کانولوشنی سطح بالا از پیش آموزشدیده هستند. این خوب است، زیرا میتوانیم تعداد کمتری از پارامترها را با تعداد کمتری از نمونهها بهینهسازی کنیم.\n",
|
||||
"میتوانید مشاهده کنید که در حالی که تعداد کل پارامترها در شبکه ما حدود ۱۵ میلیون است، ما تنها در حال آموزش ۲۵ هزار پارامتر هستیم. بقیه پارامترهای فیلترهای کانولوشنی سطح بالایی پیشآموزشدیده هستند. این خوب است، زیرا میتوانیم تعداد کمتری پارامتر را با تعداد کمتری نمونه به خوبی تنظیم کنیم.\n",
|
||||
"\n",
|
||||
"حالا شبکه خود را آموزش میدهیم و میبینیم چقدر میتوانیم عملکرد خوبی داشته باشیم. انتظار زمان اجرای نسبتاً طولانی را داشته باشید و اگر به نظر میرسد اجرا برای مدتی متوقف شده است، نگران نشوید.\n"
|
||||
"حالا شبکه خود را آموزش میدهیم و میبینیم چقدر میتوانیم خوب عمل کنیم. انتظار زمان اجرای نسبتاً طولانی داشته باشید و نگران نشوید اگر اجرا برای مدتی به نظر میرسد که متوقف شده است.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -824,11 +835,11 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"به نظر میرسد که ما یک دستهبند نسبتاً دقیق برای گربهها و سگها به دست آوردهایم!\n",
|
||||
"به نظر میرسد که ما یک طبقهبند نسبتاً دقیق برای تشخیص گربه در مقابل سگها به دست آوردهایم!\n",
|
||||
"\n",
|
||||
"## ذخیره و بارگذاری مدل\n",
|
||||
"## ذخیرهسازی و بارگذاری مدل\n",
|
||||
"\n",
|
||||
"پس از آموزش مدل، میتوانیم معماری مدل و وزنهای آموزشدیده را برای استفادههای آینده در یک فایل ذخیره کنیم:\n"
|
||||
"پس از اینکه مدل را آموزش دادیم، میتوانیم ساختار مدل و وزنهای آموزشدیده را در فایلی ذخیره کنیم تا در آینده مورد استفاده قرار گیرد:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -852,7 +863,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"ما میتوانیم مدل را در هر زمان از فایل بارگذاری کنیم. ممکن است این کار در صورتی که آزمایش بعدی مدل را خراب کند مفید باشد - شما مجبور نخواهید بود از ابتدا شروع کنید.\n"
|
||||
"سپس میتوانیم مدل را در هر زمان از فایل بارگذاری کنیم. این ممکن است زمانی مفید باشد که آزمایش بعدی مدل را خراب کند - در این صورت نیازی به شروع دوباره از ابتدا نخواهید داشت.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -868,15 +879,15 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## تنظیم دقیق یادگیری انتقالی\n",
|
||||
"## انتقال یادگیری با تنظیم دقیق \n",
|
||||
"\n",
|
||||
"در بخش قبلی، لایه نهایی طبقهبندیکننده را برای دستهبندی تصاویر در مجموعه داده خودمان آموزش دادیم. با این حال، استخراجکننده ویژگیها را دوباره آموزش ندادیم و مدل ما به ویژگیهایی که از دادههای ImageNet یاد گرفته بود، متکی بود. اگر اشیای شما از نظر ظاهری با تصاویر معمولی ImageNet متفاوت باشند، این ترکیب ویژگیها ممکن است بهترین عملکرد را نداشته باشد. بنابراین منطقی است که آموزش لایههای کانولوشنی را نیز آغاز کنیم.\n",
|
||||
"در بخش قبلی، لایه نهایی طبقهبند را برای طبقهبندی تصاویر در مجموعه داده خودمان آموزش دادیم. با این حال، ما استخراجکننده ویژگیها را مجدداً آموزش ندادیم و مدل ما به ویژگیهایی که مدل روی دادههای ImageNet یاد گرفته بود، وابسته بود. اگر اشیاء شما از نظر بصری با تصاویر معمول ImageNet تفاوت داشته باشند، این ترکیب ویژگیها ممکن است بهترین عملکرد را نداشته باشد. بنابراین منطقی است که آموزش لایههای کانولوشنی را نیز شروع کنیم. \n",
|
||||
"\n",
|
||||
"برای این کار، میتوانیم پارامترهای فیلتر کانولوشنی که قبلاً قفل کرده بودیم را باز کنیم.\n",
|
||||
"برای این کار، میتوانیم پارامترهای فیلترهای کانولوشنی را که قبلاً منجمد کرده بودیم، آزاد کنیم. \n",
|
||||
"\n",
|
||||
"> **توجه:** مهم است که ابتدا پارامترها را قفل کنید و چندین دوره آموزشی را برای تثبیت وزنها در لایه طبقهبندی انجام دهید. اگر بلافاصله آموزش شبکه انتها به انتها را با پارامترهای بازشده شروع کنید، احتمالاً خطاهای بزرگ وزنهای از پیش آموزشدیده در لایههای کانولوشنی را از بین میبرند.\n",
|
||||
"> **توجه:** مهم است که ابتدا پارامترها را منجمد کنید و چند دوره آموزش انجام دهید تا وزنها در لایه طبقهبندی پایدار شوند. اگر بلافاصله آموزش شبکه انتها به انتها با پارامترهای آزاد را شروع کنید، خطاهای بزرگ احتمالاً وزنهای آموزشدیده در لایههای کانولوشنی را از بین میبرند. \n",
|
||||
"\n",
|
||||
"مدل کانولوشنی VGG-16 ما در لایه اول قرار دارد و خود شامل لایههای متعددی است. میتوانیم نگاهی به ساختار آن بیندازیم:\n"
|
||||
"مدل کانولوشنی VGG-16 ما در داخل لایه اول قرار دارد و خود شامل لایههای متعددی است. میتوانیم ساختار آن را بررسی کنیم: \n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -945,7 +956,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"ما میتوانیم تمام لایههای پایه کانولوشن را از حالت انجماد خارج کنیم:\n"
|
||||
"ما میتوانیم تمام لایههای پایهی کانولوشنی را از حالت قفل خارج کنیم:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -961,7 +972,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"با این حال، باز کردن قفل همه آنها به طور همزمان بهترین ایده نیست. ابتدا میتوانیم فقط چند لایه نهایی از کانولوشنها را باز کنیم، زیرا آنها شامل الگوهای سطح بالاتری هستند که برای تصاویر ما مرتبط هستند. به عنوان مثال، برای شروع، میتوانیم همه لایهها را به جز ۴ لایه آخر قفل کنیم:\n"
|
||||
"با این حال، همزمان باز کردن قفل همه آنها ایدهٔ خوبی نیست. ابتدا میتوانیم فقط چند لایه پایانی کانولوشنها را باز کنیم، زیرا آنها الگوهای سطح بالاتری را شامل میشوند که برای تصاویر ما مرتبط هستند. به عنوان مثال، برای شروع، میتوانیم همه لایهها را به جز ۴ لایه آخر فریز کنیم: \n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1000,11 +1011,11 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"تعداد پارامترهای قابل آموزش به طور قابل توجهی افزایش یافته است، اما همچنان حدود ۵۰٪ از کل پارامترها را تشکیل میدهد.\n",
|
||||
"توجه کنید که تعداد پارامترهای قابل آموزش به طور قابل توجهی افزایش یافته است، اما هنوز حدود ۵۰٪ از کل پارامترها است.\n",
|
||||
"\n",
|
||||
"پس از باز کردن قفل لایهها، میتوانیم چند دوره آموزشی دیگر انجام دهیم (در مثال ما، فقط یک دوره انجام خواهیم داد). همچنین میتوانید نرخ یادگیری کمتری انتخاب کنید تا تأثیر بر وزنهای از پیش آموزشدیده کاهش یابد. با این حال، حتی با نرخ یادگیری پایین، انتظار میرود که دقت در ابتدای آموزش کاهش یابد، تا اینکه در نهایت به سطحی کمی بالاتر از حالت وزنهای ثابت برسد.\n",
|
||||
"پس از آزادسازی قفل، میتوانیم چند دوره آموزش بیشتر انجام دهیم (در مثال ما، فقط یکی انجام میدهیم). همچنین میتوانید نرخ یادگیری کمتری انتخاب کنید تا تاثیر روی وزنهای از پیش آموزشدیده را به حداقل برسانید. با این حال، حتی با نرخ یادگیری پایین، انتظار میرود دقت در ابتدای آموزش کاهش یابد، تا زمانی که در نهایت به سطحی کمی بالاتر از حالت وزنهای ثابت برسد.\n",
|
||||
"\n",
|
||||
"> **توجه:** این آموزش بسیار کندتر انجام میشود، زیرا باید گرادیانها را از طریق لایههای زیادی از شبکه به عقب منتقل کنیم!\n"
|
||||
"> **توجه:** این آموزش بسیار کندتر انجام میشود، زیرا باید گرادیانها را از طریق لایههای متعدد شبکه به عقب منتقل کنیم!\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1028,18 +1039,18 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"ما احتمالاً به دقت بالاتری در آموزش دست پیدا میکنیم، زیرا از شبکهای قدرتمندتر با تعداد پارامترهای بیشتر استفاده میکنیم، اما دقت اعتبارسنجی به همان اندازه افزایش نخواهد یافت.\n",
|
||||
"احتمالاً به دقت بالاتری در آموزش دست پیدا میکنیم، زیرا از شبکه قدرتمندتری با پارامترهای بیشتر استفاده میکنیم، اما دقت اعتبارسنجی به همان اندازه افزایش پیدا نمیکند.\n",
|
||||
"\n",
|
||||
"میتوانید چند لایه دیگر از شبکه را آزاد کنید و بیشتر آموزش دهید تا ببینید آیا میتوانید به دقت بالاتری دست پیدا کنید!\n"
|
||||
"آزادانه چند لایه بیشتر از شبکه را باز کنید و بیشتر آموزش دهید، تا ببینید آیا میتوانید به دقت بالاتری برسید!\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## مدلهای دیگر بینایی کامپیوتری\n",
|
||||
"## مدلهای دیگر بینایی ماشین \n",
|
||||
"\n",
|
||||
"VGG-16 یکی از سادهترین معماریهای بینایی کامپیوتری است. Keras شبکههای پیشآموزشیافته بیشتری ارائه میدهد. از میان اینها، معماریهای **ResNet** که توسط مایکروسافت توسعه داده شدهاند و **Inception** از گوگل، بیشترین استفاده را دارند. به عنوان مثال، بیایید معماری سادهترین مدل ResNet-50 را بررسی کنیم (ResNet خانوادهای از مدلها با عمقهای مختلف است، اگر میخواهید ببینید یک مدل واقعاً عمیق چگونه است، میتوانید با ResNet-152 آزمایش کنید):\n"
|
||||
"VGG-16 یکی از سادهترین معماریهای بینایی ماشین است. کرِراس شبکههای پیشآموزشدیده زیادی را ارائه میدهد. از میان آنها، معماریهای **ResNet** که توسط مایکروسافت توسعه یافتهاند و **Inception** از گوگل بیشترین استفاده را دارند. به عنوان مثال، اجازه دهید به معماری سادهترین مدل ResNet-50 نگاهی بیندازیم (ResNet خانوادهای از مدلها با عمقهای مختلف است، اگر میخواهید ببینید یک مدل واقعاً عمیق چگونه است، میتوانید با ResNet-152 آزمایش کنید): \n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1441,29 +1452,29 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"همانطور که مشاهده میکنید، مدل شامل همان اجزای آشنای قبلی است: لایههای کانولوشن، لایههای pooling و در نهایت یک طبقهبند متراکم. ما میتوانیم از این مدل دقیقاً به همان شیوهای که از VGG-16 برای یادگیری انتقالی استفاده میکردیم، بهره ببریم. شما میتوانید با کد بالا آزمایش کنید، از مدلهای مختلف ResNet به عنوان مدل پایه استفاده کنید و ببینید که دقت چگونه تغییر میکند.\n",
|
||||
"همانطور که میبینید، مدل شامل همان بلوکهای سازنده آشنا است: لایههای کانولوشنی، لایههای پولینگ و طبقهبند نهایی متراکم. ما میتوانیم از این مدل دقیقاً به همان روشی که از VGG-16 برای یادگیری انتقالی استفاده میکردیم، استفاده کنیم. شما میتوانید با استفاده از مدلهای مختلف ResNet به عنوان مدل پایه، کد بالا را آزمایش کرده و ببینید دقت چگونه تغییر میکند.\n",
|
||||
"\n",
|
||||
"## نرمالسازی دستهای\n",
|
||||
"## نرمالسازی دستهای (Batch Normalization)\n",
|
||||
"\n",
|
||||
"این شبکه شامل نوع دیگری از لایهها است: **نرمالسازی دستهای**. ایده نرمالسازی دستهای این است که مقادیر عبوری از شبکه عصبی را به بازه مناسب بیاورد. معمولاً شبکههای عصبی زمانی بهترین عملکرد را دارند که تمام مقادیر در بازه [-1,1] یا [0,1] باشند، و به همین دلیل است که دادههای ورودی خود را مقیاسبندی/نرمالسازی میکنیم. با این حال، در طول آموزش یک شبکه عمیق، ممکن است مقادیر به طور قابل توجهی از این بازه خارج شوند، که این موضوع آموزش را مشکلساز میکند. لایه نرمالسازی دستهای میانگین و انحراف معیار تمام مقادیر minibatch فعلی را محاسبه میکند و از آنها برای نرمالسازی سیگنال قبل از عبور از یک لایه شبکه عصبی استفاده میکند. این کار به طور قابل توجهی پایداری شبکههای عمیق را بهبود میبخشد.\n"
|
||||
"این شبکه شامل نوع دیگری از لایهها است: **نرمالسازی دستهای**. ایده نرمالسازی دستهای این است که مقادیری که از طریق شبکه عصبی عبور میکنند را به بازه مناسب برساند. معمولاً شبکههای عصبی وقتی بهترین عملکرد را دارند که تمام مقادیر در بازه [-1,1] یا [0,1] باشند، و به همین دلیل دادههای ورودی خود را متناسب مقیاسبندی/نرمال میکنیم. با این حال، در طول آموزش یک شبکه عمیق، ممکن است مقادیر به طور قابل توجهی از این بازه خارج شوند که این موضوع آموزش را مشکلساز میکند. لایه نرمالسازی دستهای میانگین و انحراف معیار تمام مقادیر مینیدسته جاری را محاسبه و از آنها برای نرمالسازی سیگنال قبل از عبور آن از لایه شبکه عصبی استفاده میکند. این کار پایداری شبکههای عمیق را به طور قابل توجهی بهبود میبخشد.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## نکات کلیدی\n",
|
||||
"## نکات مهم\n",
|
||||
"\n",
|
||||
"با استفاده از یادگیری انتقالی، توانستیم به سرعت یک دستهبند برای وظیفه دستهبندی اشیای سفارشی خود ایجاد کنیم و به دقت بالایی دست یابیم. با این حال، این مثال کاملاً منصفانه نبود، زیرا شبکه اصلی VGG-16 از قبل برای شناسایی گربهها و سگها آموزش دیده بود و بنابراین ما بیشتر الگوهایی را که از قبل در شبکه وجود داشت، مجدداً استفاده کردیم. میتوانید انتظار داشته باشید که دقت کمتری در مورد اشیای خاصتر و غیرمعمول، مانند جزئیات خط تولید در یک کارخانه یا برگهای مختلف درختان، داشته باشید.\n",
|
||||
"با استفاده از یادگیری انتقالی، توانستیم به سرعت یک طبقهبند برای وظیفه طبقهبندی اشیاء سفارشی خود بسازیم و دقت بالایی کسب کنیم. با این حال، این مثال کاملاً منصفانه نبود، زیرا شبکه اصلی VGG-16 از قبل برای شناخت گربهها و سگها آموزش دیده بود و در نتیجه ما بیشتر الگوهایی را که قبلاً در شبکه وجود داشتند، دوباره استفاده کردیم. میتوانید دقت کمتری را در اشیاء تخصصیتر و خاص حوزه، مانند جزئیات روی خط تولید در یک کارخانه یا برگهای درختان مختلف انتظار داشته باشید.\n",
|
||||
"\n",
|
||||
"میتوانید ببینید که وظایف پیچیدهتری که اکنون در حال حل آنها هستیم، به توان محاسباتی بالاتری نیاز دارند و به راحتی نمیتوان آنها را روی CPU حل کرد. در واحد بعدی، سعی خواهیم کرد از یک پیادهسازی سبکتر برای آموزش همان مدل با استفاده از منابع محاسباتی کمتر استفاده کنیم، که نتیجه آن فقط کمی دقت کمتر خواهد بود.\n"
|
||||
"میتوانید ببینید که وظایف پیچیدهتری که اکنون حل میکنیم به قدرت محاسباتی بیشتری نیاز دارند و به آسانی روی CPU قابل حل نیستند. در واحد بعدی، تلاش خواهیم کرد با استفاده از پیادهسازی سبکتر، همان مدل را با منابع محاسباتی کمتر آموزش دهیم که منجر به دقت کمی پایینتر میشود.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**سلب مسئولیت**: \nاین سند با استفاده از سرویس ترجمه هوش مصنوعی [Co-op Translator](https://github.com/Azure/co-op-translator) ترجمه شده است. در حالی که ما تلاش میکنیم دقت را حفظ کنیم، لطفاً توجه داشته باشید که ترجمههای خودکار ممکن است شامل خطاها یا نادرستیها باشند. سند اصلی به زبان اصلی آن باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حساس، توصیه میشود از ترجمه حرفهای انسانی استفاده کنید. ما مسئولیتی در قبال سوء تفاهمها یا تفسیرهای نادرست ناشی از استفاده از این ترجمه نداریم.\n"
|
||||
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**سلب مسئولیت**:\nاین سند با استفاده از سرویس ترجمه هوش مصنوعی [Co-op Translator](https://github.com/Azure/co-op-translator) ترجمه شده است. در حالی که ما در تلاش برای دقت هستیم، لطفاً توجه داشته باشید که ترجمههای خودکار ممکن است شامل خطاها یا نادرستیهایی باشند. سند اصلی به زبان مادری خود باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حیاتی، ترجمه حرفهای انسانی توصیه میشود. ما در قبال هرگونه سوء تفاهم یا برداشت نادرست ناشی از استفاده از این ترجمه مسئولیتی نداریم.\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
|
|
@ -1484,12 +1495,6 @@
|
|||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.8.10"
|
||||
},
|
||||
"coopTranslator": {
|
||||
"original_hash": "c189abc107848f96051085cc30945129",
|
||||
"translation_date": "2025-08-31T16:00:49+00:00",
|
||||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb",
|
||||
"language_code": "fa"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
|
|
|||
|
|
@ -1,69 +1,73 @@
|
|||
# پردازش زبان طبیعی
|
||||
|
||||

|
||||

|
||||
|
||||
در این بخش، ما بر استفاده از شبکههای عصبی برای انجام وظایف مرتبط با **پردازش زبان طبیعی (NLP)** تمرکز خواهیم کرد. مسائل زیادی در NLP وجود دارد که میخواهیم کامپیوترها قادر به حل آنها باشند:
|
||||
در این بخش، تمرکز ما بر استفاده از شبکههای عصبی برای انجام وظایف مرتبط با **پردازش زبان طبیعی (NLP)** خواهد بود. مشکلات زیادی در NLP وجود دارند که میخواهیم کامپیوترها قادر به حل آنها باشند:
|
||||
|
||||
* **طبقهبندی متن** یک مسئله طبقهبندی معمولی مربوط به توالیهای متنی است. مثالها شامل طبقهبندی پیامهای ایمیل به عنوان اسپم یا غیر اسپم، یا دستهبندی مقالات به موضوعاتی مانند ورزش، تجارت، سیاست و غیره است. همچنین، هنگام توسعه چتباتها، اغلب نیاز داریم بفهمیم کاربر چه چیزی میخواهد بگوید -- در این حالت با **طبقهبندی نیت** سروکار داریم. در طبقهبندی نیت، اغلب باید با دستهبندیهای زیادی کار کنیم.
|
||||
* **تحلیل احساسات** یک مسئله رگرسیون معمولی است، جایی که باید عددی (یک احساس) را نسبت دهیم که نشاندهنده مثبت یا منفی بودن معنای یک جمله باشد. نسخه پیشرفتهتر تحلیل احساسات، **تحلیل احساسات مبتنی بر جنبه** (ABSA) است، جایی که احساسات را نه به کل جمله، بلکه به بخشهای مختلف آن (جنبهها) نسبت میدهیم، مثلاً: *در این رستوران، من غذا را دوست داشتم، اما جو وحشتناک بود*.
|
||||
* **شناسایی موجودیتهای نامدار** (NER) به مسئله استخراج موجودیتهای خاص از متن اشاره دارد. برای مثال، ممکن است نیاز داشته باشیم بفهمیم که در عبارت *من باید فردا به پاریس پرواز کنم* کلمه *فردا* به تاریخ اشاره دارد و *پاریس* یک مکان است.
|
||||
* **استخراج کلمات کلیدی** مشابه NER است، اما باید کلمات مهم برای معنای جمله را به صورت خودکار استخراج کنیم، بدون آموزش قبلی برای انواع خاص موجودیتها.
|
||||
* **خوشهبندی متن** میتواند زمانی مفید باشد که بخواهیم جملات مشابه را گروهبندی کنیم، مثلاً درخواستهای مشابه در مکالمات پشتیبانی فنی.
|
||||
* **پاسخ به سوالات** به توانایی یک مدل برای پاسخ دادن به یک سوال خاص اشاره دارد. مدل یک متن و یک سوال را به عنوان ورودی دریافت میکند و باید مکانی در متن که پاسخ سوال در آن قرار دارد را ارائه دهد (یا گاهی اوقات، متن پاسخ را تولید کند).
|
||||
* **تولید متن** توانایی یک مدل برای تولید متن جدید است. این میتواند به عنوان یک مسئله طبقهبندی در نظر گرفته شود که حرف/کلمه بعدی را بر اساس یک *متن اولیه* پیشبینی میکند. مدلهای پیشرفته تولید متن، مانند GPT-3، قادر به حل وظایف دیگر NLP مانند طبقهبندی با استفاده از تکنیکی به نام [برنامهنویسی با پرامپت](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) یا [مهندسی پرامپت](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29) هستند.
|
||||
* **خلاصهسازی متن** تکنیکی است که در آن میخواهیم کامپیوتر متن طولانی را "بخواند" و آن را در چند جمله خلاصه کند.
|
||||
* **ترجمه ماشینی** میتواند به عنوان ترکیبی از درک متن در یک زبان و تولید متن در زبان دیگر در نظر گرفته شود.
|
||||
* **دستهبندی متن** یک مسئله دستهبندی معمولی مربوط به دنبالههای متنی است. مثالها شامل دستهبندی ایمیلها به اسپم یا غیر اسپم، یا دستهبندی مقالات به دستههای ورزشی، کسبوکار، سیاست و غیره است. همچنین، هنگام توسعه چتباتها، اغلب نیاز داریم بفهمیم کاربر چه منظوری داشته است -- در این حالت با **دستهبندی هدف** (intent classification) مواجه هستیم. اغلب در دستهبندی هدف با تعداد زیادی دسته سر و کار داریم.
|
||||
* **تحلیل احساسات** یک مسئله رگرسیون معمولی است، جایی که باید عددی (احساس) معادل با مثبت یا منفی بودن معنای جمله را نسبت دهیم. نسخه پیشرفتهتر تحلیل احساسات، **تحلیل احساسات مبتنی بر جنبه** (ABSA) است، که در آن احساس را نه به کل جمله، بلکه به بخشهای مختلف آن (جنبهها) نسبت میدهیم، مثلاً *در این رستوران، من از غذا خوشم آمد، اما جو آن افتضاح بود*.
|
||||
* **شناسایی موجودیتهای اسمی** (NER) به مسئله استخراج موجودیتهای خاص از متن اشاره دارد. به طور مثال، ممکن است نیاز داشته باشیم بفهمیم در عبارت *من باید فردا به پاریس پرواز کنم* کلمه *فردا* به تاریخ اشاره دارد و *پاریس* یک مکان است.
|
||||
* **استخراج کلمات کلیدی** مشابه NER است، اما باید بهطور خودکار کلمات مهم در معنی جمله را بدون آموزش قبلی برای نوع خاص موجودیت استخراج کنیم.
|
||||
* **خوشهبندی متن** میتواند زمانی مفید باشد که بخواهیم جملات مشابه را گروهبندی کنیم، مثلاً درخواستهای مشابه در گفتگوهای پشتیبانی فنی.
|
||||
* **پاسخگویی به سوالات** به توانایی مدل در پاسخ دادن به یک سوال خاص اشاره دارد. مدل یک قطعه متن و یک سوال به عنوان ورودی دریافت میکند و باید جایی در متن که پاسخ سوال در آن وجود دارد را مشخص کند (یا گاهی پاسخ را تولید کند).
|
||||
* **تولید متن** توانایی مدل برای تولید متن جدید است. این میتواند به عنوان یک مسئله دستهبندی در نظر گرفته شود که حرف یا کلمه بعدی را بر اساس یک *ورودی متنی* پیشبینی میکند. مدلهای پیشرفته تولید متن مانند GPT-3 قادرند سایر وظایف NLP مثل دستهبندی را با استفاده از تکنیکی به نام [برنامهنویسی ورودی](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) یا [مهندسی ورودی](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29) انجام دهند.
|
||||
* **خلاصهسازی متن** روشی است که در آن میخواهیم کامپیوتر متن طولانی را "بخواند" و در چند جمله خلاصه کند.
|
||||
* **ترجمه ماشینی** میتواند ترکیبی از درک متن به یک زبان و تولید متن به زبان دیگر باشد.
|
||||
|
||||
در ابتدا، بیشتر وظایف NLP با استفاده از روشهای سنتی مانند گرامرها حل میشدند. برای مثال، در ترجمه ماشینی از تجزیهکنندهها برای تبدیل جمله اولیه به یک درخت نحوی استفاده میشد، سپس ساختارهای معنایی سطح بالاتر استخراج میشدند تا معنای جمله را نشان دهند، و بر اساس این معنا و گرامر زبان هدف، نتیجه تولید میشد. امروزه، بسیاری از وظایف NLP به طور موثرتری با استفاده از شبکههای عصبی حل میشوند.
|
||||
در ابتدا، بیشتر وظایف NLP با روشهای سنتی مانند گرامرها حل میشدند. مثلاً در ترجمه ماشینی از تجزیهکنندهها برای تبدیل جمله اولیه به درخت نحوی استفاده میشد، سپس ساختارهای معنایی سطح بالاتر استخراج میشدند تا معنای جمله را نشان دهند، و بر اساس این معنا و دستور زبان زبان مقصد، نتیجه تولید میشد. امروزه بسیاری از وظایف NLP به طور مؤثرتری با استفاده از شبکههای عصبی حل میشوند.
|
||||
|
||||
> بسیاری از روشهای کلاسیک NLP در کتابخانه پایتون [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org) پیادهسازی شدهاند. یک [کتاب NLTK](https://www.nltk.org/book/) عالی به صورت آنلاین در دسترس است که توضیح میدهد چگونه وظایف مختلف NLP میتوانند با استفاده از NLTK حل شوند.
|
||||
> بسیاری از روشهای کلاسیک NLP در کتابخانه پایتون [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org) پیادهسازی شدهاند. کتاب بسیار خوبی به نام [کتاب NLTK](https://www.nltk.org/book/) به صورت آنلاین موجود است که نحوه حل وظایف مختلف NLP با استفاده از NLTK را پوشش میدهد.
|
||||
|
||||
در دوره ما، بیشتر بر استفاده از شبکههای عصبی برای NLP تمرکز خواهیم کرد و در صورت نیاز از NLTK استفاده خواهیم کرد.
|
||||
در دوره ما، عمدتاً بر استفاده از شبکههای عصبی برای NLP تمرکز خواهیم کرد و در صورت نیاز از NLTK استفاده خواهیم کرد.
|
||||
|
||||
ما قبلاً درباره استفاده از شبکههای عصبی برای کار با دادههای جدولی و تصاویر یاد گرفتهایم. تفاوت اصلی بین این نوع دادهها و متن این است که متن یک توالی با طول متغیر است، در حالی که اندازه ورودی در مورد تصاویر از قبل مشخص است. در حالی که شبکههای کانولوشنی میتوانند الگوها را از دادههای ورودی استخراج کنند، الگوها در متن پیچیدهتر هستند. به عنوان مثال، ممکن است نفی از موضوع با کلمات زیادی جدا شود (مثلاً *من پرتقال دوست ندارم* در مقابل *من آن پرتقالهای بزرگ رنگارنگ خوشمزه را دوست ندارم*)، و این باید همچنان به عنوان یک الگو تفسیر شود. بنابراین، برای پردازش زبان نیاز داریم که انواع جدیدی از شبکههای عصبی، مانند *شبکههای بازگشتی* و *ترانسفورمرها* را معرفی کنیم.
|
||||
قبلاً درباره استفاده از شبکههای عصبی برای دادههای جدولی و تصاویر آموختهایم. تفاوت اصلی بین این نوع دادهها و متن این است که متن یک دنباله با طول متغیر است، در حالی که اندازه ورودی در مورد تصاویر از پیش مشخص است. در حالی که شبکههای کانولوشنال میتوانند الگوهایی را از دادههای ورودی استخراج کنند، الگوها در متن پیچیدهترند. مثلاً، نفی ممکن است از موضوع جمله با کلمات زیادی جدا باشد (مثلاً *من پرتقال را دوست ندارم* در مقابل *من آن پرتقالهای بزرگ رنگی خوشمزه را دوست ندارم ندارم*) و این باید همچنان به عنوان یک الگو تفسیر شود. بنابراین، برای پردازش زبان نیاز به معرفی انواع جدیدی از شبکههای عصبی مانند *شبکههای بازگشتی* و *ترنسفورمرها* داریم.
|
||||
|
||||
## نصب کتابخانهها
|
||||
|
||||
اگر از نصب محلی پایتون برای اجرای این دوره استفاده میکنید، ممکن است نیاز داشته باشید تمام کتابخانههای مورد نیاز برای NLP را با استفاده از دستورات زیر نصب کنید:
|
||||
اگر از نصب محلی پایتون برای اجرای این دوره استفاده میکنید، ممکن است نیاز به نصب تمام کتابخانههای مورد نیاز برای NLP با استفاده از دستورات زیر داشته باشید:
|
||||
|
||||
**برای PyTorch**
|
||||
**برای PyTorch**
|
||||
```bash
|
||||
pip install -r requirements-torch.txt
|
||||
```
|
||||
**برای TensorFlow**
|
||||
pip install -r requirements-pytorch.txt
|
||||
```
|
||||
**برای TensorFlow**
|
||||
```bash
|
||||
pip install -r requirements-tf.txt
|
||||
```
|
||||
```
|
||||
|
||||
> میتوانید NLP با TensorFlow را در [Microsoft Learn](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste) امتحان کنید.
|
||||
> میتوانید NLP را با TensorFlow در [Microsoft Learn](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste) امتحان کنید
|
||||
|
||||
## هشدار GPU
|
||||
|
||||
در این بخش، در برخی از مثالها مدلهای نسبتاً بزرگی را آموزش خواهیم داد.
|
||||
* **استفاده از کامپیوتر مجهز به GPU**: توصیه میشود نوتبوکهای خود را روی کامپیوتری که از GPU پشتیبانی میکند اجرا کنید تا زمان انتظار هنگام کار با مدلهای بزرگ کاهش یابد.
|
||||
* **محدودیتهای حافظه GPU**: اجرای روی GPU ممکن است منجر به موقعیتهایی شود که حافظه GPU شما تمام شود، به ویژه هنگام آموزش مدلهای بزرگ.
|
||||
* **مصرف حافظه GPU**: مقدار حافظه GPU مصرفشده در طول آموزش به عوامل مختلفی از جمله اندازه مینیبچ بستگی دارد.
|
||||
* **کاهش اندازه مینیبچ**: اگر با مشکلات حافظه GPU مواجه شدید، کاهش اندازه مینیبچ در کد خود را به عنوان یک راهحل احتمالی در نظر بگیرید.
|
||||
* **آزادسازی حافظه GPU در TensorFlow**: نسخههای قدیمیتر TensorFlow ممکن است حافظه GPU را به درستی آزاد نکنند، به ویژه هنگام آموزش چندین مدل در یک کرنل پایتون. برای مدیریت موثر استفاده از حافظه GPU، میتوانید TensorFlow را طوری پیکربندی کنید که حافظه GPU را فقط در صورت نیاز تخصیص دهد.
|
||||
* **اضافه کردن کد**: برای تنظیم TensorFlow به گونهای که تخصیص حافظه GPU فقط در صورت نیاز انجام شود، کد زیر را در نوتبوکهای خود قرار دهید:
|
||||
در این بخش، در برخی از نمونهها مدلهای نسبتاً بزرگی آموزش داده میشوند.
|
||||
* **استفاده از کامپیوتر دارای GPU**: توصیه میشود نتبوکهای خود را روی کامپیوتری با GPU اجرا کنید تا زمان انتظار در کار با مدلهای بزرگ کاهش یابد.
|
||||
* **محدودیت حافظه GPU**: اجرای مدل روی GPU ممکن است به موقعیتهایی منجر شود که حافظه GPU پر شود، مخصوصاً هنگام آموزش مدلهای بزرگ.
|
||||
* **مصرف حافظه GPU**: میزان مصرف حافظه GPU در حین آموزش به عوامل مختلفی بستگی دارد، از جمله اندازه مینیبچ.
|
||||
* **کاهش اندازه مینیبچ**: اگر با مشکلات حافظه GPU مواجه شدید، کاهش اندازه مینیبچ در کد خود را به عنوان راهحلی در نظر بگیرید.
|
||||
* **آزادسازی حافظه GPU در TensorFlow**: نسخههای قدیمیتر TensorFlow ممکن است حافظه GPU را بهدرستی هنگام آموزش چند مدل در یک کرنل پایتون آزاد نکنند. برای مدیریت بهینه استفاده از حافظه GPU میتوانید TensorFlow را طوری تنظیم کنید که حافظه GPU فقط در صورت نیاز تخصیص داده شود.
|
||||
* **گنجاندن کد**: برای تنظیم TensorFlow به گونهای که حافظه GPU فقط زمانی بیشتر تخصیص داده شود که نیاز است، کد زیر را در نتبوکهای خود بگنجانید:
|
||||
|
||||
```python
|
||||
physical_devices = tf.config.list_physical_devices('GPU')
|
||||
if len(physical_devices)>0:
|
||||
tf.config.experimental.set_memory_growth(physical_devices[0], True)
|
||||
```
|
||||
```
|
||||
|
||||
اگر علاقهمند به یادگیری NLP از دیدگاه یادگیری ماشین کلاسیک هستید، به [این مجموعه درسها](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP) مراجعه کنید.
|
||||
اگر علاقهمند به یادگیری NLP از دیدگاه کلاسیک یادگیری ماشین هستید، به [این مجموعه درسها](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP) مراجعه کنید
|
||||
|
||||
## در این بخش
|
||||
در این بخش درباره موضوعات زیر یاد خواهیم گرفت:
|
||||
در این بخش درباره موارد زیر خواهیم آموخت:
|
||||
|
||||
* [نمایش متن به صورت تنسورها](13-TextRep/README.md)
|
||||
* [تعبیه کلمات](14-Emdeddings/README.md)
|
||||
* [مدلسازی زبان](15-LanguageModeling/README.md)
|
||||
* [شبکههای عصبی بازگشتی](16-RNN/README.md)
|
||||
* [شبکههای مولد](17-GenerativeNetworks/README.md)
|
||||
* [ترانسفورمرها](18-Transformers/README.md)
|
||||
* [نمایش متن به صورت تنسورها](13-TextRep/README.md)
|
||||
* [توکارگذاری کلمات](14-Emdeddings/README.md)
|
||||
* [مدلسازی زبان](15-LanguageModeling/README.md)
|
||||
* [شبکههای عصبی بازگشتی](16-RNN/README.md)
|
||||
* [شبکههای مولد](17-GenerativeNetworks/README.md)
|
||||
* [ترنسفورمرها](18-Transformers/README.md)
|
||||
|
||||
**سلب مسئولیت**:
|
||||
این سند با استفاده از سرویس ترجمه هوش مصنوعی [Co-op Translator](https://github.com/Azure/co-op-translator) ترجمه شده است. در حالی که ما تلاش میکنیم دقت را حفظ کنیم، لطفاً توجه داشته باشید که ترجمههای خودکار ممکن است حاوی خطاها یا نادرستیهایی باشند. سند اصلی به زبان اصلی آن باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حساس، ترجمه حرفهای انسانی توصیه میشود. ما هیچ مسئولیتی در قبال سوءتفاهمها یا تفسیرهای نادرست ناشی از استفاده از این ترجمه نداریم.
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**سلب مسئولیت**:
|
||||
این سند با استفاده از سرویس ترجمه هوش مصنوعی [Co-op Translator](https://github.com/Azure/co-op-translator) ترجمه شده است. در حالی که ما در تلاش برای دقت هستیم، لطفاً توجه داشته باشید که ترجمههای خودکار ممکن است شامل خطاها یا نادرستیهایی باشند. سند اصلی به زبان مادری خود باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حیاتی، ترجمه حرفهای انسانی توصیه میشود. ما در قبال هرگونه سوء تفاهم یا برداشت نادرست ناشی از استفاده از این ترجمه مسئولیتی نداریم.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -5,6 +5,12 @@
|
|||
"source_file": "AGENTS.md",
|
||||
"language_code": "ru"
|
||||
},
|
||||
"CONTRIBUTING.md": {
|
||||
"original_hash": "c6fd7e781b67111a90abd166d0ce4aa0",
|
||||
"translation_date": "2026-07-08T21:37:26+00:00",
|
||||
"source_file": "CONTRIBUTING.md",
|
||||
"language_code": "ru"
|
||||
},
|
||||
"README.md": {
|
||||
"original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b",
|
||||
"translation_date": "2026-04-06T21:11:39+00:00",
|
||||
|
|
@ -17,6 +23,19 @@
|
|||
"source_file": "SECURITY.md",
|
||||
"language_code": "ru"
|
||||
},
|
||||
"__translation_failures__": {
|
||||
"lessons/sketchnotes/LICENSE.md": {
|
||||
"original_hash": "45ab63a2cd8f5faef6c9b150618837a4",
|
||||
"source_file": "lessons/sketchnotes/LICENSE.md",
|
||||
"language_code": "ru",
|
||||
"failure_date": "2026-07-08T21:26:59+00:00",
|
||||
"status": "failed",
|
||||
"error_type": "TranslationIncompleteError",
|
||||
"error_message": "Markdown translation remained incomplete for chunk 1.1.1 of 'LICENSE.md', and the chunk could not be split further.",
|
||||
"translator_version": "0.20.0",
|
||||
"failure_policy_version": 1
|
||||
}
|
||||
},
|
||||
"etc/CODE_OF_CONDUCT.md": {
|
||||
"original_hash": "c06b12caf3c901eb3156e3dd5b0aea56",
|
||||
"translation_date": "2025-08-26T06:51:51+00:00",
|
||||
|
|
@ -54,8 +73,8 @@
|
|||
"language_code": "ru"
|
||||
},
|
||||
"examples/README.md": {
|
||||
"original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7",
|
||||
"translation_date": "2025-10-03T11:26:42+00:00",
|
||||
"original_hash": "7883d52c2e2a221e0b07a7b112a149b9",
|
||||
"translation_date": "2026-07-08T21:22:27+00:00",
|
||||
"source_file": "examples/README.md",
|
||||
"language_code": "ru"
|
||||
},
|
||||
|
|
@ -66,8 +85,8 @@
|
|||
"language_code": "ru"
|
||||
},
|
||||
"lessons/0-course-setup/how-to-run.md": {
|
||||
"original_hash": "a4717bd9103b9f6cd84d534b83534689",
|
||||
"translation_date": "2026-01-15T10:56:41+00:00",
|
||||
"original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1",
|
||||
"translation_date": "2026-07-08T21:22:48+00:00",
|
||||
"source_file": "lessons/0-course-setup/how-to-run.md",
|
||||
"language_code": "ru"
|
||||
},
|
||||
|
|
@ -191,6 +210,12 @@
|
|||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md",
|
||||
"language_code": "ru"
|
||||
},
|
||||
"lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": {
|
||||
"original_hash": "99b816b6a4957ef4100cee4c4221dff9",
|
||||
"translation_date": "2026-07-08T21:18:49+00:00",
|
||||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb",
|
||||
"language_code": "ru"
|
||||
},
|
||||
"lessons/4-ComputerVision/08-TransferLearning/lab/README.md": {
|
||||
"original_hash": "7765935c35fcee69b9fe2d0cfd6963e2",
|
||||
"translation_date": "2025-08-26T06:44:12+00:00",
|
||||
|
|
@ -330,8 +355,8 @@
|
|||
"language_code": "ru"
|
||||
},
|
||||
"lessons/5-NLP/README.md": {
|
||||
"original_hash": "8ef02a9318257ea140ed3ed74442096d",
|
||||
"translation_date": "2025-08-26T06:34:51+00:00",
|
||||
"original_hash": "038df6f1a73e49f6430740da083bfd6d",
|
||||
"translation_date": "2026-07-08T21:23:14+00:00",
|
||||
"source_file": "lessons/5-NLP/README.md",
|
||||
"language_code": "ru"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -0,0 +1,29 @@
|
|||
# Вклад в AI-For-Beginners
|
||||
|
||||
Спасибо за ваш интерес к вкладу в AI-For-Beginners! Мы приветствуем переводы, исправления уроков и коррекции форматирования.
|
||||
|
||||
## Лицензионное соглашение участника Microsoft (CLA)
|
||||
|
||||
Этот проект принимает вклады и предложения. Для большинства вкладов требуется ваше согласие с Лицензионным соглашением участника (CLA), в котором вы подтверждаете, что имеете право и действительно предоставляете нам права на использование вашего вклада. Для подробностей посетите [https://cla.microsoft.com](https://cla.microsoft.com).
|
||||
|
||||
При отправке pull request, CLA-бот автоматически определит, необходимо ли вам предоставить CLA, и пометит PR соответствующим образом (например, ярлыком, комментарием). Просто следуйте указаниям бота. Вам потребуется сделать это лишь один раз во всех репозиториях, использующих наше CLA.
|
||||
|
||||
## Как внести вклад
|
||||
|
||||
### 1. Исправление опечаток / ошибок в коде
|
||||
Если вы обнаружите опечатку или ошибку в любом Jupyter notebook или markdown-файле урока:
|
||||
1. Форкните репозиторий.
|
||||
2. Исправьте опечатку или неработающую ссылку.
|
||||
3. Отправьте Pull Request с четким описанием исправления.
|
||||
|
||||
### 2. Отправка переводов
|
||||
Мы приветствуем переводы уроков на другие языки! Пожалуйста, размещайте переводы в каталоге `translations/`, используя существующие имена папок (например, `translations/es/`, `translations/pt-BR/`, `translations/zh-CN/`).
|
||||
|
||||
Для подробностей смотрите [etc/CONTRIBUTING.md](etc/CONTRIBUTING.md).
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**Отказ от ответственности**:
|
||||
Этот документ был переведен с использованием сервиса машинного перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Несмотря на наши усилия по обеспечению точности, имейте в виду, что автоматический перевод может содержать ошибки или неточности. Оригинальный документ на его исходном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется обратиться к профессиональному человеческому переводу. Мы не несем ответственности за любые недоразумения или неправильные толкования, возникшие в результате использования этого перевода.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -1,27 +1,27 @@
|
|||
# Примеры ИИ для начинающих
|
||||
|
||||
Добро пожаловать! Этот каталог содержит простые, автономные примеры, которые помогут вам начать изучение ИИ и машинного обучения. Каждый пример разработан с учетом потребностей начинающих, с подробными комментариями и пошаговыми объяснениями.
|
||||
Добро пожаловать! В этой папке содержатся простые, автономные примеры, которые помогут вам начать работу с искусственным интеллектом и машинным обучением. Каждый пример разработан с учётом начинающих — с подробными комментариями и пошаговыми объяснениями.
|
||||
|
||||
## 📚 Обзор примеров
|
||||
|
||||
| Пример | Описание | Сложность | Предварительные знания |
|
||||
|--------|----------|-----------|-------------------------|
|
||||
| [Hello AI World](../../../examples/01-hello-ai-world.py) | Ваша первая программа на ИИ — простое распознавание шаблонов | ⭐ Начинающий | Основы Python |
|
||||
| [Простая нейронная сеть](../../../examples/02-simple-neural-network.py) | Создание нейронной сети с нуля | ⭐⭐ Начинающий+ | Python, базовая математика |
|
||||
| [Классификатор изображений](./03-image-classifier.ipynb) | Классификация изображений с использованием предварительно обученной модели | ⭐⭐ Начинающий+ | Python, numpy |
|
||||
| [Анализ текста на тональность](../../../examples/04-text-sentiment.py) | Анализ тональности текста (положительный/отрицательный) | ⭐⭐ Начинающий+ | Python |
|
||||
|---------|-------------|------------|---------------|
|
||||
| [Hello AI World](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/01-hello-ai-world.py) | Ваша первая программа ИИ — простое распознавание шаблонов | ⭐ Начинающий | Основы Python |
|
||||
| [Simple Neural Network](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/02-simple-neural-network.py) | Постройте нейронную сеть с нуля | ⭐⭐ Начинающий+ | Python, базовая математика |
|
||||
| [Image Classifier](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/03-image-classifier.ipynb) | Классификация изображений с предварительно обученной моделью | ⭐⭐ Начинающий+ | Python, numpy |
|
||||
| [Text Sentiment](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/04-text-sentiment.py) | Анализ сентимента текста (положительный/отрицательный) | ⭐⭐ Начинающий+ | Python |
|
||||
|
||||
## 🚀 Начало работы
|
||||
|
||||
### Предварительные требования
|
||||
### Требования
|
||||
|
||||
Убедитесь, что у вас установлен Python (рекомендуется версия 3.8 или выше). Установите необходимые пакеты:
|
||||
|
||||
```bash
|
||||
# For Python scripts
|
||||
# Для скриптов на Python
|
||||
pip install numpy
|
||||
|
||||
# For Jupyter notebooks (image classifier)
|
||||
# Для блокнотов Jupyter (классификатор изображений)
|
||||
pip install jupyter numpy pillow tensorflow
|
||||
```
|
||||
|
||||
|
|
@ -34,52 +34,54 @@ conda activate ai4beg
|
|||
|
||||
### Запуск примеров
|
||||
|
||||
**Для Python-скриптов (.py файлы):**
|
||||
**Для скриптов Python (.py файлы):**
|
||||
```bash
|
||||
python 01-hello-ai-world.py
|
||||
```
|
||||
|
||||
**Для Jupyter-ноутбуков (.ipynb файлы):**
|
||||
**Для Jupyter ноутбуков (.ipynb файлы):**
|
||||
```bash
|
||||
jupyter notebook 03-image-classifier.ipynb
|
||||
```
|
||||
|
||||
## 📖 Путь обучения
|
||||
## 📖 Учебный путь
|
||||
|
||||
Мы рекомендуем проходить примеры по порядку:
|
||||
Рекомендуем проходить примеры в следующем порядке:
|
||||
|
||||
1. **Начните с "Hello AI World"** — изучите основы распознавания шаблонов
|
||||
2. **Создайте простую нейронную сеть** — поймите, как работают нейронные сети
|
||||
3. **Попробуйте классификатор изображений** — увидьте ИИ в действии с реальными изображениями
|
||||
4. **Анализируйте тональность текста** — исследуйте обработку естественного языка
|
||||
2. **Постройте простую нейронную сеть** — поймите, как работают нейронные сети
|
||||
3. **Попробуйте классификатор изображений** — увидьте ИИ в действии на реальных изображениях
|
||||
4. **Анализ Сентимента Текста** — изучите обработку естественного языка
|
||||
|
||||
## 💡 Советы для начинающих
|
||||
|
||||
- **Внимательно читайте комментарии в коде** — они объясняют, что делает каждая строка
|
||||
- **Экспериментируйте!** — попробуйте менять значения и наблюдайте за результатами
|
||||
- **Не переживайте, если что-то непонятно** — обучение требует времени
|
||||
- **Задавайте вопросы** — используйте [доску обсуждений](https://github.com/microsoft/AI-For-Beginners/discussions)
|
||||
- **Экспериментируйте!** — меняйте значения и смотрите, что происходит
|
||||
- **Не переживайте, если что-то не понятно сразу** — обучение требует времени
|
||||
- **Задавайте вопросы** — используйте [форум обсуждений](https://github.com/microsoft/AI-For-Beginners/discussions)
|
||||
|
||||
## 🔗 Следующие шаги
|
||||
|
||||
После завершения этих примеров изучите полный курс:
|
||||
После выполнения этих примеров изучите полный курс:
|
||||
- [Введение в ИИ](../lessons/1-Intro/README.md)
|
||||
- [Нейронные сети](../lessons/3-NeuralNetworks/README.md)
|
||||
- [Компьютерное зрение](../lessons/4-ComputerVision/README.md)
|
||||
- [Обработка естественного языка](../lessons/5-NLP/README.md)
|
||||
|
||||
## 🤝 Вклад
|
||||
## 🤝 Содействие
|
||||
|
||||
Эти примеры оказались полезными? Помогите нам их улучшить:
|
||||
Эти примеры были полезны? Помогите нам их улучшить:
|
||||
- Сообщайте о проблемах или предлагайте улучшения
|
||||
- Добавляйте больше примеров для начинающих
|
||||
- Улучшайте документацию и комментарии
|
||||
|
||||
---
|
||||
|
||||
*Помните: Каждый эксперт когда-то был новичком. Удачи в обучении! 🎓*
|
||||
*Помните: каждый эксперт когда-то был новичком. Успешного обучения! 🎓*
|
||||
|
||||
---
|
||||
|
||||
**Отказ от ответственности**:
|
||||
Этот документ был переведен с использованием сервиса автоматического перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Несмотря на наши усилия обеспечить точность, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его исходном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникшие в результате использования данного перевода.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**Отказ от ответственности**:
|
||||
Этот документ был переведен с использованием сервиса машинного перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Несмотря на наши усилия по обеспечению точности, имейте в виду, что автоматический перевод может содержать ошибки или неточности. Оригинальный документ на его исходном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется обратиться к профессиональному человеческому переводу. Мы не несем ответственности за любые недоразумения или неправильные толкования, возникшие в результате использования этого перевода.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -1,12 +1,12 @@
|
|||
# Как запустить код
|
||||
# Как запускать код
|
||||
|
||||
В этой программе содержится множество исполняемых примеров и лабораторных работ, которые вы захотите запустить. Для этого вам нужна возможность выполнять код на Python в Jupyter Notebook, предоставленных в рамках этой программы. У вас есть несколько вариантов запуска кода:
|
||||
В этой учебной программе много исполняемых примеров и лабораторных работ, которые вы наверняка захотите запустить. Для этого необходимо уметь выполнять код Python в Jupyter Notebook, предоставленных в рамках этой программы. У вас есть несколько вариантов запуска кода:
|
||||
|
||||
## Запуск локально на вашем компьютере
|
||||
|
||||
Для запуска кода локально на вашем компьютере необходима установка Python. Одним из рекомендованных вариантов является установка **[miniconda](https://conda.io/en/latest/miniconda.html)** — это достаточно легковесная установка, которая поддерживает менеджер пакетов `conda` для создания различных **виртуальных окружений** Python.
|
||||
Для запуска кода локально на компьютере нужна установка Python. Одной из рекомендаций является установка **[miniconda](https://conda.io/en/latest/miniconda.html)** — это достаточно легкий установочный пакет, который поддерживает пакетный менеджер `conda` для различных Python **виртуальных окружений**.
|
||||
|
||||
После установки miniconda склонируйте репозиторий и создайте виртуальное окружение, которое будет использоваться для этого курса:
|
||||
После установки miniconda клонируйте репозиторий и создайте виртуальное окружение для использования в этом курсе:
|
||||
|
||||
```bash
|
||||
git clone http://github.com/microsoft/ai-for-beginners
|
||||
|
|
@ -17,17 +17,17 @@ conda activate ai4beg
|
|||
|
||||
### Использование Visual Studio Code с расширением Python
|
||||
|
||||
Эта программа лучше всего используется при открытии в [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) с расширением [Python Extension](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste).
|
||||
Эта учебная программа лучше всего используется при открытии в [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) с установкой [Python Extension](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste).
|
||||
|
||||
> **Примечание**: После клонирования и открытия каталога в VS Code, он автоматически предложит установить расширение Python. Также необходимо будет установить miniconda, как описано выше.
|
||||
> **Примечание**: После клонирования и открытия папки в VS Code будет автоматически предложено установить расширения Python. Также нужно установить miniconda, как описано выше.
|
||||
|
||||
> **Примечание**: Если VS Code предлагает открыть репозиторий в контейнере, стоит отказаться от этого, чтобы использовать локальную установку Python.
|
||||
> **Примечание**: Если VS Code предложит переоткрыть репозиторий в контейнере, следует отказаться, чтобы пользоваться локальной установкой Python.
|
||||
|
||||
### Использование Jupyter в браузере
|
||||
|
||||
Вы также можете использовать среду Jupyter из браузера на вашем компьютере. Как классический Jupyter, так и JupyterHub предоставляют удобную среду разработки с автодополнением, подсветкой кода и др.
|
||||
Вы также можете использовать среду Jupyter из браузера на своем компьютере. Классический Jupyter и JupyterHub предоставляют удобную среду разработки с автозаполнением, подсветкой кода и другими функциями.
|
||||
|
||||
Чтобы запустить Jupyter локально, перейдите в каталог курса и выполните:
|
||||
Для запуска Jupyter локально перейдите в директорию курса и выполните:
|
||||
|
||||
```bash
|
||||
jupyter notebook
|
||||
|
|
@ -36,36 +36,36 @@ jupyter notebook
|
|||
```bash
|
||||
jupyterhub
|
||||
```
|
||||
После этого вы сможете перейти к любому из файлов `.ipynb`, открыть их и начать работу.
|
||||
Затем вы можете открыть любой файл с расширением `.ipynb`, открыть его и начать работу.
|
||||
|
||||
### Запуск в контейнере
|
||||
|
||||
Альтернативой установке Python может быть запуск кода в контейнере. Поскольку в нашем репозитории есть специальная папка `.devcontainer`, которая содержит инструкции по сборке контейнера для этого репозитория, VS Code дает возможность заново открыть код в контейнере. Это требует установки Docker и более сложной настройки, поэтому мы рекомендуем этот вариант для более опытных пользователей.
|
||||
Альтернативой установке Python является запуск кода в контейнере. Поскольку в нашем репозитории есть специальная папка `.devcontainer`, которая описывает, как собрать контейнер для данного репозитория, VS Code предлагает открыть код в контейнере. Для этого потребуется установка Docker, и данный способ сложнее, поэтому его рекомендуют более опытным пользователям.
|
||||
|
||||
## Запуск в облаке
|
||||
|
||||
Если вы не хотите устанавливать Python локально и у вас есть доступ к облачным ресурсам, хорошей альтернативой будет запуск кода в облаке. Есть несколько способов сделать это:
|
||||
Если вы не хотите устанавливать Python локально и имеете доступ к облачным ресурсам, хорошим вариантом будет запуск кода в облаке. Есть несколько способов сделать это:
|
||||
|
||||
* Использование **[GitHub Codespaces](https://github.com/features/codespaces)** — виртуальная среда, созданная для вас на GitHub, доступная через браузерный интерфейс VS Code. Если у вас есть доступ к Codespaces, просто нажмите кнопку **Code** в репозитории, запустите codespace и начните работу быстро.
|
||||
* Использование **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) предлагает бесплатные вычислительные ресурсы в облаке для людей, как вы, чтобы тестировать код с GitHub. На главной странице есть кнопка для открытия репозитория в Binder — это быстро приведет вас на сайт Binder, который создаст контейнер и запустит веб-интерфейс Jupyter для вас.
|
||||
* Использовать **[GitHub Codespaces](https://github.com/features/codespaces)** — это виртуальная среда, созданная для вас на GitHub, доступная через браузерный интерфейс VS Code. Если у вас есть доступ к Codespaces, просто нажмите кнопку **Code** в репозитории, запустите codespace и начните работу за считанные минуты.
|
||||
* Использовать **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) предоставляет бесплатные вычислительные ресурсы в облаке для тестирования кода с GitHub. На главной странице есть кнопка для запуска репозитория в Binder — это быстро перенаправит вас на сайт Binder, который соберет контейнер и запустит веб-интерфейс Jupyter.
|
||||
|
||||
> **Примечание**: Для предотвращения злоупотреблений у Binder заблокирован доступ к некоторым веб-ресурсам. Это может помешать работе некоторых частей кода, которые загружают модели и/или наборы данных из интернета. Возможно, потребуется поискать обходные пути. Кроме того, предоставляемые Binder вычислительные ресурсы довольно ограничены, поэтому обучение будет медленным, особенно в более поздних, сложных уроках.
|
||||
> **Примечание**: Чтобы предотвратить злоупотребления, Binder блокирует доступ к некоторым веб-ресурсам. Это может помешать работе части кода, который загружает модели и/или наборы данных из интернета. Возможно, придётся искать обходные пути. Кроме того, предоставляемые биредовательные мощности у Binder достаточно базовые, поэтому обучение будет идти медленно, особенно на поздних, более сложных уроках.
|
||||
|
||||
## Запуск в облаке с GPU
|
||||
## Запуск в облаке с поддержкой GPU
|
||||
|
||||
Некоторые из поздних уроков этой программы значительно выиграют от поддержки GPU. Например, обучение моделей может быть чрезвычайно медленным без нее. Есть несколько вариантов, если у вас есть доступ к облаку, например, через [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) или через ваше учебное учреждение:
|
||||
Некоторые из более поздних уроков в этой программе сильно выигрывают от поддержки GPU. Обучение моделей, например, без этой поддержки будет очень медленным. Есть несколько вариантов, особенно если у вас есть доступ к облаку через [Azure для студентов](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) или через ваше учебное заведение:
|
||||
|
||||
* Создайте [Data Science Virtual Machine](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) и подключитесь к ней через Jupyter. Вы можете клонировать репозиторий непосредственно на машину и начать учиться. Виртуальные машины серии NC поддерживают GPU.
|
||||
* Создать [виртуальную машину для науки о данных](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) и подключиться к ней через Jupyter. Затем можно клонировать репозиторий прямо на машине и начать обучение. Виртуальные машины серии NC поддерживают GPU.
|
||||
|
||||
> **Примечание**: Некоторые подписки, включая Azure for Students, изначально не предоставляют поддержку GPU. Возможно, потребуется подать запрос в техническую поддержку для получения дополнительных ядер GPU.
|
||||
> **Примечание**: Некоторые подписки, включая Azure для студентов, не предоставляют поддержку GPU изначально. Возможно, потребуется запросить дополнительные GPU-ядра через техническую поддержку.
|
||||
|
||||
* Создайте [Azure Machine Learning Workspace](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) и используйте функцию Notebook там. [Это видео](https://azure-for-academics.github.io/quickstart/azureml-papers/) показывает, как клонировать репозиторий в Azure ML notebook и начать работу.
|
||||
* Создать [рабочее пространство Azure Machine Learning](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) и использовать там функцию Notebook. [Это видео](https://azure-for-academics.github.io/quickstart/azureml-papers/) показывает, как клонировать репозиторий в Azure ML notebook и начать работу.
|
||||
|
||||
Вы также можете использовать Google Colab, который предоставляет некоторую бесплатную поддержку GPU, и загружать туда Jupyter Notebook для их последовательного выполнения.
|
||||
Вы также можете использовать Google Colab, который предоставляет бесплатную поддержку GPU, и загружать туда Jupyter Notebook для поочередного выполнения.
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**Отказ от ответственности**:
|
||||
Этот документ был переведен с помощью сервиса автоматического перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Несмотря на наши усилия по обеспечению точности, просим учитывать, что автоматический перевод может содержать ошибки или неточности. Оригинальный документ на его исходном языке следует считать авторитетным источником. Для критически важной информации рекомендуется использовать профессиональный перевод, выполненный человеком. Мы не несем ответственности за любые недоразумения или неправильные толкования, возникшие в результате использования данного перевода.
|
||||
Этот документ был переведен с использованием сервиса машинного перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Несмотря на наши усилия по обеспечению точности, имейте в виду, что автоматический перевод может содержать ошибки или неточности. Оригинальный документ на его исходном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется обратиться к профессиональному человеческому переводу. Мы не несем ответственности за любые недоразумения или неправильные толкования, возникшие в результате использования этого перевода.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -4,11 +4,11 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Предобученные модели и перенос обучения\n",
|
||||
"# Предварительно обученные модели и перенос обучения\n",
|
||||
"\n",
|
||||
"Обучение CNN может занимать много времени, а для этой задачи требуется большое количество данных. Однако значительная часть времени уходит на изучение лучших низкоуровневых фильтров, которые сеть использует для извлечения паттернов из изображений. Возникает естественный вопрос — можем ли мы использовать нейронную сеть, обученную на одном наборе данных, и адаптировать её для классификации других изображений без полного процесса обучения?\n",
|
||||
"Обучение сверточных нейронных сетей может занять много времени, и для этой задачи требуется большое количество данных. Однако значительная часть времени уходит на обучение лучших низкоуровневых фильтров, которые сеть использует для извлечения паттернов из изображений. Возникает естественный вопрос — можем ли мы использовать нейронную сеть, обученную на одном наборе данных, и адаптировать её к классификации других изображений без полного процесса обучения?\n",
|
||||
"\n",
|
||||
"Этот подход называется **переносом обучения**, потому что мы переносим часть знаний от одной модели нейронной сети к другой. В переносе обучения мы обычно начинаем с предобученной модели, которая была обучена на каком-либо крупном наборе изображений, например, **ImageNet**. Эти модели уже хорошо справляются с извлечением различных признаков из общих изображений, и во многих случаях построение классификатора поверх этих извлечённых признаков может дать хороший результат.\n"
|
||||
"Этот подход называется **переносом обучения**, поскольку мы переносим часть знаний из одной модели нейронной сети в другую. В переносе обучения мы обычно начинаем с предварительно обученной модели, которая была обучена на некотором большом наборе изображений, например, на **ImageNet**. Такие модели уже хорошо справляются с извлечением различных признаков из универсальных изображений, и во многих случаях достаточно построить классификатор на основе этих извлечённых признаков, чтобы получить хороший результат.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -29,11 +29,11 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Набор данных \"Кошки против собак\"\n",
|
||||
"## Набор данных Коты против Собак\n",
|
||||
"\n",
|
||||
"В этом разделе мы решим реальную задачу классификации изображений кошек и собак. Для этого мы будем использовать [Kaggle Cats vs. Dogs Dataset](https://www.kaggle.com/c/dogs-vs-cats), который также можно скачать [с сайта Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n",
|
||||
"В этом разделе мы решим практическую задачу классификации изображений котов и собак. Для этого мы будем использовать [набор данных Kaggle Cats vs. Dogs](https://www.kaggle.com/c/dogs-vs-cats), который также можно скачать [с сайта Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n",
|
||||
"\n",
|
||||
"Давайте скачаем этот набор данных и извлечем его в директорию `data` (этот процесс может занять некоторое время!):\n"
|
||||
"Давайте скачиваем этот набор данных и распакуем его в директорию `data` (этот процесс может занять некоторое время!):\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -64,7 +64,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"К сожалению, в наборе данных есть некоторые поврежденные файлы изображений. Нам нужно быстро очистить данные, чтобы проверить наличие поврежденных файлов. Чтобы не загромождать этот учебник, мы перенесли код для проверки набора данных в модуль.\n"
|
||||
"К сожалению, в наборе данных есть несколько повреждённых файлов изображений. Нам нужно быстро их проверить и очистить от повреждённых файлов. Чтобы не загромождать этот учебник, мы вынесли код для проверки набора данных в отдельный модуль.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -335,11 +335,11 @@
|
|||
"source": [
|
||||
"## Загрузка набора данных\n",
|
||||
"\n",
|
||||
"В предыдущих примерах мы загружали наборы данных, встроенные в Keras. Теперь мы будем работать с собственным набором данных, который нужно загрузить из директории с изображениями.\n",
|
||||
"В предыдущих примерах мы загружали наборы данных, встроенные в Keras. Теперь мы будем работать с нашим собственным набором данных, который нужно загрузить из каталога с изображениями.\n",
|
||||
"\n",
|
||||
"В реальной жизни размер наборов данных изображений может быть довольно большим, и нельзя рассчитывать, что все данные поместятся в оперативной памяти. Поэтому наборы данных часто представляются в виде **генераторов**, которые могут возвращать данные небольшими партиями, подходящими для обучения.\n",
|
||||
"В реальной жизни размер наборов данных с изображениями может быть достаточно большим, и нельзя полагаться на то, что все данные поместятся в память. Поэтому наборы данных часто представлены в виде **генераторов**, которые могут возвращать данные небольшими партиями, подходящими для обучения.\n",
|
||||
"\n",
|
||||
"Для работы с классификацией изображений Keras включает специальную функцию `image_dataset_from_directory`, которая может загружать изображения из поддиректорий, соответствующих различным классам. Эта функция также автоматически масштабирует изображения и может разделить набор данных на обучающую и тестовую выборки:\n"
|
||||
"Для работы с задачей классификации изображений Keras включает специальную функцию `image_dataset_from_directory`, которая может загружать изображения из подкаталогов, соответствующих разным классам. Эта функция также заботится о масштабировании изображений и может разделять набор данных на обучающую и тестовую части:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -383,9 +383,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Важно установить одинаковое значение `seed` для обоих вызовов, так как оно влияет на разделение изображений между обучающим и тестовым наборами данных.\n",
|
||||
"Важно установить одинаковое значение `seed` для обоих вызовов, так как это влияет на разделение изображений между обучающим и тестовым наборами данных.\n",
|
||||
"\n",
|
||||
"Набор данных автоматически считывает названия классов из директорий, и вы можете получить к ним доступ, если это необходимо, вызвав:\n"
|
||||
"Dataset автоматически получает имена классов из каталогов, и вы можете получить к ним доступ, если это необходимо, вызвав:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -412,7 +412,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Наборы данных, которые мы получили, могут быть напрямую переданы в функцию `fit` для обучения модели. Они содержат как соответствующие изображения, так и метки, которые можно перебрать с помощью следующей конструкции:\n"
|
||||
"Наборы данных, которые мы получили, могут быть напрямую переданы функции `fit` для обучения модели. Они содержат как соответствующие изображения, так и метки, по которым можно выполнять цикл с использованием следующей конструкции:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -453,16 +453,16 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"> **Примечание**: Все изображения в наборе данных представлены в виде тензоров с плавающей точкой в диапазоне 0-255. Перед передачей их в нейронную сеть, нам нужно масштабировать эти значения в диапазон 0-1. При отображении изображений мы также должны сделать то же самое или преобразовать значения в тип `int` (что мы делаем в коде выше), чтобы показать `matplotlib`, что мы хотим отобразить оригинальное немасштабированное изображение.\n"
|
||||
"> **Примечание**: Все изображения в наборе данных представлены в виде тензоров с плавающей точкой в диапазоне 0-255. Перед передачей их в нейронную сеть необходимо масштабировать эти значения в диапазон 0-1. При построении графиков изображений нам нужно либо сделать то же самое, либо преобразовать значения в тип `int` (что мы и делаем в коде выше), чтобы показать `matplotlib`, что мы хотим отобразить оригинальное немасштабированное изображение.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Предобученные модели\n",
|
||||
"## Предварительно обученные модели\n",
|
||||
"\n",
|
||||
"Для многих задач классификации изображений можно найти предобученные модели нейронных сетей. Многие из этих моделей доступны в пространстве имен `keras.applications`, а еще больше моделей можно найти в Интернете. Давайте посмотрим, как можно загрузить и использовать самую простую модель VGG-16:\n"
|
||||
"Для многих задач классификации изображений можно найти предварительно обученные модели нейронных сетей. Многие из этих моделей доступны внутри пространства имен `keras.applications`, а еще больше моделей можно найти в Интернете. Давайте посмотрим, как можно загрузить и использовать простейшую модель VGG-16:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -497,7 +497,17 @@
|
|||
}
|
||||
],
|
||||
"source": [
|
||||
"vgg = keras.applications.VGG16()\n",
|
||||
"# SHA-256 of VGG16 weights (with top)\n",
|
||||
"VGG16_WEIGHTS_SHA256 = '64373286793e3c8b2b4e3219cbf3544bce2f55ab4682710a29f5e7af8f5e4f61'\n",
|
||||
"\n",
|
||||
"_weights_path = keras.utils.get_file(\n",
|
||||
" 'vgg16_weights_tf_dim_ordering_tf_kernels.h5',\n",
|
||||
" 'https://storage.googleapis.com/tensorflow/keras-applications/vgg16/vgg16_weights_tf_dim_ordering_tf_kernels.h5',\n",
|
||||
" file_hash=VGG16_WEIGHTS_SHA256,\n",
|
||||
" hash_algorithm='sha256',\n",
|
||||
")\n",
|
||||
"\n",
|
||||
"vgg = keras.applications.VGG16(weights=_weights_path)\n",
|
||||
"inp = keras.applications.vgg16.preprocess_input(x_sample[:1])\n",
|
||||
"\n",
|
||||
"res = vgg(inp)\n",
|
||||
|
|
@ -510,11 +520,10 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Есть несколько важных моментов:\n",
|
||||
"\n",
|
||||
"* Перед тем как передать входные данные в любую предварительно обученную сеть, их необходимо предварительно обработать определенным образом. Это выполняется с помощью вызова соответствующей функции `preprocess_input`, которая принимает пакет изображений и возвращает их обработанную форму. В случае VGG-16 изображения нормализуются, и из каждого канала вычитается заранее определенное среднее значение. Это связано с тем, что VGG-16 изначально обучалась с таким предварительным обработкой.\n",
|
||||
"* Нейронная сеть применяется к входному пакету, и в результате мы получаем пакет тензоров из 1000 элементов, которые показывают вероятность каждого класса. Мы можем найти номер наиболее вероятного класса, вызвав `argmax` для этого тензора.\n",
|
||||
"* Полученный результат — это [номер класса из `ImageNet`](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Чтобы понять этот результат, можно также использовать функцию `decode_predictions`, которая возвращает n наиболее вероятных классов вместе с их названиями.\n"
|
||||
"Здесь есть несколько важных моментов:\n",
|
||||
"* Перед передачей входных данных в любую предварительно обученную сеть они должны быть предварительно обработаны определённым образом. Это делается вызовом соответствующей функции `preprocess_input`, которая принимает пакет изображений и возвращает их обработанную форму. В случае VGG-16 изображения нормализуются, и из каждого канала вычитается заранее определённое среднее значение. Это связано с тем, что VGG-16 изначально обучалась с такой предобработкой.\n",
|
||||
"* К входному пакету применяется нейронная сеть, и в результате мы получаем пакет тензоров размером 1000 элементов, которые показывают вероятность каждого класса. Мы можем найти номер наиболее вероятного класса, вызвав `argmax` для этого тензора.\n",
|
||||
"* Полученный результат — это [номер класса из `ImageNet`](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Чтобы понять этот результат, мы также можем использовать функцию `decode_predictions`, которая возвращает n лучших классов вместе с их именами.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -600,7 +609,7 @@
|
|||
"source": [
|
||||
"## Вычисления на GPU\n",
|
||||
"\n",
|
||||
"Глубокие нейронные сети, такие как VGG-16 и другие более современные архитектуры, требуют значительных вычислительных ресурсов для работы. Поэтому имеет смысл использовать ускорение на GPU, если оно доступно. К счастью, Keras автоматически ускоряет вычисления на GPU, если оно доступно. Мы можем проверить, может ли Tensorflow использовать GPU, с помощью следующего кода:\n"
|
||||
"Глубокие нейронные сети, такие как VGG-16 и другие более современные архитектуры, требуют довольно много вычислительных ресурсов для работы. Логично использовать ускорение на GPU, если оно доступно. К счастью, Keras автоматически ускоряет вычисления на GPU, если он доступен. Мы можем проверить, способен ли Tensorflow использовать GPU, используя следующий код:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -627,9 +636,10 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Извлечение признаков с помощью VGG\n",
|
||||
"\n",
|
||||
"Если мы хотим использовать VGG-16 для извлечения признаков из наших изображений, нам нужен модель без финальных слоев классификации. Мы можем создать модель VGG-16 без верхних слоев, используя следующий код:\n"
|
||||
"## Извлечение признаков VGG\n",
|
||||
"\n",
|
||||
"Если мы хотим использовать VGG-16 для извлечения признаков из наших изображений, нам нужна модель без финальных классификационных слоев. Мы можем инициализировать модель VGG-16 без верхних слоев, используя этот код:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -681,9 +691,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Размерность тензора признаков составляет 7x7x512, но для визуализации нам пришлось преобразовать его в 2D-форму.\n",
|
||||
"Размерность тензора признаков 7x7x512, но для визуализации нам пришлось преобразовать его в 2D форму.\n",
|
||||
"\n",
|
||||
"Теперь давайте попробуем выяснить, можно ли использовать эти признаки для классификации изображений. Возьмем вручную некоторую часть изображений (в нашем случае 50 минибатчей) и предварительно вычислим их векторные представления признаков. Для этого мы можем использовать API **dataset** из Tensorflow. Функция `map` принимает датасет и применяет заданную lambda-функцию для его преобразования. Мы используем этот механизм, чтобы создать новые датасеты, `ds_features_train` и `ds_features_test`, которые содержат признаки, извлеченные с помощью VGG, вместо оригинальных изображений.\n"
|
||||
"Теперь давайте попробуем проверить, можно ли использовать эти признаки для классификации изображений. Вручную возьмём некоторую часть изображений (50 минибатчей в нашем случае) и предварительно вычислим для них вектор признаков. Мы можем использовать API **dataset** Tensorflow для этого. Функция `map` принимает набор данных и применяет к нему заданную лямбда-функцию для преобразования. Мы используем этот механизм для построения новых наборов данных, `ds_features_train` и `ds_features_test`, которые содержат признаки, извлечённые с помощью VGG, вместо исходных изображений.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -713,9 +723,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Мы использовали конструкцию `.take(50)` для ограничения размера набора данных, чтобы ускорить демонстрацию. Конечно, вы можете провести этот эксперимент на полном наборе данных.\n",
|
||||
"Мы использовали конструкцию `.take(50)`, чтобы ограничить размер набора данных и ускорить нашу демонстрацию. Конечно, вы можете провести этот эксперимент на полном наборе данных.\n",
|
||||
"\n",
|
||||
"Теперь, когда у нас есть набор данных с извлеченными признаками, мы можем обучить простой плотный классификатор для различения кошек и собак. Эта сеть будет принимать вектор признаков формы (7,7,512) и выдавать один результат, который соответствует либо собаке, либо кошке. Поскольку это бинарная классификация, мы используем функцию активации `sigmoid` и функцию потерь `binary_crossentropy`.\n"
|
||||
"Теперь, когда у нас есть набор данных с извлечёнными признаками, мы можем обучить простой плотный классификатор для различения кошек и собак. Эта сеть будет принимать вектор признаков формы (7,7,512) и выдавать один выход, который соответствует либо собаке, либо кошке. Поскольку это задача бинарной классификации, мы используем функцию активации `sigmoid` и функцию потерь `binary_crossentropy`.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -744,13 +754,13 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Результат впечатляющий, мы можем различать кошку и собаку с вероятностью почти 95%! Однако мы протестировали этот подход только на подмножестве всех изображений, так как ручное извлечение признаков занимает много времени.\n",
|
||||
"Результат отличный, мы можем с вероятностью почти 95% отличить кошку от собаки! Однако мы протестировали этот подход только на подмножестве всех изображений, потому что ручное извлечение признаков занимает много времени.\n",
|
||||
"\n",
|
||||
"## Трансферное обучение с использованием одной сети VGG\n",
|
||||
"\n",
|
||||
"Мы также можем избежать ручного предварительного вычисления признаков, используя оригинальную сеть VGG-16 целиком во время обучения, добавив извлечение признаков в нашу сеть в качестве первого слоя.\n",
|
||||
"Мы также можем избежать ручного предварительного вычисления признаков, используя исходную сеть VGG-16 целиком во время обучения, добавив извлекатель признаков в нашу сеть в качестве первого слоя.\n",
|
||||
"\n",
|
||||
"Прелесть архитектуры Keras заключается в том, что модель VGG-16, которую мы определили выше, может быть использована как слой в другой нейронной сети! Нам просто нужно построить сеть с плотным классификатором поверх нее, а затем обучить всю сеть с использованием обратного распространения.\n"
|
||||
"Прелесть архитектуры Keras в том, что модель VGG-16, которую мы определили выше, также может быть использована как слой в другой нейронной сети! Нам просто нужно построить сеть с плотным классификатором поверх неё, а затем обучать всю сеть с помощью обратного распространения ошибки.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -794,13 +804,13 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Эта модель выглядит как сеть для классификации \"от конца до конца\", которая принимает изображение и возвращает класс. Однако сложность заключается в том, что мы хотим, чтобы VGG16 работала как извлекатель признаков, а не переобучалась. Поэтому нам нужно **заморозить веса сверточного извлекателя признаков**. Мы можем получить доступ к первому слою сети, вызвав `model.layers[0]`, и нам просто нужно установить свойство `trainable` в значение `False`.\n",
|
||||
"Эта модель выглядит как сквозная сеть классификации, которая принимает изображение и возвращает класс. Однако сложность в том, что мы хотим, чтобы VGG16 выступал в роли извлекателя признаков и не подвергался дообучению. Поэтому нам нужно **заморозить веса сверточного извлекателя признаков**. Мы можем обратиться к первому слою сети, вызвав `model.layers[0]`, и просто установить свойство `trainable` в `False`.\n",
|
||||
"\n",
|
||||
"> **Note**: Заморозка весов извлекателя признаков необходима, потому что в противном случае необученный слой классификатора может разрушить исходные предобученные веса сверточного извлекателя.\n",
|
||||
"> **Примечание**: Заморозка весов извлекателя признаков необходима, потому что в противном случае ненастроенный слой классификатора может испортить оригинальные предварительно обученные веса сверточного извлекателя.\n",
|
||||
"\n",
|
||||
"Вы можете заметить, что хотя общее количество параметров в нашей сети составляет около 15 миллионов, мы обучаем только 25 тысяч параметров. Все остальные параметры верхнего уровня сверточных фильтров уже предобучены. Это хорошо, потому что мы можем настроить меньшее количество параметров, используя меньшее количество примеров.\n",
|
||||
"Вы можете заметить, что в то время как общее количество параметров в нашей сети составляет около 15 миллионов, мы обучаем только 25 тысяч параметров. Все остальные параметры верхнеуровневых сверточных фильтров предварительно обучены. Это хорошо, потому что мы можем тонко настроить меньшее количество параметров с меньшим числом примеров.\n",
|
||||
"\n",
|
||||
"Теперь мы будем обучать нашу сеть и посмотрим, каких результатов мы сможем добиться. Ожидайте довольно длительного времени выполнения, и не переживайте, если выполнение кажется замороженным на некоторое время.\n"
|
||||
"Теперь мы обучим нашу сеть и посмотрим, насколько хорошо это получится. Ожидайте достаточно длительное время работы, и не беспокойтесь, если выполнение будет казаться зависшим на некоторое время.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -825,11 +835,11 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Кажется, у нас получилось создать достаточно точный классификатор кошек и собак!\n",
|
||||
"Похоже, у нас получился достаточно точный классификатор кошек и собак! \n",
|
||||
"\n",
|
||||
"## Сохранение и загрузка модели\n",
|
||||
"\n",
|
||||
"После того как мы обучили модель, мы можем сохранить архитектуру модели и обученные веса в файл для дальнейшего использования:\n"
|
||||
"После обучения модели мы можем сохранить архитектуру модели и обученные веса в файл для дальнейшего использования:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -853,7 +863,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Мы можем загрузить модель из файла в любое время. Это может быть полезно, если следующий эксперимент разрушит модель - вам не придется начинать с нуля.\n"
|
||||
"Затем мы можем загрузить модель из файла в любое время. Это может быть полезно, если следующий эксперимент повредит модель — вам не придется начинать с нуля.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -869,15 +879,15 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Тонкая настройка переноса обучения\n",
|
||||
"## Тонкая настройка трансферного обучения\n",
|
||||
"\n",
|
||||
"В предыдущем разделе мы обучили финальный слой классификатора для классификации изображений в нашем собственном наборе данных. Однако мы не переобучали извлекатель признаков, и наша модель полагалась на признаки, которые она изучила на данных ImageNet. Если ваши объекты визуально отличаются от обычных изображений ImageNet, такая комбинация признаков может работать не лучшим образом. Поэтому имеет смысл начать обучение сверточных слоев.\n",
|
||||
"В предыдущем разделе мы обучили последний классификационный слой для классификации изображений в нашем собственном наборе данных. Однако мы не дообучали извлекатель признаков, и наша модель полагалась на признаки, которые она выучила на данных ImageNet. Если ваши объекты визуально отличаются от обычных изображений ImageNet, такое сочетание признаков может работать не лучшим образом. Поэтому имеет смысл начать обучать также сверточные слои.\n",
|
||||
"\n",
|
||||
"Для этого мы можем \"разморозить\" параметры сверточных фильтров, которые ранее были \"заморожены\".\n",
|
||||
"Для этого мы можем разморозить параметры фильтров свёрточного слоя, которые ранее были заморожены.\n",
|
||||
"\n",
|
||||
"> **Примечание:** Важно сначала \"заморозить\" параметры и провести несколько эпох обучения, чтобы стабилизировать веса в слое классификации. Если сразу начать обучение всей сети с \"размороженными\" параметрами, большие ошибки могут разрушить предварительно обученные веса в сверточных слоях.\n",
|
||||
"> **Примечание:** Важно сначала заморозить параметры и выполнить несколько эпох обучения, чтобы стабилизировать веса в классификационном слое. Если сразу начать обучать всю сеть с размороженными параметрами, большие ошибки могут разрушить предварительно обученные веса в сверточных слоях.\n",
|
||||
"\n",
|
||||
"Наша сверточная модель VGG-16 находится внутри первого слоя и сама состоит из множества слоев. Мы можем взглянуть на ее структуру:\n"
|
||||
"Наша свёрточная модель VGG-16 находится внутри первого слоя и сама состоит из многих слоёв. Мы можем посмотреть на её структуру:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -945,7 +955,9 @@
|
|||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": []
|
||||
"source": [
|
||||
"Мы можем разморозить все слои сверточной базы:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
|
|
@ -960,7 +972,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Однако размораживание всех слоев сразу — не лучшая идея. Сначала мы можем разморозить только несколько последних слоев сверток, так как они содержат высокоуровневые шаблоны, которые имеют значение для наших изображений. Например, для начала мы можем заморозить все слои, кроме последних четырех:\n"
|
||||
"Однако размораживать все сразу — не лучшая идея. Сначала можно разморозить лишь несколько последних сверточных слоёв, так как они содержат паттерны более высокого уровня, которые релевантны для наших изображений. Например, для начала можно заморозить все слои, кроме последних четырёх: \n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -999,11 +1011,11 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Обратите внимание, что количество обучаемых параметров значительно увеличилось, но оно все еще составляет около 50% от общего числа параметров.\n",
|
||||
"Обратите внимание, что количество обучаемых параметров значительно увеличилось, но по-прежнему составляет около 50% от общего числа параметров.\n",
|
||||
"\n",
|
||||
"После разморозки можно провести еще несколько эпох обучения (в нашем примере мы проведем только одну). Вы также можете выбрать более низкую скорость обучения, чтобы минимизировать влияние на предварительно обученные веса. Однако даже при низкой скорости обучения можно ожидать снижения точности в начале обучения, пока она, наконец, не достигнет немного более высокого уровня, чем в случае фиксированных весов.\n",
|
||||
"После размораживания мы можем провести ещё несколько эпох обучения (в нашем примере мы проведём всего одну). Также можно выбрать более низкую скорость обучения, чтобы минимизировать влияние на предварительно обученные веса. Однако даже при низкой скорости обучения можно ожидать, что точность сначала снизится, а затем в конечном итоге достигнет уровня немного выше, чем в случае фиксированных весов.\n",
|
||||
"\n",
|
||||
"> **Примечание:** Это обучение происходит гораздо медленнее, так как необходимо распространять градиенты обратно через множество слоев сети!\n"
|
||||
"> **Примечание:** Это обучение происходит намного медленнее, потому что нам нужно распространять градиенты назад через многие слои сети!\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1027,9 +1039,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Мы, скорее всего, достигнем более высокой точности на обучающей выборке, так как используем более мощную сеть с большим количеством параметров, но точность на проверочной выборке увеличится не так значительно.\n",
|
||||
"Мы, вероятно, достигнем более высокой точности на обучении, потому что используем более мощную сеть с большим количеством параметров, но точность на валидации увеличится не так сильно.\n",
|
||||
"\n",
|
||||
"Не стесняйтесь разморозить еще несколько слоев сети и продолжить обучение, чтобы проверить, сможете ли вы добиться более высокой точности!\n"
|
||||
"Не стесняйтесь разморозить ещё несколько слоёв сети и обучать дальше, чтобы увидеть, сможете ли вы достичь более высокой точности!\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1038,7 +1050,7 @@
|
|||
"source": [
|
||||
"## Другие модели компьютерного зрения\n",
|
||||
"\n",
|
||||
"VGG-16 — одна из самых простых архитектур компьютерного зрения. Keras предоставляет множество других предварительно обученных сетей. Наиболее часто используемые среди них — архитектуры **ResNet**, разработанные Microsoft, и **Inception** от Google. Например, давайте рассмотрим архитектуру самой простой модели ResNet-50 (ResNet — это семейство моделей с различной глубиной, вы можете попробовать поэкспериментировать с ResNet-152, если хотите увидеть, как выглядит действительно глубокая модель):\n"
|
||||
"VGG-16 — одна из самых простых архитектур компьютерного зрения. Keras предоставляет множество других предобученных сетей. Наиболее часто используемыми из них являются архитектуры **ResNet**, разработанные Microsoft, и **Inception** от Google. Например, давайте изучим архитектуру самой простой модели ResNet-50 (ResNet — это семейство моделей разной глубины, вы можете попробовать поэкспериментировать с ResNet-152, если хотите увидеть, как выглядит действительно глубокая модель):\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1440,29 +1452,29 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Как вы можете видеть, модель содержит те же знакомые строительные блоки: сверточные слои, слои объединения и финальный плотный классификатор. Мы можем использовать эту модель точно так же, как мы использовали VGG-16 для обучения с переносом. Вы можете попробовать экспериментировать с приведенным выше кодом, используя разные модели ResNet в качестве базовой модели, и посмотреть, как изменяется точность.\n",
|
||||
"Как вы можете видеть, модель содержит те же знакомые строительные блоки: сверточные слои, слои подвыборки и конечный плотный классификатор. Мы можем использовать эту модель точно так же, как использовали VGG-16 для трансферного обучения. Вы можете попробовать поэкспериментировать с приведённым выше кодом, используя разные модели ResNet в качестве базовой модели, и посмотреть, как изменится точность.\n",
|
||||
"\n",
|
||||
"## Нормализация пакетов\n",
|
||||
"## Нормализация по батчу\n",
|
||||
"\n",
|
||||
"Эта сеть содержит еще один тип слоя: **Нормализация пакетов**. Идея нормализации пакетов заключается в том, чтобы привести значения, проходящие через нейронную сеть, к правильному интервалу. Обычно нейронные сети работают лучше всего, когда все значения находятся в диапазоне [-1,1] или [0,1], и именно поэтому мы масштабируем/нормализуем наши входные данные соответствующим образом. Однако во время обучения глубокой сети может случиться так, что значения значительно выходят за пределы этого диапазона, что делает обучение проблематичным. Слой нормализации пакетов вычисляет среднее значение и стандартное отклонение для всех значений текущего минипакета и использует их для нормализации сигнала перед его прохождением через слой нейронной сети. Это значительно улучшает стабильность глубоких сетей.\n"
|
||||
"Эта сеть содержит ещё один тип слоя: **Нормализация по батчу**. Идея нормализации по батчу заключается в том, чтобы привести значения, проходящие через нейронную сеть, к правильному интервалу. Обычно нейронные сети работают лучше всего, когда все значения находятся в диапазоне [-1,1] или [0,1], и именно поэтому мы масштабируем/нормализуем наши входные данные соответствующим образом. Однако в процессе обучения глубокой сети может возникнуть ситуация, когда значения значительно выходят за пределы этого диапазона, что затрудняет обучение. Слой нормализации по батчу вычисляет среднее и стандартное отклонение для всех значений текущего мини-батча и использует их для нормализации сигнала перед передачей через слой нейронной сети. Это значительно улучшает стабильность глубоких сетей.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Основные выводы\n",
|
||||
"## Вывод\n",
|
||||
"\n",
|
||||
"Используя метод переноса обучения, мы смогли быстро создать классификатор для нашей задачи классификации пользовательских объектов и добиться высокой точности. Однако этот пример нельзя назвать полностью честным, так как изначально сеть VGG-16 была предварительно обучена распознавать кошек и собак, и мы просто использовали большинство уже существующих в сети паттернов. Вы можете ожидать более низкую точность на более специфичных объектах из узких областей, таких как детали на производственной линии на заводе или различные листья деревьев.\n",
|
||||
"Используя трансферное обучение, мы смогли быстро собрать классификатор для нашей задачи классификации объектов и достичь высокой точности. Однако этот пример был не совсем справедлив, так как оригинальная сеть VGG-16 была предварительно обучена распознавать кошек и собак, и, таким образом, мы просто повторно использовали большинство шаблонов, уже присутствующих в сети. Можно ожидать более низкую точность на более экзотических специфичных для домена объектах, таких как детали на производственной линии на заводе или разные листья деревьев.\n",
|
||||
"\n",
|
||||
"Вы можете заметить, что более сложные задачи, которые мы решаем сейчас, требуют большей вычислительной мощности и не могут быть легко выполнены на процессоре. В следующем разделе мы попробуем использовать более легковесную реализацию для обучения той же модели с меньшими вычислительными ресурсами, что приведет к лишь незначительному снижению точности.\n"
|
||||
"Можно увидеть, что более сложные задачи, которые мы решаем сейчас, требуют большей вычислительной мощности и не могут быть легко решены на CPU. В следующем блоке мы попробуем использовать более легковесную реализацию для обучения той же модели с использованием меньших вычислительных ресурсов, что приведет лишь к небольшому снижению точности.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**Отказ от ответственности**: \nЭтот документ был переведен с помощью сервиса автоматического перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Несмотря на наши усилия обеспечить точность, автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникшие в результате использования данного перевода.\n"
|
||||
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**Отказ от ответственности**:\nЭтот документ был переведен с использованием сервиса машинного перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Несмотря на наши усилия по обеспечению точности, имейте в виду, что автоматический перевод может содержать ошибки или неточности. Оригинальный документ на его исходном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется обратиться к профессиональному человеческому переводу. Мы не несем ответственности за любые недоразумения или неправильные толкования, возникшие в результате использования этого перевода.\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
|
|
@ -1483,12 +1495,6 @@
|
|||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.8.10"
|
||||
},
|
||||
"coopTranslator": {
|
||||
"original_hash": "c189abc107848f96051085cc30945129",
|
||||
"translation_date": "2025-08-28T10:59:43+00:00",
|
||||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb",
|
||||
"language_code": "ru"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
|
|
|||
|
|
@ -1,51 +1,51 @@
|
|||
# Обработка естественного языка
|
||||
# Обработка Естественного Языка
|
||||
|
||||

|
||||

|
||||
|
||||
В этом разделе мы сосредоточимся на использовании нейронных сетей для решения задач, связанных с **обработкой естественного языка (NLP)**. Существует множество задач NLP, которые мы хотим, чтобы компьютеры могли решать:
|
||||
В этом разделе мы сосредоточимся на использовании нейронных сетей для решения задач, связанных с **обработкой естественного языка (НЛП)**. Существует много задач НЛП, которые мы хотим, чтобы компьютеры могли решать:
|
||||
|
||||
* **Классификация текста** — это типичная задача классификации, связанная с текстовыми последовательностями. Примеры включают классификацию электронных писем как спам или не спам, или категоризацию статей по темам, таким как спорт, бизнес, политика и т.д. Также, при разработке чат-ботов часто необходимо понимать, что пользователь хотел сказать — в этом случае мы имеем дело с **классификацией намерений**. Часто в классификации намерений приходится работать с большим количеством категорий.
|
||||
* **Анализ тональности** — это типичная задача регрессии, где необходимо присвоить числовое значение (тональность), соответствующее тому, насколько положительным или отрицательным является смысл предложения. Более сложная версия анализа тональности — это **анализ тональности на основе аспектов** (ABSA), где тональность присваивается не всему предложению, а его отдельным частям (аспектам), например: *В этом ресторане мне понравилась кухня, но атмосфера была ужасной*.
|
||||
* **Распознавание именованных сущностей** (NER) — это задача извлечения определенных сущностей из текста. Например, нужно понять, что в фразе *Мне нужно лететь в Париж завтра* слово *завтра* относится к ДАТЕ, а *Париж* — это ЛОКАЦИЯ.
|
||||
* **Извлечение ключевых слов** похоже на NER, но здесь необходимо автоматически извлекать слова, важные для смысла предложения, без предварительного обучения для конкретных типов сущностей.
|
||||
* **Кластеризация текста** может быть полезна, когда нужно сгруппировать похожие предложения, например, похожие запросы в разговорах технической поддержки.
|
||||
* **Ответы на вопросы** — это способность модели отвечать на конкретный вопрос. Модель получает текстовый отрывок и вопрос в качестве входных данных, и должна указать место в тексте, где содержится ответ на вопрос (или, иногда, сгенерировать текст ответа).
|
||||
* **Генерация текста** — это способность модели создавать новый текст. Это можно рассматривать как задачу классификации, где предсказывается следующая буква/слово на основе некоторого *текстового запроса*. Продвинутые модели генерации текста, такие как GPT-3, способны решать другие задачи NLP, такие как классификация, используя технику [программирования с подсказками](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) или [инженерии подсказок](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29).
|
||||
* **Суммаризация текста** — это техника, когда мы хотим, чтобы компьютер "прочитал" длинный текст и кратко изложил его в нескольких предложениях.
|
||||
* **Машинный перевод** можно рассматривать как комбинацию понимания текста на одном языке и генерации текста на другом.
|
||||
* **Классификация текста** — это типичная задача классификации, связанная с текстовыми последовательностями. Примеры включают классификацию электронных писем как спам или не спам, или категоризацию статей по темам: спорт, бизнес, политика и т.д. Также при разработке чат-ботов часто нужно понимать, что хочет сказать пользователь — в этом случае мы имеем дело с **классификацией намерений**. Часто при классификации намерений требуется работать с большим количеством категорий.
|
||||
* **Анализ сентимента** — это типичная задача регрессии, где необходимо присвоить число (сентимент), отражающее насколько положительно/отрицательно значение предложения. Более продвинутым видом анализа сентимента является **аспектно-ориентированный анализ сентимента** (ABSA), когда сентимент присваивается не всему предложению, а его разным частям (аспектам), например: *В этом ресторане мне понравилась кухня, но атмосфера была ужасной*.
|
||||
* **Распознавание именованных сущностей** (NER) — это задача извлечения определённых сущностей из текста. Например, нужно понять, что в фразе *Мне нужно лететь в Париж завтра* слово *завтра* относится к ДАТЕ, а *Париж* — к ЛОКАЦИИ.
|
||||
* **Извлечение ключевых слов** похоже на NER, но требуется автоматически выделять слова, важные для смысла предложения, без предварительного обучения на конкретных типах сущностей.
|
||||
* **Кластеризация текста** может быть полезна, если нужно сгруппировать похожие предложения, например, схожие запросы в технической поддержке.
|
||||
* **Ответы на вопросы** — это способность модели отвечать на конкретный вопрос. Модель получает текстовый фрагмент и вопрос на вход, и должна указать место в тексте, где содержится ответ (или, иногда, сгенерировать текст ответа).
|
||||
* **Генерация текста** — способность модели создавать новый текст. Это можно рассматривать как задачу классификации, которая предсказывает следующую букву/слово на основе некоторого *текстового примера*. Продвинутые модели генерации текста, такие как GPT-3, могут решать и другие задачи НЛП, например классификацию, с помощью техники, называемой [prompt programming](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) или [prompt engineering](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29)
|
||||
* **Суммирование текста** — это метод, когда мы хотим, чтобы компьютер «прочитал» длинный текст и суммировал его несколькими предложениями.
|
||||
* **Машинный перевод** можно рассматривать как комбинацию понимания текста на одном языке и генерации текста на другом языке.
|
||||
|
||||
Изначально большинство задач NLP решались с использованием традиционных методов, таких как грамматики. Например, в машинном переводе использовались парсеры для преобразования исходного предложения в синтаксическое дерево, затем извлекались более высокоуровневые семантические структуры для представления смысла предложения, и на основе этого смысла и грамматики целевого языка генерировался результат. В настоящее время многие задачи NLP более эффективно решаются с использованием нейронных сетей.
|
||||
Изначально большинство задач НЛП решалось с помощью традиционных методов, таких как грамматики. Например, в машинном переводе использовались парсеры для преобразования исходного предложения в синтаксическое дерево, затем извлекались более высокоуровневые семантические структуры для представления смысла предложения, и на основе этого смысла и грамматики целевого языка генерировался результат. В настоящее время многие задачи НЛП эффективнее решаются с использованием нейронных сетей.
|
||||
|
||||
> Многие классические методы NLP реализованы в библиотеке Python [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org). Существует отличная [книга по NLTK](https://www.nltk.org/book/), доступная онлайн, которая охватывает, как различные задачи NLP могут быть решены с помощью NLTK.
|
||||
> Многие классические методы НЛП реализованы в библиотеке Python [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org). В интернете доступна отличная [книга по NLTK](https://www.nltk.org/book/), которая раскрывает, как решать различные задачи НЛП с помощью NLTK.
|
||||
|
||||
В нашем курсе мы в основном будем сосредоточены на использовании нейронных сетей для NLP, и будем использовать NLTK, где это необходимо.
|
||||
В нашем курсе мы в основном будем сосредоточены на использовании нейронных сетей для НЛП и будем использовать NLTK там, где это нужно.
|
||||
|
||||
Мы уже изучили использование нейронных сетей для работы с табличными данными и изображениями. Основное отличие этих типов данных от текста заключается в том, что текст — это последовательность переменной длины, тогда как размер входных данных в случае изображений известен заранее. Хотя сверточные сети могут извлекать шаблоны из входных данных, шаблоны в тексте более сложны. Например, отрицание может быть отделено от субъекта произвольным количеством слов (например, *Мне не нравятся апельсины* vs. *Мне не нравятся эти большие красочные вкусные апельсины*), и это все равно должно интерпретироваться как один шаблон. Таким образом, для обработки языка необходимо вводить новые типы нейронных сетей, такие как *рекуррентные сети* и *трансформеры*.
|
||||
Мы уже изучили использование нейронных сетей для работы с табличными данными и изображениями. Главное отличие между этими типами данных и текстом заключается в том, что текст — это последовательность переменной длины, тогда как размер входа в случае изображений известен заранее. Хотя сверточные сети могут извлекать паттерны из входных данных, паттерны в тексте более сложные. Например, отрицание может быть отделено от подлежащего произвольным числом слов (например, *Мне не нравятся апельсины* против *Мне не нравятся эти большие цветные вкусные апельсины*), и это всё равно должно интерпретироваться как один паттерн. Поэтому для обработки языка необходимо вводить новые типы нейронных сетей, такие как *рекуррентные сети* и *трансформеры*.
|
||||
|
||||
## Установка библиотек
|
||||
|
||||
Если вы используете локальную установку Python для выполнения этого курса, вам может понадобиться установить все необходимые библиотеки для NLP с помощью следующих команд:
|
||||
Если вы используете локальную установку Python для изучения этого курса, вам может понадобиться установить все необходимые библиотеки для НЛП с помощью следующих команд:
|
||||
|
||||
**Для PyTorch**
|
||||
```bash
|
||||
pip install -r requirements-torch.txt
|
||||
pip install -r requirements-pytorch.txt
|
||||
```
|
||||
**Для TensorFlow**
|
||||
```bash
|
||||
pip install -r requirements-tf.txt
|
||||
```
|
||||
|
||||
> Вы можете попробовать NLP с TensorFlow на [Microsoft Learn](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste)
|
||||
> Вы можете попробовать НЛП с TensorFlow на [Microsoft Learn](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste)
|
||||
|
||||
## Предупреждение о GPU
|
||||
## Предупреждение по поводу GPU
|
||||
|
||||
В этом разделе в некоторых примерах мы будем обучать довольно крупные модели.
|
||||
* **Используйте компьютер с поддержкой GPU**: Рекомендуется запускать ваши ноутбуки на компьютере с поддержкой GPU, чтобы сократить время ожидания при работе с крупными моделями.
|
||||
* **Ограничения памяти GPU**: Работа на GPU может привести к ситуациям, когда у вас закончится память GPU, особенно при обучении крупных моделей.
|
||||
* **Потребление памяти GPU**: Количество памяти GPU, потребляемой во время обучения, зависит от различных факторов, включая размер минибатча.
|
||||
* **Минимизируйте размер минибатча**: Если вы столкнулись с проблемами памяти GPU, попробуйте уменьшить размер минибатча в вашем коде как возможное решение.
|
||||
* **Освобождение памяти GPU в TensorFlow**: Старые версии TensorFlow могут некорректно освобождать память GPU при обучении нескольких моделей в одном ядре Python. Чтобы эффективно управлять использованием памяти GPU, вы можете настроить TensorFlow на выделение памяти GPU только по мере необходимости.
|
||||
* **Включение кода**: Чтобы настроить TensorFlow на увеличение выделения памяти GPU только при необходимости, включите следующий код в ваши ноутбуки:
|
||||
В этом разделе в некоторых примерах мы будем обучать довольно большие модели.
|
||||
* **Используйте компьютер с поддержкой GPU**: рекомендуется запускать ноутбуки на компьютере с GPU, чтобы сократить время ожидания при работе с большими моделями.
|
||||
* **Ограничения памяти GPU**: при работе на GPU могут возникать ситуации, когда заканчивается память GPU, особенно при обучении больших моделей.
|
||||
* **Потребление памяти GPU**: количество памяти GPU, используемой во время обучения, зависит от различных факторов, включая размер мини-батча.
|
||||
* **Минимизируйте размер мини-батча**: если возникают проблемы с памятью GPU, рассмотрите возможность уменьшения размера мини-батча в вашем коде как возможное решение.
|
||||
* **Освобождение памяти GPU в TensorFlow**: старые версии TensorFlow могут некорректно освобождать память GPU при обучении нескольких моделей внутри одного ядра Python. Чтобы эффективно управлять использованием памяти GPU, можно настроить TensorFlow так, чтобы он выделял память на GPU только по мере необходимости.
|
||||
* **Включение кода**: чтобы настроить TensorFlow на выделение памяти GPU только по мере роста потребности, включите следующий код в ваши ноутбуки:
|
||||
|
||||
```python
|
||||
physical_devices = tf.config.list_physical_devices('GPU')
|
||||
|
|
@ -53,17 +53,21 @@ if len(physical_devices)>0:
|
|||
tf.config.experimental.set_memory_growth(physical_devices[0], True)
|
||||
```
|
||||
|
||||
Если вас интересует изучение NLP с точки зрения классического машинного обучения, посетите [этот набор уроков](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP)
|
||||
Если вам интересен классический подход к НЛП с точки зрения машинного обучения, посетите [этот набор уроков](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP)
|
||||
|
||||
## В этом разделе
|
||||
В этом разделе мы изучим:
|
||||
|
||||
* [Представление текста в виде тензоров](13-TextRep/README.md)
|
||||
* [Словарные эмбеддинги](14-Emdeddings/README.md)
|
||||
* [Встраивания слов](14-Emdeddings/README.md)
|
||||
* [Моделирование языка](15-LanguageModeling/README.md)
|
||||
* [Рекуррентные нейронные сети](16-RNN/README.md)
|
||||
* [Генеративные сети](17-GenerativeNetworks/README.md)
|
||||
* [Трансформеры](18-Transformers/README.md)
|
||||
|
||||
**Отказ от ответственности**:
|
||||
Этот документ был переведен с использованием сервиса автоматического перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Несмотря на наши усилия обеспечить точность, автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникающие в результате использования данного перевода.
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**Отказ от ответственности**:
|
||||
Этот документ был переведен с использованием сервиса машинного перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Несмотря на наши усилия по обеспечению точности, имейте в виду, что автоматический перевод может содержать ошибки или неточности. Оригинальный документ на его исходном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется обратиться к профессиональному человеческому переводу. Мы не несем ответственности за любые недоразумения или неправильные толкования, возникшие в результате использования этого перевода.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
Loading…
Reference in New Issue