Merge pull request #686 from microsoft/update-translations
chore(i18n): sync translations with latest source changes
This commit is contained in:
commit
4e92707a80
|
|
@ -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": "bg"
|
||||
},
|
||||
"CONTRIBUTING.md": {
|
||||
"original_hash": "c6fd7e781b67111a90abd166d0ce4aa0",
|
||||
"translation_date": "2026-07-08T17:38:59+00:00",
|
||||
"source_file": "CONTRIBUTING.md",
|
||||
"language_code": "bg"
|
||||
},
|
||||
"README.md": {
|
||||
"original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b",
|
||||
"translation_date": "2026-04-06T16:39:47+00:00",
|
||||
|
|
@ -17,6 +23,19 @@
|
|||
"source_file": "SECURITY.md",
|
||||
"language_code": "bg"
|
||||
},
|
||||
"__translation_failures__": {
|
||||
"lessons/sketchnotes/LICENSE.md": {
|
||||
"original_hash": "45ab63a2cd8f5faef6c9b150618837a4",
|
||||
"source_file": "lessons/sketchnotes/LICENSE.md",
|
||||
"language_code": "bg",
|
||||
"failure_date": "2026-07-08T17:32:53+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-26T00:44:44+00:00",
|
||||
|
|
@ -54,8 +73,8 @@
|
|||
"language_code": "bg"
|
||||
},
|
||||
"examples/README.md": {
|
||||
"original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7",
|
||||
"translation_date": "2025-10-03T11:34:19+00:00",
|
||||
"original_hash": "7883d52c2e2a221e0b07a7b112a149b9",
|
||||
"translation_date": "2026-07-08T17:27:11+00:00",
|
||||
"source_file": "examples/README.md",
|
||||
"language_code": "bg"
|
||||
},
|
||||
|
|
@ -66,8 +85,8 @@
|
|||
"language_code": "bg"
|
||||
},
|
||||
"lessons/0-course-setup/how-to-run.md": {
|
||||
"original_hash": "a4717bd9103b9f6cd84d534b83534689",
|
||||
"translation_date": "2026-01-16T05:30:53+00:00",
|
||||
"original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1",
|
||||
"translation_date": "2026-07-08T17:27:38+00:00",
|
||||
"source_file": "lessons/0-course-setup/how-to-run.md",
|
||||
"language_code": "bg"
|
||||
},
|
||||
|
|
@ -191,6 +210,12 @@
|
|||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md",
|
||||
"language_code": "bg"
|
||||
},
|
||||
"lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": {
|
||||
"original_hash": "99b816b6a4957ef4100cee4c4221dff9",
|
||||
"translation_date": "2026-07-08T17:19:24+00:00",
|
||||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb",
|
||||
"language_code": "bg"
|
||||
},
|
||||
"lessons/4-ComputerVision/08-TransferLearning/lab/README.md": {
|
||||
"original_hash": "7765935c35fcee69b9fe2d0cfd6963e2",
|
||||
"translation_date": "2025-08-25T23:16:52+00:00",
|
||||
|
|
@ -330,8 +355,8 @@
|
|||
"language_code": "bg"
|
||||
},
|
||||
"lessons/5-NLP/README.md": {
|
||||
"original_hash": "8ef02a9318257ea140ed3ed74442096d",
|
||||
"translation_date": "2025-08-25T21:28:50+00:00",
|
||||
"original_hash": "038df6f1a73e49f6430740da083bfd6d",
|
||||
"translation_date": "2026-07-08T17:28:12+00:00",
|
||||
"source_file": "lessons/5-NLP/README.md",
|
||||
"language_code": "bg"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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 -->
|
||||
**Отказ от отговорност**:
|
||||
Този документ е преведен с помощта на AI преводачески услуга [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля имайте предвид, че автоматизираните преводи могат да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за каквито и да е недоразумения или неправилни тълкувания, произтичащи от използването на този превод.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -1,31 +1,31 @@
|
|||
# Примери за AI за начинаещи
|
||||
# Примери за начинаещи с изкуствен интелект
|
||||
|
||||
Добре дошли! Тази директория съдържа прости, самостоятелни примери, които ще ви помогнат да започнете с AI и машинното обучение. Всеки пример е създаден така, че да бъде подходящ за начинаещи, с подробни коментари и обяснения стъпка по стъпка.
|
||||
Добре дошли! Тази директория съдържа прости, самостоятелни примери, които да ви помогнат да започнете с изкуствения интелект и машинното обучение. Всеки пример е проектиран да е подходящ за начинаещи с подробни коментари и стъпка по стъпка обяснения.
|
||||
|
||||
## 📚 Преглед на примерите
|
||||
|
||||
| Пример | Описание | Трудност | Предпоставки |
|
||||
|--------|----------|----------|--------------|
|
||||
| [Hello AI World](../../../examples/01-hello-ai-world.py) | Вашата първа AI програма - проста разпознаване на шаблони | ⭐ Начинаещ | Основи на 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) | Вашата първа AI програма - проста разпознаване на модели | ⭐ Начинаещ | Основи на Python |
|
||||
| [Проста невронна мрежа](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/02-simple-neural-network.py) | Построяване на невронна мрежа от нулата | ⭐⭐ Начинаещ+ | Python, основна математика |
|
||||
| [Класификатор на изображения](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/03-image-classifier.ipynb) | Класифицирайте изображения с предварително обучен модел | ⭐⭐ Начинаещ+ | Python, numpy |
|
||||
| [Текстов анализ на настроения](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
|
||||
```
|
||||
|
||||
Или използвайте conda средата от основната учебна програма:
|
||||
Или използвайте conda средата от основния курс:
|
||||
|
||||
```bash
|
||||
conda env create --name ai4beg --file ../environment.yml
|
||||
|
|
@ -39,30 +39,30 @@ conda activate ai4beg
|
|||
python 01-hello-ai-world.py
|
||||
```
|
||||
|
||||
**За Jupyter notebooks (.ipynb файлове):**
|
||||
**За Jupyter тетрадки (.ipynb файлове):**
|
||||
```bash
|
||||
jupyter notebook 03-image-classifier.ipynb
|
||||
```
|
||||
|
||||
## 📖 Учебен път
|
||||
## 📖 Път за обучение
|
||||
|
||||
Препоръчваме да следвате примерите в реда:
|
||||
Препоръчваме да следвате примерите в следния ред:
|
||||
|
||||
1. **Започнете с "Hello AI World"** - Научете основите на разпознаването на шаблони
|
||||
2. **Създайте проста невронна мрежа** - Разберете как работят невронните мрежи
|
||||
3. **Опитайте класификатора на изображения** - Вижте AI в действие с реални изображения
|
||||
4. **Анализирайте текстов сентимент** - Изследвайте обработката на естествен език
|
||||
1. **Започнете с "Hello AI World"** - Научете основите на разпознаване на модели
|
||||
2. **Постройте проста невронна мрежа** - Разберете как работят невронните мрежи
|
||||
3. **Опитайте Класификатора на изображения** - Вижте AI в действие с реални изображения
|
||||
4. **Анализирайте настроението на текст** - Изследвайте обработката на естествен език
|
||||
|
||||
## 💡 Съвети за начинаещи
|
||||
|
||||
- **Четете внимателно коментарите в кода** - Те обясняват какво прави всяка линия
|
||||
- **Експериментирайте!** - Опитайте да промените стойности и вижте какво се случва
|
||||
- **Не се притеснявайте, ако не разбирате всичко** - Учението изисква време
|
||||
- **Задавайте въпроси** - Използвайте [дискусионния форум](https://github.com/microsoft/AI-For-Beginners/discussions)
|
||||
- **Четете внимателно коментарите в кода** - Те обясняват какво прави всеки ред
|
||||
- **Експериментирайте!** - Опитайте да променяте стойности и вижте какво се случва
|
||||
- **Не се тревожете, ако не разбирате всичко** - Заучаването отнема време
|
||||
- **Задавайте въпроси** - Използвайте [Discussion board](https://github.com/microsoft/AI-For-Beginners/discussions)
|
||||
|
||||
## 🔗 Следващи стъпки
|
||||
|
||||
След като завършите тези примери, разгледайте пълната учебна програма:
|
||||
След като завършите тези примери, разгледайте целия курс:
|
||||
- [Въведение в AI](../lessons/1-Intro/README.md)
|
||||
- [Невронни мрежи](../lessons/3-NeuralNetworks/README.md)
|
||||
- [Компютърно зрение](../lessons/4-ComputerVision/README.md)
|
||||
|
|
@ -71,8 +71,8 @@ jupyter notebook 03-image-classifier.ipynb
|
|||
## 🤝 Принос
|
||||
|
||||
Намерихте ли тези примери полезни? Помогнете ни да ги подобрим:
|
||||
- Докладвайте проблеми или предложете подобрения
|
||||
- Добавете още примери за начинаещи
|
||||
- Съобщавайте за проблеми или предлагайте подобрения
|
||||
- Добавяйте още примери за начинаещи
|
||||
- Подобрете документацията и коментарите
|
||||
|
||||
---
|
||||
|
|
@ -81,5 +81,7 @@ jupyter notebook 03-image-classifier.ipynb
|
|||
|
||||
---
|
||||
|
||||
**Отказ от отговорност**:
|
||||
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**Отказ от отговорност**:
|
||||
Този документ е преведен с помощта на AI преводачески услуга [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля имайте предвид, че автоматизираните преводи могат да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за каквито и да е недоразумения или неправилни тълкувания, произтичащи от използването на този превод.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -1,12 +1,12 @@
|
|||
# Как да стартирате кода
|
||||
|
||||
Тази учебна програма съдържа много изпълними примери и лаборатории, които бихте искали да стартирате. За да направите това, ви е необходимо да можете да изпълнявате Python код в Jupyter бележници, предоставени като част от тази учебна програма. Имате няколко опции за стартиране на кода:
|
||||
Тази учебна програма съдържа много изпълними примери и лабораторни упражнения, които ще искате да стартирате. За да го направите, имате нужда от възможността да изпълнявате Python код в Jupyter тетрадки, предоставени като част от тази учебна програма. Имате няколко възможности за стартиране на кода:
|
||||
|
||||
## Стартиране локално на вашия компютър
|
||||
|
||||
За да стартирате кода локално на вашия компютър, е необходима инсталация на Python. Една препоръка е да инсталирате **[miniconda](https://conda.io/en/latest/miniconda.html)** - това е сравнително лека инсталация, която поддържа пакетния мениджър `conda` за различни Python **виртуални среди**.
|
||||
|
||||
След като инсталирате miniconda, клонирайте хранилището и създайте виртуална среда, която да се използва за този курс:
|
||||
След като инсталирате miniconda, клонирайте хранилището и създайте виртуална среда, която да използвате за този курс:
|
||||
|
||||
```bash
|
||||
git clone http://github.com/microsoft/ai-for-beginners
|
||||
|
|
@ -17,15 +17,15 @@ conda activate ai4beg
|
|||
|
||||
### Използване на Visual Studio Code с Python разширение
|
||||
|
||||
Тази учебна програма е най-добре да се използва, когато я отворите в [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).
|
||||
Тази учебна програма е най-добре да се използва, като я отворите в [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, той автоматично ще ви предложи да инсталирате Python разширения. Също така ще трябва да инсталирате miniconda, както е описано по-горе.
|
||||
> **Забележка**: След като клонирате и отворите директорията във VS Code, тя автоматично ще ви предложи да инсталирате Python разширения. Също така трябва да инсталирате miniconda, както е описано по-горе.
|
||||
|
||||
> **Бележка**: Ако VS Code ви предложи да отворите хранилището в контейнер, трябва да откажете, за да използвате локалната Python инсталация.
|
||||
> **Забележка**: Ако VS Code ви предложи да отворите хранилището в контейнер, трябва да откажете, за да използвате локалната инсталация на Python.
|
||||
|
||||
### Използване на Jupyter в браузъра
|
||||
|
||||
Можете също да използвате Jupyter среда от браузъра на вашия компютър. Класическият Jupyter и JupyterHub предоставят удобна развойна среда с автодовършване, оцветяване на кода и други.
|
||||
Можете също така да използвате Jupyter среда през браузъра на вашия компютър. Класическият Jupyter и JupyterHub предоставят удобна среда за разработка с автодовършване, оцветяване на кода и др.
|
||||
|
||||
За да стартирате Jupyter локално, отидете в директорията на курса и изпълнете:
|
||||
|
||||
|
|
@ -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. Обучението на модели например може да бъде много бавно без това. Имате няколко опции, особено ако имате достъп до облак чрез [Azure за студенти](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.
|
||||
* Създайте [Виртуална машина за Data Science](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) и се свържете към нея чрез Jupyter. Можете да клонирате хранилището директно на машината и да започнете да учите. NC-серия виртуални машини поддържат GPU.
|
||||
|
||||
> **Бележка**: Някои абонаменти, включително Azure за студенти, не предоставят 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) и използвайте функцията тетрадка там. [Това видео](https://azure-for-academics.github.io/quickstart/azureml-papers/) показва как да клонирате хранилище в Azure ML тетрадка и да започнете да го използвате.
|
||||
|
||||
Можете също да използвате Google Colab, който предлага някаква безплатна GPU поддръжка, и да качите Jupyter бележници там, за да ги изпълните един по един.
|
||||
Можете също така да използвате Google Colab, който предлага някаква безплатна GPU поддръжка, и да качвате Jupyter тетрадки там, за да ги изпълнявате по една.
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**Отказ от отговорност**:
|
||||
Този документ е преведен с помощта на AI преводаческа услуга [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи могат да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Не носим отговорност за каквито и да е недоразумения или неправилни тълкувания, произтичащи от използването на този превод.
|
||||
Този документ е преведен с помощта на AI преводачески услуга [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",
|
||||
"Обучението на CNNs може да отнеме много време и изисква голямо количество данни. Въпреки това, голяма част от времето се отделя за научаване на най-добрите нискоуровневи филтри, които мрежата използва за извличане на модели от изображения. Възниква естествен въпрос - можем ли да използваме невронна мрежа, обучена върху един набор от данни, и да я адаптираме за класифициране на различни изображения без пълния процес на обучение?\n",
|
||||
"Обучението на CNN може да отнеме много време и за тази задача са необходими големи количества данни. Въпреки това, голяма част от времето се изразходва за научаване на най-добрите ниско-нивови филтри, които мрежата използва за извличане на модели от изображенията. Възниква естествен въпрос - можем ли да използваме невронна мрежа, обучена върху един набор от данни, и да я адаптираме за класифициране на различни изображения без цялостния процес на обучение?\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 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",
|
||||
"\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,7 +453,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"> **Забележка**: Всички изображения в набора от данни са представени като тензори с плаваща запетая в диапазона 0-255. Преди да ги подадем на невронната мрежа, трябва да скалираме тези стойности в диапазона 0-1. Когато визуализираме изображения, трябва или да направим същото, или да преобразуваме стойностите в тип `int` (което правим в кода по-горе), за да покажем на `matplotlib`, че искаме да визуализираме оригиналното нескалирано изображение.\n"
|
||||
"> **Забележка**: Всички изображения в набора от данни са представени като тензори с плаваща запетая в диапазон 0-255. Преди да ги подадем на невронната мрежа, трябва да мащабираме тези стойности в диапазон 0-1. При изобразяване на изображения трябва или да направим същото, или да конвертираме стойностите в тип `int` (което правим в кода по-горе), за да покажем на `matplotlib`, че искаме да изобразим оригиналното немащабирано изображение.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -462,7 +462,7 @@
|
|||
"source": [
|
||||
"## Предварително обучени модели\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,16 +521,16 @@
|
|||
"metadata": {},
|
||||
"source": [
|
||||
"Има няколко важни неща тук:\n",
|
||||
"* Преди да се подаде вход към предварително обучена мрежа, той трябва да бъде предварително обработен по определен начин. Това се прави чрез извикване на съответната функция `preprocess_input`, която приема партида от изображения и връща тяхната обработена форма. В случая с VGG-16 изображенията се нормализират и се изважда предварително дефинирана средна стойност за всеки канал. Това е така, защото VGG-16 първоначално е обучена с този вид предварителна обработка.\n",
|
||||
"* Невронната мрежа се прилага към входната партида и като резултат получаваме партида от тензори с 1000 елемента, които показват вероятността за всеки клас. Можем да намерим номера на най-вероятния клас, като извикаме `argmax` върху този тензор.\n",
|
||||
"* Полученият резултат е [номер на клас от `ImageNet`](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). За да разберем този резултат, можем също да използваме функцията `decode_predictions`, която връща топ n класове заедно с техните имена.\n"
|
||||
"* Преди да се подаде вход към някоя предварително обучена мрежа, той трябва да бъде предварително обработен по определен начин. Това става чрез извикване на съответната функция `preprocess_input`, която приема партида от изображения и връща тяхната обработена форма. В случая с VGG-16, изображенията се нормализират и се изважда някаква предварително зададена средна стойност за всеки канал. Това е, защото VGG-16 първоначално е бил обучен с тази предварителна обработка.\n",
|
||||
"* Невронната мрежа се прилага към входната партида, и получаваме като резултат партида от 1000-елементни тензори, които показват вероятността за всеки клас. Можем да намерим най-вероятния номер на клас, като изпълним `argmax` върху този тензор.\n",
|
||||
"* Полученият резултат е [номер на клас от `ImageNet`](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). За да разберем смисъла на този резултат, можем също да използваме функцията `decode_predictions`, която връща топ n класове заедно с техните имена.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Нека да видим и архитектурата на мрежата VGG-16:\n"
|
||||
"Нека видим и архитектурата на мрежата VGG-16:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -597,9 +607,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Изчисления с GPU\n",
|
||||
"## 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": [
|
||||
"## Извличане на характеристики с VGG\n",
|
||||
"\n",
|
||||
"Ако искаме да използваме VGG-16 за извличане на характеристики от нашите изображения, трябва да имаме модела без крайните слоеве за класификация. Можем да създадем VGG-16 модел без горните слоеве, използвайки този код:\n"
|
||||
"## Извличане на VGG характеристики\n",
|
||||
"\n",
|
||||
"Ако искаме да използваме VGG-16 за извличане на характеристики от нашите изображения, се нуждаем от модела без последните класификационни слоеве. Можем да създадем VGG-16 модел без горните слоеве, като използваме този код:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -680,9 +691,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Размерите на тензора на характеристиките са 7x7x512, но за да го визуализираме, трябваше да го преобразуваме в 2D форма.\n",
|
||||
"Размерът на тензора с характеристики е 7x7x512, но за да го визуализираме, трябваше да го преоформим във 2D форма.\n",
|
||||
"\n",
|
||||
"Сега нека опитаме да видим дали тези характеристики могат да се използват за класифициране на изображения. Нека ръчно вземем част от изображенията (в нашия случай 50 минипартиди) и предварително изчислим техните векторни характеристики. Можем да използваме **dataset** API на Tensorflow за това. Функцията `map` приема dataset и прилага дадена lambda-функция, за да го трансформира. Използваме този механизъм, за да създадем нови datasets, `ds_features_train` и `ds_features_test`, които съдържат извлечените характеристики от VGG вместо оригиналните изображения.\n"
|
||||
"Сега нека опитаме да видим дали тези характеристики могат да се използват за класифициране на изображения. Нека ръчно вземем част от изображенията (50 минипартиди в нашия случай) и предварително изчислим техните векторни характеристики. Можем да използваме Tensorflow **dataset** API за това. Функцията `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",
|
||||
"## Трансферно обучение с използване на една 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",
|
||||
"> **Note**: Замразяването на теглата на извличащия характеристики е необходимо, защото в противен случай необученият класификационен слой може да унищожи оригиналните предварително обучени тегла на конволюционния извличащ.\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"
|
||||
"След като обучим модела, можем да запишем архитектурата на модела и обучените тегла във файл за бъдеща употреба:\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",
|
||||
"> **Note:** Важно е първо да замразите параметрите и да извършите няколко епохи на обучение, за да стабилизирате теглата в слоя на класификатора. Ако веднага започнете да обучавате мрежата от край до край с отключени параметри, големите грешки вероятно ще унищожат предварително обучените тегла в конволюционните слоеве.\n",
|
||||
"> **Забележка:** Важно е първо да заключите параметрите и да проведете няколко епохи на обучение, за да стабилизирате теглата в класификационния слой. Ако веднага започнете обучение на цялата мрежа с размразени параметри, големи грешки могат да унищожат предварително обучените тегла в конволюционните слоеве.\n",
|
||||
"\n",
|
||||
"Нашият конволюционен модел VGG-16 се намира в първия слой и сам по себе си се състои от много слоеве. Можем да разгледаме неговата структура:\n"
|
||||
"Нашият конволюционен VGG-16 модел се намира в първия слой и самият той се състои от много слоеве. Можем да разгледаме неговата структура:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -961,7 +972,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Въпреки това, размразяването на всички наведнъж не е най-добрата идея. Можем първо да размразим само няколко последни слоя от свивания, защото те съдържат по-високо ниво на модели, които са релевантни за нашите изображения. Например, за начало можем да замразим всички слоеве, освен последните 4:\n"
|
||||
"Въпреки това, размразяването на всички наведнъж не е най-добрата идея. Можем първо да размразим само няколко от крайните слоеве на свивания, тъй като те съдържат по-високоефективни модели, които са релевантни за нашите изображения. Например, за начало можем да замразим всички слоеве, с изключение на последните 4: \n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1000,11 +1011,11 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Забележете, че броят на обучаемите параметри се увеличи значително, но все пак е около 50% от всички параметри.\n",
|
||||
"Забележете, че броят на параметрите, които могат да се обучават, се е увеличил значително, но все още е около 50% от всички параметри.\n",
|
||||
"\n",
|
||||
"След отключването, можем да направим още няколко епохи на обучение (в нашия пример ще направим само една). Можете също така да изберете по-ниска скорост на обучение, за да минимизирате влиянието върху предварително обучените тегла. Въпреки това, дори с ниска скорост на обучение, можете да очаквате точността да спадне в началото на обучението, докато накрая достигне малко по-високо ниво в сравнение със случая на фиксирани тегла.\n",
|
||||
"След размразяването, можем да направим още няколко епохи на обучение (в нашия пример, ще направим само една). Можете също да изберете по-ниска скорост на учене, за да минимизирате въздействието върху предварително обучените тежести. Въпреки това, дори и с ниска скорост на учене, можете да очаквате точността да спадне в началото на обучението, докато накрая достигне ниво, леко по-високо от това при фиксираните тежести.\n",
|
||||
"\n",
|
||||
"> **Note:** Това обучение протича много по-бавно, защото трябва да пропагираме градиентите обратно през много слоеве на мрежата!\n"
|
||||
"> **Забележка:** Това обучение протича много по-бавно, защото трябва да разпространяваме градиенти обратно през много слоеве на мрежата!\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1028,9 +1039,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Вероятно ще постигнем по-висока точност при обучението, защото използваме по-мощна мрежа с повече параметри, но точността при валидацията няма да се увеличи толкова значително.\n",
|
||||
"Вероятно ще постигнем по-висока точност на обучението, защото използваме по-мощна мрежа с повече параметри, но точността на валидацията няма да се увеличи толкова много.\n",
|
||||
"\n",
|
||||
"Можете спокойно да отключите още няколко слоя от мрежата и да продължите обучението, за да видите дали ще успеете да постигнете по-висока точност!\n"
|
||||
"Чувствайте се свободни да размразите още няколко слоя на мрежата и да тренирате повече, за да видите дали можете да постигнете по-висока точност!\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1039,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"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -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"
|
||||
"Можете да видите, че по-сложните задачи, които решаваме сега, изискват по-висока изчислителна мощност и не могат лесно да бъдат решени на CPU. В следващото звено ще опитаме да използваме по-лек вариант за обучение на същия модел с по-ниски изчислителни ресурси, което води до малко по-ниска точност.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**Отказ от отговорност**: \nТози документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматичните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия изходен език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален превод от човек. Не носим отговорност за каквито и да било недоразумения или погрешни интерпретации, произтичащи от използването на този превод.\n"
|
||||
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**Отказ от отговорност**:\nТози документ е преведен с помощта на AI преводачески услуга [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-29T23:21:13+00:00",
|
||||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb",
|
||||
"language_code": "bg"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
|
|
|||
|
|
@ -1,51 +1,51 @@
|
|||
# Обработка на естествен език
|
||||
|
||||

|
||||

|
||||
|
||||
В тази секция ще се фокусираме върху използването на невронни мрежи за решаване на задачи, свързани с **обработката на естествен език (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).
|
||||
* **Обобщаване на текст** е техника, при която искаме компютърът да "прочете" дълъг текст и да го обобщи в няколко изречения.
|
||||
* **Машинен превод** може да се разглежда като комбинация от разбиране на текст на един език и генериране на текст на друг.
|
||||
* **Класификация на текст** е типичен проблем на класификация, отнасящ се до текстови последователности. Примери включват класифициране на имейл съобщения като спам или не-спам, или категоризиране на статии като спорт, бизнес, политика и др. Също така, при разработване на чатботове често трябва да разбираме какво е искал да каже потребителят – в този случай става дума за **класификация на намеренията**. Често при класификация на намерения се справяме с много категории.
|
||||
* **Анализ на настроения** е типичен проблем на регресия, при който трябва да приписваме число (настроение), съответстващо на това колко положително/отрицателно е значението на изречението. По-напреднала версия на анализа на настроения е **анализ на настроенията по аспекти** (ABSA), при който приписваме настроението не на цялото изречение, а на различни части от него (аспекти), например *В този ресторант ми хареса кухнята, но атмосферата беше ужасна*.
|
||||
* **Разпознаване на именувани обекти** (NER) се отнася до задачата за извличане на определени обекти от текста. Например, може да трябва да разберем, че в израза *Трябва да летя за Париж утре* думата *утре* се отнася за ДАТА, а *Париж* е ЛОКАЦИЯ.
|
||||
* **Извличане на ключови думи** е подобно на NER, но трябва да извличаме автоматично важни за значението на изречението думи, без предварително обучение за конкретни типове обекти.
|
||||
* **Клъстериране на текст** може да бъде полезно, когато искаме да групираме подобни изречения, например сходни запитвания в разговори със техническа поддръжка.
|
||||
* **Отговаряне на въпроси** се отнася до способността на модел да отговаря на конкретен въпрос. Моделът получава текстов откъс и въпрос като входни данни и трябва да предостави мястото в текста, където се съдържа отговорът на въпроса (или понякога да генерира текст на отговора).
|
||||
* **Генериране на текст** е способността на модел да генерира нов текст. Това може да се разглежда като задача на класификация, която предсказва следващата буква/дума въз основа на някакъв *текстов подтик*. Напреднали модели за генериране на текст, като GPT-3, могат да решават и други NLP задачи, като класификация, използвайки техника, наречена [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 задачи се решаваха с помощта на традиционни методи, като граматики. Например при машинен превод се използваха парсъри за преобразуване на първичното изречение в синтактично дърво, след това се извличаха по-високо ниво семантични структури за представяне на значението на изречението, и на базата на това значение и граматиката на целевия език се генерираше резултатът. Днес много NLP задачи се решават по-ефективно с помощта на невронни мрежи.
|
||||
|
||||
> Много класически методи за NLP са имплементирани в Python библиотеката [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org). Съществува страхотна [книга за NLTK](https://www.nltk.org/book/), достъпна онлайн, която обхваща как различни NLP задачи могат да бъдат решени с помощта на NLTK.
|
||||
> Много класически NLP методи са реализирани в библиотеката за Python [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org). Има страхотна онлайн книга [NLTK Book](https://www.nltk.org/book/), която покрива как различни NLP задачи могат да се решат с помощта на NLTK.
|
||||
|
||||
В нашия курс основно ще се фокусираме върху използването на невронни мрежи за NLP и ще използваме NLTK, когато е необходимо.
|
||||
В нашия курс най-вече ще се фокусираме върху използване на невронни мрежи за NLP и ще използваме NLTK, когато е необходимо.
|
||||
|
||||
Вече научихме как да използваме невронни мрежи за работа с таблични данни и изображения. Основната разлика между тези типове данни и текста е, че текстът е последователност с променлива дължина, докато размерът на входните данни при изображенията е известен предварително. Докато конволюционните мрежи могат да извличат модели от входните данни, моделите в текста са по-сложни. Например, можем да имаме отрицание, което е отделено от подлога с произволен брой думи (напр. *Не харесвам портокали* срещу *Не харесвам онези големи цветни вкусни портокали*), и това все пак трябва да се интерпретира като един модел. Следователно, за да обработваме език, трябва да въведем нови типове невронни мрежи, като *рекурентни мрежи* и *трансформъри*.
|
||||
Вече сме научили за използването на невронни мрежи за работа с таблични данни и с изображения. Основната разлика между тези типове данни и текста е, че текстът е последователност с променлива дължина, докато размерът на входа при изображенията е известен предварително. Докато конволюционните мрежи могат да извличат образци от входните данни, образците в текста са по-сложни. Например, може да имаме отрицание, което е отделено от подлога и да е разделено от много думи (например *Не обичам портокали* спрямо *Не обичам тези големи цветни вкусни портокали*), но това все още трябва да се интерпретира като един образец. Затова, за да обработваме езика, трябва да въведем нови типове невронни мрежи, като *рекурентни мрежи* и *трансформъри*.
|
||||
|
||||
## Инсталиране на библиотеки
|
||||
|
||||
Ако използвате локална Python инсталация за този курс, може да се наложи да инсталирате всички необходими библиотеки за NLP с помощта на следните команди:
|
||||
Ако използвате локална Python инсталация за изпълнение на този курс, може да се наложи да инсталирате всички необходими библиотеки за NLP с помощта на следните команди:
|
||||
|
||||
**За 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)
|
||||
> Можете да пробвате 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 паметта правилно при трениране на няколко модела в една Python сесия. За ефективно управление на GPU паметта можете да конфигурирате TensorFlow да заделя GPU памет само при нужда.
|
||||
* **Включване на код**: За да настроите TensorFlow да увеличава GPU паметта само при необходимост, включете следния код във вашите тетрадки:
|
||||
В този раздел, в някои от примерите ще тренираме доста големи модели.
|
||||
* **Използвайте компютър с поддръжка на GPU**: Препоръчително е да изпълнявате вашите тетрадки на компютър с GPU, за да намалите времето за изчакване при работа с големи модели.
|
||||
* **Ограничения на паметта на GPU**: Изпълнението на GPU може да доведе до ситуации, в които изчерпвате паметта на GPU, особено при тренировката на големи модели.
|
||||
* **Консумация на памет в GPU**: Количеството памет на GPU, използвана по време на трениране, зависи от различни фактори, включително размера на минипакета.
|
||||
* **Минимизирайте размера на минипакета**: Ако срещнете проблеми с паметта на GPU, обмислете намаляване на размера на минипакета във вашия код като възможно решение.
|
||||
* **Освобождаване на паметта на GPU в TensorFlow**: По-старите версии на TensorFlow може да не освобождават правилно паметта на GPU при трениране на множество модели в един Python kernel. За да управлявате ефективно използването на паметта на 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 от класическа ML перспектива, посетете [този набор от уроци](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)
|
||||
* [Векторни представяния на думи (Word Embeddings)](14-Emdeddings/README.md)
|
||||
* [Моделиране на езика](15-LanguageModeling/README.md)
|
||||
* [Рекурентни невронни мрежи](16-RNN/README.md)
|
||||
* [Генеративни мрежи](17-GenerativeNetworks/README.md)
|
||||
* [Трансформъри](18-Transformers/README.md)
|
||||
|
||||
**Отказ от отговорност**:
|
||||
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**Отказ от отговорност**:
|
||||
Този документ е преведен с помощта на AI преводачески услуга [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": "bn"
|
||||
},
|
||||
"CONTRIBUTING.md": {
|
||||
"original_hash": "c6fd7e781b67111a90abd166d0ce4aa0",
|
||||
"translation_date": "2026-07-08T19:08:08+00:00",
|
||||
"source_file": "CONTRIBUTING.md",
|
||||
"language_code": "bn"
|
||||
},
|
||||
"README.md": {
|
||||
"original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b",
|
||||
"translation_date": "2026-04-06T20:52:41+00:00",
|
||||
|
|
@ -17,6 +23,19 @@
|
|||
"source_file": "SECURITY.md",
|
||||
"language_code": "bn"
|
||||
},
|
||||
"__translation_failures__": {
|
||||
"lessons/sketchnotes/LICENSE.md": {
|
||||
"original_hash": "45ab63a2cd8f5faef6c9b150618837a4",
|
||||
"source_file": "lessons/sketchnotes/LICENSE.md",
|
||||
"language_code": "bn",
|
||||
"failure_date": "2026-07-08T19:07:40+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:17:08+00:00",
|
||||
|
|
@ -54,8 +73,8 @@
|
|||
"language_code": "bn"
|
||||
},
|
||||
"examples/README.md": {
|
||||
"original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7",
|
||||
"translation_date": "2025-10-03T11:28:50+00:00",
|
||||
"original_hash": "7883d52c2e2a221e0b07a7b112a149b9",
|
||||
"translation_date": "2026-07-08T19:02:21+00:00",
|
||||
"source_file": "examples/README.md",
|
||||
"language_code": "bn"
|
||||
},
|
||||
|
|
@ -66,8 +85,8 @@
|
|||
"language_code": "bn"
|
||||
},
|
||||
"lessons/0-course-setup/how-to-run.md": {
|
||||
"original_hash": "a4717bd9103b9f6cd84d534b83534689",
|
||||
"translation_date": "2026-01-15T13:05:15+00:00",
|
||||
"original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1",
|
||||
"translation_date": "2026-07-08T19:02:44+00:00",
|
||||
"source_file": "lessons/0-course-setup/how-to-run.md",
|
||||
"language_code": "bn"
|
||||
},
|
||||
|
|
@ -191,6 +210,12 @@
|
|||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md",
|
||||
"language_code": "bn"
|
||||
},
|
||||
"lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": {
|
||||
"original_hash": "99b816b6a4957ef4100cee4c4221dff9",
|
||||
"translation_date": "2026-07-08T18:52:02+00:00",
|
||||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb",
|
||||
"language_code": "bn"
|
||||
},
|
||||
"lessons/4-ComputerVision/08-TransferLearning/lab/README.md": {
|
||||
"original_hash": "7765935c35fcee69b9fe2d0cfd6963e2",
|
||||
"translation_date": "2025-08-26T09:52:54+00:00",
|
||||
|
|
@ -330,8 +355,8 @@
|
|||
"language_code": "bn"
|
||||
},
|
||||
"lessons/5-NLP/README.md": {
|
||||
"original_hash": "8ef02a9318257ea140ed3ed74442096d",
|
||||
"translation_date": "2025-08-26T08:03:35+00:00",
|
||||
"original_hash": "038df6f1a73e49f6430740da083bfd6d",
|
||||
"translation_date": "2026-07-08T19:03:19+00:00",
|
||||
"source_file": "lessons/5-NLP/README.md",
|
||||
"language_code": "bn"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -0,0 +1,29 @@
|
|||
# AI-For-Beginners-এ অবদান রাখা
|
||||
|
||||
AI-For-Beginners-এ অবদান রাখার আগ্রহ প্রদর্শনের জন্য ধন্যবাদ! আমরা অনুবাদ, পাঠ সংশোধন এবং বিন্যাস সংশোধন স্বাগত জানাই।
|
||||
|
||||
## Microsoft কনট্রিবিউটর লাইসেন্স এগ্রিমেন্ট (CLA)
|
||||
|
||||
এই প্রকল্প অবদান এবং প্রস্তাবনা গ্রহণ করে। বেশিরভাগ অবদানের জন্য আপনাকে একটি কনট্রিবিউটর লাইসেন্স এগ্রিমেন্ট (CLA) মানতে হবে যা ঘোষণা করে যে আপনার কাছে আপনার অবদান ব্যবহারের অধিকার আছে এবং আপনি আসলেই তা আমাদের প্রদান করছেন। বিস্তারিত জানতে [https://cla.microsoft.com](https://cla.microsoft.com) দেখুন।
|
||||
|
||||
যখন আপনি একটি পুল রিকোয়েস্ট জমা দিবেন, একটি CLA-বট স্বয়ংক্রিয়ভাবে নির্ধারণ করবে আপনি CLA প্রদান করবেন কি না এবং প্রি-আর-টির যথাযথ লেবেল বা মন্তব্য যোগ করবে। শুধু বট প্রদত্ত নির্দেশনা অনুসরণ করুন। আমাদের CLA ব্যবহার করা সব রেপোজিটরির মধ্যে এটি আপনাকে একবারই করতে হবে।
|
||||
|
||||
## কিভাবে অবদান রাখবেন
|
||||
|
||||
### ১. টাইপো / কোড ত্রুটি সংশোধন
|
||||
আপনি যদি যেকোনো জুপিটার নোটবুক বা পাঠ মার্কডাউন ফাইলে টাইপো অথবা বাগ খুঁজে পান:
|
||||
১. রেপোজিটরিটি ফর্ক করুন।
|
||||
২. টাইপো বা ভাঙা লিংক ঠিক করুন।
|
||||
৩. ঠিক করার একটি স্পষ্ট বিবরণ সহ একটি পুল রিকোয়েস্ট জমা দিন।
|
||||
|
||||
### ২. অনুবাদ জমা দেওয়া
|
||||
আমরা পাঠের অন্য ভাষায় অনুবাদকে স্বাগত জানাই! অনুবাদসমূহ `translations/` ডিরেক্টরির অধীনে বিদ্যমান ফোল্ডার নাম ব্যবহার করে রাখুন (যেমন `translations/es/`, `translations/pt-BR/`, `translations/zh-CN/`)।
|
||||
|
||||
বিস্তারিত জানতে দেখুন [etc/CONTRIBUTING.md](etc/CONTRIBUTING.md)।
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**অস্বীকৃতি**:
|
||||
এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনূদিত হয়েছে। যদিও আমরা শুদ্ধতার জন্য চেষ্টা করি, অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল নথিটি তার স্বভাষায় কর্তৃত্বপূর্ণ উৎস হিসেবে বিবেচিত হওয়া উচিত। গুরুত্বপূর্ণ তথ্যের জন্য পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদের ব্যবহারে প্রয়োজনীয় ভুল বোঝাবুঝি বা ভুল ব্যাখ্যার জন্য আমরা দায়বদ্ধ নই।
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -1,85 +1,87 @@
|
|||
# AI-এর সহজ উদাহরণ
|
||||
# শিক্ষানবীশ-অনুকূল AI উদাহরণসমূহ
|
||||
|
||||
স্বাগতম! এই ডিরেক্টরিতে সহজ, স্বতন্ত্র উদাহরণ রয়েছে যা আপনাকে AI এবং মেশিন লার্নিং শুরু করতে সাহায্য করবে। প্রতিটি উদাহরণ নবাগতদের জন্য উপযোগীভাবে তৈরি করা হয়েছে, যেখানে বিস্তারিত মন্তব্য এবং ধাপে ধাপে ব্যাখ্যা রয়েছে।
|
||||
স্বাগতম! এই ডিরেক্টরিটি সহজ, স্বতন্ত্র উদাহরণ ধারণ করে যা আপনাকে AI এবং মেশিন লার্নিং শুরু করতে সহায়তা করবে। প্রতিটি উদাহরণ শিক্ষানবীশ-অনুকূলভাবে বিস্তারিত মন্তব্য এবং ধাপে ধাপে ব্যাখ্যার সাথে ডিজাইন করা হয়েছে।
|
||||
|
||||
## 📚 উদাহরণগুলোর সংক্ষিপ্ত বিবরণ
|
||||
## 📚 উদাহরণসমূহের সংক্ষিপ্ত বিবরণ
|
||||
|
||||
| উদাহরণ | বিবরণ | কঠিনতা | পূর্বশর্ত |
|
||||
| উদাহরণ | বিবরণ | কঠিনতা | পূর্বপ্রয়োজনীয়তা |
|
||||
|---------|-------------|------------|---------------|
|
||||
| [Hello AI World](../../../examples/01-hello-ai-world.py) | আপনার প্রথম AI প্রোগ্রাম - সহজ প্যাটার্ন শনাক্তকরণ | ⭐ নবাগত | পাইথন বেসিক |
|
||||
| [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) | আপনার প্রথম AI প্রোগ্রাম - সহজ প্যাটার্ন চিনাক্তকরণ | ⭐ শিক্ষানবীশ | পাইথন বেসিক |
|
||||
| [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) | প্রি-ট্রেইন্ড মডেল দিয়ে ছবি শ্রেণিবিভাজন করুন | ⭐⭐ শিক্ষানবীশ+ | পাইথন, নাম্পাই |
|
||||
| [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)
|
||||
# জুপিটার নোটবুকের জন্য (ইমেজ ক্লাসিফায়ার)
|
||||
pip install jupyter numpy pillow tensorflow
|
||||
```
|
||||
|
||||
অথবা প্রধান কারিকুলামের কন্ডা এনভায়রনমেন্ট ব্যবহার করুন:
|
||||
অথবা মূল পাঠ্যক্রম থেকে কন্ডা পরিবেশ ব্যবহার করুন:
|
||||
|
||||
```bash
|
||||
conda env create --name ai4beg --file ../environment.yml
|
||||
conda activate ai4beg
|
||||
```
|
||||
|
||||
### উদাহরণ চালানো
|
||||
### উদাহরণসমূহ চালানো
|
||||
|
||||
**পাইথন স্ক্রিপ্ট (.py ফাইল) এর জন্য:**
|
||||
**পাইথন স্ক্রিপ্টের জন্য (.py ফাইল):**
|
||||
```bash
|
||||
python 01-hello-ai-world.py
|
||||
```
|
||||
|
||||
**জুপিটার নোটবুক (.ipynb ফাইল) এর জন্য:**
|
||||
**জুপিটার নোটবুকের জন্য (.ipynb ফাইল):**
|
||||
```bash
|
||||
jupyter notebook 03-image-classifier.ipynb
|
||||
```
|
||||
|
||||
## 📖 শেখার পথ
|
||||
|
||||
আমরা উদাহরণগুলো ধারাবাহিকভাবে অনুসরণ করার পরামর্শ দিই:
|
||||
আমরা উদাহরণগুলো নিম্নলিখিত ক্রমে অনুসরণ করার পরামর্শ দিই:
|
||||
|
||||
1. **"Hello AI World" দিয়ে শুরু করুন** - প্যাটার্ন শনাক্তকরণের বেসিক শিখুন
|
||||
2. **একটি Simple Neural Network তৈরি করুন** - নিউরাল নেটওয়ার্ক কীভাবে কাজ করে তা বুঝুন
|
||||
3. **Image Classifier চেষ্টা করুন** - বাস্তব ছবির মাধ্যমে AI দেখুন
|
||||
4. **Text Sentiment বিশ্লেষণ করুন** - প্রাকৃতিক ভাষা প্রক্রিয়াকরণ অন্বেষণ করুন
|
||||
1. **"Hello AI World" দিয়ে শুরু করুন** - প্যাটার্ন চিনাক্তকরণের বেসিক শিখুন
|
||||
2. **একটি সহজ নিউরাল নেটওয়ার্ক তৈরি করুন** - নিউরাল নেটওয়ার্ক কিভাবে কাজ করে বুঝুন
|
||||
3. **ছবি শ্রেণিবিভাজনকারী চেষ্টা করুন** - বাস্তব ছবি দিয়ে AI-এর কার্যকারিতা দেখুন
|
||||
4. **টেক্সট মনোভাব বিশ্লেষণ করুন** - ন্যাচারাল ল্যাঙ্গুয়েজ প্রসেসিং অন্বেষণ করুন
|
||||
|
||||
## 💡 নবাগতদের জন্য টিপস
|
||||
## 💡 শিক্ষানবীশদের জন্য টিপস
|
||||
|
||||
- **কোডের মন্তব্যগুলো মনোযোগ দিয়ে পড়ুন** - এগুলো প্রতিটি লাইনের কাজ ব্যাখ্যা করে
|
||||
- **পরীক্ষা করুন!** - মান পরিবর্তন করে দেখুন কী ঘটে
|
||||
- **সবকিছু বুঝতে না পারলে চিন্তা করবেন না** - শেখার জন্য সময় লাগে
|
||||
- **প্রশ্ন করুন** - [আলোচনা বোর্ড](https://github.com/microsoft/AI-For-Beginners/discussions) ব্যবহার করুন
|
||||
- **কোড মন্তব্যগুলো মনোযোগ দিয়ে পড়ুন** - তারা প্রতিটি লাইনের কাজ ব্যাখ্যা করে
|
||||
- **পরীক্ষা করুন!** - মানগুলি পরিবর্তন করার চেষ্টা করুন এবং দেখুন কি হয়
|
||||
- **সব কিছু বুঝতে চিন্তা করবেন না** - শেখায় সময় লাগে
|
||||
- **প্রশ্ন করুন** - [Discussion board](https://github.com/microsoft/AI-For-Beginners/discussions) ব্যবহার করুন
|
||||
|
||||
## 🔗 পরবর্তী ধাপ
|
||||
## 🔗 পরবর্তী ধাপসমূহ
|
||||
|
||||
এই উদাহরণগুলো সম্পন্ন করার পর পুরো কারিকুলাম অন্বেষণ করুন:
|
||||
- [AI-এর পরিচিতি](../lessons/1-Intro/README.md)
|
||||
এই উদাহরণগুলি সম্পন্ন করার পর পূর্ণ পাঠ্যক্রমটি অন্বেষণ করুন:
|
||||
- [Introduction to AI](../lessons/1-Intro/README.md)
|
||||
- [Neural Networks](../lessons/3-NeuralNetworks/README.md)
|
||||
- [Computer Vision](../lessons/4-ComputerVision/README.md)
|
||||
- [Natural Language Processing](../lessons/5-NLP/README.md)
|
||||
|
||||
## 🤝 অবদান রাখুন
|
||||
## 🤝 অবদান রাখা
|
||||
|
||||
এই উদাহরণগুলো উপকারী মনে হয়েছে? এগুলো আরও উন্নত করতে সাহায্য করুন:
|
||||
- সমস্যা রিপোর্ট করুন বা উন্নতির পরামর্শ দিন
|
||||
- নবাগতদের জন্য আরও উদাহরণ যোগ করুন
|
||||
এই উদাহরণগুলো উপকারী মনে হলে? এগুলো উন্নত করতে আমাদের সাহায্য করুন:
|
||||
- সমস্যা রিপোর্ট করুন বা উন্নতির প্রস্তাব দিন
|
||||
- শিক্ষানবীশদের জন্য আরও উদাহরণ যোগ করুন
|
||||
- ডকুমেন্টেশন এবং মন্তব্য উন্নত করুন
|
||||
|
||||
---
|
||||
|
||||
*মনে রাখবেন: প্রতিটি বিশেষজ্ঞ একসময় নবাগত ছিল। শুভ শেখা! 🎓*
|
||||
*মনে রাখবেন: প্রতিটি বিশেষজ্ঞ এক সময়ে একজন শিক্ষানবীশ ছিলেন। শুভ শেখা! 🎓*
|
||||
|
||||
---
|
||||
|
||||
**অস্বীকৃতি**:
|
||||
এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসাধ্য সঠিকতার জন্য চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**অস্বীকৃতি**:
|
||||
এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনূদিত হয়েছে। যদিও আমরা শুদ্ধতার জন্য চেষ্টা করি, অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল নথিটি তার স্বভাষায় কর্তৃত্বপূর্ণ উৎস হিসেবে বিবেচিত হওয়া উচিত। গুরুত্বপূর্ণ তথ্যের জন্য পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদের ব্যবহারে প্রয়োজনীয় ভুল বোঝাবুঝি বা ভুল ব্যাখ্যার জন্য আমরা দায়বদ্ধ নই।
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -1,12 +1,12 @@
|
|||
# কোড কিভাবে চালাবেন
|
||||
# কোড কীভাবে চালাবেন
|
||||
|
||||
এই পাঠ্যক্রমে অনেক এক্সিকিউটেবল উদাহরণ এবং ল্যাব আছে যেগুলি আপনি চালাতে চাইবেন। এটি করার জন্য, আপনাকে এই পাঠ্যক্রমের অংশ হিসেবে প্রদত্ত Jupyter Notebooks-এ Python কোড চালানোর ক্ষমতা থাকতে হবে। কোড চালানোর জন্য আপনার কাছে বেশ কয়েকটি অপশন আছে:
|
||||
এই পাঠক্রমে অনেক রানযোগ্য উদাহরণ এবং ল্যাব রয়েছে যা আপনি চালাতে চাইবেন। এটি করতে, আপনাকে এই পাঠক্রমের অংশ হিসেবে প্রদান করা জুপিটার নোটবুকে পাইথন কোড চালানোর ক্ষমতা থাকতে হবে। কোড চালানোর জন্য আপনার বেশ কয়েকটি অপশন রয়েছে:
|
||||
|
||||
## আপনার কম্পিউটারে লোকালি চালানো
|
||||
|
||||
আপনার কম্পিউটারে লোকালি কোড চালাতে হলে Python ইনস্টলেশন প্রয়োজন। একটি সুপারিশ হলো **[miniconda](https://conda.io/en/latest/miniconda.html)** ইনস্টল করা - এটি একটি তুলনামূলক লাইটওয়েট ইনস্টলেশন যা Python **ভার্চুয়াল এনভায়রনমেন্ট** গুলির জন্য `conda` প্যাকেজ ম্যানেজার সাপোর্ট করে।
|
||||
আপনার কম্পিউটারে কোড লোকালি চালাতে হলে, একটি পাইথন ইনস্টলেশন প্রয়োজন। একটি সুপারিশ হলো **[miniconda](https://conda.io/en/latest/miniconda.html)** ইনস্টল করা — এটি একটি তুলনামূলক হালকা ইনস্টলেশন যা `conda` প্যাকেজ ম্যানেজারকে বিভিন্ন পাইথন **ভার্চুয়াল এনভায়রনমেন্টের** জন্য সমর্থন করে।
|
||||
|
||||
miniconda ইনস্টল করার পর, রিপোজিটরি ক্লোন করুন এবং এই কোর্সের জন্য ব্যবহৃত একটি ভার্চুয়াল এনভায়রনমেন্ট তৈরি করুন:
|
||||
miniconda ইনস্টল করার পরে, রিপোজিটরি ক্লোন করুন এবং এই কোর্সের জন্য ব্যবহারের জন্য একটি ভার্চুয়াল এনভায়রনমেন্ট তৈরি করুন:
|
||||
|
||||
```bash
|
||||
git clone http://github.com/microsoft/ai-for-beginners
|
||||
|
|
@ -15,57 +15,57 @@ conda env create --name ai4beg --file .devcontainer/environment.yml
|
|||
conda activate ai4beg
|
||||
```
|
||||
|
||||
### Visual Studio Code সহ Python Extension ব্যবহার
|
||||
### পাইথন এক্সটেনশনের সাথে ভিজ্যুয়াল স্টুডিও কোড ব্যবহার করা
|
||||
|
||||
এই পাঠ্যক্রমটি সর্বোত্তমভাবে ব্যবহৃত হয় যখন এটি [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 কোডে খুললে, এটি স্বয়ংক্রিয়ভাবে পাইথন এক্সটেনশন ইনস্টল করতে সুপারিশ করবে। উপরোক্ত বর্ণনামতো আপনাকে miniconda ইনস্টল করতেও হবে।
|
||||
|
||||
> **নোট**: যদি VS Code আপনাকে রিপোজিটরি একটি কন্টেইনারে পুনরায় খোলার প্রস্তাব দেয়, তাহলে আপনাকে লোকাল Python ইনস্টলেশন ব্যবহার করার জন্য এটি অস্বীকার করতে হবে।
|
||||
> **নোট**: যদি VS কোড আপনাকে রেপোজিটরিটি একটি কন্টেইনারে পুনরায় খুলতে বলে, আপনি লোকাল পাইথন ইনস্টলেশন ব্যবহারের জন্য এটি প্রত্যাখ্যান করবেন।
|
||||
|
||||
### ব্রাউজারে Jupyter ব্যবহার
|
||||
### ব্রাউজারে জুপিটার ব্যবহার করা
|
||||
|
||||
আপনি ব্রাউজার থেকে আপনার নিজের কম্পিউটারে Jupyter পরিবেশ ব্যবহার করতেও পারেন। ক্লাসিক্যাল Jupyter এবং JupyterHub উভয়ই অটো-কমপ্লিশন, কোড হাইলাইটিং ইত্যাদি সহ একটি সুবিধাজনক ডেভেলপমেন্ট পরিবেশ প্রদান করে।
|
||||
আপনার নিজের কম্পিউটারে ব্রাউজার থেকে একটি জুপিটার পরিবেশও ব্যবহার করতে পারেন। ক্লাসিক্যাল জুপিটার এবং জুপিটারহাব উভয়ই একটি সুবিধাজনক ডেভেলপমেন্ট পরিবেশ সরবরাহ করে, যেমন অটো-কোমপ্লিশন, কোড হাইলাইটিং ইত্যাদি।
|
||||
|
||||
লোকালি Jupyter চালু করতে, কোর্সের ডিরেক্টরিতে যান এবং নিচের কমান্ড চালান:
|
||||
লোকালি জুপিটার শুরু করার জন্য, কোর্সের ডিরেক্টরিতে যান এবং এটি চালান:
|
||||
|
||||
```bash
|
||||
jupyter notebook
|
||||
```
|
||||
অথবা
|
||||
অ়থবা
|
||||
```bash
|
||||
jupyterhub
|
||||
```
|
||||
তারপর আপনি `.ipynb` ফাইলগুলিতে যেকোনোটা খুলে কাজ শুরু করতে পারবেন।
|
||||
আপনি তারপর `.ipynb` ফাইলগুলোর যেকোনোটিতে নেভিগেট করতে পারেন, সেগুলি খুলতে পারেন এবং কাজ শুরু করতে পারেন।
|
||||
|
||||
### কন্টেইনারে চালানো
|
||||
|
||||
Python ইনস্টলেশনের একটি বিকল্প হতে পারে কোডটি একটি কন্টেইনারে চালানো। আমাদের রিপোজিটরিগুলো একটি বিশেষ `.devcontainer` ফোল্ডার সরবরাহ করে যা এই রিপো জন্য কন্টেইনার কিভাবে বিল্ড করবেন তা নির্দেশ করে। VS Code কোডটি কন্টেইনারে পুনরায় খোলার সুযোগ দেয়। এর জন্য Docker ইনস্টলেশন প্রয়োজন, এবং এটি একটু জটিল, তাই আমরা এটি বেশি অভিজ্ঞ ব্যবহারকারীদের জন্য সুপারিশ করি।
|
||||
পাইথন ইনস্টলেশনের একটি বিকল্প হতে পারে কোড কন্টেইনারে চালানো। যেহেতু আমাদের রিপোজিটরি একটি স্পেশাল `.devcontainer` ফোল্ডার সরবরাহ করে যা এই রিপো কন্টেইনার বানানোর নির্দেশনা দেয়, VS কোড কন্টেইনারে কোড পুনরায় খুলার সুযোগ দেয়। এটি ডকার ইনস্টলেশন প্রয়োজন, এবং আরও জটিল হবে, তাই আমরা এটি বেশি অভিজ্ঞ ব্যবহারকারীদের জন্য সাজেস্ট করি।
|
||||
|
||||
## ক্লাউডে চালানো
|
||||
|
||||
যদি আপনি 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 কোডের ব্রাউজার ইন্টারফেসের মাধ্যমে অ্যাক্সেসযোগ্য। যদি আপনার Codespaces-এ অ্যাক্সেস থাকে, তাহলে আপনি কেবল রেপোতে **Code** বাটনে ক্লিক করে কোডস্পেস শুরু করতে পারেন এবং খুব দ্রুত কোড চালু করতে পারেন।
|
||||
* **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)** ব্যবহার করা। [Binder](https://mybinder.org) বিনামূল্যে ক্লাউডে কম্পিউটিং রিসোর্স প্রদান করে, যাতে আপনি GitHub-এ কিছু কোড পরীক্ষা করতে পারেন। ফ্রন্ট পেজে একটি বাটন আছে যা রিপোজিটরিটি বাইন্ডারে খুলবে — এটি দ্রুত আপনাকে বাইন্ডার সাইটে নিয়ে যাবে, যা একটি আন্ডারলাইং কন্টেইনার তৈরি করবে এবং নির্বিঘ্নে একটি জুপিটার ওয়েব ইন্টারফেস চালু করবে।
|
||||
|
||||
> **নোট**: অপব্যবহার এড়াতে, Binder কিছু ওয়েব রিসোর্স ব্লক করে রেখেছে। এটি কিছু কোড কাজ করতে বাধা দিতে পারে, যেগুলি পাবলিক ইন্টারনেট থেকে মডেল ও/অথবা ডেটাসেট ফেচ করে। আপনাকে কিছু সমাধান খুঁজে বের করতে হতে পারে। এছাড়া, Binder এর প্রদানকৃত কম্পিউটিং রিসোর্স যথেষ্ট বেসিক, তাই ট্রেনিং ধীর হবে, বিশেষ করে পরবর্তী, বেশি জটিল পাঠে।
|
||||
> **নোট**: অপব্যবহার রোধ করার জন্য, বাইন্ডারের কিছু ওয়েব রিসোর্স ব্লক করা হয়েছে। এর ফলে কিছু কোড কাজ নাও করতে পারে, যা পাবলিক ইন্টারনেট থেকে মডেল এবং/অথবা ডেটাসেট ফেচ করে। আপনাকে হয়তো কিছু বিকল্প উপায় খুঁজতে হবে। এছাড়াও, বাইন্ডারের দেওয়া কম্পিউট রিসোর্স খুব মৌলিক, তাই ট্রেনিং ধীর হবে, বিশেষত পরে, আরও জটিল পাঠে।
|
||||
|
||||
## জিপিইউ সহ ক্লাউডে চালানো
|
||||
## 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) কিংবা আপনার প্রতিষ্ঠানের মাধ্যমে ক্লাউডে অ্যাক্সেস থাকে:
|
||||
|
||||
* [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-সিরিজ VM গুলোতে GPU সাপোর্ট থাকে।
|
||||
* [Data Science Virtual Machine](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) তৈরি করুন এবং জুপিটার এর মাধ্যমে সেটির সাথে সংযোগ করুন। আপনি তারপর সরাসরি মেশিনে রিপো ক্লোন করতে পারবেন এবং শেখা শুরু করতে পারবেন। NC-সিরিজ VMs কেন GPU সাপোর্ট আছে।
|
||||
|
||||
> **নোট**: কিছু সাবস্ক্রিপশন, Azure for Students সহ, ডিফল্টভাবে GPU সাপোর্ট দেয় না। অতিরিক্ত GPU কোর পেতে হতে পারে প্রযুক্তিগত সাপোর্ট অনুরোধের মাধ্যমে।
|
||||
> **নোট**: কিছু সাবস্ক্রিপশন, Azure for Students সহ, ডিফল্টভাবে 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 নোটবুকে একটি রিপোজিটরি ক্লোন করে ব্যবহার শুরু করবেন।
|
||||
* [Azure Machine Learning Workspace](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 Notebooks আপলোড করে চালাতে পারবেন।
|
||||
আপনি Google Colab ও ব্যবহার করতে পারেন, যা কিছু ফ্রি GPU সাপোর্ট সহ আসে, এবং সেখানে জুপিটার নোটবুক আপলোড করে এক এক করে চালাতে পারেন।
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**অস্বীকৃতি**:
|
||||
এই ডকুমেন্টটি এআই অনুবাদ সেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনূদিত হয়েছে। আমরা যথাসাধ্য সঠিকতার চেষ্টা করি, তবে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা ভুল থাকতে পারে। মূল ভাষায় থাকা মূল ডকুমেন্টটিই কর্তৃত্বপ্রাপ্ত উৎস হিসেবে বিবেচিত হওয়া উচিত। গুরুত্বপূর্ণ তথ্যের জন্য পেশাদার মানব অনুবাদ প্রয়োজন। এই অনুবাদের ব্যবহারে সৃষ্ট কোনো ভুল বোঝাবুঝি বা ব্যাখ্যার জন্য আমরা দায়বদ্ধ নই।
|
||||
**অস্বীকৃতি**:
|
||||
এই নথিটি AI অনুবাদ পরিষেবা [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",
|
||||
"এই পদ্ধতিকে বলা হয় **ট্রান্সফার লার্নিং**, কারণ আমরা একটি নিউরাল নেটওয়ার্ক মডেল থেকে অন্যটিতে কিছু জ্ঞান স্থানান্তর করি। ট্রান্সফার লার্নিং-এ, আমরা সাধারণত একটি প্রি-ট্রেইনড মডেল দিয়ে শুরু করি, যা ইতিমধ্যে একটি বড় ইমেজ ডেটাসেটে, যেমন **ইমেজনেট**, প্রশিক্ষিত। এই মডেলগুলো ইতোমধ্যেই সাধারণ ছবিগুলো থেকে বিভিন্ন বৈশিষ্ট্য বের করতে ভালো কাজ করতে পারে, এবং অনেক ক্ষেত্রে এই বৈশিষ্ট্যগুলোর উপর ভিত্তি করে একটি ক্লাসিফায়ার তৈরি করলেই ভালো ফলাফল পাওয়া যায়।\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 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",
|
||||
"\n",
|
||||
"চলুন এই ডেটাসেটটি ডাউনলোড করি এবং এটি `data` ডিরেক্টরিতে এক্সট্র্যাক্ট করি (এই প্রক্রিয়াটি কিছুটা সময় নিতে পারে!):\n"
|
||||
"আসুন এই ডেটাসেটটি ডাউনলোড করি এবং `data` ডিরেক্টরিতে এক্সট্র্যাক্ট করি (এই প্রক্রিয়াটি কিছুটা সময় নিতে পারে!):\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -64,7 +64,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"দুঃখজনকভাবে, ডেটাসেটে কিছু ক্ষতিগ্রস্ত ইমেজ ফাইল রয়েছে। আমাদের দ্রুত পরিষ্কার করতে হবে যাতে ক্ষতিগ্রস্ত ফাইলগুলি পরীক্ষা করা যায়। এই টিউটোরিয়ালটি ব্যাহত না করার জন্য, আমরা ডেটাসেট যাচাই করার কোডটি একটি মডিউলে সরিয়ে নিয়েছি।\n"
|
||||
"দুর্ভাগ্যবশত, ডেটাসেটে কিছু করাপ্ট ইমেজ ফাইল রয়েছে। ক্ষতিকর ফাইলগুলি পরীক্ষা করার জন্য আমাদের দ্রুত পরিস্কার কাজ করতে হবে। এই টিউটোরিয়ালটি নষ্ট না করার জন্য, আমরা ডেটাসেট যাচাই করার কোডটি একটি মডিউলে স্থানান্তর করেছি।\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -333,13 +333,13 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## ডেটাসেট লোড করা\n",
|
||||
"## ডাটাসেট লোড করা\n",
|
||||
"\n",
|
||||
"পূর্ববর্তী উদাহরণগুলোতে, আমরা এমন ডেটাসেট লোড করছিলাম যা কেরাসে অন্তর্নির্মিত। এখন আমরা আমাদের নিজস্ব ডেটাসেট নিয়ে কাজ করতে যাচ্ছি, যা আমাদের ইমেজের ডিরেক্টরি থেকে লোড করতে হবে।\n",
|
||||
"পূর্বের উদাহরণগুলোতে, আমারা এমন ডাটাসেট লোড করছিলাম যেগুলো Keras-এ অন্তর্ভুক্ত। এখন আমারা আমাদের নিজের ডাটাসেট নিয়ে কাজ করতে যাচ্ছি, যা আমাদের একটি ছবি ফোল্ডার থেকে লোড করতে হবে।\n",
|
||||
"\n",
|
||||
"বাস্তব জীবনে, ইমেজ ডেটাসেটের আকার বেশ বড় হতে পারে, এবং সব ডেটা মেমোরিতে ফিট হবে এমনটা আশা করা যায় না। তাই, ডেটাসেটগুলো প্রায়ই **জেনারেটর** হিসেবে উপস্থাপিত হয়, যা ট্রেনিংয়ের জন্য উপযুক্ত মিনি ব্যাচে ডেটা ফেরত দিতে পারে।\n",
|
||||
"বাস্তব জীবনে, ইমেজ ডাটাসেটের আকার বেশ বড় হতে পারে, এবং সব ডেটা মেমোরিতে ফিট করার উপর নির্ভর করা যায় না। তাই, ডাটাসেটগুলোর প্রায়শই প্রতিনিধিত্ব করা হয় **জেনারেটর** হিসেবে যেগুলো প্রশিক্ষণের জন্য উপযুক্ত মিনি ব্যাচে ডেটা ফিরিয়ে দিতে পারে।\n",
|
||||
"\n",
|
||||
"ইমেজ ক্লাসিফিকেশন নিয়ে কাজ করার জন্য, কেরাসে একটি বিশেষ ফাংশন `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": [
|
||||
"> **নোট**: ডেটাসেটে থাকা সমস্ত চিত্রগুলি ফ্লোটিং পয়েন্ট টেনসর হিসাবে ০-২৫৫ পরিসরে উপস্থাপিত হয়। সেগুলি নিউরাল নেটওয়ার্কে পাঠানোর আগে, আমাদের সেই মানগুলি ০-১ পরিসরে স্কেল করতে হবে। চিত্রগুলি প্লট করার সময়, আমাদের একই কাজ করতে হবে অথবা মানগুলি `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",
|
||||
|
|
@ -510,17 +520,17 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"কিছু গুরুত্বপূর্ণ বিষয় এখানে উল্লেখ করা হয়েছে:\n",
|
||||
"* কোনো প্রি-ট্রেইনড নেটওয়ার্কে ইনপুট দেওয়ার আগে সেটিকে একটি নির্দিষ্ট পদ্ধতিতে প্রি-প্রসেস করতে হয়। এটি `preprocess_input` ফাংশন কল করে করা হয়, যা একটি ব্যাচের ইমেজ গ্রহণ করে এবং তাদের প্রক্রিয়াকৃত ফর্ম প্রদান করে। VGG-16 এর ক্ষেত্রে, ইমেজগুলো নরমালাইজ করা হয় এবং প্রতিটি চ্যানেলের জন্য পূর্বনির্ধারিত গড় মান বাদ দেওয়া হয়। কারণ VGG-16 মূলত এই প্রি-প্রসেসিং পদ্ধতি ব্যবহার করে ট্রেইন করা হয়েছিল।\n",
|
||||
"* ইনপুট ব্যাচে নিউরাল নেটওয়ার্ক প্রয়োগ করা হয়, এবং এর ফলাফল হিসেবে আমরা ১০০০-এলিমেন্টের টেনসর ব্যাচ পাই যা প্রতিটি ক্লাসের সম্ভাবনা দেখায়। এই টেনসরে `argmax` কল করে আমরা সবচেয়ে সম্ভাব্য ক্লাস নম্বরটি খুঁজে বের করতে পারি।\n",
|
||||
"* প্রাপ্ত ফলাফলটি একটি [`ImageNet` ক্লাসের নম্বর](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a)। এই ফলাফলটি বুঝতে, আমরা `decode_predictions` ফাংশন ব্যবহার করতে পারি, যা শীর্ষ n ক্লাস এবং তাদের নাম প্রদান করে।\n"
|
||||
"এখানে কয়েকটি গুরুত্বপূর্ণ বিষয় রয়েছে:\n",
|
||||
"* যেকোনো প্রি-ট্রেইন্ড নেটওয়ার্কে ইনপুট পাঠানোর আগে সেটিকে একটি নির্দিষ্ট উপায়ে প্রি-প্রসেস করা প্রয়োজন। এটি করা হয় সংশ্লিষ্ট `preprocess_input` ফাংশন কল করে, যা একটি ব্যাচ ইমেজ গ্রহণ করে এবং তাদের প্রক্রিয়াজাত রূপ প্রদান করে। VGG-16 এর ক্ষেত্রে, ছবিগুলো নর্মালাইজ করে এবং প্রতিটি চ্যানেলের জন্য কিছু পূর্বনির্ধারিত গড় মান বিয়োগ করা হয়। কারণ VGG-16 মূলত এই প্রি-প্রসেসিং দিয়ে ট্রেইন্ড ছিল।\n",
|
||||
"* নিউরাল নেটওয়ার্ক ইনপুট ব্যাচে প্রয়োগ করা হয়, এবং আমরা ফলস্বরূপ পাই ১০০০-এলিমেন্ট টেনসর যা প্রতিটি ক্লাসের সম্ভাবনা দেখায়। আমরা এই টেনসরের উপর `argmax` কল করে সবচেয়ে সম্ভাব্য ক্লাস নম্বর পেতে পারি।\n",
|
||||
"* প্রাপ্ত ফলাফল একটি [একটি `ImageNet` ক্লাসের নম্বর](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a)। এই ফলের অর্থ বোঝার জন্য, আমরা `decode_predictions` ফাংশনও ব্যবহার করতে পারি, যা শীর্ষ n টি ক্লাস তাদের নামসহ প্রদান করে।\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"চলুন VGG-16 নেটওয়ার্কের স্থাপত্যও দেখি:\n"
|
||||
"চলুন আমরা VGG-16 নেটওয়ার্কের আর্কিটেকচারও দেখি:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -597,9 +607,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## জিপিইউ গণনা\n",
|
||||
"## GPU গণনা\n",
|
||||
"\n",
|
||||
"ভি.জি.জি-১৬ এবং অন্যান্য আধুনিক আর্কিটেকচারের মতো গভীর নিউরাল নেটওয়ার্ক চালানোর জন্য প্রচুর গণনাশক্তি প্রয়োজন। যদি জিপিইউ অ্যাক্সিলারেশন উপলব্ধ থাকে, তবে এটি ব্যবহার করা যৌক্তিক। সৌভাগ্যবশত, কেরাস স্বয়ংক্রিয়ভাবে জিপিইউ-তে গণনার গতি বাড়িয়ে দেয় যদি এটি উপলব্ধ থাকে। আমরা নিচের কোড ব্যবহার করে পরীক্ষা করতে পারি যে টেনসরফ্লো জিপিইউ ব্যবহার করতে সক্ষম কিনা:\n"
|
||||
"গভীর নিউরাল নেটওয়ার্ক যেমন VGG-16 এবং অন্যান্য আধুনিক আর্কিটেকচারের চালানোর জন্য যথেষ্ট পরিমাণে গণনামূলক শক্তি প্রয়োজন। যদি GPU ত্বরান্বিতকরণ উপলব্ধ থাকে তবে এটি ব্যবহার করা যুক্তিযুক্ত। সৌভাগ্যক্রমে, Keras স্বয়ংক্রিয়ভাবে GPU-এ গণনাগুলিকে দ্রুততর করে যদি এটি উপলব্ধ থাকে। আমরা নিম্নলিখিত কোড ব্যবহার করে পরীক্ষা করতে পারি Tensorflow GPU ব্যবহার করতে সক্ষম কিনা:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -626,9 +636,10 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## VGG বৈশিষ্ট্য বের করা\n",
|
||||
"\n",
|
||||
"যদি আমরা আমাদের ছবিগুলো থেকে বৈশিষ্ট্য বের করতে VGG-16 ব্যবহার করতে চাই, তাহলে আমাদের চূড়ান্ত শ্রেণীবিন্যাস স্তরগুলো ছাড়া মডেল প্রয়োজন। আমরা নিচের কোড ব্যবহার করে VGG-16 মডেলকে শীর্ষ স্তর ছাড়া তৈরি করতে পারি:\n"
|
||||
"## VGG বৈশিষ্ট্য সংগ্রহ করা\n",
|
||||
"\n",
|
||||
"যদি আমরা আমাদের ছবি থেকে বৈশিষ্ট্য বের করতে VGG-16 ব্যবহার করতে চাই, তবে আমাদের চূড়ান্ত শ্রেণীবিন্যাস স্তর ছাড়া মডেলটি প্রয়োজন। আমরা VGG-16 মডেলটি টপ স্তর ছাড়া নিম্নলিখিত কোড ব্যবহার করে উদ্ভিদ করতে পারি:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -680,9 +691,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"ফিচার টেনসরের ডাইমেনশন 7x7x512, তবে এটি ভিজুয়ালাইজ করার জন্য আমাদের এটি 2D আকারে রিশেপ করতে হয়েছে।\n",
|
||||
"ফিচার টেন্সরের মাত্রা ৭x৭x৫১২, কিন্তু এটি ভিজুয়ালাইজ করার জন্য আমাদের এটি ২ডি আকারে রিশেপ করতে হয়েছিল। \n",
|
||||
"\n",
|
||||
"এখন চলুন দেখি এই ফিচারগুলো কি ইমেজ ক্লাসিফাই করতে ব্যবহার করা যায়। চলুন ম্যানুয়ালি কিছু ইমেজের অংশ (আমাদের ক্ষেত্রে ৫০টি মিনিব্যাচ) নিয়ে তাদের ফিচার ভেক্টর প্রি-কম্পিউট করি। আমরা Tensorflow **dataset** API ব্যবহার করতে পারি এটি করার জন্য। `map` ফাংশন একটি ডেটাসেট নেয় এবং একটি নির্দিষ্ট ল্যাম্বডা-ফাংশন প্রয়োগ করে সেটিকে রূপান্তরিত করে। আমরা এই মেকানিজম ব্যবহার করে নতুন ডেটাসেট তৈরি করি, `ds_features_train` এবং `ds_features_test`, যা মূল ইমেজের পরিবর্তে VGG-এক্সট্রাক্টেড ফিচার ধারণ করে।\n"
|
||||
"এখন চলুন দেখা যাক এই ফিচারগুলো ছবি শ্রেণীবদ্ধ করতে ব্যবহার করা যেতে পারে কিনা। হাতে নিয়ে কিছু ছবি অংশ (আমাদের ক্ষেত্রে ৫০টি মিনিব্যাচ) নিয়ে তাদের ফিচার ভেক্টর পূর্ব-গণনা করি। আমরা এটি করার জন্য Tensorflow **dataset** API ব্যবহার করতে পারি। `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"
|
||||
"কেরাস আর্কিটেকচারের সৌন্দর্য হল আমাদের উপরে সংজ্ঞায়িত VGG-16 মডেলটিকে অন্য একটি নিউরাল নেটওয়ার্কের একটি লেয়ার হিসেবেও ব্যবহার করা যেতে পারে! আমাদের শুধু এর উপরে ঘন ক্লাসিফায়ার নিয়ে একটি নেটওয়ার্ক তৈরি করতে হবে, এবং তারপর ব্যাকপ্রপাগেশন ব্যবহার করে পুরো নেটওয়ার্কটিকে ট্রেন করতে হবে।\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -793,13 +804,13 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"এই মডেলটি একটি প্রান্ত-থেকে-প্রান্ত শ্রেণীবিন্যাস নেটওয়ার্কের মতো, যা একটি ছবি গ্রহণ করে এবং শ্রেণী ফেরত দেয়। তবে, জটিল বিষয়টি হলো আমরা চাই VGG16 একটি ফিচার এক্সট্রাক্টর হিসেবে কাজ করুক এবং পুনরায় প্রশিক্ষিত না হোক। সুতরাং, আমাদের **কনভল্যুশনাল ফিচার এক্সট্রাক্টরের ওজন স্থির করতে হবে**। আমরা নেটওয়ার্কের প্রথম স্তরে পৌঁছাতে পারি `model.layers[0]` কল করে, এবং আমাদের কেবল `trainable` প্রপার্টিকে `False` সেট করতে হবে।\n",
|
||||
"এই মডেলটি একটি end-to-end শ্রেণীবিভাগ নেটওয়ার্কের মতো যা একটি ইমেজ নেয় এবং ক্লাস প্রদান করে। তবে, জটিল বিষয় হলো আমরা চাই VGG16 ফিচার এক্সট্র্যাক্টর হিসাবে কাজ করুক, এবং পুনরায় প্রশিক্ষিত না হোক। সুতরাং, আমাদের **কনভল্যুশনাল ফিচার এক্সট্র্যাক্টরের ওয়েটগুলো ফ্রিজ করতে হবে**। নেটওয়ার্কের প্রথম লেয়ারে অ্যাক্সেস পেতে আমরা `model.layers[0]` কল করতে পারি, এবং শুধুমাত্র `trainable` প্রপার্টিকে `False` সেট করতে হবে।\n",
|
||||
"\n",
|
||||
"> **Note**: ফিচার এক্সট্রাক্টরের ওজন স্থির করা প্রয়োজন, কারণ অন্যথায় প্রশিক্ষণহীন শ্রেণীবিন্যাস স্তর মূল প্রি-ট্রেইনড কনভল্যুশনাল এক্সট্রাক্টরের ওজন নষ্ট করতে পারে।\n",
|
||||
"> **বিঃদ্রঃ**: ফিচার এক্সট্র্যাক্টরের ওয়েট ফ্রিজ করার প্রয়োজন কারণ অন্যথায় প্রশিক্ষিত নয় এমন ক্লাসিফায়ার লেয়ার মূল pre-trained কনভল্যুশন এক্সট্র্যাক্টরের ওয়েটগুলো ক্ষতিগ্রস্থ করতে পারে।\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",
|
||||
"> **Note:** প্রথমে প্যারামিটারগুলো ফ্রিজ করা এবং ক্লাসিফিকেশন লেয়ারের ওজন স্থিতিশীল করার জন্য কয়েকটি ইপোক প্রশিক্ষণ করা গুরুত্বপূর্ণ। যদি আপনি আনফ্রিজ করা প্যারামিটারসহ এন্ড-টু-এন্ড নেটওয়ার্ক প্রশিক্ষণ শুরু করেন, তাহলে বড় ভুলগুলো কনভোলিউশনাল লেয়ারের প্রি-ট্রেইনড ওজন নষ্ট করতে পারে।\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",
|
||||
"আনফ্রিজ করার পর, আমরা আরও কয়েকটি এপোক প্রশিক্ষণ চালাতে পারি (আমাদের উদাহরণে, আমরা কেবল একটি এপোক করব)। আপনি কম লার্নিং রেটও বেছে নিতে পারেন, যাতে প্রি-ট্রেইনড ওজনগুলোর উপর প্রভাব কমানো যায়। তবে, এমনকি কম লার্নিং রেটের সাথেও, প্রশিক্ষণের শুরুতে সঠিকতার (accuracy) কিছুটা হ্রাস আশা করা যায়, যতক্ষণ না এটি ধীরে ধীরে স্থির ওজনে প্রশিক্ষণের চেয়ে সামান্য উচ্চ স্তরে পৌঁছায়।\n",
|
||||
"আনফ্রিজ করার পরে, আমরা আরও কয়েকটি এপোক প্রশিক্ষণ করতে পারি (আমাদের উদাহরণে, আমরা কেবল একটিই করব)। আপনি প্রি-ট্রেইনড ওয়েটগুলোর উপর প্রভাব কমানোর জন্য নিম্ন লার্নিং রেটও নির্বাচন করতে পারেন। তবে, কম লার্নিং রেট থাকলেও, প্রশিক্ষণের শুরুতে সঠিকতার পতনের আশা করতে পারেন, যতক্ষণ না তা অবশেষে স্থির ওয়েটের ক্ষেত্রে তুলনায় সামান্য উচ্চতর স্তরে পৌঁছে যায়।\n",
|
||||
"\n",
|
||||
"> **Note:** এই প্রশিক্ষণ অনেক ধীর গতিতে হয়, কারণ আমাদের নেটওয়ার্কের অনেক স্তরের মধ্য দিয়ে গ্রেডিয়েন্টগুলোকে পেছনে প্রোপাগেট করতে হয়!\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 ব্যবহার করতাম। আপনি উপরের কোড দিয়ে বিভিন্ন রেসনেট মডেলকে বেস মডেল হিসেবে ব্যবহার করে পরীক্ষা করতে পারেন এবং দেখতে পারেন যে নির্ভুলতা কেমন পরিবর্তিত হয়।\n",
|
||||
"\n",
|
||||
"## ব্যাচ নরমালাইজেশন\n",
|
||||
"\n",
|
||||
"এই নেটওয়ার্কে আরেকটি নতুন ধরনের লেয়ার রয়েছে: **ব্যাচ নরমালাইজেশন**। ব্যাচ নরমালাইজেশনের ধারণা হলো নিউরাল নেটওয়ার্কের মধ্য দিয়ে প্রবাহিত মানগুলোকে সঠিক সীমার মধ্যে নিয়ে আসা। সাধারণত নিউরাল নেটওয়ার্ক সবচেয়ে ভালো কাজ করে যখন সব মান [-1,1] বা [0,1] এর মধ্যে থাকে, এবং এ কারণেই আমরা আমাদের ইনপুট ডেটাকে সেই অনুযায়ী স্কেল/নরমালাইজ করি। তবে, একটি ডিপ নেটওয়ার্ক ট্রেনিংয়ের সময় এমন হতে পারে যে মানগুলো উল্লেখযোগ্যভাবে এই সীমার বাইরে চলে যায়, যা ট্রেনিংকে সমস্যাজনক করে তোলে। ব্যাচ নরমালাইজেশন লেয়ার বর্তমান মিনিব্যাচের জন্য গড় এবং স্ট্যান্ডার্ড ডেভিয়েশন গণনা করে এবং সেগুলো ব্যবহার করে সংকেতকে নরমালাইজ করে, তারপর এটি নিউরাল নেটওয়ার্ক লেয়ারের মধ্য দিয়ে পাঠায়। এটি ডিপ নেটওয়ার্কগুলোর স্থিতিশীলতাকে উল্লেখযোগ্যভাবে উন্নত করে।\n"
|
||||
"এই নেটওয়ার্কে আরেক ধরনের লেয়ার আছে: **ব্যাচ নরমালাইজেশন**। ব্যাচ নরমালাইজেশনের ধারণা হল নিউরাল নেটওয়ার্কের মধ্য দিয়ে প্রবাহিত মানগুলিকে সঠিক পরিসরে আনা। সাধারণত নিউরাল নেটওয়ার্কগুলি সর্বোত্তম কাজ করে যখন সব মান [-১, ১] অথবা [০, ১] পরিসরের মধ্যে থাকে, আর এটি কারণ যে আমরা আমাদের ইনপুট ডেটাকে সেই অনুযায়ী স্কেল/নরমালাইজ করি। তবে, একটি গভীর নেটওয়ার্কের প্রশিক্ষণের সময় এটি ঘটতে পারে যে মানগুলি উল্লেখযোগ্যভাবে এই পরিসরের বাইরে চলে যায়, যা প্রশিক্ষণকে সমস্যাযুক্ত করে তোলে। ব্যাচ নরমালাইজেশন লেয়ার বর্তমান মিনিব্যাচের সব মানের জন্য গড় এবং স্ট্যান্ডার্ড ডিভিয়েশন গণনা করে এবং সেগুলো ব্যবহার করে সংকেতকে নরমালাইজ করে নিউরাল নেটওয়ার্ক লেয়ারের মাধ্যমে পাঠানোর আগে। এটি গভীর নেটওয়ার্কের স্থিতিশীলতাকে উল্লেখযোগ্যভাবে উন্নত করে।\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এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা তার জন্য দায়ী থাকব না।\n"
|
||||
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**অস্বীকৃতি**:\nএই নথিটি AI অনুবাদ পরিষেবা [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-28T10:58:24+00:00",
|
||||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb",
|
||||
"language_code": "bn"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
|
|
|||
|
|
@ -1,51 +1,51 @@
|
|||
# প্রাকৃতিক ভাষা প্রক্রিয়াকরণ
|
||||
# প্রাকৃতিক ভাষা প্রক্রিয়াকরণ
|
||||
|
||||

|
||||

|
||||
|
||||
এই অংশে, আমরা **প্রাকৃতিক ভাষা প্রক্রিয়াকরণ (NLP)** সম্পর্কিত কাজগুলো পরিচালনা করতে নিউরাল নেটওয়ার্ক ব্যবহার করার উপর মনোযোগ দেব। অনেক ধরনের 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) নামক একটি কৌশল ব্যবহার করে শ্রেণীবিন্যাসের মতো অন্যান্য NLP কাজ সমাধান করতে সক্ষম।
|
||||
* **টেক্সট সারাংশ তৈরি** হলো একটি কৌশল যেখানে আমরা চাই কম্পিউটার দীর্ঘ টেক্সট "পড়ে" কয়েকটি বাক্যে সারাংশ তৈরি করুক।
|
||||
* **মেশিন অনুবাদ** হলো এক ভাষায় টেক্সট বোঝা এবং অন্য ভাষায় টেক্সট তৈরি করার একটি সমন্বয়।
|
||||
* **টেক্সট শ্রেণীবিভাগ** হল পাঠ্যের অনুক্রম সম্পর্কিত একটি সাধারণ শ্রেণীবিভাগ সমস্যা। উদাহরণস্বরূপ ই-মেইল বার্তা স্প্যাম বনাম নন-স্প্যাম হিসাবে শ্রেণীবদ্ধ করা, অথবা প্রবন্ধগুলোকে স্পোর্ট, ব্যবসা, রাজনীতি ইত্যাদি হিসেবে শ্রেণীবদ্ধ করা। এছাড়াও, চ্যাটবট তৈরি করার সময়, আমরা প্রায়ই ব্যবহারকারী কী বলতে চেয়েছিল তা বুঝতে চাই — এই ক্ষেত্রে আমরা **উদ্দেশ্য শ্রেণীবিভাগ** নিয়ে কাজ করি। প্রায়ই, উদ্দেশ্য শ্রেণীবিভাগে আমাদের অনেক ক্যাটাগরির সাথে মোকাবিলা করতে হয়।
|
||||
* **মনের অবস্থা বিশ্লেষণ** একটি সাধারণ রিগ্রেশন সমস্যা, যেখানে আমাদের একটি সংখ্যা (একটি মনের অবস্থা) নির্ধারণ করতে হয় যেটি বাক্যের অর্থ কতটা ইতিবাচক/নেতিবাচক তা নির্দেশ করে। মনের অবস্থা বিশ্লেষণের উন্নত একটি সংস্করণ হল **অংশ-ভিত্তিক মনের অবস্থা বিশ্লেষণ** (ABSA), যেখানে আমরা মনের অবস্থা পুরো বাক্যের জন্য নয় বরং এর বিভিন্ন অংশের (অংশগুলোর) জন্য নির্ধারণ করি, যেমন *এই রেস্টুরেন্টে, আমি খাবার পছন্দ করেছি, কিন্তু পরিবেশ খুব খারাপ ছিল*।
|
||||
* **নেমড এন্টিটি রিকগনিশন** (NER) হল টেক্সট থেকে নির্দিষ্ট এন্টিটি বের করার সমস্যা। উদাহরণস্বরূপ, আমাদের বুঝতে হতে পারে যে বাক্য *I need to fly to Paris tomorrow* এ শব্দ *tomorrow* DATE বোঝায়, এবং *Paris* LOCATION।
|
||||
* **কীওয়ার্ড এক্সট্রাকশন** NER এর মতো, কিন্তু আমাদের স্বয়ংক্রিয়ভাবে বাক্যের অর্থের জন্য গুরুত্বপূর্ণ শব্দগুলি বের করতে হয়, নির্দিষ্ট এন্টিটি ধরনের জন্য প্রি-ট্রেনিং ছাড়াই।
|
||||
* **টেক্সট ক্লাস্টারিং** কাজে লাগে যখন আমরা অনুরূপ বাক্যগুলিকে একসঙ্গে গ্রুপ করতে চাই, যেমন প্রযুক্তিগত সহায়তা কথোপকথনে অনুরূপ অনুরোধগুলি।
|
||||
* **প্রশ্নোত্তর** মডেলটির একটি নির্দিষ্ট প্রশ্নের উত্তর দেওয়ার ক্ষমতা বোঝায়। মডেল একটি টেক্সট প্যাসেজ এবং একটি প্রশ্ন ইনপুট হিসেবে পায় এবং তাকে টেক্সটের মধ্যে এমন একটি স্থান দিতে হয় যেখানে প্রশ্নের উত্তর রয়েছে (অথবা কখনও কখনও উত্তর স্বয়ংক্রিয়ভাবে তৈরি করতে হয়)।
|
||||
* **টেক্সট জেনারেশন** হল একটি মডেলের নতুন টেক্সট তৈরি করার ক্ষমতা। এটিকে একটি শ্রেণীবিভাগ কাজ হিসাবে বিবেচনা করা যেতে পারে যা কিছু *টেক্সট প্রম্পট* এর ভিত্তিতে পরবর্তী অক্ষর/শব্দ পূর্বাভাস দেয়। উন্নত টেক্সট জেনারেশন মডেল যেমন GPT-3, অন্যান্য NLP কাজ যেমন শ্রেণীবিভাগ সমাধান করতে পারে [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 কাজ ঐতিহ্যবাহী পদ্ধতি যেমন ব্যাকরণ ব্যবহার করে সমাধান করা হতো। উদাহরণস্বরূপ, মেশিন অনুবাদে পার্সার ব্যবহার করে মূল বাক্যটিকে সিনট্যাক্টিক গাছতে রূপান্তর করা হতো, তারপর উচ্চতর স্তরের অর্থগত কাঠামো বের করে বাক্যের অর্থ বোঝানো হতো, এবং এই অর্থ এবং লক্ষ্যমাত্রা ভাষার ব্যাকরণের ভিত্তিতে ফলাফল জেনারেট করা হতো। এখনকালীন, অনেক 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 ব্যবহার করব।
|
||||
|
||||
আমরা ইতিমধ্যে ট্যাবুলার ডেটা এবং ইমেজ নিয়ে কাজ করার জন্য নিউরাল নেটওয়ার্ক ব্যবহার সম্পর্কে শিখেছি। এই ধরনের ডেটা এবং টেক্সটের মধ্যে প্রধান পার্থক্য হলো টেক্সট একটি পরিবর্তনশীল দৈর্ঘ্যের সিকোয়েন্স, যেখানে ইমেজের ক্ষেত্রে ইনপুট সাইজ পূর্বেই জানা থাকে। যদিও কনভোলিউশনাল নেটওয়ার্ক ইনপুট ডেটা থেকে প্যাটার্ন বের করতে পারে, টেক্সটের প্যাটার্নগুলো আরও জটিল। উদাহরণস্বরূপ, আমরা দেখতে পারি যে বিষয় থেকে নেগেশন অনেক শব্দ দ্বারা আলাদা হতে পারে (যেমন: *আমি কমলালেবু পছন্দ করি না*, বনাম *আমি সেই বড় রঙিন সুস্বাদু কমলালেবু পছন্দ করি না*), এবং এটি এখনও একটি প্যাটার্ন হিসেবে ব্যাখ্যা করা উচিত। তাই, ভাষা পরিচালনা করতে আমাদের নতুন নিউরাল নেটওয়ার্ক টাইপ, যেমন *রিকারেন্ট নেটওয়ার্ক* এবং *ট্রান্সফর্মার* প্রয়োজন।
|
||||
আমরা আগেই শিখেছি ট্যাবুলার ডেটা এবং ইমেজগুলোর জন্য নিউরাল নেটওয়ার্ক ব্যবহার সম্পর্কে। এই ডেটার ধরনগুলির এবং টেক্সটের প্রধান পার্থক্য হল, টেক্সট একটি পরিবর্তনশীল দৈর্ঘ্যের সিকোয়েন্স, যেখানে ইমেজের ক্ষেত্রে ইনপুটের আকার আগেই জানা থাকে। যখন কনভলিউশানাল নেটওয়ার্ক ইনপুট ডেটা থেকে প্যাটার্ন বের করতে পারে, টেক্সটের প্যাটার্নগুলো আরও জটিল। যেমন, একটা নেতিবাচকতা বিষয় থেকে আলাদা অবস্থানে থাকলেও তা একটিই প্যাটার্ন হিসেবে বিবেচনা করা উচিত (যেমন *I do not like oranges* বনাম *I do not like those big colorful tasty oranges*), এবং তা একক প্যাটার্ন হিসেবে বোঝা উচিত। তাই, ভাষা প্রক্রিয়াকরণের জন্য আমাদের নতুন ধরণের নিউরাল নেটওয়ার্ক যেমন *রিকারেন্ট নেটওয়ার্ক* এবং *ট্রান্সফরমার্স* প্রবর্তন করতে হয়।
|
||||
|
||||
## লাইব্রেরি ইনস্টল করুন
|
||||
|
||||
যদি আপনি এই কোর্স চালানোর জন্য স্থানীয় পাইথন ইনস্টলেশন ব্যবহার করেন, তাহলে NLP-এর জন্য প্রয়োজনীয় সমস্ত লাইব্রেরি নিম্নলিখিত কমান্ডগুলো ব্যবহার করে ইনস্টল করতে হতে পারে:
|
||||
যদি আপনি এই কোর্স চালানোর জন্য লোকাল পাইথন ইনস্টলেশন ব্যবহার করেন, তবে আপনাকে 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
|
||||
```
|
||||
|
||||
> আপনি [Microsoft Learn](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste) এ TensorFlow দিয়ে NLP চেষ্টা করতে পারেন।
|
||||
> আপনি [Microsoft Learn](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste) এ TensorFlow দিয়ে NLP চেষ্টা করতে পারেন
|
||||
|
||||
## GPU সতর্কতা
|
||||
|
||||
এই অংশে, কিছু উদাহরণে আমরা বেশ বড় মডেল প্রশিক্ষণ করব।
|
||||
* **GPU-সক্ষম কম্পিউটার ব্যবহার করুন**: বড় মডেল নিয়ে কাজ করার সময় অপেক্ষার সময় কমানোর জন্য GPU-সক্ষম কম্পিউটারে আপনার নোটবুক চালানো পরামর্শ দেওয়া হয়।
|
||||
* **GPU মেমোরি সীমাবদ্ধতা**: GPU-তে চালানোর সময় বড় মডেল প্রশিক্ষণের সময় GPU মেমোরি শেষ হয়ে যেতে পারে।
|
||||
* **GPU মেমোরি ব্যবহার**: প্রশিক্ষণের সময় GPU মেমোরি ব্যবহারের পরিমাণ বিভিন্ন বিষয়ের উপর নির্ভর করে, যেমন মিনিব্যাচ সাইজ।
|
||||
* **মিনিব্যাচ সাইজ কমান**: যদি GPU মেমোরি সমস্যা হয়, তাহলে আপনার কোডে মিনিব্যাচ সাইজ কমানো একটি সম্ভাব্য সমাধান হতে পারে।
|
||||
* **TensorFlow GPU মেমোরি রিলিজ**: TensorFlow-এর পুরনো সংস্করণগুলো একাধিক মডেল প্রশিক্ষণের সময় GPU মেমোরি সঠিকভাবে রিলিজ করতে পারে না। GPU মেমোরি ব্যবহারের কার্যকর ব্যবস্থাপনার জন্য, আপনি TensorFlow-কে প্রয়োজন অনুযায়ী GPU মেমোরি বরাদ্দ করতে কনফিগার করতে পারেন।
|
||||
* **কোড অন্তর্ভুক্তি**: TensorFlow-কে GPU মেমোরি শুধুমাত্র প্রয়োজন হলে বরাদ্দ করতে সেট করতে, আপনার নোটবুকে নিম্নলিখিত কোড অন্তর্ভুক্ত করুন:
|
||||
এই অংশে, কিছু উদাহরণে আমরা বড় মডেল প্রশিক্ষণ করব।
|
||||
* **GPU-সক্ষম কম্পিউটার ব্যবহার করুন**: বড় মডেলের সাথে কাজ করার সময় অপেক্ষার সময় কমাতে GPU-সক্ষম কম্পিউটার ব্যবহার করে আপনার নোটবুক চালানো পরামর্শযোগ্য।
|
||||
* **GPU মেমরি সীমাবদ্ধতা**: GPU-তে চালানোর সময় এমন পরিস্থিতি থাকতে পারে যেখানে আপনি GPU মেমরি শেষ হয়ে যেতে পারেন, বিশেষ করে বড় মডেল প্রশিক্ষণ করার সময়।
|
||||
* **GPU মেমরি ব্যবহার**: প্রশিক্ষণের সময় GPU মেমরির পরিমাণ বিভিন্ন ফ্যাক্টরের উপর নির্ভর করে, যার মধ্যে মিনিব্যাচ সাইজ অন্যতম।
|
||||
* **মিনিব্যাচ সাইজ কমান**: যদি GPU মেমরি সমস্যা হয়, আপনার কোডে মিনিব্যাচ সাইজ কমানো সমাধান হিসেবে বিবেচনা করতে পারেন।
|
||||
* **TensorFlow GPU মেমরি মুক্তি**: পুরানো সংস্করণের 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)
|
||||
```
|
||||
|
||||
যদি আপনি ক্লাসিক্যাল ML দৃষ্টিকোণ থেকে 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)
|
||||
* [ওয়ার্ড এম্বেডিংস](14-Emdeddings/README.md)
|
||||
* [ভাষা মডেলিং](15-LanguageModeling/README.md)
|
||||
* [রিকারেন্ট নিউরাল নেটওয়ার্ক](16-RNN/README.md)
|
||||
* [জেনারেটিভ নেটওয়ার্ক](17-GenerativeNetworks/README.md)
|
||||
* [ট্রান্সফর্মার](18-Transformers/README.md)
|
||||
* [রিকারেন্ট নিউরাল নেটওয়ার্ক](16-RNN/README.md)
|
||||
* [জেনারেটিভ নেটওয়ার্ক](17-GenerativeNetworks/README.md)
|
||||
* [ট্রান্সফরমার্স](18-Transformers/README.md)
|
||||
|
||||
**অস্বীকৃতি**:
|
||||
এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসাধ্য সঠিক অনুবাদের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। নথিটির মূল ভাষায় থাকা সংস্করণটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে সৃষ্ট কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যার জন্য আমরা দায়ী নই।
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**অস্বীকৃতি**:
|
||||
এই নথিটি AI অনুবাদ পরিষেবা [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": "cs"
|
||||
},
|
||||
"CONTRIBUTING.md": {
|
||||
"original_hash": "c6fd7e781b67111a90abd166d0ce4aa0",
|
||||
"translation_date": "2026-07-08T17:14:02+00:00",
|
||||
"source_file": "CONTRIBUTING.md",
|
||||
"language_code": "cs"
|
||||
},
|
||||
"README.md": {
|
||||
"original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b",
|
||||
"translation_date": "2026-04-06T16:47:34+00:00",
|
||||
|
|
@ -17,6 +23,19 @@
|
|||
"source_file": "SECURITY.md",
|
||||
"language_code": "cs"
|
||||
},
|
||||
"__translation_failures__": {
|
||||
"lessons/sketchnotes/LICENSE.md": {
|
||||
"original_hash": "45ab63a2cd8f5faef6c9b150618837a4",
|
||||
"source_file": "lessons/sketchnotes/LICENSE.md",
|
||||
"language_code": "cs",
|
||||
"failure_date": "2026-07-08T17:07:04+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-26T00:44:28+00:00",
|
||||
|
|
@ -54,8 +73,8 @@
|
|||
"language_code": "cs"
|
||||
},
|
||||
"examples/README.md": {
|
||||
"original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7",
|
||||
"translation_date": "2025-10-03T11:33:39+00:00",
|
||||
"original_hash": "7883d52c2e2a221e0b07a7b112a149b9",
|
||||
"translation_date": "2026-07-08T17:00:16+00:00",
|
||||
"source_file": "examples/README.md",
|
||||
"language_code": "cs"
|
||||
},
|
||||
|
|
@ -66,8 +85,8 @@
|
|||
"language_code": "cs"
|
||||
},
|
||||
"lessons/0-course-setup/how-to-run.md": {
|
||||
"original_hash": "a4717bd9103b9f6cd84d534b83534689",
|
||||
"translation_date": "2026-01-16T04:54:29+00:00",
|
||||
"original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1",
|
||||
"translation_date": "2026-07-08T17:00:46+00:00",
|
||||
"source_file": "lessons/0-course-setup/how-to-run.md",
|
||||
"language_code": "cs"
|
||||
},
|
||||
|
|
@ -191,6 +210,12 @@
|
|||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md",
|
||||
"language_code": "cs"
|
||||
},
|
||||
"lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": {
|
||||
"original_hash": "99b816b6a4957ef4100cee4c4221dff9",
|
||||
"translation_date": "2026-07-08T16:51:17+00:00",
|
||||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb",
|
||||
"language_code": "cs"
|
||||
},
|
||||
"lessons/4-ComputerVision/08-TransferLearning/lab/README.md": {
|
||||
"original_hash": "7765935c35fcee69b9fe2d0cfd6963e2",
|
||||
"translation_date": "2025-08-25T23:16:27+00:00",
|
||||
|
|
@ -330,8 +355,8 @@
|
|||
"language_code": "cs"
|
||||
},
|
||||
"lessons/5-NLP/README.md": {
|
||||
"original_hash": "8ef02a9318257ea140ed3ed74442096d",
|
||||
"translation_date": "2025-08-25T21:27:40+00:00",
|
||||
"original_hash": "038df6f1a73e49f6430740da083bfd6d",
|
||||
"translation_date": "2026-07-08T17:01:25+00:00",
|
||||
"source_file": "lessons/5-NLP/README.md",
|
||||
"language_code": "cs"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -0,0 +1,29 @@
|
|||
# Přispívání do AI-For-Beginners
|
||||
|
||||
Děkujeme za váš zájem přispět do AI-For-Beginners! Vítáme překlady, opravy lekcí a úpravy formátování.
|
||||
|
||||
## Licenční smlouva přispěvatele Microsoft (CLA)
|
||||
|
||||
Tento projekt vítá příspěvky a návrhy. Většina příspěvků vyžaduje, abyste souhlasili s Licenční smlouvou přispěvatele (CLA), v níž prohlašujete, že máte právo a skutečně nám udělujete práva na využití vašeho příspěvku. Podrobnosti najdete na [https://cla.microsoft.com](https://cla.microsoft.com).
|
||||
|
||||
Když odešlete pull request, CLA-bot automaticky zjistí, zda musíte poskytnout CLA, a příslušně označí PR (například štítek, komentář). Jednoduše postupujte podle pokynů, které bot poskytne. Toto bude potřeba udělat pouze jednou pro všechny repozitáře používající naši CLA.
|
||||
|
||||
## Jak přispět
|
||||
|
||||
### 1. Oprava překlepů / Chyb v kódu
|
||||
Pokud najdete překlep nebo chybu v jakémkoli Jupyter notebooku nebo lekci ve formátu markdown:
|
||||
1. Vytvořte fork repozitáře.
|
||||
2. Opravte překlep nebo nefunkční odkaz.
|
||||
3. Odešlete Pull Request s jasným popisem opravy.
|
||||
|
||||
### 2. Odesílání překladů
|
||||
Vítáme překlady lekcí do dalších jazyků! Překlady umístěte do složky `translations/`, přičemž používejte stávající názvy složek (například `translations/es/`, `translations/pt-BR/`, `translations/zh-CN/`).
|
||||
|
||||
Podrobnější informace naleznete v souboru [etc/CONTRIBUTING.md](etc/CONTRIBUTING.md).
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**Prohlášení o omezení odpovědnosti**:
|
||||
Tento dokument byl přeložen pomocí AI překladatelské služby [Co-op Translator](https://github.com/Azure/co-op-translator). Přestože usilujeme o co největší přesnost, mějte prosím na paměti, že automatizované překlady mohou obsahovat chyby nebo nepřesnosti. Originální dokument v jeho mateřském jazyce by měl být považován za autoritativní zdroj. Pro kritické informace se doporučuje profesionální lidský překlad. Nejsme odpovědní za jakékoli nedorozumění nebo nesprávné interpretace vzniklé použitím tohoto překladu.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -1,27 +1,27 @@
|
|||
# Příklady AI pro začátečníky
|
||||
# Příklady pro začátečníky s AI
|
||||
|
||||
Vítejte! Tento adresář obsahuje jednoduché, samostatné příklady, které vám pomohou začít s AI a strojovým učením. Každý příklad je navržen tak, aby byl přívětivý pro začátečníky, s podrobnými komentáři a postupnými vysvětleními.
|
||||
Vítejte! Tento adresář obsahuje jednoduché, samostatné příklady, které vám pomohou začít s AI a strojovým učením. Každý příklad je navržen tak, aby byl přívětivý pro začátečníky s podrobnými komentáři a krok za krokem vysvětleními.
|
||||
|
||||
## 📚 Přehled příkladů
|
||||
|
||||
| Příklad | Popis | Obtížnost | Předpoklady |
|
||||
|---------|-------|-----------|-------------|
|
||||
| [Hello AI World](../../../examples/01-hello-ai-world.py) | Váš první AI program - jednoduché rozpoznávání vzorů | ⭐ Začátečník | Základy Pythonu |
|
||||
| [Jednoduchá neuronová síť](../../../examples/02-simple-neural-network.py) | Vytvořte neuronovou síť od základu | ⭐⭐ Začátečník+ | Python, základní matematika |
|
||||
| [Klasifikátor obrázků](./03-image-classifier.ipynb) | Klasifikujte obrázky pomocí předtrénovaného modelu | ⭐⭐ Začátečník+ | Python, numpy |
|
||||
| [Textová sentimentální analýza](../../../examples/04-text-sentiment.py) | Analyzujte sentiment textu (pozitivní/negativní) | ⭐⭐ Začátečník+ | Python |
|
||||
|---------|-------------|------------|---------------|
|
||||
| [Hello AI World](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/01-hello-ai-world.py) | Váš první program s AI - jednoduché rozpoznávání vzorů | ⭐ Začátečník | Základy Pythonu |
|
||||
| [Jednoduchá neuronová síť](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/02-simple-neural-network.py) | Vytvořte neuronovou síť od začátku | ⭐⭐ Pokročilý začátečník | Python, základní matematika |
|
||||
| [Klasifikátor obrázků](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/03-image-classifier.ipynb) | Klasifikujte obrázky s předtrénovaným modelem | ⭐⭐ Pokročilý začátečník | Python, numpy |
|
||||
| [Sentiment textu](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/04-text-sentiment.py) | Analyzujte sentiment textu (pozitivní/negativní) | ⭐⭐ Pokročilý začátečník | Python |
|
||||
|
||||
## 🚀 Začínáme
|
||||
|
||||
### Předpoklady
|
||||
|
||||
Ujistěte se, že máte nainstalovaný Python (doporučujeme verzi 3.8 nebo vyšší). Nainstalujte potřebné balíčky:
|
||||
Ujistěte se, že máte nainstalovaný Python (doporučeno verze 3.8 nebo vyšší). Nainstalujte požadované balíčky:
|
||||
|
||||
```bash
|
||||
# For Python scripts
|
||||
# Pro Python skripty
|
||||
pip install numpy
|
||||
|
||||
# For Jupyter notebooks (image classifier)
|
||||
# Pro Jupyter notebooky (klasifikátor obrazů)
|
||||
pip install jupyter numpy pillow tensorflow
|
||||
```
|
||||
|
||||
|
|
@ -32,7 +32,7 @@ conda env create --name ai4beg --file ../environment.yml
|
|||
conda activate ai4beg
|
||||
```
|
||||
|
||||
### Spouštění příkladů
|
||||
### Spuštění příkladů
|
||||
|
||||
**Pro Python skripty (.py soubory):**
|
||||
```bash
|
||||
|
|
@ -44,21 +44,21 @@ python 01-hello-ai-world.py
|
|||
jupyter notebook 03-image-classifier.ipynb
|
||||
```
|
||||
|
||||
## 📖 Učební cesta
|
||||
## 📖 Studijní cesta
|
||||
|
||||
Doporučujeme postupovat podle příkladů v tomto pořadí:
|
||||
|
||||
1. **Začněte s "Hello AI World"** - Naučte se základy rozpoznávání vzorů
|
||||
2. **Vytvořte jednoduchou neuronovou síť** - Pochopte, jak fungují neuronové sítě
|
||||
3. **Vyzkoušejte klasifikátor obrázků** - Podívejte se na AI v akci s reálnými obrázky
|
||||
1. **Začněte s „Hello AI World“** - Naučte se základy rozpoznávání vzorů
|
||||
2. **Postavte jednoduchou neuronovou síť** - Pochopte, jak neuronové sítě fungují
|
||||
3. **Vyzkoušejte klasifikátor obrázků** - Uvidíte AI v akci s reálnými obrázky
|
||||
4. **Analyzujte sentiment textu** - Prozkoumejte zpracování přirozeného jazyka
|
||||
|
||||
## 💡 Tipy pro začátečníky
|
||||
|
||||
- **Pečlivě čtěte komentáře v kódu** - Vysvětlují, co každá řádka dělá
|
||||
- **Experimentujte!** - Zkuste měnit hodnoty a sledujte, co se stane
|
||||
- **Nedělejte si starosti, pokud všemu nerozumíte** - Učení vyžaduje čas
|
||||
- **Ptejte se** - Použijte [diskusní fórum](https://github.com/microsoft/AI-For-Beginners/discussions)
|
||||
- **Pečlivě si přečtěte komentáře v kódu** - Vysvětlují, co každý řádek dělá
|
||||
- **Experimentujte!** - Zkoušejte měnit hodnoty a sledujte, co se stane
|
||||
- **Nebuďte znepokojeni, když nerozumíte hned všemu** - Učení vyžaduje čas
|
||||
- **Ptejte se** - Použijte [diskuzní fórum](https://github.com/microsoft/AI-For-Beginners/discussions)
|
||||
|
||||
## 🔗 Další kroky
|
||||
|
||||
|
|
@ -68,18 +68,20 @@ Po dokončení těchto příkladů prozkoumejte celý kurz:
|
|||
- [Počítačové vidění](../lessons/4-ComputerVision/README.md)
|
||||
- [Zpracování přirozeného jazyka](../lessons/5-NLP/README.md)
|
||||
|
||||
## 🤝 Přispívání
|
||||
## 🤝 Přispění
|
||||
|
||||
Pomohly vám tyto příklady? Pomozte nám je zlepšit:
|
||||
- Nahlaste problémy nebo navrhněte vylepšení
|
||||
- Přidejte další příklady pro začátečníky
|
||||
- Zlepšete dokumentaci a komentáře
|
||||
Považujete tyto příklady za užitečné? Pomozte nám je zlepšit:
|
||||
- Nahlaste problémy nebo navrhněte zlepšení
|
||||
- Přidejte více příkladů pro začátečníky
|
||||
- Vylepšete dokumentaci a komentáře
|
||||
|
||||
---
|
||||
|
||||
*Pamatujte: Každý expert byl kdysi začátečníkem. Přejeme vám příjemné učení! 🎓*
|
||||
*Pamatujte: Každý expert byl jednou začátečník. Přejeme šťastné učení! 🎓*
|
||||
|
||||
---
|
||||
|
||||
**Upozornění**:
|
||||
Tento dokument byl přeložen pomocí služby AI pro překlad [Co-op Translator](https://github.com/Azure/co-op-translator). I když se snažíme o přesnost, mějte prosím na paměti, že automatické překlady mohou obsahovat chyby nebo nepřesnosti. Původní dokument v jeho původním jazyce by měl být považován za autoritativní zdroj. Pro důležité informace se doporučuje profesionální lidský překlad. Nejsme zodpovědní za jakékoli nedorozumění nebo nesprávné interpretace vyplývající z použití tohoto překladu.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**Prohlášení o omezení odpovědnosti**:
|
||||
Tento dokument byl přeložen pomocí AI překladatelské služby [Co-op Translator](https://github.com/Azure/co-op-translator). Přestože usilujeme o co největší přesnost, mějte prosím na paměti, že automatizované překlady mohou obsahovat chyby nebo nepřesnosti. Originální dokument v jeho mateřském jazyce by měl být považován za autoritativní zdroj. Pro kritické informace se doporučuje profesionální lidský překlad. Nejsme odpovědní za jakékoli nedorozumění nebo nesprávné interpretace vzniklé použitím tohoto překladu.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -1,12 +1,12 @@
|
|||
# Jak spustit kód
|
||||
|
||||
Tento kurz obsahuje spoustu spustitelných příkladů a laboratorních cvičení, která budete chtít spustit. K tomu je potřeba mít možnost spouštět Python kód v Jupyter Noteboocích poskytnutých jako součást tohoto kurzu. Pro spuštění kódu máte několik možností:
|
||||
Tento učební plán obsahuje spoustu spustitelných příkladů a laboratoří, které budete chtít spustit. Abyste to mohli udělat, potřebujete možnost spouštět Python kód v Jupyter Noteboocích, které jsou součástí tohoto učebního plánu. Máte několik možností, jak kód spustit:
|
||||
|
||||
## Spuštění lokálně na vašem počítači
|
||||
|
||||
Pro spuštění kódu lokálně na vašem počítači je potřeba mít nainstalovaný Python. Jedním z doporučení je instalace **[miniconda](https://conda.io/en/latest/miniconda.html)** – jedná se o poměrně lehkou instalaci, která podporuje správce balíčků `conda` pro různé Python **virtuální prostředí**.
|
||||
Pro spuštění kódu lokálně na vašem počítači je potřeba nainstalovat Python. Jedním z doporučení je instalace **[miniconda](https://conda.io/en/latest/miniconda.html)** - jde o poměrně lehkou instalaci, která podporuje správce balíčků `conda` pro různé Python **virtuální prostředí**.
|
||||
|
||||
Po instalaci minicondy si klonujte repozitář a vytvořte virtuální prostředí, které budete používat pro tento kurz:
|
||||
Po instalaci minicondy naklonujte repozitář a vytvořte virtuální prostředí, které budete používat pro tento kurz:
|
||||
|
||||
```bash
|
||||
git clone http://github.com/microsoft/ai-for-beginners
|
||||
|
|
@ -17,17 +17,17 @@ conda activate ai4beg
|
|||
|
||||
### Použití Visual Studio Code s Python rozšířením
|
||||
|
||||
Tento kurz je nejlepší používat, když jej otevřete v [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) s [Python rozšířením](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste).
|
||||
Tento učební plán je nejlepší používat po otevření v [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) s [Python rozšířením](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste).
|
||||
|
||||
> **Poznámka**: Jakmile repozitář klonujete a otevřete ve VS Code, automaticky se vám nabídne instalace Python rozšíření. Také budete muset nainstalovat miniconda, jak je popsáno výše.
|
||||
> **Poznámka**: Jakmile naklonujete a otevřete složku ve VS Code, automaticky vám navrhne instalovat Python rozšíření. Dále je potřeba nainstalovat miniconda, jak je popsáno výše.
|
||||
|
||||
> **Poznámka**: Pokud vám VS Code nabídne znovu otevřít repozitář v kontejneru, měli byste to zamítnout, pokud chcete používat lokální Python instalaci.
|
||||
> **Poznámka**: Pokud vám VS Code navrhne znovu otevřít repozitář v kontejneru, měli byste to odmítnout, abyste mohli používat lokální instalaci Pythonu.
|
||||
|
||||
### Použití Jupyter v prohlížeči
|
||||
### Použití Jupyteru v prohlížeči
|
||||
|
||||
Můžete také používat prostředí Jupyter přímo v prohlížeči na vašem počítači. Jak klasický Jupyter, tak JupyterHub poskytují pohodlné vývojové prostředí s automatickým dokončováním, zvýrazňováním kódu atd.
|
||||
Můžete také použít Jupyter prostředí z prohlížeče na svém vlastním počítači. Jak klasický Jupyter, tak JupyterHub poskytují pohodlné vývojové prostředí s automatickým doplňováním, zvýrazněním kódu atd.
|
||||
|
||||
Pro spuštění Jupyter lokálně přejděte do adresáře kurzu a spusťte:
|
||||
Pro spuštění Jupyteru lokálně přejděte do složky kurzu a spusťte:
|
||||
|
||||
```bash
|
||||
jupyter notebook
|
||||
|
|
@ -36,36 +36,36 @@ nebo
|
|||
```bash
|
||||
jupyterhub
|
||||
```
|
||||
Poté můžete přejít k libovolnému souboru `.ipynb`, otevřít ho a začít pracovat.
|
||||
Poté můžete přejít k jakémukoliv `.ipynb` souboru, otevřít ho a začít pracovat.
|
||||
|
||||
### Spuštění v kontejneru
|
||||
|
||||
Jinou možností místo instalace Pythonu je spuštění kódu v kontejneru. Jelikož náš repozitář obsahuje speciální složku `.devcontainer`, která určuje, jak postavit kontejner pro tento repozitář, VS Code nabízí možnost znovu otevřít kód přímo v kontejneru. To ale vyžaduje instalaci Dockeru a je to složitější, takže toto doporučujeme spíše zkušenějším uživatelům.
|
||||
Alternativou k instalaci Pythonu je spustit kód v kontejneru. Náš repozitář obsahuje speciální složku `.devcontainer`, která udává, jak kontejner pro tento repozitář sestavit, a VS Code nabízí možnost kód znovu otevřít v kontejneru. To vyžaduje instalaci Dockeru a je to složitější, proto doporučujeme tuto možnost spíše pokročilým uživatelům.
|
||||
|
||||
## Spuštění v cloudu
|
||||
|
||||
Pokud nechcete Python instalovat lokálně a máte přístup k nějakým cloudovým zdrojům, dobrou alternativou je spuštění kódu v cloudu. Nabízí se několik variant:
|
||||
Pokud nechcete instalovat Python lokálně a máte přístup k nějakým cloudovým zdrojům, dobrou alternativou je spustit kód v cloudu. Existuje několik způsobů, jak to udělat:
|
||||
|
||||
* Použít **[GitHub Codespaces](https://github.com/features/codespaces)**, což je virtuální prostředí vytvořené pro vás na GitHubu, přístupné přes VS Code v prohlížeči. Pokud máte přístup ke Codespaces, stačí kliknout na tlačítko **Code** v repozitáři, spustit Codespace a hned můžete začít.
|
||||
* Použít **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) nabízí zdarma výpočetní prostředky v cloudu, kde si můžete zkusit spustit nějaký kód z GitHubu. Na úvodní stránce je tlačítko pro otevření repozitáře v Binderu – to vás rychle převeze na stránku Binderu, která sestaví podkladový kontejner a bez problémů spustí webové rozhraní Jupyter.
|
||||
* Použití **[GitHub Codespaces](https://github.com/features/codespaces)**, což je virtuální prostředí vytvořené pro vás na GitHubu, přístupné přes VS Code v prohlížeči. Pokud máte přístup ke Codespaces, stačí kliknout na tlačítko **Code** v repozitáři, spustit codespace a můžete začít během chvíle.
|
||||
* Použití **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) nabízí zdarma výpočetní zdroje v cloudu, aby lidé jako vy mohli vyzkoušet nějaký kód na GitHubu. Na hlavní stránce je tlačítko pro otevření repozitáře v Binderu - to by vás rychle mělo přesměrovat na stránku binderu, která sestaví základní kontejner a spustí pro vás Jupyter webové rozhraní bez problémů.
|
||||
|
||||
> **Poznámka**: Pro zamezení zneužití má Binder blokovaný přístup k některým webovým zdrojům. Může se tak stát, že některé části kódu, které stahují modely nebo dataset z Internetu, nebudou fungovat. Budete si muset najít nějaké alternativy. Compute zdroje, které Binder poskytuje, jsou základní, takže trénování bude pomalé, zejména v pozdějších, složitějších lekcích.
|
||||
> **Poznámka**: Aby se zabránilo zneužití, má Binder blokovaný přístup k některým webovým zdrojům. To může znemožnit běh některých částí kódu, které stahují modely a/nebo datasety z veřejného internetu. Možná budete muset najít nějaká obcházení. Také výpočetní zdroje poskytované Binderem jsou poměrně základní, takže trénink bude pomalý, zejména v pozdějších, složitějších lekcích.
|
||||
|
||||
## Spuštění v cloudu s GPU
|
||||
|
||||
Některé pokročilejší lekce v tomto kurzu by velmi výrazně profitovaly z podpory GPU. Trénování modelů by jinak mohlo být bolestivě pomalé. Máte pár možností, zejména pokud máte přístup do cloudu přes [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) nebo přes vaši instituci:
|
||||
Některé z pozdějších lekcí v tomto učebním plánu by výrazně profitovaly z podpory GPU. Trénink modelů může být jinak bolestivě pomalý. Existuje několik možností, které můžete využít, obzvlášť pokud máte přístup k cloudu buď přes [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) nebo přes vaši instituci:
|
||||
|
||||
* Vytvořit [Data Science Virtual Machine](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) a připojit se k ní přes Jupyter. Pak si můžete přímo na této VM klonovat repozitář a začít se učit. NC série VM mají podporu GPU.
|
||||
* Vytvořte [Data Science Virtual Machine](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) a připojte se k ní přes Jupyter. Můžete pak naklonovat repozitář přímo na stroj a začít se učit. VM řady NC mají podporu GPU.
|
||||
|
||||
> **Poznámka**: Některé typy předplatného, včetně Azure for Students, GPU podporu hned v základu neposkytují. Může být potřeba požádat o další GPU jádra přes technickou podporu.
|
||||
> **Poznámka**: Některé předplatné, včetně Azure for Students, neposkytují podporu GPU automaticky. Možná budete muset požádat o dodatečné GPU jádra pomocí technické podpory.
|
||||
|
||||
* Vytvořit [Azure Machine Learning Workspace](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) a využít tamní funkci Notebooks. [Toto video](https://azure-for-academics.github.io/quickstart/azureml-papers/) ukazuje, jak klonovat repozitář do Azure ML notebooku a začít jej používat.
|
||||
* Vytvořte [Azure Machine Learning Workspace](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) a použijte tam funkci Notebook. [Toto video](https://azure-for-academics.github.io/quickstart/azureml-papers/) ukazuje, jak naklonovat repozitář do Azure ML notebooku a začít ho používat.
|
||||
|
||||
Můžete také využít Google Colab, který nabízí nějakou výpočetní kapacitu s GPU zdarma, a do něj nahrávat Jupyter Notebooky a spouštět je jednotlivě.
|
||||
Můžete také použít Google Colab, který nabízí nějakou bezplatnou podporu GPU, a tam nahrát Jupyter Notebooky ke spouštění jeden po druhém.
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**Prohlášení o vyloučení odpovědnosti**:
|
||||
Tento dokument byl přeložen pomocí AI překladatelské služby [Co-op Translator](https://github.com/Azure/co-op-translator). Přestože usilujeme o přesnost, mějte prosím na paměti, že automatické překlady mohou obsahovat chyby nebo nepřesnosti. Originální dokument v jeho mateřském jazyce by měl být považován za autoritativní zdroj. Pro kritické informace se doporučuje profesionální lidský překlad. Nejsme odpovědní za jakékoliv nepochopení nebo nesprávné výklady vyplývající z použití tohoto překladu.
|
||||
**Prohlášení o omezení odpovědnosti**:
|
||||
Tento dokument byl přeložen pomocí AI překladatelské služby [Co-op Translator](https://github.com/Azure/co-op-translator). Přestože usilujeme o co největší přesnost, mějte prosím na paměti, že automatizované překlady mohou obsahovat chyby nebo nepřesnosti. Originální dokument v jeho mateřském jazyce by měl být považován za autoritativní zdroj. Pro kritické informace se doporučuje profesionální lidský překlad. Nejsme odpovědní za jakékoli nedorozumění nebo nesprávné interpretace vzniklé použitím tohoto překladu.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -4,11 +4,11 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Předtrénované modely a transfer learning\n",
|
||||
"# Předtrénované modely a transferové učení\n",
|
||||
"\n",
|
||||
"Trénování CNN může zabrat hodně času a vyžaduje velké množství dat. Většina času je však věnována učení nejlepších nízkoúrovňových filtrů, které síť používá k extrakci vzorů z obrázků. Přirozeně se nabízí otázka – můžeme použít neuronovou síť natrénovanou na jednom datasetu a přizpůsobit ji klasifikaci jiných obrázků bez kompletního trénovacího procesu?\n",
|
||||
"Trénování CNN může zabrat hodně času a pro tento úkol je potřeba mnoho dat. Nicméně, většina času je věnována učení nejlepších nízkoúrovňových filtrů, které síť používá k extrakci vzorů z obrázků. Vzniká přirozená otázka – můžeme použít neuronovou síť vytrénovanou na jednom datasetu a přizpůsobit ji klasifikaci jiných obrázků bez celého tréninkového procesu?\n",
|
||||
"\n",
|
||||
"Tento přístup se nazývá **transfer learning**, protože přenášíme určité znalosti z jednoho modelu neuronové sítě na jiný. Při transfer learningu obvykle začínáme s předtrénovaným modelem, který byl natrénován na nějakém velkém datasetu obrázků, například na **ImageNet**. Tyto modely už dokážou dobře extrahovat různé rysy z obecných obrázků a v mnoha případech stačí postavit klasifikátor na vrcholu těchto extrahovaných rysů, aby bylo dosaženo dobrého výsledku.\n"
|
||||
"Tento přístup se nazývá **transferové učení**, protože přenášíme určité znalosti z jednoho modelu neuronové sítě do druhého. V transferovém učení obvykle začínáme s předtrénovaným modelem, který byl vytrénován na nějakém velkém obrazovém datasetu, jako je například **ImageNet**. Tyto modely už umí dobře extrahovat různé rysy z obecných obrázků a v mnoha případech stačí postavit klasifikátor na těchto extrahovaných rysech, aby byl dosažen dobrý výsledek.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -29,11 +29,11 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Dataset kočky vs. psi\n",
|
||||
"## Datová sada Kočky vs. Psi\n",
|
||||
"\n",
|
||||
"V této lekci budeme řešit reálný problém klasifikace obrázků koček a psů. K tomu využijeme [Kaggle Cats vs. Dogs Dataset](https://www.kaggle.com/c/dogs-vs-cats), který lze také stáhnout [od Microsoftu](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n",
|
||||
"V této jednotce vyřešíme reálný problém klasifikace obrázků koček a psů. K tomuto účelu využijeme [Kaggle Cats vs. Dogs Dataset](https://www.kaggle.com/c/dogs-vs-cats), kterou je také možné stáhnout [z Microsoftu](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n",
|
||||
"\n",
|
||||
"Stáhněme si tento dataset a rozbalme ho do adresáře `data` (tento proces může chvíli trvat!):\n"
|
||||
"Stáhněme si tuto datovou sadu a rozbalme ji do adresáře `data` (tento proces může chvíli trvat!):\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -64,7 +64,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Bohužel, v datové sadě jsou některé poškozené obrazové soubory. Musíme provést rychlé čištění, abychom zkontrolovali poškozené soubory. Abychom nenarušili tento tutoriál, přesunuli jsme kód pro ověření datové sady do modulu.\n"
|
||||
"Bohužel je v datové sadě několik poškozených obrazových souborů. Musíme rychle vyčistit a zkontrolovat, zda nejsou soubory poškozené. Abychom tento návod nepřerušili, přesunuli jsme kód pro ověření datové sady do modulu.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -335,11 +335,11 @@
|
|||
"source": [
|
||||
"## Načítání datasetu\n",
|
||||
"\n",
|
||||
"V předchozích příkladech jsme načítali datasety, které jsou součástí Keras. Nyní se budeme zabývat vlastním datasetem, který potřebujeme načíst z adresáře s obrázky.\n",
|
||||
"V předchozích příkladech jsme načítali datasety, které jsou součástí Kerasu. Nyní se budeme zabývat vlastním datasetem, který potřebujeme načíst z adresáře s obrázky.\n",
|
||||
"\n",
|
||||
"V reálném životě může být velikost datasetů obrázků poměrně velká a nelze se spoléhat na to, že všechna data se vejdou do paměti. Proto jsou datasety často reprezentovány jako **generátory**, které mohou vracet data v minibatchích vhodných pro trénování.\n",
|
||||
"V reálném životě mohou být velikosti obrazových datasetů docela velké a nelze spoléhat na to, že všechna data se vejdou do paměti. Proto jsou datasety často reprezentovány jako **generátory**, které mohou vracet data po minibatchích vhodných pro trénink.\n",
|
||||
"\n",
|
||||
"Pro práci s klasifikací obrázků obsahuje Keras speciální funkci `image_dataset_from_directory`, která dokáže načítat obrázky z podadresářů odpovídajících různým třídám. Tato funkce se také postará o škálování obrázků a může dataset rozdělit na trénovací a testovací podmnožiny:\n"
|
||||
"Pro řešení klasifikace obrázků Keras obsahuje speciální funkci `image_dataset_from_directory`, která dokáže načíst obrázky z podsložek odpovídajících různým třídám. Tato funkce se také postará o škálování obrázků a může také rozdělit dataset na trénovací a testovací podmnožiny:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -383,9 +383,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Je důležité nastavit stejnou hodnotu `seed` pro oba volání, protože ovlivňuje rozdělení obrázků mezi trénovací a testovací dataset.\n",
|
||||
"Je důležité nastavit stejnou hodnotu `seed` pro oba volání, protože to ovlivňuje rozdělení obrázků mezi tréninkovou a testovací sadu.\n",
|
||||
"\n",
|
||||
"Dataset automaticky načítá názvy tříd z adresářů a můžete k nim přistupovat, pokud je to potřeba, zavoláním:\n"
|
||||
"Dataset automaticky načítá názvy tříd z adresářů a k těmto názvům se můžete případně dostat zavoláním:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -412,7 +412,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Datové sady, které jsme získali, lze přímo předat funkci `fit` pro natrénování modelu. Obsahují jak odpovídající obrázky, tak i štítky, které lze procházet pomocí následující konstrukce:\n"
|
||||
"Dataset, které jsme získali, lze přímo předat funkci `fit` pro trénování modelu. Obsahují jak příslušné obrázky, tak štítky, přes které lze procházet pomocí následující konstrukce:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -453,7 +453,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"> **Poznámka**: Všechny obrázky v datové sadě jsou reprezentovány jako tenzory s plovoucí desetinnou čárkou v rozsahu 0-255. Před jejich předáním do neuronové sítě je potřeba tyto hodnoty škálovat do rozsahu 0-1. Při vykreslování obrázků musíme udělat totéž, nebo převést hodnoty na typ `int` (což děláme v kódu výše), abychom ukázali `matplotlib`, že chceme vykreslit původní neškálovaný obrázek.\n"
|
||||
"> **Poznámka**: Všechny obrázky v datasetu jsou reprezentovány jako tenzory s plovoucí desetinnou čárkou v rozsahu 0-255. Před předáním do neuronové sítě je třeba tyto hodnoty škálovat do rozsahu 0-1. Při vykreslování obrázků je třeba udělat totéž, nebo převést hodnoty na typ `int` (což děláme v kódu výše), aby `matplotlib` ukázal, že chceme vykreslit původní neschálovaný obrázek.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -462,7 +462,7 @@
|
|||
"source": [
|
||||
"## Předtrénované modely\n",
|
||||
"\n",
|
||||
"Pro mnoho úloh klasifikace obrázků lze najít předtrénované modely neuronových sítí. Mnoho z těchto modelů je dostupných v rámci jmenného prostoru `keras.applications` a ještě více modelů lze nalézt na internetu. Podívejme se, jak lze načíst a použít nejjednodušší model VGG-16:\n"
|
||||
"Pro mnoho úloh klasifikace obrázků lze nalézt předtrénované modely neuronových sítí. Mnoho z těchto modelů je dostupných v jmenném prostoru `keras.applications` a ještě více modelů lze najít na internetu. Podívejme se, jak lze nejjednodušší model VGG-16 načíst a používat:\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": [
|
||||
"Existuje několik důležitých věcí:\n",
|
||||
"\n",
|
||||
"* Před předáním vstupu do jakékoli předtrénované sítě je nutné jej určitým způsobem předzpracovat. To se provádí voláním odpovídající funkce `preprocess_input`, která přijímá dávku obrázků a vrací jejich zpracovanou podobu. V případě VGG-16 jsou obrázky normalizovány a od každého kanálu je odečtena předem definovaná průměrná hodnota. To je proto, že VGG-16 byla původně trénována s tímto předzpracováním.\n",
|
||||
"* Neuronová síť je aplikována na vstupní dávku a výsledkem je dávka 1000-prvkových tenzorů, které ukazují pravděpodobnost každé třídy. Nejpravděpodobnější číslo třídy můžeme najít voláním `argmax` na tomto tenzoru.\n",
|
||||
"* Získaný výsledek je [číslo třídy `ImageNet`](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Abychom tomuto výsledku porozuměli, můžeme také použít funkci `decode_predictions`, která vrací n nejlepších tříd spolu s jejich názvy.\n"
|
||||
"Zde je několik důležitých věcí:\n",
|
||||
"* Než předáte vstup do jakékoli předtrénované sítě, musí být určitým způsobem předzpracován. To se provádí voláním odpovídající funkce `preprocess_input`, která přijímá dávku obrázků a vrací jejich zpracovanou podobu. V případě VGG-16 jsou obrázky normalizovány a od každého kanálu je odečtena předdefinovaná průměrná hodnota. To proto, že VGG-16 byl původně trénován s tímto předzpracováním.\n",
|
||||
"* Neuronová síť se aplikuje na vstupní dávku a jako výsledek obdržíme dávku tenzorů o 1000 prvcích, které ukazují pravděpodobnost každé třídy. Nejpravděpodobnější číslo třídy můžeme najít zavoláním `argmax` na tomto tenzoru.\n",
|
||||
"* Získaný výsledek je [číslo třídy `ImageNet`](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Pro lepší pochopení tohoto výsledku můžeme také použít funkci `decode_predictions`, která vrátí n nejlepších tříd spolu s jejich názvy.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -600,7 +609,7 @@
|
|||
"source": [
|
||||
"## Výpočty na GPU\n",
|
||||
"\n",
|
||||
"Hluboké neuronové sítě, jako je VGG-16 a další modernější architektury, vyžadují poměrně velký výpočetní výkon pro svůj běh. Má smysl využít akceleraci pomocí GPU, pokud je k dispozici. Naštěstí Keras automaticky zrychluje výpočty na GPU, pokud je dostupné. Můžeme ověřit, zda Tensorflow dokáže využít GPU, pomocí následujícího kódu:\n"
|
||||
"Hluboké neuronové sítě, jako VGG-16 a další modernější architektury, vyžadují pro běh poměrně mnoho výpočetního výkonu. Má smysl používat akceleraci na GPU, pokud je k dispozici. Naštěstí Keras automaticky zrychluje výpočty na GPU, pokud je dostupné. Můžeme zkontrolovat, zda Tensorflow dokáže použít GPU, pomocí následujícího kódu:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -627,9 +636,10 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Extrahování funkcí VGG\n",
|
||||
"\n",
|
||||
"Pokud chceme použít VGG-16 k extrahování funkcí z našich obrázků, potřebujeme model bez závěrečných klasifikačních vrstev. Model VGG-16 bez horních vrstev můžeme vytvořit pomocí tohoto kódu:\n"
|
||||
"## Extrahování VGG rysů\n",
|
||||
"\n",
|
||||
"Pokud chceme použít VGG-16 k extrahování rysů z našich obrázků, potřebujeme model bez finálních klasifikačních vrstev. Model VGG-16 bez vrchních vrstev můžeme vytvořit pomocí tohoto kódu:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -681,9 +691,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Rozměr tenzoru příznaků je 7x7x512, ale abychom jej mohli vizualizovat, museli jsme jej převést do 2D formy.\n",
|
||||
"Rozměr tenzoru rysů je 7x7x512, ale aby bylo možné jej vizualizovat, museli jsme jej přetvarovat do 2D formy.\n",
|
||||
"\n",
|
||||
"Teď se pokusme zjistit, zda lze tyto příznaky použít k klasifikaci obrázků. Ručně vezmeme určitou část obrázků (v našem případě 50 minibatchů) a předem vypočítáme jejich vektor příznaků. K tomu můžeme použít Tensorflow **dataset** API. Funkce `map` vezme dataset a aplikuje na něj zadanou lambda-funkci pro jeho transformaci. Tento mechanismus využíváme k vytvoření nových datasetů, `ds_features_train` a `ds_features_test`, které obsahují příznaky extrahované pomocí VGG namísto původních obrázků.\n"
|
||||
"Teď se pokusme zjistit, jestli by tyto rysy šly použít ke klasifikaci obrázků. Ručně vybereme nějakou část obrázků (v našem případě 50 minibatchů) a předpočítáme jejich vektor rysů. K tomu můžeme použít Tensorflow **dataset** API. Funkce `map` vezme dataset a aplikuje danou lambda-funkci pro jeho transformaci. Tento mechanismus použijeme k vytvoření nových datasetů, `ds_features_train` a `ds_features_test`, které obsahují rysy vyextrahované modelem VGG místo původních obrázků.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -713,9 +723,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Použili jsme konstrukci `.take(50)` k omezení velikosti datové sady, abychom urychlili naši demonstraci. Samozřejmě můžete tento experiment provést na celé datové sadě.\n",
|
||||
"Použili jsme konstrukci `.take(50)` k omezení velikosti datasetu, abychom urychlili naši ukázku. Samozřejmě můžete tento experiment provést na celém datasetu.\n",
|
||||
"\n",
|
||||
"Nyní, když máme datovou sadu s extrahovanými příznaky, můžeme natrénovat jednoduchý hustý klasifikátor, který rozlišuje mezi kočkami a psy. Tato síť přijme vektor příznaků o tvaru (7,7,512) a vytvoří jeden výstup, který odpovídá buď psovi, nebo kočce. Protože se jedná o binární klasifikaci, použijeme aktivační funkci `sigmoid` a ztrátovou funkci `binary_crossentropy`.\n"
|
||||
"Nyní, když máme dataset s extrahovanými rysy, můžeme trénovat jednoduchý hustý klasifikátor, který rozliší kočky a psy. Tato síť převezme vektor rysů tvaru (7,7,512) a vytvoří jeden výstup, který odpovídá buď psovi, nebo kočce. Protože se jedná o binární klasifikaci, používáme aktivační funkci `sigmoid` a ztrátovou funkci `binary_crossentropy`.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -744,13 +754,13 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Výsledek je skvělý, dokážeme rozlišit mezi kočkou a psem s téměř 95% pravděpodobností! Nicméně, tento přístup jsme testovali pouze na podmnožině všech obrázků, protože manuální extrakce příznaků se zdá být velmi časově náročná.\n",
|
||||
"Výsledek je skvělý, můžeme s téměř 95% pravděpodobností rozlišit mezi kočkou a psem! Nicméně jsme tento přístup testovali pouze na podmnožině všech obrázků, protože manuální extrakce rysů se zdá být časově náročná.\n",
|
||||
"\n",
|
||||
"## Transfer learning pomocí jedné VGG sítě\n",
|
||||
"## Přenosové učení pomocí jedné sítě VGG\n",
|
||||
"\n",
|
||||
"Manuálnímu předběžnému výpočtu příznaků se můžeme také vyhnout tím, že během trénování použijeme původní síť VGG-16 jako celek, a přidáme extraktor příznaků jako první vrstvu naší sítě.\n",
|
||||
"Můžeme se také vyhnout manuálnímu předpočítávání rysů použitím původní sítě VGG-16 jako celku během tréninku, tím, že přidáme extraktor rysů do naší sítě jako první vrstvu.\n",
|
||||
"\n",
|
||||
"Krása architektury Keras spočívá v tom, že model VGG-16, který jsme definovali výše, může být použit také jako vrstva v jiné neuronové síti! Stačí vytvořit síť s hustým klasifikátorem na vrcholu a poté trénovat celou síť pomocí zpětného šíření.\n"
|
||||
"Krása architektury Keras spočívá v tom, že model VGG-16, který jsme definovali výše, může být také použit jako vrstva v jiné neuronové síti! Stačí nám sestavit síť s hustým klasifikátorem na vrchu a poté trénovat celou síť pomocí zpětné propagace.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -794,13 +804,13 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Tento model vypadá jako end-to-end klasifikační síť, která přijímá obrázek a vrací třídu. Nicméně, složitější částí je, že chceme, aby VGG16 fungoval jako extraktor příznaků, a ne aby byl znovu trénován. Proto je potřeba **zmrazit váhy konvolučního extraktoru příznaků**. K první vrstvě sítě se můžeme dostat voláním `model.layers[0]`, a stačí jen nastavit vlastnost `trainable` na `False`.\n",
|
||||
"Tento model vypadá jako end-to-end klasifikační síť, která přijímá obrázek a vrací třídu. Ovšem složitá věc je, že chceme, aby VGG16 fungoval jako extraktor rysů, a aby nebyl znovu trénován. Proto potřebujeme **zamrazit váhy konvolučního extraktoru rysů**. K první vrstvě sítě můžeme přistoupit zavoláním `model.layers[0]` a stačí nastavit vlastnost `trainable` na `False`.\n",
|
||||
"\n",
|
||||
"> **Poznámka**: Zmrazení vah extraktoru příznaků je nutné, protože jinak by netrénovaná klasifikační vrstva mohla zničit původní předtrénované váhy konvolučního extraktoru.\n",
|
||||
"> **Poznámka**: Zamrznutí vah extraktoru rysů je potřeba, protože jinak by netrénovaná klasifikační vrstva mohla zničit původní předtrénované váhy konvolučního extraktoru.\n",
|
||||
"\n",
|
||||
"Můžete si všimnout, že zatímco celkový počet parametrů v naší síti je přibližně 15 milionů, trénujeme pouze 25 tisíc parametrů. Všechny ostatní parametry konvolučních filtrů na vyšší úrovni jsou předtrénované. To je dobré, protože můžeme doladit menší počet parametrů s menším počtem příkladů.\n",
|
||||
"Můžete si všimnout, že i když je celkový počet parametrů v naší síti kolem 15 milionů, trénujeme pouze 25 tisíc parametrů. Všechny ostatní parametry nejvyšších konvolučních filtrů jsou předtrénované. To je dobré, protože tak můžeme ladit menší počet parametrů s menším počtem příkladů.\n",
|
||||
"\n",
|
||||
"Nyní budeme trénovat naši síť a uvidíme, jak dobrých výsledků můžeme dosáhnout. Očekávejte poměrně dlouhou dobu běhu a nebojte se, pokud se zdá, že provádění na chvíli zamrzlo.\n"
|
||||
"Nyní budeme trénovat naši síť a uvidíme, jak dobrých výsledků můžeme dosáhnout. Čekejte spíše delší dobu běhu a nedělejte si starosti, jestli se vykonávání na chvíli zdá zamrzlé.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -825,11 +835,11 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Vypadá to, že jsme získali poměrně přesný klasifikátor koček a psů!\n",
|
||||
"Vypadá to, že jsme získali poměrně přesný klasifikátor koček a psů! \n",
|
||||
"\n",
|
||||
"## Ukládání a načítání modelu\n",
|
||||
"\n",
|
||||
"Jakmile model natrénujeme, můžeme uložit architekturu modelu a natrénované váhy do souboru pro budoucí použití:\n"
|
||||
"Jakmile máme model natrénovaný, můžeme uložit architekturu modelu a natrénované váhy do souboru pro budoucí použití:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -853,7 +863,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Model můžeme kdykoli načíst ze souboru. Může to být užitečné v případě, že další experiment model zničí – nemuseli byste začínat úplně od začátku.\n"
|
||||
"Model pak můžeme kdykoli načíst ze souboru. Může se vám to hodit, pokud by další experiment model poškodil – nebudete muset začínat od začátku.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -869,15 +879,15 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Doladění přenosového učení\n",
|
||||
"## Doladění transferového učení\n",
|
||||
"\n",
|
||||
"V předchozí části jsme natrénovali finální vrstvu klasifikátoru, aby klasifikovala obrázky v našem vlastním datasetu. Nicméně jsme znovu netrénovali extraktor příznaků a náš model se spoléhal na příznaky, které se naučil na datech ImageNet. Pokud se vaše objekty vizuálně liší od běžných obrázků ImageNet, tato kombinace příznaků nemusí fungovat nejlépe. Proto má smysl začít trénovat i konvoluční vrstvy.\n",
|
||||
"V předchozí části jsme trénovali pouze konečnou klasifikační vrstvu pro klasifikaci obrázků v našem vlastním datovém souboru. Nicméně jsme nepře-trénovali extraktor rysů a náš model se spoléhal na rysy, které se model naučil na datech ImageNet. Pokud vaše objekty vizuálně odlišují od běžných obrázků ImageNet, tato kombinace rysů nemusí fungovat nejlépe. Proto je rozumné začít trénovat také konvoluční vrstvy.\n",
|
||||
"\n",
|
||||
"K tomu můžeme odemknout parametry konvolučních filtrů, které jsme dříve zamkli.\n",
|
||||
"Pro to můžeme \"odemknout\" parametry filtru konvoluce, které jsme předtím zamrazili.\n",
|
||||
"\n",
|
||||
"> **Note:** Je důležité nejprve zamknout parametry a provést několik epoch tréninku, aby se stabilizovaly váhy ve vrstvě klasifikátoru. Pokud ihned začnete trénovat síť od začátku do konce s odemčenými parametry, je pravděpodobné, že velké chyby zničí předtrénované váhy v konvolučních vrstvách.\n",
|
||||
"> **Poznámka:** Je důležité nejprve zamrazit parametry a provést několik epoch tréninku, aby se stabilizovaly váhy v klasifikační vrstvě. Pokud okamžitě začnete trénovat síť end-to-end s odemčenými parametry, velké chyby pravděpodobně zničí před-trénované váhy v konvolučních vrstvách.\n",
|
||||
"\n",
|
||||
"Náš konvoluční model VGG-16 se nachází uvnitř první vrstvy a sám o sobě se skládá z mnoha vrstev. Můžeme se podívat na jeho strukturu:\n"
|
||||
"Náš konvoluční VGG-16 model se nachází uvnitř první vrstvy, a sám se skládá z mnoha vrstev. Můžeme se podívat na jeho strukturu:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -946,7 +956,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Můžeme rozmrazit všechny vrstvy konvoluční základny:\n"
|
||||
"Můžeme odemknout všechny vrstvy konvoluční základny:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -962,7 +972,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Nicméně, rozmrazit všechny najednou není nejlepší nápad. Nejprve můžeme rozmrazit jen několik posledních vrstev konvolucí, protože obsahují vyšší úrovně vzorů, které jsou relevantní pro naše obrázky. Například, na začátek můžeme zmrazit všechny vrstvy kromě posledních 4:\n"
|
||||
"Nicméně, úplné rozmrazení všech najednou není nejlepší nápad. Můžeme nejprve rozmrazit jen několik posledních vrstev konvolucí, protože ty obsahují vyšší úrovně vzorů, které jsou relevantní pro naše obrázky. Například na začátek můžeme zmrazit všechny vrstvy kromě posledních 4: \n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1001,11 +1011,11 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Pozorujte, že počet trénovatelných parametrů se výrazně zvýšil, ale stále tvoří přibližně 50 % všech parametrů.\n",
|
||||
"Všimněte si, že počet trénovatelných parametrů se výrazně zvýšil, ale stále je to přibližně 50 % ze všech parametrů.\n",
|
||||
"\n",
|
||||
"Po odemknutí můžeme provést několik dalších epoch trénování (v našem příkladu provedeme pouze jednu). Můžete také zvolit nižší hodnotu učícího se kroku, abyste minimalizovali dopad na předem naučené váhy. Nicméně, i při nízké hodnotě učícího se kroku můžete očekávat, že přesnost na začátku trénování klesne, než nakonec dosáhne mírně vyšší úrovně než v případě fixních vah.\n",
|
||||
"Po odemčení můžeme provést ještě pár epoch trénování (v našem příkladu uděláme jen jednu). Můžete také zvolit nižší rychlost učení, aby byl minimalizován dopad na předtrénované váhy. Nicméně i při nízké rychlosti učení můžete očekávat, že přesnost na začátku tréninku poklesne, až nakonec dosáhne mírně vyšší úrovně než v případě fixních vah.\n",
|
||||
"\n",
|
||||
"> **Note:** Toto trénování probíhá mnohem pomaleji, protože je potřeba propagovat gradienty zpět skrz mnoho vrstev sítě!\n"
|
||||
"> **Poznámka:** Toto trénování probíhá mnohem pomaleji, protože musíme propagovat gradienty zpět skrz mnoho vrstev sítě!\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1029,9 +1039,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Pravděpodobně dosáhneme vyšší přesnosti při trénování, protože používáme výkonnější síť s více parametry, ale přesnost při validaci se nezvýší tolik.\n",
|
||||
"Pravděpodobně dosáhneme vyšší přesnosti při tréninku, protože používáme výkonnější síť s více parametry, ale přesnost na validačních datech by se nezvýšila tolik.\n",
|
||||
"\n",
|
||||
"Neváhejte uvolnit několik dalších vrstev sítě a trénovat dál, abyste zjistili, zda můžete dosáhnout vyšší přesnosti!\n"
|
||||
"Klidně odemkněte několik dalších vrstev sítě a trénujte dále, abyste zjistili, jestli dokážete dosáhnout vyšší přesnosti!\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1040,7 +1050,7 @@
|
|||
"source": [
|
||||
"## Další modely počítačového vidění\n",
|
||||
"\n",
|
||||
"VGG-16 je jednou z nejjednodušších architektur pro počítačové vidění. Keras nabízí mnoho dalších předtrénovaných sítí. Mezi nejčastěji používané patří architektury **ResNet**, vyvinuté společností Microsoft, a **Inception** od Googlu. Například se podívejme na architekturu nejjednoduššího modelu ResNet-50 (ResNet je rodina modelů s různou hloubkou, můžete zkusit experimentovat s ResNet-152, pokud chcete vidět, jak vypadá opravdu hluboký model):\n"
|
||||
"VGG-16 je jednou z nejjednodušších architektur počítačového vidění. Keras poskytuje mnoho dalších předtrénovaných sítí. Mezi nejčastěji používané patří architektury **ResNet** vyvinuté Microsoftem a **Inception** od Googlu. Například si prozkoumejme architekturu nejjednoduššího modelu ResNet-50 (ResNet je rodina modelů s různou hloubkou, můžete zkusit experimentovat s ResNet-152, pokud chcete vidět, jak vypadá opravdu hluboký model):\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1442,29 +1452,29 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Jak vidíte, model obsahuje stejné známé stavební bloky: konvoluční vrstvy, pooling vrstvy a finální hustý klasifikátor. Tento model můžeme použít stejným způsobem, jakým jsme používali VGG-16 pro transferové učení. Můžete zkusit experimentovat s výše uvedeným kódem, použít různé modely ResNet jako základní model a sledovat, jak se mění přesnost.\n",
|
||||
"Jak vidíte, model obsahuje ty stejné známé stavební bloky: konvoluční vrstvy, poolingové vrstvy a závěrečný hustý klasifikátor. Tento model můžeme použít přesně stejným způsobem, jako jsme používali VGG-16 pro přenosové učení. Můžete si vyzkoušet experimentovat s výše uvedeným kódem, použít různé modely ResNet jako základní model a sledovat, jak se mění přesnost.\n",
|
||||
"\n",
|
||||
"## Batch Normalizace\n",
|
||||
"\n",
|
||||
"Tato síť obsahuje ještě jeden typ vrstvy: **Batch Normalizace**. Myšlenka batch normalizace spočívá v tom, že hodnoty, které procházejí neuronovou sítí, jsou přivedeny do správného intervalu. Obvykle neuronové sítě fungují nejlépe, když jsou všechny hodnoty v rozmezí [-1,1] nebo [0,1], a právě proto škálujeme/normalizujeme naše vstupní data odpovídajícím způsobem. Během trénování hluboké sítě se však může stát, že hodnoty výrazně vybočí z tohoto rozmezí, což činí trénování problematickým. Vrstva batch normalizace vypočítá průměr a standardní odchylku pro všechny hodnoty aktuálního minibatchu a použije je k normalizaci signálu před jeho průchodem vrstvou neuronové sítě. To výrazně zlepšuje stabilitu hlubokých sítí.\n"
|
||||
"Tato síť obsahuje ještě další typ vrstvy: **Batch Normalizaci**. Myšlenkou batch normalizace je přivést hodnoty, které procházejí neuronovou sítí, do správného intervalu. Obvykle neuronové sítě fungují nejlépe, když jsou všechny hodnoty v rozsahu [-1,1] nebo [0,1], a proto naše vstupní data odpovídajícím způsobem škálujeme/normalizujeme. Během tréninku hluboké sítě se však může stát, že hodnoty se významně dostanou mimo tento rozsah, což činí trénink problematickým. Vrstva batch normalizace vypočítá průměr a směrodatnou odchylku pro všechny hodnoty aktuální mini dávky a použije je k normalizaci signálu před jeho předáním neuronové vrstvě. To významně zlepšuje stabilitu hlubokých sítí.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Shrnutí\n",
|
||||
"## Závěr\n",
|
||||
"\n",
|
||||
"Pomocí transferového učení jsme byli schopni rychle sestavit klasifikátor pro náš vlastní úkol klasifikace objektů a dosáhnout vysoké přesnosti. Tento příklad však nebyl zcela spravedlivý, protože původní síť VGG-16 byla předem natrénována na rozpoznávání koček a psů, a my jsme tak pouze znovu využili většinu vzorů, které již v síti byly přítomny. U exotičtějších objektů specifických pro určité domény, jako jsou detaily na výrobní lince v továrně nebo různé listy stromů, můžete očekávat nižší přesnost.\n",
|
||||
"Pomocí transferového učení jsme dokázali rychle sestavit klasifikátor pro náš vlastní úkol klasifikace objektů a dosáhnout vysoké přesnosti. Tento příklad však nebyl zcela férový, protože původní síť VGG-16 byla předem natrénována na rozpoznávání koček a psů, a tak jsme znovu použili většinu vzorů, které byla síť již naučena. Můžete očekávat nižší přesnost u více exotických a doménově specifických objektů, jako jsou detaily na výrobní lince v závodě nebo různé listy stromů.\n",
|
||||
"\n",
|
||||
"Je vidět, že složitější úkoly, které nyní řešíme, vyžadují vyšší výpočetní výkon a nelze je snadno řešit na CPU. V další části se pokusíme použít lehčí implementaci k natrénování stejného modelu s nižšími výpočetními nároky, což povede jen k mírně nižší přesnosti.\n"
|
||||
"Vidíte, že složitější úkoly, které nyní řešíme, vyžadují vyšší výpočetní výkon a nelze je snadno vyřešit na CPU. V další části se pokusíme použít lehčí implementaci k trénování stejného modelu s nižšími výpočetními zdroji, což povede jen k mírně nižší přesnosti.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**Prohlášení**: \nTento dokument byl přeložen pomocí služby pro automatický překlad [Co-op Translator](https://github.com/Azure/co-op-translator). I když se snažíme o co největší přesnost, mějte prosím na paměti, že automatické překlady mohou obsahovat chyby nebo nepřesnosti. Původní dokument v jeho původním jazyce by měl být považován za závazný zdroj. Pro důležité informace doporučujeme profesionální lidský překlad. Neodpovídáme za žádná nedorozumění nebo nesprávné výklady vyplývající z použití tohoto překladu.\n"
|
||||
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**Prohlášení o omezení odpovědnosti**:\nTento dokument byl přeložen pomocí AI překladatelské služby [Co-op Translator](https://github.com/Azure/co-op-translator). Přestože usilujeme o co největší přesnost, mějte prosím na paměti, že automatizované překlady mohou obsahovat chyby nebo nepřesnosti. Originální dokument v jeho mateřském jazyce by měl být považován za autoritativní zdroj. Pro kritické informace se doporučuje profesionální lidský překlad. Nejsme odpovědní za jakékoli nedorozumění nebo nesprávné interpretace vzniklé použitím tohoto překladu.\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
|
|
@ -1485,12 +1495,6 @@
|
|||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.8.10"
|
||||
},
|
||||
"coopTranslator": {
|
||||
"original_hash": "c189abc107848f96051085cc30945129",
|
||||
"translation_date": "2025-08-29T13:42:32+00:00",
|
||||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb",
|
||||
"language_code": "cs"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
|
|
|||
|
|
@ -1,51 +1,51 @@
|
|||
# Zpracování přirozeného jazyka
|
||||
|
||||

|
||||

|
||||
|
||||
V této sekci se zaměříme na použití neuronových sítí k řešení úkolů spojených se **zpracováním přirozeného jazyka (NLP)**. Existuje mnoho problémů v oblasti NLP, které bychom chtěli, aby počítače dokázaly vyřešit:
|
||||
V této sekci se zaměříme na využití neuronových sítí k řešení úkolů souvisejících se **zpracováním přirozeného jazyka (NLP)**. Existuje mnoho problémů NLP, které chceme, aby počítače dokázaly řešit:
|
||||
|
||||
* **Klasifikace textu** je typický klasifikační problém týkající se textových sekvencí. Příklady zahrnují klasifikaci e-mailových zpráv jako spam vs. ne-spam nebo kategorizaci článků jako sport, obchod, politika atd. Při vývoji chatbotů často potřebujeme pochopit, co uživatel chtěl říct – v tomto případě se jedná o **klasifikaci záměru**. Často je při klasifikaci záměru nutné pracovat s mnoha kategoriemi.
|
||||
* **Analýza sentimentu** je typický regresní problém, kdy potřebujeme přiřadit číslo (sentiment), které odpovídá tomu, jak pozitivní/negativní je význam věty. Pokročilejší verzí analýzy sentimentu je **analýza sentimentu na základě aspektů** (ABSA), kdy sentiment nepřiřazujeme celé větě, ale jejím různým částem (aspektům), např. *V této restauraci mi chutnala kuchyně, ale atmosféra byla příšerná*.
|
||||
* **Rozpoznávání pojmenovaných entit** (NER) se týká problému extrakce určitých entit z textu. Například můžeme potřebovat pochopit, že ve frázi *Potřebuji letět do Paříže zítra* slovo *zítra* odkazuje na DATUM a *Paříž* je LOKACE.
|
||||
* **Extrakce klíčových slov** je podobná NER, ale potřebujeme automaticky extrahovat slova důležitá pro význam věty, aniž bychom předem trénovali na konkrétní typy entit.
|
||||
* **Klasifikace textu** je typický klasifikační problém týkající se sekvencí textu. Příklady zahrnují klasifikaci e-mailových zpráv jako spam vs. ne-spam nebo kategorizaci článků jako sport, obchod, politika atd. Také při vývoji chatbotů často potřebujeme pochopit, co uživatel chtěl říct – v tomto případě řešíme **klasifikaci záměru**. Často v klasifikaci záměru musíme pracovat s mnoha kategoriemi.
|
||||
* **Analýza sentimentu** je typický regresní problém, kde je potřeba přidělit číslo (sentiment) odpovídající tomu, jak pozitivní/negativní je význam věty. Pokročilejší verzí analýzy sentimentu je **analýza sentimentu založená na aspektech** (ABSA), kde přidělujeme sentiment ne celému textu, ale různým jeho částem (aspektům), např. *V této restauraci se mi líbila kuchyně, ale atmosféra byla hrozná*.
|
||||
* **Rozpoznávání pojmenovaných entit** (NER) se týká problému vyhledávání určitých entit v textu. Například je potřeba pochopit, že ve frázi *Musím zítra letět do Paříže* slovo *zítra* odkazuje na DATUM a *Paříž* je LOKALITA.
|
||||
* **Extrahování klíčových slov** je podobné jako NER, ale je potřeba automaticky extrahovat slova důležitá pro význam věty bez předchozího tréninku na konkrétní typy entit.
|
||||
* **Shlukování textu** může být užitečné, když chceme seskupit podobné věty, například podobné požadavky v konverzacích technické podpory.
|
||||
* **Odpovídání na otázky** se týká schopnosti modelu odpovědět na konkrétní otázku. Model dostane jako vstup textový úryvek a otázku a musí poskytnout místo v textu, kde se odpověď na otázku nachází (nebo někdy vygenerovat text odpovědi).
|
||||
* **Generování textu** je schopnost modelu generovat nový text. Může být považováno za klasifikační úkol, který předpovídá další písmeno/slovo na základě nějakého *textového podnětu*. Pokročilé modely generování textu, jako je GPT-3, dokážou řešit i jiné úkoly NLP pomocí techniky zvané [programování pomocí podnětů](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) nebo [inženýrství podnětů](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29).
|
||||
* **Shrnutí textu** je technika, kdy chceme, aby počítač "přečetl" dlouhý text a shrnul ho do několika vět.
|
||||
* **Odpovídání na otázky** je schopnost modelu odpovědět na konkrétní otázku. Model dostane jako vstup textový úsek a otázku a potřebuje poskytnout místo v textu, kde je odpověď (nebo někdy také vygenerovat text odpovědi).
|
||||
* **Generování textu** je schopnost modelu generovat nový text. Může být považováno za klasifikační úkol, který předpovídá další písmeno/slovo na základě nějaké *textové výzvy*. Pokročilé modely generování textu, jako GPT-3, dokážou řešit i jiné NLP úkoly, například klasifikaci, pomocí techniky zvané [prompt programming](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) nebo [prompt engineering](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29)
|
||||
* **Shrnutí textu** je technika, kdy chceme, aby počítač „přečetl“ dlouhý text a shrnul ho do několika vět.
|
||||
* **Strojový překlad** lze vnímat jako kombinaci porozumění textu v jednom jazyce a generování textu v jiném.
|
||||
|
||||
Zpočátku byly většina úkolů NLP řešena tradičními metodami, jako jsou gramatiky. Například při strojovém překladu byly použity analyzátory k transformaci původní věty na syntaktický strom, poté byly extrahovány vyšší úrovně sémantických struktur k reprezentaci významu věty a na základě tohoto významu a gramatiky cílového jazyka byl generován výsledek. Dnes je mnoho úkolů NLP efektivněji řešeno pomocí neuronových sítí.
|
||||
Zpočátku byla většina NLP úkolů řešena tradičními metodami, jako byly gramatiky. Například při strojovém překladu se používaly parsery k transformaci počáteční věty do syntaktického stromu, poté byly extrahovány vyšší úrovně sémantických struktur reprezentujících význam věty a na základě tohoto významu a gramatiky cílového jazyka byl generován výsledek. V současnosti je mnoho úkolů NLP efektivněji řešeno pomocí neuronových sítí.
|
||||
|
||||
> Mnoho klasických metod NLP je implementováno v Python knihovně [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org). Online je dostupná skvělá [NLTK kniha](https://www.nltk.org/book/), která pokrývá, jak lze různé úkoly NLP řešit pomocí NLTK.
|
||||
> Mnoho klasických NLP metod je implementováno v Python knihovně [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org). Online je dostupná skvělá [kniha k NLTK](https://www.nltk.org/book/), která pokrývá, jak lze různé úkoly NLP řešit pomocí NLTK.
|
||||
|
||||
V našem kurzu se budeme převážně zaměřovat na použití neuronových sítí pro NLP a NLTK použijeme tam, kde to bude potřeba.
|
||||
V našem kurzu se budeme převážně zaměřovat na využití neuronových sítí pro NLP a NLTK použijeme tam, kde to bude potřeba.
|
||||
|
||||
Již jsme se naučili používat neuronové sítě pro práci s tabulkovými daty a obrázky. Hlavní rozdíl mezi těmito typy dat a textem je, že text je sekvence proměnné délky, zatímco velikost vstupu v případě obrázků je předem známá. Zatímco konvoluční sítě dokážou extrahovat vzory z vstupních dat, vzory v textu jsou složitější. Například negace může být oddělena od subjektu libovolným počtem slov (např. *Nemám rád pomeranče* vs. *Nemám rád ty velké barevné chutné pomeranče*), a to by mělo být stále interpretováno jako jeden vzor. Proto je pro práci s jazykem nutné zavést nové typy neuronových sítí, jako jsou *rekurentní sítě* a *transformery*.
|
||||
Už jsme se naučili využívat neuronové sítě pro práci s tabulkovými daty a s obrázky. Hlavní rozdíl mezi těmito typy dat a textem je, že text je sekvence proměnné délky, zatímco velikost vstupu u obrázků je předem známá. Zatímco konvoluční sítě dokážou extrahovat vzory ze vstupních dat, vzory v textu jsou složitější. Například zápor může být od předmětu oddělen libovolným počtem slov (např. *Nemám rád pomeranče* vs. *Nemám rád ty velké barevné chutné pomeranče*), ale mělo by to být stále interpretováno jako jeden vzor. Proto pro práci s jazykem potřebujeme zavést nové typy neuronových sítí, jako jsou *rekurentní sítě* a *transformery*.
|
||||
|
||||
## Instalace knihoven
|
||||
|
||||
Pokud používáte lokální instalaci Pythonu pro spuštění tohoto kurzu, možná budete muset nainstalovat všechny potřebné knihovny pro NLP pomocí následujících příkazů:
|
||||
Pokud používáte lokální instalaci Pythonu pro spuštění tohoto kurzu, možná budete muset nainstalovat všechny požadované knihovny pro NLP pomocí následujících příkazů:
|
||||
|
||||
**Pro PyTorch**
|
||||
```bash
|
||||
pip install -r requirements-torch.txt
|
||||
pip install -r requirements-pytorch.txt
|
||||
```
|
||||
**Pro TensorFlow**
|
||||
```bash
|
||||
pip install -r requirements-tf.txt
|
||||
```
|
||||
|
||||
> NLP s TensorFlow si můžete vyzkoušet na [Microsoft Learn](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste)
|
||||
> NLP s TensorFlow můžete zkusit na [Microsoft Learn](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste)
|
||||
|
||||
## Upozornění na GPU
|
||||
## Varování ohledně GPU
|
||||
|
||||
V této sekci budeme v některých příkladech trénovat poměrně velké modely.
|
||||
* **Použijte počítač s podporou GPU**: Doporučuje se spouštět vaše notebooky na počítači s podporou GPU, aby se zkrátila doba čekání při práci s velkými modely.
|
||||
* **Omezení paměti GPU**: Při běhu na GPU může dojít k situacím, kdy vám dojde paměť GPU, zejména při trénování velkých modelů.
|
||||
* **Spotřeba paměti GPU**: Množství paměti GPU spotřebované během trénování závisí na různých faktorech, včetně velikosti minibatch.
|
||||
* **Minimalizujte velikost minibatch**: Pokud narazíte na problémy s pamětí GPU, zvažte snížení velikosti minibatch ve vašem kódu jako možné řešení.
|
||||
* **Uvolnění paměti GPU v TensorFlow**: Starší verze TensorFlow nemusí správně uvolňovat paměť GPU při trénování více modelů v jednom Python kernelu. Pro efektivní správu paměti GPU můžete nastavit TensorFlow tak, aby alokoval paměť GPU pouze podle potřeby.
|
||||
* **Zahrnutí kódu**: Chcete-li nastavit TensorFlow tak, aby alokoval paměť GPU pouze podle potřeby, zahrňte následující kód do svých notebooků:
|
||||
* **Použijte počítač s podporou GPU**: Doporučuje se spouštět notebooky na počítači s podporou GPU, aby se zkrátila čekací doba při práci s velkými modely.
|
||||
* **Omezení paměti GPU**: Práce na GPU může vést k situacím, kdy dojde k vyčerpání paměti GPU, zejména při tréninku velkých modelů.
|
||||
* **Spotřeba paměti GPU**: Množství paměti GPU spotřebované během tréninku závisí na různých faktorech, včetně velikosti minibatch.
|
||||
* **Minimalizujte velikost minibatch**: Pokud narazíte na problémy s pamětí GPU, zvažte snížení velikosti minibatch ve svém kódu jako možné řešení.
|
||||
* **Uvolnění paměti GPU v TensorFlow**: Starší verze TensorFlow nemusí spr správně uvolnit paměť GPU při tréninku více modelů v jednom Python kernelu. Pro efektivní správu paměti GPU je možné nastavit TensorFlow tak, aby alokoval GPU paměť pouze podle potřeby.
|
||||
* **Začlenění kódu**: Pro nastavení TensorFlow, aby rozšiřoval alokaci GPU paměti pouze podle potřeby, zahrňte v notebooku následující kód:
|
||||
|
||||
```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)
|
||||
```
|
||||
|
||||
Pokud vás zajímá učení NLP z pohledu klasického strojového učení, navštivte [tento soubor lekcí](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP).
|
||||
Pokud máte zájem učit se o NLP z klasické perspektivy strojového učení, navštivte [tuto sadu lekcí](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP)
|
||||
|
||||
## V této sekci
|
||||
V této sekci se naučíme:
|
||||
V této sekci se naučíme o:
|
||||
|
||||
* [Reprezentace textu jako tenzorů](13-TextRep/README.md)
|
||||
* [Vektorové reprezentace slov](14-Emdeddings/README.md)
|
||||
* [Modelování jazyka](15-LanguageModeling/README.md)
|
||||
* [Rekurentní neuronové sítě](16-RNN/README.md)
|
||||
* [Generativní sítě](17-GenerativeNetworks/README.md)
|
||||
* [Transformery](18-Transformers/README.md)
|
||||
* [Reprezentaci textu jako tenzorů](13-TextRep/README.md)
|
||||
* [Word Embeddings](14-Emdeddings/README.md)
|
||||
* [Jazykovém modelování](15-LanguageModeling/README.md)
|
||||
* [Rekurentních neuronových sítích](16-RNN/README.md)
|
||||
* [Generativních sítích](17-GenerativeNetworks/README.md)
|
||||
* [Transformerech](18-Transformers/README.md)
|
||||
|
||||
**Prohlášení:**
|
||||
Tento dokument byl přeložen pomocí služby pro automatický překlad [Co-op Translator](https://github.com/Azure/co-op-translator). Ačkoli se snažíme o přesnost, mějte na paměti, že automatické překlady mohou obsahovat chyby nebo nepřesnosti. Původní dokument v jeho původním jazyce by měl být považován za autoritativní zdroj. Pro důležité informace se doporučuje profesionální lidský překlad. Neodpovídáme za žádná nedorozumění nebo nesprávné interpretace vyplývající z použití tohoto překladu.
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**Prohlášení o omezení odpovědnosti**:
|
||||
Tento dokument byl přeložen pomocí AI překladatelské služby [Co-op Translator](https://github.com/Azure/co-op-translator). Přestože usilujeme o co největší přesnost, mějte prosím na paměti, že automatizované překlady mohou obsahovat chyby nebo nepřesnosti. Originální dokument v jeho mateřském jazyce by měl být považován za autoritativní zdroj. Pro kritické informace se doporučuje profesionální lidský překlad. Nejsme odpovědní za jakékoli nedorozumění nebo nesprávné interpretace vzniklé použitím tohoto překladu.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -5,6 +5,12 @@
|
|||
"source_file": "AGENTS.md",
|
||||
"language_code": "da"
|
||||
},
|
||||
"CONTRIBUTING.md": {
|
||||
"original_hash": "c6fd7e781b67111a90abd166d0ce4aa0",
|
||||
"translation_date": "2026-07-08T18:04:07+00:00",
|
||||
"source_file": "CONTRIBUTING.md",
|
||||
"language_code": "da"
|
||||
},
|
||||
"README.md": {
|
||||
"original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b",
|
||||
"translation_date": "2026-04-06T16:25:23+00:00",
|
||||
|
|
@ -17,6 +23,19 @@
|
|||
"source_file": "SECURITY.md",
|
||||
"language_code": "da"
|
||||
},
|
||||
"__translation_failures__": {
|
||||
"lessons/sketchnotes/LICENSE.md": {
|
||||
"original_hash": "45ab63a2cd8f5faef6c9b150618837a4",
|
||||
"source_file": "lessons/sketchnotes/LICENSE.md",
|
||||
"language_code": "da",
|
||||
"failure_date": "2026-07-08T18:03:38+00:00",
|
||||
"status": "failed",
|
||||
"error_type": "TranslationIncompleteError",
|
||||
"error_message": "Markdown translation remained incomplete for chunk 1.1.2 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-28T16:06:55+00:00",
|
||||
|
|
@ -54,8 +73,8 @@
|
|||
"language_code": "da"
|
||||
},
|
||||
"examples/README.md": {
|
||||
"original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7",
|
||||
"translation_date": "2025-10-03T11:31:26+00:00",
|
||||
"original_hash": "7883d52c2e2a221e0b07a7b112a149b9",
|
||||
"translation_date": "2026-07-08T17:58:12+00:00",
|
||||
"source_file": "examples/README.md",
|
||||
"language_code": "da"
|
||||
},
|
||||
|
|
@ -66,8 +85,8 @@
|
|||
"language_code": "da"
|
||||
},
|
||||
"lessons/0-course-setup/how-to-run.md": {
|
||||
"original_hash": "a4717bd9103b9f6cd84d534b83534689",
|
||||
"translation_date": "2026-01-16T02:27:08+00:00",
|
||||
"original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1",
|
||||
"translation_date": "2026-07-08T17:58:31+00:00",
|
||||
"source_file": "lessons/0-course-setup/how-to-run.md",
|
||||
"language_code": "da"
|
||||
},
|
||||
|
|
@ -191,6 +210,12 @@
|
|||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md",
|
||||
"language_code": "da"
|
||||
},
|
||||
"lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": {
|
||||
"original_hash": "99b816b6a4957ef4100cee4c4221dff9",
|
||||
"translation_date": "2026-07-08T17:46:09+00:00",
|
||||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb",
|
||||
"language_code": "da"
|
||||
},
|
||||
"lessons/4-ComputerVision/08-TransferLearning/lab/README.md": {
|
||||
"original_hash": "7765935c35fcee69b9fe2d0cfd6963e2",
|
||||
"translation_date": "2025-08-28T15:17:52+00:00",
|
||||
|
|
@ -330,8 +355,8 @@
|
|||
"language_code": "da"
|
||||
},
|
||||
"lessons/5-NLP/README.md": {
|
||||
"original_hash": "8ef02a9318257ea140ed3ed74442096d",
|
||||
"translation_date": "2025-08-28T15:51:00+00:00",
|
||||
"original_hash": "038df6f1a73e49f6430740da083bfd6d",
|
||||
"translation_date": "2026-07-08T17:58:55+00:00",
|
||||
"source_file": "lessons/5-NLP/README.md",
|
||||
"language_code": "da"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -0,0 +1,29 @@
|
|||
# Bidrage til AI-For-Beginners
|
||||
|
||||
Tak for din interesse i at bidrage til AI-For-Beginners! Vi byder velkommen til oversættelser, rettelser af lektioner og formateringskorrektioner.
|
||||
|
||||
## Microsoft Contributor License Agreement (CLA)
|
||||
|
||||
Dette projekt byder på bidrag og forslag velkommen. De fleste bidrag kræver, at du accepterer en Contributor License Agreement (CLA), som erklærer, at du har ret til, og faktisk gør, at give os rettighederne til at bruge dit bidrag. For detaljer, besøg [https://cla.microsoft.com](https://cla.microsoft.com).
|
||||
|
||||
Når du indsender en pull request, vil en CLA-bot automatisk afgøre, om du skal levere en CLA og dekorere PR'en passende (f.eks. label, kommentar). Følg blot instruktionerne, som botten giver. Du skal kun gøre dette én gang for alle repositories, der bruger vores CLA.
|
||||
|
||||
## Sådan bidrager du
|
||||
|
||||
### 1. Rettelse af tastefejl / kodefejl
|
||||
Hvis du finder en tastefejl eller fejl i en hvilken som helst Jupyter-notebook eller lektion markdown-fil:
|
||||
1. Fork repoet.
|
||||
2. Ret tastefejlen eller den døde link.
|
||||
3. Indsend en Pull Request med en klar beskrivelse af rettelsen.
|
||||
|
||||
### 2. Indsendelse af oversættelser
|
||||
Vi byder oversættelser af lektionerne til andre sprog velkommen! Placer venligst oversættelser i `translations/` mappen ved at bruge de eksisterende mappenavne der (for eksempel `translations/es/`, `translations/pt-BR/`, `translations/zh-CN/`).
|
||||
|
||||
For flere detaljer, se [etc/CONTRIBUTING.md](etc/CONTRIBUTING.md).
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**Ansvarsfraskrivelse**:
|
||||
Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os intet ansvar for misforståelser eller fejltolkninger, der opstår som følge af brugen af denne oversættelse.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -1,27 +1,27 @@
|
|||
# Begynder-venlige AI-eksempler
|
||||
|
||||
Velkommen! Denne mappe indeholder enkle, selvstændige eksempler, der hjælper dig med at komme i gang med AI og maskinlæring. Hvert eksempel er designet til at være begyndervenligt med detaljerede kommentarer og trin-for-trin forklaringer.
|
||||
Velkommen! Dette bibliotek indeholder simple, selvstændige eksempler til at hjælpe dig i gang med AI og maskinlæring. Hvert eksempel er designet til at være begynder-venligt med detaljerede kommentarer og trin-for-trin forklaringer.
|
||||
|
||||
## 📚 Oversigt over eksempler
|
||||
|
||||
| Eksempel | Beskrivelse | Sværhedsgrad | Forudsætninger |
|
||||
|----------|-------------|--------------|----------------|
|
||||
| [Hello AI World](../../../examples/01-hello-ai-world.py) | Dit første AI-program - simpel mønstergenkendelse | ⭐ Begynder | Grundlæggende Python |
|
||||
| [Simple Neural Network](../../../examples/02-simple-neural-network.py) | Byg et neuralt netværk fra bunden | ⭐⭐ Begynder+ | Python, basal matematik |
|
||||
| [Image Classifier](./03-image-classifier.ipynb) | Klassificér billeder med en forudtrænet model | ⭐⭐ Begynder+ | Python, numpy |
|
||||
| [Text Sentiment](../../../examples/04-text-sentiment.py) | Analyser tekststemning (positiv/negativ) | ⭐⭐ Begynder+ | Python |
|
||||
|---------|-------------|------------|---------------|
|
||||
| [Hello AI World](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/01-hello-ai-world.py) | Dit første AI-program - enkel mønstergenkendelse | ⭐ Begynder | Grundlæggende Python |
|
||||
| [Simple Neural Network](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/02-simple-neural-network.py) | Byg et neuralt netværk fra bunden | ⭐⭐ Begynder+ | Python, grundlæggende matematik |
|
||||
| [Image Classifier](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/03-image-classifier.ipynb) | Klassificer billeder med en foruddannet model | ⭐⭐ Begynder+ | Python, numpy |
|
||||
| [Text Sentiment](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/04-text-sentiment.py) | Analyser tekstfølelse (positiv/negativ) | ⭐⭐ Begynder+ | Python |
|
||||
|
||||
## 🚀 Kom godt i gang
|
||||
## 🚀 Kom i gang
|
||||
|
||||
### Forudsætninger
|
||||
|
||||
Sørg for, at du har Python installeret (3.8 eller nyere anbefales). Installer de nødvendige pakker:
|
||||
Sørg for, at du har Python installeret (version 3.8 eller nyere anbefales). Installer nødvendige pakker:
|
||||
|
||||
```bash
|
||||
# For Python scripts
|
||||
# Til Python-scripts
|
||||
pip install numpy
|
||||
|
||||
# For Jupyter notebooks (image classifier)
|
||||
# Til Jupyter-notebooks (billedklassifikator)
|
||||
pip install jupyter numpy pillow tensorflow
|
||||
```
|
||||
|
||||
|
|
@ -32,33 +32,33 @@ conda env create --name ai4beg --file ../environment.yml
|
|||
conda activate ai4beg
|
||||
```
|
||||
|
||||
### Sådan kører du eksemplerne
|
||||
### Kør eksemplerne
|
||||
|
||||
**For Python-scripts (.py-filer):**
|
||||
**For Python-scripts (.py filer):**
|
||||
```bash
|
||||
python 01-hello-ai-world.py
|
||||
```
|
||||
|
||||
**For Jupyter-notebooks (.ipynb-filer):**
|
||||
**For Jupyter-notebooks (.ipynb filer):**
|
||||
```bash
|
||||
jupyter notebook 03-image-classifier.ipynb
|
||||
```
|
||||
|
||||
## 📖 Læringssti
|
||||
## 📖 Læringsvej
|
||||
|
||||
Vi anbefaler at følge eksemplerne i rækkefølge:
|
||||
Vi anbefaler at følge eksemplerne i denne rækkefølge:
|
||||
|
||||
1. **Start med "Hello AI World"** - Lær det grundlæggende om mønstergenkendelse
|
||||
2. **Byg et simpelt neuralt netværk** - Forstå, hvordan neurale netværk fungerer
|
||||
3. **Prøv Image Classifier** - Se AI i aktion med rigtige billeder
|
||||
4. **Analyser tekststemning** - Udforsk naturlig sprogbehandling
|
||||
3. **Prøv billedklassifikatoren** - Se AI i aktion med rigtige billeder
|
||||
4. **Analyser tekstfølelse** - Udforsk naturlig sprogbehandling
|
||||
|
||||
## 💡 Tips til begyndere
|
||||
|
||||
- **Læs kodekommentarerne grundigt** - De forklarer, hvad hver linje gør
|
||||
- **Eksperimentér!** - Prøv at ændre værdier og se, hvad der sker
|
||||
- **Vær ikke bekymret for at forstå alt** - Læring tager tid
|
||||
- **Stil spørgsmål** - Brug [diskussionsforummet](https://github.com/microsoft/AI-For-Beginners/discussions)
|
||||
- **Eksperimenter!** - Prøv at ændre værdier og se, hvad der sker
|
||||
- **Bekymr dig ikke om at forstå alt med det samme** - Læring tager tid
|
||||
- **Stil spørgsmål** - Brug [diskussionsbordet](https://github.com/microsoft/AI-For-Beginners/discussions)
|
||||
|
||||
## 🔗 Næste skridt
|
||||
|
||||
|
|
@ -70,16 +70,18 @@ Efter at have gennemført disse eksempler, kan du udforske hele pensum:
|
|||
|
||||
## 🤝 Bidrag
|
||||
|
||||
Fandt du disse eksempler nyttige? Hjælp os med at forbedre dem:
|
||||
- Rapportér problemer eller foreslå forbedringer
|
||||
Synes du, disse eksempler er hjælpsomme? Hjælp os med at forbedre dem:
|
||||
- Rapporter problemer eller foreslå forbedringer
|
||||
- Tilføj flere eksempler for begyndere
|
||||
- Forbedr dokumentation og kommentarer
|
||||
|
||||
---
|
||||
|
||||
*Husk: Hver ekspert har engang været en begynder. God læring! 🎓*
|
||||
*Husk: Enhver ekspert har engang været begynder. God læring! 🎓*
|
||||
|
||||
---
|
||||
|
||||
**Ansvarsfraskrivelse**:
|
||||
Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal det bemærkes, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os intet ansvar for misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**Ansvarsfraskrivelse**:
|
||||
Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os intet ansvar for misforståelser eller fejltolkninger, der opstår som følge af brugen af denne oversættelse.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -1,12 +1,12 @@
|
|||
# Sådan kører du koden
|
||||
# Hvordan man kører koden
|
||||
|
||||
Dette kursusindhold indeholder mange eksekverbare eksempler og laboratorier, som du vil ønske at køre. For at kunne gøre dette, har du brug for muligheden for at eksekvere Python-kode i Jupyter Notebooks, som leveres som en del af dette kursusindhold. Du har flere muligheder for at køre koden:
|
||||
Dette pensum indeholder mange eksekverbare eksempler og laboratorier, som du vil få brug for at køre. For at gøre dette, skal du kunne eksekvere Python-kode i Jupyter Notebooks, som er en del af dette pensum. Du har flere muligheder for at køre koden:
|
||||
|
||||
## Kør lokalt på din computer
|
||||
|
||||
For at køre koden lokalt på din computer, er der brug for en Python-installation. En anbefaling er at installere **[miniconda](https://conda.io/en/latest/miniconda.html)** - det er en forholdsvis letvægtsinstallation, der understøtter `conda` pakkestyringsværktøjet til forskellige Python **virtuelle miljøer**.
|
||||
For at køre koden lokalt på din computer, er en Python-installation nødvendig. En anbefaling er at installere **[miniconda](https://conda.io/en/latest/miniconda.html)** - det er en relativt let installation, der understøtter `conda` pakkehåndteringen til forskellige Python **virtuelle miljøer**.
|
||||
|
||||
Efter du har installeret miniconda, klon da repositoryet og opret et virtuelt miljø, der skal bruges til dette kursus:
|
||||
Efter du har installeret miniconda, klon repositoriet og opret et virtuelt miljø til brug for dette kursus:
|
||||
|
||||
```bash
|
||||
git clone http://github.com/microsoft/ai-for-beginners
|
||||
|
|
@ -15,19 +15,19 @@ conda env create --name ai4beg --file .devcontainer/environment.yml
|
|||
conda activate ai4beg
|
||||
```
|
||||
|
||||
### Brug af Visual Studio Code med Python Extension
|
||||
### Brug af Visual Studio Code med Python-udvidelsen
|
||||
|
||||
Dette kursusindhold bruges bedst ved at åbne det i [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) med [Python Extension](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste).
|
||||
Dette pensum bruges bedst ved at åbne det i [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) med [Python-udvidelsen](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste).
|
||||
|
||||
> **Note**: Når du har klonet og åbnet mappen i VS Code, vil det automatisk foreslå dig at installere Python-udvidelser. Du skal også installere miniconda som beskrevet ovenfor.
|
||||
> **Note**: Når du har klonet og åbnet mappen i VS Code, vil den automatisk foreslå at installere Python-udvidelser. Du skal også installere miniconda som beskrevet ovenfor.
|
||||
|
||||
> **Note**: Hvis VS Code foreslår dig at genåbne repositoryet i en container, bør du afslå dette for at bruge den lokale Python-installation.
|
||||
> **Note**: Hvis VS Code foreslår at genåbne repositoriet i en container, skal du afslå dette for at bruge den lokale Python-installation.
|
||||
|
||||
### Brug af Jupyter i browseren
|
||||
|
||||
Du kan også bruge et Jupyter-miljø fra browseren på din egen computer. Både klassisk Jupyter og JupyterHub tilbyder et praktisk udviklingsmiljø med autofuldendelse, kodefremhævning osv.
|
||||
Du kan også bruge et Jupyter-miljø fra browseren på din egen computer. Både klassisk Jupyter og JupyterHub giver et bekvemt udviklingsmiljø med autoudfyldning, kodehighlighting osv.
|
||||
|
||||
For at starte Jupyter lokalt, gå til kursusmappen, og eksekver:
|
||||
For at starte Jupyter lokalt, gå til kursusmappen, og kør:
|
||||
|
||||
```bash
|
||||
jupyter notebook
|
||||
|
|
@ -36,36 +36,36 @@ eller
|
|||
```bash
|
||||
jupyterhub
|
||||
```
|
||||
Du kan derefter navigere til en hvilken som helst af `.ipynb` filerne, åbne dem og begynde at arbejde.
|
||||
Du kan herefter navigere til enhver `.ipynb` fil, åbne den og begynde at arbejde.
|
||||
|
||||
### Kørsel i container
|
||||
|
||||
Et alternativ til Python-installation ville være at køre koden i en container. Da vores repository leverer en særlig `.devcontainer` mappe, der instruerer hvordan man bygger en container til dette repo, tilbyder VS Code muligheden for at genåbne koden i en container. Dette kræver installation af Docker og er også mere komplekst, så vi anbefaler dette til mere erfarne brugere.
|
||||
Et alternativ til Python-installation ville være at køre koden i en container. Da vores repo leverer en speciel `.devcontainer` mappe, der vejleder, hvordan man bygger en container til dette repo, tilbyder VS Code muligheden for at genåbne koden inde i en container. Dette kræver Docker-installation og er også mere komplekst, så vi anbefaler dette til mere erfarne brugere.
|
||||
|
||||
## Kørsel i skyen
|
||||
|
||||
Hvis du ikke ønsker at installere Python lokalt, og har adgang til nogle skyeressourcer – er et godt alternativ at køre koden i skyen. Der er flere måder, du kan gøre dette på:
|
||||
Hvis du ikke ønsker at installere Python lokalt, og har adgang til nogle skyressourcer - er et godt alternativ at køre koden i skyen. Der er flere måder du kan gøre det på:
|
||||
|
||||
* Brug af **[GitHub Codespaces](https://github.com/features/codespaces)**, som er et virtuelt miljø oprettet for dig på GitHub, tilgængeligt gennem en VS Code browsergrænseflade. Hvis du har adgang til Codespaces, kan du blot klikke på **Code** knappen i repositoriet, starte et codespace og komme i gang med det samme.
|
||||
* Brug af **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) tilbyder gratis beregningsressourcer i skyen til folk som dig, der vil teste noget kode på GitHub. Der er en knap på forsiden til at åbne repositoryet i Binder – dette vil hurtigt føre dig til binder-sitet, som vil bygge en underliggende container og starte en Jupyter webgrænseflade for dig glidende.
|
||||
* Brug af **[GitHub Codespaces](https://github.com/features/codespaces)**, som er et virtuelt miljø oprettet til dig på GitHub, tilgængeligt gennem et VS Code browserinterface. Hvis du har adgang til Codespaces, kan du bare klikke på **Code** knappen i repoet, starte en codespace, og være i gang på ingen tid.
|
||||
* Brug af **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) tilbyder gratis computerressourcer leveret i skyen til folk som dig, så man kan teste noget kode fra GitHub. Der er en knap på forside, som åbner repositoriet i Binder - dette fører dig hurtigt til bindersiden, som bygger en underliggende container og starter et Jupyter webinterface for dig problemfrit.
|
||||
|
||||
> **Note**: For at forhindre misbrug har Binder adgang til nogle webressourcer blokeret. Dette kan forhindre noget kode i at fungere, som henter modeller og/eller datasæt fra det offentlige Internet. Du skal måske finde nogle alternative løsninger. Derudover er de beregningsressourcer, som Binder tilbyder, ret simple, så træning vil gå langsomt, især i de senere, mere komplekse lektioner.
|
||||
> **Note**: For at forhindre misbrug, har Binder blokeret adgang til nogle webressourcer. Dette kan forhindre, at noget kode virker, som henter modeller og/eller datasæt fra det offentlige internet. Du kan blive nødt til at finde nogle løsninger. Derudover er de computerressourcer, som Binder leverer, ret grundlæggende, så træning vil være langsom, især i de senere, mere komplekse lektioner.
|
||||
|
||||
## Kørsel i skyen med GPU
|
||||
|
||||
Nogle af de senere lektioner i dette kursusindhold vil have stor gavn af GPU-understøttelse. Modeltræning, for eksempel, kan være smertefuldt langsomt ellers. Der er et par muligheder, du kan følge, især hvis du har adgang til skyen enten gennem [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste), eller gennem din institution:
|
||||
Nogle af de senere lektioner i dette pensum vil have stor fordel af GPU-understøttelse. Modeltræning kan for eksempel være smertefuldt langsom ellers. Der er nogle muligheder, som du kan følge, især hvis du har adgang til skyen gennem [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste), eller via din institution:
|
||||
|
||||
* Opret en [Data Science Virtual Machine](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) og forbind til den gennem Jupyter. Du kan så klone repoet direkte på maskinen og begynde at lære. NC-serie VM’er har GPU-understøttelse.
|
||||
* Opret en [Data Science Virtual Machine](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) og forbind til den gennem Jupyter. Du kan så klone repoet direkte på maskinen og begynde at lære. NC-seriens VM'er har GPU-understøttelse.
|
||||
|
||||
> **Note**: Nogle abonnementer, inklusiv Azure for Students, tilbyder ikke GPU-understøttelse som standard. Du skal muligvis anmode om ekstra GPU-kerner via en teknisk supportsag.
|
||||
> **Note**: Nogle abonnementer, inklusive Azure for Students, tilbyder ikke GPU-understøttelse som standard. Du skal muligvis anmode om ekstra GPU-kerner via en teknisk supportanmodning.
|
||||
|
||||
* Opret et [Azure Machine Learning Workspace](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) og brug dernæst Notebook-funktionen. [Denne video](https://azure-for-academics.github.io/quickstart/azureml-papers/) viser, hvordan man kloner et repository ind i Azure ML notebook og begynder at bruge det.
|
||||
* Opret et [Azure Machine Learning Workspace](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) og brug derefter Notebook-funktionen dér. [Denne video](https://azure-for-academics.github.io/quickstart/azureml-papers/) viser, hvordan man kloner et repository ind i Azure ML notebook og begynder at bruge det.
|
||||
|
||||
Du kan også bruge Google Colab, som kommer med noget gratis GPU-understøttelse, og uploade Jupyter Notebooks der for at eksekvere dem én efter én.
|
||||
Du kan også bruge Google Colab, som har noget gratis GPU-understøttelse, og uploade Jupyter Notebooks der for at eksekvere dem én ad gangen.
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**Ansvarsfraskrivelse**:
|
||||
Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det oprindelige dokument på dets modersmål skal betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os ikke ansvar for misforståelser eller fejltolkninger, der opstår ved brug af denne oversættelse.
|
||||
**Ansvarsfraskrivelse**:
|
||||
Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os intet ansvar for misforståelser eller fejltolkninger, der opstår som følge af brugen af denne oversættelse.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -4,11 +4,11 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Forudtrænede modeller og transfer learning\n",
|
||||
"# Foruddannede modeller og transfer learning\n",
|
||||
"\n",
|
||||
"Træning af CNN'er kan tage meget tid, og der kræves en stor mængde data til denne opgave. Dog bruges en stor del af tiden på at lære de bedste lavniveaufiltre, som et netværk anvender til at udtrække mønstre fra billeder. Et naturligt spørgsmål opstår - kan vi bruge et neuralt netværk, der er trænet på ét datasæt, og tilpasse det til at klassificere forskellige billeder uden en fuld træningsproces?\n",
|
||||
"Træning af CNN’er kan tage meget tid, og der kræves mange data til den opgave. Dog bruges meget af tiden på at lære de bedste lavniveau-filtre, som et netværk bruger til at udtrække mønstre fra billeder. Et naturligt spørgsmål opstår – kan vi bruge et neuralt netværk, der er trænet på et datasæt, og tilpasse det til at klassificere forskellige billeder uden en fuld træningsproces?\n",
|
||||
"\n",
|
||||
"Denne tilgang kaldes **transfer learning**, fordi vi overfører noget viden fra én neuralt netværksmodel til en anden. I transfer learning starter vi typisk med en forudtrænet model, som er blevet trænet på et stort billeddatasæt, såsom **ImageNet**. Disse modeller kan allerede gøre et godt stykke arbejde med at udtrække forskellige funktioner fra generiske billeder, og i mange tilfælde kan det give gode resultater blot at bygge en klassifikator oven på de udtrukne funktioner.\n"
|
||||
"Denne tilgang kaldes **transfer learning**, fordi vi overfører noget viden fra én neural netværksmodel til en anden. I transfer learning starter vi typisk med en foruddannet model, som er blevet trænet på et stort billeddatasæt, såsom **ImageNet**. Disse modeller kan allerede gøre et godt stykke arbejde med at udtrække forskellige funktioner fra generiske billeder, og i mange tilfælde kan blot at bygge en klassifikator ovenpå disse udtrukne funktioner give et godt resultat.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -29,11 +29,11 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Katte vs. Hunde-datasæt\n",
|
||||
"## Katte vs. Hunde Datasæt\n",
|
||||
"\n",
|
||||
"I denne enhed vil vi løse et virkelighedsnært problem med at klassificere billeder af katte og hunde. Af denne grund vil vi bruge [Kaggle Cats vs. Dogs Dataset](https://www.kaggle.com/c/dogs-vs-cats), som også kan downloades [fra Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n",
|
||||
"I denne enhed vil vi løse et problem fra det virkelige liv med at klassificere billeder af katte og hunde. Af denne grund vil vi bruge [Kaggle Cats vs. Dogs Dataset](https://www.kaggle.com/c/dogs-vs-cats), som også kan downloades [fra Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n",
|
||||
"\n",
|
||||
"Lad os downloade dette datasæt og udpakke det i `data`-mappen (denne proces kan tage noget tid!):\n"
|
||||
"Lad os downloade dette datasæt og udpakke det i `data`-mappen (denne proces kan tage lidt tid!):\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -64,7 +64,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Desværre er der nogle korrupte billedfiler i datasættet. Vi skal hurtigt rense for at kontrollere for korrupte filer. For ikke at overbelaste denne tutorial har vi flyttet koden til at verificere datasættet ind i et modul.\n"
|
||||
"Desværre er der nogle beskadigede billedfiler i datasættet. Vi skal lave en hurtig oprydning for at kontrollere for beskadigede filer. For ikke at ødelægge denne tutorial har vi flyttet koden til at verificere datasættet ind i en modul.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -335,11 +335,11 @@
|
|||
"source": [
|
||||
"## Indlæsning af datasættet\n",
|
||||
"\n",
|
||||
"I tidligere eksempler indlæste vi datasæt, der er indbygget i Keras. Nu skal vi arbejde med vores eget datasæt, som vi skal indlæse fra en mappe med billeder.\n",
|
||||
"I tidligere eksempler har vi indlæst datasæt, der er indbygget i Keras. Nu skal vi håndtere vores eget datasæt, som vi skal indlæse fra en mappe med billeder.\n",
|
||||
"\n",
|
||||
"I virkeligheden kan størrelsen på billeddatasæt være ret stor, og man kan ikke regne med, at al data kan passe ind i hukommelsen. Derfor repræsenteres datasæt ofte som **generatorer**, der kan returnere data i minibatches, der er egnede til træning.\n",
|
||||
"I virkeligheden kan billeddatasæt være temmelig store, og man kan ikke regne med, at alle data kan være i hukommelsen på én gang. Derfor repræsenteres datasæt ofte som **generatorer**, der kan returnere data i minibatcher, som er velegnede til træning.\n",
|
||||
"\n",
|
||||
"For at håndtere billedklassifikation inkluderer Keras en speciel funktion `image_dataset_from_directory`, som kan indlæse billeder fra undermapper, der svarer til forskellige klasser. Denne funktion tager også hånd om skalering af billeder, og den kan desuden opdele datasættet i trænings- og testundersæt:\n"
|
||||
"For at håndtere billedklassifikation inkluderer Keras en speciel funktion `image_dataset_from_directory`, der kan indlæse billeder fra undermapper, som svarer til forskellige klasser. Denne funktion tager sig også af at skalere billederne, og den kan også opdele datasættet i trænings- og testdelmængder:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -383,9 +383,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Det er vigtigt at angive den samme `seed`-værdi for begge kald, da det påvirker opdelingen af billeder mellem trænings- og testdatasættet.\n",
|
||||
"Det er vigtigt at sætte den samme `seed` værdi for begge kald, fordi det påvirker opdelingen af billeder mellem trænings- og testdatasættet.\n",
|
||||
"\n",
|
||||
"Datasættet henter automatisk klassenavne fra mapperne, og du kan få adgang til dem, hvis nødvendigt, ved at kalde:\n"
|
||||
"Datasættet henter automatisk klassenavne fra mapper, og du kan tilgå dem, hvis nødvendigt, ved at kalde:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -412,7 +412,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Datasæt, som vi har opnået, kan direkte sendes til `fit`-funktionen for at træne modellen. De indeholder både tilsvarende billeder og labels, som kan loopes over ved hjælp af følgende konstruktion:\n"
|
||||
"Datasæt, som vi har indhentet, kan direkte videregives til `fit`-funktionen for at træne modellen. De indeholder både tilsvarende billeder og etiketter, som kan gennemløbes ved hjælp af følgende konstruktion:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -453,16 +453,16 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"> **Bemærk**: Alle billeder i datasættet er repræsenteret som flydende punkt-tensorer med rækkevidde 0-255. Før vi sender dem til neurale netværk, skal vi skalere disse værdier til rækkevidden 0-1. Når vi plotter billeder, skal vi enten gøre det samme eller konvertere værdierne til typen `int` (hvilket vi gør i koden ovenfor) for at vise `matplotlib`, at vi ønsker at plotte det originale, uskalede billede.\n"
|
||||
"> **Bemærk**: Alle billeder i datasættet er repræsenteret som flydende punkt tensorer med intervallet 0-255. Før vi sender dem til det neurale netværk, skal vi skalere disse værdier til intervallet 0-1. Når vi plottet billeder, skal vi enten gøre det samme eller konvertere værdier til `int` typen (hvilket vi gør i koden ovenfor), for at vise `matplotlib`, at vi ønsker at plotte det originale uskalerede billede.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Forudtrænede modeller\n",
|
||||
"## Fortrænede modeller\n",
|
||||
"\n",
|
||||
"Til mange opgaver inden for billedklassifikation kan man finde forudtrænede neurale netværksmodeller. Mange af disse modeller er tilgængelige inden for `keras.applications`-navneområdet, og endnu flere modeller kan findes på internettet. Lad os se, hvordan den simpleste VGG-16-model kan indlæses og bruges:\n"
|
||||
"For mange billedklassificeringsopgaver kan man finde fortrænede neurale netværksmodeller. Mange af disse modeller er tilgængelige inde i `keras.applications`-navnerummet, og endnu flere modeller kan findes på internettet. Lad os se, hvordan den simpleste VGG-16-model kan indlæses og bruges:\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,17 +520,17 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Der er et par vigtige ting at bemærke her: \n",
|
||||
"* Før man sender en input til et forudtrænet netværk, skal det forbehandles på en bestemt måde. Dette gøres ved at kalde den tilsvarende `preprocess_input`-funktion, som modtager et batch af billeder og returnerer deres forarbejdede form. I tilfældet med VGG-16 bliver billederne normaliseret, og en foruddefineret gennemsnitsværdi for hver kanal bliver trukket fra. Dette skyldes, at VGG-16 oprindeligt blev trænet med denne forbehandling. \n",
|
||||
"* Det neurale netværk anvendes på input-batchen, og som resultat modtager vi et batch af 1000-elementers tensorer, der viser sandsynligheden for hver klasse. Vi kan finde nummeret på den mest sandsynlige klasse ved at kalde `argmax` på denne tensor. \n",
|
||||
"* Det opnåede resultat er et [nummer på en `ImageNet`-klasse](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). For at give mening til dette resultat kan vi også bruge funktionen `decode_predictions`, som returnerer de øverste n klasser sammen med deres navne. \n"
|
||||
"Der er et par vigtige ting her:\n",
|
||||
"* Før man sender en input til et forudtrænet netværk, skal det forbehandles på en bestemt måde. Dette gøres ved at kalde den tilsvarende `preprocess_input` funktion, som modtager en batch af billeder, og returnerer deres behandlede form. I tilfælde af VGG-16 normaliseres billederne, og en foruddefineret gennemsnitsværdi for hver kanal fratrækkes. Det skyldes, at VGG-16 oprindeligt blev trænet med denne forbehandling.\n",
|
||||
"* Det neurale netværk anvendes på input-batchen, og vi modtager som resultat en batch af 1000-element tensorer, som viser sandsynligheden for hver klasse. Vi kan finde det mest sandsynlige klassenummer ved at kalde `argmax` på denne tensor.\n",
|
||||
"* Det opnåede resultat er et [nummer for en `ImageNet`-klasse](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). For at forstå dette resultat bedre, kan vi også bruge `decode_predictions` funktionen, som returnerer de top n klasser sammen med deres navne.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Lad os også se arkitekturen af VGG-16-netværket:\n"
|
||||
"Lad os også se arkitekturen af VGG-16 netværket:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -599,7 +609,7 @@
|
|||
"source": [
|
||||
"## GPU-beregninger\n",
|
||||
"\n",
|
||||
"Dybe neurale netværk, såsom VGG-16 og andre mere moderne arkitekturer, kræver en hel del regnekraft for at køre. Det giver mening at bruge GPU-acceleration, hvis det er tilgængeligt. Heldigvis optimerer Keras automatisk beregningerne på GPU'en, hvis den er tilgængelig. Vi kan kontrollere, om Tensorflow er i stand til at bruge GPU'en ved hjælp af følgende kode:\n"
|
||||
"Dybe neurale netværk, såsom VGG-16 og andre mere moderne arkitekturer, kræver ret meget beregningskraft for at køre. Det giver god mening at bruge GPU-acceleration, hvis det er tilgængeligt. Heldigvis fremskynder Keras automatisk beregningerne på GPU'en, hvis den er tilgængelig. Vi kan tjekke, om Tensorflow kan bruge GPU med følgende kode:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -626,9 +636,10 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n",
|
||||
"## Udtrækning af VGG-funktioner\n",
|
||||
"\n",
|
||||
"Hvis vi ønsker at bruge VGG-16 til at udtrække funktioner fra vores billeder, skal vi bruge modellen uden de sidste klassifikationslag. Vi kan oprette en VGG-16 model uden de øverste lag ved hjælp af denne kode:\n"
|
||||
"Hvis vi vil bruge VGG-16 til at udtrække funktioner fra vores billeder, har vi brug for modellen uden de afsluttende klassifikationslag. Vi kan instantiere VGG-16-modellen uden top lag ved hjælp af denne kode:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -680,9 +691,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Dimensionen af feature-tensoren er 7x7x512, men for at visualisere den var vi nødt til at omforme den til en 2D-form.\n",
|
||||
"Dimensionen af feature-tensoren er 7x7x512, men for at visualisere den var vi nødt til at omforme den til 2D-form.\n",
|
||||
"\n",
|
||||
"Lad os nu prøve at se, om disse features kan bruges til at klassificere billeder. Vi tager manuelt en del af billederne (50 minibatches i vores tilfælde) og forudberegner deres feature-vektorer. Vi kan bruge Tensorflow **dataset** API til dette. `map`-funktionen tager et datasæt og anvender en given lambda-funktion for at transformere det. Vi bruger denne mekanisme til at konstruere nye datasæt, `ds_features_train` og `ds_features_test`, som indeholder VGG-ekstraherede features i stedet for de originale billeder.\n"
|
||||
"Lad os nu prøve at se, om disse features kan bruges til at klassificere billeder. Lad os manuelt tage en delmængde af billeder (50 minibatches i vores tilfælde) og forudberegne deres feature-vektorer. Vi kan bruge Tensorflow **dataset** API til det. `map`-funktionen tager et dataset og anvender en given lambda-funktion til at transformere det. Vi bruger denne mekanisme til at konstruere nye datasæt, `ds_features_train` og `ds_features_test`, som indeholder VGG-ekstraherede features i stedet for de originale billeder.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -712,9 +723,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Vi brugte konstruktionen `.take(50)` for at begrænse datasættets størrelse og dermed fremskynde vores demonstration. Du kan naturligvis udføre dette eksperiment på det fulde datasæt.\n",
|
||||
"Vi brugte konstruktionen `.take(50)` til at begrænse datasættets størrelse for at fremskynde vores demonstration. Du kan selvfølgelig udføre dette eksperiment på det fulde datasæt.\n",
|
||||
"\n",
|
||||
"Nu hvor vi har et datasæt med udtrukne funktioner, kan vi træne en simpel tæt klassifikator til at skelne mellem katte og hunde. Dette netværk vil tage en feature-vektor med formen (7,7,512) og producere en output, der enten svarer til en hund eller en kat. Da det er en binær klassifikation, bruger vi aktiveringsfunktionen `sigmoid` og tabet `binary_crossentropy`.\n"
|
||||
"Nu hvor vi har et datasæt med udtrukne features, kan vi træne en simpel tæt klassifikator til at skelne mellem katte og hunde. Dette netværk tager en feature-vektor af formen (7,7,512) og producerer et output, der svarer til enten en hund eller en kat. Fordi det er en binær klassifikation, bruger vi `sigmoid` aktiveringsfunktion og `binary_crossentropy` tab.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -743,13 +754,13 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Resultatet er fantastisk, vi kan skelne mellem en kat og en hund med næsten 95% sandsynlighed! Dog har vi kun testet denne tilgang på et udsnit af alle billeder, da manuel feature-ekstraktion ser ud til at tage meget tid.\n",
|
||||
"Resultatet er fremragende, vi kan skelne mellem en kat og en hund med næsten 95% sandsynlighed! Dog har vi kun testet denne tilgang på et delmængde af alle billeder, fordi manuel feature-ekstraktion ser ud til at tage meget tid.\n",
|
||||
"\n",
|
||||
"## Transfer learning ved brug af én VGG-netværk\n",
|
||||
"## Transfer learning ved brug af et VGG-netværk\n",
|
||||
"\n",
|
||||
"Vi kan også undgå manuelt at forudberegne funktionerne ved at bruge det originale VGG-16 netværk som helhed under træning, ved at tilføje en feature-ekstraktor til vores netværk som første lag.\n",
|
||||
"Vi kan også undgå manuelt at forberegne features ved at bruge det oprindelige VGG-16 netværk som helhed under træningen, ved at tilføje feature-ekstraktor til vores netværk som et første lag.\n",
|
||||
"\n",
|
||||
"Det smukke ved Keras-arkitekturen er, at VGG-16 modellen, som vi har defineret ovenfor, også kan bruges som et lag i et andet neuralt netværk! Vi skal blot konstruere et netværk med en tæt classifier ovenpå, og derefter træne hele netværket ved hjælp af backpropagation.\n"
|
||||
"Skønheden ved Keras' arkitektur er, at VGG-16 modellen, som vi har defineret ovenfor, også kan bruges som et lag i et andet neuralt netværk! Vi skal bare konstruere et netværk med en tæt klassifikator ovenpå, og så træne hele netværket ved hjælp af backpropagation.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -793,13 +804,13 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Denne model ligner et end-to-end klassifikationsnetværk, som tager et billede og returnerer klassen. Det vanskelige er dog, at vi ønsker, at VGG16 skal fungere som en feature extractor og ikke blive gen-trænet. Derfor skal vi **fryse vægtene i den konvolutionelle feature extractor**. Vi kan få adgang til det første lag i netværket ved at kalde `model.layers[0]`, og vi skal blot sætte egenskaben `trainable` til `False`.\n",
|
||||
"Denne model ligner et ende-til-ende klassifikationsnetværk, som tager et billede og returnerer klassen. Det svære er dog, at vi ønsker, at VGG16 skal fungere som en feature-udtrækker, og ikke genuddannes. Derfor skal vi **fryse vægtene i den konvolutionelle feature-udtrækker**. Vi kan få adgang til det første lag i netværket ved at kalde `model.layers[0]`, og vi skal blot sætte `trainable`-egenskaben til `False`.\n",
|
||||
"\n",
|
||||
"> **Note**: Det er nødvendigt at fryse vægtene i feature extractoren, fordi et ellers utrænet klassifikationslag kan ødelægge de oprindelige fortrænede vægte i den konvolutionelle extractor.\n",
|
||||
"> **Bemærk**: Frysing af feature-udtrækkerens vægte er nødvendigt, fordi ellers kan det ikke-trænede klassifikationslag ødelægge de oprindelige foruddannede vægte i den konvolutionelle udtrækker.\n",
|
||||
"\n",
|
||||
"Du kan bemærke, at selvom det samlede antal parametre i vores netværk er omkring 15 millioner, træner vi kun 25.000 parametre. Alle andre parametre i de øverste konvolutionelle filtre er fortrænede. Det er godt, fordi vi kan finjustere et mindre antal parametre med et mindre antal eksempler.\n",
|
||||
"Du kan bemærke, at mens det totale antal parametre i vores netværk er omkring 15 millioner, træner vi kun 25k parametre. Alle andre parametre i topniveau konvolutionelle filtre er foruddannet. Det er godt, fordi vi er i stand til at finjustere et mindre antal parametre med et mindre antal eksempler.\n",
|
||||
"\n",
|
||||
"Vi vil nu træne vores netværk og se, hvor gode resultater vi kan opnå. Forvent en ret lang køretid, og vær ikke bekymret, hvis det ser ud til, at udførelsen er frosset i et stykke tid.\n"
|
||||
"Vi vil nu træne vores netværk og se, hvor godt vi kan blive. Forvent en ret lang køretid, og vær ikke bekymret, hvis udførelsen virker frosset i et stykke tid.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -824,11 +835,11 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Det ser ud til, at vi har opnået en rimelig præcis klassificering af katte vs. hunde!\n",
|
||||
"Det ser ud til, at vi har opnået en rimelig præcis katte- vs. hunde-klassifikator! \n",
|
||||
"\n",
|
||||
"## Gemme og indlæse modellen\n",
|
||||
"\n",
|
||||
"Når vi har trænet modellen, kan vi gemme modelarkitekturen og de trænede vægte i en fil til fremtidig brug:\n"
|
||||
"Når vi har trænet modellen, kan vi gemme modelarkitektur og trænede vægte til en fil til fremtidig brug:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -852,7 +863,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Vi kan derefter indlæse modellen fra filen når som helst. Du kan finde det nyttigt, hvis det næste eksperiment ødelægger modellen - du behøver ikke at starte forfra.\n"
|
||||
"Vi kan så indlæse modellen fra fil når som helst. Det kan være nyttigt, hvis det næste eksperiment ødelægger modellen – så behøver du ikke starte forfra.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -870,13 +881,13 @@
|
|||
"source": [
|
||||
"## Finjustering af transfer learning\n",
|
||||
"\n",
|
||||
"I det forrige afsnit har vi trænet det sidste klassifikationslag til at klassificere billeder i vores eget datasæt. Dog har vi ikke gen-trænet feature-udtrækkeren, og vores model har været afhængig af de features, som modellen har lært fra ImageNet-data. Hvis dine objekter visuelt adskiller sig fra almindelige ImageNet-billeder, kan denne kombination af features muligvis ikke fungere optimalt. Derfor giver det mening at begynde at træne de konvolutionelle lag også.\n",
|
||||
"I det foregående afsnit har vi trænet det sidste klassifikationslag til at klassificere billeder i vores eget datasæt. Vi gen-trænede dog ikke feature-ekstraktoren, og vores model byggede på de features, som modellen havde lært på ImageNet-data. Hvis dine objekter visuelt adskiller sig fra almindelige ImageNet-billeder, virker denne kombination af features måske ikke optimalt. Derfor giver det mening også at begynde at træne convolutional lag.\n",
|
||||
"\n",
|
||||
"For at gøre dette kan vi ophæve frysningsstatus for de konvolutionelle filterparametre, som vi tidligere har frosset.\n",
|
||||
"For at gøre det kan vi ophæve frysningen af de convolutional filterparametre, som vi tidligere har frosset. \n",
|
||||
"\n",
|
||||
"> **Note:** Det er vigtigt, at du først fryser parametrene og udfører flere trænings-epoker for at stabilisere vægtene i klassifikationslaget. Hvis du straks begynder at træne et end-to-end netværk med ikke-frosne parametre, er der stor sandsynlighed for, at store fejl vil ødelægge de forudtrænede vægte i de konvolutionelle lag.\n",
|
||||
"> **Note:** Det er vigtigt, at du først fryser parametrene og gennemfører flere trænings-epoker for at stabilisere vægtene i klassifikationslaget. Hvis du straks begynder at træne hele netværket med optøede parametre, risikerer du, at store fejl ødelægger de fortrænede vægte i convolutional lagene.\n",
|
||||
"\n",
|
||||
"Vores konvolutionelle VGG-16-model er placeret i det første lag og består af mange lag i sig selv. Vi kan tage et kig på dens struktur:\n"
|
||||
"Vores convolutional VGG-16-model er placeret inde i det første lag, og den består selv af mange lag. Lad os tage et kig på dens struktur: \n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -945,7 +956,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Vi kan ophæve frysningen af alle lag i den konvolutionelle base:\n"
|
||||
"Vi kan optø alle lag i den konvolutionsbaserede kerne:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -961,7 +972,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Men at fryse dem alle op på én gang er ikke den bedste idé. Vi kan først fryse kun nogle få af de sidste lag af konvolutioner op, fordi de indeholder højere niveau mønstre, der er relevante for vores billeder. For eksempel kan vi til at begynde med fryse alle lag undtagen de sidste 4:\n"
|
||||
"Det er dog ikke den bedste idé at optø dem alle på én gang. Vi kan først optø blot nogle få af de sidste lag af konvolutioner, fordi de indeholder højere niveau mønstre, som er relevante for vores billeder. For eksempel kan vi til at begynde med fryse alle lag undtagen de sidste 4: \n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1000,11 +1011,11 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Bemærk, at antallet af trænbare parametre er steget markant, men det er stadig omkring 50% af alle parametre.\n",
|
||||
"Bemærk, at antallet af trænbare parametre steg betydeligt, men det er stadig omkring 50 % af alle parametre.\n",
|
||||
"\n",
|
||||
"Efter at have låst op for træningen, kan vi køre et par flere trænings-epoker (i vores eksempel vil vi kun køre én). Du kan også vælge en lavere læringsrate for at minimere påvirkningen på de fortrænede vægte. Dog kan du, selv med en lav læringsrate, forvente, at nøjagtigheden falder i starten af træningen, indtil den til sidst når et lidt højere niveau end i tilfældet med faste vægte.\n",
|
||||
"Efter optøning kan vi lave et par flere trænings-epoker (i vores eksempel laver vi kun én). Du kan også vælge en lavere læringsrate for at minimere påvirkningen på de fortrænede vægte. Dog kan du, selv med lav læringsrate, forvente, at nøjagtigheden falder i starten af træningen, indtil den til sidst når et lidt højere niveau end i tilfælde af faste vægte.\n",
|
||||
"\n",
|
||||
"> **Bemærk:** Denne træning foregår meget langsommere, fordi vi skal propagere gradienter tilbage gennem mange lag i netværket!\n"
|
||||
"> **Bemærk:** Denne træning sker meget langsommere, fordi vi skal propagere gradienter tilbage gennem mange lag af netværket!\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1028,18 +1039,18 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Vi vil sandsynligvis opnå en højere træningsnøjagtighed, fordi vi bruger et mere kraftfuldt netværk med flere parametre, men valideringsnøjagtigheden vil ikke stige lige så meget.\n",
|
||||
"Vi vil sandsynligvis opnå en højere træningsnøjagtighed, fordi vi bruger et mere kraftfuldt netværk med flere parametre, men valideringsnøjagtigheden vil ikke stige lige så meget. \n",
|
||||
"\n",
|
||||
"Du er velkommen til at frigøre et par flere lag af netværket og træne videre for at se, om du kan opnå en højere nøjagtighed!\n"
|
||||
"Du er velkommen til at ophæve frysningen af et par flere lag i netværket og træne mere for at se, om du kan opnå en højere nøjagtighed! \n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Andre computervisionsmodeller\n",
|
||||
"## Andre computervisningsmodeller\n",
|
||||
"\n",
|
||||
"VGG-16 er en af de enkleste computervisionsarkitekturer. Keras tilbyder mange flere forudtrænede netværk. De mest anvendte blandt disse er **ResNet**-arkitekturer, udviklet af Microsoft, og **Inception** fra Google. For eksempel, lad os undersøge arkitekturen af den enkleste ResNet-50 model (ResNet er en familie af modeller med forskellig dybde, du kan prøve at eksperimentere med ResNet-152, hvis du vil se, hvordan en virkelig dyb model ser ud):\n"
|
||||
"VGG-16 er en af de simpleste computervisningsarkitekturer. Keras tilbyder mange flere fortrænede netværk. Blandt de mest brugte er **ResNet**-arkitekturer, udviklet af Microsoft, og **Inception** af Google. For eksempel, lad os udforske arkitekturen af den simpleste ResNet-50 model (ResNet er en familie af modeller med forskellig dybde, du kan prøve at eksperimentere med ResNet-152, hvis du vil se, hvordan en virkelig dyb model ser ud):\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1441,29 +1452,29 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Som du kan se, indeholder modellen de samme velkendte byggesten: konvolutionslag, poolinglag og en endelig tæt klassifikator. Vi kan bruge denne model på præcis samme måde, som vi har brugt VGG-16 til transfer learning. Du kan prøve at eksperimentere med koden ovenfor, ved at bruge forskellige ResNet-modeller som basemodel, og se hvordan nøjagtigheden ændrer sig.\n",
|
||||
"Som du kan se, indeholder modellen de samme velkendte byggesten: konvolutionslag, poolingslag og den endelige tætte klassifikator. Vi kan bruge denne model på præcis samme måde, som vi har brugt VGG-16 til transfer learning. Du kan prøve at eksperimentere med koden ovenfor ved at bruge forskellige ResNet-modeller som basismodellen og se, hvordan nøjagtigheden ændrer sig.\n",
|
||||
"\n",
|
||||
"## Batch Normalisering\n",
|
||||
"## Batch Normalization\n",
|
||||
"\n",
|
||||
"Dette netværk indeholder endnu en type lag: **Batch Normalisering**. Ideen med batch normalisering er at bringe værdier, der flyder gennem det neurale netværk, til det rette interval. Normalt fungerer neurale netværk bedst, når alle værdier er i intervallet [-1,1] eller [0,1], og det er derfor, vi skalerer/normaliserer vores inputdata tilsvarende. Men under træning af et dybt netværk kan det ske, at værdierne kommer betydeligt uden for dette interval, hvilket gør træningen problematisk. Batch normaliseringslaget beregner gennemsnit og standardafvigelse for alle værdier i den aktuelle minibatch og bruger dem til at normalisere signalet, før det sendes gennem et neuralt netværkslag. Dette forbedrer stabiliteten af dybe netværk markant.\n"
|
||||
"Dette netværk indeholder endnu en type lag: **Batch Normalization**. Ideen med batch normalisering er at bringe værdier, som flyder gennem det neurale netværk, til rette interval. Normalt fungerer neurale netværk bedst, når alle værdier er i intervallet [-1,1] eller [0,1], og det er grunden til, at vi skalerer/normaliserer vores inputdata tilsvarende. Dog kan det ske under træning af et dybt netværk, at værdier kommer betydeligt uden for dette interval, hvilket gør træningen problematisk. Batch normaliseringslag beregner gennemsnit og standardafvigelse for alle værdier i den aktuelle minibatch og bruger dem til at normalisere signalet, inden det sendes gennem et neuralt netværkslag. Dette forbedrer betydeligt stabiliteten af dybe netværk.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Vigtig pointe\n",
|
||||
"## Erfaringer\n",
|
||||
"\n",
|
||||
"Ved at bruge transfer learning kunne vi hurtigt sammensætte en klassifikator til vores opgave med klassificering af brugerdefinerede objekter og opnå høj nøjagtighed. Dog var dette eksempel ikke helt retfærdigt, da det oprindelige VGG-16-netværk var forudtrænet til at genkende katte og hunde, og vi genbrugte derfor de fleste af de mønstre, der allerede var til stede i netværket. Du kan forvente lavere nøjagtighed på mere eksotiske, domænespecifikke objekter, såsom detaljer på produktionslinjen i en fabrik eller forskellige træblade.\n",
|
||||
"Ved at bruge transfer learning kunne vi hurtigt sammensætte en klassificeringsmodel til vores brugerdefinerede objektklassificeringsopgave og opnå høj nøjagtighed. Dog var dette eksempel ikke helt retfærdigt, fordi det oprindelige VGG-16-netværk var forudtrænet til at genkende katte og hunde, og derfor genbrugte vi blot de fleste af de mønstre, der allerede var til stede i netværket. Du kan forvente lavere nøjagtighed på mere eksotiske domænespecifikke objekter, såsom detaljer på en produktionslinje i en fabrik eller forskellige træs blade.\n",
|
||||
"\n",
|
||||
"Du kan se, at mere komplekse opgaver, som vi løser nu, kræver højere computerkraft og ikke nemt kan løses på CPU'en. I næste enhed vil vi forsøge at bruge en mere letvægtsimplementering til at træne den samme model med lavere computerressourcer, hvilket resulterer i kun en lidt lavere nøjagtighed.\n"
|
||||
"Du kan se, at mere komplekse opgaver, som vi løser nu, kræver højere beregningskraft og ikke let kan løses på CPU'en. I næste enhed vil vi prøve at bruge en mere letvægtsimplementering til at træne den samme model ved brug af færre beregningsressourcer, hvilket resulterer i kun en lidt lavere nøjagtighed. \n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**Ansvarsfraskrivelse**: \nDette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på at sikre nøjagtighed, skal det bemærkes, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os ikke ansvar for misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse.\n"
|
||||
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**Ansvarsfraskrivelse**:\nDette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os intet ansvar for misforståelser eller fejltolkninger, der opstår som følge af brugen af denne oversættelse.\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-28T16:29:42+00:00",
|
||||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb",
|
||||
"language_code": "da"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
|
|
|||
|
|
@ -1,51 +1,51 @@
|
|||
# Naturlig Sprogbehandling
|
||||
# Naturlig Sprogbearbejdning
|
||||
|
||||

|
||||
|
||||
I denne sektion vil vi fokusere på at bruge neurale netværk til at håndtere opgaver relateret til **naturlig sprogbehandling (NLP)**. Der er mange NLP-problemer, som vi ønsker, at computere skal kunne løse:
|
||||
I denne sektion vil vi fokusere på at bruge Neurale Netværk til at håndtere opgaver relateret til **Naturlig Sprogbearbejdning (NLP)**. Der er mange NLP-problemer, som vi ønsker, at computere skal kunne løse:
|
||||
|
||||
* **Tekstklassifikation** er et typisk klassifikationsproblem, der vedrører tekstsekvenser. Eksempler inkluderer at klassificere e-mails som spam vs. ikke-spam eller kategorisere artikler som sport, erhverv, politik osv. Når vi udvikler chatbots, har vi ofte brug for at forstå, hvad en bruger ønskede at sige – i dette tilfælde arbejder vi med **intentionklassifikation**. Ofte skal vi i intentionklassifikation håndtere mange kategorier.
|
||||
* **Sentimentanalyse** er et typisk regressionsproblem, hvor vi skal tildele et tal (et sentiment), der svarer til, hvor positivt/negativt betydningen af en sætning er. En mere avanceret version af sentimentanalyse er **aspektbaseret sentimentanalyse** (ABSA), hvor vi tilskriver sentiment ikke til hele sætningen, men til forskellige dele af den (aspekter), fx *På denne restaurant kunne jeg godt lide maden, men atmosfæren var forfærdelig*.
|
||||
* **Genkendelse af navngivne entiteter** (NER) refererer til problemet med at udtrække visse entiteter fra tekst. For eksempel kan vi have brug for at forstå, at i sætningen *Jeg skal flyve til Paris i morgen* refererer ordet *i morgen* til en DATO, og *Paris* er en LOKATION.
|
||||
* **Nøgleordsudtrækning** ligner NER, men her skal vi automatisk udtrække ord, der er vigtige for sætningens betydning, uden forudgående træning for specifikke entitetstyper.
|
||||
* **Tekstgruppering** kan være nyttigt, når vi vil samle lignende sætninger, for eksempel lignende forespørgsler i tekniske support-samtaler.
|
||||
* **Spørgsmål-besvarelse** refererer til en models evne til at besvare et specifikt spørgsmål. Modellen modtager et tekstafsnit og et spørgsmål som input og skal angive et sted i teksten, hvor svaret på spørgsmålet findes (eller nogle gange generere selve svaret).
|
||||
* **Tekstgenerering** er en models evne til at generere ny tekst. Det kan betragtes som en klassifikationsopgave, der forudsiger næste bogstav/ord baseret på en *tekstprompt*. Avancerede tekstgenereringsmodeller, såsom GPT-3, er i stand til at løse andre NLP-opgaver som klassifikation ved hjælp af en teknik kaldet [prompt-programmering](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) eller [prompt-engineering](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29).
|
||||
* **Tekstsammenfatning** er en teknik, hvor vi ønsker, at en computer skal "læse" en lang tekst og opsummere den i få sætninger.
|
||||
* **Maskinoversættelse** kan ses som en kombination af tekstforståelse på ét sprog og tekstgenerering på et andet.
|
||||
* **Tekstklassifikation** er et typisk klassifikationsproblem vedrørende tekstsekvenser. Eksempler inkluderer klassificering af e-mails som spam vs. ikke-spam eller kategorisering af artikler som sport, erhverv, politik osv. Også når vi udvikler chatbots, har vi ofte behov for at forstå, hvad en bruger ønskede at sige – i dette tilfælde arbejder vi med **intentionklassifikation**. Ofte er der i intentionklassifikation mange kategorier.
|
||||
* **Følelsesanalyse** er et typisk regressionsproblem, hvor vi skal tildele et tal (en følelse) svarende til, hvor positiv/negativ meningen med en sætning er. En mere avanceret version af følelsesanalyse er **aspektbaseret følelsesanalyse** (ABSA), hvor vi tilskriver følelser ikke til hele sætningen, men til forskellige dele af den (aspekter), fx *På denne restaurant kunne jeg lide køkkenet, men atmosfæren var forfærdelig*.
|
||||
* **Navngiven Entitetsgenkendelse** (NER) henviser til problemet med at udtrække bestemte enheder fra tekst. For eksempel skal vi måske forstå, at i sætningen *Jeg skal flyve til Paris i morgen* henviser ordet *i morgen* til DATO, og *Paris* er en LOKATION.
|
||||
* **Nøgleordsudtrækning** minder om NER, men vi skal automatisk udtrække ord, der er vigtige for meningen i sætningen, uden forudgående træning for specifikke entitetstyper.
|
||||
* **Tekstklyngedannelse** kan være nyttigt, når vi vil gruppere lignende sætninger sammen, for eksempel lignende forespørgsler i teknisk support-samtaler.
|
||||
* **Spørgsmålsbesvarelse** refererer til en models evne til at svare på et specifikt spørgsmål. Modellen modtager et tekstuddrag og et spørgsmål som input, og den skal angive et sted i teksten, hvor svaret på spørgsmålet findes (eller nogle gange generere svaret i tekst).
|
||||
* **Tekstgenerering** er en models evne til at generere ny tekst. Det kan betragtes som en klassifikationsopgave, der forudsiger næste bogstav/ord baseret på en *tekstprompt*. Avancerede tekstgenereringsmodeller, som GPT-3, kan løse andre NLP-opgaver såsom klassifikation ved hjælp af en teknik kaldet [prompt programming](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) eller [prompt engineering](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29)
|
||||
* **Tekstopsummering** er en teknik, hvor vi ønsker, at en computer "læser" lang tekst og sammenfatter den i et par sætninger.
|
||||
* **Maskinoversættelse** kan ses som en kombination af tekstforståelse på et sprog og tekstgenerering på et andet.
|
||||
|
||||
Oprindeligt blev de fleste NLP-opgaver løst ved hjælp af traditionelle metoder som grammatikker. For eksempel blev der i maskinoversættelse brugt parsere til at transformere den oprindelige sætning til et syntakstræ, hvorefter højere niveau semantiske strukturer blev udtrukket for at repræsentere sætningens betydning. Baseret på denne betydning og grammatikken for målsproget blev resultatet genereret. I dag løses mange NLP-opgaver mere effektivt ved hjælp af neurale netværk.
|
||||
Oprindeligt blev de fleste NLP-opgaver løst ved hjælp af traditionelle metoder såsom grammatikker. For eksempel blev parsere brugt i maskinoversættelse til at omdanne den oprindelige sætning til et syntakstræ, derefter blev højere niveau semantiske strukturer udtrukket for at repræsentere sætningens betydning, og baseret på denne betydning og målsprogets grammatik blev resultatet genereret. I dag bliver mange NLP-opgaver mere effektivt løst ved hjælp af neurale netværk.
|
||||
|
||||
> Mange klassiske NLP-metoder er implementeret i [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org) Python-biblioteket. Der findes en fremragende [NLTK-bog](https://www.nltk.org/book/), der er tilgængelig online og dækker, hvordan forskellige NLP-opgaver kan løses ved hjælp af NLTK.
|
||||
> Mange klassiske NLP-metoder er implementeret i [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org) Python-bibliotek. Der findes en fremragende [NLTK-bog](https://www.nltk.org/book/) online, som dækker, hvordan forskellige NLP-opgaver kan løses ved hjælp af NLTK.
|
||||
|
||||
I dette kursus vil vi primært fokusere på at bruge neurale netværk til NLP, og vi vil bruge NLTK, hvor det er nødvendigt.
|
||||
I vores kursus vil vi primært fokusere på brugen af neurale netværk til NLP, og vi vil bruge NLTK hvor det er nødvendigt.
|
||||
|
||||
Vi har allerede lært at bruge neurale netværk til at håndtere tabeldata og billeder. Den største forskel mellem disse datatyper og tekst er, at tekst er en sekvens af variabel længde, mens inputstørrelsen i tilfælde af billeder er kendt på forhånd. Mens konvolutionsnetværk kan udtrække mønstre fra inputdata, er mønstre i tekst mere komplekse. For eksempel kan negation være adskilt fra subjektet med mange ord (fx *Jeg kan ikke lide appelsiner* vs. *Jeg kan ikke lide de store farverige lækre appelsiner*), og det skal stadig fortolkes som ét mønster. Derfor har vi brug for nye typer neurale netværk, såsom *rekurrente netværk* og *transformere*, for at håndtere sprog.
|
||||
Vi har allerede lært om brug af neurale netværk til at håndtere tabeldata og billeder. Den største forskel mellem disse datatyper og tekst er, at tekst er en sekvens med variabel længde, mens inputstørrelsen i tilfælde af billeder er kendt på forhånd. Mens konvolutionsnetværk kan udtrække mønstre fra inputdata, er mønstrene i tekst mere komplekse. Fx kan negation være adskilt fra subjektet med et vilkårligt antal ord (fx *Jeg kan ikke lide appelsiner* vs. *Jeg kan ikke lide de store farverige lækre appelsiner*), og det skal stadig fortolkes som ét mønster. Derfor skal vi for at håndtere sprog introducere nye typer neurale netværk, såsom *recurrent networks* og *transformers*.
|
||||
|
||||
## Installation af biblioteker
|
||||
## Installer Biblioteker
|
||||
|
||||
Hvis du bruger en lokal Python-installation til at køre dette kursus, skal du muligvis installere alle nødvendige biblioteker til NLP ved hjælp af følgende kommandoer:
|
||||
Hvis du bruger en lokal Python-installation til at køre dette kursus, kan du have behov for at installere alle nødvendige biblioteker til NLP ved hjælp af følgende kommandoer:
|
||||
|
||||
**For PyTorch**
|
||||
**For PyTorch**
|
||||
```bash
|
||||
pip install -r requirements-torch.txt
|
||||
```
|
||||
**For TensorFlow**
|
||||
pip install -r requirements-pytorch.txt
|
||||
```
|
||||
**For TensorFlow**
|
||||
```bash
|
||||
pip install -r requirements-tf.txt
|
||||
```
|
||||
```
|
||||
|
||||
> Du kan prøve NLP med TensorFlow på [Microsoft Learn](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste)
|
||||
|
||||
## GPU-advarsel
|
||||
|
||||
I denne sektion vil vi i nogle af eksemplerne træne ret store modeller.
|
||||
* **Brug en GPU-aktiveret computer**: Det anbefales at køre dine notebooks på en GPU-aktiveret computer for at reducere ventetiden, når du arbejder med store modeller.
|
||||
* **GPU-hukommelsesbegrænsninger**: Kørsel på en GPU kan føre til situationer, hvor du løber tør for GPU-hukommelse, især når du træner store modeller.
|
||||
* **GPU-hukommelsesforbrug**: Mængden af GPU-hukommelse, der forbruges under træning, afhænger af forskellige faktorer, herunder minibatch-størrelsen.
|
||||
* **Minimer minibatch-størrelse**: Hvis du oplever GPU-hukommelsesproblemer, kan du overveje at reducere minibatch-størrelsen i din kode som en mulig løsning.
|
||||
* **TensorFlow GPU-hukommelsesfrigivelse**: Ældre versioner af TensorFlow frigiver muligvis ikke GPU-hukommelse korrekt, når der trænes flere modeller inden for én Python-kerne. For at håndtere GPU-hukommelsesforbrug effektivt kan du konfigurere TensorFlow til kun at allokere GPU-hukommelse efter behov.
|
||||
* **Inklusion af kode**: For at indstille TensorFlow til kun at øge GPU-hukommelsesallokering, når det er nødvendigt, skal du inkludere følgende kode i dine notebooks:
|
||||
* **Brug en computer med GPU**: Det anbefales at køre dine notebooks på en computer med GPU for at reducere ventetider, når du arbejder med store modeller.
|
||||
* **Begrænsninger i GPU-hukommelsen**: Kørsel på en GPU kan føre til situationer, hvor du løber tør for GPU-hukommelse, især ved træning af store modeller.
|
||||
* **GPU-hukommelsesforbrug**: Mængden af GPU-hukommelse, der forbruges under træning, afhænger af forskellige faktorer, inklusive minibatch-størrelse.
|
||||
* **Minimer minibatch-størrelse**: Hvis du oplever problemer med GPU-hukommelsen, kan du overveje at reducere minibatch-størrelsen i din kode som en mulig løsning.
|
||||
* **TensorFlow GPU-hukommelsesfrigivelse**: Ældre versioner af TensorFlow frigiver muligvis ikke GPU-hukommelse korrekt, når flere modeller trænes inden for én Python-kerne. For at håndtere GPU-hukommelsesforbrug effektivt kan du konfigurere TensorFlow til kun at allokere GPU-hukommelse efter behov.
|
||||
* **Kodeinklusion**: For at sætte TensorFlow til at øge GPU-hukommelsesallokering kun efter behov, inkluder følgende kode i dine notebooks:
|
||||
|
||||
```python
|
||||
physical_devices = tf.config.list_physical_devices('GPU')
|
||||
|
|
@ -53,19 +53,21 @@ if len(physical_devices)>0:
|
|||
tf.config.experimental.set_memory_growth(physical_devices[0], True)
|
||||
```
|
||||
|
||||
Hvis du er interesseret i at lære om NLP fra et klassisk ML-perspektiv, kan du besøge [denne samling af lektioner](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP).
|
||||
Hvis du er interesseret i at lære om NLP fra et klassisk ML-perspektiv, besøg [dette sæt af lektioner](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP)
|
||||
|
||||
## I denne sektion
|
||||
I denne sektion vil vi lære om:
|
||||
|
||||
* [Repræsentation af tekst som tensorer](13-TextRep/README.md)
|
||||
* [Ordindlejringer](14-Emdeddings/README.md)
|
||||
* [Sproglig modellering](15-LanguageModeling/README.md)
|
||||
* [Rekurrente neurale netværk](16-RNN/README.md)
|
||||
* [Generative netværk](17-GenerativeNetworks/README.md)
|
||||
* [Transformere](18-Transformers/README.md)
|
||||
* [At repræsentere tekst som tensors](13-TextRep/README.md)
|
||||
* [Word Embeddings](14-Emdeddings/README.md)
|
||||
* [Sprogsmodellering](15-LanguageModeling/README.md)
|
||||
* [Recurrent Neural Networks](16-RNN/README.md)
|
||||
* [Generative Networks](17-GenerativeNetworks/README.md)
|
||||
* [Transformers](18-Transformers/README.md)
|
||||
|
||||
---
|
||||
|
||||
**Ansvarsfraskrivelse**:
|
||||
Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi er ikke ansvarlige for eventuelle misforståelser eller fejltolkninger, der opstår som følge af brugen af denne oversættelse.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**Ansvarsfraskrivelse**:
|
||||
Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os intet ansvar for misforståelser eller fejltolkninger, der opstår som følge af brugen af denne oversættelse.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -5,6 +5,12 @@
|
|||
"source_file": "AGENTS.md",
|
||||
"language_code": "de"
|
||||
},
|
||||
"CONTRIBUTING.md": {
|
||||
"original_hash": "c6fd7e781b67111a90abd166d0ce4aa0",
|
||||
"translation_date": "2026-07-08T20:19:31+00:00",
|
||||
"source_file": "CONTRIBUTING.md",
|
||||
"language_code": "de"
|
||||
},
|
||||
"README.md": {
|
||||
"original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b",
|
||||
"translation_date": "2026-04-06T15:35:07+00:00",
|
||||
|
|
@ -17,6 +23,19 @@
|
|||
"source_file": "SECURITY.md",
|
||||
"language_code": "de"
|
||||
},
|
||||
"__translation_failures__": {
|
||||
"lessons/sketchnotes/LICENSE.md": {
|
||||
"original_hash": "45ab63a2cd8f5faef6c9b150618837a4",
|
||||
"source_file": "lessons/sketchnotes/LICENSE.md",
|
||||
"language_code": "de",
|
||||
"failure_date": "2026-07-08T20:19:03+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-24T09:44:37+00:00",
|
||||
|
|
@ -54,8 +73,8 @@
|
|||
"language_code": "de"
|
||||
},
|
||||
"examples/README.md": {
|
||||
"original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7",
|
||||
"translation_date": "2025-10-03T11:26:30+00:00",
|
||||
"original_hash": "7883d52c2e2a221e0b07a7b112a149b9",
|
||||
"translation_date": "2026-07-08T20:14:17+00:00",
|
||||
"source_file": "examples/README.md",
|
||||
"language_code": "de"
|
||||
},
|
||||
|
|
@ -66,8 +85,8 @@
|
|||
"language_code": "de"
|
||||
},
|
||||
"lessons/0-course-setup/how-to-run.md": {
|
||||
"original_hash": "a4717bd9103b9f6cd84d534b83534689",
|
||||
"translation_date": "2026-01-15T10:52:10+00:00",
|
||||
"original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1",
|
||||
"translation_date": "2026-07-08T20:14:36+00:00",
|
||||
"source_file": "lessons/0-course-setup/how-to-run.md",
|
||||
"language_code": "de"
|
||||
},
|
||||
|
|
@ -191,6 +210,12 @@
|
|||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md",
|
||||
"language_code": "de"
|
||||
},
|
||||
"lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": {
|
||||
"original_hash": "99b816b6a4957ef4100cee4c4221dff9",
|
||||
"translation_date": "2026-07-08T20:03:15+00:00",
|
||||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb",
|
||||
"language_code": "de"
|
||||
},
|
||||
"lessons/4-ComputerVision/08-TransferLearning/lab/README.md": {
|
||||
"original_hash": "7765935c35fcee69b9fe2d0cfd6963e2",
|
||||
"translation_date": "2025-08-24T09:37:45+00:00",
|
||||
|
|
@ -330,8 +355,8 @@
|
|||
"language_code": "de"
|
||||
},
|
||||
"lessons/5-NLP/README.md": {
|
||||
"original_hash": "8ef02a9318257ea140ed3ed74442096d",
|
||||
"translation_date": "2025-08-24T09:29:31+00:00",
|
||||
"original_hash": "038df6f1a73e49f6430740da083bfd6d",
|
||||
"translation_date": "2026-07-08T20:15:05+00:00",
|
||||
"source_file": "lessons/5-NLP/README.md",
|
||||
"language_code": "de"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -0,0 +1,29 @@
|
|||
# Beitrag zu AI-For-Beginners
|
||||
|
||||
Vielen Dank für Ihr Interesse, zu AI-For-Beginners beizutragen! Wir begrüßen Übersetzungen, Korrekturen von Lektionen und Formatierungsverbesserungen.
|
||||
|
||||
## Microsoft Contributor License Agreement (CLA)
|
||||
|
||||
Dieses Projekt freut sich über Beiträge und Vorschläge. Die meisten Beiträge erfordern, dass Sie einer Contributor License Agreement (CLA) zustimmen, in der Sie erklären, dass Sie das Recht haben und tatsächlich die Rechte gewähren, Ihren Beitrag zu nutzen. Details finden Sie unter [https://cla.microsoft.com](https://cla.microsoft.com).
|
||||
|
||||
Wenn Sie eine Pull-Anfrage einreichen, wird ein CLA-Bot automatisch feststellen, ob Sie eine CLA bereitstellen müssen, und die PR entsprechend kennzeichnen (z. B. Label, Kommentar). Folgen Sie einfach den Anweisungen des Bots. Dies müssen Sie nur einmal für alle Repositories tun, die unsere CLA verwenden.
|
||||
|
||||
## Wie man beiträgt
|
||||
|
||||
### 1. Rechtschreibfehler / Programmierfehler korrigieren
|
||||
Wenn Sie einen Tippfehler oder Fehler in einem Jupyter-Notebook oder einer Lektion-Markdown-Datei finden:
|
||||
1. Forken Sie das Repository.
|
||||
2. Korrigieren Sie den Tippfehler oder den defekten Link.
|
||||
3. Reichen Sie eine Pull-Anfrage mit einer klaren Beschreibung der Korrektur ein.
|
||||
|
||||
### 2. Übersetzungen einreichen
|
||||
Wir begrüßen Übersetzungen der Lektionen in andere Sprachen! Bitte legen Sie Übersetzungen im Verzeichnis `translations/` unter Verwendung der dort vorhandenen Ordnernamen ab (z. B. `translations/es/`, `translations/pt-BR/`, `translations/zh-CN/`).
|
||||
|
||||
Für weitere Details siehe [etc/CONTRIBUTING.md](etc/CONTRIBUTING.md).
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**Haftungsausschluss**:
|
||||
Dieses Dokument wurde mit dem KI-Übersetzungsdienst [Co-op Translator](https://github.com/Azure/co-op-translator) übersetzt. Obwohl wir uns um Genauigkeit bemühen, beachten Sie bitte, dass automatisierte Übersetzungen Fehler oder Ungenauigkeiten enthalten können. Das Originaldokument in seiner Ursprungssprache gilt als maßgebliche Quelle. Bei kritischen Informationen wird eine professionelle menschliche Übersetzung empfohlen. Wir übernehmen keine Haftung für Missverständnisse oder Fehlinterpretationen, die aus der Verwendung dieser Übersetzung entstehen.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -1,31 +1,31 @@
|
|||
# Anfängerfreundliche KI-Beispiele
|
||||
# Einstiegsfreundliche KI-Beispiele
|
||||
|
||||
Willkommen! Dieses Verzeichnis enthält einfache, eigenständige Beispiele, die Ihnen den Einstieg in KI und maschinelles Lernen erleichtern sollen. Jedes Beispiel ist anfängerfreundlich gestaltet und enthält ausführliche Kommentare sowie Schritt-für-Schritt-Erklärungen.
|
||||
Willkommen! Dieses Verzeichnis enthält einfache, eigenständige Beispiele, die Ihnen den Einstieg in KI und maschinelles Lernen erleichtern. Jedes Beispiel ist anfängerfreundlich gestaltet mit ausführlichen Kommentaren und Schritt-für-Schritt-Erklärungen.
|
||||
|
||||
## 📚 Überblick über die Beispiele
|
||||
## 📚 Beispielübersicht
|
||||
|
||||
| Beispiel | Beschreibung | Schwierigkeitsgrad | Voraussetzungen |
|
||||
|----------|--------------|--------------------|-----------------|
|
||||
| [Hello AI World](../../../examples/01-hello-ai-world.py) | Ihr erstes KI-Programm – einfache Mustererkennung | ⭐ Anfänger | Grundkenntnisse in Python |
|
||||
| [Einfaches Neuronales Netzwerk](../../../examples/02-simple-neural-network.py) | Erstellen Sie ein neuronales Netzwerk von Grund auf | ⭐⭐ Anfänger+ | Python, grundlegende Mathematik |
|
||||
| [Bildklassifikator](./03-image-classifier.ipynb) | Klassifizieren Sie Bilder mit einem vortrainierten Modell | ⭐⭐ Anfänger+ | Python, numpy |
|
||||
| [Textstimmung](../../../examples/04-text-sentiment.py) | Analysieren Sie die Stimmung von Texten (positiv/negativ) | ⭐⭐ Anfänger+ | Python |
|
||||
|---------|-------------|------------|---------------|
|
||||
| [Hello AI World](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/01-hello-ai-world.py) | Ihr erstes KI-Programm – einfache Mustererkennung | ⭐ Anfänger | Python-Grundlagen |
|
||||
| [Simple Neural Network](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/02-simple-neural-network.py) | Ein neuronales Netzwerk von Grund auf bauen | ⭐⭐ Anfänger+ | Python, Grundmathematik |
|
||||
| [Image Classifier](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/03-image-classifier.ipynb) | Bilder mit einem vortrainierten Modell klassifizieren | ⭐⭐ Anfänger+ | Python, numpy |
|
||||
| [Text Sentiment](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/04-text-sentiment.py) | Text-Stimmung analysieren (positiv/negativ) | ⭐⭐ Anfänger+ | Python |
|
||||
|
||||
## 🚀 Erste Schritte
|
||||
|
||||
### Voraussetzungen
|
||||
|
||||
Stellen Sie sicher, dass Python installiert ist (empfohlen wird Version 3.8 oder höher). Installieren Sie die benötigten Pakete:
|
||||
Stellen Sie sicher, dass Python installiert ist (3.8 oder höher wird empfohlen). Installieren Sie die erforderlichen Pakete:
|
||||
|
||||
```bash
|
||||
# For Python scripts
|
||||
# Für Python-Skripte
|
||||
pip install numpy
|
||||
|
||||
# For Jupyter notebooks (image classifier)
|
||||
# Für Jupyter-Notebooks (Bildklassifizierer)
|
||||
pip install jupyter numpy pillow tensorflow
|
||||
```
|
||||
|
||||
Oder verwenden Sie die Conda-Umgebung aus dem Hauptcurriculum:
|
||||
Oder verwenden Sie die conda-Umgebung aus dem Hauptlehrplan:
|
||||
|
||||
```bash
|
||||
conda env create --name ai4beg --file ../environment.yml
|
||||
|
|
@ -39,47 +39,49 @@ conda activate ai4beg
|
|||
python 01-hello-ai-world.py
|
||||
```
|
||||
|
||||
**Für Jupyter-Notebooks (.ipynb-Dateien):**
|
||||
**Für Jupyter Notebooks (.ipynb-Dateien):**
|
||||
```bash
|
||||
jupyter notebook 03-image-classifier.ipynb
|
||||
```
|
||||
|
||||
## 📖 Lernpfad
|
||||
|
||||
Wir empfehlen, die Beispiele in der folgenden Reihenfolge zu bearbeiten:
|
||||
Wir empfehlen, die Beispiele in der Reihenfolge durchzuarbeiten:
|
||||
|
||||
1. **Beginnen Sie mit "Hello AI World"** – Lernen Sie die Grundlagen der Mustererkennung
|
||||
2. **Erstellen Sie ein einfaches neuronales Netzwerk** – Verstehen Sie, wie neuronale Netzwerke funktionieren
|
||||
3. **Probieren Sie den Bildklassifikator aus** – Erleben Sie KI in Aktion mit echten Bildern
|
||||
4. **Analysieren Sie die Textstimmung** – Erkunden Sie die Verarbeitung natürlicher Sprache
|
||||
1. **Beginnen Sie mit „Hello AI World“** – Lernen Sie die Grundlagen der Mustererkennung
|
||||
2. **Bauen Sie ein einfaches neuronales Netzwerk** – Verstehen Sie, wie neuronale Netzwerke funktionieren
|
||||
3. **Probieren Sie den Bildklassifikator aus** – Sehen Sie KI anhand echter Bilder in Aktion
|
||||
4. **Analysieren Sie Text-Stimmungen** – Entdecken Sie die natürliche Sprachverarbeitung
|
||||
|
||||
## 💡 Tipps für Anfänger
|
||||
|
||||
- **Lesen Sie die Kommentare im Code sorgfältig** – Sie erklären, was jede Zeile macht
|
||||
- **Experimentieren Sie!** – Ändern Sie Werte und sehen Sie, was passiert
|
||||
- **Lesen Sie die Code-Kommentare sorgfältig** – Sie erklären, was jede Zeile macht
|
||||
- **Experimentieren Sie!** – Ändern Sie Werte und beobachten Sie, was passiert
|
||||
- **Machen Sie sich keine Sorgen, alles sofort zu verstehen** – Lernen braucht Zeit
|
||||
- **Stellen Sie Fragen** – Nutzen Sie das [Diskussionsforum](https://github.com/microsoft/AI-For-Beginners/discussions)
|
||||
|
||||
## 🔗 Nächste Schritte
|
||||
|
||||
Nachdem Sie diese Beispiele abgeschlossen haben, erkunden Sie das vollständige Curriculum:
|
||||
Nach Abschluss dieser Beispiele erkunden Sie den vollständigen Lehrplan:
|
||||
- [Einführung in KI](../lessons/1-Intro/README.md)
|
||||
- [Neuronale Netzwerke](../lessons/3-NeuralNetworks/README.md)
|
||||
- [Computer Vision](../lessons/4-ComputerVision/README.md)
|
||||
- [Verarbeitung natürlicher Sprache](../lessons/5-NLP/README.md)
|
||||
- [Computervision](../lessons/4-ComputerVision/README.md)
|
||||
- [Natürliche Sprachverarbeitung](../lessons/5-NLP/README.md)
|
||||
|
||||
## 🤝 Mitwirken
|
||||
|
||||
Fanden Sie diese Beispiele hilfreich? Helfen Sie uns, sie zu verbessern:
|
||||
- Melden Sie Probleme oder schlagen Sie Verbesserungen vor
|
||||
- Fügen Sie weitere Beispiele für Anfänger hinzu
|
||||
- Verbessern Sie die Dokumentation und Kommentare
|
||||
- Verbessern Sie Dokumentation und Kommentare
|
||||
|
||||
---
|
||||
|
||||
*Denken Sie daran: Jeder Experte war einmal ein Anfänger. Viel Spaß beim Lernen! 🎓*
|
||||
*Denken Sie daran: Jeder Experte war einst ein Anfänger. Viel Erfolg beim Lernen! 🎓*
|
||||
|
||||
---
|
||||
|
||||
**Haftungsausschluss**:
|
||||
Dieses Dokument wurde mit dem KI-Übersetzungsdienst [Co-op Translator](https://github.com/Azure/co-op-translator) übersetzt. Obwohl wir uns um Genauigkeit bemühen, beachten Sie bitte, dass automatisierte Übersetzungen Fehler oder Ungenauigkeiten enthalten können. Das Originaldokument in seiner ursprünglichen Sprache sollte als maßgebliche Quelle betrachtet werden. Für kritische Informationen wird eine professionelle menschliche Übersetzung empfohlen. Wir übernehmen keine Haftung für Missverständnisse oder Fehlinterpretationen, die sich aus der Nutzung dieser Übersetzung ergeben.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**Haftungsausschluss**:
|
||||
Dieses Dokument wurde mit dem KI-Übersetzungsdienst [Co-op Translator](https://github.com/Azure/co-op-translator) übersetzt. Obwohl wir uns um Genauigkeit bemühen, beachten Sie bitte, dass automatisierte Übersetzungen Fehler oder Ungenauigkeiten enthalten können. Das Originaldokument in seiner Ursprungssprache gilt als maßgebliche Quelle. Bei kritischen Informationen wird eine professionelle menschliche Übersetzung empfohlen. Wir übernehmen keine Haftung für Missverständnisse oder Fehlinterpretationen, die aus der Verwendung dieser Übersetzung entstehen.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -1,10 +1,10 @@
|
|||
# Wie man den Code ausführt
|
||||
# So führen Sie den Code aus
|
||||
|
||||
Dieses Curriculum enthält viele ausführbare Beispiele und Labs, die Sie ausführen möchten. Um dies zu tun, benötigen Sie die Möglichkeit, Python-Code in Jupyter Notebooks auszuführen, die als Teil dieses Curriculums bereitgestellt werden. Sie haben mehrere Optionen, um den Code auszuführen:
|
||||
Dieser Lehrplan enthält viele ausführbare Beispiele und Labs, die Sie ausführen möchten. Um dies zu tun, benötigen Sie die Möglichkeit, Python-Code in Jupyter Notebooks auszuführen, die als Teil dieses Lehrplans bereitgestellt werden. Sie haben mehrere Möglichkeiten, den Code auszuführen:
|
||||
|
||||
## Lokal auf Ihrem Computer ausführen
|
||||
|
||||
Um den Code lokal auf Ihrem Computer auszuführen, ist eine Python-Installation erforderlich. Eine Empfehlung ist die Installation von **[miniconda](https://conda.io/en/latest/miniconda.html)** – es ist eine eher leichtgewichtige Installation, die den `conda` Paketmanager für verschiedene Python-**virtuelle Umgebungen** unterstützt.
|
||||
Um den Code lokal auf Ihrem Computer auszuführen, ist eine Python-Installation erforderlich. Eine Empfehlung ist die Installation von **[miniconda](https://conda.io/en/latest/miniconda.html)** – es handelt sich um eine eher leichte Installation, die den Paketmanager `conda` für verschiedene Python-**virtuelle Umgebungen** unterstützt.
|
||||
|
||||
Nachdem Sie miniconda installiert haben, klonen Sie das Repository und erstellen eine virtuelle Umgebung, die für diesen Kurs verwendet wird:
|
||||
|
||||
|
|
@ -15,17 +15,17 @@ conda env create --name ai4beg --file .devcontainer/environment.yml
|
|||
conda activate ai4beg
|
||||
```
|
||||
|
||||
### Verwendung von Visual Studio Code mit Python-Erweiterung
|
||||
### Visual Studio Code mit Python-Erweiterung verwenden
|
||||
|
||||
Dieses Curriculum wird am besten verwendet, wenn es in [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) mit der [Python-Erweiterung](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste) geöffnet wird.
|
||||
Dieser Lehrplan wird am besten verwendet, wenn Sie ihn in [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) mit der [Python-Erweiterung](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste) öffnen.
|
||||
|
||||
> **Hinweis**: Sobald Sie das Verzeichnis klonen und in VS Code öffnen, wird automatisch vorgeschlagen, Python-Erweiterungen zu installieren. Sie müssen auch miniconda wie oben beschrieben installieren.
|
||||
|
||||
> **Hinweis**: Wenn VS Code vorschlägt, das Repository in einem Container erneut zu öffnen, sollten Sie dies ablehnen, um die lokale Python-Installation zu verwenden.
|
||||
> **Hinweis**: Wenn VS Code Ihnen vorschlägt, das Repository in einem Container neu zu öffnen, sollten Sie dies ablehnen, um die lokale Python-Installation zu verwenden.
|
||||
|
||||
### Verwendung von Jupyter im Browser
|
||||
### Jupyter im Browser verwenden
|
||||
|
||||
Sie können auch eine Jupyter-Umgebung aus dem Browser auf Ihrem eigenen Computer verwenden. Sowohl klassisches Jupyter als auch JupyterHub bieten eine bequeme Entwicklungsumgebung mit Autovervollständigung, Code-Hervorhebung usw.
|
||||
Sie können auch eine Jupyter-Umgebung über den Browser auf Ihrem eigenen Computer nutzen. Sowohl klassisches Jupyter als auch JupyterHub bieten eine bequeme Entwicklungsumgebung mit Autovervollständigung, Codehervorhebung usw.
|
||||
|
||||
Um Jupyter lokal zu starten, wechseln Sie in das Verzeichnis des Kurses und führen aus:
|
||||
|
||||
|
|
@ -36,36 +36,36 @@ oder
|
|||
```bash
|
||||
jupyterhub
|
||||
```
|
||||
Sie können dann zu einer beliebigen `.ipynb`-Datei navigieren, sie öffnen und mit der Arbeit beginnen.
|
||||
Sie können dann zu einer der `.ipynb`-Dateien navigieren, sie öffnen und mit der Arbeit beginnen.
|
||||
|
||||
### Ausführen in einem Container
|
||||
|
||||
Eine Alternative zur Python-Installation wäre das Ausführen des Codes in einem Container. Da unser Repository einen speziellen `.devcontainer`-Ordner bereitstellt, der beschreibt, wie ein Container für dieses Repo gebaut wird, bietet VS Code die Möglichkeit, den Code in einem Container erneut zu öffnen. Dies erfordert die Installation von Docker und wäre auch komplexer, daher empfehlen wir dies eher erfahrenen Nutzern.
|
||||
Eine Alternative zur Python-Installation wäre, den Code in einem Container auszuführen. Da unser Repository einen speziellen `.devcontainer`-Ordner bereitstellt, der beschreibt, wie ein Container für dieses Repo gebaut wird, bietet VS Code die Möglichkeit, den Code neu in einem Container zu öffnen. Dies erfordert eine Docker-Installation und ist auch komplexer, daher empfehlen wir dies eher erfahrenen Nutzern.
|
||||
|
||||
## Ausführung in der Cloud
|
||||
## Ausführen in der Cloud
|
||||
|
||||
Wenn Sie Python nicht lokal installieren möchten und Zugriff auf Cloud-Ressourcen haben – eine gute Alternative ist es, den Code in der Cloud auszuführen. Es gibt mehrere Möglichkeiten, dies zu tun:
|
||||
Wenn Sie Python nicht lokal installieren möchten und Zugriff auf einige Cloud-Ressourcen haben – wäre eine gute Alternative, den Code in der Cloud auszuführen. Es gibt mehrere Möglichkeiten, dies zu tun:
|
||||
|
||||
* Verwendung von **[GitHub Codespaces](https://github.com/features/codespaces)**, einer virtuellen Umgebung, die für Sie auf GitHub erstellt wird und über eine VS Code-Browseroberfläche zugänglich ist. Wenn Sie Zugriff auf Codespaces haben, können Sie einfach auf die **Code**-Schaltfläche im Repo klicken, einen Codespace starten und sofort loslegen.
|
||||
* Verwendung von **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) bietet kostenfreie Cloud-Computing-Ressourcen für Personen wie Sie, um Code auf GitHub auszuprobieren. Es gibt eine Schaltfläche auf der Startseite, um das Repository in Binder zu öffnen – dies sollte Sie schnell auf die Binder-Seite bringen, die einen zugrundeliegenden Container baut und nahtlos eine Jupyter-Weboberfläche für Sie startet.
|
||||
* Verwendung von **[GitHub Codespaces](https://github.com/features/codespaces)**, einer virtuellen Umgebung, die für Sie auf GitHub erstellt wird, zugänglich über eine VS Code-Browseroberfläche. Wenn Sie Zugriff auf Codespaces haben, können Sie einfach auf die **Code**-Schaltfläche im Repo klicken, einen Codespace starten und sofort loslegen.
|
||||
* Verwendung von **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) bietet kostenlose Rechenressourcen in der Cloud für Personen wie Sie, um Code auf GitHub auszuprobieren. Auf der Startseite gibt es eine Schaltfläche, um das Repository in Binder zu öffnen – dies führt Sie schnell zur Binder-Seite, die einen zugrundeliegenden Container erstellt und nahtlos eine Jupyter-Weboberfläche startet.
|
||||
|
||||
> **Hinweis**: Zur Vermeidung von Missbrauch hat Binder den Zugriff auf einige Webressourcen blockiert. Dies kann verhindern, dass ein Teil des Codes funktioniert, der Modelle und/oder Datensätze aus dem öffentlichen Internet lädt. Sie müssen möglicherweise einige Umgehungen finden. Außerdem sind die von Binder bereitgestellten Rechenressourcen eher grundlegend, sodass das Training langsam sein wird, besonders in späteren, komplexeren Lektionen.
|
||||
> **Hinweis**: Um Missbrauch zu verhindern, hat Binder den Zugriff auf einige Web-Ressourcen blockiert. Dies kann verhindern, dass einige Codeabschnitte funktionieren, die Modelle und/oder Datensätze aus dem öffentlichen Internet laden. Sie müssen möglicherweise einige Umgehungsmöglichkeiten finden. Außerdem sind die von Binder bereitgestellten Rechenressourcen recht einfach, daher ist das Training besonders in späteren, komplexeren Lektionen langsam.
|
||||
|
||||
## Ausführung in der Cloud mit GPU
|
||||
## Ausführen in der Cloud mit GPU
|
||||
|
||||
Einige der späteren Lektionen in diesem Curriculum würden erheblich von GPU-Unterstützung profitieren. Das Modelltraining kann sonst sehr langsam sein. Es gibt einige Möglichkeiten, die Sie nutzen können, besonders wenn Sie über [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) oder über Ihre Institution Zugang zur Cloud haben:
|
||||
Einige der späteren Lektionen in diesem Lehrplan würden sehr von GPU-Unterstützung profitieren. Model-Training kann zum Beispiel ohne diese schmerzhaft langsam sein. Es gibt einige Optionen, denen Sie folgen können, besonders wenn Sie über [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) oder Ihre Institution Zugang zur Cloud haben:
|
||||
|
||||
* Erstellen Sie eine [Data Science Virtual Machine](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) und verbinden Sie sich über Jupyter mit ihr. Sie können dann das Repo direkt auf die Maschine klonen und mit dem Lernen beginnen. NC-Serien VMs unterstützen GPU.
|
||||
* Erstellen Sie eine [Data Science Virtual Machine](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) und verbinden Sie sich über Jupyter damit. Sie können dann das Repo direkt auf die Maschine klonen und mit dem Lernen beginnen. NC-Serie VMs verfügen über GPU-Unterstützung.
|
||||
|
||||
> **Hinweis**: Einige Abonnements, einschließlich Azure for Students, bieten nicht standardmäßig GPU-Unterstützung. Möglicherweise müssen Sie zusätzliche GPU-Kerne per technischem Supportantrag anfordern.
|
||||
> **Hinweis**: Einige Abonnements, einschließlich Azure for Students, bieten nicht standardmäßig GPU-Unterstützung. Sie müssen möglicherweise zusätzliche GPU-Kerne über eine technische Supportanfrage anfordern.
|
||||
|
||||
* Erstellen Sie einen [Azure Machine Learning Workspace](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) und verwenden Sie dort die Notizbuchfunktion. [Dieses Video](https://azure-for-academics.github.io/quickstart/azureml-papers/) zeigt, wie man ein Repository in ein Azure ML-Notizbuch klont und es verwendet.
|
||||
* Erstellen Sie einen [Azure Machine Learning Workspace](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) und nutzen Sie dann dort die Notebook-Funktion. [Dieses Video](https://azure-for-academics.github.io/quickstart/azureml-papers/) zeigt, wie Sie ein Repository in ein Azure ML Notebook klonen und verwenden.
|
||||
|
||||
Sie können auch Google Colab verwenden, das über eine kostenlose GPU-Unterstützung verfügt, und Jupyter Notebooks dort hochladen, um sie einzeln auszuführen.
|
||||
Sie können auch Google Colab verwenden, das einige kostenlose GPU-Unterstützung bietet, und Jupyter Notebooks dort hochladen, um sie nacheinander auszuführen.
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**Haftungsausschluss**:
|
||||
Dieses Dokument wurde mithilfe des KI-Übersetzungsdienstes [Co-op Translator](https://github.com/Azure/co-op-translator) übersetzt. Obwohl wir bemüht sind, eine genaue Übersetzung zu gewährleisten, sollten Sie beachten, dass automatisierte Übersetzungen Fehler oder Ungenauigkeiten enthalten können. Das Originaldokument in seiner Ursprungssprache gilt als verbindliche Quelle. Für wichtige Informationen wird eine professionelle menschliche Übersetzung empfohlen. Wir übernehmen keine Haftung für Missverständnisse oder Fehlinterpretationen, die aus der Nutzung dieser Übersetzung entstehen.
|
||||
**Haftungsausschluss**:
|
||||
Dieses Dokument wurde mit dem KI-Übersetzungsdienst [Co-op Translator](https://github.com/Azure/co-op-translator) übersetzt. Obwohl wir uns um Genauigkeit bemühen, beachten Sie bitte, dass automatisierte Übersetzungen Fehler oder Ungenauigkeiten enthalten können. Das Originaldokument in seiner Ursprungssprache gilt als maßgebliche Quelle. Bei kritischen Informationen wird eine professionelle menschliche Übersetzung empfohlen. Wir übernehmen keine Haftung für Missverständnisse oder Fehlinterpretationen, die aus der Verwendung dieser Übersetzung entstehen.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -6,9 +6,9 @@
|
|||
"source": [
|
||||
"# Vorgefertigte Modelle und Transferlernen\n",
|
||||
"\n",
|
||||
"Das Training von CNNs kann viel Zeit in Anspruch nehmen, und es wird eine große Menge an Daten dafür benötigt. Ein Großteil der Zeit wird jedoch darauf verwendet, die besten Low-Level-Filter zu erlernen, die ein Netzwerk nutzt, um Muster aus Bildern zu extrahieren. Eine naheliegende Frage ist: Können wir ein neuronales Netzwerk, das auf einem Datensatz trainiert wurde, verwenden und es anpassen, um andere Bilder zu klassifizieren, ohne den gesamten Trainingsprozess erneut durchlaufen zu müssen?\n",
|
||||
"Die Schulung von CNNs kann viel Zeit in Anspruch nehmen, und es werden viele Daten für diese Aufgabe benötigt. Allerdings wird viel Zeit darauf verwendet, die besten Low-Level-Filter zu erlernen, die ein Netzwerk verwendet, um Muster aus Bildern zu extrahieren. Eine natürliche Frage entsteht – können wir ein auf einem Datensatz trainiertes neuronales Netzwerk verwenden und es an die Klassifizierung anderer Bilder anpassen, ohne den vollständigen Trainingsprozess durchlaufen zu müssen?\n",
|
||||
"\n",
|
||||
"Dieser Ansatz wird als **Transferlernen** bezeichnet, da wir Wissen von einem neuronalen Netzwerkmodell auf ein anderes übertragen. Beim Transferlernen beginnen wir typischerweise mit einem vortrainierten Modell, das auf einem großen Bilddatensatz wie **ImageNet** trainiert wurde. Diese Modelle können bereits verschiedene Merkmale aus generischen Bildern gut extrahieren, und in vielen Fällen kann allein das Erstellen eines Klassifikators auf Basis dieser extrahierten Merkmale zu guten Ergebnissen führen.\n"
|
||||
"Dieser Ansatz wird **Transferlernen** genannt, weil wir Wissen von einem neuronalen Netzwerkmodell auf ein anderes übertragen. Beim Transferlernen starten wir typischerweise mit einem vortrainierten Modell, das auf einem großen Bilddatensatz wie **ImageNet** trainiert wurde. Diese Modelle können bereits gut verschiedene Merkmale aus generischen Bildern extrahieren, und in vielen Fällen kann es zu guten Ergebnissen führen, einfach einen Klassifikator auf den extrahierten Merkmalen aufzubauen.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -29,11 +29,11 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Katzen- vs. Hunde-Datensatz\n",
|
||||
"## Katzen vs. Hunde Datensatz\n",
|
||||
"\n",
|
||||
"In dieser Einheit werden wir ein reales Problem lösen: die Klassifizierung von Bildern von Katzen und Hunden. Dafür verwenden wir den [Kaggle Cats vs. Dogs Dataset](https://www.kaggle.com/c/dogs-vs-cats), der auch [von Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste) heruntergeladen werden kann.\n",
|
||||
"In dieser Einheit werden wir ein reales Problem lösen, nämlich die Klassifizierung von Bildern von Katzen und Hunden. Aus diesem Grund verwenden wir den [Kaggle Katzen vs. Hunde Datensatz](https://www.kaggle.com/c/dogs-vs-cats), der auch [von Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste) heruntergeladen werden kann.\n",
|
||||
"\n",
|
||||
"Lassen Sie uns diesen Datensatz herunterladen und in das Verzeichnis `data` extrahieren (dieser Vorgang kann einige Zeit in Anspruch nehmen!):\n"
|
||||
"Lassen Sie uns diesen Datensatz herunterladen und in das Verzeichnis `data` entpacken (dieser Vorgang kann einige Zeit in Anspruch nehmen!):\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -64,7 +64,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Leider gibt es einige beschädigte Bilddateien im Datensatz. Wir müssen eine schnelle Bereinigung durchführen, um beschädigte Dateien zu überprüfen. Um dieses Tutorial nicht zu überladen, haben wir den Code zur Überprüfung des Datensatzes in ein Modul verschoben.\n"
|
||||
"Leider gibt es einige beschädigte Bilddateien im Datensatz. Wir müssen eine schnelle Reinigung durchführen, um nach beschädigten Dateien zu suchen. Um dieses Tutorial nicht zu überladen, haben wir den Code zur Überprüfung des Datensatzes in ein Modul ausgelagert.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -335,11 +335,11 @@
|
|||
"source": [
|
||||
"## Laden des Datensatzes\n",
|
||||
"\n",
|
||||
"In früheren Beispielen haben wir Datensätze geladen, die in Keras integriert sind. Jetzt werden wir mit unserem eigenen Datensatz arbeiten, den wir aus einem Verzeichnis mit Bildern laden müssen.\n",
|
||||
"In den vorherigen Beispielen haben wir Datensätze geladen, die in Keras eingebaut sind. Nun werden wir uns mit unserem eigenen Datensatz beschäftigen, den wir aus einem Verzeichnis mit Bildern laden müssen.\n",
|
||||
"\n",
|
||||
"In der Praxis können Bilddatensätze ziemlich groß sein, und man kann nicht davon ausgehen, dass alle Daten in den Speicher passen. Daher werden Datensätze oft als **Generatoren** dargestellt, die Daten in Minibatches zurückgeben können, die für das Training geeignet sind.\n",
|
||||
"Im echten Leben kann die Größe von Bilddatensätzen ziemlich groß sein, und es ist nicht immer möglich, alle Daten im Speicher zu halten. Daher werden Datensätze oft als **Generatoren** dargestellt, die Daten in kleinen Chargen (Minibatches) zurückgeben können, die sich zum Trainieren eignen.\n",
|
||||
"\n",
|
||||
"Um mit der Bildklassifikation umzugehen, enthält Keras die spezielle Funktion `image_dataset_from_directory`, die Bilder aus Unterverzeichnissen laden kann, die verschiedenen Klassen entsprechen. Diese Funktion skaliert die Bilder automatisch und kann den Datensatz auch in Trainings- und Testuntergruppen aufteilen:\n"
|
||||
"Um mit der Bildklassifikation umzugehen, enthält Keras die spezielle Funktion `image_dataset_from_directory`, die Bilder aus Unterverzeichnissen lädt, die verschiedenen Klassen entsprechen. Diese Funktion kümmert sich auch um die Skalierung der Bilder und kann den Datensatz zudem in Trainings- und Testuntermengen aufteilen:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -383,9 +383,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Es ist wichtig, denselben `seed`-Wert für beide Aufrufe festzulegen, da dieser die Aufteilung der Bilder zwischen Trainings- und Testdatensatz beeinflusst.\n",
|
||||
"Es ist wichtig, für beide Aufrufe denselben `seed`-Wert festzulegen, da er die Aufteilung der Bilder zwischen Trainings- und Testdatensatz beeinflusst.\n",
|
||||
"\n",
|
||||
"Das Dataset erkennt automatisch die Klassennamen aus den Verzeichnissen, und Sie können darauf zugreifen, falls erforderlich, indem Sie Folgendes aufrufen:\n"
|
||||
"Dataset übernimmt automatisch die Klassennamen aus den Verzeichnissen, und Sie können bei Bedarf darauf zugreifen, indem Sie aufrufen:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -412,7 +412,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Datensätze, die wir erhalten haben, können direkt an die `fit`-Funktion übergeben werden, um das Modell zu trainieren. Sie enthalten sowohl entsprechende Bilder als auch Labels, die mit der folgenden Konstruktion durchlaufen werden können:\n"
|
||||
"Datensätze, die wir erhalten haben, können direkt an die `fit`-Funktion übergeben werden, um das Modell zu trainieren. Sie enthalten sowohl die zugehörigen Bilder als auch Labels, über die mit folgender Konstruktion iteriert werden kann:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -453,7 +453,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"> **Hinweis**: Alle Bilder im Datensatz sind als Gleitkomma-Tensoren mit einem Bereich von 0-255 dargestellt. Bevor wir sie an das neuronale Netzwerk übergeben, müssen wir diese Werte in den Bereich 0-1 skalieren. Beim Plotten von Bildern müssen wir entweder dasselbe tun oder die Werte in den `int`-Typ konvertieren (was wir im obigen Code tun), um `matplotlib` zu zeigen, dass wir das ursprüngliche unskalierte Bild plotten möchten.\n"
|
||||
"> **Hinweis**: Alle Bilder im Datensatz werden als Gleitkommatensoren mit Wertebereich 0-255 dargestellt. Bevor wir sie an das neuronale Netzwerk übergeben, müssen wir diese Werte in den Bereich 0-1 skalieren. Beim Darstellen von Bildern müssen wir entweder dasselbe tun oder die Werte in den `int`-Typ konvertieren (was wir im obigen Code machen), um `matplotlib` zu zeigen, dass wir das ursprüngliche, nicht skalierte Bild darstellen möchten.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -462,7 +462,7 @@
|
|||
"source": [
|
||||
"## Vorgefertigte Modelle\n",
|
||||
"\n",
|
||||
"Für viele Aufgaben der Bildklassifikation gibt es vorgefertigte neuronale Netzwerkmodelle. Viele dieser Modelle sind im `keras.applications`-Namespace verfügbar, und noch mehr Modelle können im Internet gefunden werden. Schauen wir uns an, wie das einfachste VGG-16-Modell geladen und verwendet werden kann:\n"
|
||||
"Für viele Bildklassifizierungsaufgaben findet man vortrainierte neuronale Netzwerkmodelle. Viele dieser Modelle sind im `keras.applications` Namensraum verfügbar, und noch mehr Modelle kann man im Internet finden. Schauen wir uns an, wie das einfachste VGG-16 Modell geladen und verwendet werden kann:\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,18 +520,17 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Es gibt hier ein paar wichtige Punkte:\n",
|
||||
"\n",
|
||||
"* Bevor ein Eingabebild an ein vortrainiertes Netzwerk übergeben wird, muss es auf eine bestimmte Weise vorverarbeitet werden. Dies geschieht durch Aufruf der entsprechenden `preprocess_input`-Funktion, die einen Stapel von Bildern erhält und deren verarbeitete Form zurückgibt. Im Fall von VGG-16 werden die Bilder normalisiert, und ein vordefinierter Durchschnittswert für jeden Kanal wird abgezogen. Das liegt daran, dass VGG-16 ursprünglich mit dieser Vorverarbeitung trainiert wurde.\n",
|
||||
"* Das neuronale Netzwerk wird auf den Eingabestapel angewendet, und als Ergebnis erhalten wir einen Stapel von 1000-elementigen Tensoren, die die Wahrscheinlichkeit jeder Klasse anzeigen. Die wahrscheinlichste Klassennummer können wir durch Aufruf von `argmax` auf diesem Tensor ermitteln.\n",
|
||||
"* Das erhaltene Ergebnis ist eine [Nummer einer `ImageNet`-Klasse](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Um dieses Ergebnis zu interpretieren, können wir auch die Funktion `decode_predictions` verwenden, die die Top-n-Klassen zusammen mit ihren Namen zurückgibt.\n"
|
||||
"Es gibt hier ein paar wichtige Dinge:\n",
|
||||
"* Bevor eine Eingabe an ein vortrainiertes Netzwerk weitergegeben wird, muss sie auf eine bestimmte Weise vorverarbeitet werden. Dies geschieht durch Aufrufen der entsprechenden `preprocess_input`-Funktion, die einen Stapel von Bildern erhält und deren verarbeitete Form zurückgibt. Im Fall von VGG-16 werden Bilder normalisiert und ein vordefinierter Durchschnittswert für jeden Kanal subtrahiert. Das liegt daran, dass VGG-16 ursprünglich mit dieser Vorverarbeitung trainiert wurde.\n",
|
||||
"* Das neuronale Netzwerk wird auf den Eingabestapel angewendet, und wir erhalten als Ergebnis einen Stapel von 1000-Element-Tensoren, die die Wahrscheinlichkeit jeder Klasse anzeigen. Die wahrscheinlichste Klassennummer können wir durch Aufrufen von `argmax` auf diesem Tensor finden.\n",
|
||||
"* Das erhaltene Ergebnis ist eine [Nummer einer `ImageNet`-Klasse](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Um dieses Ergebnis besser zu verstehen, können wir auch die Funktion `decode_predictions` verwenden, die die top n Klassen zusammen mit ihren Namen zurückgibt.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Lass uns auch die Architektur des VGG-16 Netzwerks betrachten:\n"
|
||||
"Schauen wir uns auch die Architektur des VGG-16-Netzwerks an:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -600,7 +609,7 @@
|
|||
"source": [
|
||||
"## GPU-Berechnungen\n",
|
||||
"\n",
|
||||
"Tiefe neuronale Netzwerke, wie VGG-16 und andere modernere Architekturen, benötigen eine beträchtliche Rechenleistung, um ausgeführt zu werden. Es ist sinnvoll, GPU-Beschleunigung zu nutzen, wenn sie verfügbar ist. Glücklicherweise beschleunigt Keras automatisch die Berechnungen auf der GPU, wenn diese verfügbar ist. Wir können überprüfen, ob Tensorflow die GPU verwenden kann, indem wir den folgenden Code ausführen:\n"
|
||||
"Tiefe neuronale Netze, wie VGG-16 und andere modernere Architekturen, benötigen viel Rechenleistung, um ausgeführt zu werden. Es macht Sinn, GPU-Beschleunigung zu verwenden, wenn diese verfügbar ist. Glücklicherweise beschleunigt Keras die Berechnungen auf der GPU automatisch, wenn diese verfügbar ist. Wir können prüfen, ob Tensorflow die GPU nutzen kann, indem wir den folgenden Code verwenden:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -627,9 +636,10 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Extrahieren von VGG-Features\n",
|
||||
"\n",
|
||||
"Wenn wir VGG-16 verwenden möchten, um Features aus unseren Bildern zu extrahieren, benötigen wir das Modell ohne die finalen Klassifikationsschichten. Wir können das VGG-16-Modell ohne die oberen Schichten mit diesem Code instanziieren:\n"
|
||||
"## VGG-Merkmale extrahieren\n",
|
||||
"\n",
|
||||
"Wenn wir VGG-16 verwenden möchten, um Merkmale aus unseren Bildern zu extrahieren, benötigen wir das Modell ohne die finalen Klassifikationsschichten. Wir können das VGG-16-Modell ohne die oberen Schichten mit diesem Code instanziieren:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -681,9 +691,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Die Dimension des Feature-Tensors beträgt 7x7x512, aber um ihn zu visualisieren, mussten wir ihn in eine 2D-Form umformen.\n",
|
||||
"Die Dimension des Feature-Tensors ist 7x7x512, aber um ihn zu visualisieren, mussten wir ihn in eine 2D-Form umformen.\n",
|
||||
"\n",
|
||||
"Versuchen wir nun herauszufinden, ob diese Features zur Klassifizierung von Bildern verwendet werden können. Nehmen wir manuell einen Teil der Bilder (in unserem Fall 50 Minibatches) und berechnen ihre Feature-Vektoren vorab. Dafür können wir die **dataset**-API von Tensorflow verwenden. Die `map`-Funktion nimmt ein Dataset und wendet eine gegebene Lambda-Funktion an, um es zu transformieren. Mit diesem Mechanismus erstellen wir neue Datasets, `ds_features_train` und `ds_features_test`, die die von VGG extrahierten Features anstelle der Originalbilder enthalten.\n"
|
||||
"Versuchen wir nun zu sehen, ob diese Features zur Klassifizierung von Bildern verwendet werden können. Nehmen wir manuell einen Teil der Bilder (50 Mini-Batches, in unserem Fall) und berechnen ihre Feature-Vektoren vor. Wir können die Tensorflow **dataset** API dafür verwenden. Die `map`-Funktion nimmt einen Datensatz und wendet eine gegebene Lambda-Funktion zur Transformation darauf an. Wir nutzen diesen Mechanismus, um neue Datensätze zu erstellen, `ds_features_train` und `ds_features_test`, die VGG-extrahierte Features anstelle der Originalbilder enthalten.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -713,9 +723,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Wir haben die Konstruktion `.take(50)` verwendet, um die Datensatzgröße zu begrenzen und unsere Demonstration zu beschleunigen. Natürlich können Sie dieses Experiment auch mit dem vollständigen Datensatz durchführen.\n",
|
||||
"Wir haben die Konstruktion `.take(50)` verwendet, um die Datensatzgröße zu begrenzen und unsere Demonstration zu beschleunigen. Natürlich können Sie dieses Experiment mit dem vollständigen Datensatz durchführen.\n",
|
||||
"\n",
|
||||
"Jetzt, da wir einen Datensatz mit extrahierten Merkmalen haben, können wir einen einfachen dichten Klassifikator trainieren, um zwischen Katzen und Hunden zu unterscheiden. Dieses Netzwerk nimmt einen Merkmalsvektor der Form (7,7,512) und erzeugt eine Ausgabe, die entweder einem Hund oder einer Katze entspricht. Da es sich um eine binäre Klassifikation handelt, verwenden wir die `sigmoid`-Aktivierungsfunktion und den `binary_crossentropy`-Loss.\n"
|
||||
"Da wir jetzt einen Datensatz mit extrahierten Merkmalen haben, können wir einen einfachen dichten Klassifikator trainieren, um zwischen Katzen und Hunden zu unterscheiden. Dieses Netzwerk nimmt einen Merkmalsvektor der Form (7,7,512) auf und erzeugt eine Ausgabe, die entweder einem Hund oder einer Katze entspricht. Da es sich um eine binäre Klassifikation handelt, verwenden wir die Aktivierungsfunktion `sigmoid` und den Verlust `binary_crossentropy`.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -744,13 +754,13 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Das Ergebnis ist großartig, wir können mit fast 95% Wahrscheinlichkeit zwischen einer Katze und einem Hund unterscheiden! Allerdings haben wir diesen Ansatz nur an einem Teil aller Bilder getestet, da die manuelle Merkmalsextraktion scheinbar viel Zeit in Anspruch nimmt.\n",
|
||||
"Das Ergebnis ist großartig, wir können mit fast 95 % Wahrscheinlichkeit zwischen einer Katze und einem Hund unterscheiden! Allerdings haben wir diesen Ansatz nur an einer Teilmenge aller Bilder getestet, da die manuelle Merkmalsextraktion anscheinend viel Zeit in Anspruch nimmt.\n",
|
||||
"\n",
|
||||
"## Transfer Learning mit einem VGG-Netzwerk\n",
|
||||
"## Transferlernen mit einem VGG-Netzwerk\n",
|
||||
"\n",
|
||||
"Wir können das manuelle Vorberechnen der Merkmale auch vermeiden, indem wir das ursprüngliche VGG-16-Netzwerk während des Trainings vollständig nutzen und einen Merkmalsextraktor als erste Schicht zu unserem Netzwerk hinzufügen.\n",
|
||||
"Wir können auch vermeiden, die Merkmale manuell vorab zu berechnen, indem wir das ursprüngliche VGG-16-Netzwerk während des Trainings als Ganzes verwenden, indem wir den Merkmalsextraktor als erste Schicht zu unserem Netzwerk hinzufügen.\n",
|
||||
"\n",
|
||||
"Das Schöne an der Keras-Architektur ist, dass das oben definierte VGG-16-Modell auch als Schicht in einem anderen neuronalen Netzwerk verwendet werden kann! Wir müssen lediglich ein Netzwerk mit einem dichten Klassifikator darauf aufbauen und dann das gesamte Netzwerk mithilfe von Backpropagation trainieren.\n"
|
||||
"Das Schöne an der Keras-Architektur ist, dass das oben definierte VGG-16-Modell auch als Schicht in einem anderen neuronalen Netzwerk verwendet werden kann! Wir müssen nur ein Netzwerk mit einem dichten Klassifikator darauf aufbauen und dann das gesamte Netzwerk mit Backpropagation trainieren.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -794,13 +804,13 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Dieses Modell sieht aus wie ein End-to-End-Klassifikationsnetzwerk, das ein Bild nimmt und die Klasse zurückgibt. Der knifflige Punkt ist jedoch, dass wir möchten, dass VGG16 als Merkmalsextraktor fungiert und nicht neu trainiert wird. Daher müssen wir die **Gewichte des konvolutionalen Merkmalsextraktors einfrieren**. Wir können auf die erste Schicht des Netzwerks zugreifen, indem wir `model.layers[0]` aufrufen, und wir müssen lediglich die Eigenschaft `trainable` auf `False` setzen.\n",
|
||||
"Dieses Modell sieht aus wie ein End-to-End-Klassifizierungsnetzwerk, das ein Bild aufnimmt und die Klasse zurückgibt. Der knifflige Punkt ist jedoch, dass wir möchten, dass VGG16 als Merkmalsextraktor fungiert und nicht neu trainiert wird. Daher müssen wir die **Gewichte des konvolutionalen Merkmalsextraktors einfrieren**. Wir können auf die erste Schicht des Netzwerks zugreifen, indem wir `model.layers[0]` aufrufen, und wir müssen nur die Eigenschaft `trainable` auf `False` setzen.\n",
|
||||
"\n",
|
||||
"> **Hinweis**: Das Einfrieren der Gewichte des Merkmalsextraktors ist notwendig, da ansonsten die untrainierte Klassifikationsschicht die ursprünglichen vortrainierten Gewichte des konvolutionalen Extraktors zerstören könnte.\n",
|
||||
"> **Hinweis**: Das Einfrieren der Gewichte des Merkmalsextraktors ist notwendig, da sonst die untrainierte Klassifikationsschicht die ursprünglich vortrainierten Gewichte des konvolutionalen Extraktors zerstören kann.\n",
|
||||
"\n",
|
||||
"Man kann feststellen, dass, obwohl die Gesamtanzahl der Parameter in unserem Netzwerk etwa 15 Millionen beträgt, wir nur 25.000 Parameter trainieren. Alle anderen Parameter der oberen konvolutionalen Filter sind vortrainiert. Das ist gut, da wir eine kleinere Anzahl von Parametern mit einer kleineren Anzahl von Beispielen feinabstimmen können.\n",
|
||||
"Sie werden bemerken, dass während die Gesamtzahl der Parameter in unserem Netzwerk etwa 15 Millionen beträgt, wir nur 25k Parameter trainieren. Alle anderen Parameter der obersten Konvolutionsfilter sind vortrainiert. Das ist gut, da wir dadurch in der Lage sind, eine kleinere Anzahl von Parametern mit einer kleineren Anzahl von Beispielen feinzujustieren.\n",
|
||||
"\n",
|
||||
"Wir werden nun unser Netzwerk trainieren und sehen, wie gut wir werden können. Rechnen Sie mit einer ziemlich langen Laufzeit und machen Sie sich keine Sorgen, wenn die Ausführung für einige Zeit eingefroren zu sein scheint.\n"
|
||||
"Wir werden jetzt unser Netzwerk trainieren und sehen, wie gut wir werden können. Erwarten Sie eine eher lange Laufzeit und machen Sie sich keine Sorgen, wenn die Ausführung für einige Zeit eingefroren zu sein scheint.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -825,11 +835,11 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Es sieht so aus, als hätten wir einen ziemlich genauen Katzen-gegen-Hunde-Klassifikator erhalten!\n",
|
||||
"Es sieht so aus, als hätten wir einen vernünftig genauen Katzen-gegen-Hunde-Klassifikator erhalten! \n",
|
||||
"\n",
|
||||
"## Speichern und Laden des Modells\n",
|
||||
"\n",
|
||||
"Sobald wir das Modell trainiert haben, können wir die Modellarchitektur und die trainierten Gewichte in einer Datei speichern, um sie später zu verwenden:\n"
|
||||
"Sobald wir das Modell trainiert haben, können wir die Modellarchitektur und die trainierten Gewichte zur späteren Verwendung in einer Datei speichern:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -853,7 +863,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Wir können das Modell jederzeit aus der Datei laden. Dies könnte nützlich sein, falls das nächste Experiment das Modell zerstört - Sie müssten nicht von vorne beginnen.\n"
|
||||
"Wir können das Modell dann jederzeit aus einer Datei laden. Das kann nützlich sein, falls das nächste Experiment das Modell zerstört – dann müssten Sie nicht von Grund auf neu beginnen.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -869,15 +879,15 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Feinabstimmung des Transfer-Lernens\n",
|
||||
"## Feinabstimmung des Transferlernens\n",
|
||||
"\n",
|
||||
"Im vorherigen Abschnitt haben wir die finale Klassifikationsschicht trainiert, um Bilder in unserem eigenen Datensatz zu klassifizieren. Allerdings haben wir den Feature-Extraktor nicht neu trainiert, und unser Modell hat sich auf die Merkmale verlassen, die es aus den ImageNet-Daten gelernt hat. Wenn sich Ihre Objekte optisch stark von gewöhnlichen ImageNet-Bildern unterscheiden, könnte diese Kombination von Merkmalen nicht optimal funktionieren. Daher macht es Sinn, auch die Faltungsschichten zu trainieren.\n",
|
||||
"Im vorherigen Abschnitt haben wir die letzte Klassifikatorschicht trainiert, um Bilder in unserem eigenen Datensatz zu klassifizieren. Allerdings haben wir den Merkmalsextraktor nicht erneut trainiert, und unser Modell basierte auf den Merkmalen, die das Modell auf ImageNet-Daten gelernt hat. Wenn sich Ihre Objekte visuell von den gewöhnlichen ImageNet-Bildern unterscheiden, könnte diese Kombination von Merkmalen nicht optimal funktionieren. Daher ist es sinnvoll, auch die Faltungsschichten zu trainieren.\n",
|
||||
"\n",
|
||||
"Um dies zu tun, können wir die Parameter der Faltungsfilter, die wir zuvor eingefroren haben, wieder freigeben.\n",
|
||||
"Dazu können wir die zuvor eingefrorenen Parameter der Faltungsfilter wieder freigeben.\n",
|
||||
"\n",
|
||||
"> **Hinweis:** Es ist wichtig, dass Sie die Parameter zuerst einfrieren und mehrere Trainings-Epochen durchführen, um die Gewichte in der Klassifikationsschicht zu stabilisieren. Wenn Sie direkt mit einem End-to-End-Netzwerk mit freigegebenen Parametern beginnen, können große Fehler die vortrainierten Gewichte in den Faltungsschichten zerstören.\n",
|
||||
"> **Hinweis:** Es ist wichtig, dass Sie zuerst die Parameter einfrieren und mehrere Trainings-Epochen durchführen, um die Gewichte in der Klassifikationsschicht zu stabilisieren. Wenn Sie sofort das gesamte Netzwerk mit freigegebenen Parametern trainieren, können große Fehler die vortrainierten Gewichte in den Faltungsschichten zerstören.\n",
|
||||
"\n",
|
||||
"Unser konvolutionales VGG-16-Modell befindet sich in der ersten Schicht und besteht selbst aus vielen Schichten. Wir können uns seine Struktur ansehen:\n"
|
||||
"Unser konvolutionales VGG-16-Modell befindet sich innerhalb der ersten Schicht und besteht selbst aus vielen Schichten. Wir können seine Struktur ansehen:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -946,7 +956,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Wir können alle Schichten der konvolutionalen Basis auftauen:\n"
|
||||
"Wir können alle Schichten der Faltungsbasis auftauen:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -962,7 +972,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Allerdings ist es keine gute Idee, alle auf einmal aufzutauen. Wir können zunächst nur einige der letzten Schichten von Convolutionen auftauen, da sie höherwertige Muster enthalten, die für unsere Bilder relevant sind. Zum Beispiel können wir zu Beginn alle Schichten außer den letzten 4 einfrieren:\n"
|
||||
"Es ist jedoch keine gute Idee, sie alle auf einmal aufzutauen. Wir können zunächst nur einige wenige der letzten Faltungsschichten auftauen, da sie höherstufige Muster enthalten, die für unsere Bilder relevant sind. Zum Beispiel können wir zu Beginn alle Schichten einfrieren, außer den letzten 4: \n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1001,11 +1011,11 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Beobachten Sie, dass die Anzahl der trainierbaren Parameter deutlich gestiegen ist, aber sie liegt immer noch bei etwa 50 % aller Parameter.\n",
|
||||
"Beachten Sie, dass die Anzahl der trainierbaren Parameter deutlich zugenommen hat, aber immer noch etwa 50 % aller Parameter beträgt.\n",
|
||||
"\n",
|
||||
"Nach dem Entsperren können wir ein paar weitere Trainings-Epochen durchführen (in unserem Beispiel machen wir nur eine). Sie können auch eine niedrigere Lernrate wählen, um den Einfluss auf die vortrainierten Gewichte zu minimieren. Allerdings können Sie selbst bei einer niedrigen Lernrate damit rechnen, dass die Genauigkeit zu Beginn des Trainings sinkt, bevor sie schließlich ein etwas höheres Niveau erreicht als im Fall von fixierten Gewichten.\n",
|
||||
"Nach dem Entfrieren können wir noch ein paar weitere Trainings-Epochen durchführen (in unserem Beispiel werden wir nur eine machen). Sie können auch eine niedrigere Lernrate wählen, um die Auswirkungen auf die vortrainierten Gewichte zu minimieren. Allerdings können Sie selbst bei niedriger Lernrate am Anfang des Trainings einen Genauigkeitsabfall erwarten, bis schließlich ein etwas höheres Niveau erreicht wird als im Fall fester Gewichte.\n",
|
||||
"\n",
|
||||
"> **Hinweis:** Dieses Training verläuft deutlich langsamer, da die Gradienten durch viele Schichten des Netzwerks zurückpropagiert werden müssen!\n"
|
||||
"> **Hinweis:** Dieses Training verläuft viel langsamer, weil wir die Gradienten durch viele Schichten des Netzwerks zurückpropagieren müssen!\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1029,18 +1039,18 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Wir werden wahrscheinlich eine höhere Trainingsgenauigkeit erreichen, da wir ein leistungsstärkeres Netzwerk mit mehr Parametern verwenden. Die Validierungsgenauigkeit wird jedoch nicht im gleichen Maße steigen.\n",
|
||||
"Wir werden wahrscheinlich eine höhere Trainingsgenauigkeit erreichen, weil wir ein leistungsfähigeres Netzwerk mit mehr Parametern verwenden, aber die Validierungsgenauigkeit würde nicht so stark steigen.\n",
|
||||
"\n",
|
||||
"Du kannst gerne ein paar weitere Schichten des Netzwerks freigeben und weiter trainieren, um zu sehen, ob du eine höhere Genauigkeit erzielen kannst!\n"
|
||||
"Fühlen Sie sich frei, ein paar weitere Schichten des Netzwerks freizugeben und mehr zu trainieren, um zu sehen, ob Sie eine höhere Genauigkeit erreichen können!\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Andere Modelle der Computer Vision\n",
|
||||
"## Andere Computer-Vision-Modelle\n",
|
||||
"\n",
|
||||
"VGG-16 ist eine der einfachsten Architekturen für Computer Vision. Keras bietet viele weitere vortrainierte Netzwerke an. Die am häufigsten verwendeten darunter sind die **ResNet**-Architekturen, entwickelt von Microsoft, und **Inception** von Google. Zum Beispiel werfen wir einen Blick auf die Architektur des einfachsten ResNet-50-Modells (ResNet ist eine Familie von Modellen mit unterschiedlicher Tiefe. Sie können mit ResNet-152 experimentieren, wenn Sie sehen möchten, wie ein wirklich tiefes Modell aussieht):\n"
|
||||
"VGG-16 ist eine der einfachsten Computer-Vision-Architekturen. Keras stellt viele weitere vortrainierte Netzwerke bereit. Die am häufigsten verwendeten darunter sind die **ResNet**-Architekturen, entwickelt von Microsoft, und **Inception** von Google. Zum Beispiel untersuchen wir die Architektur des einfachsten ResNet-50-Modells (ResNet ist eine Familie von Modellen mit unterschiedlicher Tiefe, du kannst auch ResNet-152 ausprobieren, wenn du sehen möchtest, wie ein wirklich tiefes Modell aussieht):\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1442,11 +1452,11 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Wie Sie sehen können, enthält das Modell die gleichen vertrauten Bausteine: Convolutional Layers, Pooling Layers und einen abschließenden dichten Klassifikator. Wir können dieses Modell genau so verwenden, wie wir VGG-16 für Transfer Learning genutzt haben. Sie können mit dem obigen Code experimentieren, indem Sie verschiedene ResNet-Modelle als Basismodell verwenden und beobachten, wie sich die Genauigkeit verändert.\n",
|
||||
"Wie Sie sehen können, enthält das Modell dieselben vertrauten Bausteine: Faltungsschichten, Pooling-Schichten und den abschließenden dichten Klassifikator. Wir können dieses Modell auf genau die gleiche Weise verwenden wie das VGG-16 für Transferlernen. Sie können gerne mit dem obigen Code experimentieren, verschiedene ResNet-Modelle als Basis verwenden und beobachten, wie sich die Genauigkeit verändert.\n",
|
||||
"\n",
|
||||
"## Batch-Normalisierung\n",
|
||||
"\n",
|
||||
"Dieses Netzwerk enthält noch eine weitere Art von Schicht: **Batch-Normalisierung**. Die Idee der Batch-Normalisierung besteht darin, die Werte, die durch das neuronale Netzwerk fließen, in den richtigen Bereich zu bringen. Normalerweise funktionieren neuronale Netzwerke am besten, wenn alle Werte im Bereich von [-1,1] oder [0,1] liegen. Aus diesem Grund skalieren/normalisieren wir unsere Eingabedaten entsprechend. Während des Trainings eines tiefen Netzwerks kann es jedoch passieren, dass Werte signifikant außerhalb dieses Bereichs liegen, was das Training erschwert. Die Batch-Normalisierungsschicht berechnet den Durchschnitt und die Standardabweichung für alle Werte des aktuellen Minibatches und verwendet diese, um das Signal zu normalisieren, bevor es durch eine Schicht des neuronalen Netzwerks geleitet wird. Dies verbessert die Stabilität tiefer Netzwerke erheblich.\n"
|
||||
"Dieses Netzwerk enthält noch einen weiteren Schichttyp: **Batch-Normalisierung**. Die Idee der Batch-Normalisierung ist es, Werte, die durch das neuronale Netzwerk fließen, in den richtigen Bereich zu bringen. Normalerweise arbeiten neuronale Netzwerke am besten, wenn alle Werte im Bereich von [-1,1] oder [0,1] liegen, weshalb wir unsere Eingabedaten entsprechend skalieren/normalisieren. Während des Trainings eines tiefen Netzwerks kann es jedoch vorkommen, dass Werte deutlich außerhalb dieses Bereichs liegen, was das Training problematisch macht. Die Batch-Normalisierungsschicht berechnet den Mittelwert und die Standardabweichung aller Werte des aktuellen Minibatches und verwendet diese, um das Signal zu normalisieren, bevor es durch eine Schicht des neuronalen Netzwerks geleitet wird. Dies verbessert die Stabilität tiefer Netzwerke erheblich.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1455,16 +1465,16 @@
|
|||
"source": [
|
||||
"## Fazit\n",
|
||||
"\n",
|
||||
"Mit Transfer Learning konnten wir schnell einen Klassifikator für unsere benutzerdefinierte Objektklassifizierungsaufgabe erstellen und eine hohe Genauigkeit erreichen. Allerdings war dieses Beispiel nicht ganz fair, da das ursprüngliche VGG-16-Netzwerk bereits darauf trainiert war, Katzen und Hunde zu erkennen. Wir haben also lediglich die meisten Muster wiederverwendet, die bereits im Netzwerk vorhanden waren. Bei exotischeren, domänenspezifischen Objekten, wie Details einer Produktionslinie in einer Fabrik oder verschiedenen Baumblättern, können Sie mit einer geringeren Genauigkeit rechnen.\n",
|
||||
"Mithilfe von Transferlernen konnten wir schnell einen Klassifikator für unsere benutzerdefinierte Objekterkennungsaufgabe erstellen und eine hohe Genauigkeit erzielen. Dieses Beispiel war jedoch nicht ganz fair, da das ursprüngliche VGG-16-Netzwerk bereits vortrainiert war, Katzen und Hunde zu erkennen, und wir daher nur die meisten Muster wiederverwendet haben, die bereits im Netzwerk vorhanden waren. Bei exotischeren, domänenspezifischen Objekten wie Details an Produktionslinien in einer Fabrik oder verschiedenen Baumblättern können Sie mit einer geringeren Genauigkeit rechnen.\n",
|
||||
"\n",
|
||||
"Sie können sehen, dass komplexere Aufgaben, die wir jetzt lösen, eine höhere Rechenleistung erfordern und nicht einfach auf der CPU gelöst werden können. In der nächsten Einheit werden wir versuchen, eine leichtere Implementierung zu verwenden, um dasselbe Modell mit geringeren Rechenressourcen zu trainieren, was nur zu einer leicht niedrigeren Genauigkeit führt.\n"
|
||||
"Sie können sehen, dass komplexere Aufgaben, die wir jetzt lösen, höhere Rechenleistung erfordern und nicht so einfach auf der CPU gelöst werden können. In der nächsten Einheit werden wir versuchen, eine leichtere Implementierung zu verwenden, um dasselbe Modell mit geringeren Rechenressourcen zu trainieren, was nur zu einer geringfügig niedrigeren Genauigkeit führt. \n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**Haftungsausschluss**: \nDieses Dokument wurde mit dem KI-Übersetzungsdienst [Co-op Translator](https://github.com/Azure/co-op-translator) übersetzt. Obwohl wir uns um Genauigkeit bemühen, beachten Sie bitte, dass automatisierte Übersetzungen Fehler oder Ungenauigkeiten enthalten können. Das Originaldokument in seiner ursprünglichen Sprache sollte als maßgebliche Quelle betrachtet werden. Für kritische Informationen wird eine professionelle menschliche Übersetzung empfohlen. Wir übernehmen keine Haftung für Missverständnisse oder Fehlinterpretationen, die sich aus der Nutzung dieser Übersetzung ergeben.\n"
|
||||
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**Haftungsausschluss**:\nDieses Dokument wurde mit dem KI-Übersetzungsdienst [Co-op Translator](https://github.com/Azure/co-op-translator) übersetzt. Obwohl wir uns um Genauigkeit bemühen, beachten Sie bitte, dass automatisierte Übersetzungen Fehler oder Ungenauigkeiten enthalten können. Das Originaldokument in seiner Ursprungssprache gilt als maßgebliche Quelle. Bei kritischen Informationen wird eine professionelle menschliche Übersetzung empfohlen. Wir übernehmen keine Haftung für Missverständnisse oder Fehlinterpretationen, die aus der Verwendung dieser Übersetzung entstehen.\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
|
|
@ -1485,12 +1495,6 @@
|
|||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.8.10"
|
||||
},
|
||||
"coopTranslator": {
|
||||
"original_hash": "c189abc107848f96051085cc30945129",
|
||||
"translation_date": "2025-08-31T15:58:21+00:00",
|
||||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb",
|
||||
"language_code": "de"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
|
|
|||
|
|
@ -1,69 +1,73 @@
|
|||
# Verarbeitung natürlicher Sprache
|
||||
|
||||

|
||||

|
||||
|
||||
In diesem Abschnitt konzentrieren wir uns darauf, neuronale Netzwerke für Aufgaben im Bereich der **Verarbeitung natürlicher Sprache (Natural Language Processing, NLP)** einzusetzen. Es gibt viele NLP-Probleme, die wir möchten, dass Computer lösen können:
|
||||
In diesem Abschnitt konzentrieren wir uns darauf, neuronale Netze für Aufgaben im Zusammenhang mit **Natural Language Processing (NLP)** einzusetzen. Es gibt viele NLP-Probleme, die Computer lösen sollen:
|
||||
|
||||
* **Textklassifikation** ist ein typisches Klassifikationsproblem, das sich auf Textsequenzen bezieht. Beispiele sind das Klassifizieren von E-Mails als Spam oder Nicht-Spam oder das Kategorisieren von Artikeln in Sport, Wirtschaft, Politik usw. Auch bei der Entwicklung von Chatbots müssen wir oft verstehen, was ein Benutzer sagen wollte – in diesem Fall handelt es sich um **Intent-Klassifikation**. Häufig müssen wir bei der Intent-Klassifikation mit vielen Kategorien umgehen.
|
||||
* **Sentiment-Analyse** ist ein typisches Regressionsproblem, bei dem wir einer Zahl (einem Sentiment) zuordnen müssen, wie positiv/negativ die Bedeutung eines Satzes ist. Eine fortgeschrittenere Version der Sentiment-Analyse ist die **aspektbasierte Sentiment-Analyse** (ABSA), bei der wir das Sentiment nicht dem gesamten Satz, sondern verschiedenen Teilen davon (Aspekten) zuordnen, z. B. *In diesem Restaurant mochte ich die Küche, aber die Atmosphäre war schrecklich*.
|
||||
* **Erkennung benannter Entitäten** (Named Entity Recognition, NER) bezieht sich auf das Problem, bestimmte Entitäten aus Text zu extrahieren. Zum Beispiel müssen wir verstehen, dass in der Phrase *Ich muss morgen nach Paris fliegen* das Wort *morgen* ein DATUM und *Paris* ein ORT ist.
|
||||
* **Schlüsselwortextraktion** ist ähnlich wie NER, aber hier müssen wir automatisch Wörter extrahieren, die für die Bedeutung des Satzes wichtig sind, ohne vorheriges Training für spezifische Entitätstypen.
|
||||
* **Text-Clustering** kann nützlich sein, wenn wir ähnliche Sätze gruppieren möchten, z. B. ähnliche Anfragen in technischen Supportgesprächen.
|
||||
* **Fragebeantwortung** bezieht sich auf die Fähigkeit eines Modells, eine spezifische Frage zu beantworten. Das Modell erhält einen Textabschnitt und eine Frage als Eingaben und muss eine Stelle im Text angeben, an der die Antwort auf die Frage enthalten ist (oder manchmal die Antwort generieren).
|
||||
* **Textgenerierung** ist die Fähigkeit eines Modells, neuen Text zu generieren. Dies kann als Klassifikationsaufgabe betrachtet werden, bei der der nächste Buchstabe/das nächste Wort basierend auf einem *Textprompt* vorhergesagt wird. Fortgeschrittene Textgenerierungsmodelle wie GPT-3 können andere NLP-Aufgaben wie Klassifikation mithilfe einer Technik namens [Prompt Programming](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) oder [Prompt Engineering](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29) lösen.
|
||||
* **Textzusammenfassung** ist eine Technik, bei der wir möchten, dass ein Computer einen langen Text "liest" und ihn in wenigen Sätzen zusammenfasst.
|
||||
* **Maschinelle Übersetzung** kann als Kombination aus Textverständnis in einer Sprache und Textgenerierung in einer anderen betrachtet werden.
|
||||
* **Textklassifikation** ist ein typisches Klassifikationsproblem im Bereich von Textsequenzen. Beispiele sind das Klassifizieren von E-Mails als Spam oder kein Spam oder das Kategorisieren von Artikeln in Sport, Wirtschaft, Politik usw. Beim Entwickeln von Chatbots müssen wir oft verstehen, was ein Benutzer sagen wollte – in diesem Fall handelt es sich um **Intent-Klassifikation**. Hierbei müssen wir oft mit vielen Kategorien umgehen.
|
||||
* **Sentiment-Analyse** ist ein typisches Regressionsproblem, bei dem wir eine Zahl (ein Sentiment) zuordnen müssen, die angibt, wie positiv oder negativ die Bedeutung eines Satzes ist. Eine fortgeschrittenere Version der Sentiment-Analyse ist die **aspektbasierte Sentiment-Analyse** (ABSA), bei der wir das Sentiment nicht auf den ganzen Satz, sondern auf verschiedene Teile davon (Aspekte) beziehen, z. B. *In diesem Restaurant mochte ich die Küche, aber die Atmosphäre war schrecklich*.
|
||||
* **Named Entity Recognition** (NER) bezeichnet das Problem, bestimmte Entitäten aus Texten zu extrahieren. Beispielsweise müssen wir verstehen, dass im Satz *Ich muss morgen nach Paris fliegen* das Wort *morgen* ein DATUM bezeichnet und *Paris* ein ORT ist.
|
||||
* **Keyword-Extraktion** ähnelt NER, jedoch müssen automatisch die für die Bedeutung wichtigen Wörter extrahiert werden, ohne vorheriges Training für spezifische Entitätstypen.
|
||||
* **Text-Clustering** kann nützlich sein, wenn wir ähnliche Sätze gruppieren möchten, z. B. ähnliche Anfragen in Support-Gesprächen.
|
||||
* **Fragebeantwortung** bezeichnet die Fähigkeit eines Modells, auf eine gegebene Frage zu antworten. Das Modell erhält einen Textabschnitt und eine Frage als Eingabe und muss den Textabschnitt angeben, in dem die Antwort auf die Frage enthalten ist (oder manchmal die Antwort selbst generieren).
|
||||
* **Textgenerierung** ist die Fähigkeit eines Modells, neuen Text zu erzeugen. Dies kann als Klassifikationsaufgabe betrachtet werden, bei der das nächste Zeichen/Wort basierend auf einem *Textprompt* vorhergesagt wird. Fortgeschrittene Textgenerierungsmodelle wie GPT-3 können andere NLP-Aufgaben wie Klassifikation mithilfe von Techniken wie [Prompt-Programmierung](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) oder [Prompt-Engineering](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29) lösen.
|
||||
* **Textzusammenfassung** ist eine Technik, bei der ein Computer lange Texte „liest“ und sie in wenigen Sätzen zusammenfasst.
|
||||
* **Maschinelle Übersetzung** kann als Kombination aus Textverständnis in einer Sprache und Textgenerierung in einer anderen Sprache betrachtet werden.
|
||||
|
||||
Anfangs wurden die meisten NLP-Aufgaben mit traditionellen Methoden wie Grammatiken gelöst. Zum Beispiel wurden in der maschinellen Übersetzung Parser verwendet, um einen Ausgangssatz in einen Syntaxbaum zu transformieren, dann wurden semantische Strukturen höherer Ebene extrahiert, um die Bedeutung des Satzes darzustellen, und basierend auf dieser Bedeutung und der Grammatik der Zielsprache wurde das Ergebnis generiert. Heutzutage werden viele NLP-Aufgaben effektiver mit neuronalen Netzwerken gelöst.
|
||||
Anfangs wurden die meisten NLP-Aufgaben mit traditionellen Methoden wie Grammatiken gelöst. Beispielsweise wurden bei der maschinellen Übersetzung Parser verwendet, um einen Satz in einen Syntaxbaum zu transformieren, daraus höhere semantische Strukturen extrahiert, um die Bedeutung des Satzes darzustellen, und basierend auf dieser Bedeutung und der Grammatik der Zielsprache das Ergebnis generiert. Heutzutage werden viele NLP-Aufgaben effektiver mit neuronalen Netzen gelöst.
|
||||
|
||||
> Viele klassische NLP-Methoden sind in der Python-Bibliothek [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org) implementiert. Es gibt ein großartiges [NLTK-Buch](https://www.nltk.org/book/), das online verfügbar ist und zeigt, wie verschiedene NLP-Aufgaben mit NLTK gelöst werden können.
|
||||
> Viele klassische NLP-Methoden sind in der Python-Bibliothek [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org) implementiert. Es gibt ein großartiges [NLTK-Buch](https://www.nltk.org/book/), das online verfügbar ist und behandelt, wie verschiedene NLP-Aufgaben mit NLTK gelöst werden können.
|
||||
|
||||
In unserem Kurs konzentrieren wir uns hauptsächlich auf die Verwendung neuronaler Netzwerke für NLP und verwenden NLTK, wo es erforderlich ist.
|
||||
In unserem Kurs konzentrieren wir uns hauptsächlich darauf, neuronale Netze für NLP zu verwenden, und wir nutzen NLTK bei Bedarf.
|
||||
|
||||
Wir haben bereits gelernt, wie neuronale Netzwerke für tabellarische Daten und Bilder verwendet werden können. Der Hauptunterschied zwischen diesen Datentypen und Text besteht darin, dass Text eine Sequenz variabler Länge ist, während die Eingabegröße bei Bildern im Voraus bekannt ist. Während konvolutionale Netzwerke Muster aus Eingabedaten extrahieren können, sind Muster in Texten komplexer. Zum Beispiel kann eine Verneinung vom Subjekt durch viele Wörter getrennt sein (z. B. *Ich mag keine Orangen* vs. *Ich mag diese großen bunten leckeren Orangen nicht*), und das sollte dennoch als ein Muster interpretiert werden. Daher müssen wir zur Verarbeitung von Sprache neue Arten von neuronalen Netzwerken einführen, wie z. B. *rekurrente Netzwerke* und *Transformers*.
|
||||
Wir haben bereits gelernt, neuronale Netze für tabellarische Daten und Bilder zu verwenden. Der Hauptunterschied zwischen diesen Datenarten und Text ist, dass Text eine Sequenz variabler Länge ist, während die Eingangsgröße bei Bildern im Voraus bekannt ist. Während konvolutionale Netzwerke Muster aus Eingabedaten extrahieren können, sind Muster im Text komplexer. Zum Beispiel kann die Verneinung vom Subjekt durch viele Wörter beliebig getrennt sein (z. B. *Ich mag keine Orangen* vs. *Ich mag diese großen bunten leckeren Orangen nicht*), und das sollte immer noch als ein Muster interpretiert werden. Um Sprache zu verarbeiten, benötigen wir daher neue Typen von neuronalen Netzen, wie *rekurrente Netze* und *Transformers*.
|
||||
|
||||
## Bibliotheken installieren
|
||||
|
||||
Wenn Sie eine lokale Python-Installation verwenden, um diesen Kurs auszuführen, müssen Sie möglicherweise alle erforderlichen Bibliotheken für NLP mit den folgenden Befehlen installieren:
|
||||
Wenn Sie eine lokale Python-Installation verwenden, um diesen Kurs durchzuführen, müssen Sie möglicherweise alle erforderlichen Bibliotheken für NLP mit den folgenden Befehlen installieren:
|
||||
|
||||
**Für PyTorch**
|
||||
**Für PyTorch**
|
||||
```bash
|
||||
pip install -r requirements-torch.txt
|
||||
```
|
||||
**Für TensorFlow**
|
||||
pip install -r requirements-pytorch.txt
|
||||
```
|
||||
**Für TensorFlow**
|
||||
```bash
|
||||
pip install -r requirements-tf.txt
|
||||
```
|
||||
```
|
||||
|
||||
> Sie können NLP mit TensorFlow auf [Microsoft Learn](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste) ausprobieren.
|
||||
|
||||
## GPU-Warnung
|
||||
|
||||
In diesem Abschnitt werden wir in einigen Beispielen recht große Modelle trainieren.
|
||||
* **Verwenden Sie einen Computer mit GPU-Unterstützung**: Es wird empfohlen, Ihre Notebooks auf einem Computer mit GPU-Unterstützung auszuführen, um die Wartezeiten beim Arbeiten mit großen Modellen zu reduzieren.
|
||||
* **GPU-Speicherbeschränkungen**: Das Ausführen auf einer GPU kann dazu führen, dass der GPU-Speicher ausgeht, insbesondere beim Training großer Modelle.
|
||||
* **GPU-Speicherverbrauch**: Die Menge des während des Trainings verbrauchten GPU-Speichers hängt von verschiedenen Faktoren ab, einschließlich der Minibatch-Größe.
|
||||
* **Minimieren Sie die Minibatch-Größe**: Wenn Sie auf GPU-Speicherprobleme stoßen, sollten Sie die Minibatch-Größe in Ihrem Code reduzieren.
|
||||
* **TensorFlow GPU-Speicherfreigabe**: Ältere Versionen von TensorFlow geben den GPU-Speicher möglicherweise nicht korrekt frei, wenn mehrere Modelle innerhalb eines Python-Kernels trainiert werden. Um den GPU-Speicher effektiv zu verwalten, können Sie TensorFlow so konfigurieren, dass GPU-Speicher nur bei Bedarf zugewiesen wird.
|
||||
* **Code-Einbindung**: Um TensorFlow so einzustellen, dass GPU-Speicher nur bei Bedarf wächst, fügen Sie den folgenden Code in Ihre Notebooks ein:
|
||||
In diesem Abschnitt werden wir einige ziemlich große Modelle trainieren.
|
||||
* **Verwenden Sie einen GPU-fähigen Computer**: Es ist ratsam, Ihre Notebooks auf einem GPU-fähigen Computer auszuführen, um Wartezeiten beim Arbeiten mit großen Modellen zu reduzieren.
|
||||
* **GPU-Speicherbegrenzungen**: Das Ausführen auf einer GPU kann dazu führen, dass der GPU-Speicher ausgeht, insbesondere beim Training großer Modelle.
|
||||
* **GPU-Speicherverbrauch**: Die Menge des während des Trainings verbrauchten GPU-Speichers hängt von verschiedenen Faktoren ab, einschließlich der Minibatch-Größe.
|
||||
* **Minibatch-Größe minimieren**: Wenn Sie auf Probleme mit dem GPU-Speicher stoßen, ziehen Sie in Erwägung, die Minibatch-Größe in Ihrem Code zu reduzieren.
|
||||
* **GPU-Speicherfreigabe in TensorFlow**: Ältere TensorFlow-Versionen geben den GPU-Speicher beim Training mehrerer Modelle in einem Python-Kernel möglicherweise nicht korrekt frei. Um den GPU-Speicher effizient zu verwalten, können Sie TensorFlow so konfigurieren, dass der GPU-Speicher nur nach Bedarf allokiert wird.
|
||||
* **Codeeinbindung**: Um TensorFlow so einzustellen, dass der GPU-Speicher nur bei Bedarf wächst, fügen Sie den folgenden Code in Ihre Notebooks ein:
|
||||
|
||||
```python
|
||||
physical_devices = tf.config.list_physical_devices('GPU')
|
||||
if len(physical_devices)>0:
|
||||
tf.config.experimental.set_memory_growth(physical_devices[0], True)
|
||||
```
|
||||
```
|
||||
|
||||
Wenn Sie daran interessiert sind, NLP aus der Perspektive des klassischen maschinellen Lernens zu lernen, besuchen Sie [diese Lektionenreihe](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP).
|
||||
Wenn Sie NLP aus einer klassischen ML-Perspektive kennenlernen möchten, besuchen Sie [diese Lektionensammlung](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP)
|
||||
|
||||
## In diesem Abschnitt
|
||||
In diesem Abschnitt werden wir lernen:
|
||||
In diesem Abschnitt lernen wir:
|
||||
|
||||
* [Text als Tensoren darstellen](13-TextRep/README.md)
|
||||
* [Wort-Embeddings](14-Emdeddings/README.md)
|
||||
* [Sprachmodellierung](15-LanguageModeling/README.md)
|
||||
* [Rekurrente neuronale Netzwerke](16-RNN/README.md)
|
||||
* [Generative Netzwerke](17-GenerativeNetworks/README.md)
|
||||
* [Transformers](18-Transformers/README.md)
|
||||
* [Text als Tensoren darstellen](13-TextRep/README.md)
|
||||
* [Wort-Einbettungen](14-Emdeddings/README.md)
|
||||
* [Sprachmodellierung](15-LanguageModeling/README.md)
|
||||
* [Rekurrente neuronale Netze](16-RNN/README.md)
|
||||
* [Generative Netzwerke](17-GenerativeNetworks/README.md)
|
||||
* [Transformers](18-Transformers/README.md)
|
||||
|
||||
**Haftungsausschluss**:
|
||||
Dieses Dokument wurde mit dem KI-Übersetzungsdienst [Co-op Translator](https://github.com/Azure/co-op-translator) übersetzt. Obwohl wir uns um Genauigkeit bemühen, weisen wir darauf hin, dass automatisierte Übersetzungen Fehler oder Ungenauigkeiten enthalten können. Das Originaldokument in seiner ursprünglichen Sprache sollte als maßgebliche Quelle betrachtet werden. Für kritische Informationen wird eine professionelle menschliche Übersetzung empfohlen. Wir übernehmen keine Haftung für Missverständnisse oder Fehlinterpretationen, die aus der Nutzung dieser Übersetzung entstehen.
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**Haftungsausschluss**:
|
||||
Dieses Dokument wurde mit dem KI-Übersetzungsdienst [Co-op Translator](https://github.com/Azure/co-op-translator) übersetzt. Obwohl wir uns um Genauigkeit bemühen, beachten Sie bitte, dass automatisierte Übersetzungen Fehler oder Ungenauigkeiten enthalten können. Das Originaldokument in seiner Ursprungssprache gilt als maßgebliche Quelle. Bei kritischen Informationen wird eine professionelle menschliche Übersetzung empfohlen. Wir übernehmen keine Haftung für Missverständnisse oder Fehlinterpretationen, die aus der Verwendung dieser Übersetzung entstehen.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -5,6 +5,12 @@
|
|||
"source_file": "AGENTS.md",
|
||||
"language_code": "el"
|
||||
},
|
||||
"CONTRIBUTING.md": {
|
||||
"original_hash": "c6fd7e781b67111a90abd166d0ce4aa0",
|
||||
"translation_date": "2026-07-08T15:26:17+00:00",
|
||||
"source_file": "CONTRIBUTING.md",
|
||||
"language_code": "el"
|
||||
},
|
||||
"README.md": {
|
||||
"original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b",
|
||||
"translation_date": "2026-04-06T15:43:24+00:00",
|
||||
|
|
@ -17,6 +23,19 @@
|
|||
"source_file": "SECURITY.md",
|
||||
"language_code": "el"
|
||||
},
|
||||
"__translation_failures__": {
|
||||
"lessons/sketchnotes/LICENSE.md": {
|
||||
"original_hash": "45ab63a2cd8f5faef6c9b150618837a4",
|
||||
"source_file": "lessons/sketchnotes/LICENSE.md",
|
||||
"language_code": "el",
|
||||
"failure_date": "2026-07-08T15:24:46+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-29T09:31:40+00:00",
|
||||
|
|
@ -54,8 +73,8 @@
|
|||
"language_code": "el"
|
||||
},
|
||||
"examples/README.md": {
|
||||
"original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7",
|
||||
"translation_date": "2025-10-03T11:30:48+00:00",
|
||||
"original_hash": "7883d52c2e2a221e0b07a7b112a149b9",
|
||||
"translation_date": "2026-07-08T15:19:36+00:00",
|
||||
"source_file": "examples/README.md",
|
||||
"language_code": "el"
|
||||
},
|
||||
|
|
@ -66,8 +85,8 @@
|
|||
"language_code": "el"
|
||||
},
|
||||
"lessons/0-course-setup/how-to-run.md": {
|
||||
"original_hash": "a4717bd9103b9f6cd84d534b83534689",
|
||||
"translation_date": "2026-01-15T14:36:53+00:00",
|
||||
"original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1",
|
||||
"translation_date": "2026-07-08T15:19:57+00:00",
|
||||
"source_file": "lessons/0-course-setup/how-to-run.md",
|
||||
"language_code": "el"
|
||||
},
|
||||
|
|
@ -191,6 +210,12 @@
|
|||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md",
|
||||
"language_code": "el"
|
||||
},
|
||||
"lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": {
|
||||
"original_hash": "99b816b6a4957ef4100cee4c4221dff9",
|
||||
"translation_date": "2026-07-08T15:08:26+00:00",
|
||||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb",
|
||||
"language_code": "el"
|
||||
},
|
||||
"lessons/4-ComputerVision/08-TransferLearning/lab/README.md": {
|
||||
"original_hash": "7765935c35fcee69b9fe2d0cfd6963e2",
|
||||
"translation_date": "2025-08-29T08:50:39+00:00",
|
||||
|
|
@ -330,8 +355,8 @@
|
|||
"language_code": "el"
|
||||
},
|
||||
"lessons/5-NLP/README.md": {
|
||||
"original_hash": "8ef02a9318257ea140ed3ed74442096d",
|
||||
"translation_date": "2025-08-29T09:16:04+00:00",
|
||||
"original_hash": "038df6f1a73e49f6430740da083bfd6d",
|
||||
"translation_date": "2026-07-08T15:20:26+00:00",
|
||||
"source_file": "lessons/5-NLP/README.md",
|
||||
"language_code": "el"
|
||||
},
|
||||
|
|
@ -355,7 +380,7 @@
|
|||
},
|
||||
"lessons/6-Other/23-MultiagentSystems/README.md": {
|
||||
"original_hash": "38a1185ae3d54b180378bbd71ae3ef16",
|
||||
"translation_date": "2025-09-23T08:48:14+00:00",
|
||||
"translation_date": "2026-07-08T15:25:45+00:00",
|
||||
"source_file": "lessons/6-Other/23-MultiagentSystems/README.md",
|
||||
"language_code": "el"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -0,0 +1,29 @@
|
|||
# Συνεισφορά στο AI-For-Beginners
|
||||
|
||||
Σας ευχαριστούμε για το ενδιαφέρον σας να συνεισφέρετε στο AI-For-Beginners! Καλωσορίζουμε μεταφράσεις, διορθώσεις μαθημάτων και διορθώσεις μορφοποίησης.
|
||||
|
||||
## Συμφωνία Άδειας Συνεργάτη της Microsoft (CLA)
|
||||
|
||||
Αυτό το έργο καλωσορίζει συνεισφορές και προτάσεις. Οι περισσότερες συνεισφορές απαιτούν να συμφωνήσετε με μια Συμφωνία Άδειας Συνεργάτη (CLA) που δηλώνει ότι έχετε το δικαίωμα και όντως παραχωρείτε σε εμάς τα δικαιώματα να χρησιμοποιήσουμε τη συνεισφορά σας. Για λεπτομέρειες, επισκεφθείτε το [https://cla.microsoft.com](https://cla.microsoft.com).
|
||||
|
||||
Όταν υποβάλετε ένα Pull Request, ένας CLA-bot θα καθορίσει αυτόματα αν χρειάζεται να παρέχετε μια CLA και θα διακοσμήσει κατάλληλα το PR (π.χ., ετικέτα, σχόλιο). Απλώς ακολουθήστε τις οδηγίες που παρέχει το bot. Θα χρειαστεί να το κάνετε μόνο μια φορά σε όλα τα αποθετήρια που χρησιμοποιούν το CLA μας.
|
||||
|
||||
## Πώς να Συνεισφέρετε
|
||||
|
||||
### 1. Διόρθωση Τυπογραφικών / Σφαλμάτων Κώδικα
|
||||
Αν βρείτε ένα τυπογραφικό λάθος ή σφάλμα σε οποιοδήποτε Jupyter notebook ή αρχείο markdown μαθήματος:
|
||||
1. Φτιάξτε fork το αποθετήριο.
|
||||
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 @@
|
|||
# Παραδείγματα AI για Αρχάριους
|
||||
# Παραδείγματα Φιλικά για Αρχάριους στην ΤΝ
|
||||
|
||||
Καλώς ήρθατε! Αυτός ο κατάλογος περιέχει απλά, αυτόνομα παραδείγματα για να σας βοηθήσει να ξεκινήσετε με την τεχνητή νοημοσύνη και τη μηχανική μάθηση. Κάθε παράδειγμα είναι σχεδιασμένο για αρχάριους, με λεπτομερή σχόλια και βήμα-βήμα εξηγήσεις.
|
||||
Καλώς ήρθατε! Αυτός ο φάκελος περιέχει απλά, αυτόνομα παραδείγματα για να σας βοηθήσουν να ξεκινήσετε με την Τεχνητή Νοημοσύνη και τη μηχανική μάθηση. Κάθε παράδειγμα έχει σχεδιαστεί για να είναι φιλικό προς τους αρχάριους με λεπτομερή σχόλια και επεξηγήσεις βήμα-βήμα.
|
||||
|
||||
## 📚 Επισκόπηση Παραδειγμάτων
|
||||
|
||||
| Παράδειγμα | Περιγραφή | Δυσκολία | Προαπαιτούμενα |
|
||||
|------------|-----------|----------|----------------|
|
||||
| [Hello AI World](../../../examples/01-hello-ai-world.py) | Το πρώτο σας πρόγραμμα AI - απλή αναγνώριση μοτίβων | ⭐ Αρχάριος | Βασικές γνώσεις Python |
|
||||
| [Simple Neural Network](../../../examples/02-simple-neural-network.py) | Δημιουργία ενός νευρωνικού δικτύου από την αρχή | ⭐⭐ Αρχάριος+ | Python, βασικά μαθηματικά |
|
||||
| [Image Classifier](./03-image-classifier.ipynb) | Κατηγοριοποίηση εικόνων με ένα προεκπαιδευμένο μοντέλο | ⭐⭐ Αρχάριος+ | Python, numpy |
|
||||
| [Text Sentiment](../../../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 ή νεότερη). Εγκαταστήστε τα απαραίτητα πακέτα:
|
||||
Βεβαιωθείτε ότι έχετε εγκαταστήσει Python (συνιστάται έκδοση 3.8 ή νεότερη). Εγκαταστήστε τα απαραίτητα πακέτα:
|
||||
|
||||
```bash
|
||||
# For Python scripts
|
||||
# Για σκριπτάκια Python
|
||||
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
|
|||
|
||||
### Εκτέλεση των Παραδειγμάτων
|
||||
|
||||
**Για αρχεία Python (.py):**
|
||||
**Για σενάρια Python (.py αρχεία):**
|
||||
```bash
|
||||
python 01-hello-ai-world.py
|
||||
```
|
||||
|
||||
**Για Jupyter notebooks (.ipynb):**
|
||||
**Για Jupyter σημειωματάρια (.ipynb αρχεία):**
|
||||
```bash
|
||||
jupyter notebook 03-image-classifier.ipynb
|
||||
```
|
||||
|
|
@ -48,24 +48,24 @@ jupyter notebook 03-image-classifier.ipynb
|
|||
|
||||
Συνιστούμε να ακολουθήσετε τα παραδείγματα με τη σειρά:
|
||||
|
||||
1. **Ξεκινήστε με το "Hello AI World"** - Μάθετε τα βασικά της αναγνώρισης μοτίβων
|
||||
2. **Δημιουργήστε ένα Απλό Νευρωνικό Δίκτυο** - Κατανοήστε πώς λειτουργούν τα νευρωνικά δίκτυα
|
||||
3. **Δοκιμάστε τον Κατηγοριοποιητή Εικόνων** - Δείτε την AI σε δράση με πραγματικές εικόνες
|
||||
4. **Αναλύστε Συναισθήματα Κειμένου** - Εξερευνήστε την επεξεργασία φυσικής γλώσσας
|
||||
1. **Ξεκινήστε με το "Hello AI World"** - Μάθετε τα βασικά της αναγνώρισης προτύπων
|
||||
2. **Δημιουργία Απλού Νευρωνικού Δικτύου** - Κατανοήστε πώς λειτουργούν τα νευρωνικά δίκτυα
|
||||
3. **Δοκιμάστε τον Ταξινομητή Εικόνων** - Δείτε την ΤΝ σε δράση με πραγματικές εικόνες
|
||||
4. **Ανάλυση Συναισθήματος Κειμένου** - Εξερευνήστε την επεξεργασία φυσικής γλώσσας
|
||||
|
||||
## 💡 Συμβουλές για Αρχάριους
|
||||
|
||||
- **Διαβάστε προσεκτικά τα σχόλια του κώδικα** - Εξηγούν τι κάνει κάθε γραμμή
|
||||
- **Διαβάστε προσεκτικά τα σχόλια στον κώδικα** - Εξηγούν τι κάνει κάθε γραμμή
|
||||
- **Πειραματιστείτε!** - Δοκιμάστε να αλλάξετε τιμές και δείτε τι συμβαίνει
|
||||
- **Μην ανησυχείτε αν δεν καταλαβαίνετε τα πάντα** - Η μάθηση απαιτεί χρόνο
|
||||
- **Κάντε ερωτήσεις** - Χρησιμοποιήστε τον [Πίνακα Συζητήσεων](https://github.com/microsoft/AI-For-Beginners/discussions)
|
||||
- **Κάντε ερωτήσεις** - Χρησιμοποιήστε το [Discussion board](https://github.com/microsoft/AI-For-Beginners/discussions)
|
||||
|
||||
## 🔗 Επόμενα Βήματα
|
||||
|
||||
Αφού ολοκληρώσετε αυτά τα παραδείγματα, εξερευνήστε το πλήρες πρόγραμμα σπουδών:
|
||||
- [Εισαγωγή στην AI](../lessons/1-Intro/README.md)
|
||||
- [Εισαγωγή στην ΤΝ](../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)
|
||||
|
||||
## 🤝 Συνεισφορά
|
||||
|
|
@ -77,9 +77,11 @@ jupyter notebook 03-image-classifier.ipynb
|
|||
|
||||
---
|
||||
|
||||
*Θυμηθείτε: Κάθε ειδικός ήταν κάποτε αρχάριος. Καλή μάθηση! 🎓*
|
||||
*Θυμηθείτε: Κάθε ειδικός κάποτε ήταν αρχάριος. Καλή μάθηση! 🎓*
|
||||
|
||||
---
|
||||
|
||||
**Αποποίηση Ευθύνης**:
|
||||
Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [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,10 +1,10 @@
|
|||
# Πώς να Εκτελέσετε τον Κώδικα
|
||||
|
||||
Αυτή η διδακτέα ύλη περιέχει πολλά εκτελέσιμα παραδείγματα και εργαστήρια που θα θέλατε να τρέξετε. Για να το κάνετε αυτό, χρειάζεστε τη δυνατότητα εκτέλεσης κώδικα Python σε Jupyter Notebooks που παρέχονται ως μέρος αυτής της διδακτέας ύλης. Έχετε αρκετές επιλογές για να τρέξετε τον κώδικα:
|
||||
Αυτή η ύλη περιέχει πολλά εκτελέσιμα παραδείγματα και εργαστήρια που ίσως θέλετε να τρέξετε. Για να το κάνετε αυτό, χρειάζεστε τη δυνατότητα να εκτελείτε κώδικα Python σε Jupyter Notebooks που παρέχονται ως μέρος αυτής της ύλης. Έχετε αρκετές επιλογές για να τρέξετε τον κώδικα:
|
||||
|
||||
## Εκτέλεση τοπικά στον υπολογιστή σας
|
||||
|
||||
Για να εκτελέσετε τον κώδικα τοπικά στον υπολογιστή σας, απαιτείται μια εγκατάσταση Python. Μία πρόταση είναι να εγκαταστήσετε το **[miniconda](https://conda.io/en/latest/miniconda.html)** - είναι μια αρκετά ελαφριά εγκατάσταση που υποστηρίζει το διαχειριστή πακέτων `conda` για διαφορετικά **εικονικά περιβάλλοντα** Python.
|
||||
Για να τρέξετε τον κώδικα τοπικά στον υπολογιστή σας, απαιτείται εγκατάσταση της Python. Μία σύσταση είναι να εγκαταστήσετε **[miniconda](https://conda.io/en/latest/miniconda.html)** - είναι μια σχετικά ελαφριά εγκατάσταση που υποστηρίζει τον διαχειριστή πακέτων `conda` για διαφορετικά **εικονικά περιβάλλοντα** Python.
|
||||
|
||||
Μετά την εγκατάσταση του miniconda, κλωνοποιήστε το αποθετήριο και δημιουργήστε ένα εικονικό περιβάλλον που θα χρησιμοποιηθεί για αυτό το μάθημα:
|
||||
|
||||
|
|
@ -15,57 +15,57 @@ conda env create --name ai4beg --file .devcontainer/environment.yml
|
|||
conda activate ai4beg
|
||||
```
|
||||
|
||||
### Χρήση Visual Studio Code με την Επέκταση Python
|
||||
### Χρήση του Visual Studio Code με την Επέκταση Python
|
||||
|
||||
Αυτή η διδακτέα ύλη χρησιμοποιείται καλύτερα όταν ανοίγεται στο [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).
|
||||
Αυτή η ύλη χρησιμοποιείται καλύτερα όταν ανοίγετε το περιεχόμενο με το [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, θα προτείνει αυτόματα να εγκαταστήσετε τις επεκτάσεις Python. Επίσης, θα πρέπει να εγκαταστήσετε το miniconda όπως περιγράφεται παραπάνω.
|
||||
> **Σημείωση**: Μόλις κλωνοποιήσετε και ανοίξετε τον φάκελο στο VS Code, θα σας προταθεί αυτόματα να εγκαταστήσετε τις επεκτάσεις Python. Θα πρέπει επίσης να εγκαταστήσετε το miniconda όπως περιγράφεται παραπάνω.
|
||||
|
||||
> **Σημείωση**: Αν το VS Code σας προτείνει να ανοίξετε ξανά το αποθετήριο σε ένα container, θα πρέπει να αρνηθείτε αυτό για να χρησιμοποιήσετε την τοπική εγκατάσταση Python.
|
||||
> **Σημείωση**: Εάν το VS Code σας προτείνει να ανοίξετε ξανά το αποθετήριο σε container, θα πρέπει να αρνηθείτε αυτό για να χρησιμοποιήσετε την τοπική εγκατάσταση Python.
|
||||
|
||||
### Χρήση Jupyter στον Browser
|
||||
### Χρήση Jupyter στον Περιηγητή
|
||||
|
||||
Μπορείτε επίσης να χρησιμοποιήσετε ένα περιβάλλον Jupyter από τον browser στον δικό σας υπολογιστή. Τόσο το κλασικό Jupyter όσο και το JupyterHub παρέχουν ένα βολικό περιβάλλον ανάπτυξης με αυτόματη συμπλήρωση, επισήμανση κώδικα κτλ.
|
||||
Μπορείτε επίσης να χρησιμοποιήσετε ένα περιβάλλον Jupyter από τον περιηγητή στον δικό σας υπολογιστή. Τόσο το κλασικό Jupyter όσο και το JupyterHub προσφέρουν ένα βολικό περιβάλλον ανάπτυξης με αυτόματη συμπλήρωση, επισήμανση κώδικα κ.ά.
|
||||
|
||||
Για να ξεκινήσετε το Jupyter τοπικά, πηγαίνετε στον φάκελο του μαθήματος και εκτελέστε:
|
||||
|
||||
```bash
|
||||
jupyter notebook
|
||||
```
|
||||
ή
|
||||
ή
|
||||
```bash
|
||||
jupyterhub
|
||||
```
|
||||
Στη συνέχεια μπορείτε να πλοηγηθείτε σε οποιοδήποτε από τα αρχεία `.ipynb`, να τα ανοίξετε και να ξεκινήσετε να εργάζεστε.
|
||||
Στη συνέχεια μπορείτε να πλοηγηθείτε σε οποιοδήποτε αρχείο `.ipynb`, να το ανοίξετε και να ξεκινήσετε τη δουλειά.
|
||||
|
||||
### Εκτέλεση σε container
|
||||
|
||||
Μια εναλλακτική στην εγκατάσταση Python θα ήταν να τρέξετε τον κώδικα σε container. Επειδή το αποθετήριό μας παρέχει έναν ειδικό φάκελο `.devcontainer` που καθοδηγεί πώς να δημιουργήσετε ένα container για αυτό το αποθετήριο, το VS Code προσφέρει τη δυνατότητα να ξανανοίξετε τον κώδικα σε container. Αυτό θα απαιτήσει εγκατάσταση Docker, και επίσης είναι πιο πολύπλοκο, οπότε το προτείνουμε σε πιο έμπειρους χρήστες.
|
||||
Μία εναλλακτική στην εγκατάσταση Python είναι να τρέξετε τον κώδικα σε container. Επειδή το αποθετήριό μας παρέχει έναν ειδικό φάκελο `.devcontainer` που καθοδηγεί το πώς να κατασκευάσετε ένα container για αυτό το repo, το VS Code προσφέρει τη δυνατότητα να ανοίξετε ξανά τον κώδικα μέσα σε ένα container. Αυτό απαιτεί την εγκατάσταση του Docker και είναι πιο πολύπλοκο, οπότε προτείνεται σε πιο έμπειρους χρήστες.
|
||||
|
||||
## Εκτέλεση στο Cloud
|
||||
|
||||
Αν δεν θέλετε να εγκαταστήσετε Python τοπικά και έχετε πρόσβαση σε πόρους cloud - μια καλή εναλλακτική είναι να τρέξετε τον κώδικα στο cloud. Υπάρχουν πολλοί τρόποι να το κάνετε:
|
||||
Εάν δεν θέλετε να εγκαταστήσετε Python τοπικά και έχετε πρόσβαση σε κάποιους πόρους cloud - μια καλή εναλλακτική είναι να τρέξετε τον κώδικα στο cloud. Υπάρχουν αρκετοί τρόποι να το κάνετε:
|
||||
|
||||
* Χρησιμοποιώντας το **[GitHub Codespaces](https://github.com/features/codespaces)**, που είναι ένα εικονικό περιβάλλον δημιουργημένο για εσάς στο GitHub, προσβάσιμο μέσω περιβάλλοντος VS Code στον browser. Αν έχετε πρόσβαση στα Codespaces, απλά κάντε κλικ στο κουμπί **Code** στο αποθετήριο, ξεκινήστε ένα codespace και τρέξτε σε χρόνο μηδέν.
|
||||
* Χρησιμοποιώντας το **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. Το [Binder](https://mybinder.org) προσφέρει δωρεάν πόρους υπολογισμού στο cloud για ανθρώπους σαν εσάς να δοκιμάσουν κώδικα στο GitHub. Υπάρχει ένα κουμπί στην αρχική σελίδα για να ανοίξετε το αποθετήριο στο Binder - αυτό θα σας πάρει γρήγορα στον ιστότοπο του binder, που θα δημιουργήσει το υποκείμενο container και θα ξεκινήσει μια διεπαφή Jupyter web για εσάς χωρίς καθυστερήσεις.
|
||||
* Χρησιμοποιώντας **[GitHub Codespaces](https://github.com/features/codespaces)**, το οποίο είναι ένα εικονικό περιβάλλον που δημιουργείται για εσάς στο GitHub, προσβάσιμο μέσω της διεπαφής περιηγητή VS Code. Εάν έχετε πρόσβαση σε Codespaces, απλά κάντε κλικ στο κουμπί **Code** στο repo, ξεκινήστε ένα codespace και αρχίστε να δουλεύετε σε χρόνο μηδέν.
|
||||
* Χρησιμοποιώντας **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. Το [Binder](https://mybinder.org) προσφέρει δωρεάν υπολογιστικούς πόρους στο cloud για ανθρώπους σαν εσάς να δοκιμάζουν κώδικα από το GitHub. Υπάρχει ένα κουμπί στην αρχική σελίδα για να ανοίξετε το αποθετήριο στο Binder - αυτό θα σας μεταφέρει γρήγορα στην ιστοσελίδα του binder, όπου θα δημιουργήσει το υποκείμενο container και θα ξεκινήσει ένα web interface Jupyter για εσάς αβίαστα.
|
||||
|
||||
> **Σημείωση**: Για την αποφυγή καταχρήσεων, το Binder έχει αποκλεισμένη την πρόσβαση σε ορισμένους διαδικτυακούς πόρους. Αυτό μπορεί να εμποδίσει κάποιον κώδικα που χρησιμοποιεί μοντέλα και/ή σύνολα δεδομένων από το δημόσιο Διαδίκτυο να λειτουργήσει. Μπορεί να χρειαστεί να βρείτε ορισμένες λύσεις. Επίσης, οι πόροι υπολογισμού που παρέχει το Binder είναι βασικοί, οπότε η εκπαίδευση μπορεί να είναι αργή, ειδικά σε μεταγενέστερα, πιο σύνθετα μαθήματα.
|
||||
> **Σημείωση**: Για να αποτραπεί η κακή χρήση, το Binder μπλοκάρει την πρόσβαση σε κάποιους πόρους web. Αυτό μπορεί να αποτρέψει τη λειτουργία μέρους του κώδικα που κατεβάζει μοντέλα ή σύνολα δεδομένων από το δημόσιο Internet. Μπορεί να χρειαστεί να βρείτε κάποιες εναλλακτικές λύσεις. Επιπλέον, οι υπολογιστικοί πόροι που παρέχει το Binder είναι αρκετά βασικοί, έτσι η εκπαίδευση θα είναι αργή, ιδιαίτερα στα μεταγενέστερα, πιο σύνθετα μαθήματα.
|
||||
|
||||
## Εκτέλεση στο Cloud με GPU
|
||||
|
||||
Μερικά από τα μεταγενέστερα μαθήματα αυτής της ύλης θα ωφεληθούν σημαντικά από την υποστήριξη GPU. Η εκπαίδευση μοντέλων, για παράδειγμα, μπορεί να είναι πολύ αργή διαφορετικά. Υπάρχουν μερικές επιλογές που μπορείτε να ακολουθήσετε, ειδικά αν έχετε πρόσβαση στο cloud είτε μέσω του [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste), είτε μέσω του ιδρύματός σας:
|
||||
Μερικά από τα μεταγενέστερα μαθήματα αυτής της ύλης θα επωφεληθούν σημαντικά από την υποστήριξη GPU. Η εκπαίδευση μοντέλων, για παράδειγμα, μπορεί να είναι βασανιστικά αργή διαφορετικά. Υπάρχουν μερικές επιλογές που μπορείτε να ακολουθήσετε, ειδικά αν έχετε πρόσβαση στο cloud είτε μέσω του [Azure for Students](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-series VM υποστηρίζουν GPU.
|
||||
* Δημιουργήστε [Data Science Virtual Machine](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) και συνδεθείτε σε αυτή μέσω του Jupyter. Μπορείτε στη συνέχεια να κλωνοποιήσετε το repo απευθείας στη μηχανή και να ξεκινήσετε τη μάθηση. Οι μηχανές NC-series έχουν υποστήριξη GPU.
|
||||
|
||||
> **Σημείωση**: Ορισμένες συνδρομές, συμπεριλαμβανομένου του Azure for Students, δεν παρέχουν υποστήριξη GPU απευθείας. Μπορεί να χρειαστεί να ζητήσετε πρόσθετους πυρήνες GPU με αίτημα τεχνικής υποστήριξης.
|
||||
> **Σημείωση**: Ορισμένες συνδρομές, συμπεριλαμβανομένων των Azure for Students, δεν παρέχουν 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/) δείχνει πώς να κλωνοποιήσετε ένα αποθετήριο σε notebook του Azure ML και να το αρχίσετε να το χρησιμοποιείτε.
|
||||
* Δημιουργήστε [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/) δείχνει πώς να κλωνοποιήσετε ένα αποθετήριο σε ένα notebook Azure ML και να αρχίσετε να το χρησιμοποιείτε.
|
||||
|
||||
Μπορείτε επίσης να χρησιμοποιήσετε το Google Colab, που προσφέρει κάποια δωρεάν υποστήριξη GPU, και να ανεβάσετε εκεί τα Jupyter Notebooks για να τα εκτελέσετε ένα-ένα.
|
||||
Μπορείτε επίσης να χρησιμοποιήσετε το Google Colab, που διαθέτει δωρεάν υποστήριξη GPU, και να ανεβάσετε εκεί Jupyter Notebooks για να τα εκτελέσετε ένα-ένα.
|
||||
|
||||
---
|
||||
|
||||
<!-- 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",
|
||||
"Η εκπαίδευση των CNN μπορεί να πάρει πολύ χρόνο, και απαιτούνται πολλά δεδομένα για αυτή τη δουλειά. Ωστόσο, μεγάλο μέρος του χρόνου δαπανάται για να μάθουμε τα καλύτερα φίλτρα χαμηλού επιπέδου που χρησιμοποιεί ένα δίκτυο για την εξαγωγή προτύπων από εικόνες. Ανακύπτει ένα φυσικό ερώτημα - μπορούμε να χρησιμοποιήσουμε ένα νευρωνικό δίκτυο εκπαιδευμένο σε ένα σύνολο δεδομένων και να το προσαρμόσουμε για ταξινόμηση διαφορετικών εικόνων χωρίς πλήρη διαδικασία εκπαίδευσης;\n",
|
||||
"\n",
|
||||
"Αυτή η προσέγγιση ονομάζεται **μεταφορά μάθησης**, επειδή μεταφέρουμε κάποια γνώση από ένα μοντέλο νευρωνικού δικτύου σε ένα άλλο. Στη μεταφορά μάθησης, συνήθως ξεκινάμε με ένα προεκπαιδευμένο μοντέλο, το οποίο έχει εκπαιδευτεί σε κάποιο μεγάλο σύνολο δεδομένων εικόνων, όπως το **ImageNet**. Αυτά τα μοντέλα μπορούν ήδη να εξάγουν αποτελεσματικά διάφορα χαρακτηριστικά από γενικές εικόνες, και σε πολλές περιπτώσεις, η απλή δημιουργία ενός ταξινομητή πάνω από αυτά τα εξαγόμενα χαρακτηριστικά μπορεί να αποδώσει καλά αποτελέσματα.\n"
|
||||
"Αυτή η προσέγγιση ονομάζεται **μεταφορά μάθησης**, επειδή μεταφέρουμε κάποια γνώση από ένα μοντέλο νευρωνικού δικτύου σε ένα άλλο. Στη μεταφορά μάθησης, συνήθως ξεκινούμε με ένα προεκπαιδευμένο μοντέλο, το οποίο έχει εκπαιδευτεί σε κάποιο μεγάλο σύνολο εικόνων, όπως το **ImageNet**. Αυτά τα μοντέλα μπορούν ήδη να κάνουν καλή δουλειά εξαγωγής διαφορετικών χαρακτηριστικών από γενικές εικόνες, και σε πολλές περιπτώσεις απλώς η δημιουργία ενός ταξινομητή πάνω σε αυτά τα εξαγόμενα χαρακτηριστικά μπορεί να αποφέρει ένα καλό αποτέλεσμα.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -29,11 +29,11 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Σύνολο Δεδομένων Cats vs. Dogs\n",
|
||||
"## Σύνολο Δεδομένων Γάτες vs. Σκύλοι\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 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",
|
||||
"\n",
|
||||
"Ας κατεβάσουμε αυτό το σύνολο δεδομένων και ας το εξαγάγουμε στον κατάλογο `data` (αυτή η διαδικασία μπορεί να πάρει λίγο χρόνο!):\n"
|
||||
"Ας κατεβάσουμε αυτό το σύνολο δεδομένων και να το αποσυμπιέσουμε στον φάκελο `data` (αυτή η διαδικασία μπορεί να πάρει λίγο χρόνο!):\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -64,7 +64,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Δυστυχώς, υπάρχουν κάποια κατεστραμμένα αρχεία εικόνας στο σύνολο δεδομένων. Χρειάζεται να κάνουμε έναν γρήγορο καθαρισμό για να ελέγξουμε για κατεστραμμένα αρχεία. Για να μην επιβαρύνουμε αυτό το σεμινάριο, μεταφέραμε τον κώδικα για την επαλήθευση του συνόλου δεδομένων σε μια μονάδα.\n"
|
||||
"Δυστυχώς, υπάρχουν μερικά κατεστραμμένα αρχεία εικόνων στο σύνολο δεδομένων. Χρειαζόμαστε έναν γρήγορο καθαρισμό για να ελέγξουμε για κατεστραμμένα αρχεία. Για να μην αλλοιώσουμε αυτό το σεμινάριο, μεταφέραμε τον κώδικα επαλήθευσης του συνόλου δεδομένων σε ένα module.\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",
|
||||
"Το Dataset εντοπίζει αυτόματα τα ονόματα των κατηγοριών από τους φακέλους, και μπορείτε να τα αποκτήσετε αν χρειαστεί καλώντας:\n"
|
||||
"Το Dataset επιλέγει αυτόματα ονόματα κλάσεων από τους φακέλους, και μπορείτε να έχετε πρόσβαση σε αυτά αν χρειαστεί καλώντας:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -412,7 +412,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Τα σύνολα δεδομένων που έχουμε αποκτήσει μπορούν να περαστούν απευθείας στη συνάρτηση `fit` για να εκπαιδεύσουν το μοντέλο. Περιέχουν τόσο τις αντίστοιχες εικόνες όσο και τις ετικέτες, οι οποίες μπορούν να επαναληφθούν χρησιμοποιώντας την ακόλουθη κατασκευή:\n"
|
||||
"Τα σετ δεδομένων που έχουμε αποκτήσει μπορούν να περαστούν απευθείας στη συνάρτηση `fit` για να εκπαιδεύσουμε το μοντέλο. Περιέχουν τόσο τις αντίστοιχες εικόνες όσο και τις ετικέτες, τα οποία μπορούν να επαναληφθούν χρησιμοποιώντας την ακόλουθη κατασκευή:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -453,7 +453,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"> **Σημείωση**: Όλες οι εικόνες στο σύνολο δεδομένων αναπαρίστανται ως tensors κινητής υποδιαστολής με εύρος 0-255. Πριν τις περάσουμε στο νευρωνικό δίκτυο, πρέπει να κλιμακώσουμε αυτές τις τιμές στο εύρος 0-1. Όταν σχεδιάζουμε εικόνες, είτε πρέπει να κάνουμε το ίδιο, είτε να μετατρέψουμε τις τιμές στον τύπο `int` (όπως κάνουμε στον κώδικα παραπάνω), ώστε να δείξουμε στο `matplotlib` ότι θέλουμε να σχεδιάσουμε την αρχική μη κλιμακωμένη εικόνα.\n"
|
||||
"> **Σημείωση**: Όλες οι εικόνες στο σύνολο δεδομένων αναπαρίστανται ως tensors κινητής υποδιαστολής με εύρος 0-255. Πριν τις περάσουμε στο νευρωνικό δίκτυο, πρέπει να κλιμακώσουμε αυτές τις τιμές σε εύρος 0-1. Όταν σχεδιάζουμε εικόνες, είτε πρέπει να κάνουμε το ίδιο, είτε να μετατρέψουμε τις τιμές σε τύπο `int` (όπως κάνουμε στον παραπάνω κώδικα), για να δείξουμε στο `matplotlib` ότι θέλουμε να σχεδιάσουμε την αρχική μη κλιμακωμένη εικόνα.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -462,7 +462,7 @@
|
|||
"source": [
|
||||
"## Προεκπαιδευμένα μοντέλα\n",
|
||||
"\n",
|
||||
"Για πολλές εργασίες ταξινόμησης εικόνων, μπορεί κανείς να βρει προεκπαιδευμένα μοντέλα νευρωνικών δικτύων. Πολλά από αυτά τα μοντέλα είναι διαθέσιμα μέσα στον χώρο ονομάτων `keras.applications`, και ακόμη περισσότερα μοντέλα μπορούν να βρεθούν στο Διαδίκτυο. Ας δούμε πώς μπορεί να φορτωθεί και να χρησιμοποιηθεί το απλούστερο μοντέλο VGG-16:\n"
|
||||
"Για πολλές εργασίες ταξινόμησης εικόνων μπορεί κανείς να βρει προεκπαιδευμένα μοντέλα νευρωνικών δικτύων. Πολλά από αυτά τα μοντέλα είναι διαθέσιμα μέσα στο namespace `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"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -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": [
|
||||
"Η διάσταση του tensor χαρακτηριστικών είναι 7x7x512, αλλά για να το οπτικοποιήσουμε έπρεπε να το αναδιαμορφώσουμε σε δισδιάστατη μορφή.\n",
|
||||
"Η διάσταση του tensor χαρακτηριστικών είναι 7x7x512, αλλά για να το οπτικοποιήσουμε έπρεπε να το αναμορφώσουμε σε δισδιάστατη μορφή.\n",
|
||||
"\n",
|
||||
"Τώρα ας προσπαθήσουμε να δούμε αν αυτά τα χαρακτηριστικά μπορούν να χρησιμοποιηθούν για την ταξινόμηση εικόνων. Ας πάρουμε χειροκίνητα ένα μέρος από τις εικόνες (50 minibatches, στη δική μας περίπτωση) και να προϋπολογίσουμε τα διανύσματα χαρακτηριστικών τους. Μπορούμε να χρησιμοποιήσουμε το API **dataset** του Tensorflow για να το κάνουμε αυτό. Η συνάρτηση `map` παίρνει ένα dataset και εφαρμόζει μια δεδομένη lambda-function για να το μετασχηματίσει. Χρησιμοποιούμε αυτόν τον μηχανισμό για να κατασκευάσουμε νέα datasets, `ds_features_train` και `ds_features_test`, που περιέχουν χαρακτηριστικά εξαγόμενα από το VGG αντί για τις αρχικές εικόνες.\n"
|
||||
"Τώρα ας προσπαθήσουμε να δούμε αν αυτά τα χαρακτηριστικά μπορούν να χρησιμοποιηθούν για την ταξινόμηση εικόνων. Ας πάρουμε χειροκίνητα ένα μέρος των εικόνων (50 minibatches, στην περίπτωσή μας), και να υπολογίσουμε εκ των προτέρων τους διανύσματα χαρακτηριστικών τους. Μπορούμε να χρησιμοποιήσουμε το Tensorflow **dataset** API για αυτό. Η συνάρτηση `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"
|
||||
"Η ομορφιά της αρχιτεκτονικής Keras είναι ότι το μοντέλο VGG-16 που ορίσαμε παραπάνω μπορεί επίσης να χρησιμοποιηθεί ως στρώση σε ένα άλλο νευρωνικό δίκτυο! Απλά πρέπει να κατασκευάσουμε ένα δίκτυο με πυκνό ταξινομητή στην κορυφή του, και μετά να εκπαιδεύσουμε ολόκληρο το δίκτυο χρησιμοποιώντας την οπίσθια διάδοση.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -793,13 +804,13 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Αυτό το μοντέλο μοιάζει με ένα end-to-end δίκτυο ταξινόμησης, το οποίο λαμβάνει μια εικόνα και επιστρέφει την κατηγορία. Ωστόσο, το δύσκολο σημείο είναι ότι θέλουμε το 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": [
|
||||
"## Fine-tuning μεταφοράς μάθησης\n",
|
||||
"## Βελτιωμένη μεταφορά μάθησης (Fine-tuning)\n",
|
||||
"\n",
|
||||
"Στην προηγούμενη ενότητα, εκπαιδεύσαμε το τελικό στρώμα ταξινόμησης για να ταξινομήσει εικόνες στο δικό μας σύνολο δεδομένων. Ωστόσο, δεν επανεκπαιδεύσαμε τον εξαγωγέα χαρακτηριστικών, και το μοντέλο μας βασίστηκε στα χαρακτηριστικά που έχει μάθει από τα δεδομένα του ImageNet. Εάν τα αντικείμενά σας διαφέρουν οπτικά από τις συνηθισμένες εικόνες του ImageNet, αυτός ο συνδυασμός χαρακτηριστικών μπορεί να μην λειτουργεί με τον καλύτερο τρόπο. Επομένως, έχει νόημα να ξεκινήσετε την εκπαίδευση και των συνελικτικών στρωμάτων.\n",
|
||||
"Στην προηγούμενη ενότητα, εκπαιδεύσαμε το τελικό επίπεδο ταξινόμησης για να ταξινομήσουμε εικόνες στο δικό μας σύνολο δεδομένων. Ωστόσο, δεν εκπαιδεύσαμε ξανά τον εξαγωγέα χαρακτηριστικών και το μοντέλο μας βασίστηκε στα χαρακτηριστικά που είχε μάθει από τα δεδομένα ImageNet. Εάν τα αντικείμενά σας διαφέρουν οπτικά από τις συνηθισμένες εικόνες ImageNet, αυτή η συνδυασμένη χρήση χαρακτηριστικών μπορεί να μην λειτουργεί καλύτερα. Επομένως, έχει νόημα να ξεκινήσουμε να εκπαιδεύουμε και τα συνελικτικά επίπεδα.\n",
|
||||
"\n",
|
||||
"Για να το κάνουμε αυτό, μπορούμε να ξεπαγώσουμε τις παραμέτρους των συνελικτικών φίλτρων που είχαμε προηγουμένως παγώσει.\n",
|
||||
"\n",
|
||||
"> **Note:** Είναι σημαντικό να παγώσετε πρώτα τις παραμέτρους και να εκτελέσετε αρκετές εποχές εκπαίδευσης για να σταθεροποιήσετε τα βάρη στο στρώμα ταξινόμησης. Εάν ξεκινήσετε αμέσως την εκπαίδευση του δικτύου από άκρη σε άκρη με ξεπαγωμένες παραμέτρους, είναι πιθανό μεγάλα σφάλματα να καταστρέψουν τα προεκπαιδευμένα βάρη στα συνελικτικά στρώματα.\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": [
|
||||
"Ωστόσο, η αποδέσμευση όλων ταυτόχρονα δεν είναι η καλύτερη ιδέα. Μπορούμε πρώτα να αποδεσμεύσουμε μόνο μερικές τελικές στρώσεις συνελίξεων, επειδή περιέχουν μοτίβα υψηλότερου επιπέδου που είναι σχετικές για τις εικόνες μας. Για παράδειγμα, για αρχή, μπορούμε να παγώσουμε όλες τις στρώσεις εκτός από τις τελευταίες 4:\n"
|
||||
"Ωστόσο, το ξεπάγωμα όλων ταυτόχρονα δεν είναι η καλύτερη ιδέα. Μπορούμε πρώτα να ξεπαγώσουμε μόνο μερικά τελικά στρώματα των συνελικτικών, επειδή περιέχουν επίπεδα μοτίβα υψηλότερης τάξης που σχετίζονται με τις εικόνες μας. Για παράδειγμα, για αρχή, μπορούμε να παγώσουμε όλα τα στρώματα εκτός από τα τελευταία 4: \n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1000,11 +1011,11 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Παρατηρήστε ότι ο αριθμός των παραμετροποιήσιμων παραμέτρων αυξήθηκε σημαντικά, αλλά παραμένει περίπου στο 50% του συνόλου των παραμέτρων.\n",
|
||||
"Παρατηρήστε ότι ο αριθμός των παραμέτρων που μπορούν να εκπαίδευσης αυξήθηκε σημαντικά, αλλά παραμένει περίπου στο 50% όλων των παραμέτρων.\n",
|
||||
"\n",
|
||||
"Μετά την αποδέσμευση, μπορούμε να κάνουμε λίγες ακόμα εποχές εκπαίδευσης (στο παράδειγμά μας, θα κάνουμε μόνο μία). Μπορείτε επίσης να επιλέξετε χαμηλότερο ρυθμό εκμάθησης, ώστε να ελαχιστοποιηθεί η επίδραση στα προκαθορισμένα βάρη. Ωστόσο, ακόμα και με χαμηλό ρυθμό εκμάθησης, μπορείτε να περιμένετε ότι η ακρίβεια θα μειωθεί στην αρχή της εκπαίδευσης, μέχρι τελικά να φτάσει σε ελαφρώς υψηλότερο επίπεδο από ό,τι στην περίπτωση των σταθερών βαρών.\n",
|
||||
"Μετά το ξεπάγωμα, μπορούμε να κάνουμε μερικούς ακόμη εποχές εκπαίδευσης (στο παράδειγμά μας, θα κάνουμε μόνο μία). Μπορείτε επίσης να επιλέξετε χαμηλότερο ρυθμό μάθησης, ώστε να ελαχιστοποιήσετε τον αντίκτυπο στους προεκπαιδευμένους βάρους. Ωστόσο, ακόμη και με χαμηλό ρυθμό μάθησης, μπορείτε να αναμένετε η ακρίβεια να μειωθεί στην αρχή της εκπαίδευσης, μέχρι τελικά να φτάσει σε ελαφρώς υψηλότερο επίπεδο από ό,τι στην περίπτωση των σταθερών βαρών.\n",
|
||||
"\n",
|
||||
"> **Σημείωση:** Αυτή η εκπαίδευση γίνεται πολύ πιο αργά, επειδή πρέπει να προωθήσουμε τα διανύσματα κλίσης πίσω από πολλά επίπεδα του δικτύου!\n"
|
||||
"> **Note:** Αυτή η εκπαίδευση γίνεται πολύ πιο αργά, επειδή πρέπει να προωθήσουμε τις κλίσεις πίσω μέσα από πολλά επίπεδα του δικτύου!\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1028,9 +1039,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Είναι πιθανό να επιτύχουμε υψηλότερη ακρίβεια εκπαίδευσης, επειδή χρησιμοποιούμε ένα πιο ισχυρό δίκτυο με περισσότερες παραμέτρους, αλλά η ακρίβεια επικύρωσης δεν θα αυξηθεί το ίδιο.\n",
|
||||
"Είμαστε πιθανό να επιτύχουμε υψηλότερη ακρίβεια στην εκπαίδευση, επειδή χρησιμοποιούμε ένα πιο ισχυρό δίκτυο με περισσότερες παραμέτρους, αλλά η ακρίβεια επικύρωσης δεν θα αυξηθεί τόσο πολύ.\n",
|
||||
"\n",
|
||||
"Μη διστάσετε να ξεπαγώσετε μερικά ακόμη επίπεδα του δικτύου και να εκπαιδεύσετε περισσότερο, για να δείτε αν μπορείτε να επιτύχετε υψηλότερη ακρίβεια!\n"
|
||||
"Μη διστάσετε να ξεπαγώσετε μερικά ακόμα επίπεδα του δικτύου και να εκπαιδεύσετε περισσότερο, για να δείτε αν μπορείτε να πετύχετε υψηλότερη ακρίβεια!\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1039,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"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1441,11 +1452,11 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Όπως μπορείτε να δείτε, το μοντέλο περιέχει τα ίδια γνωστά δομικά στοιχεία: συνελικτικά επίπεδα, επίπεδα pooling και έναν τελικό πυκνό ταξινομητή. Μπορούμε να χρησιμοποιήσουμε αυτό το μοντέλο με τον ίδιο ακριβώς τρόπο που χρησιμοποιούσαμε το VGG-16 για μεταφορά μάθησης. Μπορείτε να πειραματιστείτε με τον παραπάνω κώδικα, χρησιμοποιώντας διαφορετικά μοντέλα ResNet ως βασικό μοντέλο, και να δείτε πώς αλλάζει η ακρίβεια.\n",
|
||||
"Όπως μπορείτε να δείτε, το μοντέλο περιλαμβάνει τα ίδια γνώριμα δομικά στοιχεία: συνελικτικά επίπεδα, επίπεδα συσσώρευσης και τελικό πυκνό ταξινομητή. Μπορούμε να χρησιμοποιήσουμε αυτό το μοντέλο με ακριβώς τον ίδιο τρόπο που έχουμε χρησιμοποιήσει το VGG-16 για μεταφορά μάθησης. Μπορείτε να δοκιμάσετε να πειραματιστείτε με τον κώδικα παραπάνω, χρησιμοποιώντας διαφορετικά μοντέλα ResNet ως βασικό μοντέλο, και να δείτε πώς αλλάζει η ακρίβεια.\n",
|
||||
"\n",
|
||||
"## Κανονικοποίηση Παρτίδας (Batch Normalization)\n",
|
||||
"## Κανονικοποίηση Παρτίδας\n",
|
||||
"\n",
|
||||
"Αυτό το δίκτυο περιέχει έναν ακόμη τύπο επιπέδου: **Κανονικοποίηση Παρτίδας**. Η ιδέα της κανονικοποίησης παρτίδας είναι να φέρει τις τιμές που ρέουν μέσα από το νευρωνικό δίκτυο στο σωστό εύρος. Συνήθως, τα νευρωνικά δίκτυα λειτουργούν καλύτερα όταν όλες οι τιμές βρίσκονται στο εύρος [-1,1] ή [0,1], και γι' αυτόν τον λόγο κλιμακώνουμε/κανονικοποιούμε τα δεδομένα εισόδου μας αναλόγως. Ωστόσο, κατά την εκπαίδευση ενός βαθιού δικτύου, μπορεί να συμβεί οι τιμές να βγουν σημαντικά εκτός αυτού του εύρους, κάτι που καθιστά την εκπαίδευση προβληματική. Το επίπεδο κανονικοποίησης παρτίδας υπολογίζει τον μέσο όρο και την τυπική απόκλιση για όλες τις τιμές της τρέχουσας παρτίδας (minibatch) και τις χρησιμοποιεί για να κανονικοποιήσει το σήμα πριν το περάσει μέσα από ένα επίπεδο του νευρωνικού δικτύου. Αυτό βελτιώνει σημαντικά τη σταθερότητα των βαθιών δικτύων.\n"
|
||||
"Αυτό το δίκτυο περιέχει έναν ακόμα τύπο επιπέδου: **Κανονικοποίηση Παρτίδας**. Η ιδέα της κανονικοποίησης παρτίδας είναι να μεταφέρει τις τιμές που ρέουν μέσω του νευρωνικού δικτύου σε ένα σωστό διάστημα. Συνήθως τα νευρωνικά δίκτυα δουλεύουν καλύτερα όταν όλες οι τιμές βρίσκονται εντός του εύρους [-1,1] ή [0,1], και αυτός είναι ο λόγος που κλιμακώνουμε/κανονικοποιούμε τα δεδομένα εισόδου μας κατάλληλα. Ωστόσο, κατά την εκπαίδευση ενός βαθιού δικτύου, μπορεί να συμβεί οι τιμές να ξεφεύγουν σημαντικά από αυτό το εύρος, κάτι που κάνει την εκπαίδευση προβληματική. Το επίπεδο κανονικοποίησης παρτίδας υπολογίζει το μέσο όρο και την τυπική απόκλιση για όλες τις τιμές της τρέχουσας μικροπαρτίδας, και τα χρησιμοποιεί για να κανονικοποιήσει το σήμα πριν το περάσει μέσω ενός επιπέδου του νευρωνικού δικτύου. Αυτό βελτιώνει σημαντικά τη σταθερότητα των βαθιών δικτύων.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1454,16 +1465,16 @@
|
|||
"source": [
|
||||
"## Συμπέρασμα\n",
|
||||
"\n",
|
||||
"Χρησιμοποιώντας τη μεταφορά μάθησης, καταφέραμε να δημιουργήσουμε γρήγορα έναν ταξινομητή για την προσαρμοσμένη εργασία ταξινόμησης αντικειμένων μας και να επιτύχουμε υψηλή ακρίβεια. Ωστόσο, αυτό το παράδειγμα δεν ήταν απόλυτα δίκαιο, καθώς το αρχικό δίκτυο VGG-16 είχε προεκπαιδευτεί για την αναγνώριση γατών και σκύλων, και έτσι απλώς επαναχρησιμοποιούσαμε τα περισσότερα μοτίβα που υπήρχαν ήδη στο δίκτυο. Μπορείτε να περιμένετε χαμηλότερη ακρίβεια σε πιο εξειδικευμένα αντικείμενα, όπως λεπτομέρειες σε γραμμή παραγωγής σε ένα εργοστάσιο ή διαφορετικά φύλλα δέντρων.\n",
|
||||
"Χρησιμοποιώντας μεταφορά μάθησης, καταφέραμε γρήγορα να δημιουργήσουμε έναν ταξινομητή για τον προσαρμοσμένο μας στόχο ταξινόμησης αντικειμένων και να επιτύχουμε υψηλή ακρίβεια. Ωστόσο, αυτό το παράδειγμα δεν ήταν εντελώς δίκαιο, επειδή το αρχικό δίκτυο VGG-16 είχε προεκπαιδευτεί για να αναγνωρίζει γάτες και σκύλους, και επομένως απλώς ξαναχρησιμοποιήσαμε τα περισσότερα από τα μοτίβα που ήταν ήδη παρόντα στο δίκτυο. Μπορείτε να περιμένετε χαμηλότερη ακρίβεια σε πιο εξωτικά αντικείμενα ειδικού τομέα, όπως λεπτομέρειες στη γραμμή παραγωγής σε ένα εργοστάσιο ή διαφορετικά φύλλα δέντρων.\n",
|
||||
"\n",
|
||||
"Μπορείτε να δείτε ότι πιο σύνθετες εργασίες που επιλύουμε τώρα απαιτούν μεγαλύτερη υπολογιστική ισχύ και δεν μπορούν να λυθούν εύκολα με τη χρήση CPU. Στην επόμενη ενότητα, θα προσπαθήσουμε να χρησιμοποιήσουμε μια πιο ελαφριά υλοποίηση για να εκπαιδεύσουμε το ίδιο μοντέλο με χαμηλότερους υπολογιστικούς πόρους, κάτι που οδηγεί σε ελαφρώς χαμηλότερη ακρίβεια.\n"
|
||||
"Μπορείτε να δείτε ότι πιο σύνθετα καθήκοντα που επιλύουμε τώρα απαιτούν μεγαλύτερη υπολογιστική ισχύ και δεν μπορούν να λυθούν εύκολα στην CPU. Στην επόμενη ενότητα, θα προσπαθήσουμε να χρησιμοποιήσουμε μια πιο ελαφριά υλοποίηση για να εκπαιδεύσουμε το ίδιο μοντέλο χρησιμοποιώντας λιγότερους υπολογιστικούς πόρους, που έχει ως αποτέλεσμα ελαφρώς χαμηλότερη ακρίβεια.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**Αποποίηση ευθύνης**: \nΑυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης AI [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-29T09:50:16+00:00",
|
||||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb",
|
||||
"language_code": "el"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
|
|
|||
|
|
@ -1,34 +1,34 @@
|
|||
# Επεξεργασία Φυσικής Γλώσσας
|
||||
|
||||

|
||||

|
||||
|
||||
Σε αυτή την ενότητα, θα επικεντρωθούμε στη χρήση Νευρωνικών Δικτύων για την αντιμετώπιση εργασιών που σχετίζονται με την **Επεξεργασία Φυσικής Γλώσσας (NLP)**. Υπάρχουν πολλά προβλήματα NLP που θέλουμε οι υπολογιστές να μπορούν να λύσουν:
|
||||
Σε αυτήν την ενότητα, θα επικεντρωθούμε στη χρήση Νευρωνικών Δικτύων για την αντιμετώπιση εργασιών που σχετίζονται με την **Επεξεργασία Φυσικής Γλώσσας (NLP)**. Υπάρχουν πολλά προβλήματα NLP που θέλουμε οι υπολογιστές να μπορούν να λύσουν:
|
||||
|
||||
* **Ταξινόμηση κειμένου** είναι ένα τυπικό πρόβλημα ταξινόμησης που αφορά ακολουθίες κειμένου. Παραδείγματα περιλαμβάνουν την ταξινόμηση μηνυμάτων ηλεκτρονικού ταχυδρομείου ως ανεπιθύμητα ή μη, ή την κατηγοριοποίηση άρθρων ως αθλητικά, επιχειρηματικά, πολιτικά κ.λπ. Επίσης, κατά την ανάπτυξη chat bots, συχνά χρειάζεται να κατανοήσουμε τι θέλει να πει ένας χρήστης — σε αυτή την περίπτωση ασχολούμαστε με την **ταξινόμηση πρόθεσης**. Συχνά, στην ταξινόμηση πρόθεσης πρέπει να αντιμετωπίσουμε πολλές κατηγορίες.
|
||||
* **Ανάλυση συναισθήματος** είναι ένα τυπικό πρόβλημα παλινδρόμησης, όπου πρέπει να αποδώσουμε έναν αριθμό (ένα συναίσθημα) που αντιστοιχεί στο πόσο θετικό/αρνητικό είναι το νόημα μιας πρότασης. Μια πιο προχωρημένη έκδοση της ανάλυσης συναισθήματος είναι η **ανάλυση συναισθήματος βάσει πτυχών** (ABSA), όπου αποδίδουμε συναίσθημα όχι σε ολόκληρη την πρόταση, αλλά σε διαφορετικά μέρη της (πτυχές), π.χ. *Σε αυτό το εστιατόριο, μου άρεσε η κουζίνα, αλλά η ατμόσφαιρα ήταν απαίσια*.
|
||||
* **Αναγνώριση Ονομαστικών Οντοτήτων** (NER) αναφέρεται στο πρόβλημα εξαγωγής συγκεκριμένων οντοτήτων από κείμενο. Για παράδειγμα, μπορεί να χρειαστεί να κατανοήσουμε ότι στη φράση *Πρέπει να πετάξω στο Παρίσι αύριο* η λέξη *αύριο* αναφέρεται σε ΗΜΕΡΟΜΗΝΙΑ, και το *Παρίσι* είναι ΤΟΠΟΘΕΣΙΑ.
|
||||
* **Εξαγωγή λέξεων-κλειδιών** είναι παρόμοια με το NER, αλλά πρέπει να εξάγουμε λέξεις σημαντικές για το νόημα της πρότασης αυτόματα, χωρίς προεκπαίδευση για συγκεκριμένους τύπους οντοτήτων.
|
||||
* **Κατάταξη κειμένου** είναι ένα τυπικό πρόβλημα ταξινόμησης που αφορά σειρές κειμένου. Παραδείγματα περιλαμβάνουν την ταξινόμηση μηνυμάτων ηλεκτρονικού ταχυδρομείου ως ανεπιθύμητα (spam) ή όχι, ή την κατηγοριοποίηση άρθρων ως αθλητικά, επιχειρήσεις, πολιτική, κ.λπ. Επίσης, όταν αναπτύσσουμε chat bots, συχνά πρέπει να κατανοήσουμε τι ήθελε να πει ο χρήστης – σε αυτή την περίπτωση ασχολούμαστε με την **ταξινόμηση προθέσεων**. Συχνά, στην ταξινόμηση προθέσεων πρέπει να διαχειριστούμε πολλές κατηγορίες.
|
||||
* **Ανάλυση συναισθήματος** είναι ένα τυπικό πρόβλημα παλινδρόμησης, όπου πρέπει να αποδοθεί ένας αριθμός (ένα συναίσθημα) που αντιστοιχεί στο πόσο θετικό/αρνητικό είναι το νόημα μιας πρότασης. Μια πιο προχωρημένη μορφή ανάλυσης συναισθήματος είναι η **ανάλυση συναισθήματος βάσει πτυχών** (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).
|
||||
* **Περίληψη κειμένου** είναι μια τεχνική όταν θέλουμε ένας υπολογιστής να "διαβάσει" μεγάλο κείμενο και να το συνοψίσει σε λίγες προτάσεις.
|
||||
* **Μετάφραση κειμένου** μπορεί να θεωρηθεί ως συνδυασμός κατανόησης κειμένου σε μία γλώσσα και δημιουργίας κειμένου σε άλλη.
|
||||
* **Απάντηση σε ερωτήσεις** αναφέρεται στην ικανότητα ενός μοντέλου να απαντά σε συγκεκριμένη ερώτηση. Το μοντέλο λαμβάνει ως είσοδο ένα κομμάτι κειμένου και μια ερώτηση, και πρέπει να δώσει μια θέση στο κείμενο όπου περιέχεται η απάντηση στην ερώτηση (ή, μερικές φορές, να παράγει το κείμενο της απάντησης).
|
||||
* **Γεννήτρια κειμένου** είναι η ικανότητα ενός μοντέλου να παράγει νέο κείμενο. Μπορεί να θεωρηθεί ως πρόβλημα ταξινόμησης που προβλέπει το επόμενο γράμμα/λέξη βασιζόμενο σε κάποιο *προτροπή κειμένου*. Προχωρημένα μοντέλα παραγωγής κειμένου, όπως το 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 λύνονταν χρησιμοποιώντας παραδοσιακές μεθόδους όπως γραμματικές. Για παράδειγμα, στη μηχανική μετάφραση χρησιμοποιούνταν αναλυτές (parsers) για να μετατρέψουν την αρχική πρόταση σε δέντρο σύνταξης, στη συνέχεια εξάγονταν υψηλού επιπέδου σημασιολογικές δομές για να αναπαραστήσουν το νόημα της πρότασης, και με βάση αυτό το νόημα και τη γραμματική της γλώσσας στόχου, γινόταν η παραγωγή του αποτελέσματος. Σήμερα, πολλές εργασίες NLP λύνονται πιο αποτελεσματικά χρησιμοποιώντας νευρωνικά δίκτυα.
|
||||
|
||||
> Πολλές κλασικές μέθοδοι NLP υλοποιούνται στη βιβλιοθήκη Python [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org). Υπάρχει ένα εξαιρετικό [Βιβλίο NLTK](https://www.nltk.org/book/) διαθέσιμο online που καλύπτει πώς μπορούν να λυθούν διάφορες εργασίες NLP χρησιμοποιώντας το NLTK.
|
||||
> Πολλές κλασικές μέθοδοι NLP υλοποιούνται στην Python βιβλιοθήκη [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org). Υπάρχει ένα εξαιρετικό [βιβλίο NLTK](https://www.nltk.org/book/) διαθέσιμο online που καλύπτει το πώς διάφορες εργασίες NLP μπορούν να λυθούν χρησιμοποιώντας το NLTK.
|
||||
|
||||
Στο μάθημά μας, θα επικεντρωθούμε κυρίως στη χρήση Νευρωνικών Δικτύων για NLP, και θα χρησιμοποιήσουμε το NLTK όπου χρειάζεται.
|
||||
Στο μάθημά μας, θα επικεντρωθούμε κυρίως στη χρήση νευρωνικών δικτύων για NLP, και θα χρησιμοποιούμε το NLTK όπου χρειάζεται.
|
||||
|
||||
Έχουμε ήδη μάθει για τη χρήση νευρωνικών δικτύων για την αντιμετώπιση δεδομένων πίνακα και εικόνων. Η κύρια διαφορά μεταξύ αυτών των τύπων δεδομένων και του κειμένου είναι ότι το κείμενο είναι μια ακολουθία μεταβλητού μήκους, ενώ το μέγεθος εισόδου στην περίπτωση των εικόνων είναι γνωστό εκ των προτέρων. Ενώ τα συνελικτικά δίκτυα μπορούν να εξάγουν μοτίβα από δεδομένα εισόδου, τα μοτίβα στο κείμενο είναι πιο περίπλοκα. Π.χ., μπορούμε να έχουμε άρνηση που διαχωρίζεται από το υποκείμενο με αυθαίρετο αριθμό λέξεων (π.χ. *Δεν μου αρέσουν τα πορτοκάλια*, έναντι *Δεν μου αρέσουν αυτά τα μεγάλα πολύχρωμα νόστιμα πορτοκάλια*), και αυτό πρέπει να ερμηνευθεί ως ένα μοτίβο. Έτσι, για να χειριστούμε τη γλώσσα, πρέπει να εισαγάγουμε νέους τύπους νευρωνικών δικτύων, όπως *επαναληπτικά δίκτυα* και *μετασχηματιστές*.
|
||||
Έχουμε ήδη μάθει για τη χρήση νευρωνικών δικτύων στην επεξεργασία πίνακα δεδομένων και εικόνων. Η βασική διαφορά μεταξύ αυτών των τύπων δεδομένων και του κειμένου είναι ότι το κείμενο είναι μια ακολουθία μεταβλητού μήκους, ενώ το μέγεθος της εισόδου στην περίπτωση των εικόνων είναι γνωστό εκ των προτέρων. Ενώ τα συνελικτικά δίκτυα μπορούν να εξάγουν μοτίβα από τα δεδομένα εισόδου, τα μοτίβα στο κείμενο είναι πιο σύνθετα. Π.χ., η άρνηση μπορεί να βρίσκεται μακριά από το υποκείμενο με αυθαίρετο αριθμό λέξεων (π.χ. *Δεν μου αρέσουν οι πορτοκάλια* vs. *Δεν μου αρέσουν αυτά τα μεγάλα χρωματιστά νόστιμα πορτοκάλια*), και αυτό πρέπει να ερμηνευτεί ως ένα μοτίβο. Έτσι, για να διαχειριστούμε τη γλώσσα πρέπει να εισάγουμε νέους τύπους νευρωνικών δικτύων, όπως *επαναλαμβανόμενα δίκτυα* και *μετασχηματιστές*.
|
||||
|
||||
## Εγκατάσταση Βιβλιοθηκών
|
||||
|
||||
Αν χρησιμοποιείτε τοπική εγκατάσταση Python για να εκτελέσετε αυτό το μάθημα, ίσως χρειαστεί να εγκαταστήσετε όλες τις απαιτούμενες βιβλιοθήκες για NLP χρησιμοποιώντας τις παρακάτω εντολές:
|
||||
Εάν χρησιμοποιείτε τοπική εγκατάσταση Python για να εκτελέσετε αυτό το μάθημα, ίσως χρειαστεί να εγκαταστήσετε όλες τις απαιτούμενες βιβλιοθήκες για NLP χρησιμοποιώντας τις ακόλουθες εντολές:
|
||||
|
||||
**Για PyTorch**
|
||||
```bash
|
||||
pip install -r requirements-torch.txt
|
||||
pip install -r requirements-pytorch.txt
|
||||
```
|
||||
**Για TensorFlow**
|
||||
```bash
|
||||
|
|
@ -39,13 +39,13 @@ pip install -r requirements-tf.txt
|
|||
|
||||
## Προειδοποίηση GPU
|
||||
|
||||
Σε αυτή την ενότητα, σε ορισμένα παραδείγματα θα εκπαιδεύσουμε αρκετά μεγάλα μοντέλα.
|
||||
* **Χρησιμοποιήστε Υπολογιστή με GPU**: Συνιστάται να εκτελείτε τα σημειωματάριά σας σε υπολογιστή με GPU για να μειώσετε τους χρόνους αναμονής κατά την εργασία με μεγάλα μοντέλα.
|
||||
* **Περιορισμοί Μνήμης GPU**: Η εκτέλεση σε GPU μπορεί να οδηγήσει σε καταστάσεις όπου εξαντλείται η μνήμη GPU, ειδικά κατά την εκπαίδευση μεγάλων μοντέλων.
|
||||
* **Κατανάλωση Μνήμης GPU**: Η ποσότητα μνήμης GPU που καταναλώνεται κατά την εκπαίδευση εξαρτάται από διάφορους παράγοντες, συμπεριλαμβανομένου του μεγέθους του minibatch.
|
||||
* **Ελαχιστοποίηση Μεγέθους Minibatch**: Αν αντιμετωπίσετε προβλήματα μνήμης GPU, σκεφτείτε να μειώσετε το μέγεθος του minibatch στον κώδικά σας ως πιθανή λύση.
|
||||
* **Απελευθέρωση Μνήμης GPU στο TensorFlow**: Παλαιότερες εκδόσεις του TensorFlow μπορεί να μην απελευθερώνουν σωστά τη μνήμη GPU κατά την εκπαίδευση πολλών μοντέλων μέσα σε έναν πυρήνα Python. Για να διαχειριστείτε αποτελεσματικά τη χρήση μνήμης GPU, μπορείτε να ρυθμίσετε το TensorFlow ώστε να δεσμεύει μνήμη GPU μόνο όταν χρειάζεται.
|
||||
* **Ενσωμάτωση Κώδικα**: Για να ρυθμίσετε το TensorFlow ώστε να αυξάνει τη δέσμευση μνήμης GPU μόνο όταν απαιτείται, συμπεριλάβετε τον παρακάτω κώδικα στα σημειωματάριά σας:
|
||||
Σε αυτήν την ενότητα, σε ορισμένα από τα παραδείγματα θα εκπαιδεύουμε αρκετά μεγάλα μοντέλα.
|
||||
* **Χρησιμοποιήστε υπολογιστή με υποστήριξη GPU**: Συνιστάται να εκτελείτε τα τετράδιά σας σε υπολογιστή με υποστήριξη GPU για να μειώσετε τους χρόνους αναμονής όταν δουλεύετε με μεγάλα μοντέλα.
|
||||
* **Περιορισμοί μνήμης GPU**: Η εκτέλεση σε GPU μπορεί να οδηγήσει σε καταστάσεις όπου εξαντλείται η μνήμη της GPU, ειδικά όταν εκπαιδεύονται μεγάλα μοντέλα.
|
||||
* **Κατανάλωση μνήμης GPU**: Η ποσότητα μνήμης GPU που καταναλώνεται κατά την εκπαίδευση εξαρτάται από διάφορους παράγοντες, συμπεριλαμβανομένου του μεγέθους του minibatch.
|
||||
* **Μείωση μεγέθους minibatch**: Αν αντιμετωπίσετε προβλήματα μνήμης GPU, σκεφτείτε να μειώσετε το μέγεθος του minibatch στον κώδικά σας ως πιθανή λύση.
|
||||
* **Αποδέσμευση μνήμης GPU στο TensorFlow**: Παλαιότερες εκδόσεις του TensorFlow ίσως δεν απελευθερώνουν σωστά τη μνήμη GPU όταν εκπαιδεύονται πολλαπλά μοντέλα μέσα σε έναν Python πυρήνα. Για να διαχειριστείτε αποτελεσματικά τη μνήμη GPU, μπορείτε να διαμορφώσετε το TensorFlow ώστε να δεσμεύει μνήμη GPU μόνο όταν χρειάζεται.
|
||||
* **Συμπερίληψη κώδικα**: Για να ορίσετε το TensorFlow να αυξάνει τη δέσμευση μνήμης GPU μόνο όταν απαιτείται, συμπεριλάβετε τον ακόλουθο κώδικα στα τετράδιά σας:
|
||||
|
||||
```python
|
||||
physical_devices = tf.config.list_physical_devices('GPU')
|
||||
|
|
@ -53,19 +53,21 @@ if len(physical_devices)>0:
|
|||
tf.config.experimental.set_memory_growth(physical_devices[0], True)
|
||||
```
|
||||
|
||||
Αν ενδιαφέρεστε να μάθετε για το NLP από την κλασική προοπτική ML, επισκεφθείτε [αυτή τη σειρά μαθημάτων](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)
|
||||
* [Αναπαράσταση κειμένου ως τάνσορες](13-TextRep/README.md)
|
||||
* [Ενσωματώσεις λέξεων](14-Emdeddings/README.md)
|
||||
* [Μοντελοποίηση γλώσσας](15-LanguageModeling/README.md)
|
||||
* [Επαναληπτικά Νευρωνικά Δίκτυα](16-RNN/README.md)
|
||||
* [Δίκτυα Γεννήτριας](17-GenerativeNetworks/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 -->
|
||||
|
|
@ -1,38 +1,38 @@
|
|||
# Πολυπρακτορικά Συστήματα
|
||||
# Συστήματα Πολλαπλών Πρακτόρων
|
||||
|
||||
Ένας από τους πιθανούς τρόπους επίτευξης νοημοσύνης είναι η λεγόμενη **αναδυόμενη** (ή **συνεργιστική**) προσέγγιση, η οποία βασίζεται στο γεγονός ότι η συνδυασμένη συμπεριφορά πολλών σχετικά απλών πρακτόρων μπορεί να οδηγήσει σε πιο σύνθετη (ή ευφυή) συμπεριφορά του συστήματος συνολικά. Θεωρητικά, αυτό βασίζεται στις αρχές της [Συλλογικής Νοημοσύνης](https://en.wikipedia.org/wiki/Collective_intelligence), του [Αναδυτισμού](https://en.wikipedia.org/wiki/Global_brain) και της [Εξελικτικής Κυβερνητικής](https://en.wikipedia.org/wiki/Global_brain), που υποστηρίζουν ότι τα συστήματα ανώτερου επιπέδου αποκτούν κάποια προστιθέμενη αξία όταν συνδυάζονται σωστά από συστήματα κατώτερου επιπέδου (η λεγόμενη *αρχή της μετάβασης μετασυστήματος*).
|
||||
Μία από τις πιθανές μεθόδους επίτευξης νοημοσύνης είναι η λεγόμενη **αναδυόμενη** (ή **συνεργατική**) προσέγγιση, η οποία βασίζεται στο γεγονός ότι η συνδυασμένη συμπεριφορά πολλών σχετικά απλών πρακτόρων μπορεί να οδηγήσει σε μία συνολικά πιο σύνθετη (ή ευφυή) συμπεριφορά του συστήματος ως σύνολο. Θεωρητικά, αυτό βασίζεται στις αρχές της [Συλλογικής Νοημοσύνης](https://en.wikipedia.org/wiki/Collective_intelligence), της [Αναδυόμενης Θεωρίας](https://en.wikipedia.org/wiki/Global_brain) και της [Εξελικτικής Κυβερνητικής](https://en.wikipedia.org/wiki/Global_brain), οι οποίες δηλώνουν ότι συστήματα υψηλότερου επιπέδου αποκτούν κάποιο είδος πρόσθετης αξίας όταν συνδυάζονται σωστά από συστήματα χαμηλότερου επιπέδου (το λεγόμενο *αρχή της μετάβασης μεταξύ συστημάτων*).
|
||||
|
||||
## [Κουίζ πριν τη διάλεξη](https://ff-quizzes.netlify.app/en/ai/quiz/45)
|
||||
## [Προ-διάλεξη κουίζ](https://ff-quizzes.netlify.app/en/ai/quiz/45)
|
||||
|
||||
Η κατεύθυνση των **Πολυπρακτορικών Συστημάτων** εμφανίστηκε στην Τεχνητή Νοημοσύνη τη δεκαετία του 1990 ως απάντηση στην ανάπτυξη του Διαδικτύου και των κατανεμημένων συστημάτων. Ένα από τα κλασικά εγχειρίδια Τεχνητής Νοημοσύνης, το [Artificial Intelligence: A Modern Approach](https://en.wikipedia.org/wiki/Artificial_Intelligence:_A_Modern_Approach), εστιάζει στην κλασική Τεχνητή Νοημοσύνη από την οπτική των Πολυπρακτορικών Συστημάτων.
|
||||
Η κατεύθυνση των **Συστημάτων Πολλαπλών Πρακτόρων** εμφανίστηκε στην Τεχνητή Νοημοσύνη τη δεκαετία του 1990 ως απάντηση στην ανάπτυξη του Διαδικτύου και των κατανεμημένων συστημάτων. Ένα από τα κλασικά εγχειρίδια ΤΝ, [Τεχνητή Νοημοσύνη: Μια Σύγχρονη Προσέγγιση](https://en.wikipedia.org/wiki/Artificial_Intelligence:_A_Modern_Approach), εστιάζει στην όψη της κλασικής ΤΝ από την πλευρά των Συστημάτων Πολλαπλών Πρακτόρων.
|
||||
|
||||
Κεντρική έννοια στην πολυπρακτορική προσέγγιση είναι η έννοια του **Πράκτορα** - μιας οντότητας που ζει σε κάποιο **περιβάλλον**, το οποίο μπορεί να αντιλαμβάνεται και να επενεργεί σε αυτό. Αυτή είναι μια πολύ ευρεία έννοια, και μπορεί να υπάρχουν πολλοί διαφορετικοί τύποι και ταξινομήσεις πρακτόρων:
|
||||
Κεντρικό στην προσέγγιση πολλαπλών πρακτόρων είναι η έννοια του **Πράκτορα** - μιας οντότητας που ζει σε κάποιο **περιβάλλον**, το οποίο μπορεί να αντιλαμβάνεται και να επηρεάζει. Πρόκειται για έναν πολύ ευρύ ορισμό, και μπορεί να υπάρξουν πολλοί διαφορετικοί τύποι και ταξινομήσεις πρακτόρων:
|
||||
|
||||
* Με βάση την ικανότητά τους να συλλογίζονται:
|
||||
- **Αντιδραστικοί** πράκτορες έχουν συνήθως απλή συμπεριφορά τύπου αίτησης-απάντησης
|
||||
- **Στοχαστικοί** πράκτορες χρησιμοποιούν κάποια μορφή λογικής συλλογιστικής ή/και ικανότητες σχεδιασμού
|
||||
* Με βάση τον τόπο εκτέλεσης του κώδικα του πράκτορα:
|
||||
- **Στατικοί** πράκτορες λειτουργούν σε έναν αφιερωμένο κόμβο δικτύου
|
||||
- **Κινητοί** πράκτορες μπορούν να μετακινούν τον κώδικά τους μεταξύ κόμβων δικτύου
|
||||
* Με βάση τη συμπεριφορά τους:
|
||||
- **Παθητικοί πράκτορες** δεν έχουν συγκεκριμένους στόχους. Μπορούν να αντιδρούν σε εξωτερικά ερεθίσματα, αλλά δεν θα ξεκινήσουν δράσεις από μόνοι τους.
|
||||
- **Ενεργοί πράκτορες** έχουν κάποιους στόχους που επιδιώκουν
|
||||
- **Γνωστικοί πράκτορες** περιλαμβάνουν σύνθετο σχεδιασμό και συλλογιστική
|
||||
* Αναλόγως της ικανότητάς τους να συλλογίζονται:
|
||||
- **Αντιδραστικοί** πράκτορες έχουν συνήθως απλή συμπεριφορά τύπου αίτημα-απάντησης
|
||||
- **Στοχαστικοί** πράκτορες χρησιμοποιούν κάποιο είδος λογικής σκέψης και/ή σχεδιασμού
|
||||
* Αναλόγως του τόπου εκτέλεσης του κώδικα πρακτορα:
|
||||
- **Στατικοί** πράκτορες εργάζονται σε έναν αφιερωμένο κόμβο δικτύου
|
||||
- **Κινητοί** πράκτορες μπορούν να μεταφέρουν τον κώδικά τους μεταξύ κόμβων δικτύου
|
||||
* Αναλόγως της συμπεριφοράς τους:
|
||||
- **Παθητικοί πράκτορες** δεν έχουν συγκεκριμένους στόχους. Τέτοιοι πράκτορες μπορούν να αντιδρούν σε εξωτερικά ερεθίσματα, αλλά δεν θα ξεκινήσουν δράσεις από μόνοι τους.
|
||||
- **Ενεργητικοί πράκτορες** έχουν κάποιους στόχους που επιδιώκουν
|
||||
- **Γνωστικοί πράκτορες** εμπλέκουν σύνθετο σχεδιασμό και σκέψη
|
||||
|
||||
Τα πολυπρακτορικά συστήματα χρησιμοποιούνται σήμερα σε πολλές εφαρμογές:
|
||||
Τα συστήματα πολλαπλών πρακτόρων χρησιμοποιούνται σήμερα σε μια σειρά από εφαρμογές:
|
||||
|
||||
* Στα παιχνίδια, πολλοί χαρακτήρες που δεν ελέγχονται από τον παίκτη χρησιμοποιούν κάποια μορφή Τεχνητής Νοημοσύνης και μπορούν να θεωρηθούν ευφυείς πράκτορες
|
||||
* Στην παραγωγή βίντεο, η απόδοση σύνθετων 3D σκηνών που περιλαμβάνουν πλήθη γίνεται συνήθως με προσομοίωση πολυπρακτορικών συστημάτων
|
||||
* Στη μοντελοποίηση συστημάτων, η πολυπρακτορική προσέγγιση χρησιμοποιείται για την προσομοίωση της συμπεριφοράς ενός σύνθετου μοντέλου. Για παράδειγμα, η πολυπρακτορική προσέγγιση έχει χρησιμοποιηθεί με επιτυχία για την πρόβλεψη της εξάπλωσης της νόσου COVID-19 παγκοσμίως. Παρόμοια προσέγγιση μπορεί να χρησιμοποιηθεί για τη μοντελοποίηση της κυκλοφορίας στην πόλη και την παρακολούθηση της αντίδρασής της σε αλλαγές στους κανόνες κυκλοφορίας.
|
||||
* Σε σύνθετα αυτοματοποιημένα συστήματα, κάθε συσκευή μπορεί να λειτουργεί ως ανεξάρτητος πράκτορας, καθιστώντας το σύστημα συνολικά λιγότερο μονολιθικό και πιο ανθεκτικό.
|
||||
* Σε παιχνίδια, πολλοί μη-παίκτες χαρακτήρες χρησιμοποιούν κάποιο είδος ΤΝ, και μπορεί να θεωρηθούν ως ευφυείς πράκτορες
|
||||
* Στην παραγωγή βίντεο, η απεικόνιση σύνθετων 3D σκηνών με πλήθη γίνεται συνήθως με πολυπρακτορική προσομοίωση
|
||||
* Στην μοντελοποίηση συστημάτων, η πολυπρακτορική προσέγγιση χρησιμοποιείται για την προσομοίωση συμπεριφοράς ενός σύνθετου μοντέλου. Για παράδειγμα, έχει χρησιμοποιηθεί επιτυχώς για την πρόβλεψη της εξάπλωσης της νόσου COVID-19 παγκοσμίως. Παρόμοια προσέγγιση μπορεί να χρησιμοποιηθεί για μοντελοποίηση της κυκλοφορίας στην πόλη και να δούμε πώς αυτή αντιδρά στις αλλαγές των κανόνων κυκλοφορίας.
|
||||
* Σε σύνθετα συστήματα αυτοματισμού, κάθε συσκευή μπορεί να λειτουργεί ως ανεξάρτητος πράκτορας, κάνοντας το σύστημα συνολικά λιγότερο μονολιθικό και πιο ανθεκτικό.
|
||||
|
||||
Δεν θα αφιερώσουμε πολύ χρόνο για να εμβαθύνουμε στα πολυπρακτορικά συστήματα, αλλά θα εξετάσουμε ένα παράδειγμα **Πολυπρακτορικής Μοντελοποίησης**.
|
||||
Δεν θα αφιερώσουμε πολύ χρόνο σε βάθος στα συστήματα πολλαπλών πρακτόρων, αλλά θα εξετάσουμε ένα παράδειγμα **Πολυπρακτορικής Μοντελοποίησης**.
|
||||
|
||||
## NetLogo
|
||||
|
||||
Το [NetLogo](https://ccl.northwestern.edu/netlogo/) είναι ένα περιβάλλον πολυπρακτορικής μοντελοποίησης βασισμένο σε μια τροποποιημένη έκδοση της γλώσσας προγραμματισμού [Logo](https://en.wikipedia.org/wiki/Logo_(programming_language)). Αυτή η γλώσσα αναπτύχθηκε για τη διδασκαλία εννοιών προγραμματισμού σε παιδιά και σας επιτρέπει να ελέγχετε έναν πράκτορα που ονομάζεται **χελώνα**, η οποία μπορεί να κινείται αφήνοντας ένα ίχνος πίσω της. Αυτό επιτρέπει τη δημιουργία σύνθετων γεωμετρικών σχημάτων, που αποτελεί έναν πολύ οπτικό τρόπο κατανόησης της συμπεριφοράς ενός πράκτορα.
|
||||
Το [NetLogo](https://ccl.northwestern.edu/netlogo/) είναι ένα περιβάλλον πολυπρακτορικής μοντελοποίησης βασισμένο σε τροποποιημένη έκδοση της γλώσσας προγραμματισμού [Logo](https://en.wikipedia.org/wiki/Logo_(programming_language)). Αυτή η γλώσσα αναπτύχθηκε για τη διδασκαλία προγραμματισμού σε παιδιά, και επιτρέπει τον έλεγχο ενός πράκτορα που ονομάζεται **χελώνα**, ο οποίος μπορεί να κινείται αφήνοντας ίχνος. Αυτό επιτρέπει τη δημιουργία σύνθετων γεωμετρικών σχημάτων, που είναι ένας πολύ οπτικός τρόπος κατανόησης της συμπεριφοράς ενός πράκτορα.
|
||||
|
||||
Στο NetLogo, μπορούμε να δημιουργήσουμε πολλές χελώνες χρησιμοποιώντας την εντολή `create-turtles`. Στη συνέχεια, μπορούμε να δώσουμε εντολές σε όλες τις χελώνες να εκτελέσουν κάποιες ενέργειες (στο παρακάτω παράδειγμα - να κινηθούν 10 σημεία μπροστά):
|
||||
Στο NetLogo, μπορούμε να δημιουργήσουμε πολλές χελώνες χρησιμοποιώντας την εντολή `create-turtles`. Στη συνέχεια μπορούμε να δώσουμε εντολές σε όλες τις χελώνες να κάνουν κάποιες ενέργειες (στο παράδειγμα παρακάτω - διάβα 10 βήματα μπροστά):
|
||||
|
||||
```
|
||||
create-turtles 10
|
||||
|
|
@ -41,39 +41,39 @@ ask turtles [
|
|||
]
|
||||
```
|
||||
|
||||
Φυσικά, δεν είναι ενδιαφέρον όταν όλες οι χελώνες κάνουν το ίδιο πράγμα, οπότε μπορούμε να `ask` ομάδες χελωνών, π.χ. εκείνες που βρίσκονται κοντά σε ένα συγκεκριμένο σημείο. Μπορούμε επίσης να δημιουργήσουμε χελώνες διαφορετικών *φυλών* χρησιμοποιώντας την εντολή `breed [cats cat]`. Εδώ το `cat` είναι το όνομα της φυλής, και πρέπει να καθορίσουμε τόσο τη μοναδική όσο και την πληθυντική μορφή της λέξης, επειδή διαφορετικές εντολές χρησιμοποιούν διαφορετικές μορφές για λόγους σαφήνειας.
|
||||
Φυσικά, δεν είναι ενδιαφέρον όταν όλες οι χελώνες κάνουν το ίδιο πράγμα, οπότε μπορούμε να `ζητήσουμε` ομάδες χελωνών, π.χ. αυτές που βρίσκονται κοντά σε ένα συγκεκριμένο σημείο. Μπορούμε επίσης να δημιουργήσουμε χελώνες διαφορετικών *φυλών* χρησιμοποιώντας την εντολή `breed [cats cat]`. Εδώ το `cat` είναι το όνομα μιας φυλής, και πρέπει να προσδιορίσουμε τόσο τον ενικό όσο και τον πληθυντικό, επειδή διαφορετικές εντολές χρησιμοποιούν διαφορετικές μορφές για λόγους σαφήνειας.
|
||||
|
||||
> ✅ Δεν θα εμβαθύνουμε στη γλώσσα NetLogo - μπορείτε να επισκεφθείτε τον εξαιρετικό [Διαδραστικό Λεξικό NetLogo για Αρχάριους](https://ccl.northwestern.edu/netlogo/bind/) αν θέλετε να μάθετε περισσότερα.
|
||||
> ✅ Δεν θα εισέλθουμε στην εκμάθηση της γλώσσας NetLogo καθαυτής - μπορείτε να επισκεφθείτε τον εξαιρετικό πόρο [Αλληλεπιδραστικό Λεξικό NetLogo για Αρχάριους](https://ccl.northwestern.edu/netlogo/bind/) αν ενδιαφέρεστε να μάθετε περισσότερα.
|
||||
|
||||
Μπορείτε να [κατεβάσετε](https://ccl.northwestern.edu/netlogo/download.shtml) και να εγκαταστήσετε το NetLogo για να το δοκιμάσετε.
|
||||
|
||||
### Βιβλιοθήκη Μοντέλων
|
||||
|
||||
Ένα εξαιρετικό χαρακτηριστικό του NetLogo είναι ότι περιέχει μια βιβλιοθήκη έτοιμων μοντέλων που μπορείτε να δοκιμάσετε. Μεταβείτε στο **File → Models Library**, και θα βρείτε πολλές κατηγορίες μοντέλων για να επιλέξετε.
|
||||
Ένα ωραίο χαρακτηριστικό του NetLogo είναι ότι περιέχει μια βιβλιοθήκη λειτουργικών μοντέλων που μπορείτε να δοκιμάσετε. Μεταβείτε στο **File → Models Library**, και θα βρείτε πολλές κατηγορίες μοντέλων για επιλογή.
|
||||
|
||||
<img alt="Βιβλιοθήκη Μοντέλων NetLogo" src="../../../../../translated_images/el/NetLogo-ModelLib.efe023afb4763c05.webp" width="60%"/>
|
||||
|
||||
> Στιγμιότυπο οθόνης της βιβλιοθήκης μοντέλων από τον Dmitry Soshnikov
|
||||
> Ένα στιγμιότυπο της βιβλιοθήκης μοντέλων από τον Dmitry Soshnikov
|
||||
|
||||
Μπορείτε να ανοίξετε ένα από τα μοντέλα, για παράδειγμα **Biology → Flocking**.
|
||||
|
||||
### Κύριες Αρχές
|
||||
|
||||
Αφού ανοίξετε το μοντέλο, μεταφέρεστε στην κύρια οθόνη του NetLogo. Εδώ είναι ένα δείγμα μοντέλου που περιγράφει τον πληθυσμό λύκων και προβάτων, δεδομένων πεπερασμένων πόρων (γρασίδι).
|
||||
Μετά το άνοιγμα του μοντέλου, μεταφέρεστε στην κύρια οθόνη NetLogo. Ακολουθεί ένα δείγμα μοντέλου που περιγράφει τον πληθυσμό λύκων και προβάτων, με δεδομένους πεπερασμένους πόρους (χλόη).
|
||||
|
||||

|
||||
|
||||
> Στιγμιότυπο οθόνης από τον Dmitry Soshnikov
|
||||
|
||||
Σε αυτή την οθόνη, μπορείτε να δείτε:
|
||||
Σε αυτήν την οθόνη, μπορείτε να δείτε:
|
||||
|
||||
* Την ενότητα **Interface**, η οποία περιέχει:
|
||||
* Το τμήμα **Διεπαφής** που περιέχει:
|
||||
- Το κύριο πεδίο, όπου ζουν όλοι οι πράκτορες
|
||||
- Διάφορα χειριστήρια: κουμπιά, ρυθμιστικά κ.λπ.
|
||||
- Γραφήματα που μπορείτε να χρησιμοποιήσετε για να εμφανίσετε παραμέτρους της προσομοίωσης
|
||||
* Την καρτέλα **Code**, η οποία περιέχει τον επεξεργαστή, όπου μπορείτε να πληκτρολογήσετε πρόγραμμα NetLogo
|
||||
- Διάφορους ελέγχους: κουμπιά, ρυθμιστικά, κλπ.
|
||||
- Γραφήματα που μπορείτε να χρησιμοποιήσετε για την εμφάνιση παραμέτρων της προσομοίωσης
|
||||
* Την καρτέλα **Κώδικα** που περιέχει τον επεξεργαστή, όπου μπορείτε να πληκτρολογήσετε πρόγραμμα NetLogo
|
||||
|
||||
Στις περισσότερες περιπτώσεις, η διεπαφή θα έχει ένα κουμπί **Setup**, το οποίο αρχικοποιεί την κατάσταση της προσομοίωσης, και ένα κουμπί **Go** που ξεκινά την εκτέλεση. Αυτά χειρίζονται οι αντίστοιχοι χειριστές στον κώδικα που μοιάζουν ως εξής:
|
||||
Στις περισσότερες περιπτώσεις, η διεπαφή έχει ένα κουμπί **Setup**, που αρχικοποιεί την κατάσταση της προσομοίωσης, και ένα κουμπί **Go** που ξεκινά την εκτέλεση. Αυτά χειρίζονται οι αντίστοιχοι χειριστές στον κώδικα που μοιάζουν ως εξής:
|
||||
|
||||
```
|
||||
to go [
|
||||
|
|
@ -81,48 +81,79 @@ to go [
|
|||
]
|
||||
```
|
||||
|
||||
Ο κόσμος του NetLogo αποτελείται από τα εξής αντικείμενα:
|
||||
Ο κόσμος του NetLogo αποτελείται από τα παρακάτω αντικείμενα:
|
||||
|
||||
* **Πράκτορες** (χελώνες) που μπορούν να κινούνται στο πεδίο και να κάνουν κάτι. Δίνετε εντολές στους πράκτορες χρησιμοποιώντας τη σύνταξη `ask turtles [...]`, και ο κώδικας στις αγκύλες εκτελείται από όλους τους πράκτορες σε *λειτουργία χελώνας*.
|
||||
* **Κομμάτια** είναι τετράγωνα τμήματα του πεδίου, πάνω στα οποία ζουν οι πράκτορες. Μπορείτε να αναφέρεστε σε όλους τους πράκτορες στο ίδιο κομμάτι ή να αλλάζετε τα χρώματα και άλλες ιδιότητες των κομματιών. Μπορείτε επίσης να `ask patches` να κάνουν κάτι.
|
||||
* **Παρατηρητής** είναι ένας μοναδικός πράκτορας που ελέγχει τον κόσμο. Όλοι οι χειριστές κουμπιών εκτελούνται σε *λειτουργία παρατηρητή*.
|
||||
* **Πράκτορες** (χελώνες) που μπορούν να κινηθούν σε όλο το πεδίο και να κάνουν κάτι. Δίνετε εντολές σε πράκτορες χρησιμοποιώντας τη σύνταξη `ask turtles [...]`, και ο κώδικας στις παρενθέσεις εκτελείται από όλους τους πράκτορες σε *λειτουργία χελώνας*.
|
||||
* **Πατσέτες** είναι τετράγωνες περιοχές του πεδίου, όπου ζουν οι πράκτορες. Μπορείτε να αναφερθείτε σε όλους τους πράκτορες στην ίδια πατσέτα, ή να αλλάξετε τα χρώματα των πατσέτων και άλλες ιδιότητες. Μπορείτε επίσης να `ask patches` να κάνουν κάτι.
|
||||
* Ο **Παρατηρητής** είναι ένας μοναδικός πράκτορας που ελέγχει τον κόσμο. Όλοι οι χειριστές κουμπιών εκτελούνται σε *λειτουργία παρατηρητή*.
|
||||
|
||||
> ✅ Η ομορφιά ενός πολυπρακτορικού περιβάλλοντος είναι ότι ο κώδικας που εκτελείται σε λειτουργία χελώνας ή κομματιού εκτελείται ταυτόχρονα από όλους τους πράκτορες παράλληλα. Έτσι, γράφοντας λίγο κώδικα και προγραμματίζοντας τη συμπεριφορά ενός μεμονωμένου πράκτορα, μπορείτε να δημιουργήσετε σύνθετη συμπεριφορά του συστήματος προσομοίωσης συνολικά.
|
||||
> ✅ Η ωραιότητα ενός περιβάλλοντος πολλαπλών πρακτόρων είναι ότι ο κώδικας που τρέχει σε λειτουργία χελώνας ή πατσέτας εκτελείται ταυτόχρονα από όλους τους πράκτορες παράλληλα. Έτσι, γράφοντας λίγες γραμμές κώδικα και προγραμματίζοντας τη συμπεριφορά ενός μεμονωμένου πράκτορα, μπορείτε να δημιουργήσετε σύνθετη συμπεριφορά του συστήματος προσομοίωσης συνολικά.
|
||||
|
||||
### Συμπεριφορά Σμήνους
|
||||
### Flocking
|
||||
|
||||
Ως παράδειγμα πολυπρακτορικής συμπεριφοράς, ας εξετάσουμε τη **[Συμπεριφορά Σμήνους](https://en.wikipedia.org/wiki/Flocking_(behavior))**. Η συμπεριφορά σμήνους είναι ένα σύνθετο μοτίβο που μοιάζει πολύ με τον τρόπο που πετούν τα σμήνη πουλιών. Παρατηρώντας τα να πετούν, μπορεί να σκεφτείτε ότι ακολουθούν κάποιο είδος συλλογικού αλγορίθμου ή ότι διαθέτουν κάποια μορφή *συλλογικής νοημοσύνης*. Ωστόσο, αυτή η σύνθετη συμπεριφορά προκύπτει όταν κάθε μεμονωμένος πράκτορας (σε αυτή την περίπτωση, ένα *πουλί*) παρατηρεί μόνο κάποιους άλλους πράκτορες σε μικρή απόσταση από αυτό και ακολουθεί τρεις απλούς κανόνες:
|
||||
Ως παράδειγμα πολυπρακτορικής συμπεριφοράς, ας εξετάσουμε το **[Flocking](https://en.wikipedia.org/wiki/Flocking_(behavior))**. Το Flocking είναι ένα σύνθετο μοτίβο που μοιάζει πολύ με το πώς πετούν οι σμήνη πουλιών. Βλέποντάς τα να πετούν μπορεί να σκεφτείτε ότι ακολουθούν κάποιο είδος συλλογικού αλγόριθμου, ή ότι κατέχουν κάποια μορφή *συλλογικής νοημοσύνης*. Ωστόσο, αυτή η σύνθετη συμπεριφορά εμφανίζεται όταν κάθε μεμονωμένος πράκτορας (σε αυτή την περίπτωση, ένα *πουλί*) παρατηρεί μόνο κάποιους άλλους πράκτορες σε μικρή απόσταση από αυτό και ακολουθεί τρεις απλούς κανόνες:
|
||||
|
||||
* **Ευθυγράμμιση** - κατευθύνεται προς τη μέση κατεύθυνση των γειτονικών πρακτόρων
|
||||
* **Συνοχή** - προσπαθεί να κατευθυνθεί προς τη μέση θέση των γειτόνων (*έλξη μακράς εμβέλειας*)
|
||||
* **Διαχωρισμός** - όταν πλησιάζει πολύ άλλα πουλιά, προσπαθεί να απομακρυνθεί (*απώθηση μικρής εμβέλειας*)
|
||||
* **Ευθυγράμμιση** - στρέφεται προς τη μέση κατεύθυνση των γειτονικών πρακτόρων
|
||||
* **Συσπείρωση** - προσπαθεί να στρέφεται προς τη μέση θέση των γειτόνων (*ελκτική δύναμη μακρυά*)
|
||||
* **Απόσταση** - όταν πλησιάζει πολύ άλλα πουλιά, προσπαθεί να απομακρυνθεί (*απωθητική δύναμη κοντά*)
|
||||
|
||||
Μπορείτε να εκτελέσετε το παράδειγμα συμπεριφοράς σμήνους και να παρατηρήσετε τη συμπεριφορά. Μπορείτε επίσης να προσαρμόσετε παραμέτρους, όπως τον *βαθμό διαχωρισμού* ή την *εμβέλεια ορατότητας*, που καθορίζει πόσο μακριά μπορεί να δει κάθε πουλί. Σημειώστε ότι αν μειώσετε την εμβέλεια ορατότητας στο 0, όλα τα πουλιά γίνονται τυφλά και η συμπεριφορά σμήνους σταματά. Αν μειώσετε τον διαχωρισμό στο 0, όλα τα πουλιά συγκεντρώνονται σε μια ευθεία γραμμή.
|
||||
Μπορείτε να τρέξετε το παράδειγμα flocking και να παρατηρήσετε τη συμπεριφορά. Μπορείτε επίσης να ρυθμίσετε παραμέτρους, όπως το *βαθμό απομάκρυνσης*, ή το *πεδίο οπτικής*, που ορίζει πόσο μακριά βλέπει κάθε πουλί. Σημειώστε ότι αν μειώσετε το πεδίο οπτικής στο 0, όλα τα πουλιά γίνονται τυφλά και το flocking σταματά. Αν μειώσετε την απομάκρυνση στο 0, όλα τα πουλιά μαζεύονται σε μία ευθεία γραμμή.
|
||||
|
||||
> ✅ Μεταβείτε στην καρτέλα **Code** και δείτε πού υλοποιούνται οι τρεις κανόνες της συμπεριφοράς σμήνους (ευθυγράμμιση, συνοχή και διαχωρισμός) στον κώδικα. Σημειώστε πώς αναφερόμαστε μόνο σε εκείνους τους πράκτορες που βρίσκονται εντός ορατότητας.
|
||||
> ✅ Μεταβείτε στην καρτέλα **Κώδικας** και δείτε πού οι τρεις κανόνες flocking (ευθυγράμμιση, συσπείρωση και απόσταση) υλοποιούνται στον κώδικα. Προσεξτε πως αναφερόμαστε μόνο σε εκείνους τους πράκτορες που είναι ορατοί.
|
||||
|
||||
### Άλλα Μοντέλα για Εξερεύνηση
|
||||
### Άλλα μοντέλα για να δείτε
|
||||
|
||||
Υπάρχουν μερικά ακόμη ενδιαφέροντα μοντέλα που μπορείτε να πειραματιστείτε:
|
||||
Υπάρχουν μερικά ακόμη ενδιαφέροντα μοντέλα με τα οποία μπορείτε να πειραματιστείτε:
|
||||
|
||||
* **Art → Fireworks** δείχνει πώς ένα πυροτέχνημα μπορεί να θεωρηθεί συλλογική συμπεριφορά μεμονωμένων ρευμάτων φωτιάς
|
||||
* **Social Science → Traffic Basic** και **Social Science → Traffic Grid** δείχνουν το μοντέλο κυκλοφορίας πόλης σε 1D και 2D πλέγμα με ή χωρίς φανάρια. Κάθε αυτοκίνητο στην προσομοίωση ακολουθεί τους εξής κανόνες:
|
||||
- Αν ο χώρος μπροστά του είναι κενός - επιταχύνει (μέχρι μια συγκεκριμένη μέγιστη ταχύτητα)
|
||||
- Αν βλέπει εμπόδιο μπροστά - φρενάρει (και μπορείτε να προσαρμόσετε πόσο μακριά μπορεί να δει ο οδηγός)
|
||||
* **Art → Fireworks** δείχνει πώς ένα πυροτέχνημα μπορεί να θεωρηθεί συλλογική συμπεριφορά ατομικών ρευμάτων φωτιάς
|
||||
* **Social Science → Traffic Basic** και **Social Science → Traffic Grid** δείχνουν το μοντέλο της κυκλοφορίας στην πόλη σε 1Δ και 2Δ πλέγμα με ή χωρίς φανάρια. Κάθε αυτοκίνητο στην προσομοίωση ακολουθεί τους παρακάτω κανόνες:
|
||||
- Αν ο χώρος μπροστά του είναι ελεύθερος - επιταχύνει (μέχρι μια μέγιστη ταχύτητα)
|
||||
- Αν βλέπει εμπόδιο μπροστά - φρενάρει (και μπορείτε να ρυθμίσετε πόσο μακριά βλέπει ο οδηγός)
|
||||
* **Social Science → Party** δείχνει πώς οι άνθρωποι συγκεντρώνονται κατά τη διάρκεια ενός κοκτέιλ πάρτι. Μπορείτε να βρείτε τον συνδυασμό παραμέτρων που οδηγεί στη γρηγορότερη αύξηση της ευτυχίας της ομάδας.
|
||||
|
||||
Όπως βλέπετε από αυτά τα παραδείγματα, οι πολυπρακτορικές προσομοιώσεις μπορούν να είναι ένας πολύ χρήσιμος τρόπος για να κατανοήσουμε τη συμπεριφορά ενός σύνθετου συστήματος που αποτελείται από άτομα που ακολουθούν την ίδια ή παρόμοια λογική. Μπορεί επίσης να χρησιμοποιηθεί για τον έλεγχο εικονικών πρακτόρων, όπως [NPCs](https://en.wikipedia.org/wiki/NPC) σε παιχνίδια υπολογιστή ή πρακτόρων σε 3D κόσμους κινουμένων σχεδίων.
|
||||
Όπως βλέπετε από αυτά τα παραδείγματα, οι πολυπρακτορικές προσομοιώσεις μπορούν να είναι ένα αρκετά χρήσιμο εργαλείο για την κατανόηση της συμπεριφοράς ενός πολύπλοκου συστήματος που αποτελείται από άτομα που ακολουθούν την ίδια ή παρόμοια λογική. Μπορεί επίσης να χρησιμοποιηθεί για τον έλεγχο εικονικών πρακτόρων, όπως [NPCs](https://en.wikipedia.org/wiki/NPC) σε βιντεοπαιχνίδια, ή πρακτόρων σε 3D κινούμενους κόσμους.
|
||||
|
||||
## Στοχαστικοί Πράκτορες
|
||||
|
||||
Οι πράκτορες που περιγράφηκαν παραπάνω είναι πολύ απλοί, αντιδρώντας σε αλλαγές στο περιβάλλον χρησιμοποιώντας κάποιο είδος αλγορίθμου. Ως εκ τούτου, είναι **αντιδραστικοί πράκτορες**. Ωστόσο, μερικές φορές οι πράκτορες μπορούν να συλλογίζονται και να σχεδιάζουν τις ενέργειές τους, οπότε ονομάζονται **στοχαστικοί**.
|
||||
Οι πράκτορες που περιγράφηκαν παραπάνω είναι πολύ απλοί, αντιδρώντας σε αλλαγές στο περιβάλλον με κάποιο είδος αλγορίθμου. Ως τέτοιοι είναι **αντιδραστικοί πράκτορες**. Ωστόσο, μερικές φορές οι πράκτορες μπορούν να συλλογιστούν και να σχεδιάσουν τις ενέργειές τους, οπότε ονομάζονται **στοχαστικοί**.
|
||||
|
||||
Ένα τυπικό παράδειγμα θα ήταν ένας προσωπικός πράκτορας που λαμβάνει μια εντολή από έναν άνθρωπο να κλείσει ένα πακέτο διακοπών. Υποθέστε ότι υπάρχουν πολλοί πράκτορες που ζουν στο διαδίκτυο και μπορούν να τον βοηθήσουν. Θα πρέπει τότε να επικοινωνήσει με άλλους πράκτορες για να δει ποιες πτήσεις είναι διαθέσιμες, ποιες είναι οι τιμές των ξενοδοχείων για διαφορετικές ημερομηνίες και να προσπαθήσει να διαπραγματευτεί την καλύτερη τιμή. Όταν το σχέδιο διακοπών ολοκληρωθεί και επιβεβαιωθεί από τον ιδιοκτήτη, μπορεί να προχωρήσει στην κράτηση.
|
||||
Ένα τυπικό παράδειγμα θα ήταν ένας προσωπικός πράκτορας που λαμβάνει οδηγία από έναν άνθρωπο να κλείσει ένα τουριστικό ταξίδι. Υποθέστε ότι υπάρχουν πολλοί πράκτορες στο διαδίκτυο που μπορούν να τον βοηθήσουν. Τότε θα πρέπει να επικοινωνήσει με άλλους πράκτορες για να δει ποιες πτήσεις είναι διαθέσιμες, ποιες είναι οι τιμές ξενοδοχείων για διάφορες ημερομηνίες, και να προσπαθήσει να διαπραγματευτεί την καλύτερη τιμή. Όταν το σχέδιο διακοπών ολοκληρωθεί και επιβεβαιωθεί από τον ιδιοκτήτη, μπορεί να προχωρήσει στην κράτηση.
|
||||
|
||||
Για να το κάνει αυτό, οι πράκτορες πρέπει να **επικοινωνούν**. Για επιτυχημένη επικοινωνία χρειάζονται:
|
||||
Για να το κάνει αυτό, οι πράκτορες πρέπει να **επικοινωνούν**. Για να πετύχουν αποτελεσματική επικοινωνία χρειάζονται:
|
||||
|
||||
* Κάποιες **τυποποιημένες γλώσσες για την ανταλλαγή γνώσης**, όπως [Knowledge Interchange Format](https://en.wikipedia.org/wiki/Knowledge_Interchange_Format) (KIF) και [Knowledge Query and Manipulation Language](https://en.wikipedia.org/wiki/Knowledge_Query_and_Manipulation_Language) (KQML). Αυτές οι γλώσσες σχεδιάζονται με βάση τη [Θεωρία Πράξεων Ομιλίας](https://en.wikipedia.org/wiki/Speech_act).
|
||||
* Αυτές οι γλώσσες πρέπει επίσης να περιλαμβάνουν κάποιες **πρωτόκολλες για
|
||||
* Κάποιες **τυποποιημένες γλώσσες ανταλλαγής γνώσης**, όπως η [Γλώσσα Ανταλλαγής Γνώσης](https://en.wikipedia.org/wiki/Knowledge_Interchange_Format) (KIF) και η [Γλώσσα Ερωτημάτων και Διαχείρισης Γνώσης](https://en.wikipedia.org/wiki/Knowledge_Query_and_Manipulation_Language) (KQML). Αυτές οι γλώσσες έχουν σχεδιαστεί με βάση τη [θεωρία των ενεργειών λόγου](https://en.wikipedia.org/wiki/Speech_act).
|
||||
* Αυτές οι γλώσσες θα πρέπει επίσης να περιλαμβάνουν κάποια **πρωτόκολλα διαπραγμάτευσης**, βασισμένα σε διαφορετικά **είδη δημοπρασίας**.
|
||||
* Μία **κοινή οντολογία** να χρησιμοποιούν, έτσι ώστε να αναφέρονται στις ίδιες έννοιες γνωρίζοντας τη σημασία τους
|
||||
* Έναν τρόπο να **ανακαλύπτουν** τι μπορεί να κάνει κάθε διαφορετικός πράκτορας, επίσης βάσει κάποιας μορφής οντολογίας
|
||||
|
||||
Οι στοχαστικοί πράκτορες είναι πολύ πιο σύνθετοι από τους αντιδραστικούς, επειδή όχι μόνο αντιδρούν σε αλλαγές στο περιβάλλον, αλλά θα πρέπει επίσης να μπορούν να *ξεκινήσουν* ενέργειες. Μία από τις προτεινόμενες αρχιτεκτονικές για στοχαστικούς πράκτορες είναι ο λεγόμενος πράκτορας Πίστη-Επιθυμία-Πρόθεση (BDI):
|
||||
|
||||
* Οι **Πιστεύεις** σχηματίζουν ένα σύνολο γνώσης για το περιβάλλον ενός πράκτορα. Μπορεί να είναι δομημένες ως βάση γνώσης ή σύνολο κανόνων που ένας πράκτορας μπορεί να εφαρμόσει σε μια συγκεκριμένη κατάσταση στο περιβάλλον.
|
||||
* Οι **Επιθυμίες** ορίζουν τι θέλει να κάνει ένας πράκτορας, δηλαδή τους στόχους του. Για παράδειγμα, ο στόχος του βοηθητικού πράκτορα προσωπικού παραπάνω είναι να κλείσει μια εκδρομή, και ο στόχος ενός πράκτορα ξενοδοχείου είναι να μεγιστοποιήσει το κέρδος.
|
||||
* Οι **Προθέσεις** είναι συγκεκριμένες ενέργειες που σχεδιάζει να κάνει ο πράκτορας για να επιτύχει τους στόχους του. Οι ενέργειες τυπικά αλλάζουν το περιβάλλον και προκαλούν επικοινωνία με άλλους πράκτορες.
|
||||
|
||||
Υπάρχουν πλατφόρμες διαθέσιμες για την κατασκευή συστημάτων πολλαπλών πρακτόρων, όπως το [JADE](https://jade.tilab.com/). [Αυτό το άρθρο](https://arxiv.org/ftp/arxiv/papers/2007/2007.08961.pdf) περιέχει ανασκόπηση πλατφορμών πολλαπλών πρακτόρων, μαζί με μια σύντομη ιστορία των συστημάτων πολλαπλών πρακτόρων και των διαφόρων σεναρίων χρήσης τους.
|
||||
|
||||
## Συμπέρασμα
|
||||
|
||||
Τα συστήματα πολλαπλών πρακτόρων μπορούν να πάρουν πολύ διαφορετικές μορφές και να χρησιμοποιηθούν σε πολλές διαφορετικές εφαρμογές.
|
||||
Όλα συγκλίνουν στο να εστιάζουν στη λιγότερο σύνθετη συμπεριφορά ενός μεμονωμένου πράκτορα, και να επιτυγχάνουν πιο σύνθετη συμπεριφορά του συνολικού συστήματος λόγω **συνεργιστικού αποτελέσματος**.
|
||||
|
||||
## 🚀 Πρόκληση
|
||||
|
||||
Πάρτε αυτό το μάθημα στην πραγματική ζωή και δοκιμάστε να εννοιολογήσετε ένα σύστημα πολλαπλών πρακτόρων που μπορεί να λύσει ένα πρόβλημα. Τι, για παράδειγμα, θα χρειαστεί να κάνει ένα σύστημα πολλαπλών πρακτόρων για να βελτιστοποιήσει τη διαδρομή ενός σχολικού λεωφορείου; Πώς θα μπορούσε να λειτουργήσει σε ένα φούρνο;
|
||||
|
||||
## [Μετα-διάλεξη κουίζ](https://ff-quizzes.netlify.app/en/ai/quiz/46)
|
||||
|
||||
## Ανασκόπηση & Αυτο-Μελέτη
|
||||
|
||||
Ανασκοπήστε τη χρήση αυτού του τύπου συστήματος στη βιομηχανία. Επιλέξτε ένα τομέα όπως η κατασκευή ή η βιομηχανία βιντεοπαιχνιδιών και ανακαλύψτε πώς τα συστήματα πολλαπλών πρακτόρων μπορούν να χρησιμοποιηθούν για την επίλυση μοναδικών προβλημάτων.
|
||||
|
||||
## [Εργασία NetLogo](assignment.md)
|
||||
|
||||
---
|
||||
|
||||
<!-- 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": "es"
|
||||
},
|
||||
"CONTRIBUTING.md": {
|
||||
"original_hash": "c6fd7e781b67111a90abd166d0ce4aa0",
|
||||
"translation_date": "2026-07-08T20:19:23+00:00",
|
||||
"source_file": "CONTRIBUTING.md",
|
||||
"language_code": "es"
|
||||
},
|
||||
"README.md": {
|
||||
"original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b",
|
||||
"translation_date": "2026-04-06T15:32:56+00:00",
|
||||
|
|
@ -17,6 +23,19 @@
|
|||
"source_file": "SECURITY.md",
|
||||
"language_code": "es"
|
||||
},
|
||||
"__translation_failures__": {
|
||||
"lessons/sketchnotes/LICENSE.md": {
|
||||
"original_hash": "45ab63a2cd8f5faef6c9b150618837a4",
|
||||
"source_file": "lessons/sketchnotes/LICENSE.md",
|
||||
"language_code": "es",
|
||||
"failure_date": "2026-07-08T20:13:58+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-24T09:26:49+00:00",
|
||||
|
|
@ -54,8 +73,8 @@
|
|||
"language_code": "es"
|
||||
},
|
||||
"examples/README.md": {
|
||||
"original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7",
|
||||
"translation_date": "2025-10-03T11:26:17+00:00",
|
||||
"original_hash": "7883d52c2e2a221e0b07a7b112a149b9",
|
||||
"translation_date": "2026-07-08T20:08:45+00:00",
|
||||
"source_file": "examples/README.md",
|
||||
"language_code": "es"
|
||||
},
|
||||
|
|
@ -66,8 +85,8 @@
|
|||
"language_code": "es"
|
||||
},
|
||||
"lessons/0-course-setup/how-to-run.md": {
|
||||
"original_hash": "a4717bd9103b9f6cd84d534b83534689",
|
||||
"translation_date": "2026-01-15T10:47:10+00:00",
|
||||
"original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1",
|
||||
"translation_date": "2026-07-08T20:09:11+00:00",
|
||||
"source_file": "lessons/0-course-setup/how-to-run.md",
|
||||
"language_code": "es"
|
||||
},
|
||||
|
|
@ -191,6 +210,12 @@
|
|||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md",
|
||||
"language_code": "es"
|
||||
},
|
||||
"lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": {
|
||||
"original_hash": "99b816b6a4957ef4100cee4c4221dff9",
|
||||
"translation_date": "2026-07-08T20:01:29+00:00",
|
||||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb",
|
||||
"language_code": "es"
|
||||
},
|
||||
"lessons/4-ComputerVision/08-TransferLearning/lab/README.md": {
|
||||
"original_hash": "7765935c35fcee69b9fe2d0cfd6963e2",
|
||||
"translation_date": "2025-08-24T09:19:55+00:00",
|
||||
|
|
@ -330,8 +355,8 @@
|
|||
"language_code": "es"
|
||||
},
|
||||
"lessons/5-NLP/README.md": {
|
||||
"original_hash": "8ef02a9318257ea140ed3ed74442096d",
|
||||
"translation_date": "2025-08-24T09:11:33+00:00",
|
||||
"original_hash": "038df6f1a73e49f6430740da083bfd6d",
|
||||
"translation_date": "2026-07-08T20:09:47+00:00",
|
||||
"source_file": "lessons/5-NLP/README.md",
|
||||
"language_code": "es"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -0,0 +1,29 @@
|
|||
# Contribuyendo a AI-For-Beginners
|
||||
|
||||
¡Gracias por su interés en contribuir a AI-For-Beginners! Aceptamos traducciones, correcciones de lecciones y correcciones de formato.
|
||||
|
||||
## Acuerdo de Licencia para Colaboradores (CLA) de Microsoft
|
||||
|
||||
Este proyecto acepta contribuciones y sugerencias. La mayoría de las contribuciones requieren que acepte un Acuerdo de Licencia para Colaboradores (CLA) declarando que tiene el derecho y efectivamente nos concede los derechos para usar su contribución. Para más detalles, visite [https://cla.microsoft.com](https://cla.microsoft.com).
|
||||
|
||||
Cuando envíe una solicitud de extracción, un bot CLA determinará automáticamente si necesita proporcionar un CLA y decorará la solicitud de extracción adecuadamente (por ejemplo, etiqueta, comentario). Simplemente siga las instrucciones proporcionadas por el bot. Sólo tendrá que hacer esto una vez en todos los repositorios que utilizan nuestro CLA.
|
||||
|
||||
## Cómo Contribuir
|
||||
|
||||
### 1. Corregir errores tipográficos / errores de código
|
||||
Si encuentra un error tipográfico o un bug en cualquier cuaderno Jupyter o archivo markdown de una lección:
|
||||
1. Haga un fork del repositorio.
|
||||
2. Corrija el error tipográfico o el enlace roto.
|
||||
3. Envíe una solicitud de extracción con una descripción clara de la corrección.
|
||||
|
||||
### 2. Enviar Traducciones
|
||||
¡Aceptamos traducciones de las lecciones a otros idiomas! Por favor, coloque las traducciones en el directorio `translations/` usando los nombres de carpetas existentes allí (por ejemplo `translations/es/`, `translations/pt-BR/`, `translations/zh-CN/`).
|
||||
|
||||
Para más detalles, consulte [etc/CONTRIBUTING.md](etc/CONTRIBUTING.md).
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**Descargo de responsabilidad**:
|
||||
Este documento ha sido traducido utilizando el servicio de traducción automática [Co-op Translator](https://github.com/Azure/co-op-translator). Aunque nos esforzamos por la precisión, tenga en cuenta que las traducciones automatizadas pueden contener errores o inexactitudes. El documento original en su idioma nativo debe considerarse la fuente autorizada. Para información crítica, se recomienda una traducción profesional humana. No somos responsables de cualquier malentendido o interpretación errónea que surja del uso de esta traducción.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -1,79 +1,79 @@
|
|||
# Ejemplos de IA para Principiantes
|
||||
|
||||
¡Bienvenido! Este directorio contiene ejemplos simples e independientes para ayudarte a comenzar con la inteligencia artificial y el aprendizaje automático. Cada ejemplo está diseñado para ser accesible para principiantes, con comentarios detallados y explicaciones paso a paso.
|
||||
¡Bienvenido! Este directorio contiene ejemplos simples e independientes para ayudarte a comenzar con IA y aprendizaje automático. Cada ejemplo está diseñado para ser amigable para principiantes, con comentarios detallados y explicaciones paso a paso.
|
||||
|
||||
## 📚 Resumen de Ejemplos
|
||||
|
||||
| Ejemplo | Descripción | Dificultad | Requisitos Previos |
|
||||
|---------|-------------|------------|--------------------|
|
||||
| [Hola Mundo de IA](../../../examples/01-hello-ai-world.py) | Tu primer programa de IA: reconocimiento de patrones simple | ⭐ Principiante | Conceptos básicos de Python |
|
||||
| [Red Neuronal Simple](../../../examples/02-simple-neural-network.py) | Construye una red neuronal desde cero | ⭐⭐ Principiante+ | Python, matemáticas básicas |
|
||||
| [Clasificador de Imágenes](./03-image-classifier.ipynb) | Clasifica imágenes con un modelo preentrenado | ⭐⭐ Principiante+ | Python, numpy |
|
||||
| [Análisis de Sentimientos de Texto](../../../examples/04-text-sentiment.py) | Analiza el sentimiento de un texto (positivo/negativo) | ⭐⭐ Principiante+ | Python |
|
||||
| [Hello AI World](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/01-hello-ai-world.py) | Tu primer programa de IA - reconocimiento simple de patrones | ⭐ Principiante | Conceptos básicos de Python |
|
||||
| [Simple Neural Network](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/02-simple-neural-network.py) | Construye una red neuronal desde cero | ⭐⭐ Principiante+ | Python, matemáticas básicas |
|
||||
| [Image Classifier](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/03-image-classifier.ipynb) | Clasifica imágenes con un modelo preentrenado | ⭐⭐ Principiante+ | Python, numpy |
|
||||
| [Text Sentiment](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/04-text-sentiment.py) | Analiza el sentimiento del texto (positivo/negativo) | ⭐⭐ Principiante+ | Python |
|
||||
|
||||
## 🚀 Comenzando
|
||||
|
||||
### Requisitos Previos
|
||||
|
||||
Asegúrate de tener Python instalado (se recomienda la versión 3.8 o superior). Instala los paquetes necesarios:
|
||||
Asegúrate de tener Python instalado (se recomienda 3.8 o superior). Instala los paquetes necesarios:
|
||||
|
||||
```bash
|
||||
# For Python scripts
|
||||
# Para scripts de Python
|
||||
pip install numpy
|
||||
|
||||
# For Jupyter notebooks (image classifier)
|
||||
# Para notebooks de Jupyter (clasificador de imágenes)
|
||||
pip install jupyter numpy pillow tensorflow
|
||||
```
|
||||
|
||||
O utiliza el entorno conda del currículo principal:
|
||||
O usa el entorno conda del plan principal:
|
||||
|
||||
```bash
|
||||
conda env create --name ai4beg --file ../environment.yml
|
||||
conda activate ai4beg
|
||||
```
|
||||
|
||||
### Ejecutando los Ejemplos
|
||||
### Ejecutar los Ejemplos
|
||||
|
||||
**Para scripts de Python (.py):**
|
||||
**Para scripts Python (.py):**
|
||||
```bash
|
||||
python 01-hello-ai-world.py
|
||||
```
|
||||
|
||||
**Para notebooks de Jupyter (.ipynb):**
|
||||
**Para notebooks Jupyter (.ipynb):**
|
||||
```bash
|
||||
jupyter notebook 03-image-classifier.ipynb
|
||||
```
|
||||
|
||||
## 📖 Ruta de Aprendizaje
|
||||
|
||||
Recomendamos seguir los ejemplos en el siguiente orden:
|
||||
Recomendamos seguir los ejemplos en orden:
|
||||
|
||||
1. **Comienza con "Hola Mundo de IA"** - Aprende los conceptos básicos del reconocimiento de patrones
|
||||
1. **Comienza con "Hello AI World"** - Aprende los fundamentos del reconocimiento de patrones
|
||||
2. **Construye una Red Neuronal Simple** - Entiende cómo funcionan las redes neuronales
|
||||
3. **Prueba el Clasificador de Imágenes** - Observa la IA en acción con imágenes reales
|
||||
4. **Analiza el Sentimiento de Texto** - Explora el procesamiento del lenguaje natural
|
||||
3. **Prueba el Clasificador de Imágenes** - Observa IA en acción con imágenes reales
|
||||
4. **Analiza el Sentimiento del Texto** - Explora el procesamiento del lenguaje natural
|
||||
|
||||
## 💡 Consejos para Principiantes
|
||||
|
||||
- **Lee cuidadosamente los comentarios del código** - Explican qué hace cada línea
|
||||
- **¡Experimenta!** - Prueba cambiar valores y observa qué sucede
|
||||
- **No te preocupes por entender todo** - Aprender lleva tiempo
|
||||
- **¡Experimenta!** - Prueba cambiando valores y observa qué pasa
|
||||
- **No te preocupes por entender todo** - Aprender requiere tiempo
|
||||
- **Haz preguntas** - Usa el [foro de discusión](https://github.com/microsoft/AI-For-Beginners/discussions)
|
||||
|
||||
## 🔗 Próximos Pasos
|
||||
|
||||
Después de completar estos ejemplos, explora el currículo completo:
|
||||
- [Introducción a la IA](../lessons/1-Intro/README.md)
|
||||
Después de completar estos ejemplos, explora el plan completo:
|
||||
- [Introducción a IA](../lessons/1-Intro/README.md)
|
||||
- [Redes Neuronales](../lessons/3-NeuralNetworks/README.md)
|
||||
- [Visión por Computadora](../lessons/4-ComputerVision/README.md)
|
||||
- [Procesamiento del Lenguaje Natural](../lessons/5-NLP/README.md)
|
||||
- [Procesamiento de Lenguaje Natural](../lessons/5-NLP/README.md)
|
||||
|
||||
## 🤝 Contribuir
|
||||
## 🤝 Contribuyendo
|
||||
|
||||
¿Encontraste útiles estos ejemplos? Ayúdanos a mejorarlos:
|
||||
¿Te parecieron útiles estos ejemplos? Ayúdanos a mejorarlos:
|
||||
- Reporta problemas o sugiere mejoras
|
||||
- Agrega más ejemplos para principiantes
|
||||
- Mejora la documentación y los comentarios
|
||||
- Mejora la documentación y comentarios
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -81,5 +81,7 @@ Después de completar estos ejemplos, explora el currículo completo:
|
|||
|
||||
---
|
||||
|
||||
**Descargo de responsabilidad**:
|
||||
Este documento ha sido traducido utilizando el servicio de traducción automática [Co-op Translator](https://github.com/Azure/co-op-translator). Si bien nos esforzamos por lograr precisión, tenga en cuenta que las traducciones automáticas pueden contener errores o imprecisiones. El documento original en su idioma nativo debe considerarse la fuente autorizada. Para información crítica, se recomienda una traducción profesional realizada por humanos. No nos hacemos responsables de malentendidos o interpretaciones erróneas que surjan del uso de esta traducción.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**Descargo de responsabilidad**:
|
||||
Este documento ha sido traducido utilizando el servicio de traducción automática [Co-op Translator](https://github.com/Azure/co-op-translator). Aunque nos esforzamos por la precisión, tenga en cuenta que las traducciones automatizadas pueden contener errores o inexactitudes. El documento original en su idioma nativo debe considerarse la fuente autorizada. Para información crítica, se recomienda una traducción profesional humana. No somos responsables de cualquier malentendido o interpretación errónea que surja del uso de esta traducción.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -1,12 +1,12 @@
|
|||
# Cómo Ejecutar el Código
|
||||
|
||||
Este plan de estudios contiene muchos ejemplos ejecutables y laboratorios que querrás ejecutar. Para hacerlo, necesitas la capacidad de ejecutar código Python en los Jupyter Notebooks proporcionados como parte de este plan de estudios. Tienes varias opciones para ejecutar el código:
|
||||
Este currículo contiene muchos ejemplos ejecutables y laboratorios que querrás ejecutar. Para hacer esto, necesitas la capacidad de ejecutar código Python en Jupyter Notebooks que se proporcionan como parte de este currículo. Tienes varias opciones para ejecutar el código:
|
||||
|
||||
## Ejecutar localmente en tu computadora
|
||||
|
||||
Para ejecutar el código localmente en tu computadora, se necesita una instalación de Python. Una recomendación es instalar **[miniconda](https://conda.io/en/latest/miniconda.html)**: es una instalación bastante ligera que soporta el gestor de paquetes `conda` para diferentes **entornos virtuales** de Python.
|
||||
Para ejecutar el código localmente en tu computadora, se necesita una instalación de Python. Una recomendación es instalar **[miniconda](https://conda.io/en/latest/miniconda.html)** - es una instalación bastante ligera que soporta el gestor de paquetes `conda` para diferentes **entornos virtuales** de Python.
|
||||
|
||||
Después de instalar miniconda, clona el repositorio y crea un entorno virtual que será usado para este curso:
|
||||
Después de instalar miniconda, clona el repositorio y crea un entorno virtual que se usará para este curso:
|
||||
|
||||
```bash
|
||||
git clone http://github.com/microsoft/ai-for-beginners
|
||||
|
|
@ -17,17 +17,17 @@ conda activate ai4beg
|
|||
|
||||
### Usando Visual Studio Code con la Extensión de Python
|
||||
|
||||
Este plan de estudios se usa mejor cuando se abre en [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) con la [Extensión de Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste).
|
||||
Este currículo es mejor utilizarlo abriéndolo en [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) con la [Extensión de Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste).
|
||||
|
||||
> **Nota**: Una vez que clones y abras el directorio en VS Code, automáticamente te sugerirá instalar las extensiones de Python. También tendrás que instalar miniconda como se describió arriba.
|
||||
> **Nota**: Una vez que clonas y abres el directorio en VS Code, te sugerirá automáticamente instalar extensiones de Python. También tendrás que instalar miniconda como se describió arriba.
|
||||
|
||||
> **Nota**: Si VS Code te sugiere volver a abrir el repositorio en un contenedor, deberías rechazar esto para usar la instalación local de Python.
|
||||
> **Nota**: Si VS Code te sugiere reabrir el repositorio en un contenedor, deberías rechazar esto para usar la instalación local de Python.
|
||||
|
||||
### Usando Jupyter en el Navegador
|
||||
### Usar Jupyter en el Navegador
|
||||
|
||||
También puedes usar un entorno Jupyter desde el navegador en tu propia computadora. Tanto Jupyter clásico como JupyterHub proveen un entorno de desarrollo conveniente con autocompletado, resaltado de código, etc.
|
||||
También puedes usar un entorno Jupyter desde el navegador en tu propia computadora. Tanto Jupyter clásico como JupyterHub proporcionan un entorno de desarrollo conveniente con autocompletado, resaltado de código, etc.
|
||||
|
||||
Para iniciar Jupyter localmente, ve al directorio del curso, y ejecuta:
|
||||
Para iniciar Jupyter localmente, ve al directorio del curso y ejecuta:
|
||||
|
||||
```bash
|
||||
jupyter notebook
|
||||
|
|
@ -38,34 +38,34 @@ jupyterhub
|
|||
```
|
||||
Luego puedes navegar a cualquiera de los archivos `.ipynb`, abrirlos y comenzar a trabajar.
|
||||
|
||||
### Ejecutando en un contenedor
|
||||
### Ejecutar en contenedor
|
||||
|
||||
Una alternativa a la instalación de Python sería ejecutar el código en un contenedor. Debido a que nuestro repositorio proporciona una carpeta especial `.devcontainer` que indica cómo construir un contenedor para este repositorio, VS Code ofrece la opción de volver a abrir el código en un contenedor. Esto requerirá la instalación de Docker y además sería más complejo, por lo que recomendamos esto a usuarios con más experiencia.
|
||||
Una alternativa a la instalación de Python sería ejecutar el código en un contenedor. Dado que nuestro repositorio suministra una carpeta especial `.devcontainer` que indica cómo construir un contenedor para este repositorio, VS Code ofrece la posibilidad de reabrir el código en un contenedor. Esto requerirá la instalación de Docker, y también sería más complejo, por lo que recomendamos esto a usuarios más experimentados.
|
||||
|
||||
## Ejecutar en la Nube
|
||||
|
||||
Si no quieres instalar Python localmente y tienes acceso a algunos recursos en la nube, una buena alternativa sería ejecutar el código en la nube. Hay varias maneras de hacerlo:
|
||||
Si no quieres instalar Python localmente y tienes acceso a algunos recursos en la nube, una buena alternativa sería ejecutar el código en la nube. Hay varias maneras en que puedes hacer esto:
|
||||
|
||||
* Usando **[GitHub Codespaces](https://github.com/features/codespaces)**, que es un entorno virtual creado para ti en GitHub, accesible a través de una interfaz de navegador de VS Code. Si tienes acceso a Codespaces, solo tienes que hacer clic en el botón **Code** en el repositorio, iniciar un codespace y comenzar a trabajar en muy poco tiempo.
|
||||
* Usando **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) ofrece recursos de cómputo gratuitos proporcionados en la nube para personas como tú que quieren probar código en GitHub. Hay un botón en la página principal para abrir el repositorio en Binder; esto debería llevarte rápidamente al sitio de Binder, que construirá un contenedor subyacente e iniciará una interfaz web de Jupyter para ti sin inconvenientes.
|
||||
* Usar **[GitHub Codespaces](https://github.com/features/codespaces)**, que es un entorno virtual creado para ti en GitHub, accesible a través de una interfaz de navegador de VS Code. Si tienes acceso a Codespaces, solo tienes que hacer clic en el botón **Code** en el repositorio, iniciar un codespace y empezar a trabajar en poco tiempo.
|
||||
* Usar **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) ofrece recursos computacionales gratuitos proporcionados en la nube para personas como tú para probar código en GitHub. Hay un botón en la página principal para abrir el repositorio en Binder - esto debería llevarte rápidamente al sitio de Binder, que construirá un contenedor subyacente y comenzará una interfaz web de Jupyter para ti sin problemas.
|
||||
|
||||
> **Nota**: Para prevenir uso indebido, Binder tiene acceso bloqueado a algunos recursos web. Esto puede prevenir que parte del código funcione si descarga modelos y/o conjuntos de datos de Internet público. Puede que necesites encontrar algunas soluciones alternativas. Además, los recursos de cómputo proporcionados por Binder son bastante básicos, por lo que el entrenamiento será lento, especialmente en lecciones posteriores y más complejas.
|
||||
> **Nota**: Para prevenir usos indebidos, Binder tiene acceso a algunos recursos web bloqueados. Esto puede impedir que parte del código funcione, especialmente el que descarga modelos y/o conjuntos de datos desde Internet público. Puede que necesites encontrar algunas soluciones alternativas. Además, los recursos computacionales proporcionados por Binder son bastante básicos, por lo que el entrenamiento será lento, especialmente en lecciones posteriores y más complejas.
|
||||
|
||||
## Ejecutar en la Nube con GPU
|
||||
|
||||
Algunas de las lecciones posteriores en este plan de estudios se beneficiarían mucho del soporte de GPU. El entrenamiento de modelos, por ejemplo, puede ser dolorosamente lento de otra forma. Hay algunas opciones que puedes seguir, especialmente si tienes acceso a la nube ya sea mediante [Azure para Estudiantes](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) o a través de tu institución:
|
||||
Algunas de las lecciones posteriores de este currículo se beneficiarían mucho del soporte GPU. El entrenamiento de modelos, por ejemplo, puede ser dolorosamente lento de otra manera. Hay algunas opciones que puedes seguir, especialmente si tienes acceso a la nube ya sea a través de [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste), o mediante tu institución:
|
||||
|
||||
* Crear una [Máquina Virtual para Ciencia de Datos](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) y conectarte a ella mediante Jupyter. Luego puedes clonar el repositorio directamente en la máquina y comenzar a aprender. Las máquinas virtuales de la serie NC tienen soporte para GPU.
|
||||
* Crear una [Máquina Virtual de Ciencia de Datos](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) y conectarte a ella a través de Jupyter. Luego puedes clonar el repositorio directamente en la máquina y comenzar a aprender. Las máquinas virtuales de la serie NC tienen soporte GPU.
|
||||
|
||||
> **Nota**: Algunas suscripciones, incluidas Azure para Estudiantes, no proporcionan soporte para GPU por defecto. Puede que necesites solicitar núcleos GPU adicionales mediante una solicitud de soporte técnico.
|
||||
> **Nota**: Algunas suscripciones, incluyendo Azure for Students, no proporcionan soporte GPU por defecto. Puede que tengas que solicitar núcleos GPU adicionales con una solicitud de soporte técnico.
|
||||
|
||||
* Crear un [Espacio de Trabajo Azure Machine Learning](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) y luego usar la función de Notebook allí. [Este video](https://azure-for-academics.github.io/quickstart/azureml-papers/) muestra cómo clonar un repositorio en un notebook de Azure ML y comenzar a usarlo.
|
||||
* Crear un [Espacio de Trabajo Azure Machine Learning](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) y luego usar la función de Notebooks allí. [Este video](https://azure-for-academics.github.io/quickstart/azureml-papers/) muestra cómo clonar un repositorio en un notebook de Azure ML y empezar a usarlo.
|
||||
|
||||
También puedes usar Google Colab, que viene con soporte gratuito de GPU y subir allí Jupyter Notebooks para ejecutarlos uno por uno.
|
||||
También puedes usar Google Colab, que viene con algo de soporte GPU gratuito, y subir Jupyter Notebooks allí para ejecutarlos uno por uno.
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**Aviso legal**:
|
||||
Este documento ha sido traducido utilizando el servicio de traducción automática [Co-op Translator](https://github.com/Azure/co-op-translator). Aunque nos esforzamos por la precisión, tenga en cuenta que las traducciones automatizadas pueden contener errores o inexactitudes. El documento original en su idioma nativo debe considerarse la fuente autorizada. Para información crítica, se recomienda una traducción profesional humana. No nos hacemos responsables por malentendidos o interpretaciones erróneas derivadas del uso de esta traducción.
|
||||
**Descargo de responsabilidad**:
|
||||
Este documento ha sido traducido utilizando el servicio de traducción automática [Co-op Translator](https://github.com/Azure/co-op-translator). Aunque nos esforzamos por la precisión, tenga en cuenta que las traducciones automatizadas pueden contener errores o inexactitudes. El documento original en su idioma nativo debe considerarse la fuente autorizada. Para información crítica, se recomienda una traducción profesional humana. No somos responsables de cualquier malentendido o interpretación errónea que surja del uso de esta traducción.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -6,9 +6,9 @@
|
|||
"source": [
|
||||
"# Modelos preentrenados y aprendizaje por transferencia\n",
|
||||
"\n",
|
||||
"Entrenar redes neuronales convolucionales (CNNs) puede llevar mucho tiempo y requiere una gran cantidad de datos. Sin embargo, gran parte del tiempo se dedica a aprender los mejores filtros de bajo nivel que una red utiliza para extraer patrones de las imágenes. Surge una pregunta natural: ¿podemos usar una red neuronal entrenada en un conjunto de datos y adaptarla para clasificar imágenes diferentes sin realizar todo el proceso de entrenamiento?\n",
|
||||
"Entrenar CNNs puede tomar mucho tiempo, y se requiere una gran cantidad de datos para esa tarea. Sin embargo, gran parte del tiempo se emplea en aprender los mejores filtros de bajo nivel que una red utiliza para extraer patrones de las imágenes. Surge una pregunta natural: ¿podemos usar una red neuronal entrenada en un conjunto de datos y adaptarla para clasificar diferentes imágenes sin un proceso de entrenamiento completo?\n",
|
||||
"\n",
|
||||
"Este enfoque se llama **aprendizaje por transferencia**, porque transferimos cierto conocimiento de un modelo de red neuronal a otro. En el aprendizaje por transferencia, normalmente comenzamos con un modelo preentrenado, que ha sido entrenado en un conjunto de datos de imágenes grande, como **ImageNet**. Estos modelos ya pueden realizar un buen trabajo extrayendo diferentes características de imágenes genéricas, y en muchos casos, simplemente construir un clasificador sobre esas características extraídas puede dar buenos resultados.\n"
|
||||
"Este enfoque se llama **aprendizaje por transferencia**, porque transferimos algún conocimiento de un modelo de red neuronal a otro. En el aprendizaje por transferencia, típicamente comenzamos con un modelo preentrenado, que ha sido entrenado en algún conjunto de datos de imágenes grande, como **ImageNet**. Esos modelos ya pueden hacer un buen trabajo extrayendo diferentes características de imágenes genéricas, y en muchos casos solo construir un clasificador sobre esas características extraídas puede producir un buen resultado.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -29,11 +29,11 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Conjunto de Datos de Gatos vs. Perros\n",
|
||||
"## Conjunto de datos de Gatos vs. Perros\n",
|
||||
"\n",
|
||||
"En esta unidad, resolveremos un problema de la vida real clasificando imágenes de gatos y perros. Para ello, utilizaremos el [Conjunto de Datos de Gatos vs. Perros de Kaggle](https://www.kaggle.com/c/dogs-vs-cats), que también se puede descargar [desde Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n",
|
||||
"En esta unidad, resolveremos un problema real de clasificación de imágenes de gatos y perros. Por esta razón, utilizaremos el [Conjunto de datos Gatos vs. Perros de Kaggle](https://www.kaggle.com/c/dogs-vs-cats), que también se puede descargar [desde Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n",
|
||||
"\n",
|
||||
"Descarguemos este conjunto de datos y extráigamoslo en el directorio `data` (¡este proceso puede tomar algo de tiempo!):\n"
|
||||
"Descarguemos este conjunto de datos y extráigalo en el directorio `data` (¡este proceso puede tomar algo de tiempo!):\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -64,7 +64,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Desafortunadamente, hay algunos archivos de imagen corruptos en el conjunto de datos. Necesitamos hacer una limpieza rápida para verificar los archivos corruptos. Para no saturar este tutorial, movimos el código para verificar el conjunto de datos a un módulo.\n"
|
||||
"Desafortunadamente, hay algunos archivos de imagen corruptos en el conjunto de datos. Necesitamos hacer una limpieza rápida para verificar archivos corruptos. Para no estropear este tutorial, movimos el código para verificar el conjunto de datos a un módulo.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -335,11 +335,11 @@
|
|||
"source": [
|
||||
"## Cargando el conjunto de datos\n",
|
||||
"\n",
|
||||
"En ejemplos anteriores, estuvimos cargando conjuntos de datos integrados en Keras. Ahora vamos a trabajar con nuestro propio conjunto de datos, que necesitamos cargar desde un directorio de imágenes.\n",
|
||||
"En ejemplos anteriores, cargábamos conjuntos de datos que vienen incorporados en Keras. Ahora vamos a trabajar con nuestro propio conjunto de datos, que necesitamos cargar desde un directorio de imágenes.\n",
|
||||
"\n",
|
||||
"En la vida real, el tamaño de los conjuntos de datos de imágenes puede ser bastante grande, y no se puede depender de que todos los datos puedan caber en la memoria. Por lo tanto, los conjuntos de datos a menudo se representan como **generadores** que pueden devolver datos en minibatches adecuados para el entrenamiento.\n",
|
||||
"En la vida real, el tamaño de los conjuntos de datos de imágenes puede ser bastante grande, y no se puede confiar en que todos los datos quepan en la memoria. Por lo tanto, los conjuntos de datos a menudo se representan como **generadores** que pueden devolver datos en minibatches adecuados para el entrenamiento.\n",
|
||||
"\n",
|
||||
"Para trabajar con la clasificación de imágenes, Keras incluye una función especial llamada `image_dataset_from_directory`, que puede cargar imágenes desde subdirectorios correspondientes a diferentes clases. Esta función también se encarga de escalar las imágenes y puede dividir el conjunto de datos en subconjuntos de entrenamiento y prueba:\n"
|
||||
"Para trabajar con clasificación de imágenes, Keras incluye una función especial `image_dataset_from_directory`, que puede cargar imágenes desde subdirectorios correspondientes a diferentes clases. Esta función también se encarga de escalar las imágenes y puede dividir el conjunto de datos en subconjuntos de entrenamiento y prueba:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -383,9 +383,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Es importante establecer el mismo valor de `seed` para ambas llamadas, ya que esto afecta la división de imágenes entre el conjunto de entrenamiento y el conjunto de prueba.\n",
|
||||
"Es importante establecer el mismo valor de `seed` para ambas llamadas, porque afecta la división de imágenes entre el conjunto de datos de entrenamiento y prueba.\n",
|
||||
"\n",
|
||||
"El conjunto de datos detecta automáticamente los nombres de las clases desde los directorios, y puedes acceder a ellos si es necesario llamando:\n"
|
||||
"Dataset selecciona automáticamente los nombres de las clases de los directorios, y puedes acceder a ellos si es necesario llamando a:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -412,7 +412,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Los conjuntos de datos que hemos obtenido pueden pasarse directamente a la función `fit` para entrenar el modelo. Contienen tanto las imágenes correspondientes como las etiquetas, que se pueden recorrer utilizando la siguiente construcción:\n"
|
||||
"Los conjuntos de datos que hemos obtenido se pueden pasar directamente a la función `fit` para entrenar el modelo. Contienen tanto las imágenes correspondientes como las etiquetas, que se pueden recorrer usando la siguiente construcción:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -453,7 +453,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"> **Nota**: Todas las imágenes en el conjunto de datos están representadas como tensores de punto flotante con un rango de 0-255. Antes de pasarlas a la red neuronal, necesitamos escalar esos valores al rango de 0-1. Al graficar imágenes, necesitamos hacer lo mismo o convertir los valores al tipo `int` (lo cual hacemos en el código anterior) para mostrarle a `matplotlib` que queremos graficar la imagen original sin escalar.\n"
|
||||
"> **Nota**: Todas las imágenes en el conjunto de datos están representadas como tensores de punto flotante con rango 0-255. Antes de pasarlas a la red neuronal, necesitamos escalar esos valores al rango 0-1. Al graficar imágenes, debemos hacer lo mismo o convertir los valores al tipo `int` (lo cual hacemos en el código anterior), para mostrar a `matplotlib` que queremos graficar la imagen original sin escalar.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -462,7 +462,7 @@
|
|||
"source": [
|
||||
"## Modelos preentrenados\n",
|
||||
"\n",
|
||||
"Para muchas tareas de clasificación de imágenes, se pueden encontrar modelos de redes neuronales preentrenados. Muchos de estos modelos están disponibles dentro del espacio de nombres `keras.applications`, y aún más modelos se pueden encontrar en Internet. Veamos cómo se puede cargar y utilizar el modelo más simple, VGG-16:\n"
|
||||
"Para muchas tareas de clasificación de imágenes se pueden encontrar modelos de redes neuronales preentrenados. Muchos de esos modelos están disponibles dentro del espacio de nombres `keras.applications`, y aún más modelos se pueden encontrar en Internet. Veamos cómo se puede cargar y usar el modelo más sencillo 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": [
|
||||
"Hay un par de cosas importantes aquí:\n",
|
||||
"* Antes de pasar una entrada a cualquier red preentrenada, debe ser preprocesada de cierta manera. Esto se realiza llamando a la función correspondiente `preprocess_input`, que recibe un lote de imágenes y devuelve su forma procesada. En el caso de VGG-16, las imágenes se normalizan y se resta un valor promedio predefinido para cada canal. Esto se debe a que VGG-16 fue originalmente entrenada con este preprocesamiento.\n",
|
||||
"* La red neuronal se aplica al lote de entrada, y como resultado recibimos un lote de tensores de 1000 elementos que muestran la probabilidad de cada clase. Podemos encontrar el número de la clase más probable llamando a `argmax` en este tensor.\n",
|
||||
"* El resultado obtenido es un [número de una clase de `ImageNet`](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Para interpretar este resultado, también podemos usar la función `decode_predictions`, que devuelve las n clases principales junto con sus nombres.\n"
|
||||
"* Antes de pasar una entrada a cualquier red pre-entrenada, debe ser preprocesada de cierta manera. Esto se hace llamando a la función `preprocess_input` correspondiente, que recibe un lote de imágenes y devuelve su forma procesada. En el caso de VGG-16, las imágenes se normalizan y se resta un valor promedio predefinido para cada canal. Eso es porque VGG-16 se entrenó originalmente con este preprocesamiento.\n",
|
||||
"* La red neuronal se aplica al lote de entrada, y recibimos como resultado un lote de tensores de 1000 elementos que muestran la probabilidad de cada clase. Podemos encontrar el número de clase más probable llamando a `argmax` en este tensor.\n",
|
||||
"* El resultado obtenido es un [número de una clase `ImageNet`](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Para darle sentido a este resultado, también podemos usar la función `decode_predictions`, que devuelve las n mejores clases junto con sus nombres.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -597,9 +607,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Cálculos en GPU\n",
|
||||
"## Cómputos en GPU\n",
|
||||
"\n",
|
||||
"Las redes neuronales profundas, como VGG-16 y otras arquitecturas más modernas, requieren bastante potencia de cálculo para ejecutarse. Tiene sentido utilizar la aceleración de GPU, si está disponible. Afortunadamente, Keras acelera automáticamente los cálculos en la GPU si está disponible. Podemos verificar si Tensorflow es capaz de usar la GPU utilizando el siguiente código:\n"
|
||||
"Las redes neuronales profundas, como VGG-16 y otras arquitecturas más modernas, requieren bastante potencia computacional para ejecutarse. Tiene sentido usar aceleración por GPU, si está disponible. Afortunadamente, Keras acelera automáticamente los cálculos en la GPU si esta está disponible. Podemos verificar si Tensorflow puede usar la GPU con el siguiente código:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -626,9 +636,10 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n",
|
||||
"## Extrayendo características de VGG\n",
|
||||
"\n",
|
||||
"Si queremos usar VGG-16 para extraer características de nuestras imágenes, necesitamos el modelo sin las capas finales de clasificación. Podemos instanciar el modelo VGG-16 sin las capas superiores utilizando este código:\n"
|
||||
"Si queremos usar VGG-16 para extraer características de nuestras imágenes, necesitamos el modelo sin las capas finales de clasificación. Podemos instanciar el modelo VGG-16 sin las capas superiores usando este código:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -680,9 +691,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"La dimensión del tensor de características es 7x7x512, pero para poder visualizarlo tuvimos que remodelarlo a una forma 2D.\n",
|
||||
"La dimensión del tensor de características es 7x7x512, pero para poder visualizarlo tuvimos que remodelarlo a forma 2D.\n",
|
||||
"\n",
|
||||
"Ahora intentemos ver si esas características pueden usarse para clasificar imágenes. Tomemos manualmente una porción de imágenes (50 minibatches, en nuestro caso) y precomputemos sus vectores de características. Podemos usar la API de **dataset** de Tensorflow para hacerlo. La función `map` toma un conjunto de datos y aplica una lambda-función dada para transformarlo. Usamos este mecanismo para construir nuevos conjuntos de datos, `ds_features_train` y `ds_features_test`, que contienen las características extraídas por VGG en lugar de las imágenes originales.\n"
|
||||
"Ahora intentemos ver si esas características pueden usarse para clasificar imágenes. Tomemos manualmente una porción de imágenes (50 minibatches, en nuestro caso), y pre-calculamos sus vectores de características. Podemos usar la API **dataset** de Tensorflow para eso. La función `map` toma un dataset y aplica una función lambda dada para transformarlo. Usamos este mecanismo para construir nuevos datasets, `ds_features_train` y `ds_features_test`, que contienen características extraídas con VGG en lugar de las imágenes originales.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -712,9 +723,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Usamos la construcción `.take(50)` para limitar el tamaño del conjunto de datos y acelerar nuestra demostración. Por supuesto, puedes realizar este experimento con el conjunto de datos completo.\n",
|
||||
"Usamos la construcción `.take(50)` para limitar el tamaño del conjunto de datos, para acelerar nuestra demostración. Por supuesto, puedes realizar este experimento con el conjunto de datos completo.\n",
|
||||
"\n",
|
||||
"Ahora que tenemos un conjunto de datos con características extraídas, podemos entrenar un clasificador denso simple para distinguir entre gatos y perros. Esta red tomará un vector de características con forma (7,7,512) y producirá una salida que corresponderá a un perro o a un gato. Dado que se trata de una clasificación binaria, utilizamos la función de activación `sigmoid` y la pérdida `binary_crossentropy`.\n"
|
||||
"Ahora que tenemos un conjunto de datos con características extraídas, podemos entrenar un clasificador denso simple para distinguir entre gatos y perros. Esta red tomará un vector de características de forma (7,7,512), y producirá una salida que corresponde ya sea a un perro o a un gato. Debido a que es una clasificación binaria, usamos la función de activación `sigmoid` y la pérdida `binary_crossentropy`.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -743,13 +754,13 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"¡El resultado es excelente! ¡Podemos distinguir entre un gato y un perro con casi un 95% de probabilidad! Sin embargo, solo hemos probado este enfoque en un subconjunto de todas las imágenes, ya que la extracción manual de características parece tomar mucho tiempo.\n",
|
||||
"¡El resultado es excelente, podemos distinguir entre un gato y un perro con casi un 95% de probabilidad! Sin embargo, solo hemos probado este enfoque en un subconjunto de todas las imágenes, porque la extracción manual de características parece tomar mucho tiempo.\n",
|
||||
"\n",
|
||||
"## Aprendizaje por transferencia utilizando una red VGG\n",
|
||||
"## Aprendizaje por transferencia usando una red VGG\n",
|
||||
"\n",
|
||||
"También podemos evitar precomputar manualmente las características utilizando la red VGG-16 original en su totalidad durante el entrenamiento, añadiendo un extractor de características a nuestra red como primera capa.\n",
|
||||
"También podemos evitar el pre-cálculo manual de las características usando la red original VGG-16 como un todo durante el entrenamiento, añadiendo el extractor de características a nuestra red como una primera capa.\n",
|
||||
"\n",
|
||||
"¡La belleza de la arquitectura de Keras es que el modelo VGG-16 que hemos definido anteriormente también puede usarse como una capa en otra red neuronal! Solo necesitamos construir una red con un clasificador denso encima de ella y luego entrenar toda la red utilizando retropropagación.\n"
|
||||
"¡La belleza de la arquitectura Keras es que el modelo VGG-16 que definimos arriba también puede usarse como una capa en otra red neuronal! Solo necesitamos construir una red con un clasificador denso encima, y luego entrenar toda la red usando retropropagación.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -793,13 +804,13 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Este modelo parece una red de clasificación de extremo a extremo, que toma una imagen y devuelve la clase. Sin embargo, lo complicado es que queremos que VGG16 actúe como un extractor de características y no sea reentrenado. Por lo tanto, necesitamos **congelar los pesos del extractor de características convolucionales**. Podemos acceder a la primera capa de la red llamando a `model.layers[0]`, y solo necesitamos establecer la propiedad `trainable` en `False`.\n",
|
||||
"Este modelo parece una red de clasificación de extremo a extremo, que toma una imagen y devuelve la clase. Sin embargo, lo complicado es que queremos que VGG16 actúe como un extractor de características, y no que se reentrene. Por lo tanto, necesitamos **congelar los pesos del extractor de características convolucional**. Podemos acceder a la primera capa de la red llamando a `model.layers[0]`, y solo necesitamos establecer la propiedad `trainable` en `False`.\n",
|
||||
"\n",
|
||||
"> **Nota**: La congelación de los pesos del extractor de características es necesaria, porque de lo contrario la capa clasificadora no entrenada podría destruir los pesos preentrenados originales del extractor convolucional.\n",
|
||||
"> **Nota**: Es necesario congelar los pesos del extractor de características, porque de lo contrario, la capa clasificador no entrenada puede destruir los pesos originales preentrenados del extractor convolucional.\n",
|
||||
"\n",
|
||||
"Puedes notar que, aunque el número total de parámetros en nuestra red es de alrededor de 15 millones, solo estamos entrenando 25,000 parámetros. Todos los demás parámetros de los filtros convolucionales de nivel superior están preentrenados. Esto es bueno, porque podemos ajustar un menor número de parámetros con un menor número de ejemplos.\n",
|
||||
"Puede notar que, mientras el número total de parámetros en nuestra red es de alrededor de 15 millones, solo estamos entrenando 25k parámetros. Todos los demás parámetros de los filtros convolucionales de nivel superior están preentrenados. Eso es bueno, porque podemos afinar un menor número de parámetros con una menor cantidad de ejemplos.\n",
|
||||
"\n",
|
||||
"Ahora entrenaremos nuestra red y veremos qué tan buenos resultados podemos obtener. Espera un tiempo de ejecución bastante largo y no te preocupes si la ejecución parece estar congelada por un tiempo.\n"
|
||||
"Ahora entrenaremos nuestra red y veremos qué tan bien podemos hacerlo. Espere un tiempo de ejecución bastante largo, y no se preocupe si la ejecución parece congelada por un tiempo.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -824,7 +835,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"¡Parece que hemos obtenido un clasificador de gatos contra perros bastante preciso!\n",
|
||||
"¡Parece que hemos obtenido un clasificador de gatos vs. perros razonablemente preciso!\n",
|
||||
"\n",
|
||||
"## Guardar y cargar el modelo\n",
|
||||
"\n",
|
||||
|
|
@ -852,7 +863,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Podemos cargar el modelo desde el archivo en cualquier momento. Puede resultar útil en caso de que el próximo experimento destruya el modelo; no tendrías que empezar desde cero.\n"
|
||||
"Entonces podemos cargar el modelo desde el archivo en cualquier momento. Puede resultarte útil en caso de que el siguiente experimento destruya el modelo; no tendrías que empezar desde cero.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -870,13 +881,13 @@
|
|||
"source": [
|
||||
"## Ajuste fino del aprendizaje por transferencia\n",
|
||||
"\n",
|
||||
"En la sección anterior, entrenamos la capa final del clasificador para clasificar imágenes en nuestro propio conjunto de datos. Sin embargo, no volvimos a entrenar el extractor de características, y nuestro modelo se basó en las características que había aprendido con los datos de ImageNet. Si tus objetos difieren visualmente de las imágenes comunes de ImageNet, esta combinación de características podría no ser la más adecuada. Por lo tanto, tiene sentido comenzar a entrenar también las capas convolucionales.\n",
|
||||
"En la sección anterior, hemos entrenado la capa final del clasificador para clasificar imágenes en nuestro propio conjunto de datos. Sin embargo, no volvimos a entrenar el extractor de características, y nuestro modelo dependió de las características que el modelo aprendió con los datos de ImageNet. Si tus objetos difieren visualmente de las imágenes comunes de ImageNet, esta combinación de características podría no ser la mejor. Por lo tanto, tiene sentido comenzar a entrenar también las capas convolucionales.\n",
|
||||
"\n",
|
||||
"Para hacerlo, podemos desbloquear los parámetros de los filtros convolucionales que previamente habíamos bloqueado.\n",
|
||||
"Para hacerlo, podemos descongelar los parámetros de los filtros convolucionales que previamente hemos congelado.\n",
|
||||
"\n",
|
||||
"> **Nota:** Es importante que primero bloquees los parámetros y realices varias épocas de entrenamiento para estabilizar los pesos en la capa de clasificación. Si comienzas inmediatamente a entrenar la red de extremo a extremo con los parámetros desbloqueados, es probable que los grandes errores destruyan los pesos preentrenados en las capas convolucionales.\n",
|
||||
"> **Nota:** Es importante que primero congeles los parámetros y realices varias épocas de entrenamiento para estabilizar los pesos en la capa de clasificación. Si comienzas inmediatamente a entrenar la red completa con parámetros descongelados, es probable que los grandes errores destruyan los pesos preentrenados en las capas convolucionales.\n",
|
||||
"\n",
|
||||
"Nuestro modelo convolucional VGG-16 se encuentra dentro de la primera capa y, a su vez, está compuesto por muchas capas. Podemos echar un vistazo a su estructura:\n"
|
||||
"Nuestro modelo convolucional VGG-16 está ubicado dentro de la primera capa, y consiste en muchas capas en sí mismo. Podemos echar un vistazo a su estructura:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -944,7 +955,9 @@
|
|||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": []
|
||||
"source": [
|
||||
"Podemos descongelar todas las capas de la base convolucional:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
|
|
@ -959,7 +972,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Sin embargo, descongelar todos a la vez no es la mejor idea. Primero podemos descongelar solo unas pocas capas finales de convoluciones, porque contienen patrones de nivel superior que son relevantes para nuestras imágenes. Por ejemplo, para empezar, podemos congelar todas las capas excepto las últimas 4:\n"
|
||||
"Sin embargo, descongelar todas ellas a la vez no es la mejor idea. Podemos primero descongelar solo algunas de las últimas capas de convoluciones, porque contienen patrones de nivel superior que son relevantes para nuestras imágenes. Por ejemplo, para comenzar, podemos congelar todas las capas excepto las últimas 4: \n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -998,11 +1011,11 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Observa que el número de parámetros entrenables aumentó significativamente, pero aún representa alrededor del 50% de todos los parámetros.\n",
|
||||
"Observe que el número de parámetros entrenables aumentó significativamente, pero todavía es alrededor del 50% de todos los parámetros.\n",
|
||||
"\n",
|
||||
"Después de descongelar, podemos realizar unas pocas épocas más de entrenamiento (en nuestro ejemplo, haremos solo una). También puedes seleccionar una tasa de aprendizaje más baja para minimizar el impacto en los pesos preentrenados. Sin embargo, incluso con una tasa de aprendizaje baja, es normal que la precisión disminuya al inicio del entrenamiento, hasta finalmente alcanzar un nivel ligeramente superior al caso de pesos fijos.\n",
|
||||
"Después de descongelar, podemos hacer unas pocas épocas más de entrenamiento (en nuestro ejemplo, haremos solo una). También puede seleccionar una tasa de aprendizaje menor, para minimizar el impacto en los pesos preentrenados. Sin embargo, incluso con una tasa de aprendizaje baja, puede esperar que la precisión caiga al principio del entrenamiento, hasta finalmente alcanzar un nivel ligeramente más alto que en el caso de pesos fijos.\n",
|
||||
"\n",
|
||||
"> **Nota:** ¡Este entrenamiento es mucho más lento porque necesitamos propagar los gradientes a través de muchas capas de la red!\n"
|
||||
"> **Nota:** Este entrenamiento ocurre mucho más lento, ¡porque necesitamos propagar los gradientes hacia atrás a través de muchas capas de la red!\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1026,9 +1039,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Es probable que logremos una mayor precisión en el entrenamiento, ya que estamos utilizando una red más potente con más parámetros, pero la precisión en la validación no aumentará tanto.\n",
|
||||
"Es probable que logremos una mayor precisión en el entrenamiento, porque estamos utilizando una red más potente con más parámetros, pero la precisión en la validación no aumentaría tanto.\n",
|
||||
"\n",
|
||||
"¡Siéntete libre de desbloquear algunas capas más de la red y entrenar un poco más para ver si puedes alcanzar una mayor precisión!\n"
|
||||
"Siéntete libre de descongelar algunas capas más de la red y entrenar más, para ver si puedes lograr una mayor precisión.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1037,7 +1050,7 @@
|
|||
"source": [
|
||||
"## Otros modelos de visión por computadora\n",
|
||||
"\n",
|
||||
"VGG-16 es una de las arquitecturas más simples de visión por computadora. Keras ofrece muchas más redes preentrenadas. Las más utilizadas entre ellas son las arquitecturas **ResNet**, desarrolladas por Microsoft, y **Inception** de Google. Por ejemplo, exploremos la arquitectura del modelo más simple, ResNet-50 (ResNet es una familia de modelos con diferentes profundidades; puedes intentar experimentar con ResNet-152 si quieres ver cómo se ve un modelo realmente profundo):\n"
|
||||
"VGG-16 es una de las arquitecturas de visión por computadora más simples. Keras ofrece muchas más redes preentrenadas. Las más usadas entre ellas son las arquitecturas **ResNet**, desarrolladas por Microsoft, y **Inception** de Google. Por ejemplo, exploremos la arquitectura del modelo ResNet-50 más simple (ResNet es una familia de modelos con diferente profundidad, puedes experimentar con ResNet-152 si quieres ver cómo es un modelo realmente profundo):\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1439,11 +1452,11 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Como puedes ver, el modelo contiene los mismos bloques básicos familiares: capas convolucionales, capas de agrupamiento (pooling) y un clasificador denso final. Podemos usar este modelo de la misma manera en que hemos estado utilizando VGG-16 para aprendizaje por transferencia. Puedes intentar experimentar con el código anterior, utilizando diferentes modelos ResNet como modelo base, y observar cómo cambia la precisión.\n",
|
||||
"Como puedes ver, el modelo contiene los mismos bloques constructivos familiares: capas convolucionales, capas de agrupación y el clasificador denso final. Podemos usar este modelo de la misma manera exacta en que hemos estado usando VGG-16 para aprendizaje por transferencia. Puedes experimentar con el código anterior, usando diferentes modelos ResNet como modelo base, y ver cómo cambia la precisión.\n",
|
||||
"\n",
|
||||
"## Normalización por Lotes\n",
|
||||
"\n",
|
||||
"Esta red contiene otro tipo de capa: **Normalización por Lotes**. La idea de la normalización por lotes es ajustar los valores que fluyen a través de la red neuronal al intervalo correcto. Generalmente, las redes neuronales funcionan mejor cuando todos los valores están en el rango de [-1,1] o [0,1], y por eso escalamos/normalizamos nuestros datos de entrada en consecuencia. Sin embargo, durante el entrenamiento de una red profunda, puede suceder que los valores se desvíen significativamente de este rango, lo que dificulta el entrenamiento. La capa de normalización por lotes calcula el promedio y la desviación estándar de todos los valores del minibatch actual, y los utiliza para normalizar la señal antes de pasarla a través de una capa de la red neuronal. Esto mejora significativamente la estabilidad de las redes profundas.\n"
|
||||
"Esta red contiene otro tipo de capa más: **Normalización por Lotes (Batch Normalization)**. La idea de la normalización por lotes es llevar los valores que fluyen a través de la red neuronal al intervalo correcto. Usualmente las redes neuronales funcionan mejor cuando todos los valores están en el rango de [-1,1] o [0,1], y esa es la razón por la que escalamos/normalizamos nuestros datos de entrada en consecuencia. Sin embargo, durante el entrenamiento de una red profunda, puede suceder que los valores se desvíen significativamente de este rango, lo cual hace que el entrenamiento sea problemático. La capa de normalización por lotes calcula el promedio y la desviación estándar para todos los valores del minibatch actual, y los usa para normalizar la señal antes de pasarla a través de una capa de la red neuronal. Esto mejora significativamente la estabilidad de las redes profundas.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1452,16 +1465,16 @@
|
|||
"source": [
|
||||
"## Conclusión\n",
|
||||
"\n",
|
||||
"Utilizando aprendizaje por transferencia, pudimos armar rápidamente un clasificador para nuestra tarea de clasificación de objetos personalizados y lograr una alta precisión. Sin embargo, este ejemplo no fue completamente justo, ya que la red original VGG-16 fue preentrenada para reconocer gatos y perros, por lo que simplemente reutilizamos la mayoría de los patrones que ya estaban presentes en la red. Puedes esperar una menor precisión en objetos más exóticos y específicos de un dominio, como detalles en una línea de producción en una planta o diferentes tipos de hojas de árboles.\n",
|
||||
"Usando transferencia de aprendizaje, pudimos armar rápidamente un clasificador para nuestra tarea personalizada de clasificación de objetos y lograr una alta precisión. Sin embargo, este ejemplo no fue completamente justo, porque la red VGG-16 original fue preentrenada para reconocer gatos y perros, y por lo tanto solo estábamos reutilizando la mayoría de los patrones que ya estaban presentes en la red. Puedes esperar una precisión menor en objetos más exóticos y específicos del dominio, como detalles en la línea de producción en una planta, o diferentes hojas de árboles.\n",
|
||||
"\n",
|
||||
"Puedes observar que las tareas más complejas que estamos resolviendo ahora requieren mayor poder computacional y no pueden resolverse fácilmente en la CPU. En la próxima unidad, intentaremos usar una implementación más ligera para entrenar el mismo modelo utilizando menos recursos computacionales, lo que resulta en una precisión solo ligeramente menor.\n"
|
||||
"Puedes ver que las tareas más complejas que estamos resolviendo ahora requieren mayor potencia computacional, y no pueden ser resueltas fácilmente en la CPU. En la siguiente unidad, intentaremos usar una implementación más ligera para entrenar el mismo modelo usando recursos computacionales menores, lo que resulta en una precisión solo ligeramente inferior.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**Descargo de responsabilidad**: \nEste documento ha sido traducido utilizando el servicio de traducción automática [Co-op Translator](https://github.com/Azure/co-op-translator). Aunque nos esforzamos por garantizar la precisión, tenga en cuenta que las traducciones automatizadas pueden contener errores o imprecisiones. El documento original en su idioma nativo debe considerarse como la fuente autorizada. Para información crítica, se recomienda una traducción profesional realizada por humanos. No nos hacemos responsables de malentendidos o interpretaciones erróneas que puedan surgir del uso de esta traducción.\n"
|
||||
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**Descargo de responsabilidad**:\nEste documento ha sido traducido utilizando el servicio de traducción automática [Co-op Translator](https://github.com/Azure/co-op-translator). Aunque nos esforzamos por la precisión, tenga en cuenta que las traducciones automatizadas pueden contener errores o inexactitudes. El documento original en su idioma nativo debe considerarse la fuente autorizada. Para información crítica, se recomienda una traducción profesional humana. No somos responsables de cualquier malentendido o interpretación errónea que surja del uso de esta traducción.\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
|
|
@ -1482,12 +1495,6 @@
|
|||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.8.10"
|
||||
},
|
||||
"coopTranslator": {
|
||||
"original_hash": "c189abc107848f96051085cc30945129",
|
||||
"translation_date": "2025-08-31T15:59:27+00:00",
|
||||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb",
|
||||
"language_code": "es"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
|
|
|||
|
|
@ -1,34 +1,34 @@
|
|||
# Procesamiento de Lenguaje Natural
|
||||
|
||||

|
||||

|
||||
|
||||
En esta sección, nos enfocaremos en usar Redes Neuronales para manejar tareas relacionadas con el **Procesamiento de Lenguaje Natural (PLN)**. Hay muchos problemas de PLN que queremos que las computadoras puedan resolver:
|
||||
En esta sección, nos centraremos en usar Redes Neuronales para manejar tareas relacionadas con el **Procesamiento de Lenguaje Natural (PLN)**. Hay muchos problemas de PLN que queremos que las computadoras puedan resolver:
|
||||
|
||||
* **Clasificación de texto** es un problema típico de clasificación relacionado con secuencias de texto. Ejemplos incluyen clasificar mensajes de correo electrónico como spam o no spam, o categorizar artículos como deporte, negocios, política, etc. Además, al desarrollar chatbots, a menudo necesitamos entender lo que un usuario quiso decir; en este caso estamos tratando con **clasificación de intención**. Frecuentemente, en la clasificación de intención necesitamos manejar muchas categorías.
|
||||
* **Análisis de sentimientos** es un problema típico de regresión, donde necesitamos atribuir un número (un sentimiento) que corresponda a cuán positivo/negativo es el significado de una oración. Una versión más avanzada del análisis de sentimientos es el **análisis de sentimientos basado en aspectos** (ABSA), donde atribuimos el sentimiento no a toda la oración, sino a diferentes partes de ella (aspectos), por ejemplo: *En este restaurante, me gustó la cocina, pero la atmósfera era horrible*.
|
||||
* **Reconocimiento de entidades nombradas** (NER) se refiere al problema de extraer ciertas entidades del texto. Por ejemplo, podríamos necesitar entender que en la frase *Necesito volar a París mañana*, la palabra *mañana* se refiere a una FECHA, y *París* es una UBICACIÓN.
|
||||
* **Extracción de palabras clave** es similar a NER, pero necesitamos extraer palabras importantes para el significado de la oración automáticamente, sin preentrenamiento para tipos específicos de entidades.
|
||||
* **Agrupación de texto** puede ser útil cuando queremos agrupar oraciones similares, por ejemplo, solicitudes similares en conversaciones de soporte técnico.
|
||||
* **Respuesta a preguntas** se refiere a la capacidad de un modelo para responder una pregunta específica. El modelo recibe un pasaje de texto y una pregunta como entradas, y necesita proporcionar un lugar en el texto donde se encuentre la respuesta a la pregunta (o, a veces, generar el texto de la respuesta).
|
||||
* **Generación de texto** es la capacidad de un modelo para generar texto nuevo. Puede considerarse como una tarea de clasificación que predice la siguiente letra/palabra basada en algún *texto inicial*. Modelos avanzados de generación de texto, como GPT-3, son capaces de resolver otras tareas de PLN utilizando una técnica llamada [programación con prompts](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) o [ingeniería de prompts](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29).
|
||||
* **Resumen de texto** es una técnica en la que queremos que una computadora "lea" un texto largo y lo resuma en unas pocas oraciones.
|
||||
* **Traducción automática** puede verse como una combinación de comprensión de texto en un idioma y generación de texto en otro.
|
||||
* **Clasificación de texto** es un problema típico de clasificación relacionado con secuencias de texto. Ejemplos incluyen clasificar mensajes de correo electrónico como spam vs. no spam, o categorizar artículos como deportes, negocios, política, etc. Además, al desarrollar bots de conversación, a menudo necesitamos entender lo que un usuario quiso decir — en este caso estamos tratando con **clasificación de intención**. A menudo, en la clasificación de intención necesitamos manejar muchas categorías.
|
||||
* **Análisis de sentimiento** es un problema típico de regresión, donde necesitamos atribuir un número (un sentimiento) que corresponde a qué tan positivo/negativo es el significado de una frase. Una versión más avanzada del análisis de sentimiento es el **análisis de sentimiento basado en aspectos** (ABSA), donde atribuimos sentimiento no a toda la frase, sino a diferentes partes de ella (aspectos), por ejemplo, *En este restaurante, me gustó la cocina, pero la atmósfera fue terrible*.
|
||||
* **Reconocimiento de Entidades Nombradas** (REN) se refiere al problema de extraer ciertas entidades del texto. Por ejemplo, podríamos necesitar entender que en la frase *Necesito volar a París mañana* la palabra *mañana* se refiere a FECHA, y *París* es una UBICACIÓN.
|
||||
* **Extracción de palabras clave** es similar al REN, pero necesitamos extraer automáticamente palabras importantes para el significado de la frase, sin preentrenamiento para tipos específicos de entidades.
|
||||
* **Agrupamiento de texto** puede ser útil cuando queremos agrupar frases similares, por ejemplo, solicitudes semejantes en conversaciones de soporte técnico.
|
||||
* **Respuesta a preguntas** se refiere a la capacidad de un modelo para responder a una pregunta específica. El modelo recibe un pasaje de texto y una pregunta como entradas, y debe proporcionar un lugar en el texto donde se contiene la respuesta a la pregunta (o, a veces, generar el texto de la respuesta).
|
||||
* **Generación de texto** es la capacidad de un modelo para generar texto nuevo. Puede considerarse como una tarea de clasificación que predice la siguiente letra/palabra basada en un *mensaje de texto*. Modelos avanzados de generación de texto, como GPT-3, son capaces de resolver otras tareas de PLN como clasificación usando una técnica llamada [programación de mensajes](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) o [ingeniería de mensajes](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29)
|
||||
* **Resumen de texto** es una técnica cuando queremos que una computadora "lea" un texto largo y lo resuma en pocas oraciones.
|
||||
* **Traducción automática** puede verse como una combinación de comprensión de texto en un idioma, y generación de texto en otro.
|
||||
|
||||
Inicialmente, la mayoría de las tareas de PLN se resolvían utilizando métodos tradicionales como gramáticas. Por ejemplo, en la traducción automática se utilizaban analizadores para transformar la oración inicial en un árbol sintáctico, luego se extraían estructuras semánticas de nivel superior para representar el significado de la oración, y con base en este significado y la gramática del idioma de destino se generaba el resultado. Hoy en día, muchas tareas de PLN se resuelven de manera más efectiva utilizando redes neuronales.
|
||||
Inicialmente, la mayoría de tareas de PLN se resolvieron usando métodos tradicionales como gramáticas. Por ejemplo, en la traducción automática se usaban analizadores sintácticos para transformar la frase inicial en un árbol sintáctico, luego se extraían estructuras semánticas de nivel superior para representar el significado de la frase, y basándose en este significado y la gramática del idioma objetivo se generaba el resultado. Hoy en día, muchas tareas de PLN se resuelven de manera más efectiva usando redes neuronales.
|
||||
|
||||
> Muchos métodos clásicos de PLN están implementados en la biblioteca de Python [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org). Hay un excelente [Libro de NLTK](https://www.nltk.org/book/) disponible en línea que cubre cómo resolver diferentes tareas de PLN utilizando NLTK.
|
||||
> Muchos métodos clásicos de PLN están implementados en la biblioteca Python [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org). Hay un excelente [libro NLTK](https://www.nltk.org/book/) disponible en línea que cubre cómo diferentes tareas de PLN pueden ser resueltas usando NLTK.
|
||||
|
||||
En nuestro curso, nos enfocaremos principalmente en usar Redes Neuronales para PLN, y utilizaremos NLTK cuando sea necesario.
|
||||
En nuestro curso, nos centraremos principalmente en el uso de Redes Neuronales para PLN, y usaremos NLTK cuando sea necesario.
|
||||
|
||||
Ya hemos aprendido sobre el uso de redes neuronales para manejar datos tabulares y con imágenes. La principal diferencia entre esos tipos de datos y el texto es que el texto es una secuencia de longitud variable, mientras que el tamaño de entrada en el caso de las imágenes se conoce de antemano. Aunque las redes convolucionales pueden extraer patrones de los datos de entrada, los patrones en el texto son más complejos. Por ejemplo, podemos tener una negación separada del sujeto por muchas palabras arbitrarias (por ejemplo: *No me gustan las naranjas*, vs. *No me gustan esas naranjas grandes, coloridas y sabrosas*), y eso aún debe interpretarse como un solo patrón. Por lo tanto, para manejar el lenguaje necesitamos introducir nuevos tipos de redes neuronales, como *redes recurrentes* y *transformadores*.
|
||||
Ya hemos aprendido sobre el uso de redes neuronales para manejar datos tabulares y con imágenes. La principal diferencia entre esos tipos de datos y el texto es que el texto es una secuencia de longitud variable, mientras que el tamaño de entrada en el caso de imágenes se conoce de antemano. Mientras que las redes convolucionales pueden extraer patrones de los datos de entrada, los patrones en texto son más complejos. Por ejemplo, podemos tener una negación separada del sujeto por muchas palabras arbitrarias (por ejemplo, *No me gustan las naranjas*, vs. *No me gustan esas grandes, coloridas y sabrosas naranjas*), y eso aún debería interpretarse como un patrón. Por lo tanto, para manejar el lenguaje necesitamos introducir nuevos tipos de redes neuronales, tales como *redes recurrentes* y *transformers*.
|
||||
|
||||
## Instalar Bibliotecas
|
||||
## Instalar Librerías
|
||||
|
||||
Si estás utilizando una instalación local de Python para ejecutar este curso, es posible que necesites instalar todas las bibliotecas requeridas para PLN utilizando los siguientes comandos:
|
||||
Si usas una instalación local de Python para ejecutar este curso, es posible que necesites instalar todas las librerías necesarias para PLN usando los siguientes comandos:
|
||||
|
||||
**Para PyTorch**
|
||||
```bash
|
||||
pip install -r requirements-torch.txt
|
||||
pip install -r requirements-pytorch.txt
|
||||
```
|
||||
**Para TensorFlow**
|
||||
```bash
|
||||
|
|
@ -41,11 +41,11 @@ pip install -r requirements-tf.txt
|
|||
|
||||
En esta sección, en algunos de los ejemplos entrenaremos modelos bastante grandes.
|
||||
* **Usa una computadora con GPU**: Es recomendable ejecutar tus notebooks en una computadora con GPU para reducir los tiempos de espera al trabajar con modelos grandes.
|
||||
* **Restricciones de memoria de GPU**: Ejecutar en una GPU puede llevar a situaciones en las que te quedes sin memoria de GPU, especialmente al entrenar modelos grandes.
|
||||
* **Consumo de memoria de GPU**: La cantidad de memoria de GPU consumida durante el entrenamiento depende de varios factores, incluido el tamaño del minibatch.
|
||||
* **Minimiza el tamaño del minibatch**: Si encuentras problemas de memoria de GPU, considera reducir el tamaño del minibatch en tu código como una posible solución.
|
||||
* **Liberación de memoria de GPU en TensorFlow**: Las versiones antiguas de TensorFlow pueden no liberar correctamente la memoria de GPU al entrenar múltiples modelos dentro de un mismo kernel de Python. Para gestionar el uso de memoria de GPU de manera efectiva, puedes configurar TensorFlow para que asigne memoria de GPU solo según sea necesario.
|
||||
* **Inclusión de código**: Para configurar TensorFlow para que crezca la asignación de memoria de GPU solo cuando sea necesario, incluye el siguiente código en tus notebooks:
|
||||
* **Restricciones de memoria GPU**: Ejecutar con GPU puede llevar a situaciones donde se agote la memoria de la GPU, especialmente al entrenar modelos grandes.
|
||||
* **Consumo de memoria GPU**: La cantidad de memoria GPU consumida durante el entrenamiento depende de varios factores, incluyendo el tamaño del minibatch.
|
||||
* **Minimiza el tamaño del minibatch**: Si tienes problemas de memoria GPU, considera reducir el tamaño del minibatch en tu código como posible solución.
|
||||
* **Liberación de memoria GPU en TensorFlow**: Las versiones antiguas de TensorFlow pueden no liberar correctamente la memoria de GPU al entrenar múltiples modelos dentro de un mismo kernel de Python. Para manejar bien el uso de memoria de GPU, puedes configurar TensorFlow para que asigne memoria GPU solo cuando sea necesario.
|
||||
* **Inclusión de código**: Para configurar TensorFlow para que aumente la asignación de memoria GPU solo cuando se requiera, incluye el siguiente código en tus notebooks:
|
||||
|
||||
```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)
|
||||
```
|
||||
|
||||
Si estás interesado en aprender sobre PLN desde una perspectiva de ML clásico, visita [esta serie de lecciones](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP)
|
||||
Si te interesa aprender sobre PLN desde una perspectiva clásica de ML, visita [este conjunto de lecciones](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP)
|
||||
|
||||
## En esta sección
|
||||
## En esta Sección
|
||||
En esta sección aprenderemos sobre:
|
||||
|
||||
* [Representar texto como tensores](13-TextRep/README.md)
|
||||
* [Embeddings de palabras](14-Emdeddings/README.md)
|
||||
* [Representaciones de palabras (Word Embeddings)](14-Emdeddings/README.md)
|
||||
* [Modelado de lenguaje](15-LanguageModeling/README.md)
|
||||
* [Redes Neuronales Recurrentes](16-RNN/README.md)
|
||||
* [Redes Generativas](17-GenerativeNetworks/README.md)
|
||||
* [Transformadores](18-Transformers/README.md)
|
||||
* [Redes neuronales recurrentes](16-RNN/README.md)
|
||||
* [Redes generativas](17-GenerativeNetworks/README.md)
|
||||
* [Transformers](18-Transformers/README.md)
|
||||
|
||||
**Descargo de responsabilidad**:
|
||||
Este documento ha sido traducido utilizando el servicio de traducción automática [Co-op Translator](https://github.com/Azure/co-op-translator). Si bien nos esforzamos por lograr precisión, tenga en cuenta que las traducciones automáticas pueden contener errores o imprecisiones. El documento original en su idioma nativo debe considerarse como la fuente autorizada. Para información crítica, se recomienda una traducción profesional realizada por humanos. No nos hacemos responsables de malentendidos o interpretaciones erróneas que puedan surgir del uso de esta traducción.
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**Descargo de responsabilidad**:
|
||||
Este documento ha sido traducido utilizando el servicio de traducción automática [Co-op Translator](https://github.com/Azure/co-op-translator). Aunque nos esforzamos por la precisión, tenga en cuenta que las traducciones automatizadas pueden contener errores o inexactitudes. El documento original en su idioma nativo debe considerarse la fuente autorizada. Para información crítica, se recomienda una traducción profesional humana. No somos responsables de cualquier malentendido o interpretación errónea que surja del uso de esta traducción.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -5,6 +5,12 @@
|
|||
"source_file": "AGENTS.md",
|
||||
"language_code": "et"
|
||||
},
|
||||
"CONTRIBUTING.md": {
|
||||
"original_hash": "c6fd7e781b67111a90abd166d0ce4aa0",
|
||||
"translation_date": "2026-07-08T18:24:27+00:00",
|
||||
"source_file": "CONTRIBUTING.md",
|
||||
"language_code": "et"
|
||||
},
|
||||
"README.md": {
|
||||
"original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b",
|
||||
"translation_date": "2026-04-06T16:03:39+00:00",
|
||||
|
|
@ -17,6 +23,19 @@
|
|||
"source_file": "SECURITY.md",
|
||||
"language_code": "et"
|
||||
},
|
||||
"__translation_failures__": {
|
||||
"lessons/sketchnotes/LICENSE.md": {
|
||||
"original_hash": "45ab63a2cd8f5faef6c9b150618837a4",
|
||||
"source_file": "lessons/sketchnotes/LICENSE.md",
|
||||
"language_code": "et",
|
||||
"failure_date": "2026-07-08T18:16:00+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-10-11T11:52:06+00:00",
|
||||
|
|
@ -54,8 +73,8 @@
|
|||
"language_code": "et"
|
||||
},
|
||||
"examples/README.md": {
|
||||
"original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7",
|
||||
"translation_date": "2025-10-11T11:17:05+00:00",
|
||||
"original_hash": "7883d52c2e2a221e0b07a7b112a149b9",
|
||||
"translation_date": "2026-07-08T18:10:56+00:00",
|
||||
"source_file": "examples/README.md",
|
||||
"language_code": "et"
|
||||
},
|
||||
|
|
@ -66,8 +85,8 @@
|
|||
"language_code": "et"
|
||||
},
|
||||
"lessons/0-course-setup/how-to-run.md": {
|
||||
"original_hash": "a4717bd9103b9f6cd84d534b83534689",
|
||||
"translation_date": "2026-01-16T07:25:31+00:00",
|
||||
"original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1",
|
||||
"translation_date": "2026-07-08T18:11:19+00:00",
|
||||
"source_file": "lessons/0-course-setup/how-to-run.md",
|
||||
"language_code": "et"
|
||||
},
|
||||
|
|
@ -191,6 +210,12 @@
|
|||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md",
|
||||
"language_code": "et"
|
||||
},
|
||||
"lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": {
|
||||
"original_hash": "99b816b6a4957ef4100cee4c4221dff9",
|
||||
"translation_date": "2026-07-08T18:07:36+00:00",
|
||||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb",
|
||||
"language_code": "et"
|
||||
},
|
||||
"lessons/4-ComputerVision/08-TransferLearning/lab/README.md": {
|
||||
"original_hash": "7765935c35fcee69b9fe2d0cfd6963e2",
|
||||
"translation_date": "2025-10-11T11:21:56+00:00",
|
||||
|
|
@ -330,8 +355,8 @@
|
|||
"language_code": "et"
|
||||
},
|
||||
"lessons/5-NLP/README.md": {
|
||||
"original_hash": "8ef02a9318257ea140ed3ed74442096d",
|
||||
"translation_date": "2025-10-11T11:38:36+00:00",
|
||||
"original_hash": "038df6f1a73e49f6430740da083bfd6d",
|
||||
"translation_date": "2026-07-08T18:11:50+00:00",
|
||||
"source_file": "lessons/5-NLP/README.md",
|
||||
"language_code": "et"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -0,0 +1,29 @@
|
|||
# Panustamine AI-Algajatele
|
||||
|
||||
Täname teid huvi eest panustada AI-Algajatele! Ootame tõlkeid, õppetükkide parandusi ja vorminduse korrektsioone.
|
||||
|
||||
## Microsofti Kaastööleping (CLA)
|
||||
|
||||
See projekt ootab panuseid ja ettepanekuid. Enamik panustest eeldab, et nõustute Kaastöölepinguga (CLA), mis kinnitab, et teil on õigus ja te tegelikult annate meile õiguse kasutada teie panust. Täpsemate üksikasjade jaoks külastage [https://cla.microsoft.com](https://cla.microsoft.com).
|
||||
|
||||
Kui esitate pull-päringu, siis CLA-bot määrab automaatselt, kas peate esitama CLA ja märgistab pull-päringu vastavalt (näiteks sildi või kommentaariga). Lihtsalt järgige botti antud juhiseid. Seda tuleb teha vaid korra kõigis meie CLA-d kasutavates hoidlates.
|
||||
|
||||
## Kuidas panustada
|
||||
|
||||
### 1. Trükkimisvigade / koodiveade parandamine
|
||||
Kui leiaksite trükkvea või vea mõnes Jupyteri märkmikus või õppetüki markdown-failis:
|
||||
1. Tlooge hoidla koopia (fork).
|
||||
2. Parandage trükk- või katkine link.
|
||||
3. Esitage Pull Request, millel on selge paranduse kirjeldus.
|
||||
|
||||
### 2. Tõlgete esitamine
|
||||
Ootame õppetükkide tõlkeid teistesse keeltesse! Palun pange tõlked `translations/` kausta, kasutades seal olemasolevaid kaustade nimesid (näiteks `translations/es/`, `translations/pt-BR/`, `translations/zh-CN/`).
|
||||
|
||||
Täpsemate üksikasjade jaoks vaadake [etc/CONTRIBUTING.md](etc/CONTRIBUTING.md).
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**Lahtiütlus**:
|
||||
See dokument on tõlgitud kasutades AI tõlketeenust [Co-op Translator](https://github.com/Azure/co-op-translator). Kuigi me püüdleme täpsuse poole, palun pange tähele, et automatiseeritud tõlgetes võib esineda vigu või ebatäpsusi. Originaaldokument selle emakeeles tuleks pidada autoriteetseks allikaks. Olulise teabe puhul soovitatakse kasutada professionaalset inimtõlget. Me ei vastuta selle tõlkega seotud eksimustest või valesti mõistmistest.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -1,85 +1,87 @@
|
|||
# Algajatele sobivad tehisintellekti näited
|
||||
# Algajatele Sobivad Tehisintellekti Näited
|
||||
|
||||
Tere tulemast! See kataloog sisaldab lihtsaid ja iseseisvaid näiteid, mis aitavad sul alustada tehisintellekti ja masinõppega. Iga näide on loodud algajasõbralikuks, sisaldades üksikasjalikke kommentaare ja samm-sammulisi selgitusi.
|
||||
Tere tulemast! See kataloog sisaldab lihtsaid üksikuid näiteid, mis aitavad sul alustada tehisintellekti ja masinõppega. Iga näide on loodud algajasõbralikuna koos põhjalike kommentaaride ja samm-sammuliste selgitustega.
|
||||
|
||||
## 📚 Näidete ülevaade
|
||||
## 📚 Näidete Ülevaade
|
||||
|
||||
| Näide | Kirjeldus | Raskusaste | Eelteadmised |
|
||||
|-------|-----------|------------|--------------|
|
||||
| [Tere, AI maailm](../../../examples/01-hello-ai-world.py) | Sinu esimene tehisintellekti programm - lihtne mustrituvastus | ⭐ Algaja | Pythoni algteadmised |
|
||||
| [Lihtne närvivõrk](../../../examples/02-simple-neural-network.py) | Loo närvivõrk nullist | ⭐⭐ Algaja+ | Python, põhiteadmised matemaatikast |
|
||||
| [Pildiklassifitseerija](./03-image-classifier.ipynb) | Klassifitseeri pilte eelnevalt treenitud mudeliga | ⭐⭐ Algaja+ | Python, numpy |
|
||||
| [Teksti sentiment](../../../examples/04-text-sentiment.py) | Analüüsi teksti sentimenti (positiivne/negatiivne) | ⭐⭐ Algaja+ | Python |
|
||||
| Näide | Kirjeldus | Raskusaste | Nõuded |
|
||||
|---------|-------------|------------|---------------|
|
||||
| [Tere, AI maailm](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/01-hello-ai-world.py) | Sinu esimene tehisintellekti programm - lihtne mustrituvastus | ⭐ Algaja | Pythoni põhiteadmised |
|
||||
| [Lihtne närvivõrk](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/02-simple-neural-network.py) | Ehita närvivõrk nullist | ⭐⭐ Algaja+ | Python, põhiline matemaatika |
|
||||
| [Pildiklassifitseerija](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/03-image-classifier.ipynb) | Klassifitseeri pilte eelõpetatud mudeliga | ⭐⭐ Algaja+ | Python, numpy |
|
||||
| [Teksti meeleolu](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/04-text-sentiment.py) | Analüüsi teksti meelolu (positiivne/negatiivne) | ⭐⭐ Algaja+ | Python |
|
||||
|
||||
## 🚀 Alustamine
|
||||
|
||||
### Eeltingimused
|
||||
### Nõudmised
|
||||
|
||||
Veendu, et sul on Python installitud (soovitatav versioon 3.8 või uuem). Paigalda vajalikud paketid:
|
||||
Veendu, et sinul on Python installitud (soovitatav 3.8 või uuem). Paigalda vajalikud paketid:
|
||||
|
||||
```bash
|
||||
# For Python scripts
|
||||
# Pythoni skriptide jaoks
|
||||
pip install numpy
|
||||
|
||||
# For Jupyter notebooks (image classifier)
|
||||
# Jupyteri märkmike jaoks (pildiklassifikaator)
|
||||
pip install jupyter numpy pillow tensorflow
|
||||
```
|
||||
|
||||
Või kasuta põhikursuse conda keskkonda:
|
||||
Või kasuta conda keskkonda põhikursusest:
|
||||
|
||||
```bash
|
||||
conda env create --name ai4beg --file ../environment.yml
|
||||
conda activate ai4beg
|
||||
```
|
||||
|
||||
### Näidete käivitamine
|
||||
### Näidete Käivitamine
|
||||
|
||||
**Python skriptide (.py failid) jaoks:**
|
||||
```bash
|
||||
python 01-hello-ai-world.py
|
||||
```
|
||||
|
||||
**Jupyteri märkmike (.ipynb failid) jaoks:**
|
||||
**Jupyter märkmeraamatute (.ipynb failid) jaoks:**
|
||||
```bash
|
||||
jupyter notebook 03-image-classifier.ipynb
|
||||
```
|
||||
|
||||
## 📖 Õppimise teekond
|
||||
## 📖 Õppimise Tee
|
||||
|
||||
Soovitame järgida näiteid järjekorras:
|
||||
|
||||
1. **Alusta "Tere, AI maailm" näitest** - Õpi mustrituvastuse põhitõdesid
|
||||
1. **Alusta "Tere, AI maailm"-ga** - Õpi mustrituvastuse põhialuseid
|
||||
2. **Ehita lihtne närvivõrk** - Mõista, kuidas närvivõrgud töötavad
|
||||
3. **Proovi pildiklassifitseerijat** - Näe tehisintellekti töös päris piltidega
|
||||
4. **Analüüsi teksti sentimenti** - Uuri loomuliku keele töötlemist
|
||||
3. **Proovi pildiklassifitseerijat** - Vaata tehisintellekti toimimas pärispiltidega
|
||||
4. **Analüüsi teksti meeleolu** - Uuri loomuliku keele töötlust
|
||||
|
||||
## 💡 Näpunäiteid algajatele
|
||||
## 💡 Nõuanded Algajatele
|
||||
|
||||
- **Loe hoolikalt koodikommentaare** - Need selgitavad, mida iga rida teeb
|
||||
- **Loe koodi kommentaare hoolikalt** - Need selgitavad, mida iga rida teeb
|
||||
- **Katseta!** - Proovi muuta väärtusi ja vaata, mis juhtub
|
||||
- **Ära muretse, kui kõike kohe ei mõista** - Õppimine võtab aega
|
||||
- **Küsi küsimusi** - Kasuta [arutelufoorumit](https://github.com/microsoft/AI-For-Beginners/discussions)
|
||||
- **Esita küsimusi** - Kasuta [Arutelufoorumit](https://github.com/microsoft/AI-For-Beginners/discussions)
|
||||
|
||||
## 🔗 Järgmised sammud
|
||||
## 🔗 Järgmised Sammud
|
||||
|
||||
Pärast nende näidete läbimist avasta kogu õppekava:
|
||||
Kui oled need näited lõpetanud, uurige kogu õppekava:
|
||||
- [Sissejuhatus tehisintellekti](../lessons/1-Intro/README.md)
|
||||
- [Närvivõrgud](../lessons/3-NeuralNetworks/README.md)
|
||||
- [Arvutinägemine](../lessons/4-ComputerVision/README.md)
|
||||
- [Loomuliku keele töötlemine](../lessons/5-NLP/README.md)
|
||||
- [Loodusliku Keele Töötlus](../lessons/5-NLP/README.md)
|
||||
|
||||
## 🤝 Kaasaaitamine
|
||||
## 🤝 Panustamine
|
||||
|
||||
Leidsid need näited kasulikud? Aita meil neid paremaks muuta:
|
||||
- Teata probleemidest või tee parandusettepanekuid
|
||||
- Lisa rohkem algajatele mõeldud näiteid
|
||||
Kas leidsid need näited kasulikuks? Aita meil neid parandada:
|
||||
- Teata probleemidest või tee ettepanekuid
|
||||
- Lisa rohkem näiteid algajatele
|
||||
- Paranda dokumentatsiooni ja kommentaare
|
||||
|
||||
---
|
||||
|
||||
*Pea meeles: Iga ekspert on kunagi olnud algaja. Head õppimist! 🎓*
|
||||
*Pea meeles: iga ekspert oli kord algaja. Edukat õppimist! 🎓*
|
||||
|
||||
---
|
||||
|
||||
**Lahtiütlus**:
|
||||
See dokument on tõlgitud, kasutades AI tõlketeenust [Co-op Translator](https://github.com/Azure/co-op-translator). Kuigi püüame tagada täpsust, palun arvestage, et automaatsed tõlked võivad sisaldada vigu või ebatäpsusi. Algne dokument selle algses keeles tuleks lugeda autoriteetseks allikaks. Olulise teabe puhul on soovitatav kasutada professionaalset inimtõlget. Me ei vastuta selle tõlke kasutamisest tulenevate arusaamatuste või valede tõlgenduste eest.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**Lahtiütlus**:
|
||||
See dokument on tõlgitud kasutades AI tõlketeenust [Co-op Translator](https://github.com/Azure/co-op-translator). Kuigi me püüdleme täpsuse poole, palun pange tähele, et automatiseeritud tõlgetes võib esineda vigu või ebatäpsusi. Originaaldokument selle emakeeles tuleks pidada autoriteetseks allikaks. Olulise teabe puhul soovitatakse kasutada professionaalset inimtõlget. Me ei vastuta selle tõlkega seotud eksimustest või valesti mõistmistest.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -1,12 +1,12 @@
|
|||
# Kuidas Koodi Käivitada
|
||||
# Kuidas koodi käivitada
|
||||
|
||||
See õppekava sisaldab palju täidetavaid näiteid ja töötoad, mida soovite jooksutada. Selleks peate saama käivitada Python koodi Jupyter märkmikes, mis on selle õppekava osana esitatud. Koodi käivitamiseks on teil mitu võimalust:
|
||||
See õppekava sisaldab palju käivitatavaid näiteid ja laboreid, mida soovite käivitada. Selleks peate suutma käivitada Python-koodi Jupyter Notebook'ides, mis on selle õppekava osana saadaval. Koodi käivitamiseks on teil mitu võimalust:
|
||||
|
||||
## Käivita lokaalselt oma arvutis
|
||||
## Käivitage lokaalselt oma arvutis
|
||||
|
||||
Koodi käivitamiseks lokaalselt oma arvutis on vajalik Python'i paigaldus. Üks soovitus on installida **[miniconda](https://conda.io/en/latest/miniconda.html)** – see on üsna kerge paigaldus, mis toetab `conda` pakihaldurit erinevate Python'i **virtuaalsete keskkondade** jaoks.
|
||||
Koodi käivitamiseks lokaalselt oma arvutis on vaja Python'i installatsiooni. Soovitame installida **[miniconda](https://conda.io/en/latest/miniconda.html)** – see on suhteliselt kerge installatsioon, mis toetab `conda` pakihaldurit erinevate Python'i **virtuaalsete keskkondade** jaoks.
|
||||
|
||||
Pärast miniconda paigaldamist kloonige hoidla ja looge selle kursuse jaoks virtuaalne keskkond:
|
||||
Pärast miniconda installimist kloonige hoidla ja looge selle kursuse jaoks kasutatav virtuaalne keskkond:
|
||||
|
||||
```bash
|
||||
git clone http://github.com/microsoft/ai-for-beginners
|
||||
|
|
@ -15,58 +15,57 @@ conda env create --name ai4beg --file .devcontainer/environment.yml
|
|||
conda activate ai4beg
|
||||
```
|
||||
|
||||
### Kasutades Visual Studio Code koos Python laiendiga
|
||||
### Visual Studio Code kasutamine Python'i laiendusega
|
||||
|
||||
Seda õppekava on kõige parem kasutada, kui avate selle [Visual Studio Code’is](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) koos [Python laiendiga](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste).
|
||||
Seda õppekava on kõige parem kasutada avades seda [Visual Studio Code'is](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) koos [Python'i laiendusega](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste).
|
||||
|
||||
> **Märkus**: Kui kloonite ja avate kausta VS Code’is, soovitab see automaatselt paigaldada Python laiendused. Samuti peate paigaldama miniconda nagu eespool kirjeldatud.
|
||||
> **Märkus**: Kui olete hoidla klooninud ja avanud kataloogi VS Code'is, soovitatakse teil automaatselt Python'i laiendusi installida. Samuti peate installima miniconda vastavalt ülaltoodule.
|
||||
|
||||
> **Märkus**: Kui VS Code soovitab teil hoidlale konteineris uuesti ligi pääseda, peaksite selle keelduma, et kasutada lokaalset Python'i paigaldust.
|
||||
> **Märkus**: Kui VS Code soovitab teil hoidla konteineris uuesti avada, peaksite selle pakkumise tagasi lükkama, et kasutada kohalikku Python'i installatsiooni.
|
||||
|
||||
### Kasutades Jupyterit brauseris
|
||||
### Jupyter'i kasutamine brauseris
|
||||
|
||||
Võite kasutada ka Jupyter keskkonda brauserist oma arvutis. Nii klassikaline Jupyter kui ka JupyterHub pakuvad mugavat arenduskeskkonda automaatse täienduse, koodi esiletõstmise jms funktsioonidega.
|
||||
Samuti saate kasutada Jupyter'i keskkonda oma arvuti brauseris. Nii klassikaline Jupyter kui ka JupyterHub pakuvad mugavat arendusvõimalust koos automaattäienduse, koodivärvimise jm-ga.
|
||||
|
||||
Jupyterit käivitamiseks lokaalselt minge kursuse kataloogi ning käivitage:
|
||||
Jupyter'i kohalikuks käivitamiseks minge kursuse kataloogi ja käivitage:
|
||||
|
||||
```bash
|
||||
jupyter notebook
|
||||
```
|
||||
või
|
||||
või
|
||||
```bash
|
||||
jupyterhub
|
||||
```
|
||||
|
||||
Seejärel saate minna mis tahes `.ipynb` faili juurde, avada selle ja alustada tööd.
|
||||
Seejärel saate navigeerida ükskõik millise `.ipynb` faili juurde, avada selle ja alustada tööd.
|
||||
|
||||
### Käivitamine konteineris
|
||||
|
||||
Üks alternatiiv Python'i paigaldamisele on koodi käivitamine konteineris. Kuna meie hoidla sisaldab spetsiaalset `.devcontainer` kausta, mis juhendab konteineri ehitamist selle hoidlaga, pakub VS Code võimalust hoidlale konteineris uuesti ligi pääseda. Selleks on vajalik Docker’i installatsioon ja see on ka keerulisem, seega soovitame seda rohkem kogenud kasutajatele.
|
||||
Üks alternatiiv Python'i installatsioonile on koodi käivitamine konteineris. Kuna meie hoidla sisaldab spetsiaalset `.devcontainer` kausta, mis juhendab konteineri ehitamist selle hoidla jaoks, pakub VS Code võimalust koodi konteineris uuesti avada. Selleks on vaja Docker'i installatsiooni ja see on keerukam, seega soovitame seda rohkem kogenud kasutajatele.
|
||||
|
||||
## Käivitamine pilves
|
||||
## Pilves käivitamine
|
||||
|
||||
Kui te ei soovi Pythonit lokaalselt paigaldada, kuid teil on ligipääs mõnele pilveteenusele, on hea alternatiiv koodi käivitamine pilvest. Seda saab teha mitmel viisil:
|
||||
Kui te ei soovi Python'i kohapeal installida ja teil on ligipääs mõnele pilveressursile, siis hea alternatiiv on koodi käivitamine pilves. Selleks on mitmeid võimalusi:
|
||||
|
||||
* Kasutades **[GitHub Codespaces](https://github.com/features/codespaces)**, mis on teile GitHubis loodav virtuaalne keskkond, mida pääseb ligi VS Code’i brauseri kaudu. Kui teil on Codespaces’i ligipääs, saate lihtsalt hoidla lehel vajutada nuppu **Code**, alustada codespace’i ning hakata kohe koodi jooksutama.
|
||||
* Kasutades **[Binderit](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) pakub tasuta arvutusressursse pilves, mis võimaldab teil GitHubi koodi mugavalt testida. Esilehel on nupp, mis avab hoidla Binderis – see viib teid rapidamente Binderi lehele, mis ehitab taustal konteineri ja käivitab teie jaoks sujuvalt Jupyter veebiliidese.
|
||||
* Kasutades **[GitHub Codespaces](https://github.com/features/codespaces)**, mis on teie jaoks GitHubis loodud virtuaalne keskkond, mida pääseb ligi VS Code'i brauseriliidese kaudu. Kui teil on Codespaces'i ligipääs, saate lihtsalt vajutada hoidla **Code** nuppu, käivitada codespace'i ja hakata kohe kasutama.
|
||||
* Kasutades **[Binderit](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) pakub pilves tasuta arvutusressursse, et saaksite GitHubis olevat koodi testida. Esilehel on nupp, mille abil saate hoidla Binderisse avada – see viib teid kiiresti Binder'i saidile, mis ehitab aluseks oleva konteineri ja käivitab probleemideta Jupyter'i veebiliidese.
|
||||
|
||||
> **Märkus**: Kuritarvituste vältimiseks on Binderi ligipääs mõnele veebiallikale piiratud. See võib takistada mõnel koodil toimimast, mis alla laadib mudeleid ja/või andmestasid avalikust internetist. Võite vajada mõnda lahendust nende piirangute vältimiseks. Samuti on Binderi pakutavad arvutusressursid üsna piiratud, mistõttu treeningud võivad olla aeglased, eriti hilisemates keerulisemates õppetundides.
|
||||
> **Märkus**: Kuritarvituste vältimiseks on Bindril juurdepääs mõnedele veebivahenditele piiratud. See võib takistada mõnda koodi töötamist, mis laadib mudeleid ja/või andmekogumeid avalikust internetist. Võib tekkida vajadus otsida lahendusi. Samuti on Binderi pakutavad arvutusressursid üsna piiratud, seega võib treenimine olla aeglane, eriti hilisemates, keerukamates tundides.
|
||||
|
||||
## Käivitamine pilves koos GPU-toega
|
||||
## Pilves käivitamine GPU-ga
|
||||
|
||||
Mõned õppetunnid selles õppekavas kasutaksid oluliselt GPU-d, mis muudab mudelite treenimise palju kiiremaks. GPU toe olemasolu on eriti kasulik. Mõned võimalused:
|
||||
Mõned hilisemad selle õppekava tunnid võtaksid GPU toe suurepäraselt vastu. Mudelite treenimine võib muidu olla valusalt aeglane. On mitu võimalust, mida võite kasutada, eriti kui teil on juurdepääs pilvele kas [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) kaudu või oma asutuse kaudu:
|
||||
|
||||
* Loo [Data Science Virtual Machine](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) ja ühenda sellega Jupyteri kaudu. Saate kloonida hoidla otse masinale ning alustada õppimist. NC-seeria VM-id toetavad GPU-d.
|
||||
* Looge [Data Science virtuaalmasin](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) ja ühenduge sellega Jupyteri kaudu. Siis saate kloonida hoidla otse masinale ja alustada õppimist. NC-seeria VM-id toetavad GPU-d.
|
||||
|
||||
> **Märkus**: Mõned tellimused, sh Azure for Students, ei paku vaikimisi GPU tuge. Võib-olla peate esitama tehnilise toe taotluse täiendavate GPU tuumade saamiseks.
|
||||
> **Märkus**: Mõned tellimused, sh Azure for Students, ei paku GPU-tuge automaatselt. Võib vaja minna tehnilise toe taotlust täiendavate GPU südamike saamiseks.
|
||||
|
||||
* Loo [Azure Machine Learning Workspace](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) ja kasuta seal Jupyter märkmiku funktsiooni. [See video](https://azure-for-academics.github.io/quickstart/azureml-papers/) näitab, kuidas kloonida hoidla Azure ML märkmikku ja seda kasutada.
|
||||
* Looge [Azure Machine Learning Workspace](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) ja seejärel kasutage seal Notebook'i funktsiooni. [See video](https://azure-for-academics.github.io/quickstart/azureml-papers/) näitab, kuidas kloonida hoidla Azure ML noteboodi ja hakata seda kasutama.
|
||||
|
||||
Võite kasutada ka Google Colabit, mis pakub mõningast tasuta GPU tuge, ning üles laadida sinna Jupyteri märkmikud, mida sealt ükshaaval käivitada.
|
||||
Võite kasutada ka Google Colabit, mis pakub teatud tasuta GPU tuge, ja laadida sinna üles Jupyter Notebook'e, et neid ükshaaval käivitada.
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**Vastutusest loobumine**:
|
||||
See dokument on tõlgitud kasutades AI tõlke teenust [Co-op Translator](https://github.com/Azure/co-op-translator). Kuigi püüame tagada täpsust, palun arvestage, et automaatsed tõlked võivad sisaldada vigu või ebatäpsusi. Algne dokument selle emakeeles tuleks pidada autoriteetseks allikaks. Olulise info puhul soovitatakse kasutada professionaalset inimtõlget. Me ei vastuta selle tõlke kasutamisest tulenevate arusaamatuste ega valesti mõistmiste eest.
|
||||
**Lahtiütlus**:
|
||||
See dokument on tõlgitud kasutades AI tõlketeenust [Co-op Translator](https://github.com/Azure/co-op-translator). Kuigi me püüdleme täpsuse poole, palun pange tähele, et automatiseeritud tõlgetes võib esineda vigu või ebatäpsusi. Originaaldokument selle emakeeles tuleks pidada autoriteetseks allikaks. Olulise teabe puhul soovitatakse kasutada professionaalset inimtõlget. Me ei vastuta selle tõlkega seotud eksimustest või valesti mõistmistest.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -4,11 +4,11 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Eeltreenitud mudelid ja ülekandeõpe\n",
|
||||
"# Eelkoolitatud mudelid ja teadmiste ülekandmine\n",
|
||||
"\n",
|
||||
"CNN-ide treenimine võib võtta palju aega ning selleks on vaja suurt hulka andmeid. Kuid suurem osa ajast kulub sellele, et õppida parimaid madala taseme filtreid, mida võrk kasutab mustrite eraldamiseks piltidelt. Tekib loomulik küsimus – kas me saame kasutada ühel andmestikul treenitud närvivõrku ja kohandada seda erinevate piltide klassifitseerimiseks ilma täieliku treeningprotsessita?\n",
|
||||
"Konvolutsioonvõrke (CNN) koolitada võib võtta palju aega ning selle ülesande jaoks on vaja palju andmeid. Kuid suure osa sellest ajast kulutatakse sellele, et õppida parimaid madala taseme filtreid, mida võrk kasutab piltidelt mustrite väljatõmbamiseks. Tõuseb loomulik küsimus – kas me saame kasutada ühel andmestikul koolitatud närvivõrku ja kohandada seda erinevate piltide klassifitseerimiseks ilma täieliku koolitusprotsessita?\n",
|
||||
"\n",
|
||||
"Seda lähenemist nimetatakse **ülekandeõppeks**, kuna me kanname osa teadmistest ühest närvivõrgu mudelist teise. Ülekandeõppes alustame tavaliselt eeltreenitud mudeliga, mis on treenitud mõnel suurel pildianmestikul, näiteks **ImageNet**. Need mudelid suudavad juba hästi eraldada erinevaid omadusi üldistest piltidest ning paljudel juhtudel võib lihtsalt nende eraldatud omaduste peale klassifikaatori ehitamine anda häid tulemusi.\n"
|
||||
"Seda lähenemist nimetatakse **teadmiste ülekandmiseks** (transfer learning), sest me kanname üle mõningaid teadmisi ühest närvivõrgu mudelist teise. Tavaliselt alustame selleks eelkoolitatud mudelist, mida on juba koolitatud mingi suure pildistandme hulga peal, näiteks **ImageNet**il. Need mudelid suudavad juba hästi väljatõmmata erinevaid omadusi üldistest piltidest, ja paljudel juhtudel piisab heast tulemusest, kui üles ehitada klassifikaator nende väljatõmmatud omaduste põhjal.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -29,11 +29,11 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Kasside ja koerte andmekogu\n",
|
||||
"## Kasside ja koerte andmestik\n",
|
||||
"\n",
|
||||
"Selles osas lahendame päriselulise probleemi kasside ja koerte piltide klassifitseerimisel. Selleks kasutame [Kaggle kasside ja koerte andmekogu](https://www.kaggle.com/c/dogs-vs-cats), mida saab alla laadida ka [Microsofti lehelt](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n",
|
||||
"Selles üksuses lahendame reaalse elu probleemi, mis käsitleb kasside ja koerte piltide klassifitseerimist. Selleks kasutame [Kaggle kasside ja koerte andmestikku](https://www.kaggle.com/c/dogs-vs-cats), mida saab ka alla laadida [Microsoftist](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n",
|
||||
"\n",
|
||||
"Laadime selle andmekogu alla ja ekstraktime selle `data` kataloogi (see protsess võib võtta veidi aega!):\n"
|
||||
"Laadime selle andmestiku alla ja pakime selle välja kausta `data` (see protsess võib võtta natuke aega!):\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -64,7 +64,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Kahjuks on andmekogus mõned rikutud pildifailid. Peame kiiresti puhastama, et kontrollida rikutud faile. Selleks, et mitte seda õpetust segada, liikusime andmekogu kontrollimise koodi moodulisse.\n"
|
||||
"Kahjuks on andmestikus mõned rikutud pildifailid. Peame kiire puhastuse tegemiseks kontrollima rikutud faile. Selleks, et see juhend ei kannataks, viisime andmestiku kontrollikoodi moodulisse.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -333,13 +333,13 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Andmete laadimine\n",
|
||||
"## Andmestiku laadimine\n",
|
||||
"\n",
|
||||
"Eelnevates näidetes laadisime andmekogumeid, mis on Kerasisse sisse ehitatud. Nüüd hakkame töötama oma andmekogumiga, mille peame laadima pildikataloogist.\n",
|
||||
"Varasemates näidetes laadisime andmekogusid, mis on Keras sisse ehitatud. Nüüd hakkame tegelema oma andmekoguga, mida tuleb laadida pildikaustast.\n",
|
||||
"\n",
|
||||
"Tegelikkuses võivad pildikogumite suurused olla üsna suured, mistõttu ei saa eeldada, et kogu andmestik mahuks mällu. Seetõttu esitatakse andmekogumeid tihti **generaatoritena**, mis suudavad tagastada andmeid väikeste partiidena, mis sobivad treenimiseks.\n",
|
||||
"Reaalses elus võivad pildikogude mahud olla üsna suured ning ei saa eeldada, et kogu andmestik mahub korraga mällu. Seetõttu kujutatakse andmekogusid sageli **generaatoritena**, mis suudavad tagastada andmeid minibatch’idena, mis sobivad treenimiseks.\n",
|
||||
"\n",
|
||||
"Pildiklassifikatsiooniga tegelemiseks sisaldab Keras spetsiaalset funktsiooni `image_dataset_from_directory`, mis suudab laadida pilte alamkataloogidest, mis vastavad erinevatele klassidele. See funktsioon hoolitseb ka piltide skaleerimise eest ning suudab andmekogumi jagada treening- ja testimisalamhulkadeks:\n"
|
||||
"Pildiklassifitseerimisega tegelemiseks sisaldab Keras erifunktsiooni `image_dataset_from_directory`, mis suudab laadida pilte alamkaustadest, mis vastavad erinevatele klassidele. See funktsioon hoolitseb ka piltide skaaleerimise eest ning saab jagada andmestiku treening- ja testandmeks:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -383,9 +383,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Oluline on määrata mõlema kutse jaoks sama `seed` väärtus, kuna see mõjutab piltide jaotust treening- ja testandmestiku vahel.\n",
|
||||
"On oluline määrata mõlema kutse jaoks sama `seed` väärtus, sest see mõjutab piltide jaotust treening- ja testkomplektide vahel.\n",
|
||||
"\n",
|
||||
"Andmestik tuvastab automaatselt klasside nimed kataloogidest ja vajadusel saate neile ligi pääseda, kutsudes:\n"
|
||||
"Andmekogum võtab klassinimed automaatselt kataloogidest ning vajadusel saate neile ligi pääseda, kutsudes:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -412,7 +412,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Andmekogumid, mille oleme hankinud, saab otse `fit` funktsioonile edastada, et mudelit treenida. Need sisaldavad nii vastavaid pilte kui ka silte, mida saab läbi käia järgmise konstruktsiooni abil:\n"
|
||||
"Andmekogusid, mida oleme saanud, saab otse edastada funktsioonile `fit`, et mudelit treenida. Need sisaldavad nii vastavaid pilte kui ka silte, mida saab tsüklis töödelda järgmise konstruktsiooni abil:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -453,7 +453,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"> **Märkus**: Kõik andmekogus olevad pildid on esitatud ujukomapunkti tensoritena vahemikus 0-255. Enne nende edastamist närvivõrgule peame need väärtused skaleerima vahemikku 0-1. Piltide kuvamisel peame tegema sama või teisendama väärtused `int` tüüpi (nagu teeme ülaltoodud koodis), et näidata `matplotlib`-ile, et soovime kuvada algset skaleerimata pilti.\n"
|
||||
"> **Märkus**: Kõik andmekogumi pildid on esitatud ujukomaarvuliste tensoritena vahemikus 0-255. Enne nende närvivõrku edastamist peame need väärtused skaleerima vahemikku 0-1. Piltide joonistamisel peame kas tegema sama või teisendama väärtused `int` tüübiks (nagu me ülalolevas koodis teeme), et näidata `matplotlibile`, et soovime joonistada algse skaaleerimata pildi.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -462,7 +462,7 @@
|
|||
"source": [
|
||||
"## Eeltreenitud mudelid\n",
|
||||
"\n",
|
||||
"Paljude pildiklassifitseerimise ülesannete jaoks on võimalik leida eeltreenitud tehisnärvivõrgu mudeleid. Paljud neist mudelitest on saadaval `keras.applications` nimelises ruumis, ja veel rohkem mudeleid võib leida Internetist. Vaatame, kuidas kõige lihtsam VGG-16 mudel saab laaditud ja kasutatud:\n"
|
||||
"Paljude pildiklassifitseerimise ülesannete jaoks on olemas eeltreenitud närvivõrgu mudelid. Paljud neist mudelitest on saadaval `keras.applications` nimeruumis ning veelgi rohkem mudeleid leidub internetis. Vaatame, kuidas saab laadida ja kasutada lihtsaimat VGG-16 mudelit:\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": [
|
||||
"Siin on mõned olulised punktid:\n",
|
||||
"* Enne kui sisend edastatakse eelnevalt treenitud võrgule, tuleb see teatud viisil eeltöödelda. Seda tehakse, kutsudes vastavat `preprocess_input` funktsiooni, mis võtab vastu pildi partii ja tagastab nende töödeldud vormi. VGG-16 puhul normaliseeritakse pildid ja iga kanali jaoks lahutatakse ette määratud keskmine väärtus. See on vajalik, kuna VGG-16 treeniti algselt sellise eeltöötlusega.\n",
|
||||
"* Neuraalvõrk rakendatakse sisendi partiile ja tulemuseks saadakse 1000-elemendilised tensorite partiid, mis näitavad iga klassi tõenäosust. Kõige tõenäolisema klassi numbri leidmiseks saab kasutada `argmax` funktsiooni sellel tensoril.\n",
|
||||
"* Saadud tulemus on [`ImageNet` klassi number](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Selle tulemuse mõistmiseks saab kasutada ka `decode_predictions` funktsiooni, mis tagastab n kõige tõenäolisemat klassi koos nende nimedega.\n"
|
||||
"Siin on mõned olulised asjad:\n",
|
||||
"* Enne sisendi andmist mis tahes eeltreenitud võrku tuleb see teatud viisil eeltöödelda. Seda tehakse sobiva `preprocess_input` funktsiooni kutsumisega, mis võtab vastu pildi partiid ja tagastab nende töödeldud vormi. VGG-16 puhul normaliseeritakse pildid ja igast kanalist lahutatakse mõni eelmääratud keskmine väärtus. See on nii, sest VGG-16 koolitati algselt selle eeltöötlusega.\n",
|
||||
"* Neuraalvõrku rakendatakse sisendi partii suhtes ja tulemuseks saame 1000-elementsete tensorite partiid, mis näitab iga klassi tõenäosust. Kõige tõenäolisema klassi numbri leiame, kutsudes sellel tensori `argmax` funktsiooni.\n",
|
||||
"* Saadud tulemus on [„ImageNet“ klassi number](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Selle tulemuse mõistmiseks võime kasutada ka `decode_predictions` funktsiooni, mis tagastab peamised n klassi koos nende nimedega.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -599,7 +609,7 @@
|
|||
"source": [
|
||||
"## GPU arvutused\n",
|
||||
"\n",
|
||||
"Sügavad närvivõrgud, nagu VGG-16 ja teised kaasaegsemad arhitektuurid, vajavad töötamiseks üsna palju arvutusvõimsust. Seetõttu on mõistlik kasutada GPU kiirendust, kui see on saadaval. Õnneks kiirendab Keras automaatselt arvutusi GPU-l, kui see on saadaval. Saame kontrollida, kas Tensorflow suudab GPU-d kasutada, kasutades järgmist koodi:\n"
|
||||
"Sügavad närvivõrgud, nagu VGG-16 ja teised moodsamad arhitektuurid, vajavad töötamiseks üsna palju arvutusvõimsust. Mõistlik on kasutada GPU kiirendust, kui see on saadaval. Õnneks kiirendab Keras automaatselt arvutusi GPU-l, kui see on saadaval. Saame kontrollida, kas Tensorflow suudab GPU-d kasutada, järgmise koodiga:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -626,9 +636,10 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## VGG funktsioonide ekstraheerimine\n",
|
||||
"\n",
|
||||
"Kui soovime kasutada VGG-16 mudelit, et oma piltidest funktsioone välja võtta, vajame mudelit ilma lõplike klassifitseerimiskihtideta. VGG-16 mudeli saab ilma ülemiste kihtideta installeerida, kasutades järgmist koodi:\n"
|
||||
"## VGG omaduste eraldamine\n",
|
||||
"\n",
|
||||
"Kui soovime kasutada VGG-16, et eraldada omadusi oma piltidelt, vajame mudelit ilma lõplike klassifikatsioonikihtideta. Saame VGG-16 mudeli ilma ülemiste kihtideta luua järgmise koodiga:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -680,9 +691,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Funktsiooni tensori mõõtmed on 7x7x512, kuid selle visualiseerimiseks pidime selle ümber kujundama 2D-vormingusse.\n",
|
||||
"Funktsioonistensori dimensioon on 7x7x512, kuid selle visualiseerimiseks pidime selle ümber vormindama 2D kujule.\n",
|
||||
"\n",
|
||||
"Nüüd proovime vaadata, kas neid funktsioone saab kasutada piltide klassifitseerimiseks. Võtame käsitsi osa pilte (meie puhul 50 minibatchi) ja arvutame nende funktsioonivektorid ette. Selleks saame kasutada Tensorflow **dataset** API-d. `map` funktsioon võtab andmekogu ja rakendab sellele antud lambda-funktsiooni, et seda muuta. Kasutame seda mehhanismi uute andmekogude, `ds_features_train` ja `ds_features_test`, loomiseks, mis sisaldavad VGG-ga eraldatud funktsioone originaalpiltide asemel.\n"
|
||||
"Proovime nüüd näha, kas neid omadusi saab kasutada piltide klassifitseerimiseks. Võtame käsitsi mõned pildi osad (50 minibaiti meie puhul) ja arvutame nende omadusvektorid eelnevalt välja. Selleks saame kasutada Tensorflow **dataset** API-d. `map` funktsioon võtab andmekogu ja rakendab sellele antud lambda-funktsiooni, et seda muuta. Kasutame seda mehhanismi uute andmekogude konstrueerimiseks, `ds_features_train` ja `ds_features_test`, mis sisaldavad VGG-st välja võetud omadusi originaalpiltide asemel.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -712,9 +723,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Kasutame konstruktsiooni `.take(50)`, et piirata andmestiku suurust ja kiirendada meie demonstratsiooni. Loomulikult võite seda katset teha kogu andmestikuga.\n",
|
||||
"Kasutasime andmekogumi suuruse piiramiseks konstruktsiooni `.take(50)`, et kiirendada meie demonstratsiooni. Loomulikult saate seda eksperimenti teha ka kogu andmekogumiga.\n",
|
||||
"\n",
|
||||
"Nüüd, kui meil on andmestik koos välja tõmmatud tunnustega, saame treenida lihtsa tiheda klassifikaatori, et eristada kasse ja koeri. See võrk võtab tunnusvektori kujuga (7,7,512) ja annab ühe väljundi, mis vastab kas koerale või kassile. Kuna tegemist on binaarse klassifikatsiooniga, kasutame `sigmoid` aktivatsioonifunktsiooni ja `binary_crossentropy` kaotust.\n"
|
||||
"Nüüd, kui meil on omaduste ekstraheerimisega andmekogum, saame treenida lihtsa tiheda klassifikaatori, mis eristab kasse ja koeri. See võrk võtab omadusvektori kujuga (7,7,512) ja toodab ühe väljundi, mis vastab kas koerale või kodule. Kuna tegemist on kaheklassilise klassifikatsiooniga, kasutame `sigmoid` aktiveerimisfunktsiooni ja `binary_crossentropy` kaotust.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -743,13 +754,13 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Tulemus on suurepärane, suudame eristada kassi ja koera peaaegu 95% tõenäosusega! Kuid oleme seda lähenemist testinud ainult väikese osa piltide peal, kuna käsitsi tunnuste eraldamine võtab palju aega.\n",
|
||||
"Tulemus on suurepärane, me suudame kasside ja koerte vahel vahet teha ligi 95% tõenäosusega! Kuid me oleme seda lähenemist testinud ainult väikese osa kõigist piltidest, sest manuaalne omaduste eraldamine tundub võtvat palju aega.\n",
|
||||
"\n",
|
||||
"## Ülekandeõpe ühe VGG-võrgu abil\n",
|
||||
"## Ülekanneõpe, kasutades üht VGG võrku\n",
|
||||
"\n",
|
||||
"Samuti saame vältida tunnuste käsitsi eelnevat arvutamist, kasutades treeningu ajal tervet algset VGG-16 võrku, lisades tunnuste eraldaja meie võrgu esimeseks kihiks.\n",
|
||||
"Me võime ka vältida omaduste käsitsi eel-arvutamist, kasutades kogu algset VGG-16 võrku treeningu ajal, lisades omaduste ekstraheerija meie võrku esimese kihina.\n",
|
||||
"\n",
|
||||
"Keras arhitektuuri ilu seisneb selles, et ülalpool defineeritud VGG-16 mudelit saab kasutada ka kihina teises närvivõrgus! Meil tuleb lihtsalt ehitada võrk, millel on tihe klassifikaator selle peal, ja seejärel treenida kogu võrku tagasileviku meetodil.\n"
|
||||
"Keras arhitektuuri võlu seisneb selles, et ülalmääratletud VGG-16 mudelit saab samuti kasutada kihina teises närvivõrgus! Peame lihtsalt ehitama võrgu selle peale dense-klassifikaatoriga ja seejärel treenima kogu võrku tagasipropagatsiooniga.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -793,13 +804,13 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"See mudel näeb välja nagu otsast lõpuni klassifitseerimisvõrk, mis võtab sisendiks pildi ja tagastab klassi. Kuid keeruline osa on see, et me tahame, et VGG16 toimiks funktsioonide ekstraktorina, mitte ei treenitaks seda uuesti. Seetõttu peame **konvolutsioonilise funktsioonide ekstraktori kaalud külmutama**. Võrgu esimesele kihile pääseb ligi, kutsudes `model.layers[0]`, ja me peame lihtsalt seadistama `trainable` omaduse väärtuseks `False`.\n",
|
||||
"See mudel näeb välja nagu lõpust-lõpuni klassifitseerimisvõrk, mis võtab pildi ja tagastab klassi. Kuid keeruline on see, et me tahame, et VGG16 toimiks omaduste ekstraktorina, mitte uuesti treenitaks. Seetõttu peame **külmutama konvolutsioonilise omaduste ekstraktori kaalud**. Võime pääseda võrgu esimesele kihile, kutsudes `model.layers[0]`, ja peame lihtsalt seadma `trainable` omaduse väärtuseks `False`.\n",
|
||||
"\n",
|
||||
"> **Note**: Funktsioonide ekstraktori kaalude külmutamine on vajalik, sest muidu võib treenimata klassifitseerimiskihi kasutamine hävitada konvolutsioonilise ekstraktori algsed eeltreenitud kaalud.\n",
|
||||
"> **Märkus**: Omaduste ekstraktori kaalude külmutamine on vajalik, sest vastasel juhul võib treenimata klassifikaatori kiht hävitada originaalse eelõppinud konvolutsiooniekstraktori kaalud.\n",
|
||||
"\n",
|
||||
"Võite märgata, et kuigi meie võrgu parameetrite koguarv on umbes 15 miljonit, treenime me ainult 25 000 parameetrit. Kõik ülejäänud ülemise taseme konvolutsioonifiltrite parameetrid on eelnevalt treenitud. See on hea, sest saame väiksema arvu näidete abil peenhäälestada väiksema arvu parameetreid.\n",
|
||||
"Võite märgata, et kuigi meie võrgus on kokku umbes 15 miljonit parameetrit, treenime me vaid 25 tuhande parameetri kallal. Kõik ülejäänud ülemise taseme konvolutsioonifiltrite parameetrid on eelõpitud. See on hea, sest suudame väiksema hulga parameetritega ja väiksema hulga näidistega peenhäälestada.\n",
|
||||
"\n",
|
||||
"Nüüd treenime oma võrku ja vaatame, kui hea tulemuse suudame saavutada. Oodake üsna pikka töötamisaega ja ärge muretsege, kui täitmine tundub mõneks ajaks külmunud.\n"
|
||||
"Nüüd treenime oma võrku ja vaatame, kui hea tulemuseni me jõuame. Oodake üsna pikka jooksuaega ja ärge muretsege, kui täitmine mingil ajal näib külmunud olevat.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -824,11 +835,11 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Tundub, et oleme saavutanud üsna täpse kasside ja koerte klassifikaatori!\n",
|
||||
"Tundub, et meil on saadud üsna täpne kasside ja koerte klassifikaator! \n",
|
||||
"\n",
|
||||
"## Mudeli salvestamine ja laadimine\n",
|
||||
"\n",
|
||||
"Kui oleme mudeli treeninud, saame mudeli arhitektuuri ja treenitud kaalud salvestada faili, et neid tulevikus kasutada:\n"
|
||||
"Kui mudel on treenitud, saame mudeli arhitektuuri ja treenitud kaalud faili salvestada hilisemaks kasutamiseks:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -852,7 +863,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Seejärel saame mudeli igal ajal failist laadida. See võib olla kasulik juhul, kui järgmine katse mudeli hävitab - siis ei pea alustama täiesti algusest.\n"
|
||||
"Saame mudeli seejärel igal ajal failist laadida. See võib olla kasulik juhuks, kui järgmine katse mudeli ära rikub – siis ei pea alustama nullist.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -868,15 +879,15 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Peenhäälestamine ülekandeõppe abil\n",
|
||||
"## Üleõppe täpsustamine ülekandõppe abil\n",
|
||||
"\n",
|
||||
"Eelmises osas treenisime lõpliku klassifikaatori kihi, et klassifitseerida pilte meie enda andmestikus. Kuid me ei treeninud uuesti tunnuste ekstraktorit ja meie mudel tugines tunnustele, mille mudel oli õppinud ImageNet andmete põhjal. Kui teie objektid visuaalselt erinevad tavalistest ImageNet piltidest, ei pruugi see tunnuste kombinatsioon kõige paremini toimida. Seetõttu on mõistlik alustada ka konvolutsioonikihtide treenimist.\n",
|
||||
"Eelmises jaotises koolitasime lõpliku klassifitseerimiskihi oma andmekogus olevate kujutiste klassifitseerimiseks. Kuid me ei treeninud uuesti tunnuste eraldajat ja meie mudel tugines tunnustele, mida mudel oli õppinud ImageNeti andmetel. Kui sinu objektid erinevad visuaalselt tavapärastest ImageNeti piltidest, ei pruugi see tunnuste kombinatsioon kõige paremini töötada. Seega on mõistlik hakata koolitama ka konvolutsioonikihte.\n",
|
||||
"\n",
|
||||
"Selleks saame lahti lukustada konvolutsioonifiltri parameetrid, mille me varem lukustasime.\n",
|
||||
"Selleks saame vabastada konvolutsioonifiltri parameetrid, mille olime varem külmutanud. \n",
|
||||
"\n",
|
||||
"> **Märkus:** Oluline on, et esmalt lukustaksite parameetrid ja viiksite läbi mitu treeningtsüklit, et stabiliseerida kaalu klassifikatsioonikihis. Kui alustate kohe kogu võrgu treenimist lahti lukustatud parameetritega, võivad suured vead hävitada konvolutsioonikihtide eelnevalt treenitud kaalu.\n",
|
||||
"> **Märkus:** Oluline on esmalt külmutada parameetrid ja läbi viia mitu epohhi koolitust, et klassifitseerimiskihis olevad kaalukomponendid stabiliseeruksid. Kui kohe alustada kogu võrgu lõplikku koolitust lahtiste parameetritega, võivad suured vead rikkuda eelnevalt treenitud kaalud konvolutsioonikihtides.\n",
|
||||
"\n",
|
||||
"Meie konvolutsiooniline VGG-16 mudel asub esimeses kihis ja koosneb paljudest kihtidest. Saame selle struktuuri üle vaadata:\n"
|
||||
"Meie konvolutsiooniline VGG-16 mudel asub esimeses kihis ning koosneb paljudest alamkihtidest. Võime vaadata selle struktuuri: \n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -945,7 +956,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Me saame lahti lukustada kõik konvolutsioonibaasi kihid:\n"
|
||||
"Saame lahti külmutada kõik konvolutsioonilise aluse kihid:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -961,7 +972,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Kuid kõigi nende korraga lahtisulatamine ei ole parim idee. Me saame esmalt lahti sulatada vaid mõned viimased konvolutsioonikihid, kuna need sisaldavad kõrgema taseme mustreid, mis on meie piltide jaoks asjakohased. Näiteks alustuseks võime külmutada kõik kihid, välja arvatud viimased neli:\n"
|
||||
"Siiski ei ole kõige parem mõte neid kõiki korraga sulatada. Võime esmalt sulatada vaid mõned viimasest konvolutsioonikihist, sest need sisaldavad kõrgema taseme mustreid, mis on meie piltide jaoks olulised. Näiteks võime alustada kõigi kihtide külmutamist peale viimaste nelja: \n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1000,11 +1011,11 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Tähelepanuväärne on see, et treenitavate parameetrite arv suurenes märkimisväärselt, kuid see on siiski umbes 50% kõigist parameetritest.\n",
|
||||
"Märka, et treenitavate parameetrite arv kasvas oluliselt, kuid see on endiselt umbes 50% kõigist parameetritest.\n",
|
||||
"\n",
|
||||
"Pärast külmutamise tühistamist saame teha veel mõned treeningtsüklid (meie näites teeme ainult ühe). Samuti võite valida madalama õppemäära, et vähendada mõju eelnevalt treenitud kaaludele. Siiski, isegi madala õppemääraga, võib oodata, et täpsus treeningu alguses langeb, kuni lõpuks saavutatakse veidi kõrgem tase võrreldes fikseeritud kaalude juhtumiga.\n",
|
||||
"Pärast lahtilukustamist saame teha veel paar epohhi treeningut (meie näites teeme ainult ühe). Saad valida ka madalama õppemäära, et minimeerida mõju eelnevalt treenitud kaaludele. Kuid isegi madala õppemääraga võid oodata täpsuse langust treeningu alguses, kuni lõpuks jõuad veidi kõrgemale tasemele kui fikseeritud kaalude korral.\n",
|
||||
"\n",
|
||||
"> **Märkus:** See treening toimub palju aeglasemalt, kuna peame gradientide levitamiseks tagasi võrgu paljude kihtide kaudu!\n"
|
||||
"> **Märkus:** See treening toimub palju aeglasemalt, sest peame gradientide tagasi kandmise võrgu paljude kihtide kaudu!\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1028,18 +1039,18 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Meil on tõenäoliselt võimalik saavutada kõrgem treeningtäpsus, kuna kasutame võimsamat võrku, millel on rohkem parameetreid, kuid valideerimise täpsus ei pruugi nii palju suureneda.\n",
|
||||
"On tõenäoline, et saavutame kõrgema treeningu täpsuse, sest kasutame võimsamat võrku rohkemate parameetritega, kuid valideerimise täpsus ei pruugi nii palju suureneda.\n",
|
||||
"\n",
|
||||
"Võid vabalt võrgu mõned lisakihid lahti lukustada ja rohkem treenida, et näha, kas suudad saavutada kõrgemat täpsust!\n"
|
||||
"Julgesti sulge mõned kihid võrku ning treeni rohkem, et näha, kas suudad saavutada kõrgemat täpsust!\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Teised arvutinägemise mudelid\n",
|
||||
"## Muud arvutinägemise mudelid\n",
|
||||
"\n",
|
||||
"VGG-16 on üks lihtsamaid arvutinägemise arhitektuure. Keras pakub palju rohkem eelnevalt treenitud võrke. Kõige sagedamini kasutatavad neist on **ResNet** arhitektuurid, mille on välja töötanud Microsoft, ja **Inception**, mille autoriks on Google. Näiteks uurime kõige lihtsama ResNet-50 mudeli arhitektuuri (ResNet on mudelite perekond erineva sügavusega, võite katsetada ResNet-152-ga, kui soovite näha, milline näeb välja tõeliselt sügav mudel):\n"
|
||||
"VGG-16 on üks lihtsamaid arvutinägemise arhitektuure. Keras pakub palju rohkem eelõppinud võrgustikke. Nende seas on enim kasutatud **ResNet** arhitektuurid, mille on välja töötanud Microsoft, ja **Inception** Google'ilt. Näiteks uurime lihtsaimat ResNet-50 mudeli arhitektuuri (ResNet on mudelite perekond eri sügavusega, võid proovida ka ResNet-152, kui soovid näha, milline välja näeb tõeliselt sügav mudel):\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1441,29 +1452,29 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Nagu näha, sisaldab mudel samu tuttavaid ehitusplokke: konvolutsioonikihid, ühenduskihid ja lõplik tihe klassifikaator. Seda mudelit saab kasutada täpselt samamoodi nagu VGG-16 mudelit ülekandeõppe jaoks. Võid proovida katsetada ülaltoodud koodiga, kasutades erinevaid ResNet mudeleid baasina ja vaadata, kuidas täpsus muutub.\n",
|
||||
"Nagu näete, sisaldab mudel samu tuttavaid ehitusplokke: konvolutsioonikiht, virnastuskiht ja lõplik tihe klassifikaator. Seda mudelit saab kasutada täpselt samamoodi nagu oleme kasutanud VGG-16 ülekandeõppes. Võite proovida ülaltoodud koodiga eksperimenteerida, kasutades erinevaid ResNet-mudeleid baas- või algmudelina, ja vaadata, kuidas täpsus muutub.\n",
|
||||
"\n",
|
||||
"## Partii normaliseerimine\n",
|
||||
"## Partiisisene normaliseerimine\n",
|
||||
"\n",
|
||||
"See võrk sisaldab veel üht tüüpi kihti: **Partii normaliseerimine**. Partii normaliseerimise idee seisneb selles, et väärtused, mis liiguvad läbi närvivõrgu, tuuakse õigesse vahemikku. Tavaliselt töötavad närvivõrgud kõige paremini, kui kõik väärtused on vahemikus [-1,1] või [0,1], mistõttu me skaleerime/normaliseerime oma sisendandmed vastavalt. Kuid sügava võrgu treenimise ajal võib juhtuda, et väärtused lähevad sellest vahemikust oluliselt välja, mis muudab treenimise problemaatiliseks. Partii normaliseerimise kiht arvutab praeguse minibatch'i kõigi väärtuste keskmise ja standardhälbe ning kasutab neid signaali normaliseerimiseks enne selle edastamist närvivõrgu kihile. See parandab oluliselt sügavate võrkude stabiilsust.\n"
|
||||
"Selles võrgus on veel üks kihtide tüüp: **partiisisene normaliseerimine**. Partiisisese normaliseerimise idee on tuua väärtused, mis voolavad läbi närvivõrgu, õigesse vahemikku. Tavaliselt toimivad närvivõrgud kõige paremini, kui kõik väärtused jäävad vahemikku [-1,1] või [0,1], ja sellepärast skaleerime/normalizeerime oma sisendi andmed vastavalt. Siiski võib sügava võrgu treenimisel juhtuda, et väärtused satuvad sellest vahemikust oluliselt välja, mis muudab treenimise probleemseks. Partiisisene normaliseerimise kiht arvutab kõigi jooksva minipartiisi väärtuste keskmise ja standardhälbe ning kasutab neid signaali normaliseerimiseks enne närvivõrgu kihi läbimist. See parandab oluliselt sügavate võrkude stabiilsust.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Peamine mõte\n",
|
||||
"## Kokkuvõte\n",
|
||||
"\n",
|
||||
"Kasutades ülekandeõpet, suutsime kiiresti kokku panna klassifikaatori meie kohandatud objektide klassifitseerimise ülesande jaoks ja saavutada kõrge täpsuse. Kuid see näide polnud täiesti õiglane, sest algne VGG-16 võrk oli eelnevalt treenitud kasside ja koerte tuvastamiseks, mistõttu kasutasime lihtsalt enamikku mustritest, mis võrgus juba olemas olid. Võite oodata madalamat täpsust eksootilisemate ja spetsiifilisemate objektide puhul, nagu tootmisliini detailid tehases või erinevad puulehed.\n",
|
||||
"Kasutades siirdõpetust, suutsime kiiresti kokku panna klassifikaatori meie kohandatud objektide klassifitseerimise ülesande jaoks ja saavutada kõrge täpsus. Kuid see näide ei olnud täiesti õiglane, kuna originaalset VGG-16 võrku oli eelnevalt koolitatud kasside ja koerte tundmaõppimiseks ning seetõttu kasutasime lihtsalt uuesti enamust mustritest, mis olid võrgus juba olemas. Võite oodata madalamat täpsust eksootilisemate domeenipõhiste objektide puhul, näiteks tehase tootmisliini detailide või erinevate puulehtede tuvastamisel.\n",
|
||||
"\n",
|
||||
"Nagu näha, vajavad keerukamad ülesanded, mida me praegu lahendame, suuremat arvutusvõimsust ja neid ei saa lihtsalt lahendada protsessoril. Järgmises osas proovime kasutada kergemat rakendust, et treenida sama mudelit madalamate arvutusressurssidega, mis toob kaasa vaid veidi madalama täpsuse.\n"
|
||||
"Näete, et keerukamad ülesanded, mida me nüüd lahendame, vajavad suuremat arvutusvõimsust ning neid ei saa lihtsalt CPU-l lahendada. Järgmises osas proovime kasutada kergemat teostust sama mudeli koolitamiseks väiksemate arvutusressurssidega, mis toob kaasa vaid veidi madalama täpsuse.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**Lahtiütlus**: \nSee dokument on tõlgitud, kasutades AI tõlketeenust [Co-op Translator](https://github.com/Azure/co-op-translator). Kuigi püüame tagada täpsust, palun arvestage, et automaatsed tõlked võivad sisaldada vigu või ebatäpsusi. Algne dokument selle algkeeles tuleks lugeda autoriteetseks allikaks. Olulise teabe puhul on soovitatav kasutada professionaalset inimtõlget. Me ei vastuta selle tõlke kasutamisest tulenevate arusaamatuste või valede tõlgenduste eest.\n"
|
||||
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**Lahtiütlus**:\nSee dokument on tõlgitud kasutades AI tõlketeenust [Co-op Translator](https://github.com/Azure/co-op-translator). Kuigi me püüdleme täpsuse poole, palun pange tähele, et automatiseeritud tõlgetes võib esineda vigu või ebatäpsusi. Originaaldokument selle emakeeles tuleks pidada autoriteetseks allikaks. Olulise teabe puhul soovitatakse kasutada professionaalset inimtõlget. Me ei vastuta selle tõlkega seotud eksimustest või valesti mõistmistest.\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-10-11T12:02:09+00:00",
|
||||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb",
|
||||
"language_code": "et"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
|
|
|||
|
|
@ -1,51 +1,51 @@
|
|||
# Loodusliku keele töötlemine
|
||||
# Loomuliku Keele Töötlemine
|
||||
|
||||

|
||||

|
||||
|
||||
Selles osas keskendume **loodusliku keele töötlemise (NLP)** ülesannete lahendamisele, kasutades tehisnärvivõrke. On palju NLP probleeme, mida soovime, et arvutid suudaksid lahendada:
|
||||
Selles peatükis keskendume närvivõrkude kasutamisele loomuliku keele töötlemisega seotud ülesannete lahendamisel. On palju NLP probleeme, mida tahame, et arvutid oskaksid lahendada:
|
||||
|
||||
* **Teksti klassifitseerimine** on tüüpiline klassifitseerimisülesanne, mis puudutab tekstijadasid. Näideteks on e-kirjade klassifitseerimine rämpspostiks või mitte-rämpspostiks, või artiklite kategoriseerimine spordi, äri, poliitika jne valdkondadesse. Samuti, kui arendame vestlusroboteid, peame sageli mõistma, mida kasutaja tahtis öelda – sel juhul tegeleme **intentsioonide klassifitseerimisega**. Intentsioonide klassifitseerimisel tuleb sageli toime tulla paljude kategooriatega.
|
||||
* **Sentimendi analüüs** on tüüpiline regressiooniülesanne, kus peame omistama lausele numbri (sentimendi), mis vastab sellele, kui positiivne/negatiivne lause tähendus on. Sentimendi analüüsi arenenum versioon on **aspektipõhine sentimendi analüüs** (ABSA), kus me ei omista sentimenti kogu lausele, vaid selle erinevatele osadele (aspektidele), nt. *Selles restoranis meeldis mulle köök, kuid atmosfäär oli kohutav*.
|
||||
* **Nimega entiteetide tuvastamine** (NER) viitab probleemile, kus tekstist tuleb välja võtta teatud entiteedid. Näiteks peame mõistma, et fraasis *Ma pean homme Pariisi lendama* viitab sõna *homme* KUUPÄEVALE ja *Pariis* ASUKOHALE.
|
||||
* **Märksõnade tuvastamine** on sarnane NER-ile, kuid siin tuleb automaatselt välja võtta lause tähenduse seisukohalt olulised sõnad, ilma et oleks eelnevalt treenitud konkreetsete entiteeditüüpide jaoks.
|
||||
* **Teksti klasterdamine** võib olla kasulik, kui soovime grupeerida sarnaseid lauseid, näiteks tehnilise toe vestlustes sarnaseid päringuid.
|
||||
* **Küsimustele vastamine** viitab mudeli võimele vastata konkreetsele küsimusele. Mudel saab sisendiks tekstilõigu ja küsimuse ning peab leidma tekstist koha, kus küsimuse vastus asub (või mõnikord genereerima vastuse teksti).
|
||||
* **Teksti genereerimine** on mudeli võime luua uut teksti. Seda võib pidada klassifitseerimisülesandeks, mis ennustab järgmist tähte/sõna, lähtudes mingist *teksti vihjest*. Arenenud teksti genereerimise mudelid, nagu GPT-3, suudavad lahendada ka teisi NLP ülesandeid, kasutades tehnikat, mida nimetatakse [vihje programmeerimiseks](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) või [vihje inseneriks](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29).
|
||||
* **Teksti kokkuvõtete tegemine** on tehnika, kus soovime, et arvuti "loeks" pikka teksti ja võtaks selle kokku mõne lausega.
|
||||
* **Masintõlge** võib olla vaadeldav kui teksti mõistmise kombinatsioon ühes keeles ja teksti genereerimine teises keeles.
|
||||
* **Teksti klassifitseerimine** on tüüpiline tekstijadade klassifitseerimise probleem. Näiteks e-kirjade klassifitseerimine rämpspostiks või mitte-rämpspostiks, või artiklite kategooriateks jaotamine nagu sport, äri, poliitika jne. Samuti, chatbotide arendamisel tuleb sageli mõista, mida kasutaja tahtis öelda — sel juhul tegeleme **intentsiooni klassifitseerimisega**. Sageli tuleb intentsiooni klassifitseerimisel tegeleda paljude kategooriatega.
|
||||
* **Sentimendi analüüs** on tüüpiline regressioonülesanne, kus tuleb määrata arvuline väärtus (sentiment), mis vastab lause positiivsusele või negatiivsusele. Täiustatud sentimentide analüüsi versioon on **aspektipõhine sentimentide analüüs** (ABSA), kus sentiment määratakse mitte kogu lausele, vaid selle erinevatele osadele (aspektidele), nt *Selles restoranis meeldis mulle köök, aga õhkkond oli kohutav*.
|
||||
* **Nimetatud üksuste tuvastamine** (NER) tähendab teatud üksuste eraldamist tekstist. Näiteks tuleb mõista, et fraasis *Ma pean homme Pariisi lendama* viitab sõna *homme* KUUPÄEVALE ja *Pariis* on ASUKOHT.
|
||||
* **Märksõnade eraldamine** on sarnane NER-ile, kuid tuleb automaatselt eraldada lause tähenduse jaoks olulisi sõnu, ilma konkreetsete üksuste tüüpide eelneva treenimiseta.
|
||||
* **Tekstiklusterdamine** võib olla kasulik, kui soovime grupeerida sarnaseid lauseid, näiteks sarnaseid päringuid tehnilise toe vestlustes.
|
||||
* **Küsimustele vastamine** tähendab mudeli võimet vastata konkreetsele küsimusele. Mudel saab sisendiks tekstilõigu ja küsimuse ning peab leidma tekstist koha, kus on vastus (või mõnikord genereerima vastusteksti).
|
||||
* **Teksti genereerimine** tähendab mudeli võimet luua uut teksti. Seda võib pidada klassifitseerimisülesandeks, mis ennustab järgmise tähe/sõna mingi *teksti vihje* põhjal. Täiustatud teksti genereerimise mudelid, nagu GPT-3, suudavad lahendada ka muid NLP ülesandeid, näiteks klassifitseerimist kasutades tehnikaid, mida nimetatakse [vihjete programmeerimiseks](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) või [vihjete inseneriks](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29).
|
||||
* **Teksti kokkuvõtlemine** on tehnika, kus tahame, et arvuti "loeks" pika teksti ja täidaks selle mõne lausega.
|
||||
* **Masintõlge** võib käsitleda kui ühe keele teksti mõistmist ja teise keele teksti genereerimist.
|
||||
|
||||
Alguses lahendati enamik NLP ülesandeid traditsiooniliste meetoditega, nagu grammatikad. Näiteks masintõlkes kasutati parsereid, et muuta algne lause süntaksipuuks, seejärel eraldati kõrgema taseme semantilised struktuurid, et esitada lause tähendust, ja selle tähenduse ning sihtkeele grammatika põhjal genereeriti tulemus. Tänapäeval lahendatakse paljusid NLP ülesandeid tõhusamalt tehisnärvivõrkude abil.
|
||||
Esialgu lahendati enamik NLP ülesandeid traditsiooniliste meetoditega, nagu grammatikaanalüüs. Näiteks masintõlkes kasutati parserit, mis teisendas alglaused süntaksipuu kujule, seejärel ekstraheeriti kõrgema taseme semantilisi struktuure, mis esindasid lause tähendust ning selle tähenduse ja sihtkeele grammatikapõhjal genereeriti tulemus. Tänapäeval lahendatakse paljusid NLP ülesandeid efektiivsemalt närvivõrkude abil.
|
||||
|
||||
> Paljud klassikalised NLP meetodid on rakendatud [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org) Python'i raamatukogus. Veebis on saadaval suurepärane [NLTK raamat](https://www.nltk.org/book/), mis käsitleb, kuidas erinevaid NLP ülesandeid saab lahendada NLTK abil.
|
||||
> Paljude klassikaliste NLP meetodite teostuseks on saadaval Python teek [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org). Veebis on saadaval suurepärane [NLTK raamat](https://www.nltk.org/book/), mis katab seda, kuidas erinevaid NLP ülesandeid NLTK abil lahendada.
|
||||
|
||||
Meie kursusel keskendume peamiselt tehisnärvivõrkude kasutamisele NLP jaoks ning kasutame NLTK-d vajadusel.
|
||||
Meie kursusel keskendume peamiselt närvivõrkudele NLP jaoks ning kasutame vajadusel NLTK-d.
|
||||
|
||||
Oleme juba õppinud tehisnärvivõrkude kasutamist tabelandmete ja piltidega töötamiseks. Peamine erinevus nende andmetüüpide ja teksti vahel on see, et tekst on muutuva pikkusega jada, samas kui piltide puhul on sisendi suurus ette teada. Kuigi konvolutsioonivõrgud suudavad sisendandmetest mustreid välja tuua, on mustrid tekstis keerukamad. Näiteks võib eitus olla subjektist eraldatud suvalise arvu sõnadega (nt. *Mulle ei meeldi apelsinid* vs. *Mulle ei meeldi need suured värvilised maitsvad apelsinid*), ja seda tuleks siiski tõlgendada ühe mustrina. Seega, keele töötlemiseks peame kasutusele võtma uued tehisnärvivõrkude tüübid, nagu *rekurentvõrgud* ja *transformerid*.
|
||||
Oleme juba õppinud närvivõrkude kasutamist tabelandmete ja piltidega töötamiseks. Peamine erinevus nende andmetüüpide ja teksti vahel on selles, et tekst on muutuva pikkusega järjestus, samas kui piltide sisendi suurus on eelnevalt teada. Kuigi konvolutsioonivõrgud suudavad tuvastada mustreid sisendandmetes, on teksti mustrid palju keerulisemad. Näiteks võib eitav sõna olla subjekti suhtes eraldatud suvalise arvu sõnadega (nt *Ma ei meeldi apelsinid* vs. *Ma ei meeldi neile suurtele värvikatele maitsvatele apelsinidele*), kuid see tuleks tõlgendada kui üks muster. Seetõttu vajame keelt käsitledes uusi närvivõrkude tüüpe, nagu *rekurrentvõrgud* ja *transformerid*.
|
||||
|
||||
## Raamatukogude paigaldamine
|
||||
## Teekide installimine
|
||||
|
||||
Kui kasutate selle kursuse läbimiseks kohalikku Python'i installatsiooni, peate võib-olla paigaldama kõik vajalikud NLP raamatukogud, kasutades järgmisi käske:
|
||||
Kui kasutate kohaliku Pythoni installatsiooni selle kursuse käivitamiseks, võib vajalik olla kõigi NLP-ga seotud teekide paigaldamine järgmiste käskude abil:
|
||||
|
||||
**PyTorch'i jaoks**
|
||||
**PyTorch jaoks**
|
||||
```bash
|
||||
pip install -r requirements-torch.txt
|
||||
pip install -r requirements-pytorch.txt
|
||||
```
|
||||
**TensorFlow jaoks**
|
||||
```bash
|
||||
pip install -r requirements-tf.txt
|
||||
```
|
||||
|
||||
> NLP-d TensorFlow'ga saate proovida [Microsoft Learnis](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste)
|
||||
> Võite proovida NLP TensorFlowga aadressil [Microsoft Learn](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste)
|
||||
|
||||
## GPU hoiatus
|
||||
|
||||
Selles osas treenime mõnes näites üsna suuri mudeleid.
|
||||
* **Kasuta GPU-toega arvutit**: Soovitatav on käivitada oma märkmikud GPU-toega arvutis, et vähendada ooteaega suurte mudelitega töötamisel.
|
||||
* **GPU mälu piirangud**: GPU kasutamine võib viia olukordadeni, kus GPU mälu saab otsa, eriti suurte mudelite treenimisel.
|
||||
* **GPU mälu tarbimine**: GPU mälu tarbimine treenimise ajal sõltub mitmest tegurist, sealhulgas minibatch'i suurusest.
|
||||
* **Vähenda minibatch'i suurust**: Kui teil tekib GPU mälu probleeme, kaaluge minibatch'i suuruse vähendamist oma koodis võimaliku lahendusena.
|
||||
* **TensorFlow GPU mälu vabastamine**: TensorFlow vanemad versioonid ei pruugi GPU mälu õigesti vabastada, kui treenitakse mitut mudelit ühe Python'i kerneli sees. GPU mälu kasutamise tõhusaks haldamiseks saate seadistada TensorFlow'i nii, et see eraldaks GPU mälu ainult vajaduse korral.
|
||||
* **Koodi lisamine**: Et seadistada TensorFlow GPU mälu eraldama ainult vajaduse korral, lisage oma märkmikesse järgmine kood:
|
||||
Selles peatükis treenime mõnes näites päris suuri mudeleid.
|
||||
* **Kasuta GPU-ga arvutit**: Soovitatav on kasutada GPU-ga arvutit, et vähendada ootamisaegu suurte mudelitega töötades.
|
||||
* **GPU mälu piirangud**: GPU-ga töötamine võib kaasa tuua olukorra, kus GPU mälu ei jätku, eriti suurte mudelite treenimisel.
|
||||
* **GPU mälu tarbimine**: Treeningu ajal kasutatava GPU mälu maht sõltub mitmetest teguritest, sealhulgas minibatchi suurusest.
|
||||
* **Minibatchi suurust vähendada**: Kui tekivad GPU mäluprobleemid, kaaluge minibatchi suuruse vähendamist koodis.
|
||||
* **TensorFlow GPU mälu vabastamine**: Vanemad TensorFlow versioonid ei pruugi GPU mälu õigesti vabastada, kui treenitakse mitut mudelit ühe Pythoni tuumas. GPU mälu efektiivseks kasutamiseks saate seadistada TensorFlow nii, et GPU mälu eraldatakse ainult vajadusel.
|
||||
* **Koodi lisamine**: Selleks, et TensorFlow eraldaks GPU mälu kasvavalt ainult siis, kui on vaja, lisage oma märkmetesse järgmine kood:
|
||||
|
||||
```python
|
||||
physical_devices = tf.config.list_physical_devices('GPU')
|
||||
|
|
@ -53,19 +53,21 @@ if len(physical_devices)>0:
|
|||
tf.config.experimental.set_memory_growth(physical_devices[0], True)
|
||||
```
|
||||
|
||||
Kui olete huvitatud klassikalise masinõppe perspektiivist NLP õppimisest, külastage [seda õppetundide komplekti](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP)
|
||||
Kui soovite õppida NLP-d klassikalisest masinõppe vaatenurgast, vaadake [seda õppetükkide komplekti](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP)
|
||||
|
||||
## Selles osas
|
||||
Selles osas õpime:
|
||||
## Selles peatükis
|
||||
Selles peatükis õpime:
|
||||
|
||||
* [Teksti esitamist tensoritena](13-TextRep/README.md)
|
||||
* [Sõnaembeddingsid](14-Emdeddings/README.md)
|
||||
* [Keelemudelit](15-LanguageModeling/README.md)
|
||||
* [Rekurentseid närvivõrke](16-RNN/README.md)
|
||||
* [Generatiivseid võrke](17-GenerativeNetworks/README.md)
|
||||
* [Transformereid](18-Transformers/README.md)
|
||||
* [Teksti esitamine tensoritena](13-TextRep/README.md)
|
||||
* [Sõnade embedid](14-Emdeddings/README.md)
|
||||
* [Keelemudelid](15-LanguageModeling/README.md)
|
||||
* [Rekursiivsed närvivõrgud](16-RNN/README.md)
|
||||
* [Generatiivvõrgud](17-GenerativeNetworks/README.md)
|
||||
* [Transformerid](18-Transformers/README.md)
|
||||
|
||||
---
|
||||
|
||||
**Lahtiütlus**:
|
||||
See dokument on tõlgitud AI tõlketeenuse [Co-op Translator](https://github.com/Azure/co-op-translator) abil. Kuigi püüame tagada täpsust, palume arvestada, et automaatsed tõlked võivad sisaldada vigu või ebatäpsusi. Algne dokument selle algses keeles tuleks pidada autoriteetseks allikaks. Olulise teabe puhul soovitame kasutada professionaalset inimtõlget. Me ei vastuta selle tõlke kasutamisest tulenevate arusaamatuste või valesti tõlgenduste eest.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**Lahtiütlus**:
|
||||
See dokument on tõlgitud kasutades AI tõlketeenust [Co-op Translator](https://github.com/Azure/co-op-translator). Kuigi me püüdleme täpsuse poole, palun pange tähele, et automatiseeritud tõlgetes võib esineda vigu või ebatäpsusi. Originaaldokument selle emakeeles tuleks pidada autoriteetseks allikaks. Olulise teabe puhul soovitatakse kasutada professionaalset inimtõlget. Me ei vastuta selle tõlkega seotud eksimustest või valesti mõistmistest.
|
||||
<!-- 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": "fi"
|
||||
},
|
||||
"CONTRIBUTING.md": {
|
||||
"original_hash": "c6fd7e781b67111a90abd166d0ce4aa0",
|
||||
"translation_date": "2026-07-08T15:53:04+00:00",
|
||||
"source_file": "CONTRIBUTING.md",
|
||||
"language_code": "fi"
|
||||
},
|
||||
"README.md": {
|
||||
"original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b",
|
||||
"translation_date": "2026-04-06T20:58:25+00:00",
|
||||
|
|
@ -17,6 +23,19 @@
|
|||
"source_file": "SECURITY.md",
|
||||
"language_code": "fi"
|
||||
},
|
||||
"__translation_failures__": {
|
||||
"lessons/sketchnotes/LICENSE.md": {
|
||||
"original_hash": "45ab63a2cd8f5faef6c9b150618837a4",
|
||||
"source_file": "lessons/sketchnotes/LICENSE.md",
|
||||
"language_code": "fi",
|
||||
"failure_date": "2026-07-08T15:45:58+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-28T20:13:19+00:00",
|
||||
|
|
@ -54,8 +73,8 @@
|
|||
"language_code": "fi"
|
||||
},
|
||||
"examples/README.md": {
|
||||
"original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7",
|
||||
"translation_date": "2025-10-03T11:31:51+00:00",
|
||||
"original_hash": "7883d52c2e2a221e0b07a7b112a149b9",
|
||||
"translation_date": "2026-07-08T15:39:57+00:00",
|
||||
"source_file": "examples/README.md",
|
||||
"language_code": "fi"
|
||||
},
|
||||
|
|
@ -66,8 +85,8 @@
|
|||
"language_code": "fi"
|
||||
},
|
||||
"lessons/0-course-setup/how-to-run.md": {
|
||||
"original_hash": "a4717bd9103b9f6cd84d534b83534689",
|
||||
"translation_date": "2026-01-16T02:59:25+00:00",
|
||||
"original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1",
|
||||
"translation_date": "2026-07-08T15:40:22+00:00",
|
||||
"source_file": "lessons/0-course-setup/how-to-run.md",
|
||||
"language_code": "fi"
|
||||
},
|
||||
|
|
@ -191,6 +210,12 @@
|
|||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md",
|
||||
"language_code": "fi"
|
||||
},
|
||||
"lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": {
|
||||
"original_hash": "99b816b6a4957ef4100cee4c4221dff9",
|
||||
"translation_date": "2026-07-08T15:31:24+00:00",
|
||||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb",
|
||||
"language_code": "fi"
|
||||
},
|
||||
"lessons/4-ComputerVision/08-TransferLearning/lab/README.md": {
|
||||
"original_hash": "7765935c35fcee69b9fe2d0cfd6963e2",
|
||||
"translation_date": "2025-08-28T19:29:15+00:00",
|
||||
|
|
@ -330,8 +355,8 @@
|
|||
"language_code": "fi"
|
||||
},
|
||||
"lessons/5-NLP/README.md": {
|
||||
"original_hash": "8ef02a9318257ea140ed3ed74442096d",
|
||||
"translation_date": "2025-08-28T19:56:47+00:00",
|
||||
"original_hash": "038df6f1a73e49f6430740da083bfd6d",
|
||||
"translation_date": "2026-07-08T15:41:00+00:00",
|
||||
"source_file": "lessons/5-NLP/README.md",
|
||||
"language_code": "fi"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -0,0 +1,29 @@
|
|||
# Osallistuminen AI-For-Beginners -projektiin
|
||||
|
||||
Kiitos kiinnostuksestasi osallistua AI-For-Beginners -projektiin! Otamme mielellämme vastaan käännöksiä, oppituntien korjauksia ja muotoiluvirheiden korjauksia.
|
||||
|
||||
## Microsoftin osallistujan lisenssisopimus (CLA)
|
||||
|
||||
Tämä projekti toivottaa tervetulleiksi panokset ja ehdotukset. Useimmat panokset vaativat, että hyväksyt osallistujan lisenssisopimuksen (CLA), jossa vahvistat, että sinulla on oikeus ja että myönnät meille oikeuden käyttää panostasi. Yksityiskohdat löytyvät osoitteesta [https://cla.microsoft.com](https://cla.microsoft.com).
|
||||
|
||||
Kun lähetät vetopyynnön, CLA-botti määrittää automaattisesti, tarvitseeko sinun toimittaa CLA ja merkitsee PR:n asianmukaisesti (esim. tunniste, kommentti). Noudata vain botin antamia ohjeita. Sinun tarvitsee tehdä tämä vain kerran kaikissa CLA:tamme käyttävissä arkistoissa.
|
||||
|
||||
## Kuinka osallistua
|
||||
|
||||
### 1. Kirjoitusvirheiden / koodivirheiden korjaaminen
|
||||
Jos huomaat kirjoitusvirheen tai bugin missään Jupyter-muistikirjassa tai oppitunnin markdown-tiedostossa:
|
||||
1. Haarauta arkisto.
|
||||
2. Korjaa kirjoitusvirhe tai rikkinäinen linkki.
|
||||
3. Lähetä vetopyyntö, jossa on selkeä korjauksen kuvaus.
|
||||
|
||||
### 2. Käännösten lähettäminen
|
||||
Otamme mielellämme vastaan oppituntien käännöksiä muille kielille! Laita käännökset hakemistoon `translations/` käyttäen olemassa olevia kansioiden nimiä (esimerkiksi `translations/es/`, `translations/pt-BR/`, `translations/zh-CN/`).
|
||||
|
||||
Lisätietoja löytyy tiedostosta [etc/CONTRIBUTING.md](etc/CONTRIBUTING.md).
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**Vastuuvapauslauseke**:
|
||||
Tämä asiakirja on käännetty käyttämällä tekoälypohjaista käännöspalvelua [Co-op Translator](https://github.com/Azure/co-op-translator). Vaikka pyrimme tarkkuuteen, otathan huomioon, että automaattiset käännökset saattavat sisältää virheitä tai epätarkkuuksia. Alkuperäinen asiakirja sen alkuperäiskielellä on virallinen lähde. Tärkeissä asioissa suositellaan ammattimaista ihmiskäännöstä. Emme ole vastuussa tämän käännöksen käytöstä aiheutuvista väärinymmärryksistä tai tulkinnoista.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -1,31 +1,31 @@
|
|||
# Aloittelijaystävällisiä AI-esimerkkejä
|
||||
# Aloittelijaystävällisiä tekoälyesimerkkejä
|
||||
|
||||
Tervetuloa! Tämä hakemisto sisältää yksinkertaisia, itsenäisiä esimerkkejä, jotka auttavat sinua pääsemään alkuun tekoälyn ja koneoppimisen parissa. Jokainen esimerkki on suunniteltu aloitteleville käyttäjille, ja niissä on yksityiskohtaiset kommentit sekä vaiheittaiset selitykset.
|
||||
Tervetuloa! Tämä hakemisto sisältää yksinkertaisia, itsenäisiä esimerkkejä, jotka auttavat sinua pääsemään alkuun tekoälyn ja koneoppimisen kanssa. Jokainen esimerkki on suunniteltu aloittelijaystävälliseksi yksityiskohtaisten kommenttien ja vaiheittaisten selitysten kera.
|
||||
|
||||
## 📚 Esimerkkien yleiskatsaus
|
||||
|
||||
| Esimerkki | Kuvaus | Vaikeustaso | Esitiedot |
|
||||
|-----------|--------|-------------|-----------|
|
||||
| [Hello AI World](../../../examples/01-hello-ai-world.py) | Ensimmäinen AI-ohjelmasi - yksinkertainen kuvioiden tunnistus | ⭐ Aloittelija | Pythonin perusteet |
|
||||
| [Simple Neural Network](../../../examples/02-simple-neural-network.py) | Rakenna neuroverkko alusta alkaen | ⭐⭐ Aloittelija+ | Python, perusmatematiikka |
|
||||
| [Image Classifier](./03-image-classifier.ipynb) | Luokittele kuvia valmiiksi koulutetulla mallilla | ⭐⭐ Aloittelija+ | Python, numpy |
|
||||
| [Text Sentiment](../../../examples/04-text-sentiment.py) | Analysoi tekstin sentimenttiä (positiivinen/negatiivinen) | ⭐⭐ Aloittelija+ | Python |
|
||||
| Esimerkki | Kuvaus | Vaikeustaso | Esivaatimukset |
|
||||
|---------|-------------|------------|---------------|
|
||||
| [Hello AI World](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/01-hello-ai-world.py) | Ensimmäinen tekoälyohjelmasi – yksinkertainen kuvioiden tunnistus | ⭐ Aloittelija | Pythonin perusteet |
|
||||
| [Simple Neural Network](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/02-simple-neural-network.py) | Rakennetaan neuroverkko alusta alkaen | ⭐⭐ Aloittelija+ | Python, perusmatematiikka |
|
||||
| [Image Classifier](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/03-image-classifier.ipynb) | Luokittele kuvia valmiilla mallilla | ⭐⭐ Aloittelija+ | Python, numpy |
|
||||
| [Text Sentiment](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/04-text-sentiment.py) | Analysoi tekstin tunne (positiivinen/negatiivinen) | ⭐⭐ Aloittelija+ | Python |
|
||||
|
||||
## 🚀 Aloittaminen
|
||||
## 🚀 Aloitus
|
||||
|
||||
### Esitiedot
|
||||
### Esivaatimukset
|
||||
|
||||
Varmista, että sinulla on Python asennettuna (suositeltu versio 3.8 tai uudempi). Asenna tarvittavat paketit:
|
||||
Varmista, että sinulla on Python asennettuna (3.8 tai uudempi suositeltu). Asenna vaaditut paketit:
|
||||
|
||||
```bash
|
||||
# For Python scripts
|
||||
# Python-skripteille
|
||||
pip install numpy
|
||||
|
||||
# For Jupyter notebooks (image classifier)
|
||||
# Jupyter-muistikirjoille (kuvaluokitin)
|
||||
pip install jupyter numpy pillow tensorflow
|
||||
```
|
||||
|
||||
Tai käytä pääopetussuunnitelman conda-ympäristöä:
|
||||
Tai käytä conda-ympäristöä pääopetussuunnitelmasta:
|
||||
|
||||
```bash
|
||||
conda env create --name ai4beg --file ../environment.yml
|
||||
|
|
@ -34,12 +34,12 @@ conda activate ai4beg
|
|||
|
||||
### Esimerkkien suorittaminen
|
||||
|
||||
**Python-skripteille (.py-tiedostot):**
|
||||
**Python-skriptit (.py tiedostot):**
|
||||
```bash
|
||||
python 01-hello-ai-world.py
|
||||
```
|
||||
|
||||
**Jupyter-notebookeille (.ipynb-tiedostot):**
|
||||
**Jupyter-muistikirjat (.ipynb tiedostot):**
|
||||
```bash
|
||||
jupyter notebook 03-image-classifier.ipynb
|
||||
```
|
||||
|
|
@ -48,38 +48,40 @@ jupyter notebook 03-image-classifier.ipynb
|
|||
|
||||
Suosittelemme seuraamaan esimerkkejä järjestyksessä:
|
||||
|
||||
1. **Aloita "Hello AI World" -esimerkillä** - Opettele kuvioiden tunnistuksen perusteet
|
||||
1. **Aloita "Hello AI World"** - Opettele kuvioiden tunnistuksen perusteet
|
||||
2. **Rakenna yksinkertainen neuroverkko** - Ymmärrä, miten neuroverkot toimivat
|
||||
3. **Kokeile kuvaluokittelijaa** - Näe tekoäly toiminnassa oikeiden kuvien kanssa
|
||||
4. **Analysoi tekstin sentimenttiä** - Tutustu luonnollisen kielen käsittelyyn
|
||||
3. **Kokeile kuvaluokitinta** - Näe tekoäly käytännössä oikeiden kuvien kanssa
|
||||
4. **Analysoi tekstin tunne** - Tutustu luonnollisen kielen käsittelyyn
|
||||
|
||||
## 💡 Vinkkejä aloittelijoille
|
||||
|
||||
- **Lue koodikommentit huolellisesti** - Ne selittävät, mitä kukin rivi tekee
|
||||
- **Kokeile!** - Muuta arvoja ja katso, mitä tapahtuu
|
||||
- **Älä huolehdi, jos et ymmärrä kaikkea** - Oppiminen vie aikaa
|
||||
- **Kysy kysymyksiä** - Käytä [Keskustelupalstaa](https://github.com/microsoft/AI-For-Beginners/discussions)
|
||||
- **Lue koodikommentit huolellisesti** – Ne selittävät, mitä kukin rivi tekee
|
||||
- **Kokeile eri asioita!** – Muuta arvoja ja katso, mitä tapahtuu
|
||||
- **Älä huoli, jos et ymmärrä kaikkea heti** – Oppiminen vie aikaa
|
||||
- **Esitä kysymyksiä** – Käytä [Keskustelualue](https://github.com/microsoft/AI-For-Beginners/discussions)
|
||||
|
||||
## 🔗 Seuraavat askeleet
|
||||
|
||||
Kun olet käynyt läpi nämä esimerkit, tutustu koko opetussuunnitelmaan:
|
||||
- [Johdatus tekoälyyn](../lessons/1-Intro/README.md)
|
||||
Kun olet suorittanut nämä esimerkit, tutustu koko opetussuunnitelmaan:
|
||||
- [Johdanto tekoälyyn](../lessons/1-Intro/README.md)
|
||||
- [Neuroverkot](../lessons/3-NeuralNetworks/README.md)
|
||||
- [Tietokonenäkö](../lessons/4-ComputerVision/README.md)
|
||||
- [Koneen näkö](../lessons/4-ComputerVision/README.md)
|
||||
- [Luonnollisen kielen käsittely](../lessons/5-NLP/README.md)
|
||||
|
||||
## 🤝 Osallistuminen
|
||||
|
||||
Ovatko nämä esimerkit hyödyllisiä? Auta meitä parantamaan niitä:
|
||||
Löysitkö näistä esimerkeistä apua? Auta meitä parantamaan niitä:
|
||||
- Ilmoita ongelmista tai ehdota parannuksia
|
||||
- Lisää lisää esimerkkejä aloittelijoille
|
||||
- Paranna dokumentaatiota ja kommentteja
|
||||
|
||||
---
|
||||
|
||||
*Muista: Jokainen asiantuntija on joskus ollut aloittelija. Mukavia oppimishetkiä! 🎓*
|
||||
*Muista: Jokainen asiantuntija on joskus ollut aloittelija. Iloista oppimista! 🎓*
|
||||
|
||||
---
|
||||
|
||||
**Vastuuvapauslauseke**:
|
||||
Tämä asiakirja on käännetty käyttämällä tekoälypohjaista käännöspalvelua [Co-op Translator](https://github.com/Azure/co-op-translator). Vaikka pyrimme tarkkuuteen, huomioithan, että automaattiset käännökset voivat sisältää virheitä tai epätarkkuuksia. Alkuperäistä asiakirjaa sen alkuperäisellä kielellä tulisi pitää ensisijaisena lähteenä. Kriittisen tiedon osalta suositellaan ammattimaista ihmiskäännöstä. Emme ole vastuussa väärinkäsityksistä tai virhetulkinnoista, jotka johtuvat tämän käännöksen käytöstä.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**Vastuuvapauslauseke**:
|
||||
Tämä asiakirja on käännetty käyttämällä tekoälypohjaista käännöspalvelua [Co-op Translator](https://github.com/Azure/co-op-translator). Vaikka pyrimme tarkkuuteen, otathan huomioon, että automaattiset käännökset saattavat sisältää virheitä tai epätarkkuuksia. Alkuperäinen asiakirja sen alkuperäiskielellä on virallinen lähde. Tärkeissä asioissa suositellaan ammattimaista ihmiskäännöstä. Emme ole vastuussa tämän käännöksen käytöstä aiheutuvista väärinymmärryksistä tai tulkinnoista.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -1,12 +1,12 @@
|
|||
# Kuinka Suorittaa Koodi
|
||||
# Kuinka ajaa koodi
|
||||
|
||||
Tämä opetussuunnitelma sisältää paljon suoritettavia esimerkkejä ja labroja, joita haluat todennäköisesti suorittaa. Tätä varten sinun on pystyttävä suorittamaan Python-koodia Jupyter-muistikirjoissa, jotka kuuluvat osana tätä opetussuunnitelmaa. Koodin suorittamiseen on useita vaihtoehtoja:
|
||||
Tämä opetussuunnitelma sisältää paljon suoritettavia esimerkkejä ja labroja, joita haluat varmasti ajaa. Tätä varten sinun täytyy pystyä suorittamaan Python-koodia Jupyter-muistikirjoissa, joita tarjotaan osana tätä opetussuunnitelmaa. Sinulla on useita vaihtoehtoja koodin ajamiseen:
|
||||
|
||||
## Suorita paikallisesti tietokoneellasi
|
||||
## Aja paikallisesti tietokoneellasi
|
||||
|
||||
Jotta voit suorittaa koodin paikallisesti tietokoneellasi, tarvitset Python-asennuksen. Yksi suositus on asentaa **[miniconda](https://conda.io/en/latest/miniconda.html)** – se on melko kevyt asennus, joka tukee `conda`-paketinhallintaa erilaisille Pythonin **virtuaaliympäristöille**.
|
||||
Jotta voit ajaa koodin paikallisesti tietokoneellasi, tarvitset Python-asennuksen. Suosittelemme asentamaan **[minicondan](https://conda.io/en/latest/miniconda.html)** – se on melko kevyt asennus, joka tukee `conda`-paketinhallintaa eri Python **virtuaaliympäristöille**.
|
||||
|
||||
Kun olet asentanut minicondan, kloonaa varasto ja luo virtuaaliympäristö tätä kurssia varten:
|
||||
Kun olet asentanut minicondan, kloonaa repositorio ja luo virtuaaliympäristö tätä kurssia varten:
|
||||
|
||||
```bash
|
||||
git clone http://github.com/microsoft/ai-for-beginners
|
||||
|
|
@ -15,19 +15,19 @@ conda env create --name ai4beg --file .devcontainer/environment.yml
|
|||
conda activate ai4beg
|
||||
```
|
||||
|
||||
### Visual Studio Code ja Python-laajennus
|
||||
### Visual Studio Coden käyttäminen Python-laajennuksella
|
||||
|
||||
Tätä opetussuunnitelmaa on parasta käyttää avaamalla se [Visual Studio Codessa](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) yhdessä [Python-laajennuksen](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste) kanssa.
|
||||
Tämä opetussuunnitelma on parhaiten käytettävissä avaamalla se [Visual Studio Codessa](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) yhdessä [Python-laajennuksen](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste) kanssa.
|
||||
|
||||
> **Huomautus**: Kun kloonaat ja avaat hakemiston VS Codessa, se ehdottaa automaattisesti Python-laajennusten asentamista. Sinun on myös asennettava miniconda kuten yllä on kuvattu.
|
||||
> **Huom:** Kun kloonaat ja avaat kansion VS Codessa, se ehdottaa automaattisesti Python-laajennusten asentamista. Sinun täytyy myös asentaa miniconda yllä kuvatulla tavalla.
|
||||
|
||||
> **Huomautus**: Jos VS Code ehdottaa varaston uudelleenavaamista säiliössä, sinun tulisi kieltäytyä tästä käyttääksesi paikallista Python-asennusta.
|
||||
> **Huom:** Jos VS Code ehdottaa kansion uudelleenavaamista kontissa, sinun kannattaa kieltäytyä tästä käyttääksesi paikallista Python-asennusta.
|
||||
|
||||
### Jupyterin käyttäminen selaimessa
|
||||
### Jupyteriä selaimessa käyttäen
|
||||
|
||||
Voit käyttää Jupyter-ympäristöä myös selaimella omalla tietokoneellasi. Sekä perinteinen Jupyter että JupyterHub tarjoavat kätevän kehitysympäristön automaattisen täydennyksen, koodin korostuksen jne. kanssa.
|
||||
Voit myös käyttää Jupyter-ympäristöä selaimessa omalla tietokoneellasi. Sekä klassinen Jupyter että JupyterHub tarjoavat kätevän kehitysympäristön automaattisen täydennyksen, koodin korostuksen yms. kanssa.
|
||||
|
||||
Käynnistääksesi Jupyterin paikallisesti, siirry kurssin hakemistoon ja suorita:
|
||||
Aloittaaksesi Jupyteriä paikallisesti, siirry kurssin kansioon ja suorita:
|
||||
|
||||
```bash
|
||||
jupyter notebook
|
||||
|
|
@ -36,36 +36,36 @@ tai
|
|||
```bash
|
||||
jupyterhub
|
||||
```
|
||||
Sen jälkeen voit siirtyä mihin tahansa `.ipynb`-tiedostoon, avata ne ja aloittaa työskentelyn.
|
||||
Sitten voit siirtyä mihin tahansa `.ipynb`-tiedostoista, avata ne ja aloittaa työn.
|
||||
|
||||
### Suorittaminen säiliössä
|
||||
### Ajaminen kontissa
|
||||
|
||||
Yksi vaihtoehto Python-asennukselle on suorittaa koodi säiliössä. Koska varastomme sisältää erityisen `.devcontainer`-kansion, joka ohjeistaa, miten säiliö rakennetaan tälle repositoriolle, VS Code tarjoaa mahdollisuuden avata koodin uudelleen säiliössä. Tämä vaatii Dockerin asennuksen ja on myös monimutkaisempi, joten suosittelemme tätä kokeneemmille käyttäjille.
|
||||
Vaihtoehtona Python-asennukselle voit ajaa koodin kontissa. Koska meidän repositoriomme sisältää erityisen `.devcontainer`-kansion, joka ohjeistaa konttien rakentamista tälle repositoriolle, VS Code tarjoaa mahdollisuuden avata koodin uudelleen kontissa. Tämä vaatii Dockeriin asennuksen ja on myös monimutkaisempi, joten suosittelemme tätä kokeneemmille käyttäjille.
|
||||
|
||||
## Suorittaminen pilvessä
|
||||
## Ajaminen pilvessä
|
||||
|
||||
Jos et halua asentaa Pythonia paikallisesti, mutta sinulla on pääsy joihinkin pilviresursseihin, hyvä vaihtoehto on suorittaa koodi pilvessä. Tämä onnistuu monella tavalla:
|
||||
Jos et halua asentaa Pythonia paikallisesti ja sinulla on pääsy joihinkin pilviresursseihin, hyvä vaihtoehto on ajaa koodi pilvessä. Tätä voit tehdä monella tavalla:
|
||||
|
||||
* Käyttämällä **[GitHub Codespaces](https://github.com/features/codespaces)** -ympäristöä, joka on sinulle luotu virtuaaliympäristö GitHubissa ja johon pääsee VS Code -selaimen kautta. Jos sinulla on pääsy Codespacesiin, voit vain klikata varastossa **Code**-painiketta, aloittaa codespacen ja päästä nopeasti alkuun.
|
||||
* Käyttämällä **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) tarjoaa ilmaisia pilvilaskentaresursseja ihmisille, jotka haluavat kokeilla jotain koodia GitHubissa. Etusivulla on painike, jolla voi avata repositorion Binderissä – tämä vie sinut nopeasti Binder-sivustolle, joka rakentaa taustalla säiliön ja käynnistää sinulle Jupyter-verkko-rajapinnan saumattomasti.
|
||||
* Käyttämällä **[GitHub Codespaces](https://github.com/features/codespaces)**, joka on sinulle GitHubissa luotu virtuaaliympäristö, jota pääset käyttämään VS Coden selainkäyttöliittymän kautta. Jos sinulla on pääsy Codespacesiin, voit vain klikata **Code**-painiketta repositoriossa, käynnistää codespacen ja päästä nopeasti töihin.
|
||||
* Käyttämällä **[Binderia](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) tarjoaa ilmaisia pilvessä toimivia laskentaresursseja, jotta voit testata koodia GitHubissa. Alkusivulla on painike, jolla voit avata repositorion Binderissä – tämä vie sinut nopeasti binder-sivustolle, joka rakentaa taustalle konttialustan ja käynnistää sinulle sujuvasti Jupyter-verkkokäyttöliittymän.
|
||||
|
||||
> **Huomautus**: Väärinkäytösten estämiseksi Binderillä on estetty pääsy tiettyihin verkkoresursseihin. Tämä saattaa estää osaa koodista toimimasta, jos koodi hakee malleja ja/tai aineistoja julkisesta internetistä. Saatat tarvita kiertoteitä. Lisäksi Binderin tarjoamat laskentaresurssit ovat melko perustasoa, joten koulutus on hidasta, erityisesti myöhemmissä, vaativammissa leikkauksissa.
|
||||
> **Huom:** väärinkäytösten estämiseksi Binderillä on estetty pääsy joihinkin verkkoresursseihin. Tämä saattaa estää joidenkin koodien toiminnan, jos ne hakevat malleja ja/tai aineistoja julkisesta internetistä. Sinun täytyy ehkä keksiä kiertotapoja. Lisäksi Binderin tarjoamat laskentaresurssit ovat varsin rajalliset, joten mallien koulutus on hidasta, varsinkin myöhemmissä ja monimutkaisemmissa tehtävissä.
|
||||
|
||||
## Suorittaminen pilvessä GPU:n kanssa
|
||||
## Ajaminen pilvessä GPU:lla
|
||||
|
||||
Jotkut myöhemmistä tämän opetussuunnitelman oppitunneista hyötyvät suuresti GPU-tuesta. Mallin harjoittelu voi olla muuten tuskallisen hidasta. Vaihtoehtoja on muutamia, erityisesti jos sinulla on pääsy pilveen joko [Azure for Studentsin](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) kautta tai oppilaitoksesi kautta:
|
||||
Jotkin tämän opetussuunnitelman myöhemmistä tehtävistä hyötyvät suuresti GPU-tuesta. Esimerkiksi mallin koulutus voi olla muuten tuskallisen hidasta. Sinulla on muutama vaihtoehto, etenkin jos sinulla on pääsy pilveen joko [Azure for Studentsin](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) kautta tai oppilaitoksesi kautta:
|
||||
|
||||
* Luo [Data Science Virtual Machine](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) ja yhdistä siihen Jupylerin kautta. Voit sitten kloonata repo suoraan koneelle ja aloittaa oppimisen. NC-sarjan virtuaalikoneissa on GPU-tuki.
|
||||
* Luo [Data Science Virtual Machine](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) ja yhdistä siihen Jupyteriä käyttäen. Voit kloonata repositorion suorilta koneelle ja aloittaa opiskelun. NC-sarjan VM:issä on GPU-tuki.
|
||||
|
||||
> **Huomautus**: Joihinkin tilauksiin, mukaan lukien Azure for Students, ei kuulu GPU-tukea oletuksena. Saatat joutua pyytämään lisä-GPU-ytimiä teknisen tuen pyynnöllä.
|
||||
> **Huom:** Jotkin tilaukset, mukaan lukien Azure for Students, eivät tarjoa GPU-tukea oletuksena. Saatat joutua pyytämään lisä-GPU-ytimiä teknisen tuen kautta.
|
||||
|
||||
* Luo [Azure Machine Learning Workspace](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) ja käytä siellä Notebook-ominaisuutta. [Tämä video](https://azure-for-academics.github.io/quickstart/azureml-papers/) näyttää, miten kloonataan repositorio Azure ML -muistikirjaan ja aloitetaan käyttö.
|
||||
* Luo [Azure Machine Learning Workspace](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) ja käytä siellä Notebook-ominaisuutta. [Tämä video](https://azure-for-academics.github.io/quickstart/azureml-papers/) näyttää, miten kloonataan repositorio Azure ML Notebooksiin ja aletaan sitä käyttää.
|
||||
|
||||
Voit myös käyttää Google Colabia, joka sisältää jonkin verran ilmaista GPU-tukea, ja ladata Jupyter-muistikirjat sinne suorittaaksesi ne yksi kerrallaan.
|
||||
Voit myös käyttää Google Colabia, joka tarjoaa jonkin verran ilmaista GPU-tukea, ja ladata sinne Jupyter-muistikirjat suoritettavaksi yksitellen.
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**Vastuuvapauslauseke**:
|
||||
Tämä asiakirja on käännetty tekoälypohjaisella käännöspalvelulla [Co-op Translator](https://github.com/Azure/co-op-translator). Pyrimme tarkkuuteen, mutta ota huomioon, että automaattiset käännökset saattavat sisältää virheitä tai epätarkkuuksia. Alkuperäistä asiakirjaa sen alkuperäiskielellä tulee pitää virallisena lähteenä. Tärkeissä asioissa suositellaan ammattilaisen tekemää käännöstä. Emme ole vastuussa tämän käännöksen käytöstä aiheutuvista väärinymmärryksistä tai tulkinnoista.
|
||||
Tämä asiakirja on käännetty käyttämällä tekoälypohjaista käännöspalvelua [Co-op Translator](https://github.com/Azure/co-op-translator). Vaikka pyrimme tarkkuuteen, otathan huomioon, että automaattiset käännökset saattavat sisältää virheitä tai epätarkkuuksia. Alkuperäinen asiakirja sen alkuperäiskielellä on virallinen lähde. Tärkeissä asioissa suositellaan ammattimaista ihmiskäännöstä. Emme ole vastuussa tämän käännöksen käytöstä aiheutuvista väärinymmärryksistä tai tulkinnoista.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -6,9 +6,9 @@
|
|||
"source": [
|
||||
"# Esikoulutetut mallit ja siirto-oppiminen\n",
|
||||
"\n",
|
||||
"CNN-mallien kouluttaminen voi viedä paljon aikaa, ja siihen tarvitaan runsaasti dataa. Suuri osa ajasta kuluu parhaiten toimivien matalan tason suodattimien oppimiseen, joita verkko käyttää kuvioiden tunnistamiseen kuvista. Luonnollinen kysymys herää - voimmeko käyttää yhdellä datasetillä koulutettua neuroverkkoa ja mukauttaa sen luokittelemaan erilaisia kuvia ilman täydellistä koulutusprosessia?\n",
|
||||
"CNN-mallien kouluttaminen voi viedä paljon aikaa, ja siihen tarvitaan paljon dataa. Suurin osa ajasta kuluu kuitenkin parhaiden matalan tason suodattimien oppimiseen, joita verkko käyttää kuvioiden erottamiseen kuvista. Nousee luonnollinen kysymys – voimmeko käyttää yhdellä aineistolla koulutettua neuroverkkoa ja sovittaa sen erilaisten kuvien luokitteluun ilman koko koulutusprosessia?\n",
|
||||
"\n",
|
||||
"Tätä lähestymistapaa kutsutaan **siirto-oppimiseksi**, koska siirrämme tietoa yhdestä neuroverkkon mallista toiseen. Siirto-oppimisessa aloitamme tyypillisesti esikoulutetulla mallilla, joka on koulutettu jollakin suurella kuvadatasetillä, kuten **ImageNet**. Nämä mallit osaavat jo hyvin tunnistaa erilaisia piirteitä yleisistä kuvista, ja monissa tapauksissa pelkkä luokittelijan rakentaminen näiden piirteiden päälle voi tuottaa hyviä tuloksia.\n"
|
||||
"Tätä lähestymistapaa kutsutaan **siirto-oppimiseksi**, koska me siirrämme tietoa yhdestä neuroverkkomallista toiseen. Siirto-oppimisessa aloitetaan tyypillisesti esikoulutetulla mallilla, joka on koulutettu jollakin suurella kuvia sisältävällä aineistolla, kuten **ImageNet**-aineistolla. Nämä mallit pystyvät jo erinomaisesti erottamaan erilaisia piirteitä geneerisistä kuvista, ja monissa tapauksissa pelkkä luokittelijan rakentaminen näiden erottamien piirteiden päälle voi tuottaa hyviä tuloksia.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -29,11 +29,11 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Kissat vs. Koirat -aineisto\n",
|
||||
"## Kissat vastaan koirat -aineisto\n",
|
||||
"\n",
|
||||
"Tässä osiossa ratkaistaan käytännön ongelma, jossa luokitellaan kissojen ja koirien kuvia. Tätä varten käytämme [Kaggle Cats vs. Dogs Dataset](https://www.kaggle.com/c/dogs-vs-cats), joka on ladattavissa myös [Microsoftilta](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n",
|
||||
"Tässä jaksossa ratkomme todellisen elämän ongelman, jossa luokittelemme kissan ja koiran kuvia. Tähän tarkoitukseen käytämme [Kaggle Kissat vastaan koirat -aineistoa](https://www.kaggle.com/c/dogs-vs-cats), jonka voi myös ladata [Microsoftin kautta](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n",
|
||||
"\n",
|
||||
"Ladataan tämä aineisto ja puretaan se `data`-hakemistoon (tämä prosessi voi kestää jonkin aikaa!):\n"
|
||||
"Ladataan tämä aineisto ja puretaan se `data`-hakemistoon (tämä saattaa kestää jonkin aikaa!):\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -64,7 +64,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Valitettavasti aineistossa on joitakin vioittuneita kuvatiedostoja. Meidän täytyy tehdä nopea siivous tarkistaaksemme vioittuneet tiedostot. Jotta emme sotkisi tätä opasta, siirsimme koodin aineiston tarkistamiseen moduuliin.\n"
|
||||
"Valitettavasti tietojoukossa on joitakin vioittuneita kuvafilejä. Meidän täytyy tehdä nopea siivous tarkistaaksemme vioittuneet tiedostot. Jotta emme sotkisi tätä opetusohjelmaa, siirsimme koodin tietojoukon tarkistamiseen moduuliin.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -335,11 +335,11 @@
|
|||
"source": [
|
||||
"## Datan lataaminen\n",
|
||||
"\n",
|
||||
"Aiemmissa esimerkeissä latasimme Kerasin sisäänrakennettuja dataset-kokonaisuuksia. Nyt käsittelemme omaa datasettiämme, joka täytyy ladata kuvakansiosta.\n",
|
||||
"Aiemmissa esimerkeissä lataimme Kerasin sisäisiä datasettejä. Nyt aiomme käsitellä omaa datasettiämme, joka pitää ladata kuvakansiosta.\n",
|
||||
"\n",
|
||||
"Todellisessa elämässä kuvadatasetit voivat olla melko suuria, eikä voi olettaa, että kaikki data mahtuisi muistiin. Siksi datasetit esitetään usein **generaattoreina**, jotka voivat palauttaa dataa pienissä erissä, jotka sopivat koulutukseen.\n",
|
||||
"Todellisessa elämässä kuvadatasetit voivat olla melko suurikokoisia, eikä voi olettaa, että kaikki data mahtuu muistiin. Siksi datasetit esitetään usein **generaattoreina**, jotka voivat palauttaa dataa pieninä erinä, minibatcheina, sopivina koulutukseen.\n",
|
||||
"\n",
|
||||
"Kuvien luokittelua varten Keras sisältää erityisen funktion `image_dataset_from_directory`, joka voi ladata kuvia alikansioista, jotka vastaavat eri luokkia. Tämä funktio huolehtii myös kuvien skaalaamisesta, ja se voi jakaa datasetin myös koulutus- ja testiosiin:\n"
|
||||
"Kuvaluokittelun käsittelemiseksi Keras sisältää erityisen funktion `image_dataset_from_directory`, joka voi ladata kuvia alikansioista, jotka vastaavat eri luokkia. Tämä funktio huolehtii myös kuvien skaalaamisesta ja se voi jakaa datasetin opetus- ja testiosiin:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -383,9 +383,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"On tärkeää asettaa sama `seed`-arvo molemmille kutsuille, koska se vaikuttaa kuvien jakautumiseen harjoitus- ja testiaineistojen välillä.\n",
|
||||
"On tärkeää asettaa sama `seed`-arvo molemmille kutsuille, koska se vaikuttaa kuvien jakautumiseen opetus- ja testiaineistojen välillä.\n",
|
||||
"\n",
|
||||
"Dataset poimii automaattisesti luokkien nimet hakemistoista, ja voit käyttää niitä tarvittaessa kutsumalla:\n"
|
||||
"Dataset valitsee luokkien nimet automaattisesti hakemistoista, ja niihin voi halutessaan päästä käsiksi kutsumalla:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -412,7 +412,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Datasetit, jotka olemme hankkineet, voidaan siirtää suoraan `fit`-funktiolle mallin kouluttamiseksi. Ne sisältävät sekä vastaavat kuvat että tunnisteet, joita voidaan käydä läpi seuraavalla rakenteella:\n"
|
||||
"Kokoelmat, jotka olemme saaneet, voidaan välittömästi syöttää `fit`-funktioon mallin kouluttamiseksi. Ne sisältävät sekä vastaavat kuvat että tunnisteet, joita voidaan käydä läpi seuraavalla rakenteella:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -453,16 +453,16 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"> **Huom**: Kaikki datasetin kuvat ovat esitettyinä liukulukuina, joiden arvojen vaihteluväli on 0-255. Ennen kuin ne syötetään neuroverkkoon, meidän täytyy skaalata nämä arvot 0-1 välille. Kuvia piirrettäessä meidän täytyy joko tehdä sama tai muuntaa arvot `int`-tyyppisiksi (kuten teemme yllä olevassa koodissa), jotta voimme näyttää `matplotlib`ille, että haluamme piirtää alkuperäisen skaalaamattoman kuvan.\n"
|
||||
"> **Huom**: Kaikki datasetin kuvat on esitetty liukulukupiste-tensoreina arvoalueella 0-255. Ennen niiden syöttämistä neuroverkkoon, meidän täytyy skaalata nuo arvot alueelle 0-1. Kun piirrämme kuvia, meidän täytyy tehdä sama tai muuntaa arvot `int`-tyyppiin (kuten teemme yllä olevassa koodissa), jotta voimme näyttää `matplotlib`:lle, että haluamme piirtää alkuperäisen skaalaamattoman kuvan.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Esikoulutetut mallit\n",
|
||||
"## Ennakkokoulutetut mallit\n",
|
||||
"\n",
|
||||
"Moniin kuvien luokittelutehtäviin löytyy esikoulutettuja neuroverkkomalleja. Monet näistä malleista ovat saatavilla `keras.applications`-nimialueen sisällä, ja vielä enemmän malleja löytyy Internetistä. Katsotaan, kuinka yksinkertaisin VGG-16-malli voidaan ladata ja käyttää:\n"
|
||||
"Moniin kuvien luokittelutehtäviin löytyy ennakkokoulutettuja neuroverkkimalleja. Monet näistä malleista ovat saatavilla `keras.applications`-nimialueessa, ja vielä useampia malleja löytyy internetistä. Katsotaan, kuinka yksinkertaisin VGG-16-malli voidaan ladata ja ottaa käyttöön:\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,18 +520,17 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Tässä on muutamia tärkeitä asioita:\n",
|
||||
"\n",
|
||||
"* Ennen kuin syöte annetaan millekään valmiiksi koulutetulle verkolle, se täytyy esikäsitellä tietyllä tavalla. Tämä tehdään kutsumalla vastaavaa `preprocess_input`-funktiota, joka vastaanottaa joukon kuvia ja palauttaa niiden käsitellyn muodon. VGG-16:n tapauksessa kuvat normalisoidaan, ja jokaiselta kanavalta vähennetään ennalta määritelty keskiarvo. Tämä johtuu siitä, että VGG-16 on alun perin koulutettu käyttämällä tätä esikäsittelyä.\n",
|
||||
"* Neuroverkko sovelletaan syötejoukkoon, ja tuloksena saadaan joukko 1000-alkioisia tensoreita, jotka osoittavat kunkin luokan todennäköisyyden. Voimme löytää todennäköisimmän luokan numeron kutsumalla `argmax`-funktiota tälle tensorille.\n",
|
||||
"* Saatu tulos on [`ImageNet`-luokan numero](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Jotta tulos olisi ymmärrettävämpi, voimme käyttää myös `decode_predictions`-funktiota, joka palauttaa n parasta luokkaa yhdessä niiden nimien kanssa.\n"
|
||||
"Tässä on muutama tärkeä asia:\n",
|
||||
"* Ennen syötteen antamista mille tahansa esikoulutetulle verkolle, se on käsiteltävä tietyllä tavalla. Tämä tehdään kutsumalla vastaavaa `preprocess_input`-funktiota, joka saa erän kuvia ja palauttaa niiden käsitellyn muodon. VGG-16:n tapauksessa kuvat normalisoidaan ja kanaville lasketut ennalta määritetyt keskiarvot vähennetään niistä. Tämä johtuu siitä, että VGG-16 oli alun perin koulutettu tällä esikäsittelyllä.\n",
|
||||
"* Neuroverkkoa sovelletaan syöte-erään, ja tuloksena saadaan erä 1000-ulotteisia tensoreita, jotka näyttävät kunkin luokan todennäköisyyden. Todennäköisin luokka saadaan kutsumalla `argmax`-funktiota tälle tensorille.\n",
|
||||
"* Saadun tuloksen arvo on [`ImageNet`-luokan numero](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Jotta tästä tuloksesta saa merkityksen, voimme myös käyttää `decode_predictions`-funktiota, joka palauttaa parhaan n luokan nimet niiden kanssa.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Katsotaan myös VGG-16-verkon arkkitehtuuria:\n"
|
||||
"Katsotaanpa myös VGG-16-verkon arkkitehtuuria:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -598,9 +607,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## GPU-laskenta\n",
|
||||
"## GPU-laskennat\n",
|
||||
"\n",
|
||||
"Syvät neuroverkot, kuten VGG-16 ja muut modernimmat arkkitehtuurit, vaativat melko paljon laskentatehoa toimiakseen. On järkevää hyödyntää GPU-kiihdytystä, jos se on saatavilla. Onneksi Keras nopeuttaa automaattisesti laskentaa GPU:lla, jos sellainen on käytettävissä. Voimme tarkistaa, pystyykö Tensorflow käyttämään GPU:ta seuraavalla koodilla:\n"
|
||||
"Syvät neuroverkot, kuten VGG-16 ja muut modernimmat arkkitehtuurit, vaativat melko paljon laskentatehoa toimiakseen. On järkevää käyttää GPU-kiihdytystä, jos se on saatavilla. Onneksi Keras nopeuttaa automaattisesti laskentoja GPU:lla, jos se on käytettävissä. Voimme tarkistaa, pystyykö Tensorflow käyttämään GPU:ta seuraavalla koodilla:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -627,9 +636,10 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## VGG-piirteiden erottaminen\n",
|
||||
"\n",
|
||||
"Jos haluamme käyttää VGG-16-mallia kuvien piirteiden erottamiseen, tarvitsemme mallin ilman lopullisia luokittelukerroksia. Voimme luoda VGG-16-mallin ilman yläkerroksia käyttämällä tätä koodia:\n"
|
||||
"## VGG-ominaisuuksien poimiminen\n",
|
||||
"\n",
|
||||
"Jos haluamme käyttää VGG-16 -mallia piirteiden poimimiseen kuvistamme, tarvitsemme mallin ilman viimeisiä luokittelukerroksia. Voimme luoda VGG-16 -mallin ilman yläkerroksia seuraavalla koodilla:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -681,9 +691,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Ominaisuustensorin ulottuvuus on 7x7x512, mutta jotta voisimme visualisoida sen, meidän täytyi muuttaa sen muoto 2D-muotoon.\n",
|
||||
"Ominaisuustensorin ulottuvuus on 7x7x512, mutta jotta voisimme visualisoida sen, meidän piti muotoilla se uudelleen 2D-muotoon.\n",
|
||||
"\n",
|
||||
"Katsotaanpa nyt, voisiko näitä ominaisuuksia käyttää kuvien luokitteluun. Otetaan käsin jokin osa kuvista (tapauksessamme 50 minibatchia) ja esilasketaan niiden ominaisuusvektorit. Voimme käyttää Tensorflow'n **dataset**-rajapintaa tämän tekemiseen. `map`-funktio ottaa datasetin ja soveltaa siihen annettua lambda-funktiota muuntaakseen sen. Käytämme tätä mekanismia luodaksemme uudet datasetit, `ds_features_train` ja `ds_features_test`, jotka sisältävät VGG:n tuottamat ominaisuudet alkuperäisten kuvien sijaan.\n"
|
||||
"Nyt kokeillaan, voidaanko näitä ominaisuuksia käyttää kuvien luokitteluun. Otetaan manuaalisesti osa kuvista (meidän tapauksessamme 50 minibatchia) ja esilasketaan niiden ominaisuusvektorit. Voimme käyttää Tensorflow'n **dataset**-API:a tätä varten. `map`-funktio ottaa datasetin ja soveltaa annettua lambda-funktiota muuntaakseen sen. Käytämme tätä mekanismia rakentaaksemme uudet datasetit, `ds_features_train` ja `ds_features_test`, jotka sisältävät VGG:n poimimat ominaisuudet alkuperäisten kuvien sijaan.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -713,9 +723,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Käytimme konstruktiota `.take(50)` rajoittaaksemme aineiston kokoa, jotta demonstraatiomme olisi nopeampi. Voit tietenkin suorittaa tämän kokeen koko aineistolla.\n",
|
||||
"Käytimme rakennetta `.take(50)` rajoittaaksemme aineiston kokoa, jotta esittelymme nopeutuisi. Voit tietenkin suorittaa tämän kokeen koko aineistolla.\n",
|
||||
"\n",
|
||||
"Nyt kun meillä on ominaisuudet sisältävä aineisto, voimme kouluttaa yksinkertaisen tiheän luokittelijan erottamaan kissat ja koirat. Tämä verkko ottaa syötteenä ominaisuusvektorin, jonka muoto on (7,7,512), ja tuottaa yhden ulostulon, joka vastaa joko koiraa tai kissaa. Koska kyseessä on binääriluokittelu, käytämme `sigmoid`-aktivointifunktiota ja `binary_crossentropy`-tappiota.\n"
|
||||
"Nyt kun meillä on ominaisuudet eroteltu aineisto, voimme kouluttaa yksinkertaisen tiheän luokittelijan erottamaan kissat ja koirat. Tämä verkko ottaa syötteenä ominaisuusvektorin, jonka muoto on (7,7,512), ja tuottaa yhden ulostulon, joka vastaa joko koiraa tai kissaa. Koska kyseessä on binääriluokitus, käytämme `sigmoid` aktivointifunktiota ja `binary_crossentropy`-häviöfunktiota.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -744,13 +754,13 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Tulokset ovat erinomaisia, pystymme erottamaan kissan ja koiran lähes 95 % todennäköisyydellä! Olemme kuitenkin testanneet tätä lähestymistapaa vain osajoukolla kaikista kuvista, koska manuaalinen piirteiden erottelu vaikuttaa vievän paljon aikaa.\n",
|
||||
"Tulos on erinomainen, voimme erottaa kissan ja koiran lähes 95 % todennäköisyydellä! Olemme kuitenkin testanneet tätä lähestymistapaa vain osajoukolla kaikista kuvista, koska ominaisuuksien manuaalinen poiminta näyttää vievän paljon aikaa.\n",
|
||||
"\n",
|
||||
"## Siirto-oppiminen käyttäen yhtä VGG-verkkoa\n",
|
||||
"## Siirto-oppiminen käyttämällä yhtä VGG-verkkoa\n",
|
||||
"\n",
|
||||
"Voimme myös välttää piirteiden manuaalisen esilaskennan käyttämällä alkuperäistä VGG-16-verkkoa kokonaisuudessaan koulutuksen aikana lisäämällä piirteiden erottelijan verkkomme ensimmäiseksi kerrokseksi.\n",
|
||||
"Voimme myös välttää ominaisuuksien manuaalisen esilaskennan käyttämällä alkuperäistä VGG-16 -verkkoa kokonaisuudessaan koulutuksen aikana lisäämällä ominaisuuksien poimija verkkoomme ensimmäiseksi kerrokseksi.\n",
|
||||
"\n",
|
||||
"Keras-arkkitehtuurin hienous on siinä, että yllä määriteltyä VGG-16-mallia voidaan käyttää myös kerroksena toisessa neuroverkossa! Meidän tarvitsee vain rakentaa verkko, jossa on tiheä luokitin sen päällä, ja sitten kouluttaa koko verkko takaisinlevityksen avulla.\n"
|
||||
"Keras-arkkitehtuurin kauneus on siinä, että yllä määrittelemäämme VGG-16 -mallia voidaan käyttää myös kerroksena toisessa neuroverkossa! Meidän tarvitsee vain rakentaa verkko, jonka päälle on lisätty tiheä luokittelija, ja sitten kouluttaa koko verkko takaisinsyötöllä.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -794,13 +804,13 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Tämä malli näyttää olevan end-to-end-luokitusverkko, joka ottaa kuvan ja palauttaa luokan. Kuitenkin haastavaa tässä on se, että haluamme VGG16:n toimivan piirteenpoimijana eikä sitä tule uudelleenkouluttaa. Siksi meidän täytyy **lukita konvoluutiopiirteenpoimijan painot**. Voimme käyttää verkon ensimmäistä kerrosta kutsumalla `model.layers[0]`, ja meidän tarvitsee vain asettaa `trainable`-ominaisuus arvoon `False`.\n",
|
||||
"Tämä malli näyttää päästä päähän luokittelukoneistolta, joka ottaa kuvan ja palauttaa luokan. Kuitenkin hankala asia on se, että haluamme VGG16:n toimivan ominaisuuksien erottimena, emmekä halua sen uudelleenkouluttamista. Siksi meidän täytyy **jäädyttää konvoluutio-ominaisuuksien erotinkerroksen painot**. Pääsemme verkon ensimmäiseen kerrokseen kutsumalla `model.layers[0]`, ja meidän tarvitsee vain asettaa `trainable` -ominaisuus arvoksi `False`.\n",
|
||||
"\n",
|
||||
"> **Huomio**: Piirteenpoimijan painojen lukitseminen on tarpeen, koska muuten kouluttamaton luokittelukerros voi tuhota konvoluutiopiirteenpoimijan alkuperäiset esikoulutetut painot.\n",
|
||||
"> **Huom**: Ominaisuuksien erotinkerroksen painojen jäädyttäminen on tarpeen, koska muuten kouluttamaton luokittelukerros voi tuhota alkuperäiset, esikoulutetut konvoluutioerottimen painot.\n",
|
||||
"\n",
|
||||
"Voit huomata, että vaikka verkkomme kokonaisparametrien määrä on noin 15 miljoonaa, koulutamme vain 25 000 parametria. Kaikki muut huipputason konvoluutiosuodattimien parametrit ovat esikoulutettuja. Tämä on hyvä asia, koska pystymme hienosäätämään pienemmän määrän parametreja pienemmällä määrällä esimerkkejä.\n",
|
||||
"Huomaat, että vaikka verkkomme kokonaisparametrien määrä on noin 15 miljoonaa, koulutamme vain 25 000 parametria. Kaikki muut ylin tason konvoluutiosuodatinten parametrit ovat esikoulutettuja. Se on hyvä, koska pystymme hienosäätämään pienempää määrää parametreja pienemmällä määrällä esimerkkejä.\n",
|
||||
"\n",
|
||||
"Seuraavaksi koulutamme verkkomme ja katsomme, kuinka hyväksi voimme päästä. Odota melko pitkää suoritusaikaa, eikä tarvitse huolestua, vaikka suoritus vaikuttaisi hetkellisesti pysähtyneeltä.\n"
|
||||
"Koulutamme nyt verkkomme ja katsomme, kuinka hyväksi se voi tulla. Odota melko pitkä suoritusaika, äläkä huolestu, jos suoritus näyttää pysähtyneeltä hetkeksi.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -825,11 +835,11 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Näyttää siltä, että olemme saaneet aikaan melko tarkan kissojen ja koirien luokittelijan!\n",
|
||||
"Näyttää siltä, että olemme saaneet kohtuullisen tarkan kissat vs. koirat -luokittelijan! \n",
|
||||
"\n",
|
||||
"## Mallin tallentaminen ja lataaminen\n",
|
||||
"\n",
|
||||
"Kun olemme kouluttaneet mallin, voimme tallentaa mallin arkkitehtuurin ja koulutetut painot tiedostoon tulevaa käyttöä varten:\n"
|
||||
"Kun olemme kouluttaneet mallin, voimme tallentaa mallin arkkitehtuurin ja koulutetut painot tiedostoon myöhempää käyttöä varten:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -853,7 +863,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Voimme sitten ladata mallin tiedostosta milloin tahansa. Saatat pitää sitä hyödyllisenä, jos seuraava kokeilu tuhoaa mallin - sinun ei tarvitsisi aloittaa alusta.\n"
|
||||
"Mallin voi sitten ladata tiedostosta milloin tahansa. Tämä voi olla hyödyllistä, jos seuraava koe tuhoaa mallin – sinun ei tarvitse aloittaa alusta.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -869,15 +879,15 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Hienosäätö siirtoppimista\n",
|
||||
"## Siirtokoulutuksen hienosäätö\n",
|
||||
"\n",
|
||||
"Edellisessä osiossa koulutimme lopullisen luokittelukerroksen luokittelemaan kuvia omassa aineistossamme. Emme kuitenkaan uudelleenkouluttaneet piirteenpoimijaa, ja mallimme perustui ImageNet-datasta opittuihin piirteisiin. Jos kohteesi eroavat visuaalisesti tavallisista ImageNet-kuvista, tämä piirteiden yhdistelmä ei välttämättä toimi parhaalla mahdollisella tavalla. Siksi on järkevää aloittaa myös konvoluutiokerrosten kouluttaminen.\n",
|
||||
"Edellisessä osassa koulutimme lopullisen luokittelukerroksen luokittelemaan kuvat omassa datasetissämme. Emme kuitenkaan uudelleenkouluttaneet piirteiden erottajaa, ja mallimme luotti piirteisiin, joita malli oli oppinut ImageNet-datassa. Jos kohteesi eroavat visuaalisesti tavallisista ImageNet-kuvista, tämä piirteiden yhdistelmä ei ehkä toimi parhaiten. Siksi on järkevää aloittaa myös konvoluutiokerrosten kouluttaminen.\n",
|
||||
"\n",
|
||||
"Tätä varten voimme avata aiemmin jäädytettyjen konvoluutiokerrosten suodatinparametrit.\n",
|
||||
"Tehdäksemme tämän voimme avata aiemmin jäädytetyt konvoluutiosuodattimien parametrit uudelleen.\n",
|
||||
"\n",
|
||||
"> **Note:** On tärkeää, että jäädytät parametrit ensin ja suoritat useita koulutusepookkeja, jotta luokittelukerroksen painot vakautuvat. Jos aloitat heti koko verkon kouluttamisen avatuilla parametreilla, suuret virheet voivat tuhota konvoluutiokerrosten esikoulutetut painot.\n",
|
||||
"> **Huom:** On tärkeää, että ensin jäädytät parametrit ja suoritat useita oppimiskierroksia vakauttaaksesi painot luokittelukerroksessa. Jos aloitat heti koko verkon loppupään koulutuksen jäädyttämättömillä parametreilla, suuret virheet voivat tuhota ennakkoon koulutetut painot konvoluutiokerroksissa.\n",
|
||||
"\n",
|
||||
"Konvoluutio-VGG-16-mallimme sijaitsee ensimmäisessä kerroksessa, ja se koostuu monista kerroksista. Voimme tarkastella sen rakennetta:\n"
|
||||
"Konvoluutio-VGG-16-mallimme sijaitsee ensimmäisessä kerroksessa, ja se koostuu itse useista kerroksista. Voimme tarkastella sen rakennetta:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -946,7 +956,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Voimme poistaa jäädytyksen kaikista konvoluutiopohjan kerroksista:\n"
|
||||
"Voimme vapauttaa kaikki kerrokset konvoluutioalustasta: \n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -962,7 +972,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Kuitenkin, kaikkien kerrosten sulattaminen kerralla ei ole paras idea. Voimme ensin sulattaa vain muutaman viimeisen konvoluutiokerroksen, koska ne sisältävät korkeampia tason kuvioita, jotka ovat merkityksellisiä kuvillemme. Esimerkiksi aluksi voimme jäädyttää kaikki kerrokset paitsi viimeiset 4:\n"
|
||||
"Kuitenkin kaikkien niiden sammuttaminen yhtä aikaa ei ole paras ajatus. Voimme ensin poistaa käytöstä vain muutamia viimeisiä konvoluutikerroksia, koska ne sisältävät korkeampia tasoja olevia kuvioita, jotka ovat tärkeitä kuvillemme. Esimerkiksi aluksi voimme jäädyttää kaikki kerrokset paitsi viimeiset 4: \n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1001,11 +1011,11 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Huomaa, että opetettavien parametrien määrä kasvoi merkittävästi, mutta se on silti noin 50 % kaikista parametreista.\n",
|
||||
"Huomaa, että koulutettavien parametrien määrä kasvoi merkittävästi, mutta se on silti noin 50 % kaikista parametreista.\n",
|
||||
"\n",
|
||||
"Kun jäädytys poistetaan, voimme tehdä muutaman lisäepookin koulutusta (esimerkissämme teemme vain yhden). Voit myös valita pienemmän oppimisnopeuden, jotta minimoidaan vaikutus esikoulutettuihin painoihin. Kuitenkin, vaikka oppimisnopeus olisi alhainen, voit odottaa tarkkuuden laskevan koulutuksen alussa, kunnes se lopulta saavuttaa hieman korkeamman tason kuin kiinteiden painojen tapauksessa.\n",
|
||||
"Jäädytyksen purkamisen jälkeen voimme tehdä vielä muutaman koulutuskierroksen (esimerkissä teemme vain yhden). Voit myös valita alemman oppimisnopeuden minimoidaksesi vaikutuksen esikoulutettuihin painoihin. Kuitenkin jopa matalalla oppimisnopeudella tarkkuuden odotetaan laskevan koulutuksen alussa, kunnes se lopulta saavuttaa hieman korkeamman tason kuin kiinteillä painoilla.\n",
|
||||
"\n",
|
||||
"> **Huom:** Tämä koulutus tapahtuu paljon hitaammin, koska meidän täytyy välittää gradientit takaisin verkon monien kerrosten läpi!\n"
|
||||
"> **Huom:** Tämä koulutus tapahtuu paljon hitaammin, koska gradienttien täytyy kulkea takaisin verkon monen kerroksen läpi!\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1029,18 +1039,18 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Olemme todennäköisesti saavuttamassa korkeampaa koulutustarkkuutta, koska käytämme tehokkaampaa verkkoa, jossa on enemmän parametreja, mutta validointitarkkuus ei välttämättä parane yhtä paljon.\n",
|
||||
"Todennäköisesti saavuttamme korkeamman harjoitustarkkuuden, koska käytämme tehokkaampaa verkkoa, jossa on enemmän parametreja, mutta validointitarkkuus ei todennäköisesti kasva yhtä paljon.\n",
|
||||
"\n",
|
||||
"Voit halutessasi avata muutaman lisäkerroksen verkosta ja jatkaa koulutusta nähdäksesi, pystytkö saavuttamaan paremman tarkkuuden!\n"
|
||||
"Voit vapaasti vapauttaa muutaman kerroksen lisää verkosta ja treenata enemmän nähdäksesi, pystytkö saavuttamaan korkeamman tarkkuuden!\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Muut tietokonenäkömallit\n",
|
||||
"## Muut tietokonenäön mallit\n",
|
||||
"\n",
|
||||
"VGG-16 on yksi yksinkertaisimmista tietokonenäön arkkitehtuureista. Keras tarjoaa monia muita valmiiksi koulutettuja verkkoja. Näistä yleisimmin käytettyjä ovat Microsoftin kehittämät **ResNet**-arkkitehtuurit ja Googlen **Inception**. Esimerkiksi, tutkitaan yksinkertaisimman ResNet-50-mallin arkkitehtuuria (ResNet on malliperhe, jossa on eri syvyyksiä – voit kokeilla ResNet-152:ta, jos haluat nähdä, miltä todella syvä malli näyttää):\n"
|
||||
"VGG-16 on yksi yksinkertaisimmista tietokonenäön arkkitehtuureista. Keras tarjoaa monia muita ennalta koulutettuja verkkoja. Yleisimmin käytettyjä näistä ovat Microsoftin kehittämät **ResNet**-arkkitehtuurit ja Googlen **Inception**. Esimerkiksi tutustutaan yksinkertaisimman ResNet-50-mallin arkkitehtuuriin (ResNet on malliperhe, jossa on eri syvyyksiä, voit kokeilla ResNet-152:ta, jos haluat nähdä, miltä todella syvä malli näyttää):\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1442,11 +1452,11 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Kuten huomaat, malli sisältää samat tutut rakennuspalikat: konvoluutiokerrokset, pooling-kerrokset ja lopullisen tiheän luokittelijan. Voimme käyttää tätä mallia täsmälleen samalla tavalla kuin olemme käyttäneet VGG-16:ta siirto-oppimiseen. Voit kokeilla yllä olevaa koodia, käyttää eri ResNet-malleja pohjamallina ja nähdä, miten tarkkuus muuttuu.\n",
|
||||
"Kuten näet, malli sisältää samat tutut rakennuspalikat: konvoluutio-kerrokset, poolauskerrokset ja lopullisen tiheän luokittelijan. Voimme käyttää tätä mallia täsmälleen samalla tavalla kuin olemme käyttäneet VGG-16:ta siirto-opetuksessa. Voit kokeilla koodia yllä, käyttäen erilaisia ResNet-malleja perusmallina, ja nähdä kuinka tarkkuus muuttuu.\n",
|
||||
"\n",
|
||||
"## Eränormalisointi\n",
|
||||
"\n",
|
||||
"Tämä verkko sisältää vielä yhden kerrostyypin: **Eränormalisointi**. Eränormalisoinnin idea on tuoda arvot, jotka kulkevat hermoverkon läpi, oikealle välille. Yleensä hermoverkot toimivat parhaiten, kun kaikki arvot ovat välillä [-1,1] tai [0,1], ja siksi skaalaamme/normalisoimme syöttödatamme vastaavasti. Kuitenkin syvän verkon koulutuksen aikana voi tapahtua, että arvot menevät merkittävästi tämän alueen ulkopuolelle, mikä tekee koulutuksesta ongelmallista. Eränormalisointikerros laskee keskiarvon ja keskihajonnan kaikille nykyisen minibatchin arvoille ja käyttää niitä signaalin normalisointiin ennen sen kulkua hermoverkon kerroksen läpi. Tämä parantaa merkittävästi syvien verkkojen vakautta.\n"
|
||||
"Tämä verkko sisältää vielä toisen tyyppisen kerroksen: **Eränormalisoinnin**. Eränormalisoinnin idea on tuoda arvot, jotka kulkevat neuroverkon läpi, oikealle alueelle. Yleensä neuroverkot toimivat parhaiten, kun kaikki arvot ovat välillä [-1,1] tai [0,1], ja siksi skaalaamme/normalisoimme syöttötietomme vastaavasti. Kuitenkin syvän verkon koulutuksen aikana voi tapahtua, että arvot poikkeavat merkittävästi tästä alueesta, mikä vaikeuttaa koulutusta. Eränormalisointikerros laskee keskiarvon ja keskihajonnan kaikille nykyisen pienryhmän arvoille, ja käyttää niitä signaalin normalisointiin ennen sen läpivientiä neuroverkon kerroksen läpi. Tämä parantaa merkittävästi syvien verkkojen vakautta.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1455,16 +1465,16 @@
|
|||
"source": [
|
||||
"## Yhteenveto\n",
|
||||
"\n",
|
||||
"Siirtämällä oppimista hyödyntämällä pystyimme nopeasti kokoamaan luokittelijan omaa objektien luokittelutehtäväämme varten ja saavuttamaan korkean tarkkuuden. Tämä esimerkki ei kuitenkaan ollut täysin reilu, koska alkuperäinen VGG-16-verkko oli esikoulutettu tunnistamaan kissoja ja koiria, joten käytimme vain uudelleen suurinta osaa verkossa jo olevista malleista. Voit odottaa alhaisempaa tarkkuutta eksoottisemmilla, tiettyyn alaan liittyvillä objekteilla, kuten tuotantolinjan yksityiskohdilla tehtaassa tai eri puiden lehdillä.\n",
|
||||
"Siirto-oppimisen avulla pystyimme nopeasti kokoamaan luokittelijan omaa kohdeluokittelutehtäväämme varten ja saavuttamaan korkean tarkkuuden. Tämä esimerkki ei kuitenkaan ollut täysin reilu, koska alkuperäinen VGG-16-verkko oli esikoulutettu tunnistamaan kissoja ja koiria, joten käytimme uudelleen suurinta osaa verkossa jo olemassa olleista malleista. Voit odottaa alhaisempaa tarkkuutta eksoottisemmilla, domaineihin sidotulla kohteilla, kuten tehtaan tuotantolinjan yksityiskohdilla tai erilaisilla puun lehdillä.\n",
|
||||
"\n",
|
||||
"Voit huomata, että monimutkaisemmat tehtävät, joita nyt ratkaisemme, vaativat enemmän laskentatehoa, eikä niitä voida helposti ratkaista pelkällä suorittimella. Seuraavassa osiossa yritämme käyttää kevyempää toteutusta kouluttaaksemme saman mallin pienemmillä laskentaresursseilla, mikä johtaa vain hieman alhaisempaan tarkkuuteen.\n"
|
||||
"Näet, että nykyiset monimutkaisemmat tehtävät vaativat suurempaa laskentatehoa, eikä niitä voi helposti ratkaista pelkällä suorittimella. Seuraavassa jaksossa yritämme käyttää kevyempää toteutusta kouluttaaksemme saman mallin käyttäen vähemmän laskentaresursseja, mikä johtaa vain hieman alhaisempaan tarkkuuteen. \n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**Vastuuvapauslauseke**: \nTämä asiakirja on käännetty käyttämällä tekoälypohjaista käännöspalvelua [Co-op Translator](https://github.com/Azure/co-op-translator). Vaikka pyrimme tarkkuuteen, huomioithan, että automaattiset käännökset voivat sisältää virheitä tai epätarkkuuksia. Alkuperäinen asiakirja sen alkuperäisellä kielellä tulisi pitää ensisijaisena lähteenä. Kriittisen tiedon osalta suositellaan ammattimaista ihmiskäännöstä. Emme ole vastuussa väärinkäsityksistä tai virhetulkinnoista, jotka johtuvat tämän käännöksen käytöstä.\n"
|
||||
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**Vastuuvapauslauseke**:\nTämä asiakirja on käännetty käyttämällä tekoälypohjaista käännöspalvelua [Co-op Translator](https://github.com/Azure/co-op-translator). Vaikka pyrimme tarkkuuteen, otathan huomioon, että automaattiset käännökset saattavat sisältää virheitä tai epätarkkuuksia. Alkuperäinen asiakirja sen alkuperäiskielellä on virallinen lähde. Tärkeissä asioissa suositellaan ammattimaista ihmiskäännöstä. Emme ole vastuussa tämän käännöksen käytöstä aiheutuvista väärinymmärryksistä tai tulkinnoista.\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
|
|
@ -1485,12 +1495,6 @@
|
|||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.8.10"
|
||||
},
|
||||
"coopTranslator": {
|
||||
"original_hash": "c189abc107848f96051085cc30945129",
|
||||
"translation_date": "2025-08-28T20:34:52+00:00",
|
||||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb",
|
||||
"language_code": "fi"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
|
|
|||
|
|
@ -1,51 +1,51 @@
|
|||
# Luonnollisen kielen käsittely
|
||||
|
||||

|
||||

|
||||
|
||||
Tässä osiossa keskitymme käyttämään neuroverkkoja **luonnollisen kielen käsittelyyn (NLP)** liittyvien tehtävien ratkaisemiseen. On monia NLP-ongelmia, joita haluamme tietokoneiden pystyvän ratkaisemaan:
|
||||
Tässä osiossa keskitymme käyttämään hermoverkkoja tehtävien käsittelemiseksi, jotka liittyvät **luonnollisen kielen käsittelyyn (NLP)**. On monia NLP-ongelmia, jotka haluamme tietokoneiden pystyvän ratkaisemaan:
|
||||
|
||||
* **Tekstin luokittelu** on tyypillinen luokitteluongelma, joka liittyy tekstijonoihin. Esimerkkejä ovat sähköpostiviestien luokittelu roskapostiksi tai ei-roskapostiksi, tai artikkeleiden luokittelu urheiluun, liiketoimintaan, politiikkaan jne. Lisäksi chatbotteja kehitettäessä meidän on usein ymmärrettävä, mitä käyttäjä haluaa sanoa – tässä tapauksessa käsittelemme **tarkoituksen luokittelua**. Tarkoituksen luokittelussa on usein käsiteltävä monia kategorioita.
|
||||
* **Tunneanalyysi** on tyypillinen regressio-ongelma, jossa meidän on annettava lauseelle numero (tunne), joka vastaa sen positiivisuuden/negatiivisuuden astetta. Kehittyneempi versio tunneanalyysistä on **aspektipohjainen tunneanalyysi** (ABSA), jossa tunteet kohdistetaan koko lauseen sijaan sen eri osiin (aspekteihin), esim. *Tässä ravintolassa pidin ruoasta, mutta tunnelma oli kamala*.
|
||||
* **Nimekkeiden tunnistus** (NER) viittaa ongelmaan, jossa tekstistä poimitaan tiettyjä entiteettejä. Esimerkiksi lauseessa *Minun täytyy lentää huomenna Pariisiin* sanat *huomenna* viittaavat AIKAAN ja *Pariisi* PAIKKAAN.
|
||||
* **Avainsanojen poiminta** on samankaltainen kuin NER, mutta siinä sanat, jotka ovat tärkeitä lauseen merkityksen kannalta, poimitaan automaattisesti ilman erityistä esikoulutusta tiettyihin entiteettityyppeihin.
|
||||
* **Tekstin klusterointi** voi olla hyödyllistä, kun haluamme ryhmitellä yhteen samankaltaisia lauseita, esimerkiksi teknisen tuen keskusteluissa esiintyviä samankaltaisia pyyntöjä.
|
||||
* **Kysymys-vastausjärjestelmät** viittaavat mallin kykyyn vastata tiettyyn kysymykseen. Malli saa syötteenä tekstikappaleen ja kysymyksen, ja sen on löydettävä tekstistä kohta, jossa vastaus kysymykseen on (tai joskus luotava vastausteksti).
|
||||
* **Tekstin generointi** on mallin kyky luoda uutta tekstiä. Sitä voidaan pitää luokittelutehtävänä, jossa ennustetaan seuraava kirjain/sana jonkin *tekstisyötteen* perusteella. Kehittyneet tekstin generointimallit, kuten GPT-3, pystyvät ratkaisemaan muita NLP-tehtäviä käyttämällä tekniikoita, kuten [prompt-ohjelmointi](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) tai [prompt-suunnittelu](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29).
|
||||
* **Tekstin tiivistäminen** on tekniikka, jossa haluamme tietokoneen "lukevan" pitkän tekstin ja tiivistävän sen muutamaan lauseeseen.
|
||||
* **Konekäännös** voidaan nähdä yhdistelmänä tekstin ymmärtämistä yhdellä kielellä ja tekstin generointia toisella kielellä.
|
||||
* **Tekstin luokittelu** on tyypillinen luokittelutehtävä, joka koskee tekstijonoja. Esimerkkeinä ovat sähköpostiviestien luokittelu roskapostiksi tai ei-roskapostiksi, tai artikkeleiden luokittelu urheilu-, liiketoiminta-, politiikka-kategorioihin jne. Myös, kun kehitetään chatbotteja, meidän on usein ymmärrettävä, mitä käyttäjä halusi sanoa – tässä tapauksessa käsittelemme **aikomusluokittelua**. Usein aikomusluokittelussa pitää käsitellä monia kategorioita.
|
||||
* **Sentimenttianalyysi** on tyypillinen regressiotehtävä, jossa meidän täytyy antaa numero (sentimentti), joka vastaa kuinka positiivinen/negatiivinen lauseen merkitys on. Kehittyneempi versio sentimenttianalyysistä on **aspektipohjainen sentimenttianalyysi** (ABSA), jossa sentimentti määritetään ei koko lauseelle, vaan sen eri osille (aspekteille), esim. *Tässä ravintolassa pidin ruoasta, mutta ilmapiiri oli hirveä*.
|
||||
* **Nimien entiteettien tunnistus** (NER) tarkoittaa tiettyjen entiteettien poimimista tekstistä. Esimerkiksi meidän täytyy ymmärtää, että lauseessa *Minun pitää lentää Pariisiin huomenna* sana *huomenna* viittaa PÄIVÄMÄÄRÄÄN, ja *Pariisi* on PAIKKA.
|
||||
* **Avainsanojen poiminta** on samanlaista kuin NER, mutta tässä meidän täytyy automaattisesti poimia lauseen merkitykselle tärkeitä sanoja ilman ennakkokoulutusta tiettyihin entiteettityyppeihin.
|
||||
* **Tekstiryhmittely** voi olla hyödyllistä, kun haluamme ryhmitellä samanlaisia lauseita, esimerkiksi samankaltaisia pyyntöjä teknisen tuen keskusteluissa.
|
||||
* **Kysymysten vastaaminen** tarkoittaa mallin kykyä vastata tiettyyn kysymykseen. Malli saa syötteenä tekstikappaleen ja kysymyksen, ja sen täytyy antaa paikka tekstistä, jossa kysymyksen vastaus on (tai joskus generoida vastausteksti).
|
||||
* **Tekstin generointi** on kyky generoida uutta tekstiä. Sitä voidaan pitää luokittelutehtävänä, joka ennustaa seuraavan kirjaimen/sanan perustuen johonkin *tekstikehotteeseen*. Edistyneet tekstin generointimallit, kuten GPT-3, pystyvät ratkomaan myös muita NLP-tehtäviä luokittelun osalta käyttämällä tekniikkaa, jota kutsutaan [prompt-ohjelmoinniksi](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) tai [prompt-suunnitteluksi](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29)
|
||||
* **Tekstin tiivistäminen** on tekniikka, jossa haluamme, että tietokone "lukee" pitkän tekstin ja tiivistää sen muutamaan lauseeseen.
|
||||
* **Konekäännös** voidaan nähdä tekstin ymmärtämisen ja tekstin generoinnin yhdistelmänä kahdella eri kielellä.
|
||||
|
||||
Aluksi suurin osa NLP-tehtävistä ratkaistiin perinteisillä menetelmillä, kuten kielioppeja hyödyntämällä. Esimerkiksi konekäännöksessä käytettiin jäsennin-ohjelmia, jotka muunsivat alkuperäisen lauseen syntaksipuuksi, minkä jälkeen korkeampia semanttisia rakenteita poimittiin lauseen merkityksen esittämiseksi. Tämän merkityksen ja kohdekielen kieliopin perusteella luotiin lopputulos. Nykyään monet NLP-tehtävät ratkaistaan tehokkaammin neuroverkkojen avulla.
|
||||
Aluksi suurin osa NLP-tehtävistä ratkaistiin perinteisillä menetelmillä, kuten kielioppisääntöjen avulla. Esimerkiksi konekäännöksessä käytettiin jäsennintä (parser), joka muunsi alkuperäisen lauseen syntaksipuuksi, sitten korkeamman tason semanttisia rakenteita poimittiin lauseen merkityksen esittämiseksi, ja tämän merkityksen sekä kohdekielen kieliopin perusteella tulos generoitiin. Nykyään monet NLP-tehtävät ratkaistaan tehokkaammin hermoverkkojen avulla.
|
||||
|
||||
> Monet klassiset NLP-menetelmät on toteutettu [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org) -kirjastossa Pythonille. Verkossa on saatavilla erinomainen [NLTK-kirja](https://www.nltk.org/book/), joka kattaa, miten erilaisia NLP-tehtäviä voidaan ratkaista NLTK:ta käyttäen.
|
||||
> Monet klassiset NLP-menetelmät on toteutettu [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org) Python-kirjastossa. Saatavilla on loistava [NLTK-kirja](https://www.nltk.org/book/), joka kattaa miten erilaisia NLP-tehtäviä voidaan ratkaista käyttämällä NLTK:ta.
|
||||
|
||||
Kurssillamme keskitymme pääasiassa neuroverkkojen käyttöön NLP:ssä, ja käytämme NLTK:ta tarvittaessa.
|
||||
Kurssillamme keskitymme pääasiassa hermoverkkojen käyttöön NLP:ssä, ja käytämme NLTK:ta tarvittaessa.
|
||||
|
||||
Olemme jo oppineet käyttämään neuroverkkoja taulukkodatan ja kuvien käsittelyyn. Suurin ero näiden datatyyppien ja tekstin välillä on, että teksti on vaihtelevan pituinen jono, kun taas kuvien tapauksessa syötteen koko tiedetään etukäteen. Vaikka konvoluutiot voivat poimia kuvioita syötteestä, tekstin kuviot ovat monimutkaisempia. Esimerkiksi kielteisyys voi olla erotettuna subjektista monilla sanoilla (esim. *En pidä appelsiineista* vs. *En pidä noista isoista värikkäistä maukkaista appelsiineista*), ja se tulisi silti tulkita yhtenä kuviona. Siksi kielen käsittelyyn tarvitaan uusia neuroverkkotyyppejä, kuten *toistoverkkoja* ja *transformereita*.
|
||||
Olemme jo oppineet käyttämään hermoverkkoja taulukkomuotoisen datan ja kuvien käsittelyyn. Pääasiallinen ero näiden tietotyyppien ja tekstin välillä on, että teksti on muuttuvan pituinen jono, kun taas kuvien syötekoon koko tiedetään etukäteen. Vaikka konvoluutioneuroverkot pystyvät poimimaan kuvioita syötedatasta, tekstin kuviot ovat monimutkaisempia. Esim., kieltosanat voivat olla erillään subjektista mielivaltaisen monta sanaa (esim. *En pidä appelsiineista* vs. *En pidä niistä isoista värikkäistä maukkaista appelsiineista*), ja tämä pitäisi kuitenkin tulkita yhtenä kuviona. Siksi kielen käsittelyssä tarvitsemme uusia hermoverkkotyyppejä, kuten *toistuvat verkot* ja *transformerit*.
|
||||
|
||||
## Kirjastojen asentaminen
|
||||
## Kirjastojen asennus
|
||||
|
||||
Jos käytät paikallista Python-asennusta tämän kurssin suorittamiseen, saatat joutua asentamaan kaikki NLP:ssä tarvittavat kirjastot seuraavilla komennoilla:
|
||||
Jos käytät paikallista Python-asennusta tämän kurssin ajamiseen, saatat joutua asentamaan kaikki tarvittavat NLP-kirjastot seuraavilla komennoilla:
|
||||
|
||||
**PyTorchille**
|
||||
```bash
|
||||
pip install -r requirements-torch.txt
|
||||
pip install -r requirements-pytorch.txt
|
||||
```
|
||||
**TensorFlow'lle**
|
||||
```bash
|
||||
pip install -r requirements-tf.txt
|
||||
```
|
||||
|
||||
> Voit kokeilla NLP:tä TensorFlow'lla [Microsoft Learnissa](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste)
|
||||
> Voit kokeilla NLP:tä TensorFlown kanssa [Microsoft Learnissä](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste)
|
||||
|
||||
## GPU-varoitus
|
||||
|
||||
Tässä osiossa joissakin esimerkeissä koulutamme melko suuria malleja.
|
||||
* **Käytä GPU:lla varustettua tietokonetta**: On suositeltavaa suorittaa muistikirjat GPU:lla varustetulla tietokoneella, jotta odotusajat suurten mallien kanssa lyhenevät.
|
||||
* **GPU-muistin rajoitukset**: GPU:lla suorittaminen voi johtaa tilanteisiin, joissa GPU-muisti loppuu, erityisesti suuria malleja koulutettaessa.
|
||||
* **GPU-muistin kulutus**: GPU-muistin kulutus koulutuksen aikana riippuu useista tekijöistä, kuten minibatchin koosta.
|
||||
* **Pienennä minibatchin kokoa**: Jos kohtaat GPU-muistiongelmia, harkitse minibatchin koon pienentämistä koodissasi mahdollisena ratkaisuna.
|
||||
* **TensorFlow'n GPU-muistin vapautus**: TensorFlow'n vanhemmat versiot eivät välttämättä vapauta GPU-muistia oikein, kun koulutetaan useita malleja yhdessä Python-ytimessä. GPU-muistin käytön hallitsemiseksi tehokkaasti voit määrittää TensorFlow'n varaamaan GPU-muistia vain tarpeen mukaan.
|
||||
* **Koodin sisällyttäminen**: Voit asettaa TensorFlow'n kasvattamaan GPU-muistin varausta vain tarvittaessa lisäämällä seuraavan koodin muistikirjoihisi:
|
||||
Tässä osiossa joidenkin esimerkkien mallien harjoittaminen on melko suurta.
|
||||
* **Käytä GPU:lla varustettua konetta**: On suositeltavaa ajaa muistikirjojasi GPU:lla varustetulla koneella vähentääksesi odotusaikoja suurten mallien kanssa työskennellessä.
|
||||
* **GPU-muistin rajoitukset**: GPU:lla ajaminen voi johtaa tilanteisiin, joissa GPU-muisti loppuu, erityisesti suuria malleja kouluttaessa.
|
||||
* **GPU-muistin kulutus**: Koulutuksen aikana käytetty GPU-muistin määrä riippuu monista tekijöistä, mukaan lukien minibatchin koko.
|
||||
* **Minibatchin koon minimointi**: Jos kohtaat ongelmia GPU-muistin kanssa, harkitse minibatchin koon pienentämistä koodissasi.
|
||||
* **TensorFlow'n GPU-muistin vapautus**: Vanhemmat TensorFlow-versiot eivät välttämättä vapauta GPU-muistia oikein, kun koulutetaan useita malleja saman Python-ytimen sisällä. GPU-muistin hallinnan optimoimiseksi voit konfiguroida TensorFlow'hun lataamaan GPU-muistia vain tarpeen mukaan.
|
||||
* **Koodin lisääminen**: Asettaaksesi TensorFlow'n kasvattamaan GPU-muistin käyttöä tarpeen mukaan, lisää seuraava koodi muistikirjoihisi:
|
||||
|
||||
```python
|
||||
physical_devices = tf.config.list_physical_devices('GPU')
|
||||
|
|
@ -53,19 +53,21 @@ if len(physical_devices)>0:
|
|||
tf.config.experimental.set_memory_growth(physical_devices[0], True)
|
||||
```
|
||||
|
||||
Jos olet kiinnostunut oppimaan NLP:stä klassisen koneoppimisen näkökulmasta, käy [tässä oppituntikokonaisuudessa](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP).
|
||||
Jos olet kiinnostunut oppimaan NLP:tä klassisesta koneoppimisen näkökulmasta, käy [tässä oppimateriaalissa](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP)
|
||||
|
||||
## Tässä osiossa
|
||||
Tässä osiossa opimme:
|
||||
|
||||
* [Tekstin esittäminen tensoreina](13-TextRep/README.md)
|
||||
* [Sana-upotukset](14-Emdeddings/README.md)
|
||||
* [Kielimallinnus](15-LanguageModeling/README.md)
|
||||
* [Toistuvat neuroverkot](16-RNN/README.md)
|
||||
* [Sanasijoitukset](14-Emdeddings/README.md)
|
||||
* [Kielimallit](15-LanguageModeling/README.md)
|
||||
* [Toistuvat hermoverkot](16-RNN/README.md)
|
||||
* [Generatiiviset verkot](17-GenerativeNetworks/README.md)
|
||||
* [Transformerit](18-Transformers/README.md)
|
||||
|
||||
---
|
||||
|
||||
**Vastuuvapauslauseke**:
|
||||
Tämä asiakirja on käännetty käyttämällä tekoälypohjaista käännöspalvelua [Co-op Translator](https://github.com/Azure/co-op-translator). Vaikka pyrimme tarkkuuteen, huomioithan, että automaattiset käännökset voivat sisältää virheitä tai epätarkkuuksia. Alkuperäistä asiakirjaa sen alkuperäisellä kielellä tulisi pitää ensisijaisena lähteenä. Kriittisen tiedon osalta suositellaan ammattimaista ihmiskäännöstä. Emme ole vastuussa väärinkäsityksistä tai virhetulkinnoista, jotka johtuvat tämän käännöksen käytöstä.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**Vastuuvapauslauseke**:
|
||||
Tämä asiakirja on käännetty käyttämällä tekoälypohjaista käännöspalvelua [Co-op Translator](https://github.com/Azure/co-op-translator). Vaikka pyrimme tarkkuuteen, otathan huomioon, että automaattiset käännökset saattavat sisältää virheitä tai epätarkkuuksia. Alkuperäinen asiakirja sen alkuperäiskielellä on virallinen lähde. Tärkeissä asioissa suositellaan ammattimaista ihmiskäännöstä. Emme ole vastuussa tämän käännöksen käytöstä aiheutuvista väärinymmärryksistä tai tulkinnoista.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -5,6 +5,12 @@
|
|||
"source_file": "AGENTS.md",
|
||||
"language_code": "fr"
|
||||
},
|
||||
"CONTRIBUTING.md": {
|
||||
"original_hash": "c6fd7e781b67111a90abd166d0ce4aa0",
|
||||
"translation_date": "2026-07-08T20:19:13+00:00",
|
||||
"source_file": "CONTRIBUTING.md",
|
||||
"language_code": "fr"
|
||||
},
|
||||
"README.md": {
|
||||
"original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b",
|
||||
"translation_date": "2026-04-06T15:30:45+00:00",
|
||||
|
|
@ -17,6 +23,19 @@
|
|||
"source_file": "SECURITY.md",
|
||||
"language_code": "fr"
|
||||
},
|
||||
"__translation_failures__": {
|
||||
"lessons/sketchnotes/LICENSE.md": {
|
||||
"original_hash": "45ab63a2cd8f5faef6c9b150618837a4",
|
||||
"source_file": "lessons/sketchnotes/LICENSE.md",
|
||||
"language_code": "fr",
|
||||
"failure_date": "2026-07-08T20:08:23+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-24T21:00:13+00:00",
|
||||
|
|
@ -54,8 +73,8 @@
|
|||
"language_code": "fr"
|
||||
},
|
||||
"examples/README.md": {
|
||||
"original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7",
|
||||
"translation_date": "2025-10-03T11:26:04+00:00",
|
||||
"original_hash": "7883d52c2e2a221e0b07a7b112a149b9",
|
||||
"translation_date": "2026-07-08T20:03:32+00:00",
|
||||
"source_file": "examples/README.md",
|
||||
"language_code": "fr"
|
||||
},
|
||||
|
|
@ -66,8 +85,8 @@
|
|||
"language_code": "fr"
|
||||
},
|
||||
"lessons/0-course-setup/how-to-run.md": {
|
||||
"original_hash": "a4717bd9103b9f6cd84d534b83534689",
|
||||
"translation_date": "2026-01-15T10:42:15+00:00",
|
||||
"original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1",
|
||||
"translation_date": "2026-07-08T20:03:53+00:00",
|
||||
"source_file": "lessons/0-course-setup/how-to-run.md",
|
||||
"language_code": "fr"
|
||||
},
|
||||
|
|
@ -191,6 +210,12 @@
|
|||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md",
|
||||
"language_code": "fr"
|
||||
},
|
||||
"lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": {
|
||||
"original_hash": "99b816b6a4957ef4100cee4c4221dff9",
|
||||
"translation_date": "2026-07-08T19:59:46+00:00",
|
||||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb",
|
||||
"language_code": "fr"
|
||||
},
|
||||
"lessons/4-ComputerVision/08-TransferLearning/lab/README.md": {
|
||||
"original_hash": "7765935c35fcee69b9fe2d0cfd6963e2",
|
||||
"translation_date": "2025-08-24T20:53:21+00:00",
|
||||
|
|
@ -330,8 +355,8 @@
|
|||
"language_code": "fr"
|
||||
},
|
||||
"lessons/5-NLP/README.md": {
|
||||
"original_hash": "8ef02a9318257ea140ed3ed74442096d",
|
||||
"translation_date": "2025-08-24T20:45:19+00:00",
|
||||
"original_hash": "038df6f1a73e49f6430740da083bfd6d",
|
||||
"translation_date": "2026-07-08T20:04:45+00:00",
|
||||
"source_file": "lessons/5-NLP/README.md",
|
||||
"language_code": "fr"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -0,0 +1,29 @@
|
|||
# Contribution à AI-For-Beginners
|
||||
|
||||
Merci de votre intérêt pour contribuer à AI-For-Beginners ! Nous accueillons les traductions, les corrections de leçons et les corrections de mise en forme.
|
||||
|
||||
## Accord de Licence Contributeur (CLA) Microsoft
|
||||
|
||||
Ce projet accueille les contributions et suggestions. La plupart des contributions nécessitent que vous acceptiez un Accord de Licence Contributeur (CLA) déclarant que vous avez le droit, et que vous accordez effectivement, les droits de nous permettre d’utiliser votre contribution. Pour plus de détails, consultez [https://cla.microsoft.com](https://cla.microsoft.com).
|
||||
|
||||
Lorsque vous soumettez une pull request, un bot CLA déterminera automatiquement si vous devez fournir un CLA et annotera la PR en conséquence (par exemple, étiquette, commentaire). Il vous suffit de suivre les instructions fournies par le bot. Vous n’aurez à le faire qu’une seule fois pour tous les dépôts utilisant notre CLA.
|
||||
|
||||
## Comment Contribuer
|
||||
|
||||
### 1. Correction de fautes de frappe / erreurs de code
|
||||
Si vous trouvez une faute de frappe ou un bug dans un notebook Jupyter ou un fichier markdown de leçon :
|
||||
1. Forkez le dépôt.
|
||||
2. Corrigez la faute ou le lien cassé.
|
||||
3. Soumettez une Pull Request avec une description claire de la correction.
|
||||
|
||||
### 2. Soumission de traductions
|
||||
Nous accueillons les traductions des leçons dans d’autres langues ! Veuillez placer les traductions sous le répertoire `translations/` en utilisant les noms des dossiers existants (par exemple `translations/es/`, `translations/pt-BR/`, `translations/zh-CN/`).
|
||||
|
||||
Pour plus de détails, consultez [etc/CONTRIBUTING.md](etc/CONTRIBUTING.md).
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**Avertissement** :
|
||||
Ce document a été traduit à l'aide du service de traduction automatique [Co-op Translator](https://github.com/Azure/co-op-translator). Bien que nous nous efforçions d'assurer l'exactitude, veuillez noter que les traductions automatisées peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue native doit être considéré comme la source faisant autorité. Pour les informations critiques, il est recommandé de recourir à une traduction professionnelle réalisée par un humain. Nous ne saurions être tenus responsables des malentendus ou erreurs d'interprétation découlant de l'utilisation de cette traduction.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -1,38 +1,38 @@
|
|||
# Exemples d'IA pour Débutants
|
||||
# Exemples d'IA adaptés aux débutants
|
||||
|
||||
Bienvenue ! Ce répertoire contient des exemples simples et autonomes pour vous aider à démarrer avec l'IA et l'apprentissage automatique. Chaque exemple est conçu pour être accessible aux débutants, avec des commentaires détaillés et des explications étape par étape.
|
||||
Bienvenue ! Ce répertoire contient des exemples simples et autonomes pour vous aider à démarrer avec l'IA et l'apprentissage automatique. Chaque exemple est conçu pour être accessible aux débutants avec des commentaires détaillés et des explications étape par étape.
|
||||
|
||||
## 📚 Aperçu des Exemples
|
||||
## 📚 Aperçu des exemples
|
||||
|
||||
| Exemple | Description | Niveau de difficulté | Prérequis |
|
||||
|---------|-------------|----------------------|-----------|
|
||||
| [Hello AI World](../../../examples/01-hello-ai-world.py) | Votre premier programme d'IA - reconnaissance de motifs simple | ⭐ Débutant | Bases de Python |
|
||||
| [Simple Neural Network](../../../examples/02-simple-neural-network.py) | Construisez un réseau de neurones à partir de zéro | ⭐⭐ Débutant+ | Python, mathématiques de base |
|
||||
| [Image Classifier](./03-image-classifier.ipynb) | Classifiez des images avec un modèle pré-entraîné | ⭐⭐ Débutant+ | Python, numpy |
|
||||
| [Text Sentiment](../../../examples/04-text-sentiment.py) | Analysez le sentiment d'un texte (positif/négatif) | ⭐⭐ Débutant+ | Python |
|
||||
| Exemple | Description | Difficulté | Prérequis |
|
||||
|---------|-------------|------------|---------------|
|
||||
| [Hello AI World](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/01-hello-ai-world.py) | Votre premier programme d'IA - reconnaissance de motifs simple | ⭐ Débutant | Bases de Python |
|
||||
| [Simple Neural Network](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/02-simple-neural-network.py) | Construisez un réseau de neurones à partir de zéro | ⭐⭐ Débutant+ | Python, mathématiques de base |
|
||||
| [Image Classifier](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/03-image-classifier.ipynb) | Classifiez des images avec un modèle pré-entraîné | ⭐⭐ Débutant+ | Python, numpy |
|
||||
| [Text Sentiment](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/04-text-sentiment.py) | Analysez le sentiment d'un texte (positif/négatif) | ⭐⭐ Débutant+ | Python |
|
||||
|
||||
## 🚀 Premiers Pas
|
||||
## 🚀 Pour commencer
|
||||
|
||||
### Prérequis
|
||||
|
||||
Assurez-vous d'avoir Python installé (version 3.8 ou supérieure recommandée). Installez les packages nécessaires :
|
||||
Assurez-vous d'avoir Python installé (3.8 ou plus recommandé). Installez les packages nécessaires :
|
||||
|
||||
```bash
|
||||
# For Python scripts
|
||||
# Pour les scripts Python
|
||||
pip install numpy
|
||||
|
||||
# For Jupyter notebooks (image classifier)
|
||||
# Pour les notebooks Jupyter (classificateur d’images)
|
||||
pip install jupyter numpy pillow tensorflow
|
||||
```
|
||||
|
||||
Ou utilisez l'environnement conda du programme principal :
|
||||
Ou utilisez l'environnement conda du cursus principal :
|
||||
|
||||
```bash
|
||||
conda env create --name ai4beg --file ../environment.yml
|
||||
conda activate ai4beg
|
||||
```
|
||||
|
||||
### Exécution des Exemples
|
||||
### Exécution des exemples
|
||||
|
||||
**Pour les scripts Python (.py) :**
|
||||
```bash
|
||||
|
|
@ -44,42 +44,44 @@ python 01-hello-ai-world.py
|
|||
jupyter notebook 03-image-classifier.ipynb
|
||||
```
|
||||
|
||||
## 📖 Parcours d'Apprentissage
|
||||
## 📖 Parcours d'apprentissage
|
||||
|
||||
Nous recommandons de suivre les exemples dans cet ordre :
|
||||
Nous recommandons de suivre les exemples dans l'ordre :
|
||||
|
||||
1. **Commencez par "Hello AI World"** - Apprenez les bases de la reconnaissance de motifs
|
||||
2. **Construisez un Réseau de Neurones Simple** - Comprenez le fonctionnement des réseaux de neurones
|
||||
3. **Essayez le Classificateur d'Images** - Découvrez l'IA en action avec des images réelles
|
||||
4. **Analysez le Sentiment d'un Texte** - Explorez le traitement du langage naturel
|
||||
2. **Construisez un réseau de neurones simple** - Comprenez le fonctionnement des réseaux de neurones
|
||||
3. **Essayez le classificateur d'images** - Découvrez l'IA en action avec des images réelles
|
||||
4. **Analysez le sentiment du texte** - Explorez le traitement du langage naturel
|
||||
|
||||
## 💡 Conseils pour Débutants
|
||||
## 💡 Conseils pour les débutants
|
||||
|
||||
- **Lisez attentivement les commentaires dans le code** - Ils expliquent chaque ligne
|
||||
- **Expérimentez !** - Essayez de modifier les valeurs et observez les résultats
|
||||
- **Ne vous inquiétez pas si vous ne comprenez pas tout** - L'apprentissage prend du temps
|
||||
- **Lisez attentivement les commentaires dans le code** - Ils expliquent ce que fait chaque ligne
|
||||
- **Expérimentez !** - Essayez de modifier les valeurs et voyez ce qui se passe
|
||||
- **Ne vous inquiétez pas de tout comprendre** - L'apprentissage prend du temps
|
||||
- **Posez des questions** - Utilisez le [forum de discussion](https://github.com/microsoft/AI-For-Beginners/discussions)
|
||||
|
||||
## 🔗 Prochaines Étapes
|
||||
## 🔗 Prochaines étapes
|
||||
|
||||
Après avoir terminé ces exemples, explorez le programme complet :
|
||||
Après avoir terminé ces exemples, explorez le cursus complet :
|
||||
- [Introduction à l'IA](../lessons/1-Intro/README.md)
|
||||
- [Réseaux de Neurones](../lessons/3-NeuralNetworks/README.md)
|
||||
- [Vision par Ordinateur](../lessons/4-ComputerVision/README.md)
|
||||
- [Traitement du Langage Naturel](../lessons/5-NLP/README.md)
|
||||
- [Réseaux de neurones](../lessons/3-NeuralNetworks/README.md)
|
||||
- [Vision par ordinateur](../lessons/4-ComputerVision/README.md)
|
||||
- [Traitement du langage naturel](../lessons/5-NLP/README.md)
|
||||
|
||||
## 🤝 Contribuer
|
||||
## 🤝 Contribution
|
||||
|
||||
Vous avez trouvé ces exemples utiles ? Aidez-nous à les améliorer :
|
||||
- Signalez des problèmes ou proposez des améliorations
|
||||
- Ajoutez d'autres exemples pour débutants
|
||||
Ces exemples vous ont été utiles ? Aidez-nous à les améliorer :
|
||||
- Signalez les problèmes ou suggérez des améliorations
|
||||
- Ajoutez plus d'exemples pour débutants
|
||||
- Améliorez la documentation et les commentaires
|
||||
|
||||
---
|
||||
|
||||
*Rappelez-vous : Chaque expert a été un débutant un jour. Bon apprentissage ! 🎓*
|
||||
*N'oubliez pas : Tout expert a un jour été débutant. Bon apprentissage ! 🎓*
|
||||
|
||||
---
|
||||
|
||||
**Avertissement** :
|
||||
Ce document a été traduit à l'aide du service de traduction automatique [Co-op Translator](https://github.com/Azure/co-op-translator). Bien que nous nous efforcions d'assurer l'exactitude, veuillez noter que les traductions automatisées peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue d'origine doit être considéré comme la source faisant autorité. Pour des informations critiques, il est recommandé de recourir à une traduction humaine professionnelle. Nous déclinons toute responsabilité en cas de malentendus ou d'interprétations erronées résultant de l'utilisation de cette traduction.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**Avertissement** :
|
||||
Ce document a été traduit à l'aide du service de traduction automatique [Co-op Translator](https://github.com/Azure/co-op-translator). Bien que nous nous efforçions d'assurer l'exactitude, veuillez noter que les traductions automatisées peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue native doit être considéré comme la source faisant autorité. Pour les informations critiques, il est recommandé de recourir à une traduction professionnelle réalisée par un humain. Nous ne saurions être tenus responsables des malentendus ou erreurs d'interprétation découlant de l'utilisation de cette traduction.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -1,10 +1,10 @@
|
|||
# Comment exécuter le code
|
||||
|
||||
Ce programme contient beaucoup d’exemples exécutables et de travaux pratiques que vous voudrez exécuter. Pour ce faire, vous avez besoin de pouvoir exécuter du code Python dans les notebooks Jupyter fournis dans le cadre de ce programme. Vous disposez de plusieurs options pour exécuter le code :
|
||||
Ce programme contient de nombreux exemples exécutables et laboratoires que vous voudrez exécuter. Pour ce faire, vous devez pouvoir exécuter du code Python dans les notebooks Jupyter fournis dans le cadre de ce programme. Plusieurs options s'offrent à vous pour exécuter le code :
|
||||
|
||||
## Exécuter localement sur votre ordinateur
|
||||
|
||||
Pour exécuter le code localement sur votre ordinateur, une installation de Python est nécessaire. Une recommandation est d’installer **[miniconda](https://conda.io/en/latest/miniconda.html)** – c’est une installation plutôt légère qui supporte le gestionnaire de paquets `conda` pour différents **environnements virtuels** Python.
|
||||
Pour exécuter le code localement sur votre ordinateur, une installation de Python est nécessaire. Une recommandation est d’installer **[miniconda](https://conda.io/en/latest/miniconda.html)** - il s'agit d'une installation assez légère qui supporte le gestionnaire de paquets `conda` pour différents **environnements virtuels** Python.
|
||||
|
||||
Après avoir installé miniconda, clonez le dépôt et créez un environnement virtuel à utiliser pour ce cours :
|
||||
|
||||
|
|
@ -15,19 +15,19 @@ conda env create --name ai4beg --file .devcontainer/environment.yml
|
|||
conda activate ai4beg
|
||||
```
|
||||
|
||||
### Utilisation de Visual Studio Code avec l'extension Python
|
||||
### Utilisation de Visual Studio Code avec l’extension Python
|
||||
|
||||
Ce programme est mieux utilisé en l’ouvrant dans [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) avec l’[extension Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste).
|
||||
Ce programme s’utilise le mieux en l’ouvrant dans [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) avec l’[extension Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste).
|
||||
|
||||
> **Note** : Une fois que vous avez cloné et ouvert le répertoire dans VS Code, il vous suggérera automatiquement d’installer les extensions Python. Vous devrez également installer miniconda comme décrit ci-dessus.
|
||||
> **Note** : Une fois que vous avez cloné et ouvert le dossier dans VS Code, il vous proposera automatiquement d’installer les extensions Python. Vous devrez aussi installer miniconda comme décrit ci-dessus.
|
||||
|
||||
> **Note** : Si VS Code vous suggère de rouvrir le dépôt dans un conteneur, vous devriez refuser cela pour utiliser l’installation Python locale.
|
||||
> **Note** : Si VS Code vous suggère de rouvrir le dépôt dans un conteneur, vous devriez refuser ceci pour utiliser l’installation Python locale.
|
||||
|
||||
### Utilisation de Jupyter dans le navigateur
|
||||
|
||||
Vous pouvez aussi utiliser un environnement Jupyter depuis le navigateur sur votre propre ordinateur. À la fois Jupyter classique et JupyterHub fournissent un environnement de développement pratique avec autocomplétion, coloration syntaxique, etc.
|
||||
Vous pouvez aussi utiliser un environnement Jupyter depuis le navigateur sur votre propre ordinateur. Tant Jupyter classique que JupyterHub offrent un environnement de développement pratique avec auto-complétion, coloration syntaxique, etc.
|
||||
|
||||
Pour démarrer Jupyter localement, allez dans le répertoire du cours et exécutez :
|
||||
Pour démarrer Jupyter localement, allez dans le dossier du cours, et exécutez :
|
||||
|
||||
```bash
|
||||
jupyter notebook
|
||||
|
|
@ -36,36 +36,36 @@ ou
|
|||
```bash
|
||||
jupyterhub
|
||||
```
|
||||
Vous pouvez alors naviguer vers n’importe lequel des fichiers `.ipynb`, les ouvrir et commencer à travailler.
|
||||
Vous pouvez alors naviguer vers n’importe quel fichier `.ipynb`, l’ouvrir et commencer à travailler.
|
||||
|
||||
### Exécution dans un conteneur
|
||||
### Exécuter dans un conteneur
|
||||
|
||||
Une alternative à l’installation de Python serait d’exécuter le code dans un conteneur. Puisque notre dépôt fournit un dossier spécial `.devcontainer` qui indique comment construire un conteneur pour ce dépôt, VS Code offre la possibilité de rouvrir le code dans un conteneur. Cela nécessitera l’installation de Docker, et serait aussi plus complexe, c’est pourquoi nous recommandons cela aux utilisateurs plus expérimentés.
|
||||
Une alternative à l’installation de Python serait d’exécuter le code dans un conteneur. Étant donné que notre dépôt fournit un dossier spécial `.devcontainer` qui explique comment construire un conteneur pour ce repo, VS Code offre la possibilité de rouvrir le code dans un conteneur. Cela nécessite l’installation de Docker, et est aussi plus complexe, donc nous recommandons cette option aux utilisateurs plus expérimentés.
|
||||
|
||||
## Exécution dans le cloud
|
||||
## Exécuter dans le cloud
|
||||
|
||||
Si vous ne souhaitez pas installer Python localement et avez accès à des ressources cloud, une bonne alternative serait d’exécuter le code dans le cloud. Plusieurs options s’offrent à vous :
|
||||
Si vous ne souhaitez pas installer Python localement, et disposez d’accès à des ressources cloud, une bonne alternative serait d’exécuter le code dans le cloud. Plusieurs méthodes sont possibles :
|
||||
|
||||
* Utilisation de **[GitHub Codespaces](https://github.com/features/codespaces)**, qui est un environnement virtuel créé pour vous sur GitHub, accessible via une interface VS Code dans le navigateur. Si vous avez accès à Codespaces, vous pouvez simplement cliquer sur le bouton **Code** dans le dépôt, démarrer un codespace et vous lancer en un rien de temps.
|
||||
* Utilisation de **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) offre des ressources informatiques gratuites fournies dans le cloud pour permettre à des personnes comme vous de tester du code sur GitHub. Il y a un bouton sur la page d’accueil pour ouvrir le dépôt dans Binder – cela devrait rapidement vous amener sur le site de Binder, qui construira un conteneur sous-jacent et lancera une interface web Jupyter pour vous de manière transparente.
|
||||
* Utiliser **[GitHub Codespaces](https://github.com/features/codespaces)**, qui est un environnement virtuel créé pour vous sur GitHub, accessible via une interface navigateur de VS Code. Si vous avez accès à Codespaces, vous pouvez simplement cliquer sur le bouton **Code** dans le dépôt, démarrer un codespace, et commencer très rapidement.
|
||||
* Utiliser **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) offre des ressources informatiques gratuites fournies dans le cloud pour permettre à des personnes comme vous d’essayer du code sur GitHub. Il y a un bouton sur la page d’accueil pour ouvrir le dépôt dans Binder - cela vous amènera rapidement au site Binder, qui construira un conteneur sous-jacent et lancera une interface web Jupyter pour vous de façon transparente.
|
||||
|
||||
> **Note** : Pour éviter les abus, Binder a bloqué l’accès à certaines ressources web. Cela peut empêcher certains codes de fonctionner, notamment ceux qui téléchargent des modèles et/ou jeux de données depuis Internet public. Vous devrez peut-être trouver des solutions de contournement. En outre, les ressources de calcul fournies par Binder sont assez basiques, donc l’entraînement sera lent, surtout dans les leçons plus avancées et complexes.
|
||||
> **Note** : Pour prévenir les abus, Binder bloque l’accès à certaines ressources web. Ceci peut empêcher une partie du code de fonctionner, notamment lorsque le code va chercher des modèles et/ou des jeux de données sur Internet. Vous pourriez devoir trouver des solutions alternatives. De plus, les ressources de calcul fournies par Binder sont assez basiques, donc l’entraînement sera lent, surtout dans les leçons plus avancées et complexes.
|
||||
|
||||
## Exécution dans le cloud avec GPU
|
||||
## Exécuter dans le cloud avec GPU
|
||||
|
||||
Certaines leçons avancées de ce programme bénéficieraient grandement du support GPU. L’entraînement de modèles, par exemple, peut être très lent autrement. Vous pouvez suivre quelques options, surtout si vous avez accès au cloud via [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) ou via votre institution :
|
||||
Certaines des leçons avancées de ce programme bénéficieraient grandement du support GPU. Par exemple, l’entraînement des modèles peut être très lent autrement. Vous avez plusieurs options, en particulier si vous avez accès au cloud via [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste), ou via votre institution :
|
||||
|
||||
* Créez une [Machine virtuelle Data Science](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) et connectez-vous à celle-ci via Jupyter. Vous pourrez alors cloner le dépôt directement sur la machine et commencer à apprendre. Les machines virtuelles série NC offrent un support GPU.
|
||||
* Créer une [Data Science Virtual Machine](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) et s’y connecter via Jupyter. Vous pouvez alors cloner le dépôt directement sur la machine, et commencer à apprendre. Les machines virtuelles de la série NC ont un support GPU.
|
||||
|
||||
> **Note** : Certains abonnements, y compris Azure for Students, ne fournissent pas nativement de support GPU. Vous devrez peut-être demander des cœurs GPU supplémentaires via une demande de support technique.
|
||||
> **Note** : Certaines souscriptions, y compris Azure for Students, ne fournissent pas de support GPU nativement. Vous pourriez devoir demander des cœurs GPU supplémentaires via une demande de support technique.
|
||||
|
||||
* Créez un [Espace de travail Azure Machine Learning](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) puis utilisez la fonctionnalité Notebook. [Cette vidéo](https://azure-for-academics.github.io/quickstart/azureml-papers/) montre comment cloner un dépôt dans un notebook Azure ML et commencer à l’utiliser.
|
||||
* Créer un [Espace de travail Azure Machine Learning](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) puis utiliser la fonctionnalité Notebook là-bas. [Cette vidéo](https://azure-for-academics.github.io/quickstart/azureml-papers/) montre comment cloner un dépôt dans un notebook Azure ML et commencer à l’utiliser.
|
||||
|
||||
Vous pouvez aussi utiliser Google Colab, qui offre un support GPU gratuit, et y téléverser vos notebooks Jupyter pour les exécuter un par un.
|
||||
Vous pouvez aussi utiliser Google Colab, qui offre un support GPU gratuit limité, et y uploader les notebooks Jupyter pour les exécuter un à un.
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**Clause de non-responsabilité** :
|
||||
Ce document a été traduit à l’aide du service de traduction automatique [Co-op Translator](https://github.com/Azure/co-op-translator). Bien que nous nous efforcions d’assurer l’exactitude, veuillez noter que les traductions automatiques peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue d’origine doit être considéré comme la source officielle. Pour les informations critiques, une traduction professionnelle réalisée par un humain est recommandée. Nous ne pouvons être tenus responsables des malentendus ou des erreurs d’interprétation résultant de l’utilisation de cette traduction.
|
||||
**Avertissement** :
|
||||
Ce document a été traduit à l'aide du service de traduction automatique [Co-op Translator](https://github.com/Azure/co-op-translator). Bien que nous nous efforçions d'assurer l'exactitude, veuillez noter que les traductions automatisées peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue native doit être considéré comme la source faisant autorité. Pour les informations critiques, il est recommandé de recourir à une traduction professionnelle réalisée par un humain. Nous ne saurions être tenus responsables des malentendus ou erreurs d'interprétation découlant de l'utilisation de cette traduction.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -6,9 +6,9 @@
|
|||
"source": [
|
||||
"# Modèles pré-entraînés et apprentissage par transfert\n",
|
||||
"\n",
|
||||
"L'entraînement des CNNs peut prendre beaucoup de temps, et une grande quantité de données est nécessaire pour cette tâche. Cependant, une grande partie du temps est consacrée à apprendre les meilleurs filtres de bas niveau qu'un réseau utilise pour extraire des motifs à partir d'images. Une question naturelle se pose : peut-on utiliser un réseau neuronal entraîné sur un ensemble de données et l'adapter à la classification d'images différentes sans passer par un processus d'entraînement complet ?\n",
|
||||
"L'entraînement des CNN peut prendre beaucoup de temps, et une grande quantité de données est nécessaire pour cette tâche. Cependant, la majeure partie du temps est consacrée à l'apprentissage des meilleurs filtres de bas niveau qu'un réseau utilise pour extraire des motifs à partir d'images. Une question naturelle se pose : peut-on utiliser un réseau de neurones entraîné sur un jeu de données et l'adapter pour classer différentes images sans passer par un entraînement complet ?\n",
|
||||
"\n",
|
||||
"Cette approche est appelée **apprentissage par transfert**, car nous transférons une partie des connaissances d'un modèle de réseau neuronal à un autre. Dans l'apprentissage par transfert, nous commençons généralement par un modèle pré-entraîné, qui a été entraîné sur un grand ensemble de données d'images, tel que **ImageNet**. Ces modèles sont déjà capables d'extraire efficacement différentes caractéristiques à partir d'images génériques, et dans de nombreux cas, construire simplement un classificateur au-dessus de ces caractéristiques extraites peut donner de bons résultats.\n"
|
||||
"Cette approche s'appelle **l'apprentissage par transfert**, car nous transférons une partie des connaissances d'un modèle de réseau de neurones à un autre. Dans l'apprentissage par transfert, nous commençons généralement avec un modèle pré-entraîné, qui a été entraîné sur un grand jeu de données d'images, comme **ImageNet**. Ces modèles savent déjà bien extraire différentes caractéristiques d'images génériques, et dans de nombreux cas, il suffit de construire un classificateur par-dessus ces caractéristiques extraites pour obtenir un bon résultat.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -29,9 +29,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Jeu de données Chats vs Chiens\n",
|
||||
"## Jeu de données Chats vs. Chiens\n",
|
||||
"\n",
|
||||
"Dans cette unité, nous allons résoudre un problème réel de classification d'images de chats et de chiens. Pour cela, nous utiliserons le [jeu de données Chats vs Chiens de Kaggle](https://www.kaggle.com/c/dogs-vs-cats), qui peut également être téléchargé [depuis Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n",
|
||||
"Dans cette unité, nous allons résoudre un problème réel de classification d'images de chats et de chiens. Pour cette raison, nous utiliserons le [jeu de données Chats vs. Chiens de Kaggle](https://www.kaggle.com/c/dogs-vs-cats), qui peut également être téléchargé [depuis Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n",
|
||||
"\n",
|
||||
"Téléchargeons ce jeu de données et extrayons-le dans le répertoire `data` (ce processus peut prendre un certain temps !) :\n"
|
||||
]
|
||||
|
|
@ -64,7 +64,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Malheureusement, il y a des fichiers image corrompus dans le jeu de données. Nous devons effectuer un nettoyage rapide pour vérifier les fichiers corrompus. Afin de ne pas encombrer ce tutoriel, nous avons déplacé le code de vérification du jeu de données dans un module.\n"
|
||||
"Malheureusement, il y a des fichiers image corrompus dans le jeu de données. Nous devons faire un nettoyage rapide pour vérifier les fichiers corrompus. Afin de ne pas encombrer ce tutoriel, nous avons déplacé le code de vérification du jeu de données dans un module.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -335,11 +335,11 @@
|
|||
"source": [
|
||||
"## Chargement du jeu de données\n",
|
||||
"\n",
|
||||
"Dans les exemples précédents, nous chargions des jeux de données intégrés à Keras. Maintenant, nous allons travailler avec notre propre jeu de données, que nous devons charger à partir d'un répertoire d'images.\n",
|
||||
"Dans les exemples précédents, nous chargions des jeux de données intégrés à Keras. Maintenant, nous allons traiter notre propre jeu de données, que nous devons charger à partir d'un répertoire d'images.\n",
|
||||
"\n",
|
||||
"Dans la réalité, la taille des jeux de données d'images peut être assez importante, et il est impossible de compter sur le fait que toutes les données puissent tenir en mémoire. Ainsi, les jeux de données sont souvent représentés sous forme de **générateurs** capables de fournir des données en mini-lots adaptés à l'entraînement.\n",
|
||||
"Dans la vie réelle, la taille des jeux de données d’images peut être assez grande, et on ne peut pas compter sur le fait que toutes les données tiennent en mémoire. Ainsi, les jeux de données sont souvent représentés sous forme de **générateurs** qui peuvent retourner les données en petits lots adaptés à l'entraînement.\n",
|
||||
"\n",
|
||||
"Pour gérer la classification d'images, Keras inclut une fonction spéciale `image_dataset_from_directory`, qui peut charger des images à partir de sous-répertoires correspondant à différentes classes. Cette fonction prend également en charge le redimensionnement des images et peut diviser le jeu de données en ensembles d'entraînement et de test :\n"
|
||||
"Pour gérer la classification d’images, Keras inclut une fonction spéciale `image_dataset_from_directory`, qui peut charger les images à partir de sous-répertoires correspondant à différentes classes. Cette fonction s’occupe également de la mise à l’échelle des images, et peut aussi diviser le jeu de données en sous-ensembles d’entraînement et de test :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -383,9 +383,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Il est important de définir la même valeur de `seed` pour les deux appels, car cela influence la répartition des images entre les ensembles d'entraînement et de test.\n",
|
||||
"Il est important de définir la même valeur de `seed` pour les deux appels, car elle affecte la répartition des images entre les ensembles d'entraînement et de test.\n",
|
||||
"\n",
|
||||
"Le dataset récupère automatiquement les noms des classes à partir des répertoires, et vous pouvez y accéder si nécessaire en appelant :\n"
|
||||
"Dataset récupère automatiquement les noms des classes à partir des répertoires, et vous pouvez y accéder si nécessaire en appelant :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -412,7 +412,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Les ensembles de données que nous avons obtenus peuvent être directement passés à la fonction `fit` pour entraîner le modèle. Ils contiennent à la fois des images correspondantes et des étiquettes, qui peuvent être parcourues à l'aide de la construction suivante :\n"
|
||||
"Les ensembles de données que nous avons obtenus peuvent être directement passés à la fonction `fit` pour entraîner le modèle. Ils contiennent à la fois les images correspondantes et les étiquettes, qui peuvent être parcourues à l'aide de la construction suivante :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -453,7 +453,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"> **Remarque** : Toutes les images du jeu de données sont représentées sous forme de tenseurs à virgule flottante avec une plage de 0 à 255. Avant de les passer au réseau de neurones, nous devons ramener ces valeurs dans une plage de 0 à 1. Lors de l'affichage des images, nous devons soit faire de même, soit convertir les valeurs en type `int` (ce que nous faisons dans le code ci-dessus), afin de montrer à `matplotlib` que nous souhaitons afficher l'image originale non mise à l'échelle.\n"
|
||||
"> **Note** : Toutes les images dans le jeu de données sont représentées sous forme de tenseurs à virgule flottante avec une plage de 0 à 255. Avant de les transmettre au réseau neuronal, nous devons mettre ces valeurs à l’échelle dans la plage 0-1. Lors du tracé des images, nous devons soit faire de même, soit convertir les valeurs en type `int` (ce que nous faisons dans le code ci-dessus), afin de montrer à `matplotlib` que nous voulons tracer l’image originale non mise à l’échelle.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -462,7 +462,7 @@
|
|||
"source": [
|
||||
"## Modèles pré-entraînés\n",
|
||||
"\n",
|
||||
"Pour de nombreuses tâches de classification d'images, il est possible de trouver des modèles de réseaux neuronaux pré-entraînés. Beaucoup de ces modèles sont disponibles dans l'espace de noms `keras.applications`, et encore plus de modèles peuvent être trouvés sur Internet. Voyons comment le modèle VGG-16 le plus simple peut être chargé et utilisé :\n"
|
||||
"Pour de nombreuses tâches de classification d'images, on peut trouver des modèles de réseaux neuronaux pré-entraînés. Beaucoup de ces modèles sont disponibles dans l'espace de noms `keras.applications`, et encore plus de modèles peuvent être trouvés sur Internet. Voyons comment charger et utiliser le modèle VGG-16 le plus simple :\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,16 +521,16 @@
|
|||
"metadata": {},
|
||||
"source": [
|
||||
"Il y a quelques points importants ici :\n",
|
||||
"* Avant de passer une entrée à un réseau pré-entraîné, elle doit être prétraitée d'une certaine manière. Cela se fait en appelant la fonction correspondante `preprocess_input`, qui reçoit un lot d'images et renvoie leur forme traitée. Dans le cas de VGG-16, les images sont normalisées, et une valeur moyenne prédéfinie pour chaque canal est soustraite. Cela est dû au fait que VGG-16 a été initialement entraîné avec ce prétraitement.\n",
|
||||
"* Le réseau de neurones est appliqué au lot d'entrée, et nous recevons en résultat un lot de tenseurs à 1000 éléments qui indiquent la probabilité de chaque classe. Nous pouvons trouver le numéro de la classe la plus probable en appelant `argmax` sur ce tenseur.\n",
|
||||
"* Le résultat obtenu est un [numéro d'une classe `ImageNet`](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Pour donner du sens à ce résultat, nous pouvons également utiliser la fonction `decode_predictions`, qui renvoie les n classes principales avec leurs noms.\n"
|
||||
"* Avant de passer une entrée à un réseau pré-entraîné, elle doit être pré-traitée d'une certaine manière. Cela se fait en appelant la fonction `preprocess_input` correspondante, qui reçoit un lot d'images et renvoie leur forme traitée. Dans le cas de VGG-16, les images sont normalisées, et une certaine valeur moyenne prédéfinie pour chaque canal est soustraite. Cela s'explique par le fait que VGG-16 a été initialement entraîné avec ce pré-traitement.\n",
|
||||
"* Le réseau de neurones est appliqué au lot d'entrée, et nous recevons en résultat un lot de tenseurs à 1000 éléments qui montrent la probabilité de chaque classe. Nous pouvons trouver le numéro de la classe la plus probable en appelant `argmax` sur ce tenseur.\n",
|
||||
"* Le résultat obtenu est un [numéro d'une classe `ImageNet`](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Pour donner un sens à ce résultat, nous pouvons également utiliser la fonction `decode_predictions`, qui retourne les n meilleures classes accompagnées de leurs noms.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Voyons également l'architecture du réseau VGG-16 :\n"
|
||||
"Voyons également l'architecture du réseau VGG-16 :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -597,9 +607,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Calculs sur GPU\n",
|
||||
"## Calculs GPU\n",
|
||||
"\n",
|
||||
"Les réseaux neuronaux profonds, comme le VGG-16 et d'autres architectures plus modernes, nécessitent une puissance de calcul considérable pour fonctionner. Il est donc logique d'utiliser l'accélération GPU, si elle est disponible. Heureusement, Keras accélère automatiquement les calculs sur le GPU lorsqu'il est disponible. Nous pouvons vérifier si Tensorflow est capable d'utiliser le GPU avec le code suivant :\n"
|
||||
"Les réseaux neuronaux profonds, tels que VGG-16 et d'autres architectures plus modernes, nécessitent beaucoup de puissance de calcul pour fonctionner. Il est donc judicieux d'utiliser l'accélération GPU, si elle est disponible. Heureusement, Keras accélère automatiquement les calculs sur le GPU si celui-ci est disponible. Nous pouvons vérifier si Tensorflow est capable d'utiliser le GPU avec le code suivant :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -626,9 +636,10 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Extraction des caractéristiques de VGG\n",
|
||||
"\n",
|
||||
"Si nous souhaitons utiliser VGG-16 pour extraire des caractéristiques de nos images, nous avons besoin du modèle sans les couches finales de classification. Nous pouvons instancier le modèle VGG-16 sans les couches supérieures en utilisant ce code :\n"
|
||||
"## Extraction des caractéristiques VGG\n",
|
||||
"\n",
|
||||
"Si nous voulons utiliser VGG-16 pour extraire des caractéristiques de nos images, nous avons besoin du modèle sans les couches finales de classification. Nous pouvons instancier le modèle VGG-16 sans les couches supérieures en utilisant ce code : \n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -680,9 +691,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"La dimension du tenseur de caractéristiques est de 7x7x512, mais pour le visualiser, nous avons dû le remodeler en une forme 2D.\n",
|
||||
"La dimension du tenseur de caractéristiques est de 7x7x512, mais pour pouvoir le visualiser, nous avons dû le remodeler en forme 2D.\n",
|
||||
"\n",
|
||||
"Voyons maintenant si ces caractéristiques peuvent être utilisées pour classer des images. Prenons manuellement une portion d'images (50 mini-lots, dans notre cas) et pré-calculons leurs vecteurs de caractéristiques. Nous pouvons utiliser l'API **dataset** de Tensorflow pour cela. La fonction `map` prend un dataset et applique une lambda-fonction donnée pour le transformer. Nous utilisons ce mécanisme pour construire de nouveaux datasets, `ds_features_train` et `ds_features_test`, qui contiennent les caractéristiques extraites par VGG au lieu des images originales.\n"
|
||||
"Maintenant, essayons de voir si ces caractéristiques peuvent être utilisées pour classer des images. Prenons manuellement une partie des images (50 mini-lots, dans notre cas) et pré-calculons leurs vecteurs de caractéristiques. Nous pouvons utiliser l'API **dataset** de Tensorflow pour cela. La fonction `map` prend un dataset et applique une fonction lambda donnée pour le transformer. Nous utilisons ce mécanisme pour construire de nouveaux datasets, `ds_features_train` et `ds_features_test`, qui contiennent des caractéristiques extraites par VGG au lieu des images originales.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -712,9 +723,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Nous avons utilisé la construction `.take(50)` pour limiter la taille du jeu de données, afin d'accélérer notre démonstration. Vous pouvez bien sûr effectuer cette expérience sur l'ensemble du jeu de données.\n",
|
||||
"Nous avons utilisé la construction `.take(50)` pour limiter la taille du jeu de données, afin d'accélérer notre démonstration. Vous pouvez bien sûr réaliser cette expérience sur l'ensemble du jeu de données.\n",
|
||||
"\n",
|
||||
"Maintenant que nous avons un jeu de données avec des caractéristiques extraites, nous pouvons entraîner un simple classificateur dense pour distinguer entre les chats et les chiens. Ce réseau prendra un vecteur de caractéristiques de forme (7,7,512) et produira une sortie correspondant soit à un chien, soit à un chat. Étant donné qu'il s'agit d'une classification binaire, nous utilisons la fonction d'activation `sigmoid` et la perte `binary_crossentropy`.\n"
|
||||
"Maintenant que nous avons un jeu de données avec des caractéristiques extraites, nous pouvons entraîner un classificateur dense simple pour distinguer les chats des chiens. Ce réseau prendra un vecteur de caractéristiques de forme (7,7,512), et produira une sortie correspondant soit à un chien, soit à un chat. Puisqu'il s'agit d'une classification binaire, nous utilisons la fonction d'activation `sigmoid` et la perte `binary_crossentropy`.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -743,13 +754,13 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Le résultat est excellent, nous pouvons distinguer un chat d'un chien avec une probabilité de presque 95 % ! Cependant, nous n'avons testé cette approche que sur un sous-ensemble de toutes les images, car l'extraction manuelle des caractéristiques semble prendre beaucoup de temps.\n",
|
||||
"Le résultat est excellent, nous pouvons distinguer entre un chat et un chien avec presque 95 % de probabilité ! Cependant, nous n'avons testé cette approche que sur un sous-ensemble de toutes les images, car l'extraction manuelle des caractéristiques semble prendre beaucoup de temps.\n",
|
||||
"\n",
|
||||
"## Apprentissage par transfert avec un réseau VGG\n",
|
||||
"## Apprentissage par transfert en utilisant un réseau VGG\n",
|
||||
"\n",
|
||||
"Nous pouvons également éviter de pré-calculer manuellement les caractéristiques en utilisant le réseau VGG-16 original dans son intégralité pendant l'entraînement, en ajoutant un extracteur de caractéristiques à notre réseau comme première couche.\n",
|
||||
"Nous pouvons également éviter de pré-calculer manuellement les caractéristiques en utilisant le réseau VGG-16 original dans son ensemble pendant l'entraînement, en ajoutant l'extracteur de caractéristiques à notre réseau comme première couche.\n",
|
||||
"\n",
|
||||
"La beauté de l'architecture Keras réside dans le fait que le modèle VGG-16 que nous avons défini ci-dessus peut également être utilisé comme une couche dans un autre réseau neuronal ! Il suffit de construire un réseau avec un classificateur dense au-dessus, puis d'entraîner l'ensemble du réseau en utilisant la rétropropagation.\n"
|
||||
"La beauté de l'architecture Keras est que le modèle VGG-16 que nous avons défini ci-dessus peut aussi être utilisé comme une couche dans un autre réseau neuronal ! Il nous suffit de construire un réseau avec un classificateur dense au-dessus, puis d'entraîner l'ensemble du réseau en utilisant la rétropropagation.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -793,13 +804,13 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Ce modèle ressemble à un réseau de classification de bout en bout, qui prend une image et retourne la classe correspondante. Cependant, la difficulté réside dans le fait que nous voulons que VGG16 agisse comme un extracteur de caractéristiques, et non qu'il soit réentraîné. Ainsi, nous devons **geler les poids de l'extracteur de caractéristiques convolutionnel**. Nous pouvons accéder à la première couche du réseau en appelant `model.layers[0]`, et il suffit de définir la propriété `trainable` sur `False`.\n",
|
||||
"Ce modèle ressemble à un réseau de classification de bout en bout, qui prend une image et renvoie la classe. Cependant, la difficulté est que nous voulons que VGG16 agisse comme un extracteur de caractéristiques, et ne soit pas réentraîné. Ainsi, nous devons **geler les poids de l'extracteur de caractéristiques convolutionnel**. Nous pouvons accéder à la première couche du réseau en appelant `model.layers[0]`, et nous devons simplement définir la propriété `trainable` sur `False`.\n",
|
||||
"\n",
|
||||
"> **Note** : Le gel des poids de l'extracteur de caractéristiques est nécessaire, car sinon la couche de classification non entraînée pourrait altérer les poids pré-entraînés de l'extracteur convolutionnel.\n",
|
||||
"> **Note** : Le gel des poids de l'extracteur de caractéristiques est nécessaire, car sinon la couche classifiante non entraînée peut détruire les poids pré-entraînés originaux de l'extracteur convolutionnel.\n",
|
||||
"\n",
|
||||
"Vous pouvez remarquer que, bien que le nombre total de paramètres dans notre réseau soit d'environ 15 millions, nous n'entraînons que 25 000 paramètres. Tous les autres paramètres des filtres convolutionnels de haut niveau sont pré-entraînés. C'est une bonne chose, car cela nous permet d'affiner un plus petit nombre de paramètres avec un plus petit nombre d'exemples.\n",
|
||||
"Vous pouvez remarquer que tandis que le nombre total de paramètres dans notre réseau est d'environ 15 millions, nous n'entraînons que 25k paramètres. Tous les autres paramètres des filtres convolutionnels de haut niveau sont pré-entraînés. C'est bien, car nous pouvons affiner un plus petit nombre de paramètres avec un nombre plus réduit d'exemples.\n",
|
||||
"\n",
|
||||
"Nous allons maintenant entraîner notre réseau et voir jusqu'où nous pouvons aller. Attendez-vous à un temps d'exécution assez long, et ne vous inquiétez pas si l'exécution semble figée pendant un certain temps.\n"
|
||||
"Nous allons maintenant entraîner notre réseau et voir à quel point nous pouvons l'améliorer. Attendez-vous à un temps d'exécution assez long, et ne vous inquiétez pas si l'exécution semble figée pendant un certain temps.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -824,11 +835,11 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Il semble que nous ayons obtenu un classificateur chats contre chiens assez précis !\n",
|
||||
"Il semble que nous ayons obtenu un classificateur chats vs. chiens raisonnablement précis ! \n",
|
||||
"\n",
|
||||
"## Sauvegarder et Charger le Modèle\n",
|
||||
"## Sauvegarde et chargement du modèle\n",
|
||||
"\n",
|
||||
"Une fois que nous avons entraîné le modèle, nous pouvons sauvegarder l'architecture du modèle et les poids entraînés dans un fichier pour une utilisation future :\n"
|
||||
"Une fois que nous avons entraîné le modèle, nous pouvons enregistrer l’architecture du modèle et les poids entraînés dans un fichier pour une utilisation future :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -852,7 +863,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Nous pouvons alors charger le modèle à partir du fichier à tout moment. Vous pourriez le trouver utile au cas où la prochaine expérience détruirait le modèle - vous n'auriez pas à recommencer depuis le début.\n"
|
||||
"Nous pouvons alors charger le modèle à partir du fichier à tout moment. Cela peut vous être utile au cas où la prochaine expérience détruirait le modèle - vous n’auriez pas à repartir de zéro.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -868,15 +879,15 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Ajustement fin de l'apprentissage par transfert\n",
|
||||
"## Affinage par apprentissage par transfert\n",
|
||||
"\n",
|
||||
"Dans la section précédente, nous avons entraîné la couche finale du classificateur pour classer les images de notre propre jeu de données. Cependant, nous n'avons pas réentraîné l'extracteur de caractéristiques, et notre modèle s'est appuyé sur les caractéristiques que le modèle a apprises à partir des données d'ImageNet. Si vos objets diffèrent visuellement des images ordinaires d'ImageNet, cette combinaison de caractéristiques pourrait ne pas être optimale. Il est donc logique de commencer à entraîner également les couches convolutionnelles.\n",
|
||||
"Dans la section précédente, nous avons entraîné la dernière couche de classification pour classer les images de notre propre jeu de données. Cependant, nous n'avons pas réentraîné l'extracteur de caractéristiques, et notre modèle s'est appuyé sur les caractéristiques que le modèle a apprises sur les données ImageNet. Si vos objets diffèrent visuellement des images ordinaires d’ImageNet, cette combinaison de caractéristiques pourrait ne pas être optimale. Il est donc logique de commencer à entraîner également les couches convolutionnelles.\n",
|
||||
"\n",
|
||||
"Pour ce faire, nous pouvons déverrouiller les paramètres des filtres convolutionnels que nous avions précédemment gelés.\n",
|
||||
"Pour cela, nous pouvons déverrouiller les paramètres des filtres convolutionnels que nous avions précédemment gelés.\n",
|
||||
"\n",
|
||||
"> **Note :** Il est important de geler les paramètres dans un premier temps et d'effectuer plusieurs époques d'entraînement afin de stabiliser les poids dans la couche de classification. Si vous commencez immédiatement à entraîner un réseau de bout en bout avec des paramètres dégelés, de grandes erreurs risquent de détruire les poids pré-entraînés dans les couches convolutionnelles.\n",
|
||||
"> **Note :** Il est important de geler les paramètres d'abord et d'effectuer plusieurs époques d'entraînement afin de stabiliser les poids dans la couche de classification. Si vous commencez immédiatement à entraîner le réseau de bout en bout avec des paramètres dégelés, de grandes erreurs risquent de détruire les poids pré-entraînés dans les couches convolutionnelles.\n",
|
||||
"\n",
|
||||
"Notre modèle convolutionnel VGG-16 se trouve dans la première couche, et il est lui-même composé de nombreuses couches. Nous pouvons examiner sa structure :\n"
|
||||
"Notre modèle convolutionnel VGG-16 est situé dans la première couche, et il est lui-même composé de nombreuses couches. Nous pouvons jeter un œil à sa structure : \n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -945,7 +956,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Nous pouvons dégeler toutes les couches de la base convolutionnelle :\n"
|
||||
"Nous pouvons débloquer toutes les couches de la base convolutionnelle :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -961,7 +972,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Cependant, décongeler tous en même temps n'est pas la meilleure idée. Nous pouvons d'abord décongeler seulement quelques dernières couches de convolutions, car elles contiennent des motifs de niveau supérieur qui sont pertinents pour nos images. Par exemple, pour commencer, nous pouvons congeler toutes les couches sauf les 4 dernières :\n"
|
||||
"Cependant, décongeler tous ces calques d'un coup n'est pas la meilleure idée. Nous pouvons d'abord décongeler seulement quelques couches finales de convolutions, car elles contiennent des motifs de niveau supérieur qui sont pertinents pour nos images. Par exemple, pour commencer, nous pouvons congeler toutes les couches sauf les 4 dernières : \n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1000,11 +1011,11 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"On observe que le nombre de paramètres entraînables a considérablement augmenté, mais il reste encore autour de 50 % de tous les paramètres.\n",
|
||||
"Observez que le nombre de paramètres entraînables a augmenté de manière significative, mais il reste encore autour de 50 % de tous les paramètres.\n",
|
||||
"\n",
|
||||
"Après avoir dégelé les couches, nous pouvons effectuer quelques époques supplémentaires d'entraînement (dans notre exemple, nous n'en ferons qu'une seule). Vous pouvez également choisir un taux d'apprentissage plus faible afin de minimiser l'impact sur les poids pré-entraînés. Cependant, même avec un taux d'apprentissage faible, il est normal de constater une baisse de précision au début de l'entraînement, avant d'atteindre finalement un niveau légèrement supérieur à celui obtenu avec des poids fixes.\n",
|
||||
"Après avoir débloqué, nous pouvons faire quelques epochs supplémentaires d'entraînement (dans notre exemple, nous en ferons juste un). Vous pouvez également sélectionner un taux d'apprentissage plus faible, afin de minimiser l'impact sur les poids pré-entraînés. Cependant, même avec un taux d'apprentissage faible, vous pouvez vous attendre à ce que la précision baisse au début de l'entraînement, jusqu'à atteindre enfin un niveau légèrement supérieur à celui du cas des poids fixes.\n",
|
||||
"\n",
|
||||
"> **Note :** Cet entraînement est beaucoup plus lent, car il faut propager les gradients à travers de nombreuses couches du réseau !\n"
|
||||
"> **Note :** Cet entraînement se déroule beaucoup plus lentement, car nous devons propager les gradients vers l'arrière à travers de nombreuses couches du réseau !\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1028,9 +1039,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Nous sommes susceptibles d'obtenir une meilleure précision d'entraînement, car nous utilisons un réseau plus puissant avec davantage de paramètres, mais la précision de validation n'augmentera pas autant.\n",
|
||||
"Nous avons de fortes chances d’atteindre une précision d’entraînement plus élevée, car nous utilisons un réseau plus puissant avec plus de paramètres, mais la précision de validation n'augmenterait pas autant.\n",
|
||||
"\n",
|
||||
"N'hésitez pas à débloquer quelques couches supplémentaires du réseau et à entraîner davantage, pour voir si vous pouvez atteindre une meilleure précision !\n"
|
||||
"N’hésitez pas à dégeler quelques couches supplémentaires du réseau et à entraîner davantage, pour voir si vous pouvez obtenir une précision plus élevée !\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1039,7 +1050,7 @@
|
|||
"source": [
|
||||
"## Autres modèles de vision par ordinateur\n",
|
||||
"\n",
|
||||
"VGG-16 est l'une des architectures de vision par ordinateur les plus simples. Keras propose de nombreux autres réseaux pré-entraînés. Parmi les plus utilisés, on trouve les architectures **ResNet**, développées par Microsoft, et **Inception** par Google. Par exemple, explorons l'architecture du modèle ResNet-50 le plus simple (ResNet est une famille de modèles avec différentes profondeurs, vous pouvez essayer de travailler avec ResNet-152 si vous voulez voir à quoi ressemble un modèle vraiment profond) :\n"
|
||||
"VGG-16 est l’une des architectures de vision par ordinateur les plus simples. Keras fournit de nombreux autres réseaux pré-entraînés. Parmi les plus fréquemment utilisés, on trouve les architectures **ResNet**, développées par Microsoft, et **Inception** par Google. Par exemple, explorons l’architecture du modèle ResNet-50 le plus simple (ResNet est une famille de modèles avec différentes profondeurs, vous pouvez essayer d’expérimenter avec ResNet-152 si vous voulez voir à quoi ressemble un modèle vraiment profond) :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1441,11 +1452,11 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Comme vous pouvez le voir, le modèle contient les mêmes blocs de construction familiers : des couches de convolution, des couches de pooling et un classificateur dense final. Nous pouvons utiliser ce modèle exactement de la même manière que nous avons utilisé VGG-16 pour l'apprentissage par transfert. Vous pouvez essayer d'expérimenter avec le code ci-dessus, en utilisant différents modèles ResNet comme modèle de base, et observer comment la précision évolue.\n",
|
||||
"Comme vous pouvez le voir, le modèle contient les mêmes blocs de construction familiers : les couches convolutionnelles, les couches de mise en commun et le classificateur dense final. Nous pouvons utiliser ce modèle exactement de la même manière que nous avons utilisé VGG-16 pour l'apprentissage par transfert. Vous pouvez essayer d'expérimenter avec le code ci-dessus, en utilisant différents modèles ResNet comme modèle de base, et voir comment la précision évolue.\n",
|
||||
"\n",
|
||||
"## Normalisation par lot\n",
|
||||
"\n",
|
||||
"Ce réseau contient un autre type de couche : **la normalisation par lot**. L'idée de la normalisation par lot est de ramener les valeurs qui traversent le réseau neuronal dans le bon intervalle. En général, les réseaux neuronaux fonctionnent mieux lorsque toutes les valeurs se situent dans la plage [-1,1] ou [0,1], et c'est pour cette raison que nous mettons à l'échelle/normalisons nos données d'entrée en conséquence. Cependant, pendant l'entraînement d'un réseau profond, il peut arriver que les valeurs sortent significativement de cette plage, ce qui rend l'entraînement problématique. La couche de normalisation par lot calcule la moyenne et l'écart type pour toutes les valeurs du minibatch actuel, et les utilise pour normaliser le signal avant de le faire passer à travers une couche du réseau neuronal. Cela améliore considérablement la stabilité des réseaux profonds.\n"
|
||||
"Ce réseau contient un autre type de couche : la **Normalisation par lot (Batch Normalization)**. L'idée de la normalisation par lot est de ramener les valeurs qui circulent dans le réseau neuronal dans le bon intervalle. Habituellement, les réseaux neuronaux fonctionnent mieux lorsque toutes les valeurs sont dans l'intervalle [-1,1] ou [0,1], et c'est la raison pour laquelle nous mettons à l'échelle/normalisons nos données d'entrée en conséquence. Cependant, pendant l'entraînement d'un réseau profond, il peut arriver que les valeurs sortent significativement de cet intervalle, ce qui rend l'entraînement problématique. La couche de normalisation par lot calcule la moyenne et l'écart type de toutes les valeurs du mini-lot courant, et les utilise pour normaliser le signal avant de le transmettre à travers une couche du réseau neuronal. Cela améliore considérablement la stabilité des réseaux profonds.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1454,16 +1465,16 @@
|
|||
"source": [
|
||||
"## À retenir\n",
|
||||
"\n",
|
||||
"En utilisant l'apprentissage par transfert, nous avons pu rapidement créer un classificateur pour notre tâche de classification d'objets personnalisés et obtenir une grande précision. Cependant, cet exemple n'était pas totalement équitable, car le réseau VGG-16 original avait été pré-entraîné pour reconnaître les chats et les chiens, et nous avons donc simplement réutilisé la plupart des motifs déjà présents dans le réseau. Vous pouvez vous attendre à une précision moindre pour des objets plus spécifiques à des domaines exotiques, comme des détails sur une ligne de production dans une usine ou différentes feuilles d'arbres.\n",
|
||||
"En utilisant l'apprentissage par transfert, nous avons pu rapidement assembler un classifieur pour notre tâche personnalisée de classification d'objets, et atteindre une grande précision. Cependant, cet exemple n'était pas complètement juste, car le réseau VGG-16 original avait été pré-entraîné pour reconnaître des chats et des chiens, et ainsi, nous réutilisions principalement des motifs déjà présents dans le réseau. Vous pouvez vous attendre à une précision moindre pour des objets plus exotiques spécifiques à un domaine, comme des détails sur une ligne de production dans une usine, ou différentes feuilles d'arbres.\n",
|
||||
"\n",
|
||||
"Vous pouvez constater que les tâches plus complexes que nous résolvons maintenant nécessitent une puissance de calcul plus élevée et ne peuvent pas être facilement exécutées sur le CPU. Dans la prochaine unité, nous essayerons d'utiliser une implémentation plus légère pour entraîner le même modèle en utilisant des ressources de calcul réduites, ce qui entraîne une baisse de précision seulement marginale.\n"
|
||||
"Vous pouvez constater que les tâches plus complexes que nous résolvons maintenant nécessitent une puissance de calcul plus élevée, et ne peuvent pas être facilement résolues sur le CPU. Dans l'unité suivante, nous essayerons d'utiliser une mise en œuvre plus légère pour entraîner le même modèle avec des ressources de calcul moindres, ce qui entraîne une précision légèrement inférieure.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**Avertissement** : \nCe document a été traduit à l'aide du service de traduction automatique [Co-op Translator](https://github.com/Azure/co-op-translator). Bien que nous nous efforcions d'assurer l'exactitude, veuillez noter que les traductions automatisées peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue d'origine doit être considéré comme la source faisant autorité. Pour des informations critiques, il est recommandé de recourir à une traduction professionnelle effectuée par un humain. Nous déclinons toute responsabilité en cas de malentendus ou d'interprétations erronées résultant de l'utilisation de cette traduction.\n"
|
||||
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**Avertissement** :\nCe document a été traduit à l'aide du service de traduction automatique [Co-op Translator](https://github.com/Azure/co-op-translator). Bien que nous nous efforçions d'assurer l'exactitude, veuillez noter que les traductions automatisées peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue native doit être considéré comme la source faisant autorité. Pour les informations critiques, il est recommandé de recourir à une traduction professionnelle réalisée par un humain. Nous ne saurions être tenus responsables des malentendus ou erreurs d'interprétation découlant de l'utilisation de cette traduction.\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-31T14:35:45+00:00",
|
||||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb",
|
||||
"language_code": "fr"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
|
|
|||
|
|
@ -1,69 +1,73 @@
|
|||
# Traitement du Langage Naturel
|
||||
|
||||

|
||||

|
||||
|
||||
Dans cette section, nous allons nous concentrer sur l'utilisation des réseaux neuronaux pour traiter des tâches liées au **Traitement du Langage Naturel (NLP)**. Il existe de nombreux problèmes NLP que nous souhaitons que les ordinateurs soient capables de résoudre :
|
||||
Dans cette section, nous allons nous concentrer sur l’utilisation des réseaux de neurones pour traiter les tâches liées au **Traitement du Langage Naturel (TLN)**. Il existe de nombreux problèmes du TLN que nous souhaitons que les ordinateurs puissent résoudre :
|
||||
|
||||
* **Classification de texte** : un problème classique de classification appliqué aux séquences de texte. Par exemple, classer des e-mails comme spam ou non-spam, ou catégoriser des articles en sport, économie, politique, etc. De plus, lors du développement de chatbots, il est souvent nécessaire de comprendre ce que l'utilisateur veut dire — dans ce cas, il s'agit de **classification d'intention**. Souvent, dans la classification d'intention, nous devons gérer de nombreuses catégories.
|
||||
* **Analyse de sentiment** : un problème typique de régression, où il faut attribuer un score (un sentiment) correspondant à la positivité/négativité d'une phrase. Une version plus avancée de l'analyse de sentiment est l'**analyse de sentiment basée sur les aspects** (ABSA), où le sentiment est attribué non pas à l'ensemble de la phrase, mais à différentes parties (aspects), par exemple : *Dans ce restaurant, j'ai aimé la cuisine, mais l'ambiance était horrible*.
|
||||
* **Reconnaissance d'entités nommées** (NER) : extraire certaines entités d'un texte. Par exemple, dans la phrase *Je dois prendre un vol pour Paris demain*, le mot *demain* fait référence à une DATE, et *Paris* est une LOCALISATION.
|
||||
* **Extraction de mots-clés** : similaire à la NER, mais ici, il s'agit d'extraire automatiquement les mots importants pour le sens de la phrase, sans pré-entraînement pour des types d'entités spécifiques.
|
||||
* **Regroupement de texte** : utile pour regrouper des phrases similaires, par exemple, des demandes similaires dans des conversations de support technique.
|
||||
* **Questions-réponses** : capacité d'un modèle à répondre à une question spécifique. Le modèle reçoit un passage de texte et une question en entrée, et doit fournir un endroit dans le texte où se trouve la réponse (ou, parfois, générer la réponse textuelle).
|
||||
* **Génération de texte** : capacité d'un modèle à générer du nouveau texte. Cela peut être considéré comme une tâche de classification qui prédit la lettre/mot suivant en fonction d'un *texte d'amorce*. Les modèles avancés de génération de texte, comme GPT-3, peuvent résoudre d'autres tâches NLP telles que la classification en utilisant une technique appelée [programmation par prompt](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) ou [ingénierie de prompt](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29).
|
||||
* **Résumé de texte** : technique permettant à un ordinateur de "lire" un texte long et de le résumer en quelques phrases.
|
||||
* **Traduction automatique** : peut être vue comme une combinaison de compréhension de texte dans une langue et de génération de texte dans une autre.
|
||||
* **Classification de texte** est un problème typique de classification concernant les séquences de texte. Par exemple, classer les messages électroniques comme spam ou non-spam, ou catégoriser les articles en sport, affaires, politique, etc. De plus, lors du développement de chatbots, nous devons souvent comprendre ce que l’utilisateur voulait dire – dans ce cas, nous traitons de la **classification d’intention**. Souvent, pour la classification d’intention, nous devons gérer de nombreuses catégories.
|
||||
* **Analyse de sentiment** est un problème typique de régression, où nous devons attribuer un nombre (un sentiment) correspondant à quel point le sens d’une phrase est positif/négatif. Une version plus avancée de l’analyse de sentiment est l’**analyse de sentiment basée sur les aspects** (ABSA), où nous attribuons le sentiment non pas à toute la phrase, mais à différentes parties de celle-ci (les aspects), par ex. *Dans ce restaurant, j’ai aimé la cuisine, mais l’atmosphère était horrible*.
|
||||
* **Reconnaissance d’entités nommées** (NER) fait référence au problème d’extraire certaines entités du texte. Par exemple, nous devons comprendre que dans la phrase *Je dois prendre l’avion pour Paris demain*, le mot *demain* fait référence à une DATE, et *Paris* est un LIEU.
|
||||
* **Extraction de mots-clés** est similaire à la NER, mais nous devons extraire automatiquement des mots importants pour le sens de la phrase, sans pré-entraînement pour des types d’entités spécifiques.
|
||||
* **Regroupement de textes** peut être utile lorsque nous voulons regrouper des phrases similaires, par exemple, des demandes similaires dans des conversations de support technique.
|
||||
* **Réponse à des questions** fait référence à la capacité d’un modèle à répondre à une question spécifique. Le modèle reçoit en entrée un passage de texte et une question, et doit fournir un endroit dans le texte où la réponse à la question se trouve (ou, parfois, générer le texte de la réponse).
|
||||
* **Génération de texte** est la capacité d’un modèle à générer un nouveau texte. Cela peut être considéré comme une tâche de classification qui prédit la lettre/mot suivant basé sur une *invite de texte*. Les modèles avancés de génération de texte, tels que GPT-3, sont capables de résoudre d’autres tâches du TLN, comme la classification, en utilisant une technique appelée [programmation par invite](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) ou [ingénierie des invites](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29)
|
||||
* **Résumé de texte** est une technique lorsque nous voulons qu’un ordinateur "lise" un long texte et le résume en quelques phrases.
|
||||
* **Traduction automatique** peut être vue comme une combinaison de compréhension de texte dans une langue et de génération de texte dans une autre.
|
||||
|
||||
À l'origine, la plupart des tâches NLP étaient résolues à l'aide de méthodes traditionnelles comme les grammaires. Par exemple, en traduction automatique, des analyseurs syntaxiques étaient utilisés pour transformer une phrase initiale en un arbre syntaxique, puis des structures sémantiques de haut niveau étaient extraites pour représenter le sens de la phrase. À partir de ce sens et de la grammaire de la langue cible, le résultat était généré. Aujourd'hui, de nombreuses tâches NLP sont plus efficacement résolues à l'aide de réseaux neuronaux.
|
||||
Initialement, la plupart des tâches du TLN étaient résolues à l’aide de méthodes traditionnelles telles que les grammaires. Par exemple, en traduction automatique, des analyseurs syntaxiques étaient utilisés pour transformer la phrase initiale en un arbre syntaxique, puis des structures sémantiques de niveau supérieur étaient extraites pour représenter le sens de la phrase, et sur la base de ce sens et de la grammaire de la langue cible, le résultat était généré. Aujourd’hui, de nombreuses tâches de TLN sont plus efficacement résolues à l’aide de réseaux de neurones.
|
||||
|
||||
> De nombreuses méthodes NLP classiques sont implémentées dans la bibliothèque Python [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org). Un excellent [livre NLTK](https://www.nltk.org/book/) est disponible en ligne et explique comment résoudre différentes tâches NLP avec NLTK.
|
||||
> De nombreuses méthodes classiques du TLN sont implémentées dans la bibliothèque Python [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org). Il existe un excellent [livre NLTK](https://www.nltk.org/book/) disponible en ligne qui couvre comment différentes tâches du TLN peuvent être résolues avec NLTK.
|
||||
|
||||
Dans notre cours, nous nous concentrerons principalement sur l'utilisation des réseaux neuronaux pour le NLP, et nous utiliserons NLTK si nécessaire.
|
||||
Dans notre cours, nous nous concentrerons principalement sur l’utilisation des réseaux de neurones pour le TLN, et nous utiliserons NLTK si nécessaire.
|
||||
|
||||
Nous avons déjà appris à utiliser les réseaux neuronaux pour traiter des données tabulaires et des images. La principale différence entre ces types de données et le texte est que le texte est une séquence de longueur variable, tandis que la taille d'entrée pour les images est connue à l'avance. Bien que les réseaux convolutionnels puissent extraire des motifs des données d'entrée, les motifs dans le texte sont plus complexes. Par exemple, une négation peut être séparée du sujet par de nombreux mots (par exemple : *Je n'aime pas les oranges* vs. *Je n'aime pas ces grandes oranges colorées et savoureuses*), et cela doit toujours être interprété comme un seul motif. Ainsi, pour traiter le langage, nous devons introduire de nouveaux types de réseaux neuronaux, tels que les *réseaux récurrents* et les *transformers*.
|
||||
Nous avons déjà appris à utiliser les réseaux de neurones pour traiter des données tabulaires et des images. La principale différence entre ces types de données et le texte est que le texte est une séquence de longueur variable, tandis que la taille d’entrée dans le cas des images est connue à l’avance. Alors que les réseaux convolutifs peuvent extraire des motifs des données d’entrée, les motifs dans le texte sont plus complexes. Par exemple, une négation peut être séparée du sujet par un nombre arbitraire de mots (par ex. *Je n’aime pas les oranges*, vs. *Je n’aime pas ces grosses oranges colorées et savoureuses*), et cela devrait toujours être interprété comme un seul motif. Ainsi, pour gérer le langage, nous devons introduire de nouveaux types de réseaux de neurones, tels que les *réseaux récurrents* et les *transformers*.
|
||||
|
||||
## Installer les bibliothèques
|
||||
|
||||
Si vous utilisez une installation Python locale pour suivre ce cours, vous devrez peut-être installer toutes les bibliothèques nécessaires pour le NLP en utilisant les commandes suivantes :
|
||||
Si vous utilisez une installation locale de Python pour suivre ce cours, vous devrez peut-être installer toutes les bibliothèques nécessaires pour le TLN en utilisant les commandes suivantes :
|
||||
|
||||
**Pour PyTorch**
|
||||
**Pour PyTorch**
|
||||
```bash
|
||||
pip install -r requirements-torch.txt
|
||||
```
|
||||
**Pour TensorFlow**
|
||||
pip install -r requirements-pytorch.txt
|
||||
```
|
||||
**Pour TensorFlow**
|
||||
```bash
|
||||
pip install -r requirements-tf.txt
|
||||
```
|
||||
```
|
||||
|
||||
> Vous pouvez essayer le NLP avec TensorFlow sur [Microsoft Learn](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste)
|
||||
> Vous pouvez essayer le TLN avec TensorFlow sur [Microsoft Learn](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste)
|
||||
|
||||
## Avertissement sur le GPU
|
||||
## Avertissement GPU
|
||||
|
||||
Dans cette section, certains exemples nécessiteront l'entraînement de modèles assez volumineux.
|
||||
* **Utilisez un ordinateur avec GPU** : Il est conseillé d'exécuter vos notebooks sur un ordinateur équipé d'un GPU pour réduire les temps d'attente lors de l'entraînement de grands modèles.
|
||||
* **Contraintes de mémoire GPU** : L'utilisation d'un GPU peut entraîner des situations où la mémoire GPU est insuffisante, en particulier lors de l'entraînement de grands modèles.
|
||||
* **Consommation de mémoire GPU** : La quantité de mémoire GPU consommée pendant l'entraînement dépend de plusieurs facteurs, notamment la taille des mini-lots.
|
||||
* **Réduisez la taille des mini-lots** : Si vous rencontrez des problèmes de mémoire GPU, envisagez de réduire la taille des mini-lots dans votre code comme solution potentielle.
|
||||
* **Libération de mémoire GPU avec TensorFlow** : Les anciennes versions de TensorFlow peuvent ne pas libérer correctement la mémoire GPU lors de l'entraînement de plusieurs modèles dans un même noyau Python. Pour gérer efficacement l'utilisation de la mémoire GPU, vous pouvez configurer TensorFlow pour allouer la mémoire GPU uniquement en cas de besoin.
|
||||
* **Inclusion de code** : Pour configurer TensorFlow afin qu'il alloue la mémoire GPU uniquement lorsque nécessaire, incluez le code suivant dans vos notebooks :
|
||||
Dans cette section, dans certains exemples, nous entraînerons des modèles assez volumineux.
|
||||
* **Utilisez un ordinateur équipé d’un GPU** : Il est conseillé d’exécuter vos notebooks sur un ordinateur doté d’un GPU pour réduire les temps d’attente lors du travail avec de grands modèles.
|
||||
* **Contraintes de mémoire GPU** : L’exécution sur GPU peut entraîner des situations où la mémoire GPU est insuffisante, notamment lors de l’entraînement de grands modèles.
|
||||
* **Consommation de mémoire GPU** : La quantité de mémoire GPU consommée pendant l’entraînement dépend de plusieurs facteurs, dont la taille du minibatch.
|
||||
* **Réduire la taille du minibatch** : Si vous rencontrez des problèmes de mémoire GPU, envisagez de réduire la taille du minibatch dans votre code comme solution possible.
|
||||
* **Libération de la mémoire GPU dans TensorFlow** : Les versions plus anciennes de TensorFlow ne libèrent pas correctement la mémoire GPU lors de l’entraînement de plusieurs modèles dans un même noyau Python. Pour gérer efficacement l’utilisation de la mémoire GPU, vous pouvez configurer TensorFlow pour qu’il alloue la mémoire GPU uniquement au besoin.
|
||||
* **Inclusion du code** : Pour configurer TensorFlow de façon à ce qu’il augmente l’allocation de mémoire GPU uniquement quand cela est nécessaire, incluez le code suivant dans vos notebooks :
|
||||
|
||||
```python
|
||||
physical_devices = tf.config.list_physical_devices('GPU')
|
||||
if len(physical_devices)>0:
|
||||
tf.config.experimental.set_memory_growth(physical_devices[0], True)
|
||||
```
|
||||
```
|
||||
|
||||
Si vous souhaitez apprendre le NLP sous l'angle des méthodes classiques de ML, visitez [cette série de leçons](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP).
|
||||
Si vous souhaitez apprendre le TLN d’un point de vue classique du ML, visitez [cette série de leçons](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP)
|
||||
|
||||
## Dans cette section
|
||||
Dans cette section, nous apprendrons :
|
||||
Dans cette section, nous apprendrons à propos de :
|
||||
|
||||
* [Représenter le texte sous forme de tenseurs](13-TextRep/README.md)
|
||||
* [Word Embeddings](14-Emdeddings/README.md)
|
||||
* [Modélisation de langage](15-LanguageModeling/README.md)
|
||||
* [Réseaux neuronaux récurrents](16-RNN/README.md)
|
||||
* [Réseaux génératifs](17-GenerativeNetworks/README.md)
|
||||
* [Transformers](18-Transformers/README.md)
|
||||
* [Représentation du texte sous forme de tenseurs](13-TextRep/README.md)
|
||||
* [Word Embeddings](14-Emdeddings/README.md)
|
||||
* [Modélisation du langage](15-LanguageModeling/README.md)
|
||||
* [Réseaux de neurones récurrents](16-RNN/README.md)
|
||||
* [Réseaux génératifs](17-GenerativeNetworks/README.md)
|
||||
* [Transformers](18-Transformers/README.md)
|
||||
|
||||
**Avertissement** :
|
||||
Ce document a été traduit à l'aide du service de traduction automatique [Co-op Translator](https://github.com/Azure/co-op-translator). Bien que nous nous efforcions d'assurer l'exactitude, veuillez noter que les traductions automatisées peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue d'origine doit être considéré comme la source faisant autorité. Pour des informations critiques, il est recommandé de recourir à une traduction humaine professionnelle. Nous déclinons toute responsabilité en cas de malentendus ou d'interprétations erronées résultant de l'utilisation de cette traduction.
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**Avertissement** :
|
||||
Ce document a été traduit à l'aide du service de traduction automatique [Co-op Translator](https://github.com/Azure/co-op-translator). Bien que nous nous efforçions d'assurer l'exactitude, veuillez noter que les traductions automatisées peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue native doit être considéré comme la source faisant autorité. Pour les informations critiques, il est recommandé de recourir à une traduction professionnelle réalisée par un humain. Nous ne saurions être tenus responsables des malentendus ou erreurs d'interprétation découlant de l'utilisation de cette traduction.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -5,6 +5,12 @@
|
|||
"source_file": "AGENTS.md",
|
||||
"language_code": "he"
|
||||
},
|
||||
"CONTRIBUTING.md": {
|
||||
"original_hash": "c6fd7e781b67111a90abd166d0ce4aa0",
|
||||
"translation_date": "2026-07-08T16:18:27+00:00",
|
||||
"source_file": "CONTRIBUTING.md",
|
||||
"language_code": "he"
|
||||
},
|
||||
"README.md": {
|
||||
"original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b",
|
||||
"translation_date": "2026-04-06T20:24:48+00:00",
|
||||
|
|
@ -17,6 +23,30 @@
|
|||
"source_file": "SECURITY.md",
|
||||
"language_code": "he"
|
||||
},
|
||||
"__translation_failures__": {
|
||||
"lessons/0-course-setup/how-to-run.md": {
|
||||
"original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1",
|
||||
"source_file": "lessons/0-course-setup/how-to-run.md",
|
||||
"language_code": "he",
|
||||
"failure_date": "2026-07-08T16:02:02+00:00",
|
||||
"status": "failed",
|
||||
"error_type": "TranslationIncompleteError",
|
||||
"error_message": "Markdown translation remained incomplete for chunk 1 of 'how-to-run.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": "he",
|
||||
"failure_date": "2026-07-08T16:07:36+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-28T20:13:31+00:00",
|
||||
|
|
@ -54,8 +84,8 @@
|
|||
"language_code": "he"
|
||||
},
|
||||
"examples/README.md": {
|
||||
"original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7",
|
||||
"translation_date": "2025-10-03T11:32:11+00:00",
|
||||
"original_hash": "7883d52c2e2a221e0b07a7b112a149b9",
|
||||
"translation_date": "2026-07-08T16:01:05+00:00",
|
||||
"source_file": "examples/README.md",
|
||||
"language_code": "he"
|
||||
},
|
||||
|
|
@ -191,6 +221,12 @@
|
|||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md",
|
||||
"language_code": "he"
|
||||
},
|
||||
"lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": {
|
||||
"original_hash": "99b816b6a4957ef4100cee4c4221dff9",
|
||||
"translation_date": "2026-07-08T15:56:57+00:00",
|
||||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb",
|
||||
"language_code": "he"
|
||||
},
|
||||
"lessons/4-ComputerVision/08-TransferLearning/lab/README.md": {
|
||||
"original_hash": "7765935c35fcee69b9fe2d0cfd6963e2",
|
||||
"translation_date": "2025-08-28T19:29:33+00:00",
|
||||
|
|
@ -330,8 +366,8 @@
|
|||
"language_code": "he"
|
||||
},
|
||||
"lessons/5-NLP/README.md": {
|
||||
"original_hash": "8ef02a9318257ea140ed3ed74442096d",
|
||||
"translation_date": "2025-08-28T19:58:00+00:00",
|
||||
"original_hash": "038df6f1a73e49f6430740da083bfd6d",
|
||||
"translation_date": "2026-07-08T16:02:43+00:00",
|
||||
"source_file": "lessons/5-NLP/README.md",
|
||||
"language_code": "he"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -0,0 +1,29 @@
|
|||
# לתרום ל-AI-For-Beginners
|
||||
|
||||
תודה על העניין שלך לתרום ל-AI-For-Beginners! אנו מקבלים בברכה תרגומים, תיקוני שיעורים ותיקוני עיצוב.
|
||||
|
||||
## הסכם רישיון תורם של מיקרוסופט (CLA)
|
||||
|
||||
פרויקט זה מקבל תרומות והצעות. רוב התרומות דורשות ממך להסכים להסכם רישיון תורם (CLA) שמצהיר שיש לך את הזכות, ובאמת מעניק לנו את הזכויות להשתמש בתרומתך. לפרטים, בקר ב-[https://cla.microsoft.com](https://cla.microsoft.com).
|
||||
|
||||
כאשר תגיש בקשת משיכה, הרובוט CLA יחליט אוטומטית האם עליך לספק CLA ויקשט את הבקשה בהתאם (למשל, תג, הערה). פשוט פעל לפי ההוראות שמספק הרובוט. תצטרך לעשות זאת רק פעם אחת בכל המאגרי מידע שמשתמשים ב-CLA שלנו.
|
||||
|
||||
## איך לתרום
|
||||
|
||||
### 1. תיקון שגיאות הקלדה / קוד
|
||||
אם מצאת טעות הקלדה או באג בכל פנקס Jupyter או בקובץ סימון של שיעור:
|
||||
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,31 +1,31 @@
|
|||
# דוגמאות AI ידידותיות למתחילים
|
||||
# דוגמאות ידידותיות למתחילים בבינה מלאכותית
|
||||
|
||||
ברוכים הבאים! ספרייה זו מכילה דוגמאות פשוטות ועצמאיות שיעזרו לכם להתחיל עם AI ולמידת מכונה. כל דוגמה תוכננה להיות ידידותית למתחילים עם הערות מפורטות והסברים שלב אחר שלב.
|
||||
ברוכים הבאים! תיקייה זו מכילה דוגמאות פשוטות ועצמאיות שיעזרו לכם להתחיל עם בינה מלאכותית ולמידת מכונה. כל דוגמה מעוצבת להיות ידידותית למתחילים עם הערות מפורטות והסברים שלב-אחר-שלב.
|
||||
|
||||
## 📚 סקירת דוגמאות
|
||||
|
||||
| דוגמה | תיאור | רמת קושי | דרישות מקדימות |
|
||||
|-------|-------|----------|-----------------|
|
||||
| [Hello AI World](../../../examples/01-hello-ai-world.py) | תוכנית ה-AI הראשונה שלכם - זיהוי תבניות פשוט | ⭐ מתחילים | יסודות Python |
|
||||
| [Simple Neural Network](../../../examples/02-simple-neural-network.py) | בניית רשת נוירונים מאפס | ⭐⭐ מתחילים+ | Python, מתמטיקה בסיסית |
|
||||
| [Image Classifier](./03-image-classifier.ipynb) | סיווג תמונות עם מודל מאומן מראש | ⭐⭐ מתחילים+ | Python, numpy |
|
||||
| [Text Sentiment](../../../examples/04-text-sentiment.py) | ניתוח רגשות בטקסט (חיובי/שלילי) | ⭐⭐ מתחילים+ | Python |
|
||||
| דוגמה | תיאור | רמת קושי | דרישות מוקדמות |
|
||||
|---------|-------------|------------|---------------|
|
||||
| [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) | ניתוח סנטימנט של טקסט (חיובי/שלילי) | ⭐⭐ מתחילים+ | פייתון |
|
||||
|
||||
## 🚀 איך מתחילים
|
||||
## 🚀 התחלה
|
||||
|
||||
### דרישות מקדימות
|
||||
### דרישות מוקדמות
|
||||
|
||||
וודאו ש-Python מותקן אצלכם (מומלץ גרסה 3.8 או גבוהה יותר). התקינו את החבילות הנדרשות:
|
||||
ודא שיש לך פייתון מותקן (מומלץ גרסה 3.8 ומעלה). התקן את החבילות הנדרשות:
|
||||
|
||||
```bash
|
||||
# For Python scripts
|
||||
# לסקריפטים של פייתון
|
||||
pip install numpy
|
||||
|
||||
# For Jupyter notebooks (image classifier)
|
||||
# למחברות ג'ופיטר (מסווג תמונות)
|
||||
pip install jupyter numpy pillow tensorflow
|
||||
```
|
||||
|
||||
או השתמשו בסביבת conda מתוך תוכנית הלימודים הראשית:
|
||||
או השתמש בסביבת conda מתוך תוכנית הלימודים הראשית:
|
||||
|
||||
```bash
|
||||
conda env create --name ai4beg --file ../environment.yml
|
||||
|
|
@ -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. **נסו את מסווג התמונות** - ראו את ה-AI בפעולה עם תמונות אמיתיות
|
||||
4. **נתחו רגשות בטקסט** - חקרו עיבוד שפה טבעית
|
||||
1. **התחל עם "Hello AI World"** - למד את יסודות זיהוי התבניות
|
||||
2. **בנה רשת עצבית פשוטה** - הבן כיצד רשתות עצביות פועלות
|
||||
3. **נסה את המסווג תמונות** - ראה בינה מלאכותית בפעולה עם תמונות אמיתיות
|
||||
4. **נתח סנטימנט טקסט** - חקור עיבוד שפה טבעית
|
||||
|
||||
## 💡 טיפים למתחילים
|
||||
|
||||
- **קראו את הערות הקוד בקפידה** - הן מסבירות מה כל שורה עושה
|
||||
- **נסו להתנסות!** - שנו ערכים וראו מה קורה
|
||||
- **אל תדאגו אם לא תבינו הכל** - הלמידה לוקחת זמן
|
||||
- **שאלו שאלות** - השתמשו ב-[לוח הדיונים](https://github.com/microsoft/AI-For-Beginners/discussions)
|
||||
- **קרא את ההערות בקוד בקפידה** - הן מסבירות מה כל שורה עושה
|
||||
- **תנסה!** - נסה לשנות ערכים וראה מה קורה
|
||||
- **אל תדאג אם לא תבין הכל מיד** - למידה לוקחת זמן
|
||||
- **שאל שאלות** - השתמש בלוח הדיונים [Discussion board](https://github.com/microsoft/AI-For-Beginners/discussions)
|
||||
|
||||
## 🔗 צעדים הבאים
|
||||
## 🔗 שלבים הבאים
|
||||
|
||||
לאחר שתסיימו את הדוגמאות, חקרו את תוכנית הלימודים המלאה:
|
||||
- [מבוא ל-AI](../lessons/1-Intro/README.md)
|
||||
- [רשתות נוירונים](../lessons/3-NeuralNetworks/README.md)
|
||||
לאחר סיום דוגמאות אלו, חקור את תוכנית הלימודים המלאה:
|
||||
- [מבוא לבינה מלאכותית](../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 -->
|
||||
|
|
@ -6,9 +6,9 @@
|
|||
"source": [
|
||||
"# מודלים מאומנים מראש ולמידת העברה\n",
|
||||
"\n",
|
||||
"אימון רשתות עצביות קונבולוציוניות (CNNs) יכול לקחת זמן רב, ונדרש לכך גם כמות גדולה של נתונים. עם זאת, חלק גדול מהזמן מושקע בלמידת המסננים הבסיסיים שהרשת משתמשת בהם כדי לזהות תבניות מתוך תמונות. עולה שאלה טבעית - האם ניתן להשתמש ברשת עצבית שאומנה על מערך נתונים אחד ולהתאים אותה לסיווג תמונות שונות מבלי לעבור את כל תהליך האימון מחדש?\n",
|
||||
"אימון רשתות CNN עלול לקחת הרבה זמן, ונדרשת כמות גדולה של נתונים למשימה זו. עם זאת, במהלך הזמן הרב נלמדים בעיקר המסננים הנמוכים הטובים ביותר שהרשת משתמשת בהם כדי לחלץ תבניות מתוך תמונות. עולה שאלה טבעית - האם אפשר להשתמש ברשת עצבית שאומנה על מערך נתונים אחד ולהתאים אותה לסיווג תמונות שונות בלי תהליך אימון מלא?\n",
|
||||
"\n",
|
||||
"גישה זו נקראת **למידת העברה**, מכיוון שאנחנו מעבירים ידע מסוים ממודל רשת עצבית אחד לאחר. בלמידת העברה, בדרך כלל מתחילים עם מודל מאומן מראש, שאומן על מערך נתונים גדול כלשהו, כמו **ImageNet**. מודלים אלו כבר יודעים לבצע עבודה טובה בזיהוי מאפיינים שונים מתוך תמונות כלליות, וברוב המקרים, בניית מסווג על בסיס המאפיינים שהופקו יכולה להניב תוצאות טובות.\n"
|
||||
"גישה זו נקראת **למידת העברה**, כי היא מעבירה קצת ידע ממודל רשת עצבית אחד לאחר. בלמידת העברה, בדרך כלל מתחילים עם מודל מאומן מראש, שאומן על מערך נתוני תמונות גדול כלשהו, כמו **ImageNet**. המודלים האלה כבר יכולים לבצע עבודה טובה בחילוץ תכונות שונות מתמונות גנריות, ובמקרים רבים בניית מסווג על בסיס התכונות שחלצו בלבד יכולה להניב תוצאה טובה.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -29,11 +29,11 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## מאגר הנתונים של חתולים מול כלבים\n",
|
||||
"## מערך הנתונים חתולים מול כלבים\n",
|
||||
"\n",
|
||||
"ביחידה זו, נפתור בעיה אמיתית של סיווג תמונות של חתולים וכלבים. לשם כך, נשתמש ב-[מאגר הנתונים של חתולים מול כלבים מ-Kaggle](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](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"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -333,13 +333,13 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## טעינת מערך הנתונים\n",
|
||||
"## טעינת אוסף הנתונים\n",
|
||||
"\n",
|
||||
"בדוגמאות קודמות, טענו מערכי נתונים שמובנים בתוך Keras. עכשיו אנחנו עומדים להתמודד עם מערך נתונים משלנו, שאותו נצטרך לטעון מתיקייה של תמונות.\n",
|
||||
"בדוגמאות הקודמות, טעינו אוספי נתונים שכלולים בתוך Keras. עכשיו אנחנו עומדים להתמודד עם אוסף הנתונים שלנו, שצריך לטעון מתיקיית תמונות.\n",
|
||||
"\n",
|
||||
"בחיים האמיתיים, גודל מערכי נתונים של תמונות יכול להיות די גדול, ולא ניתן להסתמך על כך שכל הנתונים יוכלו להיכנס לזיכרון. לכן, מערכי נתונים מיוצגים לעיתים קרובות כ-**גנרטורים** שיכולים להחזיר נתונים במנות קטנות שמתאימות לאימון.\n",
|
||||
"בחיים האמיתיים, גודל אוספי הנתונים לתמונות יכול להיות גדול מאוד, ולא ניתן להסתמך על כך שכל הנתונים יוכלו להיכנס לזיכרון. לכן, אוספי נתונים מיוצגים לעיתים קרובות כמחוללים (**generators**) שיכולים להחזיר נתונים במיני-אצוות המתאימות לאימון.\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,7 +453,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"> **הערה**: כל התמונות במאגר הנתונים מיוצגות כטנסורים מסוג נקודה צפה בטווח 0-255. לפני העברתן לרשת העצבית, עלינו להקטין את הערכים לטווח 0-1. כאשר אנו מציגים תמונות, עלינו לעשות את אותו הדבר או להמיר את הערכים לסוג `int` (כפי שעשינו בקוד למעלה), כדי להראות ל-`matplotlib` שאנו רוצים להציג את התמונה המקורית ללא שינוי.\n"
|
||||
"> **הערה**: כל התמונות במאגר הנתונים מיוצגות כמטריצות נקודות צף בטווח 0-255. לפני העברתם לרשת העצבית, עלינו לשנות את הערכים האלה לטווח 0-1. כאשר מציגים תמונות, עלינו לעשות את אותו הדבר, או להמיר את הערכים לסוג `int` (כפי שאנו עושים בקוד שבמעלה), כדי להראות ל-`matplotlib` שאנו רוצים להציג את התמונה המקורית ללא שינוי.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -462,7 +462,7 @@
|
|||
"source": [
|
||||
"## מודלים מאומנים מראש\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,19 +521,16 @@
|
|||
"metadata": {},
|
||||
"source": [
|
||||
"יש כאן כמה דברים חשובים:\n",
|
||||
"\n",
|
||||
"* לפני שמעבירים קלט לכל רשת נוירונים מאומנת מראש, יש לעבד אותו בצורה מסוימת. זה נעשה על ידי קריאה לפונקציה המתאימה `preprocess_input`, שמקבלת אצווה של תמונות ומחזירה את הצורה המעובדת שלהן. במקרה של VGG-16, התמונות מנורמלות, ונגרע מהן ערך ממוצע מוגדר מראש לכל ערוץ. זאת מכיוון ש-VGG-16 אומנה במקור עם עיבוד מקדים זה.\n",
|
||||
"\n",
|
||||
"* רשת הנוירונים מופעלת על אצוות הקלט, והתוצאה היא אצווה של טנסורים עם 1000 אלמנטים שמראים את ההסתברות של כל מחלקה. ניתן למצוא את מספר המחלקה הסביר ביותר על ידי קריאה ל-`argmax` על הטנסור הזה.\n",
|
||||
"\n",
|
||||
"* התוצאה שהתקבלה היא [מספר של מחלקה מתוך `ImageNet`](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). כדי להבין את התוצאה הזו, ניתן גם להשתמש בפונקציה `decode_predictions`, שמחזירה את n המחלקות המובילות יחד עם שמותיהן.\n"
|
||||
"* לפני העברת קלט לכל רשת מאומנת מראש יש לעבד אותו בדרך מסוימת. זה נעשה על ידי קריאה לפונקציית `preprocess_input` המתאימה, שמקבלת אצווה של תמונות ומחזירה את צורתן המעובדת. במקרה של VGG-16, התמונות מנורמלות ונחסר ערך ממוצע שהוגדר מראש עבור כל ערוץ. זה כי VGG-16 אומנה במקור עם עיבוד מוקדם זה.\n",
|
||||
"* רשת עצבית מוחלת על אצוות הקלט, ואנו מקבלים כתוצאה אצווה של טנסורים בני 1000 אלמנטים שמראים את ההסתברות לכל מחלקה. ניתן למצוא את המספר של המחלקה הסבירה ביותר על ידי קריאה ל-`argmax` על הטנסור הזה.\n",
|
||||
"* התוצאה שהתקבלה היא [מספר של מחלקת `ImageNet`](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). כדי להבין את התוצאה הזו, ניתן גם להשתמש בפונקציית `decode_predictions`, שמחזירה את n המחלקות העליונות יחד עם שמותיהן.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"בואו נראה גם את הארכיטקטורה של רשת VGG-16:\n"
|
||||
"בואו נבחן גם את הארכיטקטורה של רשת VGG-16:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -600,9 +607,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## חישובים על GPU\n",
|
||||
"## חישובים ב-GPU\n",
|
||||
"\n",
|
||||
"רשתות עצביות עמוקות, כמו VGG-16 וארכיטקטורות מודרניות אחרות, דורשות כוח חישוב רב כדי לפעול. הגיוני להשתמש בהאצת GPU אם היא זמינה. למרבה המזל, Keras מאיצה באופן אוטומטי את החישובים על ה-GPU אם הוא זמין. ניתן לבדוק אם Tensorflow מסוגל להשתמש ב-GPU באמצעות הקוד הבא:\n"
|
||||
"רשתות נוירונים עמוקות, כמו VGG-16 ואדריכלות מודרניות אחרות, דורשות כוח חישובי משמעותי להפעלה. יש הגיון להשתמש בהאצת GPU, אם היא זמינה. למרבה המזל, Keras מאיצה אוטומטית את החישובים על ה-GPU אם הוא זמין. אנחנו יכולים לבדוק אם Tensorflow מסוגל להשתמש ב-GPU באמצעות הקוד הבא:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -629,9 +636,10 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## חילוץ מאפיינים מ-VGG\n",
|
||||
"\n",
|
||||
"אם אנחנו רוצים להשתמש ב-VGG-16 כדי לחלץ מאפיינים מהתמונות שלנו, אנחנו צריכים את המודל ללא שכבות הסיווג הסופיות. ניתן ליצור את מודל VGG-16 ללא השכבות העליונות באמצעות הקוד הבא:\n"
|
||||
"## חילוץ תכונות VGG\n",
|
||||
"\n",
|
||||
"אם אנחנו רוצים להשתמש ב-VGG-16 כדי לחלץ תכונות מהתמונות שלנו, אנחנו צריכים את המודל ללא שכבות הסיווג הסופיות. אנחנו יכולים לאתחל את מודל VGG-16 ללא השכבות העליונות באמצעות הקוד הבא:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -683,9 +691,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"המימד של טנסור התכונות הוא 7x7x512, אך כדי להציג אותו בצורה חזותית היינו צריכים לשנות את צורתו למבנה דו-ממדי.\n",
|
||||
"המימד של טנזור התכונות הוא 7x7x512, אבל על מנת להציג אותו נאלצנו לעצב מחדש לצורה דו-ממדית.\n",
|
||||
"\n",
|
||||
"עכשיו בואו ננסה לבדוק אם ניתן להשתמש בתכונות הללו כדי לסווג תמונות. ניקח באופן ידני חלק מהתמונות (50 מיני-אצוות, במקרה שלנו), ונחשב מראש את וקטורי התכונות שלהן. ניתן להשתמש ב-API של **dataset** של Tensorflow כדי לעשות זאת. פונקציית `map` לוקחת מערך נתונים ומיישמת פונקציית למבדה נתונה כדי לשנות אותו. אנו משתמשים במנגנון הזה כדי לבנות מערכי נתונים חדשים, `ds_features_train` ו-`ds_features_test`, שמכילים תכונות שהופקו על ידי VGG במקום התמונות המקוריות.\n"
|
||||
"עכשיו בואו ננסה לראות אם ניתן להשתמש בתכונות אלו כדי לסווג תמונות. ניקח באופן ידני חלק מהתמונות (50 מיני-בצ'ים, במקרה שלנו), ונחשב מראש את וקטורי התכונות שלהן. אנו יכולים להשתמש ב-API של Tensorflow **dataset** כדי לעשות זאת. פונקציית `map` מקבלת סט נתונים ומיישמת פונקציית למבדה נתונה כדי לבצע המרה. אנו משתמשים במנגנון זה כדי לבנות סטי נתונים חדשים, `ds_features_train` ו-`ds_features_test`, המכילים תכונות שהופקו מ-VGG במקום התמונות המקוריות.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -715,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"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -746,13 +754,13 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"התוצאה נהדרת, אנחנו יכולים להבחין בין חתול לכלב עם סבירות של כמעט 95%! עם זאת, בדקנו את הגישה הזו רק על תת-קבוצה של כל התמונות, מכיוון שמיצוי תכונות ידני לוקח הרבה זמן.\n",
|
||||
"התוצאה נהדרת, אנחנו יכולים להבחין בין חתול לכלב עם כמעט 95% הסתברות! עם זאת, בדקנו את הגישה הזו רק על תת-קבוצה של כל התמונות, כי חילוץ התכונות הידני נראה שלוקח הרבה זמן.\n",
|
||||
"\n",
|
||||
"## למידת העברה באמצעות רשת VGG אחת\n",
|
||||
"## למידה בהעברה באמצעות רשת VGG אחת\n",
|
||||
"\n",
|
||||
"אנחנו יכולים גם להימנע ממיצוי תכונות ידני מראש על ידי שימוש ברשת VGG-16 המקורית בשלמותה במהלך האימון, על ידי הוספת ממצה תכונות כרובד הראשון ברשת שלנו.\n",
|
||||
"אנחנו גם יכולים להימנע מחישוב תכונות מראש ידנית על ידי שימוש ברשת VGG-16 המקורית כמכלול במהלך האימון, על ידי הוספת מנחה תכונות לרשת שלנו כשכבה ראשונה.\n",
|
||||
"\n",
|
||||
"היופי בארכיטקטורה של Keras הוא שמודל VGG-16 שהגדרנו קודם יכול לשמש גם כרובד בתוך רשת עצבית אחרת! כל מה שצריך לעשות הוא לבנות רשת עם מסווג צפוף מעליה, ואז לאמן את כל הרשת באמצעות back propagation.\n"
|
||||
"היופי בארכיטקטורת Keras הוא שמודל VGG-16 שהגדרנו למעלה יכול לשמש גם כשכבה ברשת עצבית אחרת! אנחנו רק צריכים לבנות רשת עם מסווג צפוף מעליה, ואז לאמן את כל הרשת באמצעות הפצה לאחור.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -796,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"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -827,11 +835,11 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"נראה שהצלחנו להשיג מסווג חתולים מול כלבים מדויק למדי!\n",
|
||||
"נראה כי השגנו מסווג חתולים מול כלבים מדויק למדי! \n",
|
||||
"\n",
|
||||
"## שמירת המודל וטעינתו\n",
|
||||
"## שמירה וטעינת המודל\n",
|
||||
"\n",
|
||||
"לאחר שאימנו את המודל, נוכל לשמור את מבנה המודל והמשקלים המאומנים לקובץ לשימוש עתידי:\n"
|
||||
"ברגע שאימנו את המודל, אנו יכולים לשמור את ארכיטקטורת המודל ואת המשקלים המאומנים לקובץ לשימוש עתידי:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -855,7 +863,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"אנחנו יכולים לטעון את המודל מהקובץ בכל זמן. ייתכן שתמצא את זה שימושי במקרה שהניסוי הבא יהרוס את המודל - לא תצטרך להתחיל מחדש מאפס.\n"
|
||||
"אז נוכל להטעין את המודל מקובץ בכל זמן שתרצו. זה יכול להיות שימושי במקרה שהניסוי הבא יהרוס את המודל - לא תצטרכו להתחיל מהתחלה מחדש.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -871,15 +879,15 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## כוונון עדין בלמידה מעבירה\n",
|
||||
"## העברת למידה עם כוונון מדויק\n",
|
||||
"\n",
|
||||
"בקטע הקודם, אימנו את שכבת הסיווג הסופית כדי לסווג תמונות במאגר הנתונים שלנו. עם זאת, לא אימנו מחדש את מפיק התכונות, והמודל שלנו הסתמך על התכונות שהמודל למד מנתוני ImageNet. אם האובייקטים שלך נראים שונה באופן חזותי מתמונות רגילות של ImageNet, ייתכן ששילוב התכונות הזה לא יעבוד בצורה הטובה ביותר. לכן, יש היגיון להתחיל לאמן גם את שכבות הקונבולוציה.\n",
|
||||
"בסעיף הקודם, אימנו את שכבת המיון הסופית לסיווג תמונות במאגר הנתונים שלנו. עם זאת, לא אימנו מחדש את מאתר התכונות, והמודל שלנו הסתמך על התכונות שהמודל למד מנתוני ImageNet. אם האובייקטים שלך נראים שונה מתמונות רגילות של ImageNet, ייתכן ששילוב התכונות הזה לא יעבוד בצורה הטובה ביותר. לכן הגיוני להתחיל לאמן גם שכבות קונבולוציה.\n",
|
||||
"\n",
|
||||
"כדי לעשות זאת, ניתן לבטל את הקפאת הפרמטרים של מסנני הקונבולוציה שהקפאנו קודם לכן.\n",
|
||||
"לשם כך, נוכל לשחרר את פרמטרי המסנן בקונבולוציה שהקפאנו קודם.\n",
|
||||
"\n",
|
||||
"> **Note:** חשוב להקפיא תחילה את הפרמטרים ולבצע כמה אפוקים של אימון כדי לייצב את המשקלים בשכבת הסיווג. אם תתחיל מיד לאמן רשת מקצה לקצה עם פרמטרים לא מוקפאים, סביר להניח ששגיאות גדולות יהרסו את המשקלים שהוכנו מראש בשכבות הקונבולוציה.\n",
|
||||
"> **הערה:** חשוב להקפיא את הפרמטרים תחילה ולבצע כמה אפוקים של אימון כדי לייצב את המשקולות בשכבת המיון. אם תתחיל מיד לאמן את הרשת מקצה לקצה עם פרמטרים לא מוקפאים, שגיאות גדולות עשויות להשמיד את המשקולות שהוכנו מראש בשכבות הקונבולוציה.\n",
|
||||
"\n",
|
||||
"המודל הקונבולוציוני שלנו מסוג VGG-16 ממוקם בתוך השכבה הראשונה, והוא מורכב ממספר שכבות בפני עצמו. ניתן להסתכל על המבנה שלו:\n"
|
||||
"מודל ה-VGG-16 הקונבולוציוני שלנו ממוקם בתוך השכבה הראשונה, והוא מורכב מהרבה שכבות בעצמו. נוכל להסתכל על המבנה שלו:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -948,7 +956,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"אנחנו יכולים להפשיר את כל השכבות של בסיס הקונבולוציה:\n"
|
||||
"אנו יכולים לשחרר את כל השכבות של הבסיס הקונבולוציוני:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -964,7 +972,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"עם זאת, הפשרה של כולם בבת אחת אינה הרעיון הטוב ביותר. אנו יכולים תחילה להפשיר רק כמה שכבות סופיות של קונבולוציות, מכיוון שהן מכילות דפוסים ברמה גבוהה שרלוונטיים לתמונות שלנו. לדוגמה, כדי להתחיל, אנו יכולים להקפיא את כל השכבות מלבד 4 האחרונות:\n"
|
||||
"עם זאת, לשחרר את כולם בבת אחת אינו הרעיון הטוב ביותר. ניתן תחילה לשחרר רק כמה שכבות סופיות של העיבודים הקונבולוציוניים, מכיוון שהן מכילות דפוסים ברמה גבוהה יותר שרלוונטיים לתמונות שלנו. לדוגמה, כדי להתחיל, נוכל להקפיא את כל השכבות מלבד ארבע האחרונות:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1003,11 +1011,11 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"שימו לב שמספר הפרמטרים הניתנים לאימון גדל באופן משמעותי, אך הוא עדיין עומד על כ-50% מכלל הפרמטרים.\n",
|
||||
"שימו לב שכמות הפרמטרים שניתנים לאימון עלתה משמעותית, אך היא עדיין בסביבות 50% מכלל הפרמטרים.\n",
|
||||
"\n",
|
||||
"לאחר ביטול הקפאת השכבות, ניתן לבצע עוד כמה אפוקים של אימון (בדוגמה שלנו, נבצע רק אחד). ניתן גם לבחור קצב למידה נמוך יותר, כדי למזער את ההשפעה על המשקלים שהוכנו מראש. עם זאת, גם עם קצב למידה נמוך, ניתן לצפות לירידה בדיוק בתחילת האימון, עד שלבסוף תגיעו לרמה מעט גבוהה יותר בהשוואה למקרה של משקלים קבועים.\n",
|
||||
"לאחר שתבטלו את ההקפאה, ניתן לבצע עוד כמה אפוקים של אימון (בדוגמה שלנו, נעשה רק אחד). ניתן גם לבחור בקצב למידה נמוך יותר, כדי למזער את ההשפעה על המשקלים שאומנו מראש. עם זאת, גם עם קצב למידה נמוך, ניתן לצפות לירידה בדיוק בתחילת האימון, עד שבסופו של דבר מגיעים לרמה קצת גבוהה יותר מאשר במקרה של משקלים קבועים.\n",
|
||||
"\n",
|
||||
"> **Note:** האימון הזה מתבצע הרבה יותר לאט, מכיוון שעלינו להעביר את הגרדיאנטים חזרה דרך שכבות רבות ברשת!\n"
|
||||
"> **הערה:** האימון הזה מתבצע הרבה יותר לאט, כי אנחנו צריכים להפיץ גרדיאנטים לאחור דרך שכבות רבות ברשת!\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1031,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"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1444,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"
|
||||
"ניתן לראות שמשימות מורכבות יותר שאנו פותרים עכשיו דורשות כוח חישובי גבוה יותר, ולא ניתן לפתור אותן בקלות על ה-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"
|
||||
]
|
||||
}
|
||||
],
|
||||
|
|
@ -1487,12 +1495,6 @@
|
|||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.8.10"
|
||||
},
|
||||
"coopTranslator": {
|
||||
"original_hash": "c189abc107848f96051085cc30945129",
|
||||
"translation_date": "2025-08-28T20:37:37+00:00",
|
||||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb",
|
||||
"language_code": "he"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
|
|
|||
|
|
@ -1,44 +1,36 @@
|
|||
# עיבוד שפה טבעית
|
||||
|
||||

|
||||

|
||||
|
||||
בפרק זה נתמקד בשימוש ברשתות נוירונים לטיפול במשימות הקשורות ל**עיבוד שפה טבעית (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)
|
||||
* **סיכום טקסט** היא טכניקה שבה רוצים שהמחשב "יקרא" טקסט ארוך ויסכם אותו בכמה משפטים.
|
||||
* **תרגום מכונה** ניתן לראות כשילוב של הבנת טקסט בשפה אחת, ויצירת טקסט בשפה אחרת.
|
||||
|
||||
* **ניתוח רגשות** הוא בעיית רגרסיה טיפוסית, שבה יש לייחס מספר (רגש) המתאר עד כמה המשמעות של משפט היא חיובית או שלילית. גרסה מתקדמת יותר של ניתוח רגשות היא **ניתוח רגשות מבוסס היבטים** (ABSA), שבו אנו מייחסים רגש לא למשפט כולו, אלא לחלקים שונים בו (היבטים), לדוגמה: *במסעדה הזו אהבתי את האוכל, אבל האווירה הייתה נוראית*.
|
||||
בתחילה, רוב משימות ה-NLP נפתרו באמצעות שיטות מסורתיות כמו דקדוק. לדוגמה, בתרגום מכונה השתמשו ב-parserים כדי להפוך משפט ראשוני לעץ תחבירי, ואז חילצו מבנים סמנטיים ברמה גבוהה כדי לייצג את משמעות המשפט, ועל בסיס משמעות זו ודקדוק שפת היעד נוצר התוצאה. כיום, משימות NLP רבות נפתרות בצורה יעילה יותר באמצעות רשתות עצביות.
|
||||
|
||||
* **זיהוי ישויות בשם** (NER) מתייחס לבעיה של חילוץ ישויות מסוימות מטקסט. לדוגמה, ייתכן שנצטרך להבין שבביטוי *אני צריך לטוס לפריז מחר* המילה *מחר* מתייחסת לתאריך, ו*פריז* היא מיקום.
|
||||
> שיטות NLP קלאסיות רבות יושמו בספריית הפייתון [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org). קיימת גם [ספריית NLTK](https://www.nltk.org/book/) מעולה זמינה באינטרנט שמסבירה כיצד לפתור משימות NLP שונות בעזרת NLTK.
|
||||
|
||||
* **חילוץ מילות מפתח** דומה ל-NER, אך כאן יש לחלץ מילים החשובות למשמעות המשפט באופן אוטומטי, ללא אימון מוקדם על סוגי ישויות מסוימים.
|
||||
בקורס שלנו נתמקד בעיקר בשימוש ברשתות עצביות ל-NLP, ונעשה שימוש ב-NLTK במקומות הנדרשים.
|
||||
|
||||
* **אשכולות טקסט** יכולים להיות שימושיים כאשר אנו רוצים לקבץ יחד משפטים דומים, לדוגמה, בקשות דומות בשיחות תמיכה טכנית.
|
||||
|
||||
* **מענה על שאלות** מתייחס ליכולת של מודל לענות על שאלה מסוימת. המודל מקבל קטע טקסט ושאלה כקלט, והוא צריך לספק מקום בטקסט שבו נמצאת התשובה לשאלה (או, לעיתים, לייצר את טקסט התשובה).
|
||||
|
||||
* **יצירת טקסט** היא היכולת של מודל לייצר טקסט חדש. ניתן לראות זאת כמשימת סיווג שמנבאת את האות/המילה הבאה בהתבסס על *טקסט פתיחה*. מודלים מתקדמים ליצירת טקסט, כמו 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 קלאסיות רבות מיושמות בספריית Python בשם [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org). ישנו [ספר NLTK](https://www.nltk.org/book/) מצוין הזמין אונליין שמסביר כיצד ניתן לפתור משימות NLP שונות באמצעות NLTK.
|
||||
|
||||
בקורס שלנו, נתמקד בעיקר בשימוש ברשתות נוירונים ל-NLP, ונשתמש ב-NLTK במידת הצורך.
|
||||
|
||||
כבר למדנו על שימוש ברשתות נוירונים לטיפול בנתונים טבלאיים ובתמונות. ההבדל העיקרי בין סוגי הנתונים הללו לטקסט הוא שטקסט הוא רצף באורך משתנה, בעוד שגודל הקלט במקרה של תמונות ידוע מראש. בעוד שרשתות קונבולוציה יכולות לחלץ תבניות מנתוני קלט, התבניות בטקסט מורכבות יותר. לדוגמה, ייתכן שישנה שלילה המופרדת מהנושא על ידי מילים רבות (לדוגמה: *אני לא אוהב תפוזים* לעומת *אני לא אוהב את התפוזים הגדולים הצבעוניים והטעימים האלה*), ועדיין יש לפרש זאת כתבנית אחת. לכן, כדי להתמודד עם שפה, יש להציג סוגי רשתות נוירונים חדשים, כמו *רשתות חוזרות* ו*טרנספורמרים*.
|
||||
כבר למדתם על שימוש ברשתות עצביות לטיפול בנתונים טבלאיים ותמונות. ההבדל העיקרי בין סוגי הנתונים הללו לטקסט הוא שטקסט הוא רצף באורך משתנה, בעוד שגודל הקלט במקרה של תמונות ידוע מראש. בעוד שרשתות קונבולוציה יכולות לחלץ תבניות מנתוני הקלט, התבניות בטקסט מורכבות יותר. לדוגמה, ניגודיות בין מילים יכולה להיות מופרדת מנושא על ידי מילים רבות (למשל *אני לא אוהב תפוזים* לעומת *אני לא אוהב את התפוזים הגדולים, הצבעוניים והטעימים האלה*), וזה עדיין צריך להתפרש כתבנית אחת. לכן, כדי להתמודד עם שפה יש להציג סוגים חדשים של רשתות עצביות, כמו *רשתות חוזרות* ו*טרנספורמרים*.
|
||||
|
||||
## התקנת ספריות
|
||||
|
||||
אם אתם משתמשים בהתקנת Python מקומית להפעלת הקורס, ייתכן שתצטרכו להתקין את כל הספריות הנדרשות ל-NLP באמצעות הפקודות הבאות:
|
||||
אם אתם משתמשים בהתקנת פייתון מקומית על מנת להריץ את הקורס, ייתכן שתצטרכו להתקין את כל הספריות הדרושות ל-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
|
||||
```
|
||||
|
|
@ -47,13 +39,13 @@ pip install -r requirements-tf.txt
|
|||
|
||||
## אזהרת 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 כראוי בעת הדרכת מספר מודלים באותה ליבת פייתון. כדי לנהל שימוש בזיכרון GPU בצורה יעילה, ניתן לקבוע ב-TensorFlow להקצות זיכרון GPU רק לפי הצורך.
|
||||
* **הכללת קוד**: על מנת לגדיר את TensorFlow להגדיל את הקצאת זיכרון ה-GPU רק בעת הצורך, יש לכלול את הקוד הבא במחברות שלכם:
|
||||
|
||||
```python
|
||||
physical_devices = tf.config.list_physical_devices('GPU')
|
||||
|
|
@ -61,19 +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).
|
||||
אם אתם מעוניינים ללמוד על 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)
|
||||
* [ייצוג טקסט כמטריצות](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": "hi"
|
||||
},
|
||||
"CONTRIBUTING.md": {
|
||||
"original_hash": "c6fd7e781b67111a90abd166d0ce4aa0",
|
||||
"translation_date": "2026-07-08T19:07:59+00:00",
|
||||
"source_file": "CONTRIBUTING.md",
|
||||
"language_code": "hi"
|
||||
},
|
||||
"README.md": {
|
||||
"original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b",
|
||||
"translation_date": "2026-04-06T20:50:20+00:00",
|
||||
|
|
@ -17,6 +23,19 @@
|
|||
"source_file": "SECURITY.md",
|
||||
"language_code": "hi"
|
||||
},
|
||||
"__translation_failures__": {
|
||||
"lessons/sketchnotes/LICENSE.md": {
|
||||
"original_hash": "45ab63a2cd8f5faef6c9b150618837a4",
|
||||
"source_file": "lessons/sketchnotes/LICENSE.md",
|
||||
"language_code": "hi",
|
||||
"failure_date": "2026-07-08T19:01:02+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:06:08+00:00",
|
||||
|
|
@ -54,8 +73,8 @@
|
|||
"language_code": "hi"
|
||||
},
|
||||
"examples/README.md": {
|
||||
"original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7",
|
||||
"translation_date": "2025-10-03T11:28:37+00:00",
|
||||
"original_hash": "7883d52c2e2a221e0b07a7b112a149b9",
|
||||
"translation_date": "2026-07-08T18:56:48+00:00",
|
||||
"source_file": "examples/README.md",
|
||||
"language_code": "hi"
|
||||
},
|
||||
|
|
@ -66,8 +85,8 @@
|
|||
"language_code": "hi"
|
||||
},
|
||||
"lessons/0-course-setup/how-to-run.md": {
|
||||
"original_hash": "a4717bd9103b9f6cd84d534b83534689",
|
||||
"translation_date": "2026-01-15T13:01:38+00:00",
|
||||
"original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1",
|
||||
"translation_date": "2026-07-08T18:57:09+00:00",
|
||||
"source_file": "lessons/0-course-setup/how-to-run.md",
|
||||
"language_code": "hi"
|
||||
},
|
||||
|
|
@ -191,6 +210,12 @@
|
|||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md",
|
||||
"language_code": "hi"
|
||||
},
|
||||
"lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": {
|
||||
"original_hash": "99b816b6a4957ef4100cee4c4221dff9",
|
||||
"translation_date": "2026-07-08T18:50:19+00:00",
|
||||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb",
|
||||
"language_code": "hi"
|
||||
},
|
||||
"lessons/4-ComputerVision/08-TransferLearning/lab/README.md": {
|
||||
"original_hash": "7765935c35fcee69b9fe2d0cfd6963e2",
|
||||
"translation_date": "2025-08-24T09:57:07+00:00",
|
||||
|
|
@ -330,8 +355,8 @@
|
|||
"language_code": "hi"
|
||||
},
|
||||
"lessons/5-NLP/README.md": {
|
||||
"original_hash": "8ef02a9318257ea140ed3ed74442096d",
|
||||
"translation_date": "2025-08-24T09:47:25+00:00",
|
||||
"original_hash": "038df6f1a73e49f6430740da083bfd6d",
|
||||
"translation_date": "2026-07-08T18:57:36+00:00",
|
||||
"source_file": "lessons/5-NLP/README.md",
|
||||
"language_code": "hi"
|
||||
},
|
||||
|
|
@ -355,7 +380,7 @@
|
|||
},
|
||||
"lessons/6-Other/23-MultiagentSystems/README.md": {
|
||||
"original_hash": "38a1185ae3d54b180378bbd71ae3ef16",
|
||||
"translation_date": "2025-09-23T13:27:14+00:00",
|
||||
"translation_date": "2026-07-08T19:02:00+00:00",
|
||||
"source_file": "lessons/6-Other/23-MultiagentSystems/README.md",
|
||||
"language_code": "hi"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -0,0 +1,29 @@
|
|||
# AI-For-Beginners में योगदान करना
|
||||
|
||||
AI-For-Beginners में योगदान करने में आपकी रुचि के लिए धन्यवाद! हम अनुवादों, पाठ सुधारों, और स्वरूपण सुधारों का स्वागत करते हैं।
|
||||
|
||||
## माइक्रोसॉफ्ट योगदानकर्ता लाइसेंस समझौता (CLA)
|
||||
|
||||
यह परियोजना योगदान और सुझावों का स्वागत करती है। अधिकांश योगदानों के लिए आपको एक योगदानकर्ता लाइसेंस समझौते (CLA) पर सहमति देनी होती है जिसमें आप यह घोषित करते हैं कि आपके पास अपने योगदान का उपयोग करने के अधिकार हैं और वास्तव में आप हमें ये अधिकार प्रदान कर रहे हैं। विवरण के लिए, [https://cla.microsoft.com](https://cla.microsoft.com) पर जाएं।
|
||||
|
||||
जब आप एक पुल रिक्वेस्ट सबमिट करते हैं, तो एक CLA-बॉट स्वचालित रूप से निर्धारित करेगा कि क्या आपको CLA प्रदान करने की आवश्यकता है और पुल रिक्वेस्ट को उपयुक्त रूप से चिन्हित करेगा (जैसे, लेबल, टिप्पणी). बस बॉट द्वारा दिए गए निर्देशों का पालन करें। आपको हमारे CLA का उपयोग करने वाले सभी रिपॉजिटरीज़ में यह केवल एक बार करना होगा।
|
||||
|
||||
## योगदान कैसे करें
|
||||
|
||||
### 1. टाइपो / कोड त्रुटियों को ठीक करना
|
||||
यदि आपको किसी भी Jupyter नोटबुक या पाठ मार्कडाउन फ़ाइल में टाइपो या बग मिले:
|
||||
1. रिपॉजिटरी को फ़ोर्क करें।
|
||||
2. टाइपो या टूटी लिंक को ठीक करें।
|
||||
3. सुधार का स्पष्ट विवरण देते हुए एक पुल रिक्वेस्ट सबमिट करें।
|
||||
|
||||
### 2. अनुवाद प्रस्तुत करना
|
||||
हम पाठों के अन्य भाषाओं में अनुवाद का स्वागत करते हैं! कृपया `translations/` निर्देशिका के अंतर्गत मौजूदा फ़ोल्डर नामों का उपयोग करते हुए (जैसे `translations/es/`, `translations/pt-BR/`, `translations/zh-CN/`) अनुवाद रखें।
|
||||
|
||||
अधिक विवरण के लिए, देखें [etc/CONTRIBUTING.md](etc/CONTRIBUTING.md)।
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**अस्वीकरण**:
|
||||
इस दस्तावेज़ का अनुवाद AI अनुवाद सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) का उपयोग करके किया गया है। जबकि हम सटीकता के लिए प्रयास करते हैं, कृपया ध्यान दें कि स्वचालित अनुवादों में त्रुटियाँ या अशुद्धियाँ हो सकती हैं। मूल दस्तावेज़ अपनी मूल भाषा में ही प्रामाणिक स्रोत माना जाना चाहिए। महत्वपूर्ण जानकारी के लिए, पेशेवर मानव अनुवाद की सिफारिश की जाती है। इस अनुवाद के उपयोग से उत्पन्न किसी भी गलतफहमी या गलत व्याख्या के लिए हम उत्तरदायी नहीं हैं।
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -1,31 +1,31 @@
|
|||
# शुरुआती लोगों के लिए AI उदाहरण
|
||||
# शुरुआती के अनुकूल AI उदाहरण
|
||||
|
||||
स्वागत है! यह डायरेक्टरी सरल और स्वतंत्र उदाहरणों को शामिल करती है ताकि आप AI और मशीन लर्निंग के साथ शुरुआत कर सकें। प्रत्येक उदाहरण को शुरुआती लोगों के लिए बनाया गया है, जिसमें विस्तृत टिप्पणियां और चरण-दर-चरण व्याख्या दी गई है।
|
||||
स्वागत है! यह डायरेक्टरी सरल, स्वतंत्र उदाहरणों को समेटे हुए है जो आपको AI और मशीन लर्निंग के साथ शुरुआत करने में मदद करेंगे। प्रत्येक उदाहरण शुरुआती के अनुकूल होता है जिसमें विस्तृत टिप्पणियाँ और चरण-दर-चरण व्याख्याएँ शामिल हैं।
|
||||
|
||||
## 📚 उदाहरणों का अवलोकन
|
||||
|
||||
| उदाहरण | विवरण | कठिनाई | पूर्व आवश्यकताएँ |
|
||||
|---------|-------------|------------|---------------|
|
||||
| [Hello AI World](../../../examples/01-hello-ai-world.py) | आपका पहला AI प्रोग्राम - सरल पैटर्न पहचान | ⭐ शुरुआती | Python की मूल बातें |
|
||||
| [Simple Neural Network](../../../examples/02-simple-neural-network.py) | शुरुआत से एक न्यूरल नेटवर्क बनाएं | ⭐⭐ शुरुआती+ | Python, बुनियादी गणित |
|
||||
| [Image Classifier](./03-image-classifier.ipynb) | पहले से प्रशिक्षित मॉडल के साथ छवियों को वर्गीकृत करें | ⭐⭐ शुरुआती+ | Python, numpy |
|
||||
| [Text Sentiment](../../../examples/04-text-sentiment.py) | टेक्स्ट की भावना (सकारात्मक/नकारात्मक) का विश्लेषण करें | ⭐⭐ शुरुआती+ | Python |
|
||||
| [Hello AI World](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/01-hello-ai-world.py) | आपका पहला AI प्रोग्राम - सरल पैटर्न मान्यता | ⭐ शुरुआती | 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 या उससे अधिक अनुशंसित) इंस्टॉल है। आवश्यक पैकेज इंस्टॉल करें:
|
||||
सुनिश्चित करें कि आपके पास Python स्थापित है (3.8 या उससे ऊपर अनुशंसित)। आवश्यक पैकेज इंस्टॉल करें:
|
||||
|
||||
```bash
|
||||
# For Python scripts
|
||||
# पायथन स्क्रिप्ट्स के लिए
|
||||
pip install numpy
|
||||
|
||||
# For Jupyter notebooks (image classifier)
|
||||
# जुपिटर नोटबुक्स (छवि वर्गीकरणकर्ता) के लिए
|
||||
pip install jupyter numpy pillow tensorflow
|
||||
```
|
||||
|
||||
या मुख्य पाठ्यक्रम से conda एनवायरनमेंट का उपयोग करें:
|
||||
या मुख्य पाठ्यक्रम से conda पर्यावरण का उपयोग करें:
|
||||
|
||||
```bash
|
||||
conda env create --name ai4beg --file ../environment.yml
|
||||
|
|
@ -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. **Image Classifier आज़माएं** - वास्तविक छवियों के साथ AI को क्रियान्वित होते देखें
|
||||
4. **Text Sentiment का विश्लेषण करें** - प्राकृतिक भाषा प्रसंस्करण का अन्वेषण करें
|
||||
1. **"Hello AI World" के साथ शुरुआत करें** - पैटर्न मान्यता की मूल बातें सीखें
|
||||
2. **एक सरल न्यूरल नेटवर्क बनाएं** - समझें कि न्यूरल नेटवर्क कैसे काम करते हैं
|
||||
3. **इमेज क्लासिफायर आज़माएँ** - वास्तविक छवियों के साथ AI देखें
|
||||
4. **टेक्स्ट भावना का विश्लेषण करें** - प्राकृतिक भाषा प्रसंस्करण का अन्वेषण करें
|
||||
|
||||
## 💡 शुरुआती लोगों के लिए सुझाव
|
||||
## 💡 शुरुआती के लिए सुझाव
|
||||
|
||||
- **कोड टिप्पणियों को ध्यान से पढ़ें** - वे बताते हैं कि प्रत्येक लाइन क्या करती है
|
||||
- **प्रयोग करें!** - मान बदलने की कोशिश करें और देखें क्या होता है
|
||||
- **कोड टिप्पणियाँ ध्यान से पढ़ें** - वे बताते हैं कि प्रत्येक पंक्ति क्या करती है
|
||||
- **प्रयोग करें!** - मानों में बदलाव करके देखें क्या होता है
|
||||
- **सब कुछ समझने की चिंता न करें** - सीखने में समय लगता है
|
||||
- **प्रश्न पूछें** - [Discussion बोर्ड](https://github.com/microsoft/AI-For-Beginners/discussions) का उपयोग करें
|
||||
- **प्रश्न पूछें** - [Discussion board](https://github.com/microsoft/AI-For-Beginners/discussions) का उपयोग करें
|
||||
|
||||
## 🔗 अगले कदम
|
||||
|
||||
इन उदाहरणों को पूरा करने के बाद, पूरा पाठ्यक्रम देखें:
|
||||
इन उदाहरणों को पूरा करने के बाद, पूर्ण पाठ्यक्रम देखें:
|
||||
- [AI का परिचय](../lessons/1-Intro/README.md)
|
||||
- [न्यूरल नेटवर्क](../lessons/3-NeuralNetworks/README.md)
|
||||
- [न्यूरल नेटवर्क्स](../lessons/3-NeuralNetworks/README.md)
|
||||
- [कंप्यूटर विज़न](../lessons/4-ComputerVision/README.md)
|
||||
- [प्राकृतिक भाषा प्रसंस्करण](../lessons/5-NLP/README.md)
|
||||
|
||||
## 🤝 योगदान
|
||||
## 🤝 योगदान करें
|
||||
|
||||
क्या ये उदाहरण उपयोगी लगे? इन्हें बेहतर बनाने में मदद करें:
|
||||
- समस्याओं की रिपोर्ट करें या सुधार का सुझाव दें
|
||||
- शुरुआती लोगों के लिए और उदाहरण जोड़ें
|
||||
- दस्तावेज़ और टिप्पणियों को बेहतर बनाएं
|
||||
क्या आपको ये उदाहरण मददगार लगे? हमें इन्हें बेहतर बनाने में मदद करें:
|
||||
- समस्याओं की रिपोर्ट करें या सुधार सुझाएँ
|
||||
- शुरुआतियों के लिए और उदाहरण जोड़ें
|
||||
- दस्तावेज़ीकरण और टिप्पणियों में सुधार करें
|
||||
|
||||
---
|
||||
|
||||
*याद रखें: हर विशेषज्ञ कभी शुरुआती था। खुशहाल सीखने की यात्रा! 🎓*
|
||||
*याद रखें: हर विशेषज्ञ कभी न कभी एक शुरुआत करने वाला था। खुशहाल सीखने के लिए! 🎓*
|
||||
|
||||
---
|
||||
|
||||
**अस्वीकरण**:
|
||||
यह दस्तावेज़ AI अनुवाद सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) का उपयोग करके अनुवादित किया गया है। जबकि हम सटीकता के लिए प्रयास करते हैं, कृपया ध्यान दें कि स्वचालित अनुवाद में त्रुटियां या अशुद्धियां हो सकती हैं। मूल भाषा में उपलब्ध मूल दस्तावेज़ को आधिकारिक स्रोत माना जाना चाहिए। महत्वपूर्ण जानकारी के लिए, पेशेवर मानव अनुवाद की सिफारिश की जाती है। इस अनुवाद के उपयोग से उत्पन्न किसी भी गलतफहमी या गलत व्याख्या के लिए हम उत्तरदायी नहीं हैं।
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**अस्वीकरण**:
|
||||
इस दस्तावेज़ का अनुवाद AI अनुवाद सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) का उपयोग करके किया गया है। जबकि हम सटीकता के लिए प्रयास करते हैं, कृपया ध्यान दें कि स्वचालित अनुवादों में त्रुटियाँ या अशुद्धियाँ हो सकती हैं। मूल दस्तावेज़ अपनी मूल भाषा में ही प्रामाणिक स्रोत माना जाना चाहिए। महत्वपूर्ण जानकारी के लिए, पेशेवर मानव अनुवाद की सिफारिश की जाती है। इस अनुवाद के उपयोग से उत्पन्न किसी भी गलतफहमी या गलत व्याख्या के लिए हम उत्तरदायी नहीं हैं।
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -1,12 +1,12 @@
|
|||
# कोड कैसे चलाएं
|
||||
# कोड कैसे चलाएँ
|
||||
|
||||
इस पाठ्यक्रम में बहुत सारे निष्पादन योग्य उदाहरण और प्रयोगशालाएँ हैं जिन्हें आप चलाना चाहेंगे। ऐसा करने के लिए, आपके पास इस पाठ्यक्रम के हिस्से के रूप में प्रदान किए गए Jupyter नोटबुक में Python कोड निष्पादित करने की क्षमता होनी चाहिए। कोड चलाने के लिए आपके पास कई विकल्प हैं:
|
||||
इस पाठ्यक्रम में बहुत सारे निष्पादनीय उदाहरण और प्रयोगशालाएँ शामिल हैं जिन्हें आप चलाना चाहेंगे। ऐसा करने के लिए, आपके पास इस पाठ्यक्रम के हिस्से के रूप में प्रदान किए गए Jupyter नोटबुक्स में Python कोड निष्पादित करने की क्षमता होनी चाहिए। कोड चलाने के लिए आपके पास कई विकल्प हैं:
|
||||
|
||||
## अपने कंप्यूटर पर स्थानीय रूप से चलाएं
|
||||
## अपने कंप्यूटर पर स्थानीय रूप से चलाएँ
|
||||
|
||||
अपने कंप्यूटर पर स्थानीय रूप से कोड चलाने के लिए, Python इंस्टॉलेशन आवश्यक है। एक सिफारिश है **[miniconda](https://conda.io/en/latest/miniconda.html)** इंस्टॉल करना - यह एक हल्का इंस्टॉलेशन है जो विभिन्न Python **वर्चुअल वातावरणों** के लिए `conda` पैकेज मैनेजर का समर्थन करता है।
|
||||
अपने कंप्यूटर पर कोड चलाने के लिए, Python इंस्टॉलेशन आवश्यक है। एक सुझाव है **[miniconda](https://conda.io/en/latest/miniconda.html)** इंस्टॉल करना - यह एक हल्का इंस्टॉलेशन है जो विभिन्न Python **वर्चुअल वातावरण** के लिए `conda` पैकेज मैनेजर का समर्थन करता है।
|
||||
|
||||
miniconda इंस्टॉल करने के बाद, रिपॉजिटरी क्लोन करें और इस कोर्स के लिए उपयोग किए जाने वाले वर्चुअल वातावरण को बनाएँ:
|
||||
miniconda इंस्टॉल करने के बाद, रिपोजिटरी क्लोन करें और इस कोर्स के लिए उपयोग किए जाने वाले वर्चुअल वातावरण बनाएं:
|
||||
|
||||
```bash
|
||||
git clone http://github.com/microsoft/ai-for-beginners
|
||||
|
|
@ -15,57 +15,57 @@ conda env create --name ai4beg --file .devcontainer/environment.yml
|
|||
conda activate ai4beg
|
||||
```
|
||||
|
||||
### Python एक्सटेंशन के साथ Visual Studio Code का उपयोग करना
|
||||
### Visual Studio Code के साथ Python एक्सटेंशन का उपयोग करना
|
||||
|
||||
यह पाठ्यक्रम सबसे अच्छा तब उपयोग किया जाता है जब आप इसे [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) के साथ खोलते हैं।
|
||||
इस पाठ्यक्रम का उपयोग सबसे अच्छा होता है जब आप इसे [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
|
||||
```
|
||||
या
|
||||
या
|
||||
```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** बटन पर क्लिक करें, एक कोडस्पेस शुरू करें, और तुरंत चलना शुरू करें।
|
||||
* **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)** का उपयोग करना। [Binder](https://mybinder.org) उसके जैसा क्लाउड में मुफ्त कंप्यूटिंग संसाधन प्रदान करता है ताकि आप GitHub पर कुछ कोड परीक्षण कर सकें। फ्रंट पेज पर एक बटन है जो रिपोजिटरी को Binder में खोलता है - इससे आपको तुरंत बाइंडर साइट पर ले जाया जाएगा, जो अंतर्निहित कंटेनर बनाकर आपके लिए सहज रूप से Jupyter वेब इंटरफेस शुरू करेगा।
|
||||
|
||||
> **नोट**: दुरुपयोग से बचने के लिए, Binder के पास कुछ वेब संसाधनों तक पहुँच अवरुद्ध है। यह कुछ कोड के काम करने में बाधा डाल सकता है, जो मॉडल और/या डेटासेट सार्वजनिक इंटरनेट से प्राप्त करता है। आपको कुछ समाधान खोजने पड़ सकते हैं। इसके अलावा, Binder द्वारा प्रदान किए गए कंप्यूट संसाधन काफी बुनियादी हैं, इसलिए प्रशिक्षण धीमा होगा, विशेष रूप से बाद के, अधिक जटिल पाठों में।
|
||||
> **ध्यान दें**: दुरुपयोग को रोकने के लिए, Binder को कुछ वेब संसाधनों तक पहुंच ब्लॉक की गई है। इससे कुछ कोड काम नहीं कर पाएगा, जो मॉडल और/या डेटा सेट को सार्वजनिक इंटरनेट से प्राप्त करता है। आपको कुछ समाधान ढूंढने पड़ सकते हैं। साथ ही, Binder द्वारा प्रदान किए गए कंप्यूट संसाधन काफी मूलभूत हैं, इसलिए प्रशिक्षण धीमा होगा, विशेषकर बाद के अधिक जटिल पाठों में।
|
||||
|
||||
## 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) के माध्यम से, या अपने संस्थान के माध्यम से:
|
||||
|
||||
* [Data Science वर्चुअल मशीन](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) बनाएँ और Jupyter के माध्यम से उससे कनेक्ट करें। आप फिर मशीन पर सीधे रेपो क्लोन कर सकते हैं, और सीखना शुरू कर सकते हैं। NC-श्रृंखला VM में GPU समर्थन होता है।
|
||||
* [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-सीरीज VMs GPU समर्थन रखते हैं।
|
||||
|
||||
> **नोट**: कुछ सब्सक्रिप्शन, जिनमें Azure for Students शामिल है, बॉक्स से बाहर GPU समर्थन प्रदान नहीं करते हैं। आपको टेक्निकल सपोर्ट अनुरोध के जरिए अतिरिक्त GPU कोर प्राप्त करना पड़ सकता है।
|
||||
> **ध्यान दें**: कुछ सब्सक्रिप्शन, जिसमें Azure for Students शामिल है, बॉक्स से GPU समर्थन नहीं देते। आपको तकनीकी सहायता अनुरोध के साथ अतिरिक्त GPU कोर का अनुरोध करना पड़ सकता है।
|
||||
|
||||
* [Azure Machine Learning Workspace](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 Workspace](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) का उपयोग करके अनुवादित किया गया है। जबकि हम सटीकता के लिए प्रयासरत हैं, कृपया ध्यान दें कि स्वचालित अनुवादों में त्रुटियाँ या असत्यताएं हो सकती हैं। मूल दस्तावेज़ अपनी मूल भाषा में प्रामाणिक स्रोत माना जाना चाहिए। महत्वपूर्ण जानकारी के लिए, पेशेवर मानव अनुवाद की सिफारिश की जाती है। इस अनुवाद के उपयोग से उत्पन्न किसी भी गलतफहमी या गलत व्याख्या के लिए हम ज़िम्मेदार नहीं हैं।
|
||||
इस दस्तावेज़ का अनुवाद AI अनुवाद सेवा [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",
|
||||
"CNNs को ट्रेन करने में काफी समय लग सकता है, और इसके लिए बहुत सारे डेटा की आवश्यकता होती है। हालांकि, अधिकांश समय नेटवर्क द्वारा इमेज से पैटर्न निकालने के लिए उपयोग किए जाने वाले सर्वोत्तम लो-लेवल फिल्टर्स को सीखने में खर्च होता है। एक स्वाभाविक सवाल उठता है - क्या हम एक डेटासेट पर प्रशिक्षित न्यूरल नेटवर्क का उपयोग करके इसे अलग-अलग इमेज को वर्गीकृत करने के लिए बिना पूरी ट्रेनिंग प्रक्रिया के अनुकूलित कर सकते हैं?\n",
|
||||
"CNN को प्रशिक्षित करने में बहुत समय लग सकता है, और उस कार्य के लिए बहुत डेटा की आवश्यकता होती है। हालांकि, अधिकतर समय उस सर्वोत्तम निम्न-स्तरीय फिल्टर को सीखने में व्यतीत होता है जिसका उपयोग नेटवर्क छवियों से पैटर्न निकालने के लिए करता है। एक स्वाभाविक प्रश्न उत्पन्न होता है - क्या हम एक डेटासेट पर प्रशिक्षित न्यूरल नेटवर्क का उपयोग कर सकते हैं और इसे पूरी प्रशिक्षण प्रक्रिया के बिना विभिन्न छवियों को वर्गीकृत करने के लिए अनुकूलित कर सकते हैं?\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 बिल्लियाँ बनाम कुत्ते डेटासेट](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,7 +453,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"> **नोट**: डेटासेट में सभी छवियां फ्लोटिंग पॉइंट टेन्सर्स के रूप में 0-255 की रेंज में प्रस्तुत की गई हैं। उन्हें न्यूरल नेटवर्क में पास करने से पहले, हमें उन मानों को 0-1 की रेंज में स्केल करना होगा। छवियों को प्लॉट करते समय, हमें या तो वही करना होगा, या मानों को `int` प्रकार में बदलना होगा (जो हम ऊपर कोड में करते हैं), ताकि `matplotlib` को दिखा सकें कि हम मूल अस्केल्ड छवि को प्लॉट करना चाहते हैं।\n"
|
||||
"> **नोट**: डेटासेट में सभी चित्र फ्लोटिंग पॉइंट टेंसर के रूप में 0-255 सीमा के साथ प्रदर्शित किए गए हैं। उन्हें न्यूरल नेटवर्क में भेजने से पहले, हमें उन मानों को 0-1 सीमा में स्केल करना होगा। चित्रों को प्लॉट करते समय, हमें या तो यही करना होगा, या मानों को `int` प्रकार में बदलना होगा (जो हमने ऊपर कोड में किया है), ताकि `matplotlib` को दिखाया जा सके कि हम मूल बिना-स्केल किए चित्र को प्लॉट करना चाहते हैं।\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -462,7 +462,7 @@
|
|||
"source": [
|
||||
"## पूर्व-प्रशिक्षित मॉडल\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,19 +521,16 @@
|
|||
"metadata": {},
|
||||
"source": [
|
||||
"यहाँ कुछ महत्वपूर्ण बातें हैं:\n",
|
||||
"\n",
|
||||
"* किसी भी प्री-ट्रेंड नेटवर्क को इनपुट देने से पहले उसे एक निश्चित तरीके से प्री-प्रोसेस करना होता है। यह `preprocess_input` फ़ंक्शन को कॉल करके किया जाता है, जो इमेजेस के बैच को प्राप्त करता है और उनके प्रोसेस्ड रूप को लौटाता है। VGG-16 के मामले में, इमेजेस को नॉर्मलाइज़ किया जाता है और प्रत्येक चैनल के लिए कुछ पूर्व-निर्धारित औसत मान घटाया जाता है। ऐसा इसलिए किया जाता है क्योंकि VGG-16 को मूल रूप से इसी प्री-प्रोसेसिंग के साथ प्रशिक्षित किया गया था।\n",
|
||||
"\n",
|
||||
"* इनपुट बैच पर न्यूरल नेटवर्क लागू किया जाता है, और परिणामस्वरूप हमें 1000-एलिमेंट टेन्सर्स का बैच प्राप्त होता है, जो प्रत्येक क्लास की संभावना दिखाता है। हम इस टेन्सर पर `argmax` को कॉल करके सबसे संभावित क्लास नंबर का पता लगा सकते हैं।\n",
|
||||
"\n",
|
||||
"* प्राप्त परिणाम एक [`ImageNet` क्लास का नंबर](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a) होता है। इस परिणाम को समझने के लिए, हम `decode_predictions` फ़ंक्शन का उपयोग कर सकते हैं, जो शीर्ष n क्लासेस को उनके नामों के साथ लौटाता है।\n"
|
||||
"* किसी भी प्री-ट्रेंड नेटवर्क को इनपुट देने से पहले इसे एक निश्चित तरीके से प्री-प्रोसेस करना होता है। यह संबंधित `preprocess_input` फंक्शन को कॉल करके किया जाता है, जो कि छवियों के एक बैच को प्राप्त करता है, और उनकी प्रोसेस की हुई रूप देता है। VGG-16 के मामले में, छवियों को सामान्यीकृत किया जाता है, और प्रत्येक चैनल के लिए कुछ पूर्व-परिभाषित औसत मान घटाया जाता है। ऐसा इसलिए किया जाता है क्योंकि VGG-16 को मूल रूप से इसी प्री-प्रोसेसिंग के साथ प्रशिक्षित किया गया था।\n",
|
||||
"* इनपुट बैच पर न्यूरल नेटवर्क लागू किया जाता है, और हमें परिणामस्वरूप 1000-तत्व वाले टेन्सर का एक बैच प्राप्त होता है जो प्रत्येक वर्ग की संभावना दिखाता है। इस टेन्सर पर `argmax` कॉल करके हम सबसे संभावित वर्ग संख्या पा सकते हैं।\n",
|
||||
"* प्राप्त परिणाम एक [ `ImageNet` वर्ग की संख्या है](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a)। इस परिणाम को समझने के लिए, हम `decode_predictions` फंक्शन का भी उपयोग कर सकते हैं, जो टॉप n वर्गों को उनके नामों के साथ लौटाता है।\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"आइए VGG-16 नेटवर्क की संरचना भी देखें:\n"
|
||||
"आइए VGG-16 नेटवर्क की वास्तुकला भी देखें:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -600,9 +607,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## GPU गणनाएँ\n",
|
||||
"## GPU गणना\n",
|
||||
"\n",
|
||||
"डीप न्यूरल नेटवर्क, जैसे VGG-16 और अन्य आधुनिक आर्किटेक्चर को चलाने के लिए काफी अधिक गणनात्मक शक्ति की आवश्यकता होती है। यदि GPU एक्सेलेरेशन उपलब्ध है, तो इसका उपयोग करना समझदारी है। सौभाग्य से, यदि GPU उपलब्ध है तो Keras स्वचालित रूप से GPU पर गणनाओं को तेज कर देता है। हम निम्नलिखित कोड का उपयोग करके जांच सकते हैं कि Tensorflow GPU का उपयोग करने में सक्षम है या नहीं:\n"
|
||||
"गहरे न्यूरल नेटवर्क, जैसे कि VGG-16 और अन्य अधिक आधुनिक आर्किटेक्चर को चलाने के लिए काफी गणनात्मक शक्ति की आवश्यकता होती है। यदि उपलब्ध हो तो GPU त्वरण का उपयोग करना समझदारी है। सौभाग्य से, Keras यदि उपलब्ध हो तो GPU पर गणनाओं को स्वतः गति देता है। हम निम्नलिखित कोड का उपयोग करके जांच सकते हैं कि Tensorflow GPU का उपयोग करने में सक्षम है या नहीं:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -629,9 +636,10 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n",
|
||||
"## VGG फीचर्स निकालना\n",
|
||||
"\n",
|
||||
"अगर हम अपनी छवियों से फीचर्स निकालने के लिए VGG-16 का उपयोग करना चाहते हैं, तो हमें मॉडल की अंतिम वर्गीकरण परतों के बिना संस्करण की आवश्यकता होगी। हम इस कोड का उपयोग करके VGG-16 मॉडल को बिना शीर्ष परतों के इंस्टेंटिएट कर सकते हैं:\n"
|
||||
"यदि हम अपने चित्रों से फीचर्स निकालने के लिए VGG-16 का उपयोग करना चाहते हैं, तो हमें अंतिम वर्गीकरण परतों के बिना मॉडल चाहिए। हम इस कोड का उपयोग करके VGG-16 मॉडल को शीर्ष परतों के बिना इंस्टेंटिएट कर सकते हैं:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -683,9 +691,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"फीचर टेंसर का आयाम 7x7x512 है, लेकिन इसे विज़ुअलाइज़ करने के लिए हमें इसे 2D रूप में बदलना पड़ा।\n",
|
||||
"फीचर टेंसर का आयाम 7x7x512 है, लेकिन इसे देखने के लिए हमें इसे 2D रूप में पुनः आकार देना पड़ा।\n",
|
||||
"\n",
|
||||
"अब चलिए देखते हैं कि क्या इन फीचर्स का उपयोग इमेज को वर्गीकृत करने के लिए किया जा सकता है। चलिए कुछ इमेज का हिस्सा (हमारे मामले में 50 मिनीबैच) मैन्युअली लेते हैं और उनके फीचर वेक्टर को पहले से ही प्री-कंप्यूट करते हैं। हम इसके लिए Tensorflow **dataset** API का उपयोग कर सकते हैं। `map` फ़ंक्शन एक डेटासेट लेता है और दिए गए लैम्ब्डा-फ़ंक्शन को लागू करके इसे ट्रांसफॉर्म करता है। हम इस मैकेनिज़्म का उपयोग करके नए डेटासेट्स, `ds_features_train` और `ds_features_test`, बनाते हैं, जो मूल इमेज की बजाय VGG-एक्सट्रैक्टेड फीचर्स को शामिल करते हैं।\n"
|
||||
"अब देखते हैं कि क्या उन फीचर्स का उपयोग छवियों को वर्गीकृत करने के लिए किया जा सकता है। चलिए मैन्युअली कुछ छवियों का हिस्सा लेते हैं (हमारे मामले में 50 मिनीबैच), और उनके फीचर वेक्टर पहले से गणना करते हैं। हम Tensorflow **dataset** API का उपयोग यह करने के लिए कर सकते हैं। `map` फ़ंक्शन एक डेटासेट लेता है और इसे ट्रांसफॉर्म करने के लिए एक दिए गए लैम्ब्डा-फ़ंक्शन को लागू करता है। हम इस तंत्र का उपयोग नए डेटासेट बनाने के लिए करते हैं, `ds_features_train` और `ds_features_test`, जिनमें मूल छवियों के बजाय VGG-निकाले गए फीचर्स होते हैं।\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -715,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"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -746,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"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -796,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 मिलियन हैं, लेकिन हम केवल 25k पैरामीटर को प्रशिक्षित कर रहे हैं। शीर्ष स्तर के कन्वोल्यूशनल फिल्टर्स के सभी अन्य पैरामीटर पहले से प्रशिक्षित हैं। यह अच्छा है, क्योंकि हम छोटे उदाहरणों के साथ छोटे पैरामीटर की संख्या को फाइन-ट्यून कर सकते हैं।\n",
|
||||
"आप ध्यान देंगे कि जबकि हमारे नेटवर्क में कुल पैरामीटर लगभग 15 मिलियन हैं, हम केवल 25k पैरामीटर प्रशिक्षित कर रहे हैं। ऊपर के स्तर के संवहनी फ़िल्टर के सभी अन्य पैरामीटर पूर्व-प्रशिक्षित हैं। यह अच्छा है, क्योंकि हम कम संख्या में उदाहरणों के साथ कम संख्या में पैरामीटर को फाइन-ट्यून करने में सक्षम हैं।\n",
|
||||
"\n",
|
||||
"अब हम अपने नेटवर्क को प्रशिक्षित करेंगे और देखेंगे कि हम कितना अच्छा परिणाम प्राप्त कर सकते हैं। अपेक्षा करें कि रनिंग टाइम काफी लंबा होगा, और यदि निष्पादन कुछ समय के लिए रुका हुआ लगे तो चिंता न करें।\n"
|
||||
"अब हम अपने नेटवर्क को प्रशिक्षित करेंगे और देखेंगे कि हम कितना अच्छा कर सकते हैं। अपेक्षाकृत लंबा रनिंग समय हो सकता है, और यदि निष्पादन कुछ समय के लिए फ्रीज़ लगता है तो चिंता न करें।\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -827,11 +835,11 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"ऐसा लगता है कि हमने बिल्लियों और कुत्तों के बीच का वर्गीकरण काफी सटीकता से प्राप्त कर लिया है!\n",
|
||||
"ऐसा लगता है कि हमने बिल्ली बनाम कुत्ते वर्गीकर्ता को काफी सटीकता से प्राप्त कर लिया है! \n",
|
||||
"\n",
|
||||
"## मॉडल को सेव और लोड करना\n",
|
||||
"## मॉडल सहेजना और लोड करना\n",
|
||||
"\n",
|
||||
"जब हमने मॉडल को प्रशिक्षित कर लिया है, तो हम भविष्य में उपयोग के लिए मॉडल की संरचना और प्रशिक्षित वज़न को एक फाइल में सेव कर सकते हैं:\n"
|
||||
"एक बार जब हमने मॉडल को प्रशिक्षित कर लिया, तो हम मॉडल की वास्तुकला और प्रशिक्षित वज़न को भविष्य में उपयोग के लिए एक फ़ाइल में सहेज सकते हैं:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -855,7 +863,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"हम फिर किसी भी समय फ़ाइल से मॉडल लोड कर सकते हैं। यह उपयोगी हो सकता है यदि अगला प्रयोग मॉडल को नष्ट कर देता है - आपको शुरू से फिर से शुरू नहीं करना पड़ेगा।\n"
|
||||
"हम फिर कभी भी फाइल से मॉडल लोड कर सकते हैं। यह तब उपयोगी हो सकता है जब अगला प्रयोग मॉडल को नष्ट कर देता है - तब आपको फिर से शुरू करने की आवश्यकता नहीं होगी।\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -871,15 +879,15 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## ट्रांसफर लर्निंग का फाइन-ट्यूनिंग\n",
|
||||
"## फाइन-ट्यूनिंग ट्रांसफर लर्निंग\n",
|
||||
"\n",
|
||||
"पिछले सेक्शन में, हमने अपने डेटा सेट में इमेज को वर्गीकृत करने के लिए अंतिम क्लासिफायर लेयर को प्रशिक्षित किया था। हालांकि, हमने फीचर एक्सट्रैक्टर को फिर से प्रशिक्षित नहीं किया था, और हमारा मॉडल उन फीचर्स पर निर्भर था जो मॉडल ने ImageNet डेटा पर सीखे थे। यदि आपके ऑब्जेक्ट्स सामान्य ImageNet इमेज से दृश्य रूप से अलग हैं, तो फीचर्स का यह संयोजन सबसे अच्छा काम नहीं कर सकता। इसलिए, यह समझदारी होगी कि हम कॉन्वोल्यूशनल लेयर्स को भी प्रशिक्षित करना शुरू करें।\n",
|
||||
"पिछले सेक्शन में, हमने अंतिम क्लासिफायर लेयर को हमारे अपने डेटासेट में इमेजेज को वर्गीकृत करने के लिए प्रशिक्षित किया था। हालांकि, हमने फीचर एक्स्ट्रैक्टर को पुनः प्रशिक्षित नहीं किया, और हमारा मॉडल उन फीचर्स पर निर्भर था जो मॉडल ने ImageNet डेटा पर सीखे थे। अगर आपके ऑब्जेक्ट्स सामान्य ImageNet इमेजेज से दृश्य रूप से अलग हैं, तो यह फीचर्स का संयोजन सबसे अच्छा काम नहीं कर सकता। इसलिए कॉन्वोल्यूशनल लेयर्स को भी ट्रेन करना शुरू करना समझदारी होगी।\n",
|
||||
"\n",
|
||||
"इसके लिए, हम उन कॉन्वोल्यूशनल फ़िल्टर पैरामीटर्स को अनफ्रीज़ कर सकते हैं जिन्हें हमने पहले फ्रीज़ किया था।\n",
|
||||
"ऐसा करने के लिए, हम उन कॉन्वोल्यूशनल फिल्टर पैरामीटर्स को अनफ्रिज़ कर सकते हैं जिन्हें हमने पहले फ्रीज़ किया हुआ था। \n",
|
||||
"\n",
|
||||
"> **Note:** यह महत्वपूर्ण है कि आप पहले पैरामीटर्स को फ्रीज़ करें और क्लासिफिकेशन लेयर में वेट्स को स्थिर करने के लिए कुछ एपॉक्स का प्रशिक्षण करें। यदि आप तुरंत अनफ्रीज़ किए गए पैरामीटर्स के साथ एंड-टू-एंड नेटवर्क का प्रशिक्षण शुरू करते हैं, तो बड़े एरर प्री-ट्रेंड वेट्स को कॉन्वोल्यूशनल लेयर्स में नष्ट कर सकते हैं।\n",
|
||||
"> **नोट:** यह महत्वपूर्ण है कि आप पहले पैरामीटर्स को फ्रीज़ करें और क्लासिफिकेशन लेयर में वेट्स को स्थिर करने के लिए कई एपोक्स का प्रशिक्षण करें। यदि आप तुरंत अनफ्रिज़ेड पैरामीटर्स के साथ एंड-टू-एंड नेटवर्क का प्रशिक्षण शुरू करते हैं, तो बड़ी त्रुटियां कॉन्वोल्यूशनल लेयर्स में प्री-ट्रेंड वेट्स को नष्ट कर सकती हैं।\n",
|
||||
"\n",
|
||||
"हमारा कॉन्वोल्यूशनल VGG-16 मॉडल पहले लेयर के अंदर स्थित है, और यह स्वयं कई लेयर्स से बना है। हम इसकी संरचना देख सकते हैं:\n"
|
||||
"हमारा कॉन्वोल्यूशनल VGG-16 मॉडल पहली लेयर के अंदर स्थित है, और यह स्वयं कई लेयर्स से बना है। हम इसके स्ट्रक्चर पर एक नजर डाल सकते हैं: \n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -947,7 +955,9 @@
|
|||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": []
|
||||
"source": [
|
||||
"हम अभिसरण आधार की सभी परतों को अनफ्रीज कर सकते हैं:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
|
|
@ -962,7 +972,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"हालांकि, सभी को एक साथ अनफ्रीज करना सबसे अच्छा विचार नहीं है। हम पहले कुछ अंतिम कन्वोल्यूशन लेयर्स को ही अनफ्रीज कर सकते हैं, क्योंकि वे उच्च स्तर के पैटर्न रखते हैं जो हमारी छवियों के लिए प्रासंगिक हैं। उदाहरण के लिए, शुरुआत में, हम अंतिम 4 लेयर्स को छोड़कर सभी लेयर्स को फ्रीज कर सकते हैं:\n"
|
||||
"हालांकि, सभी को एक साथ अनफ्रीज़ करना सबसे अच्छा विचार नहीं है। हम सबसे पहले केवल कुछ अंतिम कन्वोल्यूशन लेयर्स को ही अनफ्रीज़ कर सकते हैं, क्योंकि उनमें उच्च स्तर के पैटर्न होते हैं जो हमारी छवियों के लिए प्रासंगिक होते हैं। उदाहरण के लिए, शुरुआत के लिए, हम सभी लेयर्स को छोड़कर अंतिम 4 को फ्रीज़ कर सकते हैं: \n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1001,11 +1011,11 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"ट्रेन करने योग्य पैरामीटरों की संख्या में काफी वृद्धि हुई है, लेकिन यह अभी भी सभी पैरामीटरों का लगभग 50% ही है।\n",
|
||||
"ध्यान दें कि ट्रेन करने योग्य पैरामीटरों की संख्या काफी बढ़ गई है, लेकिन यह फिर भी सभी पैरामीटरों का लगभग 50% है।\n",
|
||||
"\n",
|
||||
"अनफ्रीज़ करने के बाद, हम कुछ और epochs का प्रशिक्षण कर सकते हैं (हमारे उदाहरण में, हम केवल एक करेंगे)। आप कम learning rate भी चुन सकते हैं, ताकि प्री-ट्रेंड वेट्स पर प्रभाव को कम किया जा सके। हालांकि, कम learning rate के साथ भी, आप उम्मीद कर सकते हैं कि प्रशिक्षण की शुरुआत में सटीकता कम हो जाएगी, और अंततः फिक्स्ड वेट्स के मामले की तुलना में थोड़ा उच्च स्तर तक पहुंच जाएगी।\n",
|
||||
"अनफ़्रीजिंग के बाद, हम कुछ और प्रशिक्षण के एपॉक्स कर सकते हैं (हमारे उदाहरण में, हम सिर्फ एक करेंगे)। आप प्री-ट्रेंड वेट्स पर प्रभाव को कम करने के लिए कम लर्निंग रेट भी चुन सकते हैं। हालांकि, कम लर्निंग रेट के साथ भी, आप प्रशिक्षण की शुरुआत में सटीकता के घटने की उम्मीद कर सकते हैं, जब तक कि यह अंत में फिक्स्ड वेट्स के मामले की तुलना में थोड़ा अधिक स्तर तक नहीं पहुंच जाती।\n",
|
||||
"\n",
|
||||
"> **Note:** यह प्रशिक्षण बहुत धीमी गति से होता है, क्योंकि हमें नेटवर्क की कई लेयर्स के माध्यम से gradients को वापस propagate करना पड़ता है!\n"
|
||||
"> **नोट:** यह प्रशिक्षण बहुत धीमी गति से होता है, क्योंकि हमें नेटवर्क की कई परतों के माध्यम से ग्रेडिएंट्स को वापस प्रसारित करना पड़ता है!\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1029,9 +1039,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"हम संभवतः उच्च प्रशिक्षण सटीकता प्राप्त करेंगे, क्योंकि हम अधिक शक्तिशाली नेटवर्क का उपयोग कर रहे हैं जिसमें अधिक पैरामीटर हैं, लेकिन मान्यता सटीकता उतनी अधिक नहीं बढ़ेगी।\n",
|
||||
"हम संभवतः उच्चतर प्रशिक्षण सटीकता प्राप्त करेंगे, क्योंकि हम अधिक शक्तिशाली नेटवर्क का उपयोग कर रहे हैं जिसमें अधिक पैरामीटर हैं, लेकिन सत्यापन सटीकता उतनी अधिक नहीं बढ़ेगी।\n",
|
||||
"\n",
|
||||
"नेटवर्क की कुछ और परतों को अनफ्रीज़ करके और अधिक प्रशिक्षण करने के लिए स्वतंत्र महसूस करें, ताकि आप देख सकें कि क्या आप उच्च सटीकता प्राप्त कर सकते हैं!\n"
|
||||
"नेटवर्क की कुछ और परतों को अनफ्रीज करके और अधिक प्रशिक्षण देने में स्वतंत्र महसूस करें, यह देखने के लिए कि क्या आप उच्च सटीकता प्राप्त कर सकते हैं!\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1040,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"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1442,11 +1452,11 @@
|
|||
"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"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1455,16 +1465,16 @@
|
|||
"source": [
|
||||
"## मुख्य बातें\n",
|
||||
"\n",
|
||||
"ट्रांसफर लर्निंग का उपयोग करके, हम अपने कस्टम ऑब्जेक्ट क्लासिफिकेशन टास्क के लिए जल्दी से एक क्लासिफायर तैयार कर पाए और उच्च सटीकता प्राप्त की। हालांकि, यह उदाहरण पूरी तरह से निष्पक्ष नहीं था, क्योंकि मूल VGG-16 नेटवर्क को पहले से ही बिल्लियों और कुत्तों को पहचानने के लिए प्रशिक्षित किया गया था, और इसलिए हम नेटवर्क में पहले से मौजूद अधिकांश पैटर्न को ही पुनः उपयोग कर रहे थे। आप अपेक्षा कर सकते हैं कि अधिक विशिष्ट डोमेन-विशिष्ट वस्तुओं, जैसे कि किसी प्लांट की प्रोडक्शन लाइन पर विवरण या विभिन्न पेड़ों की पत्तियों पर, सटीकता कम हो सकती है।\n",
|
||||
"ट्रांसफर लर्निंग का उपयोग करके, हम अपने कस्टम ऑब्जेक्ट वर्गीकरण कार्य के लिए जल्दी से एक वर्गीकर्ता तैयार करने में सक्षम थे, और उच्च सटीकता प्राप्त कर सके। हालांकि, यह उदाहरण पूरी तरह से न्यायसंगत नहीं था, क्योंकि मूल VGG-16 नेटवर्क को बिल्ली और कुत्तों को पहचानने के लिए प्री-ट्रेन किया गया था, और इसलिए हम केवल नेटवर्क में पहले से मौजूद अधिकांश पैटर्न्स का ही पुन: उपयोग कर रहे थे। आप अधिक विदेशी डोमेन-विशिष्ट वस्तुओं पर, जैसे कि किसी संयंत्र में उत्पादन लाइन के विवरण, या विभिन्न पेड़ के पत्तों पर, कम सटीकता की अपेक्षा कर सकते हैं।\n",
|
||||
"\n",
|
||||
"आप देख सकते हैं कि अब हम जो अधिक जटिल कार्य हल कर रहे हैं, वे उच्च कंप्यूटेशनल पावर की मांग करते हैं और उन्हें आसानी से CPU पर हल नहीं किया जा सकता। अगले यूनिट में, हम कम कंप्यूट संसाधनों का उपयोग करके उसी मॉडल को प्रशिक्षित करने के लिए एक हल्की इम्प्लीमेंटेशन का उपयोग करने की कोशिश करेंगे, जिससे सटीकता में केवल मामूली कमी आएगी।\n"
|
||||
"आप देख सकते हैं कि अधिक जटिल कार्य जिन्हें हम अभी हल कर रहे हैं, उनमें उच्च कम्प्यूटेशनल पावर की आवश्यकता होती है, और इन्हें CPU पर आसानी से हल नहीं किया जा सकता। अगले यूनिट में, हम कम कम्प्यूट स्रोतों का उपयोग करके उसी मॉडल को प्रशिक्षित करने के लिए अधिक हल्की वजन वाली कार्यान्वयन का उपयोग करने की कोशिश करेंगे, जिससे थोड़ी कम सटीकता होगी।\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**अस्वीकरण**: \nयह दस्तावेज़ AI अनुवाद सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) का उपयोग करके अनुवादित किया गया है। जबकि हम सटीकता सुनिश्चित करने का प्रयास करते हैं, कृपया ध्यान दें कि स्वचालित अनुवाद में त्रुटियां या अशुद्धियां हो सकती हैं। मूल भाषा में उपलब्ध मूल दस्तावेज़ को प्रामाणिक स्रोत माना जाना चाहिए। महत्वपूर्ण जानकारी के लिए, पेशेवर मानव अनुवाद की सिफारिश की जाती है। इस अनुवाद के उपयोग से उत्पन्न किसी भी गलतफहमी या गलत व्याख्या के लिए हम उत्तरदायी नहीं हैं।\n"
|
||||
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**अस्वीकरण**:\nइस दस्तावेज़ का अनुवाद AI अनुवाद सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) का उपयोग करके किया गया है। जबकि हम सटीकता के लिए प्रयास करते हैं, कृपया ध्यान दें कि स्वचालित अनुवादों में त्रुटियाँ या अशुद्धियाँ हो सकती हैं। मूल दस्तावेज़ अपनी मूल भाषा में ही प्रामाणिक स्रोत माना जाना चाहिए। महत्वपूर्ण जानकारी के लिए, पेशेवर मानव अनुवाद की सिफारिश की जाती है। इस अनुवाद के उपयोग से उत्पन्न किसी भी गलतफहमी या गलत व्याख्या के लिए हम उत्तरदायी नहीं हैं।\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
|
|
@ -1485,12 +1495,6 @@
|
|||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.8.10"
|
||||
},
|
||||
"coopTranslator": {
|
||||
"original_hash": "c189abc107848f96051085cc30945129",
|
||||
"translation_date": "2025-08-31T14:37:11+00:00",
|
||||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb",
|
||||
"language_code": "hi"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
|
|
|||
|
|
@ -1,69 +1,73 @@
|
|||
# प्राकृतिक भाषा प्रसंस्करण
|
||||
|
||||

|
||||

|
||||
|
||||
इस खंड में, हम **प्राकृतिक भाषा प्रसंस्करण (NLP)** से संबंधित कार्यों को संभालने के लिए न्यूरल नेटवर्क का उपयोग करने पर ध्यान केंद्रित करेंगे। कई NLP समस्याएं हैं जिन्हें हम चाहते हैं कि कंप्यूटर हल कर सकें:
|
||||
इस खंड में, हम **प्राकृतिक भाषा प्रसंस्करण (NLP)** से संबंधित कार्यों को संभालने के लिए न्यूरल नेटवर्क का उपयोग करने पर ध्यान केंद्रित करेंगे। कई NLP समस्याएँ हैं जिन्हें हम चाहते हैं कि कंप्यूटर हल कर सके:
|
||||
|
||||
* **पाठ वर्गीकरण** एक सामान्य वर्गीकरण समस्या है जो पाठ अनुक्रमों से संबंधित है। उदाहरणों में ईमेल संदेशों को स्पैम और गैर-स्पैम के रूप में वर्गीकृत करना, या लेखों को खेल, व्यापार, राजनीति आदि के रूप में वर्गीकृत करना शामिल है। इसके अलावा, जब हम चैटबॉट विकसित करते हैं, तो हमें अक्सर यह समझने की आवश्यकता होती है कि उपयोगकर्ता क्या कहना चाहता था -- इस मामले में हम **इरादा वर्गीकरण** से निपट रहे हैं। इरादा वर्गीकरण में अक्सर हमें कई श्रेणियों से निपटना पड़ता है।
|
||||
* **भावना विश्लेषण** एक सामान्य प्रतिगमन समस्या है, जहां हमें एक वाक्य के अर्थ की सकारात्मकता/नकारात्मकता के अनुसार एक संख्या (भावना) को निर्दिष्ट करना होता है। भावना विश्लेषण का एक अधिक उन्नत संस्करण **पहलू-आधारित भावना विश्लेषण** (ABSA) है, जहां हम भावना को पूरे वाक्य के बजाय उसके विभिन्न भागों (पहलुओं) को निर्दिष्ट करते हैं, जैसे *इस रेस्तरां में, मुझे खाना पसंद आया, लेकिन माहौल भयानक था*।
|
||||
* **नामित इकाई पहचान** (NER) पाठ से कुछ विशिष्ट इकाइयों को निकालने की समस्या को संदर्भित करता है। उदाहरण के लिए, हमें यह समझने की आवश्यकता हो सकती है कि वाक्यांश *मुझे कल पेरिस जाना है* में *कल* शब्द DATE को संदर्भित करता है, और *पेरिस* एक LOCATION है।
|
||||
* **कीवर्ड निष्कर्षण** 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) नामक तकनीक का उपयोग करके अन्य NLP कार्यों जैसे वर्गीकरण को हल करने में सक्षम हैं।
|
||||
* **पाठ सारांशण** एक तकनीक है जब हम चाहते हैं कि कंप्यूटर लंबे पाठ को "पढ़े" और उसे कुछ वाक्यों में संक्षेपित करे।
|
||||
* **मशीन अनुवाद** को एक भाषा में पाठ को समझने और दूसरी भाषा में पाठ उत्पन्न करने के संयोजन के रूप में देखा जा सकता है।
|
||||
* **टेक्स्ट वर्गीकरण** एक सामान्य वर्गीकरण समस्या है जो पाठ अनुक्रमों से संबंधित है। उदाहरणों में ईमेल संदेशों को स्पैम बनाम नॉन-स्पैम के रूप में वर्गीकृत करना, या लेखों को खेल, व्यवसाय, राजनीति आदि के रूप में वर्गीकृत करना शामिल है। इसके अलावा, चैट बॉट विकसित करते समय, हमें अक्सर यह समझने की जरूरत होती है कि उपयोगकर्ता क्या कहना चाहता था -- इस मामले में हम **इरादा वर्गीकरण** से निपट रहे हैं। अक्सर, इरादा वर्गीकरण में हमें कई श्रेणियों से निपटना पड़ता है।
|
||||
* **भावना विश्लेषण** एक सामान्य प्रतिगमन समस्या है, जहाँ हमें एक संख्या (भावना) निर्दिष्ट करनी होती है जो यह बताती है कि वाक्य का अर्थ कितना सकारात्मक/नकारात्मक है। भावना विश्लेषण का एक उन्नत संस्करण है **पहलू-आधारित भावना विश्लेषण** (ABSA), जहाँ हम भावना को पूरे वाक्य के बजाय इसके विभिन्न हिस्सों (पहलुओं) को निर्दिष्ट करते हैं, जैसे *इस रेस्तरां में, मुझे भोजन पसंद आया, लेकिन वातावरण भयानक था*।
|
||||
* **नामित इकाई मान्यता** (NER) पाठ से कुछ विशिष्ट इकाइयों को निकालने की समस्या को संदर्भित करता है। उदाहरण के लिए, हमें यह समझना पड़ सकता है कि वाक्यांश *मुझे कल पेरिस जाना है* में शब्द *कल* DATE (तिथि) को संदर्भित करता है, और *पेरिस* LOCATION (स्थान) है।
|
||||
* **कीवर्ड निष्कर्षण** 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 विधियां [नेचुरल लैंग्वेज प्रोसेसिंग टूलकिट (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 के लिए**
|
||||
**पायटॉर्च के लिए**
|
||||
```bash
|
||||
pip install -r requirements-torch.txt
|
||||
```
|
||||
**TensorFlow के लिए**
|
||||
pip install -r requirements-pytorch.txt
|
||||
```
|
||||
**टेंसर्फ्लो के लिए**
|
||||
```bash
|
||||
pip install -r requirements-tf.txt
|
||||
```
|
||||
```
|
||||
|
||||
> आप [Microsoft Learn](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste) पर TensorFlow के साथ NLP आज़मा सकते हैं।
|
||||
> आप [Microsoft Learn](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste) पर TensorFlow के साथ NLP आज़मा सकते हैं।
|
||||
|
||||
## GPU चेतावनी
|
||||
|
||||
इस खंड में, कुछ उदाहरणों में हम काफी बड़े मॉडल का प्रशिक्षण करेंगे।
|
||||
* **GPU-सक्षम कंप्यूटर का उपयोग करें**: बड़े मॉडलों के साथ काम करते समय प्रतीक्षा समय को कम करने के लिए अपने नोटबुक को GPU-सक्षम कंप्यूटर पर चलाना उचित है।
|
||||
* **GPU मेमोरी सीमाएं**: GPU पर चलने से ऐसी स्थितियां उत्पन्न हो सकती हैं जहां आप GPU मेमोरी से बाहर हो जाएं, विशेष रूप से बड़े मॉडलों को प्रशिक्षित करते समय।
|
||||
* **GPU मेमोरी खपत**: प्रशिक्षण के दौरान GPU मेमोरी की खपत विभिन्न कारकों पर निर्भर करती है, जिसमें मिनीबैच का आकार शामिल है।
|
||||
* **मिनीबैच आकार कम करें**: यदि आपको GPU मेमोरी समस्याओं का सामना करना पड़ता है, तो संभावित समाधान के रूप में अपने कोड में मिनीबैच आकार को कम करने पर विचार करें।
|
||||
* **TensorFlow GPU मेमोरी रिलीज़**: TensorFlow के पुराने संस्करण एक ही पायथन कर्नेल में कई मॉडलों को प्रशिक्षित करते समय GPU मेमोरी को सही ढंग से रिलीज़ नहीं कर सकते। GPU मेमोरी उपयोग को प्रभावी ढंग से प्रबंधित करने के लिए, आप TensorFlow को केवल आवश्यकतानुसार GPU मेमोरी आवंटित करने के लिए कॉन्फ़िगर कर सकते हैं।
|
||||
* **कोड शामिल करें**: TensorFlow को केवल आवश्यकतानुसार GPU मेमोरी आवंटन बढ़ाने के लिए, अपने नोटबुक में निम्नलिखित कोड शामिल करें:
|
||||
इस खंड में, कुछ उदाहरणों में हम काफी बड़े मॉडल प्रशिक्षित करेंगे।
|
||||
* **GPU सक्षम कंप्यूटर का उपयोग करें**: बड़े मॉडल के साथ काम करते समय प्रतीक्षा समय कम करने के लिए अपनी नोटबुक्स को GPU सक्षम कंप्यूटर पर चलाना सलाह दी जाती है।
|
||||
* **GPU मेमोरी प्रतिबंध**: GPU पर चलाने से ऐसी स्थिति हो सकती है जहां आपके GPU की मेमोरी समाप्त हो जाए, विशेष रूप से बड़े मॉडल प्रशिक्षण के दौरान।
|
||||
* **GPU मेमोरी उपभोग**: प्रशिक्षण के दौरान उपयोग की गई GPU मेमोरी की मात्रा विभिन्न कारकों पर निर्भर करती है, जिनमें मिनीबैच का आकार शामिल है।
|
||||
* **मिनीबैच आकार कम करें**: यदि आपको GPU मेमोरी समस्याएं आती हैं, तो समाधान के रूप में अपने कोड में मिनीबैच आकार कम करने पर विचार करें।
|
||||
* **टेंसर्फ्लो GPU मेमोरी रिलीज़**: पुराने संस्करण के टेंसर्फ्लो एक पायथन कर्नेल में एक से अधिक मॉडल प्रशिक्षण के दौरान GPU मेमोरी सही ढंग से रिलीज़ नहीं कर सकते। GPU मेमोरी का प्रभावी प्रबंधन करने के लिए, आप टेंसर्फ्लो को केवल आवश्यकतानुसार GPU मेमोरी आवंटित करने के लिए कॉन्फ़िगर कर सकते हैं।
|
||||
* **कोड शामिल करना**: अपनी नोटबुक्स में टेंसर्फ्लो को केवल आवश्यकतानुसार 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)
|
||||
```
|
||||
```
|
||||
|
||||
यदि आप क्लासिक ML दृष्टिकोण से 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)
|
||||
|
||||
**अस्वीकरण**:
|
||||
यह दस्तावेज़ AI अनुवाद सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) का उपयोग करके अनुवादित किया गया है। जबकि हम सटीकता के लिए प्रयासरत हैं, कृपया ध्यान दें कि स्वचालित अनुवाद में त्रुटियां या अशुद्धियां हो सकती हैं। मूल भाषा में उपलब्ध मूल दस्तावेज़ को प्रामाणिक स्रोत माना जाना चाहिए। महत्वपूर्ण जानकारी के लिए, पेशेवर मानव अनुवाद की सिफारिश की जाती है। इस अनुवाद के उपयोग से उत्पन्न किसी भी गलतफहमी या गलत व्याख्या के लिए हम उत्तरदायी नहीं हैं।
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**अस्वीकरण**:
|
||||
इस दस्तावेज़ का अनुवाद AI अनुवाद सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) का उपयोग करके किया गया है। जबकि हम सटीकता के लिए प्रयास करते हैं, कृपया ध्यान दें कि स्वचालित अनुवादों में त्रुटियाँ या अशुद्धियाँ हो सकती हैं। मूल दस्तावेज़ अपनी मूल भाषा में ही प्रामाणिक स्रोत माना जाना चाहिए। महत्वपूर्ण जानकारी के लिए, पेशेवर मानव अनुवाद की सिफारिश की जाती है। इस अनुवाद के उपयोग से उत्पन्न किसी भी गलतफहमी या गलत व्याख्या के लिए हम उत्तरदायी नहीं हैं।
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -1,38 +1,38 @@
|
|||
# मल्टी-एजेंट सिस्टम्स
|
||||
# मल्टी-एजेंट सिस्टम
|
||||
|
||||
बुद्धिमत्ता प्राप्त करने के संभावित तरीकों में से एक है **उभरता हुआ** (या **सिनर्जेटिक**) दृष्टिकोण, जो इस तथ्य पर आधारित है कि कई अपेक्षाकृत सरल एजेंटों का संयुक्त व्यवहार पूरे सिस्टम के अधिक जटिल (या बुद्धिमान) व्यवहार का परिणाम हो सकता है। सैद्धांतिक रूप से, यह [सामूहिक बुद्धिमत्ता](https://en.wikipedia.org/wiki/Collective_intelligence), [उभरतावाद](https://en.wikipedia.org/wiki/Global_brain) और [विकासवादी साइबरनेटिक्स](https://en.wikipedia.org/wiki/Global_brain) के सिद्धांतों पर आधारित है, जो कहते हैं कि उच्च-स्तरीय सिस्टम कुछ अतिरिक्त मूल्य प्राप्त करते हैं जब उन्हें सही तरीके से निम्न-स्तरीय सिस्टम से जोड़ा जाता है (जिसे *मेटासिस्टम ट्रांज़िशन का सिद्धांत* कहा जाता है)।
|
||||
बुद्धिमत्ता हासिल करने के संभावित तरीकों में से एक तथाकथित **उभरने वाला** (या **सिनर्जेटिक**) दृष्टिकोण है, जो इस तथ्य पर आधारित है कि कई अपेक्षाकृत साधारण एजेंटों का सम्मिलित व्यवहार पूरे सिस्टम के अधिक जटिल (या बुद्धिमान) व्यवहार का परिणाम हो सकता है। सैद्धांतिक रूप से, यह [सामूहिक बुद्धिमत्ता](https://en.wikipedia.org/wiki/Collective_intelligence), [एमर्जेंटिज़्म](https://en.wikipedia.org/wiki/Global_brain) और [एवोल्यूशनरी सायबरनेटिक्स](https://en.wikipedia.org/wiki/Global_brain) के सिद्धांतों पर आधारित है, जो कहते हैं कि उच्च-स्तरीय सिस्टम निम्न-स्तरीय सिस्टमों से उचित रूप से संयोजित होने पर किसी प्रकार का अतिरिक्त मूल्य प्राप्त करते हैं (जिसे *मेटासिस्टम संक्रमण का सिद्धांत* कहा जाता है)।
|
||||
|
||||
## [प्री-लेक्चर क्विज़](https://ff-quizzes.netlify.app/en/ai/quiz/45)
|
||||
|
||||
**मल्टी-एजेंट सिस्टम्स** की दिशा 1990 के दशक में इंटरनेट और वितरित सिस्टम्स के विकास के जवाब में AI में उभरी। AI के एक क्लासिकल टेक्स्टबुक, [Artificial Intelligence: A Modern Approach](https://en.wikipedia.org/wiki/Artificial_Intelligence:_A_Modern_Approach), मल्टी-एजेंट सिस्टम्स के दृष्टिकोण से क्लासिकल AI को देखता है।
|
||||
**मल्टी-एजेंट सिस्टम** की दिशा 1990 के दशक में AI में इंटरनेट और वितरित प्रणालियों की वृद्धि के जवाब में उभरी। एक क्लासिक AI पाठ्यपुस्तक, [Artificial Intelligence: A Modern Approach](https://en.wikipedia.org/wiki/Artificial_Intelligence:_A_Modern_Approach), मल्टी-एजेंट सिस्टम के दृष्टिकोण से क्लासिक AI के दृष्टिकोण पर केंद्रित है।
|
||||
|
||||
मल्टी-एजेंट दृष्टिकोण का केंद्रबिंदु **एजेंट** की अवधारणा है - एक इकाई जो किसी **पर्यावरण** में रहती है, जिसे वह देख सकती है और उस पर कार्य कर सकती है। यह एक बहुत व्यापक परिभाषा है, और एजेंटों के कई प्रकार और वर्गीकरण हो सकते हैं:
|
||||
मल्टी-एजेंट दृष्टिकोण के केंद्र में **एजेंट** की अवधारणा है - एक ऐसी इकाई जो किसी **पर्यावरण** में रहती है, जिसे वह अनुभव कर सकती है और उस पर कार्य कर सकती है। यह एक बहुत व्यापक परिभाषा है, और एजेंटों के कई विभिन्न प्रकार और वर्गीकरण हो सकते हैं:
|
||||
|
||||
* उनकी तर्क करने की क्षमता के आधार पर:
|
||||
- **प्रतिक्रियाशील** एजेंट आमतौर पर सरल अनुरोध-प्रतिक्रिया प्रकार के व्यवहार रखते हैं
|
||||
- **विचारशील** एजेंट कुछ प्रकार की तार्किक तर्क और/या योजना क्षमताओं का उपयोग करते हैं
|
||||
* उस स्थान के आधार पर जहां एजेंट अपना कोड निष्पादित करता है:
|
||||
- **स्थिर** एजेंट एक समर्पित नेटवर्क नोड पर काम करते हैं
|
||||
- **मोबाइल** एजेंट अपना कोड नेटवर्क नोड्स के बीच स्थानांतरित कर सकते हैं
|
||||
* उनके तर्क करने की क्षमता के आधार पर:
|
||||
- **रिएक्टिव** एजेंट आमतौर पर साधारण अनुरोध-प्रतिक्रिया प्रकार के व्यवहार करते हैं
|
||||
- **डिलिब्रेटिव** एजेंट किसी प्रकार के तर्क और/या योजना बनाने की क्षमताओं का उपयोग करते हैं
|
||||
* एजेंट के कोड निष्पादित होने के स्थान के आधार पर:
|
||||
- **स्थैतिक** एजेंट एक समर्पित नेटवर्क नोड पर काम करते हैं
|
||||
- **मोबाइल** एजेंट अपने कोड को नेटवर्क नोड्स के बीच स्थानांतरित कर सकते हैं
|
||||
* उनके व्यवहार के आधार पर:
|
||||
- **निष्क्रिय एजेंट** के पास विशिष्ट लक्ष्य नहीं होते। ऐसे एजेंट बाहरी उत्तेजनाओं पर प्रतिक्रिया कर सकते हैं, लेकिन स्वयं कोई कार्रवाई शुरू नहीं करेंगे।
|
||||
- **सक्रिय एजेंट** के पास कुछ लक्ष्य होते हैं जिन्हें वे प्राप्त करने का प्रयास करते हैं
|
||||
- **संज्ञानात्मक एजेंट** जटिल योजना और तर्क शामिल करते हैं
|
||||
- **निष्क्रिय एजेंट** के पास विशिष्ट लक्ष्य नहीं होते। ऐसे एजेंट बाहरी उत्तेजनाओं पर प्रतिक्रिया कर सकते हैं, लेकिन स्वयं कोई क्रियाएं शुरू नहीं करेंगे।
|
||||
- **सक्रिय एजेंट** के पास कुछ लक्ष्य होते हैं जिन्हें वह प्राप्त करने का प्रयास करता है
|
||||
- **संज्ञानात्मक एजेंट** जटिल योजना और तर्क में शामिल होते हैं
|
||||
|
||||
आजकल मल्टी-एजेंट सिस्टम्स कई अनुप्रयोगों में उपयोग किए जाते हैं:
|
||||
मल्टी-एजेंट सिस्टम आजकल कई अनुप्रयोगों में उपयोग किए जाते हैं:
|
||||
|
||||
* गेम्स में, कई गैर-खिलाड़ी पात्र कुछ प्रकार की AI का उपयोग करते हैं और उन्हें बुद्धिमान एजेंट माना जा सकता है
|
||||
* वीडियो उत्पादन में, भीड़ वाले जटिल 3D दृश्यों को रेंडर करना आमतौर पर मल्टी-एजेंट सिमुलेशन का उपयोग करके किया जाता है
|
||||
* सिस्टम मॉडलिंग में, मल्टी-एजेंट दृष्टिकोण का उपयोग जटिल मॉडल के व्यवहार का अनुकरण करने के लिए किया जाता है। उदाहरण के लिए, मल्टी-एजेंट दृष्टिकोण का उपयोग COVID-19 बीमारी के वैश्विक प्रसार की भविष्यवाणी करने के लिए सफलतापूर्वक किया गया है। इसी दृष्टिकोण का उपयोग शहर में यातायात को मॉडल करने और यातायात नियमों में बदलाव पर उसकी प्रतिक्रिया देखने के लिए किया जा सकता है।
|
||||
* जटिल स्वचालन सिस्टम्स में, प्रत्येक डिवाइस एक स्वतंत्र एजेंट के रूप में कार्य कर सकता है, जिससे पूरा सिस्टम कम मोनोलिथिक और अधिक मजबूत बनता है।
|
||||
* खेलों में, कई नॉन-प्लेयर कैरेक्टर किसी न किसी प्रकार की AI का उपयोग करते हैं और बुद्धिमान एजेंट माने जाते हैं
|
||||
* वीडियो उत्पादन में, भीड़ वाले जटिल 3D दृश्य को रेंडर करना आमतौर पर मल्टी-एजेंट सिमुलेशन का उपयोग करके किया जाता है
|
||||
* सिस्टम मॉडलिंग में, मल्टी-एजेंट दृष्टिकोण का उपयोग जटिल मॉडल के व्यवहार की नकल के लिए किया जाता है। उदाहरण के लिए, COVID-19 बीमारी के विश्वव्यापी प्रसार की भविष्यवाणी के लिए मल्टी-एजेंट दृष्टिकोण का सफलतापूर्वक उपयोग किया गया है। इसी तरह का दृष्टिकोण शहर में ट्रैफिक का मॉडल बनाने और देखने के लिए उपयोग किया जा सकता है कि यह ट्रैफिक नियमों में परिवर्तनों पर कैसे प्रतिक्रिया करता है।
|
||||
* जटिल ऑटोमेशन प्रणालियों में, प्रत्येक उपकरण स्वतंत्र एजेंट के रूप में कार्य कर सकता है, जिससे पूरा सिस्टम कम कठोर और अधिक मजबूत हो जाता है।
|
||||
|
||||
हम मल्टी-एजेंट सिस्टम्स में गहराई तक जाने में ज्यादा समय नहीं लगाएंगे, लेकिन **मल्टी-एजेंट मॉडलिंग** के एक उदाहरण पर विचार करेंगे।
|
||||
हम मल्टी-एजेंट सिस्टम पर ज्यादा गहराई से समय नहीं बिताएंगे, लेकिन **मल्टी-एजेंट मॉडलिंग** का एक उदाहरण देखेंगे।
|
||||
|
||||
## नेटलोगो
|
||||
|
||||
[NetLogo](https://ccl.northwestern.edu/netlogo/) एक मल्टी-एजेंट मॉडलिंग वातावरण है जो [Logo](https://en.wikipedia.org/wiki/Logo_(programming_language)) प्रोग्रामिंग भाषा के संशोधित संस्करण पर आधारित है। यह भाषा बच्चों को प्रोग्रामिंग अवधारणाओं सिखाने के लिए विकसित की गई थी, और यह आपको **टर्टल** नामक एक एजेंट को नियंत्रित करने की अनुमति देती है, जो चलते समय पीछे एक निशान छोड़ता है। यह जटिल ज्यामितीय आकृतियों को बनाने की अनुमति देता है, जो एजेंट के व्यवहार को समझने का एक बहुत ही दृश्यात्मक तरीका है।
|
||||
[NetLogo](https://ccl.northwestern.edu/netlogo/) एक मल्टी-एजेंट मॉडलिंग वातावरण है जो [Logo](https://en.wikipedia.org/wiki/Logo_(programming_language)) प्रोग्रामिंग भाषा के संशोधित संस्करण पर आधारित है। यह भाषा बच्चों को प्रोग्रामिंग अवधारणाएँ सिखाने के लिए विकसित की गई थी, और यह आपको एक एजेंट जिसे **टर्टल** कहा जाता है, को नियंत्रित करने की अनुमति देती है, जो पीछे निशान छोड़ते हुए चल सकता है। यह जटिल ज्यामितीय आकृतियाँ बनाने की अनुमति देता है, जो एजेंट के व्यवहार को समझने का एक बहुत ही दृश्य तरीका है।
|
||||
|
||||
NetLogo में, हम `create-turtles` कमांड का उपयोग करके कई टर्टल्स बना सकते हैं। फिर हम सभी टर्टल्स को कुछ क्रियाएं करने का आदेश दे सकते हैं (नीचे दिए गए उदाहरण में - 10 पॉइंट आगे बढ़ें):
|
||||
NetLogo में, हम `create-turtles` कमांड का उपयोग करके कई टर्टल बना सकते हैं। फिर हम सभी टर्टल्स को कुछ क्रियाएं करने का आदेश दे सकते हैं (नीचे के उदाहरण में - 10 प्वाइंट आगे बढ़ना):
|
||||
|
||||
```
|
||||
create-turtles 10
|
||||
|
|
@ -41,39 +41,39 @@ ask turtles [
|
|||
]
|
||||
```
|
||||
|
||||
बेशक, यह दिलचस्प नहीं है जब सभी टर्टल्स एक ही काम करते हैं, इसलिए हम `ask` का उपयोग करके टर्टल्स के समूहों को आदेश दे सकते हैं, जैसे कि वे जो किसी निश्चित बिंदु के आसपास हैं। हम `breed [cats cat]` कमांड का उपयोग करके विभिन्न *प्रजातियों* के टर्टल्स भी बना सकते हैं। यहां `cat` प्रजाति का नाम है, और हमें एकवचन और बहुवचन दोनों शब्द निर्दिष्ट करने की आवश्यकता है, क्योंकि विभिन्न कमांड स्पष्टता के लिए विभिन्न रूपों का उपयोग करते हैं।
|
||||
बेशक, जब सभी टर्टल्स एक ही काम करते हैं तो यह रोचक नहीं होता, इसलिए हम टर्टल्स के समूहों को `ask` कर सकते हैं, उदाहरण के लिए जो एक निश्चित बिंदु के आसपास हैं। हम `breed [cats cat]` कमांड का उपयोग करके विभिन्न *जातियों* के टर्टल भी बना सकते हैं। यहाँ `cat` एक जाति का नाम है, और हमें दोनों बहुवचन और एकवचन शब्द निर्दिष्ट करने की आवश्यकता होती है, क्योंकि विभिन्न कमांड्स स्पष्टता के लिए अलग-अलग रूपों का उपयोग करते हैं।
|
||||
|
||||
> ✅ हम NetLogo भाषा सीखने में गहराई तक नहीं जाएंगे - यदि आप अधिक जानने में रुचि रखते हैं तो आप शानदार [Beginner's Interactive NetLogo Dictionary](https://ccl.northwestern.edu/netlogo/bind/) संसाधन पर जा सकते हैं।
|
||||
> ✅ हम NetLogo भाषा सीखने में बहुत गहराई में नहीं जाएंगे - अगर आप अधिक सीखने में रुचि रखते हैं तो आप उत्कृष्ट [Beginner's Interactive NetLogo Dictionary](https://ccl.northwestern.edu/netlogo/bind/) संसाधन देख सकते हैं।
|
||||
|
||||
आप [डाउनलोड](https://ccl.northwestern.edu/netlogo/download.shtml) करके NetLogo को आज़मा सकते हैं।
|
||||
आप NetLogo को [डाउनलोड](https://ccl.northwestern.edu/netlogo/download.shtml) कर सकते हैं और इसे आजमा सकते हैं।
|
||||
|
||||
### मॉडल्स लाइब्रेरी
|
||||
### मॉडल लाइब्रेरी
|
||||
|
||||
NetLogo की एक शानदार बात यह है कि इसमें काम करने वाले मॉडलों की एक लाइब्रेरी है जिसे आप आज़मा सकते हैं। **File → Models Library** पर जाएं, और आपके पास चुनने के लिए मॉडलों की कई श्रेणियां हैं।
|
||||
NetLogo की एक अच्छी बात यह है कि इसमें कई काम करने वाले मॉडल की लाइब्रेरी होती है जिसे आप आज़मा सकते हैं। **File → Models Library** पर जाएं, और आपके पास चुनने के लिए कई मॉडल श्रेणियां होंगी।
|
||||
|
||||
<img alt="NetLogo Models Library" src="../../../../../translated_images/hi/NetLogo-ModelLib.efe023afb4763c05.webp" width="60%"/>
|
||||
|
||||
> दिमित्री सोश्निकोव द्वारा मॉडल्स लाइब्रेरी का स्क्रीनशॉट
|
||||
> दिमित्रि सोश्निकोव द्वारा मॉडल लाइब्रेरी का स्क्रीनशॉट
|
||||
|
||||
आप एक मॉडल खोल सकते हैं, उदाहरण के लिए **Biology → Flocking**।
|
||||
|
||||
### मुख्य सिद्धांत
|
||||
|
||||
मॉडल खोलने के बाद, आप मुख्य NetLogo स्क्रीन पर ले जाए जाते हैं। यहां एक नमूना मॉडल है जो सीमित संसाधनों (घास) को ध्यान में रखते हुए भेड़ियों और भेड़ों की आबादी का वर्णन करता है।
|
||||
मॉडल खोलने के बाद, आप मुख्य NetLogo स्क्रीन पर ले जाए जाते हैं। यहाँ एक नमूना मॉडल है जो भेड़ियों और भेड़ों की आबादी का वर्णन करता है, सीमित संसाधनों (घास) के साथ।
|
||||
|
||||

|
||||
|
||||
> दिमित्री सोश्निकोव द्वारा स्क्रीनशॉट
|
||||
> दिमित्रि सोश्निकोव द्वारा स्क्रीनशॉट
|
||||
|
||||
इस स्क्रीन पर, आप देख सकते हैं:
|
||||
|
||||
* **इंटरफेस** सेक्शन जिसमें शामिल हैं:
|
||||
- मुख्य क्षेत्र, जहां सभी एजेंट रहते हैं
|
||||
- विभिन्न नियंत्रण: बटन, स्लाइडर्स, आदि।
|
||||
- ग्राफ़ जो आप सिमुलेशन के पैरामीटर प्रदर्शित करने के लिए उपयोग कर सकते हैं
|
||||
* **कोड** टैब जिसमें संपादक होता है, जहां आप NetLogo प्रोग्राम टाइप कर सकते हैं
|
||||
- मुख्य क्षेत्र, जहाँ सभी एजेंट रहते हैं
|
||||
- विभिन्न नियंत्रण: बटन, स्लाइडर, आदि
|
||||
- ग्राफ़ जो आप सिमुलेशन के पैरामीटर दिखाने के लिए उपयोग कर सकते हैं
|
||||
* **कोड** टैब जिसमें संपादक होता है, जहाँ आप NetLogo प्रोग्राम टाइप कर सकते हैं
|
||||
|
||||
अधिकांश मामलों में, इंटरफेस में एक **Setup** बटन होता है, जो सिमुलेशन स्थिति को प्रारंभ करता है, और एक **Go** बटन होता है जो निष्पादन शुरू करता है। इन्हें कोड में संबंधित हैंडलर्स द्वारा संभाला जाता है जो इस प्रकार दिखते हैं:
|
||||
अधिकांश मामलों में, इंटरफेस में एक **Setup** बटन होता है, जो सिमुलेशन की स्थिति प्रारंभ करता है, और एक **Go** बटन जो निष्पादन शुरू करता है। ये संबंधित कोड हैंडलर्स द्वारा नियंत्रित होते हैं, जो इस प्रकार दिखते हैं:
|
||||
|
||||
```
|
||||
to go [
|
||||
|
|
@ -83,15 +83,77 @@ to go [
|
|||
|
||||
NetLogo की दुनिया निम्नलिखित वस्तुओं से बनी होती है:
|
||||
|
||||
* **एजेंट्स** (टर्टल्स) जो क्षेत्र में घूम सकते हैं और कुछ कर सकते हैं। आप `ask turtles [...]` सिंटैक्स का उपयोग करके एजेंट्स को आदेश देते हैं, और कोष्ठक में कोड सभी एजेंट्स द्वारा *टर्टल मोड* में निष्पादित किया जाता है।
|
||||
* **पैचेस** क्षेत्र के वर्गाकार क्षेत्र हैं, जिन पर एजेंट्स रहते हैं। आप सभी एजेंट्स को एक ही पैच पर संदर्भित कर सकते हैं, या आप पैच के रंग और कुछ अन्य गुण बदल सकते हैं। आप `ask patches` का उपयोग करके पैचेस को कुछ करने के लिए कह सकते हैं।
|
||||
* **ऑब्ज़र्वर** एक अद्वितीय एजेंट है जो दुनिया को नियंत्रित करता है। सभी बटन हैंडलर्स *ऑब्ज़र्वर मोड* में निष्पादित होते हैं।
|
||||
* **एजेंट** (टर्टल) जो क्षेत्र में घूम सकते हैं और कुछ काम कर सकते हैं। आप `ask turtles [...]` सिंटैक्स का उपयोग करके एजेंटों को निर्देश देते हैं, और ब्रैकेट में कोड सभी एजेंट द्वारा *टर्टल मोड* में चलाया जाता है।
|
||||
* **पैच** क्षेत्र के वर्गाकार क्षेत्र हैं, जिन पर एजेंट रहते हैं। आप एक ही पैच पर सभी एजेंटों को संदर्भित कर सकते हैं, या पैच के रंग और अन्य गुण बदल सकते हैं। आप `ask patches` का उपयोग भी कर सकते हैं।
|
||||
* **ऑब्ज़र्वर** एक विशिष्ट एजेंट है जो दुनिया को नियंत्रित करता है। सभी बटन हैंडलर्स *ऑब्ज़र्वर मोड* में निष्पादित होते हैं।
|
||||
|
||||
> ✅ मल्टी-एजेंट वातावरण की खूबसूरती यह है कि टर्टल मोड या पैच मोड में चलने वाला कोड सभी एजेंट्स द्वारा समानांतर में निष्पादित किया जाता है। इस प्रकार, थोड़ा कोड लिखकर और व्यक्तिगत एजेंट के व्यवहार को प्रोग्राम करके, आप सिमुलेशन सिस्टम के समग्र व्यवहार को जटिल बना सकते हैं।
|
||||
> ✅ मल्टी-एजेंट पर्यावरण की सुंदरता यह है कि जो कोड टर्टल मोड या पैच मोड में चलता है, वह सभी एजेंटों द्वारा समानांतर में एक साथ निष्पादित होता है। इसलिए, थोड़ा सा कोड लिखकर और व्यक्तिगत एजेंट के व्यवहार को प्रोग्राम करके, आप पूरे सिमुलेशन सिस्टम का जटिल व्यवहार बना सकते हैं।
|
||||
|
||||
### फ्लॉकिंग
|
||||
|
||||
मल्टी-एजेंट व्यवहार के एक उदाहरण के रूप में, आइए **[Flocking](https://en.wikipedia.org/wiki/Flocking_(behavior))** पर विचार करें। फ्लॉकिंग एक जट
|
||||
मल्टी-एजेंट व्यवहार के एक उदाहरण के रूप में, चलिए **[Flocking](https://en.wikipedia.org/wiki/Flocking_(behavior))** पर विचार करते हैं। फ्लॉकिंग एक जटिल पैटर्न है जो पक्षियों के झुंड की उड़ान से बहुत मिलता-जुलता है। उन्हें उड़ते हुए देखकर आप सोच सकते हैं कि वे किसी सामूहिक एल्गोरिदम का पालन करते हैं, या उनके पास किसी प्रकार की *सामूहिक बुद्धिमत्ता* है। हालांकि, यह जटिल व्यवहार तब उभरता है जब प्रत्येक व्यक्तिगत एजेंट (इस मामले में, *पक्षी*) केवल अपने निकटवर्ती एजेंटों को देखता है, और तीन सरल नियमों का पालन करता है:
|
||||
|
||||
* **संरेखण** - यह आस-पास के एजेंटों के औसत शीर्षक की ओर मोड़ता है
|
||||
* **सामंजस्य** - यह पड़ोसियों के औसत स्थान की ओर मोड़ने का प्रयास करता है (*दीर्घ दूरी आकर्षण*)
|
||||
* **विभाजन** - जब अन्य पक्षियों के बहुत करीब आता है, तो यह दूर जाने का प्रयास करता है (*संक्षिप्त दूरी विकर्षण*)
|
||||
|
||||
आप फ्लॉकिंग उदाहरण चला सकते हैं और व्यवहार देख सकते हैं। आप पैरामीटर भी समायोजित कर सकते हैं, जैसे *विभाजन की डिग्री*, या *देखने की सीमा*, जो परिभाषित करता है कि प्रत्येक पक्षी कितनी दूर देख सकता है। ध्यान दें कि यदि आप देखने की सीमा को 0 तक घटाते हैं, तो सभी पक्षी अंधे हो जाते हैं, और फ्लॉकिंग रुक जाती है। यदि आप विभाजन को 0 कर देते हैं, तो सभी पक्षी एक सीधरे रेखा में इकट्ठे हो जाते हैं।
|
||||
|
||||
> ✅ **कोड** टैब पर जाएं और देखें कि फ्लॉकिंग के तीन नियम (संरेखण, सामंजस्य और विभाजन) कोड में कहाँ लागू किए गए हैं। नोट करें कि हम केवल उन एजेंटों को संबोधित करते हैं जो दृष्टि में हैं।
|
||||
|
||||
### अन्य मॉडल देखने के लिए
|
||||
|
||||
कुछ और दिलचस्प मॉडल हैं जिनके साथ आप प्रयोग कर सकते हैं:
|
||||
|
||||
* **Art → Fireworks** यह दिखाता है कि आतिशबाजी को व्यक्तिगत आग की धाराओं के सामूहिक व्यवहार के रूप में कैसे माना जा सकता है
|
||||
* **Social Science → Traffic Basic** और **Social Science → Traffic Grid** शहर के ट्रैफिक मॉडल को 1D और 2D ग्रिड में ट्रैफिक लाइट्स के साथ या बिना दिखाते हैं। सिमुलेशन में प्रत्येक कार निम्नलिखित नियमों का पालन करती है:
|
||||
- यदि उसके सामने जगह खाली है - तो वह तेजी से चलती है (एक निश्चित अधिकतम गति तक)
|
||||
- यदि वह सामने बाधा देखती है - तो ब्रेक लगाती है (और आप समायोजित कर सकते हैं कि ड्राइवर कितना दूर देख सकता है)
|
||||
* **Social Science → Party** यह दिखाता है कि कॉकटेल पार्टी के दौरान लोग कैसे समूह बनाते हैं। आप उन पैरामीटरों के संयोजन को खोज सकते हैं जो समूह की खुशी में सबसे तेज वृद्धि की ओर ले जाते हैं।
|
||||
|
||||
जैसा कि आप इन उदाहरणों से देख सकते हैं, मल्टी-एजेंट सिमुलेशन एक जटिल सिस्टम के व्यवहार को समझने का एक उपयोगी तरीका हो सकता है जो समान या समान तर्क का पालन करने वाले व्यक्तियों से बना होता है। इसे कंप्यूटर गेमों में [NPCs](https://en.wikipedia.org/wiki/NPC) जैसे वर्चुअल एजेंटों, या 3D एनिमेटेड दुनिया के एजेंटों को नियंत्रित करने के लिए भी इस्तेमाल किया जा सकता है।
|
||||
|
||||
## डिलिब्रेटिव एजेंट
|
||||
|
||||
ऊपर वर्णित एजेंट बहुत सरल हैं, जो पर्यावरण के परिवर्तनों पर किसी प्रकार के एल्गोरिदम का उपयोग करके प्रतिक्रिया देते हैं। इसलिए इन्हें **रिएक्टिव एजेंट** कहा जाता है। हालांकि, कभी-कभी एजेंट तर्क कर सकते हैं और अपनी क्रिया की योजना बना सकते हैं, जिसे **डिलिब्रेटिव** कहा जाता है।
|
||||
|
||||
एक सामान्य उदाहरण एक व्यक्तिगत एजेंट होगा जो मानव से छुट्टी की यात्रा बुक करने के निर्देश प्राप्त करता है। मान लीजिए कि इंटरनेट पर कई एजेंट हैं जो इसकी मदद कर सकते हैं। इसे तब अन्य एजेंटों से संपर्क करना चाहिए यह देखने के लिए कि कौन-कौन सी उड़ानें उपलब्ध हैं, विभिन्न तिथियों के लिए होटल की कीमतें क्या हैं, और सबसे अच्छी कीमत के लिए बातचीत करनी चाहिए। जब छुट्टी योजना पूरी हो जाए और मालिक द्वारा पुष्टि हो जाए, तो यह बुकिंग के साथ आगे बढ़ सकता है।
|
||||
|
||||
ऐसा करने के लिए, एजेंटों को **संचार** करने की आवश्यकता होती है। सफल संचार के लिए उन्हें चाहिए:
|
||||
|
||||
* कुछ **मानक भाषाएँ ज्ञान के आदान-प्रदान के लिए**, जैसे [Knowledge Interchange Format](https://en.wikipedia.org/wiki/Knowledge_Interchange_Format) (KIF) और [Knowledge Query and Manipulation Language](https://en.wikipedia.org/wiki/Knowledge_Query_and_Manipulation_Language) (KQML)। ये भाषाएँ [Speech Act theory](https://en.wikipedia.org/wiki/Speech_act) पर आधारित हैं।
|
||||
* उन भाषाओं में कुछ **बातचीत के प्रोटोकॉल** भी शामिल होने चाहिए, विभिन्न **नीलामी प्रकारों** के आधार पर।
|
||||
* एक **साझा ओन्टोलॉजी** का उपयोग, ताकि वे एक ही अवधारणाओं को संदर्भित करें और उनकी अर्थवत्ता को समझें
|
||||
* यह पता लगाने का एक तरीका कि विभिन्न एजेंट क्या कर सकते हैं, जो किसी प्रकार की ओन्टोलॉजी पर आधारित हो
|
||||
|
||||
डिलिब्रेटिव एजेंट रिएक्टिव की तुलना में बहुत अधिक जटिल होते हैं, क्योंकि वे केवल पर्यावरण में बदलावों पर प्रतिक्रिया नहीं देते, उन्हें क्रियाएँ *प्रारंभ* करने में सक्षम भी होना चाहिए। डिलिब्रेटिव एजेंट के लिए प्रस्तावित आर्किटेक्चर में से एक है तथाकथित Belief-Desire-Intention (BDI) एजेंट:
|
||||
|
||||
* **विश्वास** एजेंट के पर्यावरण के बारे में ज्ञान का एक सेट बनाते हैं। इसे एक ज्ञान आधार या नियमों के सेट के रूप में संरचित किया जा सकता है जिसे एजेंट पर्यावरण की विशिष्ट स्थिति में लागू कर सकता है।
|
||||
* **इच्छाएँ** परिभाषित करती हैं कि एजेंट क्या करना चाहता है, यानी उसके लक्ष्य। उदाहरण के लिए, ऊपर के व्यक्तिगत सहायक एजेंट का लक्ष्य एक यात्रा बुक करना है, और होटल एजेंट का लक्ष्य अधिकतम लाभ प्राप्त करना है।
|
||||
* **इरादे** विशिष्ट क्रियाएँ होती हैं जिन्हें एजेंट अपने लक्ष्यों को प्राप्त करने के लिए योजना बनाता है। क्रियाएं आमतौर पर पर्यावरण को बदलती हैं और अन्य एजेंटों के साथ संचार करती हैं।
|
||||
|
||||
मल्टी-एजेंट सिस्टम बनाने के लिए कुछ प्लेटफ़ॉर्म उपलब्ध हैं, जैसे [JADE](https://jade.tilab.com/). [यह पेपर](https://arxiv.org/ftp/arxiv/papers/2007/2007.08961.pdf) मल्टी-एजेंट प्लेटफॉर्मों का एक समीक्षा प्रदान करता है, साथ ही मल्टी-एजेंट सिस्टमों का संक्षिप्त इतिहास और उनके विभिन्न उपयोग परिदृश्यों को भी बताता है।
|
||||
|
||||
## निष्कर्ष
|
||||
|
||||
मल्टी-एजेंट सिस्टम विभिन्न रूप ले सकते हैं और कई विभिन्न अनुप्रयोगों में उपयोग किए जा सकते हैं।
|
||||
वे सभी व्यक्तिगत एजेंट के सरल व्यवहार पर फोकस करते हैं, और **सिनर्जेटिक प्रभाव** के कारण पूरे सिस्टम के जटिल व्यवहार को प्राप्त करते हैं।
|
||||
|
||||
## 🚀 चुनौती
|
||||
|
||||
इस पाठ को वास्तविक दुनिया में ले जाएं और किसी समस्या को हल करने वाले मल्टी-एजेंट सिस्टम की कल्पना करें। उदाहरण के लिए, एक मल्टी-एजेंट सिस्टम को स्कूल बस के रूट को अनुकूलित करने के लिए क्या करना होगा? यह एक बेकरी में कैसे काम कर सकता है?
|
||||
|
||||
## [पोस्ट-लेक्चर क्विज़](https://ff-quizzes.netlify.app/en/ai/quiz/46)
|
||||
|
||||
## समीक्षा और आत्म-अध्ययन
|
||||
|
||||
उद्योग में इस प्रकार की प्रणाली के उपयोग की समीक्षा करें। विनिर्माण या वीडियो गेम उद्योग जैसी किसी क्षेत्र को चुनें और जानें कि मल्टी-एजेंट सिस्टम अनूठी समस्याओं के समाधान के लिए कैसे उपयोग किए जा सकते हैं।
|
||||
|
||||
## [NetLogo असाइनमेंट](assignment.md)
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**अस्वीकरण**:
|
||||
इस दस्तावेज़ का अनुवाद AI अनुवाद सेवा [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": "hr"
|
||||
},
|
||||
"CONTRIBUTING.md": {
|
||||
"original_hash": "c6fd7e781b67111a90abd166d0ce4aa0",
|
||||
"translation_date": "2026-07-08T19:56:11+00:00",
|
||||
"source_file": "CONTRIBUTING.md",
|
||||
"language_code": "hr"
|
||||
},
|
||||
"README.md": {
|
||||
"original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b",
|
||||
"translation_date": "2026-04-06T16:29:10+00:00",
|
||||
|
|
@ -17,6 +23,19 @@
|
|||
"source_file": "SECURITY.md",
|
||||
"language_code": "hr"
|
||||
},
|
||||
"__translation_failures__": {
|
||||
"lessons/sketchnotes/LICENSE.md": {
|
||||
"original_hash": "45ab63a2cd8f5faef6c9b150618837a4",
|
||||
"source_file": "lessons/sketchnotes/LICENSE.md",
|
||||
"language_code": "hr",
|
||||
"failure_date": "2026-07-08T19:42:58+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-26T00:44:58+00:00",
|
||||
|
|
@ -54,8 +73,8 @@
|
|||
"language_code": "hr"
|
||||
},
|
||||
"examples/README.md": {
|
||||
"original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7",
|
||||
"translation_date": "2025-10-03T11:34:49+00:00",
|
||||
"original_hash": "7883d52c2e2a221e0b07a7b112a149b9",
|
||||
"translation_date": "2026-07-08T19:38:19+00:00",
|
||||
"source_file": "examples/README.md",
|
||||
"language_code": "hr"
|
||||
},
|
||||
|
|
@ -66,8 +85,8 @@
|
|||
"language_code": "hr"
|
||||
},
|
||||
"lessons/0-course-setup/how-to-run.md": {
|
||||
"original_hash": "a4717bd9103b9f6cd84d534b83534689",
|
||||
"translation_date": "2026-01-16T06:04:58+00:00",
|
||||
"original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1",
|
||||
"translation_date": "2026-07-08T19:38:39+00:00",
|
||||
"source_file": "lessons/0-course-setup/how-to-run.md",
|
||||
"language_code": "hr"
|
||||
},
|
||||
|
|
@ -191,6 +210,12 @@
|
|||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md",
|
||||
"language_code": "hr"
|
||||
},
|
||||
"lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": {
|
||||
"original_hash": "99b816b6a4957ef4100cee4c4221dff9",
|
||||
"translation_date": "2026-07-08T19:34:14+00:00",
|
||||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb",
|
||||
"language_code": "hr"
|
||||
},
|
||||
"lessons/4-ComputerVision/08-TransferLearning/lab/README.md": {
|
||||
"original_hash": "7765935c35fcee69b9fe2d0cfd6963e2",
|
||||
"translation_date": "2025-08-25T23:17:08+00:00",
|
||||
|
|
@ -330,8 +355,8 @@
|
|||
"language_code": "hr"
|
||||
},
|
||||
"lessons/5-NLP/README.md": {
|
||||
"original_hash": "8ef02a9318257ea140ed3ed74442096d",
|
||||
"translation_date": "2025-08-25T21:29:43+00:00",
|
||||
"original_hash": "038df6f1a73e49f6430740da083bfd6d",
|
||||
"translation_date": "2026-07-08T19:39:04+00:00",
|
||||
"source_file": "lessons/5-NLP/README.md",
|
||||
"language_code": "hr"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -0,0 +1,29 @@
|
|||
# Doprinoseći AI-For-Beginners
|
||||
|
||||
Hvala vam na vašem interesu za doprinos AI-For-Beginners! Dobrodošle su prijevodi, ispravci lekcija i ispravci formata.
|
||||
|
||||
## Microsoft Ugovor o licenci za doprinositelje (CLA)
|
||||
|
||||
Ovaj projekt prihvaća doprinose i prijedloge. Većina doprinosa zahtijeva da se složite s Ugovorom o licenci za doprinositelje (CLA) kojim izjavljujete da imate pravo, i da zapravo dajete, nam prava za korištenje vašeg doprinosa. Za detalje posjetite [https://cla.microsoft.com](https://cla.microsoft.com).
|
||||
|
||||
Kada pošaljete pull request, CLA-bot će automatski utvrditi trebate li dostaviti CLA i prikladno označiti PR (npr. oznakom, komentarom). Jednostavno slijedite upute koje vam bot daje. To ćete morati učiniti samo jednom za sve repozitorije koji koriste naš CLA.
|
||||
|
||||
## Kako doprinositi
|
||||
|
||||
### 1. Ispravljanje tipfelera / grešaka u kodu
|
||||
Ako nađete tipfelere ili greške u bilo kojem Jupyter bilježnici ili markdown datoteci lekcije:
|
||||
1. Napravite fork repozitorija.
|
||||
2. Ispravite tipfelere ili prekinuti link.
|
||||
3. Pošaljite Pull Request s jasnim opisom ispravka.
|
||||
|
||||
### 2. Slanje prijevoda
|
||||
Dobrodošli su prijevodi lekcija na druge jezike! Molimo stavite prijevode u direktorij `translations/` koristeći postojeće nazive mapa tamo (na primjer `translations/es/`, `translations/pt-BR/`, `translations/zh-CN/`).
|
||||
|
||||
Za više detalja, pogledajte [etc/CONTRIBUTING.md](etc/CONTRIBUTING.md).
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**Napomena**:
|
||||
Ovaj dokument je preveden korištenjem AI prevoditeljskog servisa [Co-op Translator](https://github.com/Azure/co-op-translator). Iako težimo točnosti, imajte na umu da automatski prijevodi mogu sadržavati greške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za važne informacije preporuča se profesionalni ljudski prijevod. Nismo odgovorni za bilo kakva nesporazumevanja ili pogrešne interpretacije koje proizlaze iz korištenja ovog prijevoda.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -1,27 +1,27 @@
|
|||
# Primjeri umjetne inteligencije za početnike
|
||||
# Primjeri Prikladni Za Početnike u AI
|
||||
|
||||
Dobrodošli! Ovaj direktorij sadrži jednostavne, samostalne primjere koji će vam pomoći da započnete s umjetnom inteligencijom i strojnim učenjem. Svaki primjer je osmišljen tako da bude prilagođen početnicima, uz detaljne komentare i objašnjenja korak po korak.
|
||||
Dobro došli! Ovaj direktorij sadrži jednostavne, samostalne primjere koji vam pomažu započeti s AI i strojnim učenjem. Svaki primjer je dizajniran da bude prikladan za početnike s detaljnim komentarima i korak-po-korak objašnjenjima.
|
||||
|
||||
## 📚 Pregled primjera
|
||||
## 📚 Pregled Primjera
|
||||
|
||||
| Primjer | Opis | Težina | Preduvjeti |
|
||||
|---------|-------------|------------|---------------|
|
||||
| [Pozdrav AI svijetu](../../../examples/01-hello-ai-world.py) | Vaš prvi AI program - jednostavno prepoznavanje uzoraka | ⭐ Početnik | Osnove Pythona |
|
||||
| [Jednostavna neuronska mreža](../../../examples/02-simple-neural-network.py) | Izgradite neuronsku mrežu od nule | ⭐⭐ Početnik+ | Python, osnovna matematika |
|
||||
| [Klasifikator slika](./03-image-classifier.ipynb) | Klasificirajte slike pomoću unaprijed treniranog modela | ⭐⭐ Početnik+ | Python, numpy |
|
||||
| [Sentiment teksta](../../../examples/04-text-sentiment.py) | Analizirajte sentiment teksta (pozitivan/negativan) | ⭐⭐ Početnik+ | Python |
|
||||
| [Hello AI World](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/01-hello-ai-world.py) | Vaš prvi AI program - jednostavno prepoznavanje obrazaca | ⭐ Početnik | Osnove Pythona |
|
||||
| [Simple Neural Network](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/02-simple-neural-network.py) | Izgradite neuronsku mrežu iz temelja | ⭐⭐ Početnik+ | Python, osnovna matematika |
|
||||
| [Image Classifier](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/03-image-classifier.ipynb) | Klasificirajte slike pomoću unaprijed istreniranog modela | ⭐⭐ Početnik+ | Python, numpy |
|
||||
| [Text Sentiment](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/04-text-sentiment.py) | Analizirajte sentiment teksta (pozitivan/negativan) | ⭐⭐ Početnik+ | Python |
|
||||
|
||||
## 🚀 Početak rada
|
||||
## 🚀 Početak
|
||||
|
||||
### Preduvjeti
|
||||
|
||||
Provjerite imate li instaliran Python (preporučuje se verzija 3.8 ili novija). Instalirajte potrebne pakete:
|
||||
Provjerite imate li instaliran Python (preporučeno verzija 3.8 ili novija). Instalirajte potrebne pakete:
|
||||
|
||||
```bash
|
||||
# For Python scripts
|
||||
# Za Python skripte
|
||||
pip install numpy
|
||||
|
||||
# For Jupyter notebooks (image classifier)
|
||||
# Za Jupyter bilježnice (klasifikator slika)
|
||||
pip install jupyter numpy pillow tensorflow
|
||||
```
|
||||
|
||||
|
|
@ -32,7 +32,7 @@ conda env create --name ai4beg --file ../environment.yml
|
|||
conda activate ai4beg
|
||||
```
|
||||
|
||||
### Pokretanje primjera
|
||||
### Pokretanje Primjera
|
||||
|
||||
**Za Python skripte (.py datoteke):**
|
||||
```bash
|
||||
|
|
@ -44,42 +44,44 @@ python 01-hello-ai-world.py
|
|||
jupyter notebook 03-image-classifier.ipynb
|
||||
```
|
||||
|
||||
## 📖 Put učenja
|
||||
## 📖 Put Učenja
|
||||
|
||||
Preporučujemo da slijedite primjere redoslijedom:
|
||||
Preporučujemo da slijedite primjere redom:
|
||||
|
||||
1. **Započnite s "Pozdrav AI svijetu"** - Naučite osnove prepoznavanja uzoraka
|
||||
2. **Izgradite jednostavnu neuronsku mrežu** - Shvatite kako neuronske mreže funkcioniraju
|
||||
3. **Isprobajte klasifikator slika** - Pogledajte AI u akciji s pravim slikama
|
||||
4. **Analizirajte sentiment teksta** - Istražite obradu prirodnog jezika
|
||||
1. **Započnite s "Hello AI World"** - Naučite osnove prepoznavanja obrazaca
|
||||
2. **Izgradite Jednostavnu Neuronsku Mrežu** - Razumite kako neuronske mreže funkcioniraju
|
||||
3. **Isprobajte Image Classifier** - Pogledajte AI u akciji s pravim slikama
|
||||
4. **Analizirajte Sentiment Teksta** - Istražite obradu prirodnog jezika
|
||||
|
||||
## 💡 Savjeti za početnike
|
||||
## 💡 Savjeti za Početnike
|
||||
|
||||
- **Pažljivo čitajte komentare u kodu** - Objašnjavaju što svaka linija radi
|
||||
- **Pažljivo čitajte komentare u kodu** - Oni objašnjavaju što koja linija radi
|
||||
- **Eksperimentirajte!** - Pokušajte mijenjati vrijednosti i vidjeti što se događa
|
||||
- **Ne brinite ako ne razumijete sve** - Učenje zahtijeva vrijeme
|
||||
- **Postavljajte pitanja** - Koristite [diskusijsku ploču](https://github.com/microsoft/AI-For-Beginners/discussions)
|
||||
- **Ne brinite ako ne razumijete sve odmah** - Učenje zahtijeva vrijeme
|
||||
- **Postavljajte pitanja** - Koristite [Discussion board](https://github.com/microsoft/AI-For-Beginners/discussions)
|
||||
|
||||
## 🔗 Sljedeći koraci
|
||||
## 🔗 Sljedeći Koraci
|
||||
|
||||
Nakon što završite ove primjere, istražite cijeli kurikulum:
|
||||
- [Uvod u AI](../lessons/1-Intro/README.md)
|
||||
- [Neuronske mreže](../lessons/3-NeuralNetworks/README.md)
|
||||
- [Računalni vid](../lessons/4-ComputerVision/README.md)
|
||||
- [Obrada prirodnog jezika](../lessons/5-NLP/README.md)
|
||||
- [Neuronske Mreže](../lessons/3-NeuralNetworks/README.md)
|
||||
- [Računalni Vid](../lessons/4-ComputerVision/README.md)
|
||||
- [Obrada Prirodnog Jezika](../lessons/5-NLP/README.md)
|
||||
|
||||
## 🤝 Doprinos
|
||||
## 🤝 Sudjelovanje
|
||||
|
||||
Jesu li vam ovi primjeri korisni? Pomozite nam da ih poboljšamo:
|
||||
Jesu li vam ovi primjeri pomogli? Pomozite nam ih poboljšati:
|
||||
- Prijavite probleme ili predložite poboljšanja
|
||||
- Dodajte više primjera za početnike
|
||||
- Poboljšajte dokumentaciju i komentare
|
||||
|
||||
---
|
||||
|
||||
*Zapamtite: Svaki stručnjak je jednom bio početnik. Sretno u učenju! 🎓*
|
||||
*Zapamtite: Svaki stručnjak nekada je bio početnik. Sretno u učenju! 🎓*
|
||||
|
||||
---
|
||||
|
||||
**Odricanje od odgovornosti**:
|
||||
Ovaj dokument je preveden pomoću AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane čovjeka. Ne preuzimamo odgovornost za nesporazume ili pogrešna tumačenja koja proizlaze iz korištenja ovog prijevoda.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**Napomena**:
|
||||
Ovaj dokument je preveden korištenjem AI prevoditeljskog servisa [Co-op Translator](https://github.com/Azure/co-op-translator). Iako težimo točnosti, imajte na umu da automatski prijevodi mogu sadržavati greške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za važne informacije preporuča se profesionalni ljudski prijevod. Nismo odgovorni za bilo kakva nesporazumevanja ili pogrešne interpretacije koje proizlaze iz korištenja ovog prijevoda.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -1,12 +1,12 @@
|
|||
# Kako pokrenuti kod
|
||||
|
||||
Ovaj nastavni plan sadrži mnogo izvršnih primjera i laboratorijskih vježbi koje želite pokrenuti. Da biste to učinili, morate imati mogućnost izvršavanja Python koda u Jupyter bilježnicama koje su dio ovog nastavnog plana. Imate nekoliko opcija za pokretanje koda:
|
||||
Ovaj kurikulum sadrži mnogo izvršnih primjera i laboratorijskih zadataka koje biste željeli pokrenuti. Da biste to učinili, trebate mogućnost izvršavanja Python koda u Jupyter Notebookovima koje su uključene kao dio ovog kurikuluma. Imate nekoliko opcija za pokretanje koda:
|
||||
|
||||
## Pokretanje lokalno na vašem računalu
|
||||
|
||||
Da biste pokrenuli kod lokalno na vašem računalu, potrebna je Python instalacija. Jedan od prijedloga je instalirati **[miniconda](https://conda.io/en/latest/miniconda.html)** - to je prilično lagana instalacija koja podržava upravitelja paketa `conda` za različita Python **virtualna okruženja**.
|
||||
Za pokretanje koda lokalno na vašem računalu potrebna je instalacija Pythona. Jedan od prijedloga je instalirati **[miniconda](https://conda.io/en/latest/miniconda.html)** - to je prilično lagana instalacija koja podržava `conda` upravitelj paketa za različita Python **virtualna okruženja**.
|
||||
|
||||
Nakon što instalirate miniconda, klonirajte repozitorij i kreirajte virtualno okruženje koje će se koristiti za ovaj tečaj:
|
||||
Nakon što instalirate miniconda, klonirajte repozitorij i napravite virtualno okruženje koje ćete koristiti za ovaj tečaj:
|
||||
|
||||
```bash
|
||||
git clone http://github.com/microsoft/ai-for-beginners
|
||||
|
|
@ -15,19 +15,19 @@ conda env create --name ai4beg --file .devcontainer/environment.yml
|
|||
conda activate ai4beg
|
||||
```
|
||||
|
||||
### Korištenje Visual Studio Code s Python ekstenzijom
|
||||
### Korištenje Visual Studio Code s Python proširenjem
|
||||
|
||||
Ovaj nastavni plan najbolje je koristiti ako ga otvorite u [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) s [Python ekstenzijom](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste).
|
||||
Ovaj kurikulum je najbolje koristiti pritom da ga otvorite u [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) s [Python proširenjem](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste).
|
||||
|
||||
> **Napomena**: Kada klonirate i otvorite direktorij u VS Code-u, automatski će vam predložiti instalaciju Python ekstenzija. Također ćete morati instalirati miniconda kako je prethodno opisano.
|
||||
> **Napomena**: Nakon što klonirate i otvorite direktorij u VS Code, on će vam automatski ponuditi instalaciju Python proširenja. Također ćete trebati instalirati miniconda kako je opisano gore.
|
||||
|
||||
> **Napomena**: Ako vam VS Code predloži ponovno otvaranje repozitorija u kontejneru, trebate to odbiti kako biste koristili lokalnu Python instalaciju.
|
||||
> **Napomena**: Ako vam VS Code ponudi da ponovo otvorite repozitorij u kontejneru, trebali biste to odbiti da biste koristili lokalnu Python instalaciju.
|
||||
|
||||
### Korištenje Jupyter-a u pregledniku
|
||||
### Korištenje Jupyter u pregledniku
|
||||
|
||||
Također možete koristiti Jupyter okruženje iz preglednika na vašem računalu. I klasični Jupyter i JupyterHub pružaju praktično razvojno okruženje s automatskim dovršavanjem, isticanjem koda itd.
|
||||
Također možete koristiti Jupyter okruženje putem preglednika na vlastitom računalu. I klasični Jupyter i JupyterHub nude prikladno razvojno okruženje s automatskim dovršavanjem, isticanjem koda i slično.
|
||||
|
||||
Za pokretanje Jupyter-a lokalno, idite u direktorij tečaja i pokrenite:
|
||||
Za pokretanje Jupyter-a lokalno, idite u direktorij s tečajem i pokrenite:
|
||||
|
||||
```bash
|
||||
jupyter notebook
|
||||
|
|
@ -36,36 +36,36 @@ ili
|
|||
```bash
|
||||
jupyterhub
|
||||
```
|
||||
Zatim možete navigirati do bilo koje `.ipynb` datoteke, otvoriti je i početi raditi.
|
||||
Nakon toga možete navigirati do bilo koje `.ipynb` datoteke, otvoriti je i početi raditi.
|
||||
|
||||
### Pokretanje u kontejneru
|
||||
|
||||
Jedna alternativa Python instalaciji je pokretanje koda u kontejneru. Budući da naš repozitorij sadrži posebnu mapu `.devcontainer` koja daje upute kako izgraditi kontejner za ovaj repozitorij, VS Code nudi opciju ponovnog otvaranja koda u kontejneru. Za ovo je potrebna instalacija Dockera, a postupak može biti složeniji, pa to preporučujemo iskusnijim korisnicima.
|
||||
Jedna alternativa lokalnoj instalaciji Pythona je pokretanje koda u kontejneru. Budući da naš repozitorij isporučuje posebnu `.devcontainer` mapu koja opisuje kako izgraditi kontejner za ovaj repozitorij, VS Code nudi mogućnost ponovnog otvaranja koda u kontejneru. Ovo zahtijeva instalaciju Dockera i može biti složenije, pa to preporučujemo iskusnijim korisnicima.
|
||||
|
||||
## Pokretanje u oblaku
|
||||
|
||||
Ako ne želite instalirati Python lokalno, a imate pristup nekim resursima u oblaku - dobra alternativa je pokretanje koda u oblaku. Postoji nekoliko načina na koje to možete učiniti:
|
||||
Ako ne želite instalirati Python lokalno i imate pristup nekim oblačnim resursima - dobra alternativa je pokrenuti kod u oblaku. Postoji nekoliko načina kako to možete učiniti:
|
||||
|
||||
* Korištenje **[GitHub Codespaces](https://github.com/features/codespaces)**, što je virtualno okruženje kreirano za vas na GitHubu, dostupno putem VS Code sučelja u pregledniku. Ako imate pristup Codespaces, samo kliknite na gumb **Code** u repozitoriju, pokrenite codespace i brzo počnite raditi.
|
||||
* Korištenje **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) nudi besplatne računalne resurse u oblaku za ljude poput vas da isprobaju kod s GitHuba. Na početnoj stranici postoji gumb za otvaranje repozitorija u Binderu - to će vas brzo dovesti na stranicu bindera, koji će izgraditi osnovni kontejner i pokrenuti Jupyter web sučelje bez prekida.
|
||||
* Korištenje **[GitHub Codespaces](https://github.com/features/codespaces)**, što je virtualno okruženje stvoreno za vas na GitHubu, dostupno kroz VS Code sučelje u pregledniku. Ako imate pristup Codespaces, jednostavno kliknite na gumb **Code** u repozitoriju, pokrenite codespace i brzo započnite.
|
||||
* Korištenje **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) nudi besplatne računalne resurse u oblaku kako biste mogli isprobati neki kod s GitHuba. Na početnoj stranici postoji gumb za otvaranje repozitorija u Binderu - to bi vas brzo trebalo odvesti na stranicu bindera, koja će izgraditi osnovni kontejner i besprijekorno pokrenuti Jupyter web sučelje za vas.
|
||||
|
||||
> **Napomena**: Da bi spriječio zlonamjernu upotrebu, Binder ima blokiran pristup nekim mrežnim resursima. To može spriječiti rad nekog koda koji dohvaća modele i/ili skupove podataka s javnog Interneta. Možda ćete trebati pronaći neke zaobilazne načine. Također, računski resursi koje Binder pruža su prilično osnovni, pa će treniranje biti sporo, osobito u kasnijim, složenijim lekcijama.
|
||||
> **Napomena**: Kako bi spriječio zloupotrebu, Binder ima blokiran pristup nekim web resursima. To može spriječiti rad nekog koda koji dohvaća modele i/ili skupove podataka s javnog Interneta. Možda ćete morati pronaći neka zaobilazna rješenja. Također, računarski resursi koje pruža Binder su prilično osnovni, pa će treniranje biti sporo, osobito u kasnijim, složenijim lekcijama.
|
||||
|
||||
## Pokretanje u oblaku s GPU
|
||||
## Pokretanje u oblaku s GPU-om
|
||||
|
||||
Neke od kasnijih lekcija u ovom nastavnom planu značajno bi imale koristi od podrške za GPU. Na primjer, treniranje modela može biti izuzetno sporo bez toga. Postoji nekoliko opcija koje možete pratiti, osobito ako imate pristup oblaku putem [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) ili preko vaše institucije:
|
||||
Neke od kasnijih lekcija u ovom kurikulumu puno bi profitirale od podrške GPU-a. Na primjer, treniranje modela može biti izrazito sporo bez toga. Postoji nekoliko opcija koje možete slijediti, posebno ako imate pristup oblaku putem [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) ili preko svoje institucije:
|
||||
|
||||
* Kreirajte [Data Science Virtual Machine](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) i povežite se na nju putem Jupyter-a. Tada možete klonirati repozitorij direktno na tu mašinu i započeti učenje. NC-serija VM-ova ima podršku za GPU.
|
||||
* Kreirajte [Data Science Virtual Machine](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) i povežite se na nju putem Jupytera. Možete zatim klonirati repozitorij direktno na stroj i početi učiti. NC-serija VM-ova podržava GPU.
|
||||
|
||||
> **Napomena**: Neki pretplatnički planovi, uključujući Azure for Students, ne pružaju GPU podršku odmah. Možda ćete morati zatražiti dodatne GPU jezgre tehničkim zahtjevom za podršku.
|
||||
> **Napomena**: Neke pretplate, uključujući Azure for Students, ne pružaju GPU podršku odmah. Možda ćete trebati zatražiti dodatne GPU jezgre putem tehničke podrške.
|
||||
|
||||
* Kreirajte [Azure Machine Learning Workspace](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) i zatim koristite značajku Notebooka tamo. [Ovaj video](https://azure-for-academics.github.io/quickstart/azureml-papers/) pokazuje kako klonirati repozitorij u Azure ML bilježnicu i početi ga koristiti.
|
||||
* Kreirajte [Azure Machine Learning Workspace](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) i zatim koristite Notebook značajku tamo. [Ovaj video](https://azure-for-academics.github.io/quickstart/azureml-papers/) pokazuje kako klonirati repozitorij u Azure ML notebook i početi ga koristiti.
|
||||
|
||||
Također možete koristiti Google Colab, koji dolazi s besplatnom podrškom za GPU, i tamo učitati Jupyter bilježnice za izvršavanje jednu po jednu.
|
||||
Također možete koristiti Google Colab, koji nudi određenu besplatnu podršku za GPU, te tamo učitavati Jupyter Notebooks i izvršavati ih jedan po jedan.
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**Izjava o odricanju od odgovornosti**:
|
||||
Ovaj je dokument preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako težimo točnosti, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za kritične informacije preporučuje se stručni ljudski prijevod. Nismo odgovorni za bilo kakva nesporazuma ili pogrešna tumačenja koja proizlaze iz korištenja ovog prijevoda.
|
||||
**Napomena**:
|
||||
Ovaj dokument je preveden korištenjem AI prevoditeljskog servisa [Co-op Translator](https://github.com/Azure/co-op-translator). Iako težimo točnosti, imajte na umu da automatski prijevodi mogu sadržavati greške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za važne informacije preporuča se profesionalni ljudski prijevod. Nismo odgovorni za bilo kakva nesporazumevanja ili pogrešne interpretacije koje proizlaze iz korištenja ovog prijevoda.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -6,9 +6,9 @@
|
|||
"source": [
|
||||
"# Predtrenirani modeli i prijenos učenja\n",
|
||||
"\n",
|
||||
"Treniranje CNN-a može zahtijevati puno vremena, a za taj zadatak potrebno je mnogo podataka. Međutim, velik dio vremena troši se na učenje najboljih niskorazinskih filtera koje mreža koristi za izdvajanje uzoraka iz slika. Postavlja se prirodno pitanje - možemo li koristiti neuronsku mrežu treniranu na jednom skupu podataka i prilagoditi je za klasifikaciju različitih slika bez potpunog procesa treniranja?\n",
|
||||
"Trening CNN-ova može potrajati dosta dugo i potrebno je puno podataka za taj zadatak. Međutim, većina vremena se koristi za učenje najboljih niskorazinskih filtera koje mreža koristi za izdvajanje obrazaca iz slika. Postavlja se prirodno pitanje - možemo li koristiti neuronsku mrežu treniranu na jednom skupu podataka i prilagoditi je za klasificiranje različitih slika bez potpunog procesa treninga?\n",
|
||||
"\n",
|
||||
"Ovaj pristup naziva se **prijenos učenja**, jer prenosimo dio znanja iz jednog modela neuronske mreže u drugi. Kod prijenosa učenja obično započinjemo s predtreniranjem modela, koji je treniran na nekom velikom skupu podataka slika, poput **ImageNet**. Ti modeli već dobro obavljaju posao izdvajanja različitih značajki iz generičkih slika, a u mnogim slučajevima samo izgradnja klasifikatora na temelju tih izdvojenih značajki može dati dobre rezultate.\n"
|
||||
"Ovaj pristup se naziva **prijenos učenja**, jer prenosimo neka znanja iz jednog modela neuronske mreže u drugi. U prijenosu učenja obično počinjemo s predtreniranim modelom, koji je treniran na nekom velikom skupu slika, kao što je **ImageNet**. Ti modeli već mogu dobro izdvajati različite značajke iz generičkih slika, i u mnogim slučajevima samo izgradnja klasifikatora na temelju tih izvađenih značajki može dati dobar rezultat.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -31,9 +31,9 @@
|
|||
"source": [
|
||||
"## Skup podataka Mačke vs. Psi\n",
|
||||
"\n",
|
||||
"U ovoj jedinici riješit ćemo stvarni problem klasifikacije slika mačaka i pasa. Zbog toga ćemo koristiti [Kaggle Cats vs. Dogs Dataset](https://www.kaggle.com/c/dogs-vs-cats), koji se također može preuzeti [s Microsofta](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n",
|
||||
"U ovoj jedinici riješit ćemo stvarni problem klasifikacije slika mačaka i pasa. Iz tog razloga koristit ćemo [Kaggle Cats vs. Dogs Dataset](https://www.kaggle.com/c/dogs-vs-cats), koji se također može preuzeti [s Microsofta](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n",
|
||||
"\n",
|
||||
"Preuzmimo ovaj skup podataka i izdvojimo ga u direktorij `data` (ovaj proces može potrajati!):\n"
|
||||
"Preuzmimo ovaj skup podataka i raspakirajmo ga u direktorij `data` (ovaj proces može potrajati!):\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -64,7 +64,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Nažalost, u skupu podataka postoje neke oštećene slikovne datoteke. Moramo brzo očistiti skup podataka kako bismo provjerili oštećene datoteke. Kako ne bismo preopteretili ovaj vodič, premjestili smo kod za provjeru skupa podataka u modul.\n"
|
||||
"Nažalost, u skupu podataka postoje neke oštećene slikovne datoteke. Moramo brzo očistiti kako bismo provjerili oštećene datoteke. Kako ne bismo narušili ovaj vodič, premjestili smo kod za provjeru skupa podataka u modul.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -335,11 +335,11 @@
|
|||
"source": [
|
||||
"## Učitavanje skupa podataka\n",
|
||||
"\n",
|
||||
"U prethodnim primjerima učitavali smo skupove podataka koji su ugrađeni u Keras. Sada ćemo raditi s vlastitim skupom podataka, koji trebamo učitati iz direktorija sa slikama.\n",
|
||||
"U prethodnim primjerima učitavali smo skupove podataka ugrađene u Keras. Sada ćemo se baviti vlastitim skupom podataka koji trebamo učitati iz direktorija slika.\n",
|
||||
"\n",
|
||||
"U stvarnom životu, veličina skupova podataka sa slikama može biti prilično velika, i ne možemo se osloniti na to da će svi podaci stati u memoriju. Stoga se skupovi podataka često predstavljaju kao **generatori** koji mogu vraćati podatke u manjim serijama pogodnim za treniranje.\n",
|
||||
"U stvarnom životu veličina skupova podataka slike može biti prilično velika, i ne može se računati da će se svi podaci moći smjestiti u memoriju. Stoga se skupovi podataka često predstavljaju kao **generatori** koji mogu vraćati podatke u malim serijama pogodne za treniranje.\n",
|
||||
"\n",
|
||||
"Za rad s klasifikacijom slika, Keras uključuje posebnu funkciju `image_dataset_from_directory`, koja može učitati slike iz poddirektorija koji odgovaraju različitim klasama. Ova funkcija također se brine o skaliranju slika, a može i podijeliti skup podataka na podskupove za treniranje i testiranje:\n"
|
||||
"Za rad s klasifikacijom slike, Keras uključuje posebnu funkciju `image_dataset_from_directory`, koja može učitati slike iz poddirektorija koji odgovaraju različitim klasama. Ova funkcija također se brine o skaliranju slika, i može također podijeliti skup podataka na podskupove za treniranje i testiranje:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -383,9 +383,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Važno je postaviti istu vrijednost za `seed` u oba poziva, jer ona utječe na podjelu slika između skupa za treniranje i testiranje.\n",
|
||||
"Važno je postaviti istu vrijednost `seed` za oba poziva, jer ona utječe na podjelu slika između trening i testnog skupa podataka.\n",
|
||||
"\n",
|
||||
"Skup podataka automatski prepoznaje nazive klasa iz direktorija, a možete im pristupiti ako je potrebno pozivom:\n"
|
||||
"Dataset automatski preuzima nazive klasa iz direktorija, a njima možete pristupiti po potrebi pozivom:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -412,7 +412,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Skupovi podataka koje smo dobili mogu se izravno proslijediti funkciji `fit` za treniranje modela. Oni sadrže i odgovarajuće slike i oznake, koje se mogu iterirati koristeći sljedeću konstrukciju:\n"
|
||||
"Skupovi podataka koje smo dobili mogu se izravno proslijediti funkciji `fit` za treniranje modela. Oni sadrže odgovarajuće slike i oznake, kojima se može pristupiti pomoću sljedeće konstrukcije:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -453,7 +453,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"> **Napomena**: Sve slike u skupu podataka predstavljene su kao tenzori s pomičnim zarezom u rasponu 0-255. Prije nego ih proslijedimo neuronskoj mreži, moramo skalirati te vrijednosti u raspon 0-1. Kada prikazujemo slike, trebamo učiniti isto ili pretvoriti vrijednosti u tip `int` (što radimo u kodu iznad) kako bismo pokazali `matplotlib`-u da želimo prikazati originalnu neskaliranu sliku.\n"
|
||||
"> **Napomena**: Sve slike u skupu podataka predstavljene su kao tenzori s pomičnim zarezom u rasponu od 0 do 255. Prije nego što ih proslijedimo neuronskoj mreži, moramo te vrijednosti skalirati u raspon 0-1. Prilikom iscrtavanja slika, moramo učiniti isto ili pretvoriti vrijednosti u `int` tip (što radimo u gornjem kodu), kako bismo pokazali `matplotlib` da želimo prikazati izvornu, neskaliranu sliku.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -462,7 +462,7 @@
|
|||
"source": [
|
||||
"## Predtrenirani modeli\n",
|
||||
"\n",
|
||||
"Za mnoge zadatke klasifikacije slika mogu se pronaći predtrenirani modeli neuronskih mreža. Mnogi od tih modela dostupni su unutar `keras.applications` prostora imena, a još više modela može se pronaći na internetu. Pogledajmo kako se najjednostavniji VGG-16 model može učitati i koristiti:\n"
|
||||
"Za mnoge zadatke klasifikacije slika mogu se pronaći predtrenirani modeli neuronskih mreža. Mnogi od tih modela dostupni su unutar `keras.applications` prostora imena, a još više modela može se pronaći na internetu. Pogledajmo kako se može učitati i koristiti najjednostavniji VGG-16 model:\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": [
|
||||
"Postoji nekoliko važnih stvari ovdje:\n",
|
||||
"* Prije nego što se ulaz proslijedi bilo kojoj unaprijed istreniranoj mreži, mora se prethodno obraditi na određeni način. To se postiže pozivanjem odgovarajuće funkcije `preprocess_input`, koja prima skup slika i vraća njihovu obrađenu verziju. U slučaju VGG-16, slike se normaliziraju, a unaprijed definirana prosječna vrijednost za svaki kanal se oduzima. To je zato što je VGG-16 izvorno treniran s ovakvom prethodnom obradom.\n",
|
||||
"* Neuronska mreža se primjenjuje na ulazni skup, a kao rezultat dobivamo skup tenzora s 1000 elemenata koji prikazuju vjerojatnost za svaku klasu. Najvjerojatniji broj klase možemo pronaći pozivanjem funkcije `argmax` na ovom tenzoru.\n",
|
||||
"* Dobiveni rezultat je [broj klase iz `ImageNet`](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Kako bismo razumjeli ovaj rezultat, možemo koristiti i funkciju `decode_predictions`, koja vraća n najvjerojatnijih klasa zajedno s njihovim imenima.\n"
|
||||
"Ovdje je nekoliko važnih stvari:\n",
|
||||
"* Prije nego što se ulaz proslijedi bilo kojoj prethodno treniranoj mreži, mora se na određeni način prethodno obraditi. To se obavlja pozivanjem odgovarajuće funkcije `preprocess_input`, koja prima batch slika i vraća njihov obrađeni oblik. U slučaju VGG-16, slike se normaliziraju, i oduzima im se unaprijed definirana prosječna vrijednost za svaki kanal. To je zato što je VGG-16 izvorno treniran s ovom prethodnom obradom.\n",
|
||||
"* Neuronska mreža se primjenjuje na ulazni batch i kao rezultat dobivamo batch tenzora od 1000 elemenata koji prikazuju vjerojatnost za svaku klasu. Najvjerojatniji broj klase možemo pronaći pozivanjem `argmax` na ovom tenzoru.\n",
|
||||
"* Dobiveni rezultat je [broj `ImageNet` klase](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Da bismo dali smisao ovom rezultatu, možemo također koristiti funkciju `decode_predictions`, koja vraća top n klasa zajedno s njihovim nazivima.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -597,9 +607,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Izračuni na GPU-u\n",
|
||||
"## GPU izračuni\n",
|
||||
"\n",
|
||||
"Duboke neuronske mreže, poput VGG-16 i drugih modernijih arhitektura, zahtijevaju prilično veliku računalnu snagu za izvođenje. Ima smisla koristiti ubrzanje putem GPU-a, ako je dostupno. Srećom, Keras automatski ubrzava izračune na GPU-u ako je dostupan. Možemo provjeriti može li Tensorflow koristiti GPU pomoću sljedećeg koda:\n"
|
||||
"Duboke neuronske mreže, poput VGG-16 i drugih modernijih arhitektura, zahtijevaju prilično mnogo računalne snage za izvođenje. Ima smisla koristiti GPU ubrzanje, ako je dostupno. Srećom, Keras automatski ubrzava izračune na GPU-u ako je dostupan. Možemo provjeriti je li Tensorflow u stanju koristiti GPU pomoću sljedećeg koda:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -626,9 +636,10 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Ekstrakcija značajki pomoću VGG-a\n",
|
||||
"\n",
|
||||
"Ako želimo koristiti VGG-16 za ekstrakciju značajki iz naših slika, trebamo model bez završnih slojeva za klasifikaciju. Možemo instancirati VGG-16 model bez gornjih slojeva koristeći ovaj kod:\n"
|
||||
"## Izvlačenje VGG značajki\n",
|
||||
"\n",
|
||||
"Ako želimo koristiti VGG-16 za izvlačenje značajki iz naših slika, potrebna nam je mreža bez završnih klasifikacijskih slojeva. Model VGG-16 bez gornjih slojeva možemo instancirati koristeći ovaj kod:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -680,9 +691,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Dimenzija tenzora značajki je 7x7x512, ali kako bismo ga vizualizirali, morali smo ga preoblikovati u 2D oblik.\n",
|
||||
"Dimenzija tenzora značajki je 7x7x512, ali kako bismo ih vizualizirali morali smo ih preoblikovati u 2D oblik.\n",
|
||||
"\n",
|
||||
"Sada pokušajmo vidjeti mogu li se te značajke koristiti za klasifikaciju slika. Ručno ćemo uzeti dio slika (u našem slučaju 50 mini-serija) i unaprijed izračunati njihove vektore značajki. Za to možemo koristiti Tensorflow **dataset** API. Funkcija `map` uzima dataset i primjenjuje zadanu lambda-funkciju kako bi ga transformirala. Ovaj mehanizam koristimo za izradu novih datasetova, `ds_features_train` i `ds_features_test`, koji sadrže značajke izdvojene pomoću VGG-a umjesto originalnih slika.\n"
|
||||
"Sada pokušajmo vidjeti mogu li se te značajke koristiti za klasifikaciju slika. Ručno ćemo uzeti neki dio slika (50 minibatches, u našem slučaju) i prethodno izračunati njihove vektore značajki. Za to možemo koristiti Tensorflow **dataset** API. Funkcija `map` uzima dataset i primjenjuje zadanu lambda-funkciju za transformaciju. Ovaj mehanizam koristimo za konstrukciju novih dataset-ova, `ds_features_train` i `ds_features_test`, koji sadrže značajke izdvojene VGG-om umjesto originalnih slika.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -712,9 +723,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Koristili smo konstrukciju `.take(50)` kako bismo ograničili veličinu skupa podataka i ubrzali našu demonstraciju. Naravno, ovaj eksperiment možete provesti na cijelom skupu podataka.\n",
|
||||
"Koristili smo konstrukciju `.take(50)` kako bismo ograničili veličinu skupa podataka i ubrzali našu demonstraciju. Naravno, ovaj eksperiment možete provesti i na cijelom skupu podataka.\n",
|
||||
"\n",
|
||||
"Sada, kada imamo skup podataka s izdvojenim značajkama, možemo trenirati jednostavan gusti klasifikator za razlikovanje između mačaka i pasa. Ova mreža će uzeti vektore značajki oblika (7,7,512) i proizvesti jedan izlaz koji odgovara ili psu ili mački. Budući da se radi o binarnoj klasifikaciji, koristimo funkciju aktivacije `sigmoid` i gubitak `binary_crossentropy`.\n"
|
||||
"Sada kada imamo skup podataka s izdvojenim značajkama, možemo trenirati jednostavan gusti klasifikator koji će razlikovati mačke i pse. Ova mreža će uzeti vektorski prikaz značajki oblika (7,7,512) i proizvesti jedan izlaz koji odgovara ili psu ili mački. Budući da je riječ o binarnoj klasifikaciji, koristimo `sigmoid` aktivacijsku funkciju i `binary_crossentropy` funkciju gubitka.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -743,13 +754,13 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Rezultat je odličan, možemo razlikovati mačku od psa s gotovo 95% vjerojatnosti! Međutim, ovaj pristup smo testirali samo na podskupu svih slika, jer ručna ekstrakcija značajki oduzima puno vremena.\n",
|
||||
"Rezultat je izvrstan, možemo razlikovati mačku i psa s gotovo 95% vjerojatnosti! Međutim, ovaj smo pristup testirali samo na podskupini svih slika, jer ručno izdvajanje značajki izgleda kao da zahtijeva puno vremena.\n",
|
||||
"\n",
|
||||
"## Transfer učenja pomoću jedne VGG mreže\n",
|
||||
"## Transferno učenje koristeći jednu VGG mrežu\n",
|
||||
"\n",
|
||||
"Također možemo izbjeći ručno unaprijed izračunavanje značajki korištenjem originalne VGG-16 mreže u cijelosti tijekom treniranja, dodavanjem ekstraktora značajki kao prvog sloja naše mreže.\n",
|
||||
"Također možemo izbjeći ručno prethodno izračunavanje značajki korištenjem izvornog VGG-16 modela u cjelini tijekom treninga, dodavanjem ekstraktora značajki našoj mreži kao prvom sloju.\n",
|
||||
"\n",
|
||||
"Ljepota Keras arhitekture je u tome što se VGG-16 model koji smo definirali gore može koristiti i kao sloj u drugoj neuronskoj mreži! Samo trebamo konstruirati mrežu s gustim klasifikatorom na vrhu i zatim trenirati cijelu mrežu koristeći povratnu propagaciju.\n"
|
||||
"Ljepota Keras arhitekture je u tome što se VGG-16 model koji smo definirali gore također može koristiti kao sloj u drugoj neuronskoj mreži! Samo trebamo konstruirati mrežu s gustim klasifikatorom na vrhu, a zatim trenirati cijelu mrežu koristeći povratno propagiranje.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -793,13 +804,13 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Ovaj model izgleda kao end-to-end mreža za klasifikaciju, koja prima sliku i vraća klasu. Međutim, izazov je u tome što želimo da VGG16 djeluje kao ekstraktor značajki, a ne da se ponovno trenira. Stoga moramo **zamrznuti težine konvolucijskog ekstraktora značajki**. Pristup prvoj sloju mreže možemo ostvariti pozivom `model.layers[0]`, a potrebno je samo postaviti svojstvo `trainable` na `False`.\n",
|
||||
"Ovaj model izgleda kao mreža za klasifikaciju od kraja do kraja, koja uzima sliku i vraća klasu. Međutim, problem je u tome što želimo da VGG16 djeluje kao ekstraktor značajki, a da se ne trenira ponovno. Stoga, trebamo **zamrznuti težine konvolucijskog ekstraktora značajki**. Možemo pristupiti prvom sloju mreže pozivom `model.layers[0]`, i trebamo samo postaviti svojstvo `trainable` na `False`.\n",
|
||||
"\n",
|
||||
"> **Napomena**: Zamrzavanje težina ekstraktora značajki je potrebno, jer bi inače netrenirani sloj klasifikatora mogao uništiti originalne unaprijed trenirane težine konvolucijskog ekstraktora.\n",
|
||||
"> **Napomena**: Zamrzavanje težina ekstraktora značajki je potrebno jer inače netrenirani sloj klasifikatora može uništiti originalne unaprijed trenirane težine konvolucijskog ekstraktora.\n",
|
||||
"\n",
|
||||
"Možete primijetiti da, iako je ukupan broj parametara u našoj mreži oko 15 milijuna, treniramo samo 25 tisuća parametara. Svi ostali parametri gornjih konvolucijskih filtera su unaprijed trenirani. To je dobro, jer možemo fino podesiti manji broj parametara s manjim brojem primjera.\n",
|
||||
"Možete primijetiti da dok je ukupni broj parametara u našoj mreži oko 15 milijuna, treniramo samo 25 tisuća parametara. Svi ostali parametri konvolucijskih filtera na višim razinama su unaprijed trenirani. To je dobro jer možemo fino podesiti manji broj parametara s manjim brojem primjera.\n",
|
||||
"\n",
|
||||
"Sada ćemo trenirati našu mrežu i vidjeti koliko dobre rezultate možemo postići. Očekujte prilično dugo vrijeme izvođenja i ne brinite ako se čini da je izvršavanje neko vrijeme zamrznuto.\n"
|
||||
"Sada ćemo trenirati našu mrežu i vidjeti koliko dobro možemo doći. Očekujte prilično dugo vrijeme izvođenja i nemojte se brinuti ako se čini da je izvršavanje neko vrijeme zaustavljeno.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -824,11 +835,11 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Izgleda da smo dobili prilično točan klasifikator za mačke i pse!\n",
|
||||
"Izgleda da smo dobili pristojno točan klasifikator za mačke i pse!\n",
|
||||
"\n",
|
||||
"## Spremanje i učitavanje modela\n",
|
||||
"\n",
|
||||
"Nakon što smo istrenirali model, možemo spremiti arhitekturu modela i istrenirane težine u datoteku za buduću upotrebu:\n"
|
||||
"Nakon što treniramo model, možemo spremiti arhitekturu modela i istrenirane težine u datoteku za buduću upotrebu:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -852,7 +863,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Model možemo učitati iz datoteke u bilo kojem trenutku. To može biti korisno u slučaju da sljedeći eksperiment uništi model - ne biste morali početi ispočetka.\n"
|
||||
"Model možemo zatim u bilo kojem trenutku učitati iz datoteke. To vam može biti korisno u slučaju da sljedeći eksperiment uništi model - ne biste morali započinjati ispočetka.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -868,15 +879,15 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Fino podešavanje prijenosnog učenja\n",
|
||||
"## Dorada prijenosa učenja\n",
|
||||
"\n",
|
||||
"U prethodnom odjeljku, trenirali smo završni sloj klasifikatora kako bi klasificirao slike u našem vlastitom skupu podataka. Međutim, nismo ponovno trenirali ekstraktor značajki, a naš model se oslanjao na značajke koje je naučio na podacima ImageNet-a. Ako se vaši objekti vizualno razlikuju od uobičajenih ImageNet slika, ova kombinacija značajki možda neće funkcionirati najbolje. Stoga ima smisla započeti treniranje i konvolucijskih slojeva.\n",
|
||||
"U prethodnom odjeljku obučili smo završni sloj klasifikatora da klasificira slike u našem vlastitom skupu podataka. Međutim, nismo ponovo trenirali ekstraktor značajki, i naš model se oslanjao na značajke koje je model naučio na ImageNet podacima. Ako se vaši objekti vizualno razlikuju od uobičajenih ImageNet slika, ova kombinacija značajki možda neće najbolje funkcionirati. Stoga ima smisla početi trenirati i konvolucijske slojeve.\n",
|
||||
"\n",
|
||||
"Da bismo to učinili, možemo odmrznuti parametre konvolucijskih filtera koje smo prethodno zamrznuli.\n",
|
||||
"Da bismo to učinili, možemo odmrznuti parametre konvolucijskih filtara koje smo prethodno zamrznuli.\n",
|
||||
"\n",
|
||||
"> **Note:** Važno je prvo zamrznuti parametre i provesti nekoliko epoha treniranja kako bi se stabilizirale težine u sloju klasifikacije. Ako odmah započnete treniranje mreže od kraja do kraja s odmrznutim parametrima, velike pogreške mogu uništiti unaprijed naučene težine u konvolucijskim slojevima.\n",
|
||||
"> **Napomena:** Važno je da prvo zamrznete parametre i izvršite nekoliko epoha treniranja kako biste stabilizirali težine u sloju klasifikacije. Ako odmah započnete trenirati cijelu mrežu s odmrznutim parametrima, velike pogreške vrlo vjerojatno će uništiti unaprijed naučene težine u konvolucijskim slojevima.\n",
|
||||
"\n",
|
||||
"Naš konvolucijski VGG-16 model nalazi se unutar prvog sloja i sastoji se od mnogih slojeva. Možemo pogledati njegovu strukturu:\n"
|
||||
"Naš konvolucijski VGG-16 model nalazi se unutar prvog sloja, i sam se sastoji od mnogo slojeva. Možemo pogledati njegovu strukturu:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -961,7 +972,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Međutim, odmrzavanje svih njih odjednom nije najbolja ideja. Možemo prvo odmrznuti samo nekoliko završnih slojeva konvolucija, jer oni sadrže uzorke više razine koji su relevantni za naše slike. Na primjer, za početak možemo zamrznuti sve slojeve osim posljednja 4:\n"
|
||||
"Međutim, odmrzavanje svih odjednom nije najbolja ideja. Možemo prvo odmrznuti samo nekoliko završnih slojeva konvolucija, jer oni sadrže obrasce viših razina koji su relevantni za naše slike. Na primjer, za početak možemo zamrznuti sve slojeve osim posljednjih 4: \n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1000,11 +1011,11 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Primijetite da se broj trenirajućih parametara značajno povećao, ali je i dalje oko 50% svih parametara.\n",
|
||||
"Primijetite da je broj parametara koji se treniraju značajno porastao, ali je još uvijek oko 50% svih parametara.\n",
|
||||
"\n",
|
||||
"Nakon otključavanja, možemo odraditi još nekoliko epoha treniranja (u našem primjeru, odradit ćemo samo jednu). Također možete odabrati nižu stopu učenja kako biste minimizirali utjecaj na unaprijed istrenirane težine. Međutim, čak i s niskom stopom učenja, možete očekivati pad točnosti na početku treniranja, sve dok konačno ne dostigne nešto višu razinu nego u slučaju fiksnih težina.\n",
|
||||
"Nakon odmrzavanja, možemo napraviti nekoliko dodatnih epoha treniranja (u našem primjeru, napravit ćemo samo jednu). Također možete odabrati nižu stopu učenja kako biste minimizirali utjecaj na prethodno naučene težine. Međutim, čak i s niskom stopom učenja, možete očekivati da će točnost u početku treninga pasti, dok na kraju ne dosegne nešto višu razinu nego u slučaju fiksnih težina.\n",
|
||||
"\n",
|
||||
"> **Napomena:** Ovo treniranje odvija se znatno sporije jer moramo propagirati gradijente unatrag kroz mnoge slojeve mreže!\n"
|
||||
"> **Napomena:** Ovo treniranje se odvija puno sporije, jer moramo propagirati gradijente nazad kroz mnogo slojeva mreže!\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1028,18 +1039,18 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Vjerojatno ćemo postići veću točnost na trening skupu, jer koristimo snažniju mrežu s više parametara, ali točnost na validacijskom skupu neće se povećati u istoj mjeri.\n",
|
||||
"Vjerojatno ćemo postići veću točnost treninga, jer koristimo snažniju mrežu s više parametara, ali će se točnost validacije povećati ne toliko.\n",
|
||||
"\n",
|
||||
"Slobodno otključajte još nekoliko slojeva mreže i nastavite s treniranjem kako biste vidjeli možete li postići veću točnost!\n"
|
||||
"Slobodno odmrznite još nekoliko slojeva mreže i trenirajte više, da vidite možete li postići veću točnost!\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Ostali modeli računalnog vida\n",
|
||||
"## Ostali računalni vid modeli\n",
|
||||
"\n",
|
||||
"VGG-16 je jedna od najjednostavnijih arhitektura za računalni vid. Keras nudi mnogo više unaprijed istreniranih mreža. Najčešće korištene među njima su arhitekture **ResNet**, koje je razvila Microsoft, i **Inception** od Googlea. Na primjer, istražimo arhitekturu najjednostavnijeg modela ResNet-50 (ResNet je obitelj modela s različitim dubinama, možete eksperimentirati s ResNet-152 ako želite vidjeti kako izgleda zaista dubok model):\n"
|
||||
"VGG-16 je jedna od najjednostavnijih arhitektura računalnog vida. Keras pruža mnogo više unaprijed istreniranih mreža. Najčešće korištene među njima su **ResNet** arhitekture, razvijene od strane Microsofta, i **Inception** od Googlea. Na primjer, istražimo arhitekturu najjednostavnijeg ResNet-50 modela (ResNet je obitelj modela s različitom dubinom, možete eksperimentirati s ResNet-152 ako želite vidjeti kako izgleda zaista duboki model):\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1441,29 +1452,29 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Kao što možete vidjeti, model sadrži iste poznate građevne blokove: konvolucijske slojeve, slojeve za pooling i završni gusti klasifikator. Ovaj model možemo koristiti na potpuno isti način kao što smo koristili VGG-16 za transferno učenje. Možete pokušati eksperimentirati s gornjim kodom, koristeći različite ResNet modele kao osnovni model, i vidjeti kako se to odražava na točnost.\n",
|
||||
"Kao što možete vidjeti, model sadrži iste dobro poznate građevne blokove: konvolucijske slojeve, slojeve za grupiranje i konačni gusti klasifikator. Možemo koristiti ovaj model na isti način na koji smo koristili VGG-16 za prenošenje učenja. Možete eksperimentirati s gornjim kodom, koristeći različite ResNet modele kao osnovni model i vidjeti kako se točnost mijenja.\n",
|
||||
"\n",
|
||||
"## Batch Normalizacija\n",
|
||||
"## Normalizacija paketa\n",
|
||||
"\n",
|
||||
"Ova mreža sadrži još jednu vrstu sloja: **Batch Normalizacija**. Ideja batch normalizacije je dovesti vrijednosti koje prolaze kroz neuronsku mrežu u ispravan interval. Obično neuronske mreže najbolje rade kada su sve vrijednosti u rasponu od [-1,1] ili [0,1], i zato skaliramo/normaliziramo ulazne podatke u skladu s tim. Međutim, tijekom treniranja duboke mreže može se dogoditi da vrijednosti značajno izađu iz tog raspona, što otežava treniranje. Batch normalizacijski sloj izračunava prosjek i standardnu devijaciju za sve vrijednosti trenutnog minibatcha i koristi ih za normalizaciju signala prije nego što ga proslijedi kroz sloj neuronske mreže. Ovo značajno poboljšava stabilnost dubokih mreža.\n"
|
||||
"Ova mreža sadrži još jednu vrstu sloja: **Normalizaciju paketa**. Ideja normalizacije paketa je dovesti vrijednosti koje prolaze kroz neuronsku mrežu u odgovarajući interval. Obično neuronske mreže najbolje rade kada su sve vrijednosti u rasponu [-1,1] ili [0,1], i zato skaliramo/normaliziramo naše ulazne podatke u skladu s tim. Međutim, tijekom treniranja duboke mreže može se dogoditi da vrijednosti značajno izađu izvan ovog raspona, što otežava treniranje. Sloj za normalizaciju paketa računa prosjek i standardnu devijaciju za sve vrijednosti trenutnog minibatcha, i koristi ih za normalizaciju signala prije nego što ga proslijedi kroz sloj neuronske mreže. Ovo značajno poboljšava stabilnost dubokih mreža.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Ključne točke\n",
|
||||
"## Zaključak\n",
|
||||
"\n",
|
||||
"Korištenjem prijenosnog učenja, uspjeli smo brzo sastaviti klasifikator za naš zadatak prilagođene klasifikacije objekata i postići visoku točnost. Međutim, ovaj primjer nije bio potpuno pravedan, jer je originalna VGG-16 mreža prethodno trenirana za prepoznavanje mačaka i pasa, pa smo samo ponovno koristili već postojeće obrasce u mreži. Možete očekivati nižu točnost kod egzotičnijih objekata specifičnih za određene domene, poput detalja na proizvodnoj liniji u tvornici ili različitih listova drveća.\n",
|
||||
"Korištenjem transfernog učenja, uspjeli smo brzo sastaviti klasifikator za naš zadatak prilagođene klasifikacije objekata i postići visoku točnost. Međutim, ovaj primjer nije bio potpuno fer, jer je izvorna VGG-16 mreža prethodno trenirana za prepoznavanje mačaka i pasa, pa smo tako zapravo ponovno koristili većinu obrazaca koji su već bili prisutni u mreži. Možete očekivati nižu točnost na egzotičnijim specifičnim domenama objekata, poput detalja na proizvodnoj liniji u tvornici ili različitih vrsta lišća.\n",
|
||||
"\n",
|
||||
"Možete primijetiti da složeniji zadaci koje sada rješavamo zahtijevaju veću računalnu snagu i ne mogu se lako riješiti na CPU-u. U sljedećoj jedinici pokušat ćemo koristiti lakšu implementaciju za treniranje istog modela koristeći manje računalne resurse, što rezultira samo neznatno nižom točnošću.\n"
|
||||
"Možete vidjeti da složeniji zadaci koje sada rješavamo zahtijevaju veću računalnu snagu i ne mogu se lako riješiti na CPU-u. U sljedećem dijelu pokušat ćemo koristiti laganiju implementaciju za treniranje istog modela koristeći manje računalnih resursa, što rezultira samo malo nižom točnošću.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**Odricanje od odgovornosti**: \nOvaj dokument je preveden pomoću AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane čovjeka. Ne preuzimamo odgovornost za bilo kakva nesporazuma ili pogrešna tumačenja koja proizlaze iz korištenja ovog prijevoda.\n"
|
||||
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**Napomena**:\nOvaj dokument je preveden korištenjem AI prevoditeljskog servisa [Co-op Translator](https://github.com/Azure/co-op-translator). Iako težimo točnosti, imajte na umu da automatski prijevodi mogu sadržavati greške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za važne informacije preporuča se profesionalni ljudski prijevod. Nismo odgovorni za bilo kakva nesporazumevanja ili pogrešne interpretacije koje proizlaze iz korištenja ovog prijevoda.\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-30T07:22:12+00:00",
|
||||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb",
|
||||
"language_code": "hr"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
|
|
|||
|
|
@ -1,51 +1,51 @@
|
|||
# Obrada Prirodnog Jezika
|
||||
|
||||

|
||||

|
||||
|
||||
U ovom dijelu fokusirat ćemo se na korištenje neuronskih mreža za rješavanje zadataka povezanih s **Obradom Prirodnog Jezika (NLP)**. Postoji mnogo NLP problema koje želimo da računala mogu riješiti:
|
||||
U ovom odjeljku fokusirat ćemo se na korištenje neuronskih mreža za rješavanje zadataka vezanih uz **Obradu Prirodnog Jezika (NLP)**. Postoji mnogo NLP problema koje želimo da računala budu sposobna riješiti:
|
||||
|
||||
* **Klasifikacija teksta** je tipičan problem klasifikacije koji se odnosi na tekstualne sekvence. Primjeri uključuju klasifikaciju e-mail poruka kao spam ili ne-spam, ili kategorizaciju članaka kao sport, biznis, politika itd. Također, pri razvoju chat botova često trebamo razumjeti što korisnik želi reći — u tom slučaju bavimo se **klasifikacijom namjere**. Često, kod klasifikacije namjere, moramo raditi s mnogo kategorija.
|
||||
* **Analiza sentimenta** je tipičan regresijski problem, gdje trebamo dodijeliti broj (sentiment) koji odgovara tome koliko je značenje rečenice pozitivno/negativno. Naprednija verzija analize sentimenta je **analiza sentimenta po aspektima** (ABSA), gdje sentiment ne dodjeljujemo cijeloj rečenici, već različitim dijelovima (aspektima), npr. *U ovom restoranu mi se svidjela kuhinja, ali atmosfera je bila grozna*.
|
||||
* **Prepoznavanje imenovanih entiteta** (NER) odnosi se na problem izdvajanja određenih entiteta iz teksta. Na primjer, trebamo razumjeti da u frazi *Moram letjeti za Pariz sutra* riječ *sutra* označava DATUM, a *Pariz* je LOKACIJA.
|
||||
* **Ekstrakcija ključnih riječi** je slična NER-u, ali trebamo automatski izdvojiti riječi važne za značenje rečenice, bez prethodnog treniranja za specifične tipove entiteta.
|
||||
* **Grupiranje teksta** može biti korisno kada želimo grupirati slične rečenice, na primjer, slične zahtjeve u razgovorima tehničke podrške.
|
||||
* **Odgovaranje na pitanja** odnosi se na sposobnost modela da odgovori na specifično pitanje. Model prima tekstualni odlomak i pitanje kao ulaz, te treba pružiti mjesto u tekstu gdje se nalazi odgovor na pitanje (ili, ponekad, generirati tekst odgovora).
|
||||
* **Generiranje teksta** je sposobnost modela da generira novi tekst. To se može smatrati zadatkom klasifikacije koji predviđa sljedeće slovo/riječ na temelju nekog *tekstualnog upita*. Napredni modeli za generiranje teksta, poput GPT-3, mogu rješavati druge NLP zadatke poput klasifikacije koristeći tehniku zvanu [programiranje upita](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) ili [inženjering upita](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29).
|
||||
* **Klasifikacija teksta** je tipični problem klasifikacije koji se odnosi na tekstualne nizove. Primjeri uključuju klasifikaciju e-mail poruka kao spam ili ne-spam, ili kategorizaciju članaka kao sport, posao, politika itd. Također, pri razvoju chat botova često trebamo razumjeti što je korisnik želio reći – u tom slučaju radimo s **klasifikacijom namjere**. Često kod klasifikacije namjere trebamo imati posla s mnogim kategorijama.
|
||||
* **Analiza sentimenta** je tipični problem regresije, gdje trebamo pridružiti broj (sentiment) koji odgovara koliko je značenje rečenice pozitivno/negativno. Naprednija verzija analize sentimenta je **analiza sentimenta bazirana na aspektima** (ABSA), gdje sentiment pridružujemo ne cijeloj rečenici, već različitim njezinim dijelovima (aspektima), npr. *U ovom restoranu svidjela mi se kuhinja, ali atmosfera je bila užasna*.
|
||||
* **Prepoznavanje imenovanih entiteta** (NER) odnosi se na problem izdvajanja određenih entiteta iz teksta. Na primjer, mogli bismo trebati razumjeti da u frazi *Moram letjeti u Pariz sutra* riječ *sutra* označava DATUM, a *Pariz* je LOKACIJA.
|
||||
* **Izdvajanje ključnih riječi** sličan je NER-u, ali trebamo automatski izdvojiti riječi važne za značenje rečenice, bez predtreniravanja za specifične vrste entiteta.
|
||||
* **Grupiranje teksta** može biti korisno kada želimo grupirati slične rečenice, primjerice slične zahtjeve u razgovorima tehničke podrške.
|
||||
* **Odgovaranje na pitanja** odnosi se na sposobnost modela da odgovori na specifično pitanje. Model prima tekstovni odlomak i pitanje kao ulaze, a treba pružiti mjesto u tekstu gdje se nalazi odgovor na pitanje (ili, ponekad, generirati tekstualni odgovor).
|
||||
* **Generiranje teksta** je sposobnost modela da generira novi tekst. To se može smatrati klasifikacijskim zadatkom koji predviđa sljedeće slovo/riječ na temelju nekog *tekstualnog uvoda*. Napredni modeli za generiranje teksta, poput GPT-3, sposobni su riješiti i druge NLP zadatke poput klasifikacije koristeći tehniku zvanu [prompt programiranje](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) ili [prompt inženjering](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29)
|
||||
* **Sažimanje teksta** je tehnika kada želimo da računalo "pročita" dugi tekst i sažme ga u nekoliko rečenica.
|
||||
* **Strojno prevođenje** može se promatrati kao kombinacija razumijevanja teksta na jednom jeziku i generiranja teksta na drugom jeziku.
|
||||
* **Strojno prevođenje** može se promatrati kao kombinacija razumijevanja teksta na jednom jeziku i generiranje teksta na drugom jeziku.
|
||||
|
||||
U početku su se većina NLP zadataka rješavala tradicionalnim metodama poput gramatika. Na primjer, u strojnome prevođenju parseri su se koristili za transformaciju početne rečenice u sintaktičko stablo, zatim su se izdvajale semantičke strukture višeg nivoa kako bi se predstavilo značenje rečenice, a na temelju tog značenja i gramatike ciljnog jezika generirao se rezultat. Danas se mnogi NLP zadaci učinkovitije rješavaju pomoću neuronskih mreža.
|
||||
U početku su većina NLP zadataka rješavana korištenjem klasičnih metoda poput gramatika. Primjerice, pri strojnome prevođenju koristili su se parseri za transformaciju početne rečenice u sintaksno stablo, zatim su izdvajane semantičke strukture viših razina za predstavljanje značenja rečenice, a na temelju tog značenja i gramatike ciljnog jezika generiran je rezultat. Danas se mnogi NLP zadaci učinkovitije rješavaju koristeći neuronske mreže.
|
||||
|
||||
> Mnoge klasične NLP metode implementirane su u Python biblioteci [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org). Dostupna je izvrsna [NLTK knjiga](https://www.nltk.org/book/) online koja pokriva kako se različiti NLP zadaci mogu riješiti pomoću NLTK-a.
|
||||
> Mnoge klasične NLP metode implementirane su u [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org) Python biblioteci. Postoji sjajna [NLTK Knjiga](https://www.nltk.org/book/) dostupna online koja objašnjava kako se različiti NLP zadaci mogu riješiti koristeći NLTK.
|
||||
|
||||
Na našem tečaju uglavnom ćemo se fokusirati na korištenje neuronskih mreža za NLP, a NLTK ćemo koristiti gdje je potrebno.
|
||||
|
||||
Već smo naučili kako koristiti neuronske mreže za rad s tabličnim podacima i slikama. Glavna razlika između tih vrsta podataka i teksta je ta što je tekst sekvenca promjenjive duljine, dok je veličina ulaza u slučaju slika unaprijed poznata. Dok konvolucijske mreže mogu izdvojiti uzorke iz ulaznih podataka, uzorci u tekstu su složeniji. Na primjer, negacija može biti odvojena od subjekta za mnogo riječi (npr. *Ne volim naranče* naspram *Ne volim one velike šarene ukusne naranče*), i to bi se još uvijek trebalo interpretirati kao jedan uzorak. Stoga, za obradu jezika trebamo uvesti nove vrste neuronskih mreža, poput *rekurentnih mreža* i *transformera*.
|
||||
Već smo naučili o korištenju neuronskih mreža za rad s tabličnim podacima i slikama. Glavna razlika između tih vrsta podataka i teksta jest u tome što je tekst niz varijabilne duljine, dok je veličina ulaza kod slika unaprijed poznata. Dok konvolucijske mreže mogu izdvajati obrasce iz ulaznih podataka, obrasci u tekstu su složeniji. Npr., negacija može biti odvojena od subjekta proizvoljnim brojem riječi (npr. *Ne volim naranče*, vs. *Ne volim te velike šarene ukusne naranče*), a to se još uvijek treba interpretirati kao jedan obrazac. Zato za obradu jezika trebamo uvesti nove vrste neuronskih mreža, poput *rekurentnih mreža* i *transformera*.
|
||||
|
||||
## Instalacija Biblioteka
|
||||
|
||||
Ako koristite lokalnu Python instalaciju za pokretanje ovog tečaja, možda ćete trebati instalirati sve potrebne biblioteke za NLP pomoću sljedećih naredbi:
|
||||
Ako koristite lokalnu Python instalaciju za izvođenje ovog tečaja, možda ćete trebati instalirati sve potrebne biblioteke za NLP koristeći sljedeće naredbe:
|
||||
|
||||
**Za PyTorch**
|
||||
```bash
|
||||
pip install -r requirements-torch.txt
|
||||
pip install -r requirements-pytorch.txt
|
||||
```
|
||||
**Za TensorFlow**
|
||||
```bash
|
||||
pip install -r requirements-tf.txt
|
||||
```
|
||||
|
||||
> NLP s TensorFlowom možete isprobati na [Microsoft Learn](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste)
|
||||
> NLP s TensorFlow možete isprobati na [Microsoft Learn](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste)
|
||||
|
||||
## Upozorenje o GPU-u
|
||||
## Upozorenje za GPU
|
||||
|
||||
U ovom dijelu, u nekim primjerima trenirat ćemo prilično velike modele.
|
||||
* **Koristite računalo s GPU-om**: Preporučuje se pokretanje vaših bilježnica na računalu s GPU-om kako biste smanjili vrijeme čekanja pri radu s velikim modelima.
|
||||
* **Ograničenja GPU memorije**: Pokretanje na GPU-u može dovesti do situacija u kojima vam ponestane GPU memorije, posebno pri treniranju velikih modela.
|
||||
* **Potrošnja GPU memorije**: Količina GPU memorije koja se troši tijekom treniranja ovisi o raznim faktorima, uključujući veličinu minibatch-a.
|
||||
* **Smanjite veličinu minibatch-a**: Ako naiđete na probleme s GPU memorijom, razmislite o smanjenju veličine minibatch-a u vašem kodu kao potencijalnom rješenju.
|
||||
* **Oslobađanje GPU memorije u TensorFlowu**: Starije verzije TensorFlowa možda neće pravilno osloboditi GPU memoriju pri treniranju više modela unutar jednog Python kernela. Kako biste učinkovito upravljali korištenjem GPU memorije, možete konfigurirati TensorFlow da alocira GPU memoriju samo po potrebi.
|
||||
* **Uključivanje koda**: Da biste postavili TensorFlow da alocira GPU memoriju samo kada je to potrebno, uključite sljedeći kod u svoje bilježnice:
|
||||
U ovom odjeljku u nekim ćemo primjerima trenirati prilično velike modele.
|
||||
* **Koristite računalo s podrškom za GPU**: Preporučuje se pokretanje vaših bilježnica na računalu s podrškom za GPU kako biste smanjili vrijeme čekanja pri radu s velikim modelima.
|
||||
* **Ograničenja memorije GPU-a**: Pokretanje na GPU može dovesti do situacija u kojima vam ponestane memorije GPU-a, osobito pri treniranju velikih modela.
|
||||
* **Potrošnja memorije GPU-a**: Količina memorije GPU-a koju model troši tijekom treniranja ovisi o raznim čimbenicima, uključujući veličinu minibatch-a.
|
||||
* **Minimizirajte veličinu minibatch-a**: Ako naiđete na probleme s memorijom GPU-a, razmislite o smanjenju veličine minibatch-a u vašem kodu kao potencijalnom rješenju.
|
||||
* **Otpust memorije GPU-a u TensorFlowu**: Starije verzije TensorFlowa možda neće pravilno otpustiti memoriju GPU-a kada trenirate više modela u jednoj Python sesiji. Za učinkovito upravljanje potrošnjom memorije na GPU-u, možete konfigurirati TensorFlow da alocira memoriju GPU-a samo po potrebi.
|
||||
* **Uključivanje koda**: Da biste postavili TensorFlow da povećava alokaciju memorije GPU-a samo kada je potrebna, uključite sljedeći kod u vaše bilježnice:
|
||||
|
||||
```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)
|
||||
```
|
||||
|
||||
Ako vas zanima učenje o NLP-u iz perspektive klasičnog ML-a, posjetite [ovaj niz lekcija](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP).
|
||||
Ako ste zainteresirani za učenje o NLP-u iz klasične perspektive strojnog učenja, posjetite [ovaj skup lekcija](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP)
|
||||
|
||||
## U ovom dijelu
|
||||
U ovom dijelu naučit ćemo o:
|
||||
## U ovom odjeljku
|
||||
U ovom odjeljku naučit ćemo o:
|
||||
|
||||
* [Predstavljanje teksta kao tenzora](13-TextRep/README.md)
|
||||
* [Ugrađivanje riječi](14-Emdeddings/README.md)
|
||||
* [Word Embeddings](14-Emdeddings/README.md)
|
||||
* [Modeliranje jezika](15-LanguageModeling/README.md)
|
||||
* [Rekurentne neuronske mreže](16-RNN/README.md)
|
||||
* [Generativne mreže](17-GenerativeNetworks/README.md)
|
||||
* [Transformeri](18-Transformers/README.md)
|
||||
|
||||
**Odricanje od odgovornosti**:
|
||||
Ovaj dokument je preveden pomoću AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za kritične informacije preporučuje se profesionalni prijevod od strane čovjeka. Ne preuzimamo odgovornost za nesporazume ili pogrešna tumačenja koja mogu proizaći iz korištenja ovog prijevoda.
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**Napomena**:
|
||||
Ovaj dokument je preveden korištenjem AI prevoditeljskog servisa [Co-op Translator](https://github.com/Azure/co-op-translator). Iako težimo točnosti, imajte na umu da automatski prijevodi mogu sadržavati greške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za važne informacije preporuča se profesionalni ljudski prijevod. Nismo odgovorni za bilo kakva nesporazumevanja ili pogrešne interpretacije koje proizlaze iz korištenja ovog prijevoda.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -5,6 +5,12 @@
|
|||
"source_file": "AGENTS.md",
|
||||
"language_code": "hu"
|
||||
},
|
||||
"CONTRIBUTING.md": {
|
||||
"original_hash": "c6fd7e781b67111a90abd166d0ce4aa0",
|
||||
"translation_date": "2026-07-08T17:13:51+00:00",
|
||||
"source_file": "CONTRIBUTING.md",
|
||||
"language_code": "hu"
|
||||
},
|
||||
"README.md": {
|
||||
"original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b",
|
||||
"translation_date": "2026-04-06T16:45:37+00:00",
|
||||
|
|
@ -17,6 +23,19 @@
|
|||
"source_file": "SECURITY.md",
|
||||
"language_code": "hu"
|
||||
},
|
||||
"__translation_failures__": {
|
||||
"lessons/sketchnotes/LICENSE.md": {
|
||||
"original_hash": "45ab63a2cd8f5faef6c9b150618837a4",
|
||||
"source_file": "lessons/sketchnotes/LICENSE.md",
|
||||
"language_code": "hu",
|
||||
"failure_date": "2026-07-08T16:58:38+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-26T00:44:21+00:00",
|
||||
|
|
@ -54,8 +73,8 @@
|
|||
"language_code": "hu"
|
||||
},
|
||||
"examples/README.md": {
|
||||
"original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7",
|
||||
"translation_date": "2025-10-03T11:33:24+00:00",
|
||||
"original_hash": "7883d52c2e2a221e0b07a7b112a149b9",
|
||||
"translation_date": "2026-07-08T16:53:31+00:00",
|
||||
"source_file": "examples/README.md",
|
||||
"language_code": "hu"
|
||||
},
|
||||
|
|
@ -66,8 +85,8 @@
|
|||
"language_code": "hu"
|
||||
},
|
||||
"lessons/0-course-setup/how-to-run.md": {
|
||||
"original_hash": "a4717bd9103b9f6cd84d534b83534689",
|
||||
"translation_date": "2026-01-16T04:46:36+00:00",
|
||||
"original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1",
|
||||
"translation_date": "2026-07-08T16:53:58+00:00",
|
||||
"source_file": "lessons/0-course-setup/how-to-run.md",
|
||||
"language_code": "hu"
|
||||
},
|
||||
|
|
@ -191,6 +210,12 @@
|
|||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md",
|
||||
"language_code": "hu"
|
||||
},
|
||||
"lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": {
|
||||
"original_hash": "99b816b6a4957ef4100cee4c4221dff9",
|
||||
"translation_date": "2026-07-08T16:49:22+00:00",
|
||||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb",
|
||||
"language_code": "hu"
|
||||
},
|
||||
"lessons/4-ComputerVision/08-TransferLearning/lab/README.md": {
|
||||
"original_hash": "7765935c35fcee69b9fe2d0cfd6963e2",
|
||||
"translation_date": "2025-08-25T23:16:18+00:00",
|
||||
|
|
@ -330,8 +355,8 @@
|
|||
"language_code": "hu"
|
||||
},
|
||||
"lessons/5-NLP/README.md": {
|
||||
"original_hash": "8ef02a9318257ea140ed3ed74442096d",
|
||||
"translation_date": "2025-08-25T21:27:16+00:00",
|
||||
"original_hash": "038df6f1a73e49f6430740da083bfd6d",
|
||||
"translation_date": "2026-07-08T16:54:28+00:00",
|
||||
"source_file": "lessons/5-NLP/README.md",
|
||||
"language_code": "hu"
|
||||
},
|
||||
|
|
@ -355,7 +380,7 @@
|
|||
},
|
||||
"lessons/6-Other/23-MultiagentSystems/README.md": {
|
||||
"original_hash": "38a1185ae3d54b180378bbd71ae3ef16",
|
||||
"translation_date": "2025-09-23T11:08:38+00:00",
|
||||
"translation_date": "2026-07-08T16:59:49+00:00",
|
||||
"source_file": "lessons/6-Other/23-MultiagentSystems/README.md",
|
||||
"language_code": "hu"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -0,0 +1,29 @@
|
|||
# Hozzájárulás az AI-For-Beginners projekthez
|
||||
|
||||
Köszönjük érdeklődését az AI-For-Beginners projekthez való hozzájárulás iránt! Szívesen fogadjuk a fordításokat, tananyaggondozásokat és formázási javításokat.
|
||||
|
||||
## Microsoft Contributor License Agreement (CLA)
|
||||
|
||||
Ez a projekt fogadja a hozzájárulásokat és javaslatokat. A legtöbb hozzájáruláshoz el kell fogadnia egy Contributor License Agreement (CLA) megállapodást, amely nyilatkozza, hogy joga van hozzájárulásának felhasználására, és ténylegesen megadja nekünk ennek jogát. Részletekért látogasson el a [https://cla.microsoft.com](https://cla.microsoft.com) oldalra.
|
||||
|
||||
Amikor pull request-et nyújt be, a CLA-bot automatikusan eldönti, hogy szükséges-e CLA-t szolgáltatnia, és ez alapján címkézi, jegyzeteli a PR-t (például címke, komment). Csak kövesse a bot utasításait. Ezt csak egyszer kell elvégeznie minden olyan tárhely esetén, amelynél a CLA-t használjuk.
|
||||
|
||||
## Hogyan járuljon hozzá
|
||||
|
||||
### 1. Elírások / Kódhibák javítása
|
||||
Ha elírást vagy hibát talál bármely Jupyter notebookban vagy tananyagmelléklet fájlban:
|
||||
1. Forkolja a tárhelyet.
|
||||
2. Javítsa az elírást vagy hibás hivatkozást.
|
||||
3. Nyújtson be egy Pull Request-et egyértelmű javítási leírással.
|
||||
|
||||
### 2. Fordítások beküldése
|
||||
Szívesen fogadjuk a tananyagot más nyelvekre történő fordításban is! Kérjük, a fordításokat helyezze el a `translations/` könyvtár alatt a meglévő mappaneveket használva (például `translations/es/`, `translations/pt-BR/`, `translations/zh-CN/`).
|
||||
|
||||
Részletekért lásd: [etc/CONTRIBUTING.md](etc/CONTRIBUTING.md).
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**Jogi nyilatkozat**:
|
||||
Ez a dokumentum az AI fordítási szolgáltatás, a [Co-op Translator](https://github.com/Azure/co-op-translator) segítségével készült. Bár az pontosságra törekszünk, kérjük, vegye figyelembe, hogy az automatikus fordítások hibákat vagy pontatlanságokat tartalmazhatnak. Az eredeti dokumentum az anyanyelvén tekintendő hiteles forrásnak. Fontos információk esetén professzionális emberi fordítást javasolunk. Nem vállalunk felelősséget semmilyen félreértésért vagy téves értelmezésért, amely ebből a fordításból ered.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -1,85 +1,87 @@
|
|||
# Kezdőbarát AI Példák
|
||||
# Kezdőknek Szóló AI Példák
|
||||
|
||||
Üdvözlünk! Ez a könyvtár egyszerű, önálló példákat tartalmaz, amelyek segítenek az AI és a gépi tanulás alapjainak elsajátításában. Minden példa kezdőbarát, részletes megjegyzésekkel és lépésről lépésre történő magyarázatokkal.
|
||||
Üdvözlünk! Ez a könyvtár egyszerű, önálló példákat tartalmaz, hogy segítsen elindulni az AI és a gépi tanulás világában. Minden példa kezdőbarát, részletes megjegyzésekkel és lépésről lépésre történő magyarázatokkal.
|
||||
|
||||
## 📚 Példák Áttekintése
|
||||
|
||||
| Példa | Leírás | Nehézség | Előfeltételek |
|
||||
|-------|--------|----------|---------------|
|
||||
| [Hello AI World](../../../examples/01-hello-ai-world.py) | Az első AI programod - egyszerű mintafelismerés | ⭐ Kezdő | Python alapok |
|
||||
| [Egyszerű Neurális Hálózat](../../../examples/02-simple-neural-network.py) | Neurális hálózat építése az alapoktól | ⭐⭐ Kezdő+ | Python, alap matematikai ismeretek |
|
||||
| [Képosztályozó](./03-image-classifier.ipynb) | Képek osztályozása előre betanított modellel | ⭐⭐ Kezdő+ | Python, numpy |
|
||||
| [Szöveg Hangulata](../../../examples/04-text-sentiment.py) | Szövegek hangulatának elemzése (pozitív/negatív) | ⭐⭐ Kezdő+ | Python |
|
||||
|---------|-------------|------------|---------------|
|
||||
| [Hello AI World](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/01-hello-ai-world.py) | Az első AI programod – egyszerű minta felismerés | ⭐ Kezdő | Python alapjai |
|
||||
| [Simple Neural Network](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/02-simple-neural-network.py) | Hozz létre egy neurális hálózatot a semmiből | ⭐⭐ Kezdő+ | Python, alap matematikai ismeretek |
|
||||
| [Image Classifier](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/03-image-classifier.ipynb) | Kép osztályozás előre betanított modellel | ⭐⭐ Kezdő+ | Python, numpy |
|
||||
| [Text Sentiment](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/04-text-sentiment.py) | Szövegérzelem elemzése (pozitív/negatív) | ⭐⭐ Kezdő+ | Python |
|
||||
|
||||
## 🚀 Első Lépések
|
||||
## 🚀 Kezdjünk neki
|
||||
|
||||
### Előfeltételek
|
||||
|
||||
Győződj meg róla, hogy a Python telepítve van (ajánlott verzió: 3.8 vagy újabb). Telepítsd a szükséges csomagokat:
|
||||
Győződj meg róla, hogy telepítve van a Python (3.8 vagy újabb verzió ajánlott). Telepítsd a szükséges csomagokat:
|
||||
|
||||
```bash
|
||||
# For Python scripts
|
||||
# Python szkriptekhez
|
||||
pip install numpy
|
||||
|
||||
# For Jupyter notebooks (image classifier)
|
||||
# Jupyter jegyzetfüzetekhez (kép osztályozó)
|
||||
pip install jupyter numpy pillow tensorflow
|
||||
```
|
||||
|
||||
Vagy használd a fő tananyag conda környezetét:
|
||||
Vagy használd a conda környezetet a fő tananyagból:
|
||||
|
||||
```bash
|
||||
conda env create --name ai4beg --file ../environment.yml
|
||||
conda activate ai4beg
|
||||
```
|
||||
|
||||
### Példák Futattása
|
||||
### Példák futtatása
|
||||
|
||||
**Python szkriptekhez (.py fájlok):**
|
||||
```bash
|
||||
python 01-hello-ai-world.py
|
||||
```
|
||||
|
||||
**Jupyter notebookokhoz (.ipynb fájlok):**
|
||||
**Jupyter jegyzetfüzetekhez (.ipynb fájlok):**
|
||||
```bash
|
||||
jupyter notebook 03-image-classifier.ipynb
|
||||
```
|
||||
|
||||
## 📖 Tanulási Útmutató
|
||||
## 📖 Tanulási útvonal
|
||||
|
||||
Javasoljuk, hogy a példákat sorrendben kövesd:
|
||||
Ajánljuk, hogy a példákat sorrendben kövesd:
|
||||
|
||||
1. **Kezdd a "Hello AI World"-del** - Ismerd meg a mintafelismerés alapjait
|
||||
2. **Építs egy Egyszerű Neurális Hálót** - Értsd meg, hogyan működnek a neurális hálók
|
||||
3. **Próbáld ki a Képosztályozót** - Nézd meg az AI-t működés közben valódi képekkel
|
||||
4. **Elemezd a Szöveg Hangulatát** - Fedezd fel a természetes nyelvfeldolgozást
|
||||
1. **Kezdd a "Hello AI World"-del** – Ismerd meg az alapvető minta felismerést
|
||||
2. **Építs egy egyszerű neurális hálózatot** – Értsd meg, hogyan működnek a neurális hálózatok
|
||||
3. **Próbáld ki a kép osztályozót** – Nézd meg az AI működését valós képekkel
|
||||
4. **Elemzd a szövegérzelmeket** – Fedezd fel a természetes nyelvfeldolgozást
|
||||
|
||||
## 💡 Tippek Kezdőknek
|
||||
## 💡 Tippek kezdőknek
|
||||
|
||||
- **Olvasd el figyelmesen a kódban található megjegyzéseket** - Ezek elmagyarázzák, hogy mit csinál minden sor
|
||||
- **Kísérletezz!** - Próbálj meg értékeket módosítani, és figyeld meg, mi történik
|
||||
- **Ne aggódj, ha nem értesz mindent azonnal** - A tanulás időt vesz igénybe
|
||||
- **Tegyél fel kérdéseket** - Használd a [Vita fórumot](https://github.com/microsoft/AI-For-Beginners/discussions)
|
||||
- **Olvasd el alaposan a kód megjegyzéseit** – Elmagyarázzák, mit csinál minden sor
|
||||
- **Kísérletezz!** – Próbálj meg értékeket változtatni és figyeld meg, mi történik
|
||||
- **Ne aggódj, ha nem értesz mindent elsőre** – A tanulás időt vesz igénybe
|
||||
- **Tegyél fel kérdéseket** – Használd a [Vita fórumot](https://github.com/microsoft/AI-For-Beginners/discussions)
|
||||
|
||||
## 🔗 Következő Lépések
|
||||
## 🔗 Következő lépések
|
||||
|
||||
Miután befejezted ezeket a példákat, fedezd fel a teljes tananyagot:
|
||||
Miután elvégezted ezeket a példákat, fedezd fel a teljes tananyagot:
|
||||
- [Bevezetés az AI-ba](../lessons/1-Intro/README.md)
|
||||
- [Neurális Hálók](../lessons/3-NeuralNetworks/README.md)
|
||||
- [Számítógépes Látás](../lessons/4-ComputerVision/README.md)
|
||||
- [Természetes Nyelvfeldolgozás](../lessons/5-NLP/README.md)
|
||||
- [Neurális hálózatok](../lessons/3-NeuralNetworks/README.md)
|
||||
- [Számítógépes látás](../lessons/4-ComputerVision/README.md)
|
||||
- [Természetes nyelvfeldolgozás](../lessons/5-NLP/README.md)
|
||||
|
||||
## 🤝 Közreműködés
|
||||
## 🤝 Hozzájárulás
|
||||
|
||||
Hasznosnak találtad ezeket a példákat? Segíts nekünk javítani rajtuk:
|
||||
Hasznosnak találtad ezeket a példákat? Segíts nekünk fejleszteni őket:
|
||||
- Jelents hibákat vagy javasolj fejlesztéseket
|
||||
- Adj hozzá további példákat kezdők számára
|
||||
- Adj hozzá több példát kezdőknek
|
||||
- Fejleszd a dokumentációt és a megjegyzéseket
|
||||
|
||||
---
|
||||
|
||||
*Ne feledd: Minden szakértő egyszer kezdő volt. Jó tanulást! 🎓*
|
||||
*Emlékezz: minden szakértő egyszer kezdő volt. Jó tanulást! 🎓*
|
||||
|
||||
---
|
||||
|
||||
**Felelősség kizárása**:
|
||||
Ez a dokumentum az [Co-op Translator](https://github.com/Azure/co-op-translator) AI fordítási szolgáltatás segítségével került lefordításra. Bár törekszünk a pontosságra, kérjük, vegye figyelembe, hogy az automatikus fordítások hibákat vagy pontatlanságokat tartalmazhatnak. Az eredeti dokumentum az eredeti nyelvén tekintendő hiteles forrásnak. Kritikus információk esetén javasolt professzionális emberi fordítást igénybe venni. Nem vállalunk felelősséget az ebből a fordításból eredő félreértésekért vagy téves értelmezésekért.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**Jogi nyilatkozat**:
|
||||
Ez a dokumentum az AI fordítási szolgáltatás, a [Co-op Translator](https://github.com/Azure/co-op-translator) segítségével készült. Bár az pontosságra törekszünk, kérjük, vegye figyelembe, hogy az automatikus fordítások hibákat vagy pontatlanságokat tartalmazhatnak. Az eredeti dokumentum az anyanyelvén tekintendő hiteles forrásnak. Fontos információk esetén professzionális emberi fordítást javasolunk. Nem vállalunk felelősséget semmilyen félreértésért vagy téves értelmezésért, amely ebből a fordításból ered.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -1,12 +1,12 @@
|
|||
# Hogyan futtassuk a kódot
|
||||
|
||||
Ez a tananyag rengeteg futtatható példát és laborokat tartalmaz, amelyeket érdemes lefuttatni. Ehhez szükség van arra, hogy Python kódot tudj végrehajtani a jupyter notebookokban, amelyek a tananyag részeként elérhetőek. Több lehetőséged is van a kód futtatására:
|
||||
Ez a tanterv sok futtatható példát és laboratóriumi gyakorlatot tartalmaz, amelyeket szeretnél futtatni. Ehhez szükséged van arra, hogy képes legyél Python kódot futtatni a tananyag részeként biztosított Jupyter Notebook-okban. Több lehetőséged is van a kód futtatására:
|
||||
|
||||
## Lokálisan a saját számítógépeden
|
||||
## Lokális futtatás a számítógépeden
|
||||
|
||||
A kód lokális futtatásához Python telepítés szükséges a gépeden. Egy ajánlás a **[miniconda](https://conda.io/en/latest/miniconda.html)** telepítése – ez egy viszonylag könnyű telepítés, amely támogatja a `conda` csomagkezelőt különböző Python **virtuális környezetek** használatára.
|
||||
A kód futtatásához lokálisan Python telepítés szükséges. Egy ajánlott megoldás a **[miniconda](https://conda.io/en/latest/miniconda.html)** telepítése – ez egy viszonylag könnyű telepítés, ami támogatja a `conda` csomagkezelőt különböző Python **virtuális környezetek** kezeléséhez.
|
||||
|
||||
Miután telepítetted a minicondát, klónozd a repozitóriumot, és hozz létre egy virtuális környezetet, amelyet ezen a tanfolyamon használni fogsz:
|
||||
Miután telepítetted a minicondát, klónozd a tárolót és hozz létre egy virtuális környezetet, amit a kurzus során fogsz használni:
|
||||
|
||||
```bash
|
||||
git clone http://github.com/microsoft/ai-for-beginners
|
||||
|
|
@ -15,57 +15,57 @@ conda env create --name ai4beg --file .devcontainer/environment.yml
|
|||
conda activate ai4beg
|
||||
```
|
||||
|
||||
### Visual Studio Code használata Python kiterjesztéssel
|
||||
### Visual Studio Code használata Python bővítménnyel
|
||||
|
||||
A tananyagot a legjobban úgy használhatod, ha megnyitod [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) alkalmazásban, a [Python kiterjesztéssel](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste).
|
||||
A tananyagot legjobban úgy használhatod, ha [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste)-ban nyitod meg a projekttárat, a [Python bővítmény](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste) telepítésével.
|
||||
|
||||
> **Megjegyzés**: Miután klónoztad és megnyitottad a mappát VS Code-ban, automatikusan javasolni fogja a Python kiterjesztések telepítését. A minconda telepítését is el kell végezned a fentiek szerint.
|
||||
> **Megjegyzés**: Amint klónozod és megnyitod a könyvtárat VS Code-ban, automatikusan javasolni fogja a Python bővítmények telepítését. Emellett telepítened kell a minicondát, ahogy azt fent leírtuk.
|
||||
|
||||
> **Megjegyzés**: Ha a VS Code felajánlja, hogy egy konténerben nyissa meg újra a repozitóriumot, akkor ezt el kell utasítanod, ha a helyi Python telepítést szeretnéd használni.
|
||||
> **Megjegyzés**: Ha VS Code azt javasolja, hogy nyisd meg újra a tárolót egy konténerben, akkor ezt utasítsd el, hogy a lokális Python telepítést használd.
|
||||
|
||||
### Jupyter használata böngészőben
|
||||
### Jupyter futtatása böngészőben
|
||||
|
||||
Használhatsz Jupyter környezetet is a böngészőből a saját számítógépeden. Mind a klasszikus Jupyter, mind a JupyterHub kényelmes fejlesztői környezetet nyújt automatikus kiegészítéssel, kódkiemeléssel stb.
|
||||
Használhatsz Jupytert is a böngészőben a saját számítógépeden. Mind az alap Jupyter, mind a JupyterHub kényelmes fejlesztői környezetet biztosít automatikus kiegészítéssel, kódkijelöléssel stb.
|
||||
|
||||
A Jupyter lokális elindításához menj a tananyag könyvtárába, és futtasd:
|
||||
A helyi Jupyter indításához lépj a kurzus könyvtárába, és futtasd:
|
||||
|
||||
```bash
|
||||
jupyter notebook
|
||||
```
|
||||
vagy
|
||||
vagy
|
||||
```bash
|
||||
jupyterhub
|
||||
```
|
||||
Ezután tetszőleges `.ipynb` fájlra navigálhatsz, megnyithatod azokat és elkezdhetsz dolgozni.
|
||||
Ezután bármely `.ipynb` fájlra navigálhatsz, megnyithatod és elkezdhetsz dolgozni.
|
||||
|
||||
### Konténerben futtatás
|
||||
### Konténerben való futtatás
|
||||
|
||||
A Python telepítés alternatívája lehet, hogy a kódot egy konténerben futtatod. Mivel a repozitórium tartalmaz egy speciális `.devcontainer` mappát, amely útmutatást ad egy konténer felépítéséhez, a VS Code lehetőséget nyújt arra, hogy a kódot konténerben nyisd meg újra. Ehhez Docker telepítés szükséges, és bonyolultabb is, ezért ezt inkább haladóbb felhasználóknak ajánljuk.
|
||||
Egy alternatíva a Python telepítés helyett, ha a kódot konténerben futtatod. Mivel a tárolónk tartalmaz egy speciális `.devcontainer` mappát, ami leírja, hogyan építhető fel a konténer, a VS Code kínál lehetőséget a kód konténerben való újranyitására. Ehhez Docker telepítés szükséges, és technikailag bonyolultabb, így ezt tapasztaltabb felhasználóknak ajánljuk.
|
||||
|
||||
## Felhőben futtatás
|
||||
## Futtatás a felhőben
|
||||
|
||||
Ha nem szeretnéd helyben telepíteni a Pythont, és van hozzáférésed valamilyen felhő erőforráshoz – akkor jó alternatíva a kód futtatása a felhőben. Többféleképpen is megteheted ezt:
|
||||
Ha nem szeretnél helyileg Python-t telepíteni, és vannak felhő erőforrásaid, jó alternatíva a kód futtatása a felhőben. Több módja van ennek:
|
||||
|
||||
* Használhatod a **[GitHub Codespaces](https://github.com/features/codespaces)** szolgáltatást, amely egy virtuális környezet a GitHub-on, a VS Code böngészős felületén keresztül elérhető. Ha hozzáférsz Codespaces-hez, csak kattints a **Code** gombra a repóban, indíts el egy codespace-et és pillanatok alatt futtathatod a kódot.
|
||||
* Használhatod a **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)** szolgáltatást. A [Binder](https://mybinder.org) ingyenes számítási erőforrásokat biztosít a felhőben, hogy kipróbálhass kódokat a GitHub-ról. Van egy gomb a főoldalon, amely megnyitja a repót Binder-ben – ez gyorsan átvezet a Binder oldalra, amely felépíti a háttérben a konténert és elindít egy Jupyter webes felületet zökkenőmentesen.
|
||||
* Használhatod a **[GitHub Codespaces](https://github.com/features/codespaces)** szolgáltatást, amely egy virtuális környezet, amit a GitHub hoz létre számodra, és amit egy VS Code böngésző felületén keresztül érhetsz el. Ha hozzáférsz a Codespaces-hez, csak kattints a **Code** gombra a tárolóban, indíts el egy codespace-et, és máris futtathatod a kódot.
|
||||
* Használhatod a **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)** szolgáltatást is. A [Binder](https://mybinder.org) ingyenes felhő alapú számítási erőforrásokat biztosít, hogy GitHub kódokat kipróbálhass. Az oldal kezdőlapján van gomb a tároló megnyitására Binder-ben – ez gyorsan átvezet a binder oldalra, amely felépít egy mögöttes konténert és zökkenőmentesen elindít egy Jupyter webes felületet.
|
||||
|
||||
> **Megjegyzés**: A visszaélések elkerülése érdekében Binder korlátozott hozzáféréssel rendelkezik bizonyos webes erőforrásokhoz. Ez megakadályozhat bizonyos kódok működését, amelyek modelleket és/vagy adatállományokat töltenek le a nyilvános internetről. Lehet, hogy megoldásokat kell keresned. Emellett a Binder által nyújtott számítási erőforrások alapvetőek, így az edzések lassúak lesznek, főleg a későbbi, összetettebb leckék esetén.
|
||||
> **Megjegyzés**: A Binder biztonsági okokból bizonyos webes forrásokhoz nem enged hozzáférést. Ez megakadályozhatja, hogy néhány kód működjön, amely modelleket és/vagy adatállományokat tölt le a nyilvános internetről. Lehet, hogy kerülő megoldásokat kell találnod. Emellett a Binder által biztosított számítási erőforrások meglehetősen alap szintűek, így az edzések lassúak lesznek, különösen a későbbi, összetettebb leckékben.
|
||||
|
||||
## Felhőben való futtatás GPU-val
|
||||
## Futtatás a felhőben GPU-val
|
||||
|
||||
A tananyag egyes későbbi leckéi nagyon profitálhatnak GPU támogatásból. Például a modell betanítása máskülönben fájdalmasan lassú lehet. Több lehetőség közül választhatsz, főleg ha hozzáférsz a felhőhöz az [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) segítségével, vagy az intézményeden keresztül:
|
||||
A tananyag későbbi leckéi nagyban profitálnak a GPU támogatásból. Például a modell edzés máskülönben nagyon lassú lehet. Több lehetőséged is van, különösen ha van hozzáférésed a felhőhöz a [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) vagy az intézményed révén:
|
||||
|
||||
* Hozz létre egy [Data Science Virtual Machine](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) virtuális gépet, és csatlakozz hozzá Jupyter segítségével. Ezt követően klónozhatod a repozitóriumot közvetlenül a gépre, és elkezdheted a tanulást. Az NC-sorozatú VM-ek támogatják a GPU-t.
|
||||
* Hozz létre [Data Science Virtual Machine](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste)-t, és csatlakozz hozzá Jupyteren keresztül. Ekkor közvetlenül a gépre klónozhatod a tárolót és elkezdheted a tanulást. Az NC-sorozatú VM-ek támogatják a GPU-t.
|
||||
|
||||
> **Megjegyzés**: Egyes előfizetések, köztük az Azure for Students sem tartalmaznak GPU támogatást alapból. Ekkor további GPU magokat technikai támogatási kérelmen keresztül kell kérned.
|
||||
> **Megjegyzés**: Egyes előfizetések, így az Azure for Students sem biztosít alapból GPU támogatást. Elképzelhető, hogy technikai támogatási kéréssel kell további GPU magokat igényelned.
|
||||
|
||||
* Hozz létre egy [Azure Machine Learning Workspace-et](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste), majd használd a Notebook funkciót ott. [Ez a videó](https://azure-for-academics.github.io/quickstart/azureml-papers/) bemutatja, hogyan klónozz egy repót az Azure ML notebookba, és hogyan kezd el használni.
|
||||
* Hozz létre egy [Azure Machine Learning Workspace](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste)-et, és használd ott a Notebook funkciót. [Ez a videó](https://azure-for-academics.github.io/quickstart/azureml-papers/) bemutatja, hogyan lehet egy tárolót Azure ML notebook-ba klónozni és használni.
|
||||
|
||||
Használhatod a Google Colab-ot is, amely ingyenes GPU támogatással rendelkezik, és feltöltheted oda a Jupyter Notebookokat, hogy egyenként végrehajtsd őket.
|
||||
Használhatod a Google Colabot is, amely bizonyos ingyenes GPU támogatással rendelkezik, és egyesével töltheted fel és futtathatod benne a Jupyter Notebook-okat.
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**Jogi nyilatkozat**:
|
||||
Ez a dokumentum az AI fordító szolgáltatás [Co-op Translator](https://github.com/Azure/co-op-translator) segítségével készült. Bár az pontosságra törekszünk, kérjük, vegye figyelembe, hogy az automatikus fordítások tartalmazhatnak hibákat vagy pontatlanságokat. Az eredeti, anyanyelvi dokumentum tekintendő az illetékes forrásnak. Kritikus információk esetén professzionális, emberi fordítást javaslunk. Nem vállalunk felelősséget semmilyen félreértésért vagy téves értelmezésért, amely ebből a fordításból ered.
|
||||
Ez a dokumentum az AI fordítási szolgáltatás, a [Co-op Translator](https://github.com/Azure/co-op-translator) segítségével készült. Bár az pontosságra törekszünk, kérjük, vegye figyelembe, hogy az automatikus fordítások hibákat vagy pontatlanságokat tartalmazhatnak. Az eredeti dokumentum az anyanyelvén tekintendő hiteles forrásnak. Fontos információk esetén professzionális emberi fordítást javasolunk. Nem vállalunk felelősséget semmilyen félreértésért vagy téves értelmezésért, amely ebből a fordításból ered.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -4,11 +4,11 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Előre betanított modellek és transzfer tanulás\n",
|
||||
"# Előre betanított modellek és átvitel alapú tanulás\n",
|
||||
"\n",
|
||||
"A CNN-ek tanítása sok időt vehet igénybe, és ehhez nagy mennyiségű adat szükséges. Azonban az idő nagy részét azzal töltjük, hogy megtanuljuk azokat az alacsony szintű szűrőket, amelyeket a hálózat használ a minták kinyerésére a képekből. Felmerül egy természetes kérdés - használhatunk-e egy olyan neurális hálózatot, amelyet már egy adott adathalmazon betanítottak, és adaptálhatjuk-e különböző képek osztályozására anélkül, hogy teljes tanítási folyamatot végeznénk?\n",
|
||||
"A CNN-ek betanítása sok időt vehet igénybe, és ehhez rengeteg adat szükséges. Az idő nagy részét azonban arra fordítjuk, hogy megtanuljuk azokat a legjobb alacsony szintű szűrőket, amelyeket a hálózat a képekből minták kinyerésére használ. Felmerül a kérdés – használhatunk-e egy egyik adatbázison betanított neurális hálózatot úgy, hogy azt más képek osztályozására adaptáljuk teljes betanítási folyamat nélkül?\n",
|
||||
"\n",
|
||||
"Ezt a megközelítést **transzfer tanulásnak** nevezzük, mivel bizonyos tudást átviszünk az egyik neurális hálózati modellből a másikba. A transzfer tanulás során általában egy előre betanított modellel kezdünk, amelyet már valamilyen nagy képadathalmazon, például az **ImageNet**-en tanítottak. Ezek a modellek már képesek különböző jellemzők kinyerésére általános képekből, és sok esetben elegendő egy osztályozót építeni ezekre a kinyert jellemzőkre, hogy jó eredményt érjünk el.\n"
|
||||
"Ezt a megközelítést **átvitel alapú tanulásnak** nevezzük, mert valamennyi tudást továbbítunk az egyik neurális hálózati modellről a másikra. Átvitel alapú tanulás során általában egy előre betanított modellt használunk, amelyet egy nagy képadatbázison, például az **ImageNet**-en tanítottak. Ezek a modellek már jól képesek különböző jellemzőket kinyerni általános képekből, és sok esetben elegendő, ha erre a kinyert jellemzőkre egy osztályozót építünk, hogy jó eredményt érjünk el.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -29,11 +29,11 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Macskák vs. Kutyák Adathalmaz\n",
|
||||
"## Macskák vs. Kutyák Adatkészlet\n",
|
||||
"\n",
|
||||
"Ebben az egységben egy valós problémát fogunk megoldani: macskák és kutyák képeinek osztályozását. Ehhez a [Kaggle Cats vs. Dogs Dataset](https://www.kaggle.com/c/dogs-vs-cats) adathalmazt fogjuk használni, amely letölthető [a Microsofttól is](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n",
|
||||
"Ebben az egységben egy valós problémát oldunk meg, macskák és kutyák képeinek osztályozását. Ehhez a [Kaggle Cats vs. Dogs Dataset](https://www.kaggle.com/c/dogs-vs-cats) adatkészletet fogjuk használni, amely letölthető [a Microsofttól is](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n",
|
||||
"\n",
|
||||
"Töltsük le ezt az adathalmazt, és csomagoljuk ki a `data` könyvtárba (ez a folyamat eltarthat egy ideig!):\n"
|
||||
"Töltsük le ezt az adatkészletet, és csomagoljuk ki a `data` könyvtárba (ez a folyamat eltarthat egy ideig!):\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -64,7 +64,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Sajnos a datasetben van néhány sérült képfájl. Gyors tisztítást kell végeznünk, hogy ellenőrizzük a sérült fájlokat. Annak érdekében, hogy ne zavarjuk meg ezt az oktatóanyagot, a dataset ellenőrzésére szolgáló kódot egy modulba helyeztük át.\n"
|
||||
"Sajnos vannak sérült képállományok az adathalmazban. Gyors tisztítást kell végeznünk a sérült fájlok ellenőrzésére. Annak érdekében, hogy ez a bemutató ne sérüljön, a kódrészletet, amely az adathalmaz ellenőrzését végzi, egy modulba helyeztük át.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -333,13 +333,13 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## A dataset betöltése\n",
|
||||
"## Az adathalmaz betöltése\n",
|
||||
"\n",
|
||||
"Korábbi példákban olyan dataseteket töltöttünk be, amelyek beépítve vannak a Kerasba. Most viszont a saját datasetünkkel fogunk dolgozni, amelyet egy képekből álló könyvtárból kell betöltenünk.\n",
|
||||
"Az előző példákban beépített Keras adathalmazokat töltöttünk be. Most pedig a saját adathalmazunkkal foglalkozunk, amelyet egy képeket tartalmazó könyvtárból kell betöltenünk.\n",
|
||||
"\n",
|
||||
"A valóságban a képdatasetek mérete elég nagy lehet, és nem lehet arra hagyatkozni, hogy az összes adat elfér a memóriában. Ezért a dataseteket gyakran **generátorokként** ábrázolják, amelyek minibatch-ekben tudják visszaadni az adatokat, így alkalmasak a tanításra.\n",
|
||||
"A valós életben a képadathalmazok mérete meglehetősen nagy lehet, és nem lehet arra hagyatkozni, hogy az összes adat memóriában elférjen. Ezért az adathalmazokat gyakran **generátorokként** ábrázolják, amelyek tanításhoz alkalmas minibatch-ekben adják vissza az adatot.\n",
|
||||
"\n",
|
||||
"A képosztályozás kezeléséhez a Keras tartalmaz egy speciális `image_dataset_from_directory` függvényt, amely képes betölteni képeket az egyes osztályoknak megfelelő alkönyvtárakból. Ez a függvény gondoskodik a képek skálázásáról, és képes a datasetet train és test részekre osztani:\n"
|
||||
"Az képosztályozás kezeléséhez a Keras tartalmaz egy speciális `image_dataset_from_directory` függvényt, amely a különböző osztályoknak megfelelő alkönyvtárakból tud képeket betölteni. Ez a függvény gondoskodik a képek átméretezéséről is, és az adathalmazt fel tudja osztani tanító és teszt részhalmazokra is:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -383,9 +383,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Fontos, hogy mindkét hívásnál ugyanazt a `seed` értéket állítsd be, mivel ez befolyásolja a képek elosztását a tanító és teszt adathalmaz között.\n",
|
||||
"Fontos, hogy mindkét hívásnál ugyanazt a `seed` értéket állítsuk be, mert ez befolyásolja a képek megosztását a tanító és teszt adathalmaz között.\n",
|
||||
"\n",
|
||||
"Az adathalmaz automatikusan felismeri az osztályneveket a könyvtárakból, és szükség esetén elérheted őket a következő hívással:\n"
|
||||
"Az adathalmaz automatikusan veszi az osztályneveket a könyvtárakból, és szükség esetén elérhetőek a következő hívással:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -412,7 +412,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Az adatokat, amelyeket megszereztünk, közvetlenül átadhatjuk a `fit` függvénynek a modell betanításához. Ezek tartalmazzák a megfelelő képeket és címkéket, amelyeken a következő konstrukcióval lehet végigiterálni:\n"
|
||||
"A megszerzett adatállományokat közvetlenül át lehet adni a `fit` függvénynek a modell betanításához. Ezek tartalmazzák a megfelelő képeket és címkéket is, amelyeken a következő szerkezet használatával lehet végigiterálni:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -453,7 +453,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"> **Megjegyzés**: Az adathalmazban található összes kép lebegőpontos tenzorként van ábrázolva, 0-255 tartományban. Mielőtt átadnánk őket a neurális hálózatnak, ezeket az értékeket 0-1 tartományba kell skálázni. Képek megjelenítésekor ugyanezt kell tennünk, vagy az értékeket `int` típusra kell konvertálnunk (ahogy a fenti kódban tesszük), hogy jelezzük a `matplotlib` számára, hogy az eredeti, nem skálázott képet szeretnénk megjeleníteni.\n"
|
||||
"> **Megjegyzés**: Az adathalmazban található összes kép lebegőpontos tenzorokként van ábrázolva 0-255 tartományban. Mielőtt átadnánk őket a neurális hálózatnak, ezeket az értékeket 0-1 tartományra kell skálázni. Képek megjelenítésekor ugyanezt kell tennünk, vagy az értékeket `int` típusra kell konvertálnunk (ahogy a fenti kódban is tesszük), hogy a `matplotlib` számára jelezzük, hogy az eredeti, nem skálázott képet szeretnénk megjeleníteni.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -462,7 +462,7 @@
|
|||
"source": [
|
||||
"## Előre betanított modellek\n",
|
||||
"\n",
|
||||
"Számos képosztályozási feladathoz találhatók előre betanított neurális hálózati modellek. Ezek közül sok elérhető a `keras.applications` névtérben, és még több modell található az interneten. Nézzük meg, hogyan tölthető be és használható a legegyszerűbb VGG-16 modell:\n"
|
||||
"Sok képosztályozási feladathoz találhatók előre betanított neurális hálózati modellek. Ezek közül sok megtalálható a `keras.applications` névtérben, és még több modell található az interneten. Nézzük meg, hogyan lehet a legegyszerűbb VGG-16 modellt betölteni és használni:\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": [
|
||||
"Van néhány fontos dolog, amit itt érdemes megjegyezni:\n",
|
||||
"* Mielőtt bármilyen előre betanított hálózat bemenetet kapna, azt egy bizonyos módon elő kell dolgozni. Ezt a megfelelő `preprocess_input` függvény meghívásával végezzük el, amely egy képcsomagot kap bemenetként, és visszaadja azok feldolgozott formáját. A VGG-16 esetében a képek normalizálva vannak, és minden csatornához egy előre meghatározott átlagérték kerül levonásra. Ennek az az oka, hogy a VGG-16 eredetileg ezzel az előfeldolgozással lett betanítva.\n",
|
||||
"* Az ideghálózatot alkalmazzuk a bemeneti csomagra, és eredményként kapunk egy 1000 elemű tenzorcsomagot, amely az egyes osztályok valószínűségét mutatja. A legvalószínűbb osztály számát az `argmax` függvény meghívásával találhatjuk meg ezen a tenzoron.\n",
|
||||
"* A kapott eredmény egy [`ImageNet` osztály száma](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Ennek az eredménynek az értelmezéséhez használhatjuk a `decode_predictions` függvényt is, amely visszaadja a legvalószínűbb n osztályt a nevükkel együtt.\n"
|
||||
"Itt van néhány fontos dolog:\n",
|
||||
"* Bármely előre betanított hálózat bemenetként való használata előtt az adatoknak egy bizonyos módon elő kell készülniük. Ezt a hozzá tartozó `preprocess_input` függvény hívásával végzik, amely képek egy csomagját kapja, és visszaadja azok feldolgozott formáját. A VGG-16 esetében a képeket normalizálják, és minden csatornához előre meghatározott átlagértéket vonnak ki. Ennek oka, hogy a VGG-16 eredetileg ezzel az előkészítéssel lett betanítva.\n",
|
||||
"* A neurális hálózatot alkalmazzák a bemeneti csomagra, és az eredményként egy 1000 elemből álló tenzorcsoportot kapunk, amely megmutatja az egyes osztályok valószínűségét. A legvalószínűbb osztály számát a tenzoron `argmax` függvény hívásával találhatjuk meg.\n",
|
||||
"* A kapott eredmény egy [egy `ImageNet` osztály száma](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Ennek az eredménynek az értelmezéséhez használhatjuk a `decode_predictions` függvényt is, amely visszaadja a legjobb n osztályt a nevükkel együtt.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -599,7 +609,7 @@
|
|||
"source": [
|
||||
"## GPU számítások\n",
|
||||
"\n",
|
||||
"A mély neurális hálózatok, mint például a VGG-16 és más, modernebb architektúrák, jelentős számítási kapacitást igényelnek a futtatáshoz. Érdemes GPU-gyorsítást használni, ha elérhető. Szerencsére a Keras automatikusan felgyorsítja a számításokat a GPU-n, ha az rendelkezésre áll. Az alábbi kóddal ellenőrizhetjük, hogy a Tensorflow képes-e használni a GPU-t:\n"
|
||||
"Mély neurális hálózatok, mint például a VGG-16 és más, modernebb architektúrák futtatásához elég sok számítási kapacitás szükséges. Érdemes használni a GPU gyorsítást, ha elérhető. Szerencsére a Keras automatikusan felgyorsítja a számításokat a GPU-n, ha az rendelkezésre áll. Ellenőrizhetjük, hogy a Tensorflow képes-e GPU-t használni az alábbi kód segítségével:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -626,9 +636,10 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n",
|
||||
"## VGG jellemzők kinyerése\n",
|
||||
"\n",
|
||||
"Ha a VGG-16 modellt szeretnénk használni képeink jellemzőinek kinyerésére, akkor a végső osztályozó rétegek nélküli modellre van szükségünk. A VGG-16 modellt a felső rétegek nélkül az alábbi kóddal hozhatjuk létre:\n"
|
||||
"Ha a VGG-16-ot szeretnénk használni képeink jellemzőinek kinyerésére, akkor az utolsó osztályozó rétegek nélküli modellre van szükségünk. A VGG-16 modellt a felső rétegek nélkül a következő kóddal példányosíthatjuk:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -680,9 +691,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"A jellemző tensor dimenziója 7x7x512, de ahhoz, hogy vizualizálni tudjuk, 2D formára kellett átalakítanunk.\n",
|
||||
"A jellemzőtenzor dimenziója 7x7x512, de annak megjelenítéséhez 2D formára kellett alakítanunk.\n",
|
||||
"\n",
|
||||
"Most nézzük meg, hogy ezek a jellemzők használhatók-e képek osztályozására. Vegyünk manuálisan néhány képet (esetünkben 50 minibatch-et), és előre számítsuk ki a jellemző vektoraikat. Ehhez használhatjuk a Tensorflow **dataset** API-t. A `map` függvény egy datasetet vesz, és egy megadott lambda-függvényt alkalmazva átalakítja azt. Ezt a mechanizmust használjuk új datasetek létrehozására, `ds_features_train` és `ds_features_test`, amelyek az eredeti képek helyett VGG által kinyert jellemzőket tartalmaznak.\n"
|
||||
"Most próbáljuk meg megnézni, hogy ezeket a jellemzőket fel lehet-e használni képosztályozásra. Vegyünk manuálisan néhány képrészletet (esetünkben 50 minibatch-et), és előre számítsuk ki a jellemzővektorokat. Ehhez használhatjuk a Tensorflow **dataset** API-ját. A `map` függvény egy adatbázist vesz át, és alkalmaz rá egy adott lambda-függvényt, hogy átalakítsa azt. Ezzel a mechanizmussal új adatbázisokat, a `ds_features_train` és `ds_features_test` adatbázisokat hozunk létre, amelyek az eredeti képek helyett VGG-vel kinyert jellemzőket tartalmaznak.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -712,9 +723,9 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"A `.take(50)` konstrukciót használtuk az adathalmaz méretének korlátozására, hogy felgyorsítsuk a bemutatót. Természetesen ezt a kísérletet a teljes adathalmazon is elvégezheted.\n",
|
||||
"A nagyítás további lépéseinek felgyorsítása érdekében az adathalmaz méretét a `.take(50)` használatával korlátoztuk. Természetesen ezt a kísérletet az egész adathalmazon is elvégezheti.\n",
|
||||
"\n",
|
||||
"Most, hogy van egy adathalmazunk kinyert jellemzőkkel, betaníthatunk egy egyszerű sűrű osztályozót, amely megkülönbözteti a macskákat és a kutyákat. Ez a hálózat egy (7,7,512) alakú jellemzővektort fogad bemenetként, és egy kimenetet állít elő, amely vagy egy kutyának, vagy egy macskának felel meg. Mivel ez egy bináris osztályozási feladat, a `sigmoid` aktivációs függvényt és a `binary_crossentropy` veszteségfüggvényt használjuk.\n"
|
||||
"Most, hogy van egy olyan adathalmazunk, amelyből kinyertük a jellemzőket, betaníthatunk egy egyszerű denz osztályozót, amely képes megkülönböztetni a macskákat és a kutyákat. Ez a hálózat (7,7,512) alakú jellemzővektort fogad bemenetként, és egy kimenetet ad, amely vagy kutyát, vagy macskát jelöl. Mivel bináris osztályozásról van szó, `sigmoid` aktivációs függvényt és `binary_crossentropy` veszteségfüggvényt használunk.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -743,13 +754,13 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Az eredmény nagyszerű, szinte 95%-os valószínűséggel meg tudjuk különböztetni a macskát a kutyától! Azonban ezt a megközelítést csak az összes kép egy részhalmazán teszteltük, mivel a manuális jellemzők kinyerése nagyon időigényesnek bizonyult.\n",
|
||||
"Az eredmény nagyszerű, több mint 95% valószínűséggel meg tudjuk különböztetni a macskát és a kutyát! Azonban ezt a megközelítést eddig csak a képek egy részhalmazán teszteltük, mert a manuális jellemzőkinyerés nagyon időigényesnek tűnik.\n",
|
||||
"\n",
|
||||
"## Transzfer tanulás egy VGG hálózat használatával\n",
|
||||
"## Átviteli tanulás egy VGG hálózat használatával\n",
|
||||
"\n",
|
||||
"Elkerülhetjük a jellemzők manuális előzetes kiszámítását az eredeti VGG-16 hálózat teljes használatával a tanítás során, ha a hálózatunkhoz egy jellemzők kinyerő réteget adunk első rétegként.\n",
|
||||
"Elkerülhetjük a jellemzők manuális előszámítását is azáltal, hogy az eredeti VGG-16 hálózatot egészében használjuk az edzés során, és a jellemzőkinyerőt az első rétegként adjuk hozzá a hálózatunkhoz.\n",
|
||||
"\n",
|
||||
"A Keras architektúra szépsége abban rejlik, hogy az általunk fentebb definiált VGG-16 modell egy másik neurális hálózat rétegeként is használható! Csak egy hálózatot kell felépítenünk, amelynek tetején egy sűrű osztályozó található, majd az egész hálózatot visszacsatolásos tanítással kell betanítanunk.\n"
|
||||
"A Keras architektúra szépsége, hogy a fent definiált VGG-16 modellt egy másik neurális hálózatban is rétegként használhatjuk! Csak annyit kell tennünk, hogy egy sűrű osztályozóval építünk rá a hálózatra, majd az egész hálózatot visszaterjesztéssel tanítjuk.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -793,13 +804,13 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Ez a modell egy végponttól végpontig tartó osztályozó hálózatként működik, amely egy képet vesz bemenetként, és visszaadja az osztályt. Azonban a trükkös rész az, hogy azt szeretnénk, ha a VGG16 funkciókinyerőként működne, és ne legyen újratanítva. Ezért szükséges, hogy **a konvolúciós funkciókinyerő súlyait befagyasszuk**. A hálózat első rétegéhez a `model.layers[0]` hívással férhetünk hozzá, és csak annyit kell tennünk, hogy a `trainable` tulajdonságot `False` értékre állítjuk.\n",
|
||||
"Ez a modell egy végponttól végpontig tartó osztályozó hálózatra hasonlít, amely egy képet vesz be, és visszaadja az osztályt. Azonban a trükk az, hogy a VGG16-ot jellemzők kinyerőjeként szeretnénk használni, és nem újra tanítani. Így **meg kell fagytatnunk a konvolúciós jellemzőkinyerő súlyait**. A hálózat első rétegéhez a `model.layers[0]` hívásával férünk hozzá, és csak a `trainable` tulajdonságot kell `False`-ra állítanunk.\n",
|
||||
"\n",
|
||||
"> **Megjegyzés**: A funkciókinyerő súlyainak befagyasztása azért szükséges, mert különben a nem tanított osztályozó réteg tönkreteheti a konvolúciós kinyerő eredeti, előre betanított súlyait.\n",
|
||||
"> **Megjegyzés**: A jellemzőkinyerő súlyainak lefagyasztása azért szükséges, mert különben a nem betanított osztályozó réteg tönkreteheti az eredeti, előre betanított konvolúciós súlyokat.\n",
|
||||
"\n",
|
||||
"Észreveheted, hogy bár a hálózatunkban a paraméterek teljes száma körülbelül 15 millió, valójában csak 25 ezer paramétert tanítunk. Az összes többi, felső szintű konvolúciós szűrőhöz tartozó paraméter előre betanított. Ez jó, mert így kisebb számú paramétert tudunk finomhangolni kevesebb példával.\n",
|
||||
"Megfigyelhető, hogy míg a hálózatunkban az összes paraméter száma körülbelül 15 millió, csak 25 ezer paramétert tanítunk. Az összes többi, felső szintű konvolúciós szűrő előre betanított. Ez jó, mert kevesebb paramétert tudunk finomhangolni kevesebb példával.\n",
|
||||
"\n",
|
||||
"Most betanítjuk a hálózatunkat, és megnézzük, milyen jó eredményt érhetünk el. Számíts hosszabb futási időre, és ne aggódj, ha a végrehajtás egy ideig lefagyottnak tűnik.\n"
|
||||
"Most betanítjuk a hálózatot, és megnézzük, milyen jó eredményt érhetünk el. Számítsunk viszonylag hosszú futási időre, és ne aggódjunk, ha a végrehajtás egy időre megfagy.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -824,11 +835,11 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Úgy tűnik, hogy sikerült egy meglehetősen pontos macskák vs. kutyák osztályozót létrehoznunk!\n",
|
||||
"Úgy tűnik, hogy egy meglehetősen pontos macskák vs. kutyák osztályozót szereztünk! \n",
|
||||
"\n",
|
||||
"## A modell mentése és betöltése\n",
|
||||
"\n",
|
||||
"Miután betanítottuk a modellt, elmenthetjük a modell architektúráját és a betanított súlyokat egy fájlba, hogy később is használhassuk:\n"
|
||||
"Miután betanítottuk a modellt, elmenthetjük a modell architektúráját és a betanított súlyokat egy fájlba a későbbi használathoz:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -852,7 +863,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"A modellt bármikor betölthetjük a fájlból. Hasznosnak találhatod, ha a következő kísérlet tönkreteszi a modellt - így nem kellene újrakezdened az elejéről.\n"
|
||||
"Ezután bármikor betölthetjük a modellt fájlból. Hasznos lehet, ha a következő kísérlet tönkreteszi a modellt – így nem kell újrakezdeni az egészet az elejéről.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -868,15 +879,15 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Finomhangolás transzfer tanulással\n",
|
||||
"## Finomhangolás transfer tanulással\n",
|
||||
"\n",
|
||||
"Az előző részben a végső osztályozó réteget képeztük ki, hogy képeket osztályozzon a saját adatállományunkban. Azonban nem képeztük újra a jellemzők kinyeréséért felelős réteget, így a modell az ImageNet adatokon tanult jellemzőkre támaszkodott. Ha az objektumok vizuálisan eltérnek a szokásos ImageNet képektől, ez a jellemzőkombináció nem biztos, hogy a legjobban működik. Ezért érdemes elkezdeni a konvolúciós rétegek tanítását is.\n",
|
||||
"Az előző szakaszban az utolsó osztályozó réteget tanítottuk be saját adatbázisunk képeinek osztályozására. Azonban a jellemzőkivonót nem tanítottuk újra, és a modellünk az ImageNet adatokon tanult jellemzőkre támaszkodott. Ha az objektumaid vizuálisan eltérnek a szokásos ImageNet képektől, akkor ez a jellemzőkombináció nem biztos, hogy a legjobban működik. Ezért érdemes elkezdeni a konvolúciós rétegek tanítását is.\n",
|
||||
"\n",
|
||||
"Ehhez feloldhatjuk a korábban befagyasztott konvolúciós szűrő paramétereket.\n",
|
||||
"Ehhez fel kell oldanunk a korábban lefagyasztott konvolúciós szűrő paramétereket.\n",
|
||||
"\n",
|
||||
"> **Note:** Fontos, hogy először fagyassza be a paramétereket, és végezzen el néhány tanítási epochot, hogy stabilizálja a súlyokat az osztályozó rétegben. Ha azonnal elkezdi az end-to-end hálózat tanítását feloldott paraméterekkel, nagy hibák valószínűleg tönkreteszik a konvolúciós rétegek előre betanított súlyait.\n",
|
||||
"> **Megjegyzés:** Fontos, hogy először lefagyaszd a paramétereket, és néhány epizódnyi tanítást végezz, hogy stabilizáld a súlyokat az osztályozó rétegben. Ha azonnal elkezdenéd az egész hálózat végponttól való tanítását lefagyasztás nélküli paraméterekkel, akkor nagy hibák valószínűleg tönkretennék a konvolúciós rétegek előzetesen tanult súlyait.\n",
|
||||
"\n",
|
||||
"A konvolúciós VGG-16 modellünk az első rétegben található, és önmagában is sok rétegből áll. Megnézhetjük a szerkezetét:\n"
|
||||
"A konvolúciós VGG-16 modellünk az első rétegen belül található, és sok rétegből áll. Nézzük meg a szerkezetét:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -945,7 +956,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Feloldhatjuk a konvolúciós alap összes rétegének zárolását:\n"
|
||||
"Feloldhatjuk a konvolúciós alapréteg összes rétegének lefagyasztását:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -961,7 +972,7 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Azonban nem a legjobb ötlet mindet egyszerre feloldani. Először csak néhány utolsó konvolúciós réteget oldhatunk fel, mivel ezek magasabb szintű mintázatokat tartalmaznak, amelyek relevánsak a képeink számára. Például kezdetben feloldhatjuk az összes réteget, kivéve az utolsó 4-et:\n"
|
||||
"Azonban mindegyiket egyszerre feloldani nem a legjobb ötlet. Először csak néhány utolsó konvolúciós réteget oldhatunk fel, mert ezek magasabb szintű mintázatokat tartalmaznak, amelyek relevánsak a képeink számára. Például kezdetben lefagyaszthatjuk az összes réteget az utolsó 4 kivételével: \n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1000,11 +1011,11 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Figyeljük meg, hogy a tanítható paraméterek száma jelentősen megnőtt, de még mindig az összes paraméter körülbelül 50%-át teszi ki.\n",
|
||||
"Figyeljük meg, hogy a tanulható paraméterek száma jelentősen megnőtt, de még mindig az összes paraméter körülbelül 50%-át teszi ki.\n",
|
||||
"\n",
|
||||
"A rétegek feloldása után végezhetünk még néhány tanítási epoch-ot (példánkban csak egyet fogunk végezni). Választhatunk alacsonyabb tanulási rátát is, hogy minimalizáljuk az előre betanított súlyokra gyakorolt hatást. Azonban még alacsony tanulási ráta mellett is számíthatunk arra, hogy a pontosság a tanítás elején csökkenni fog, mielőtt végül kissé magasabb szintet érne el, mint a rögzített súlyok esetében.\n",
|
||||
"A feloldás után néhány további epochot végezhetünk a tanítással (a példánkban csak egyet fogunk csinálni). Alacsonyabb tanulási sebességet is választhat, hogy minimalizálja a hatást az előre betanított súlyokra. Azonban még alacsony tanulási sebességgel is számíthat arra, hogy a pontosság a tanítás kezdetén csökkenni fog, amíg végül egy kicsit magasabb szintre nem ér, mint a rögzített súlyok esetén.\n",
|
||||
"\n",
|
||||
"> **Megjegyzés:** Ez a tanítás sokkal lassabban zajlik, mivel a grádienseket vissza kell vezetnünk a hálózat számos rétegén keresztül!\n"
|
||||
"> **Megjegyzés:** Ez a tanítás sokkal lassabb, mert a gradienseket vissza kell juttatni a hálózat számos rétegén keresztül!\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1028,18 +1039,18 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Valószínűleg magasabb tanítási pontosságot érünk el, mivel egy erősebb hálózatot használunk több paraméterrel, de a validációs pontosság nem fog annyira növekedni.\n",
|
||||
"Valószínűleg magasabb tanítási pontosságot érünk el, mert erősebb hálózatot használunk több paraméterrel, de a validációs pontosság nem fog ilyen mértékben növekedni.\n",
|
||||
"\n",
|
||||
"Nyugodtan oldj fel néhány további réteget a hálózatban, és tanítsd tovább, hogy megnézd, el tudsz-e érni magasabb pontosságot!\n"
|
||||
"Nyugodtan oldj fel még néhány réteget a hálózatban és taníts tovább, hogy megnézd, képes vagy-e magasabb pontosságot elérni!\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Egyéb számítógépes látásmodellek\n",
|
||||
"## Egyéb számítógépes látás modellek\n",
|
||||
"\n",
|
||||
"A VGG-16 az egyik legegyszerűbb számítógépes látásarchitektúra. A Keras számos más előre betanított hálózatot is kínál. Ezek közül a leggyakrabban használtak a **ResNet** architektúrák, amelyeket a Microsoft fejlesztett, valamint a Google által készített **Inception**. Például nézzük meg a legegyszerűbb ResNet-50 modell architektúráját (a ResNet egy modellekből álló család különböző mélységekkel, kipróbálhatod a ResNet-152-t, ha szeretnéd látni, hogy néz ki egy igazán mély modell):\n"
|
||||
"A VGG-16 az egyik legegyszerűbb számítógépes látás architektúra. A Keras sok más előre betanított hálózatot is biztosít. A leggyakrabban használtak közülük a Microsoft által fejlesztett **ResNet** architektúrák és a Google által készített **Inception**. Például nézzük meg a legegyszerűbb ResNet-50 modell architektúráját (a ResNet egy modellcsalád, amely különböző mélységű modelleket tartalmaz, ha szeretnéd látni, milyen egy igazán mély modell, kipróbálhatod a ResNet-152-t):\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -1441,29 +1452,29 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Amint látható, a modell ugyanazokat az ismerős építőelemeket tartalmazza: konvolúciós rétegek, pooling rétegek és egy végső sűrű osztályozó. Ezt a modellt pontosan ugyanúgy használhatjuk, mint ahogy a VGG-16-ot használtuk a transfer learning során. Kipróbálhatod a fenti kódot különböző ResNet modellek alapmodellként való használatával, és megfigyelheted, hogyan változik a pontosság.\n",
|
||||
"Ahogy látható, a modell ugyanazokat a jól ismert építőelemeket tartalmazza: konvolúciós rétegek, pooling rétegek és végső sűrű osztályozó. Ezt a modellt pontosan ugyanúgy használhatjuk, mint ahogyan a VGG-16-ot használtuk átviteli tanuláshoz. Kísérletezhetsz a fenti kóddal, különböző ResNet modelleket használva alapmodellként, és megnézheted, hogyan változik a pontosság.\n",
|
||||
"\n",
|
||||
"## Batch Normalization\n",
|
||||
"## Batch Normalizáció\n",
|
||||
"\n",
|
||||
"Ez a hálózat egy másik típusú réteget is tartalmaz: **Batch Normalization**. A batch normalization ötlete az, hogy a neurális hálózaton keresztül áramló értékeket a megfelelő intervallumba hozza. Általában a neurális hálózatok akkor működnek a legjobban, ha minden érték a [-1,1] vagy [0,1] tartományban van, ezért skálázzuk/normalizáljuk az input adatokat ennek megfelelően. Azonban egy mély hálózat tanítása során előfordulhat, hogy az értékek jelentősen kikerülnek ebből a tartományból, ami problémássá teszi a tanítást. A batch normalization réteg kiszámítja az aktuális minibatch összes értékének átlagát és szórását, és ezeket használja az adatok normalizálására, mielőtt azokat egy neurális hálózati rétegen keresztül továbbítaná. Ez jelentősen javítja a mély hálózatok stabilitását.\n"
|
||||
"Ez a hálózat tartalmaz egy másik rétegtípust is: **Batch Normalizáció**. A batch normalizáció célja, hogy a neurális hálózaton áthaladó értékeket a megfelelő tartományba hozza. Általában a neurális hálózatok akkor működnek a legjobban, ha minden érték a [-1,1] vagy [0,1] intervallumban van, és ezért méretezzük/normáljuk be ennek megfelelően a bemeneti adatokat. Azonban egy mély hálózat tréningje során előfordulhat, hogy az értékek jelentősen kilépnek ebből a tartományból, ami megnehezíti a tanulást. A batch normalizációs réteg kiszámítja az aktuális minibatch összes értékének átlagát és szórását, és ezeket felhasználva normalizálja a jelet, mielőtt az áthalad a neurális hálózati rétegen. Ez jelentősen javítja a mély hálózatok stabilitását.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Összefoglaló\n",
|
||||
"## Összegzés\n",
|
||||
"\n",
|
||||
"A transzfer tanulás alkalmazásával gyorsan össze tudtunk állítani egy osztályozót az egyedi objektumok osztályozási feladatához, és magas pontosságot értünk el. Azonban ez a példa nem volt teljesen igazságos, mivel az eredeti VGG-16 hálózatot már előzetesen macskák és kutyák felismerésére tanították, így lényegében csak újrahasznosítottuk a hálózatban már meglévő mintázatokat. Kevésbé szokványos, specifikus objektumok esetében, mint például gyártósoron lévő részletek vagy különböző fa levelek, alacsonyabb pontosságra lehet számítani.\n",
|
||||
"Átviteli tanulás használatával gyorsan össze tudtunk rakni egy osztályozót az egyedi objektumosztályozási feladatunkhoz, és magas pontosságot értünk el. Azonban ez a példa nem volt teljesen igazságos, mert az eredeti VGG-16 hálózatot macskák és kutyák felismerésére trenírozták előre, így a hálózat már meglévő mintázatait használtuk fel újra. Alacsonyabb pontosság várható egzotikusabb, speciálisabb tartományokra jellemző objektumok esetén, például egy gyár termelési sorának részleteinél vagy különböző fa leveleinél.\n",
|
||||
"\n",
|
||||
"Látható, hogy az összetettebb feladatok, amelyeket most oldunk meg, nagyobb számítási kapacitást igényelnek, és nem oldhatók meg könnyen CPU-n. A következő egységben megpróbálunk egy könnyebb implementációt használni ugyanazon modell betanításához, alacsonyabb számítási erőforrásokkal, ami csak minimálisan alacsonyabb pontosságot eredményez.\n"
|
||||
"Látható, hogy a jelenleg megoldott összetettebb feladatok nagyobb számítási kapacitást igényelnek, és nem oldhatók meg könnyen CPU-n. A következő egységben egy könnyebb implementációt próbálunk használni ugyanazon modell betanítására alacsonyabb számítási erőforrásokkal, ami csak kissé alacsonyabb pontossághoz vezet.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n---\n\n**Felelősségkizárás**: \nEzt a dokumentumot az [Co-op Translator](https://github.com/Azure/co-op-translator) AI fordítási szolgáltatás segítségével fordítottuk le. Bár törekszünk a pontosságra, kérjük, vegye figyelembe, hogy az automatikus fordítások hibákat vagy pontatlanságokat tartalmazhatnak. Az eredeti dokumentum az eredeti nyelvén tekintendő hiteles forrásnak. Kritikus információk esetén javasolt a professzionális, emberi fordítás igénybevétele. Nem vállalunk felelősséget a fordítás használatából eredő félreértésekért vagy téves értelmezésekért.\n"
|
||||
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**Jogi nyilatkozat**:\nEz a dokumentum az AI fordítási szolgáltatás, a [Co-op Translator](https://github.com/Azure/co-op-translator) segítségével készült. Bár az pontosságra törekszünk, kérjük, vegye figyelembe, hogy az automatikus fordítások hibákat vagy pontatlanságokat tartalmazhatnak. Az eredeti dokumentum az anyanyelvén tekintendő hiteles forrásnak. Fontos információk esetén professzionális emberi fordítást javasolunk. Nem vállalunk felelősséget semmilyen félreértésért vagy téves értelmezésért, amely ebből a fordításból ered.\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-29T13:40:53+00:00",
|
||||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb",
|
||||
"language_code": "hu"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
|
|
|||
|
|
@ -1,51 +1,51 @@
|
|||
# Természetes Nyelvfeldolgozás
|
||||
# Természetes Nyelv Feldolgozás
|
||||
|
||||

|
||||

|
||||
|
||||
Ebben a részben a neurális hálózatok használatára összpontosítunk, hogy megoldjuk a **természetes nyelvfeldolgozással (NLP)** kapcsolatos feladatokat. Számos NLP probléma van, amelyeket szeretnénk, ha a számítógépek meg tudnának oldani:
|
||||
Ebben a szakaszban az ideghálózatok használatára fogunk koncentrálni a **természetes nyelv feldolgozással (NLP)** kapcsolatos feladatok kezelésére. Sok NLP probléma van, amelyet a számítógépek képesek legyenek megoldani:
|
||||
|
||||
* **Szöveg osztályozása** egy tipikus osztályozási probléma, amely szövegszekvenciákra vonatkozik. Példák: e-mailek osztályozása spam vagy nem spam kategóriába, vagy cikkek kategorizálása sport, üzlet, politika stb. témák szerint. Chatbotok fejlesztésekor gyakran meg kell értenünk, mit akart mondani a felhasználó – ebben az esetben **szándék osztályozásról** van szó. A szándék osztályozás során gyakran sok kategóriával kell dolgoznunk.
|
||||
* **Érzelemelemzés** egy tipikus regressziós probléma, ahol egy számot (érzelmet) kell hozzárendelnünk, amely kifejezi, mennyire pozitív vagy negatív egy mondat jelentése. Az érzelemelemzés egy fejlettebb változata az **aspektus-alapú érzelemelemzés** (ABSA), ahol nem az egész mondathoz, hanem annak különböző részeihez (aspektusokhoz) rendelünk érzelmet, pl. *Ebben az étteremben tetszett a konyha, de a hangulat borzalmas volt*.
|
||||
* **Név entitás felismerés** (NER) arra a problémára utal, hogy bizonyos entitásokat kell kinyerni a szövegből. Például meg kell értenünk, hogy a *Holnap Párizsba kell repülnöm* mondatban a *holnap* szó DÁTUM-ra utal, míg *Párizs* egy HELYSÉG.
|
||||
* **Kulcsszó kinyerés** hasonló a NER-hez, de itt automatikusan kell kinyerni a mondat jelentéséhez fontos szavakat, anélkül, hogy előzetesen specifikus entitástípusokra tanítanánk.
|
||||
* **Szöveg csoportosítása** hasznos lehet, ha hasonló mondatokat szeretnénk csoportosítani, például technikai támogatási beszélgetésekben hasonló kéréseket.
|
||||
* **Kérdés megválaszolása** arra utal, hogy egy modell képes legyen egy adott kérdésre válaszolni. A modell egy szöveges részletet és egy kérdést kap bemenetként, és meg kell adnia a szöveg azon részét, ahol a válasz található (vagy néha generálnia kell a válasz szövegét).
|
||||
* **Szöveg generálása** egy modell képessége új szöveg létrehozására. Ez tekinthető egy osztályozási feladatnak, amely előrejelzi a következő betűt/szót egy *szöveges indítás* alapján. Fejlett szöveg generáló modellek, mint például a GPT-3, képesek más NLP feladatokat is megoldani olyan technikák segítségével, mint a [prompt programozás](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) vagy a [prompt mérnökség](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29).
|
||||
* **Szöveg összefoglalása** egy olyan technika, amikor azt szeretnénk, hogy a számítógép "elolvassa" a hosszú szöveget, és néhány mondatban összefoglalja.
|
||||
* **Gépi fordítás** tekinthető egy nyelven történő szöveg megértésének és egy másik nyelven történő szöveg generálásának kombinációjaként.
|
||||
* **Szöveg osztályozás** tipikus osztályozási probléma szöveges sorozatokkal kapcsolatban. Például az e-mail üzenetek spamból vagy nem spam kategóriába sorolása, vagy cikkek kategorizálása sport, üzlet, politika stb. szerint. Chatbot fejlesztésekor gyakran meg kell érteni, mit akart mondani a felhasználó — ebben az esetben **szándék osztályozással** foglalkozunk. Gyakran az szándék osztályozás során sok kategóriával kell dolgoznunk.
|
||||
* **Hangulatelemzés** tipikus regressziós probléma, ahol egy számot (hangulatot) kell hozzárendelni egy mondat jelentésének pozitív vagy negatív értékeléséhez. Egy fejlettebb változata a hangulatelemzésnek az **aspektus-alapú hangulatelemzés** (ABSA), ahol nem az egész mondathoz, hanem annak különböző részeihez (aspektusokhoz) rendelünk hangulatot, pl. *Ebben az étteremben szerettem a konyhát, de a hangulat szörnyű volt*.
|
||||
* **Nevesített entitásfelismerés** (NER) a szövegből bizonyos entitások kinyerésének problémája. Például meg kell értenünk, hogy a *Holnap Párizsba kell repülnöm* kifejezésben a *holnap* dátum, a *Párizs* pedig helyszín.
|
||||
* **Kulcsszó-kivonás** hasonló a NER-hez, de ebben az esetben automatikusan kell kinyerni a mondat jelentéséhez fontos szavakat, anélkül, hogy specifikus entitástípusokra előre tréningeznénk.
|
||||
* **Szöveg klaszterezés** hasznos lehet, amikor hasonló mondatokat kívánunk csoportosítani, például hasonló igényeket a műszaki támogatási beszélgetésekben.
|
||||
* **Kérdés-válasz** az a képesség, hogy egy modell válaszoljon egy adott kérdésre. A modell bemenete egy szövegrészlet és egy kérdés, és meg kell határoznia a szöveg azon helyét, ahol a kérdésre a válasz található (vagy néha magát a válasz szöveget generálja).
|
||||
* **Szöveggenerálás** az a képesség, hogy egy modell új szöveget generáljon. Ez tekinthető egy osztályozási feladatnak, amely a következő betűt/szót jósolja meg valamilyen *szöveges prompt* alapján. Fejlett szöveggeneráló modellek, például a GPT-3 képesek más NLP feladatokat is megoldani, mint például az osztályozás [prompt programozás](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) vagy [prompt mérnökség](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29) segítségével.
|
||||
* **Szövegösszefoglalás** olyan technika, amikor a számítógépnek "el kell olvasnia" egy hosszú szöveget, és néhány mondatban összegeznie azt.
|
||||
* **Gépi fordítás** tekinthető a szöveg értelmezésének egy nyelven és szöveggenerálásnak egy másik nyelven kombinációjaként.
|
||||
|
||||
Kezdetben a legtöbb NLP feladatot hagyományos módszerekkel oldották meg, például nyelvtanokkal. Például gépi fordítás esetén elemzőket használtak, hogy az eredeti mondatot szintaxisfává alakítsák, majd magasabb szintű szemantikai struktúrákat nyertek ki, hogy reprezentálják a mondat jelentését, és ezen jelentés és a célnyelv nyelvtana alapján generálták az eredményt. Manapság sok NLP feladatot hatékonyabban oldanak meg neurális hálózatokkal.
|
||||
Kezdetben az NLP feladatok nagy részét hagyományos módszerekkel, például nyelvtanokkal oldották meg. Például a gépi fordításban elemzőket használtak az kiinduló mondat szintaxis-fa-á alakítására, majd magasabb szintű szemantikai struktúrákat nyertek ki a mondat jelentésének reprezentálására, és az eredményt ezen jelentés és a célnyelv nyelvtana alapján generálták. Manapság sok NLP feladatot hatékonyabban oldanak meg ideghálózatokkal.
|
||||
|
||||
> Számos klasszikus NLP módszer megtalálható a [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org) Python könyvtárban. Egy remek [NLTK könyv](https://www.nltk.org/book/) is elérhető online, amely bemutatja, hogyan lehet különböző NLP feladatokat megoldani az NLTK segítségével.
|
||||
> Sok klasszikus NLP módszer elérhető a [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org) Python könyvtárban. Van egy remek [NLTK könyv](https://www.nltk.org/book/) online, amely bemutatja, hogyan lehet különböző NLP feladatokat megoldani az NLTK-val.
|
||||
|
||||
A kurzusunkban főként a neurális hálózatok használatára fogunk összpontosítani az NLP területén, és szükség esetén használni fogjuk az NLTK-t.
|
||||
Tanfolyamunk során főként az ideghálózatok NLP-ben való alkalmazására fogunk koncentrálni, és ahol szükséges, használjuk az NLTK-t.
|
||||
|
||||
Már megtanultuk, hogyan használjunk neurális hálózatokat táblázatos adatok és képek feldolgozására. A fő különbség ezek között az adatok és a szöveg között az, hogy a szöveg változó hosszúságú szekvencia, míg a képek esetében a bemenet mérete előre ismert. Míg a konvolúciós hálózatok képesek mintákat kinyerni a bemeneti adatokból, a szövegben lévő minták összetettebbek. Például a tagadás elválasztható a tárgytól sok szóval (pl. *Nem szeretem a narancsot* vs. *Nem szeretem azokat a nagy színes ízletes narancsokat*), és ezt még mindig egy mintaként kell értelmezni. Ezért a nyelv kezeléséhez új neurális hálózattípusokat kell bevezetnünk, mint például *rekurzív hálózatok* és *transformerek*.
|
||||
Már tanultunk arról, hogyan lehet ideghálózatokat használni táblázatos adatok és képek kezelésére. Az ilyen adatok és a szöveg fő különbsége, hogy a szöveg változó hosszúságú sorozat, míg képek esetén a bemenet mérete előre ismert. Míg a konvolúciós hálózatok mintákat tudnak kinyerni a bemeneti adatokból, a minták a szövegben sokkal összetettebbek. Például lehet, hogy egy tagadás és a tárgy között számos szó lehet (pl. *Nem szeretem a narancsot*, illetve *Nem szeretem azokat a nagy színes finom narancsokat*), és ez mégis egy mintának számít. Ezért a nyelv kezeléséhez új típusú ideghálókat kell bevezetnünk, mint például *rekurzív hálózatok* és *transzformerek*.
|
||||
|
||||
## Könyvtárak telepítése
|
||||
## Könyvtárak Telepítése
|
||||
|
||||
Ha helyi Python telepítést használ a kurzus futtatásához, szükség lehet az NLP-hez szükséges összes könyvtár telepítésére az alábbi parancsokkal:
|
||||
Ha helyi Python telepítést használsz a tanfolyam futtatásához, szükség lehet az összes NLP-hez szükséges könyvtár telepítésére a következő parancsokkal:
|
||||
|
||||
**PyTorch esetén**
|
||||
```bash
|
||||
pip install -r requirements-torch.txt
|
||||
pip install -r requirements-pytorch.txt
|
||||
```
|
||||
**TensorFlow esetén**
|
||||
```bash
|
||||
pip install -r requirements-tf.txt
|
||||
```
|
||||
|
||||
> A TensorFlow-val való NLP-t kipróbálhatod a [Microsoft Learn](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste) oldalon.
|
||||
> Próbálhatod az NLP-t TensorFlow-val a [Microsoft Learn](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste) oldalán.
|
||||
|
||||
## GPU Figyelmeztetés
|
||||
|
||||
Ebben a részben néhány példában meglehetősen nagy modelleket fogunk tanítani.
|
||||
* **Használj GPU-val ellátott számítógépet**: Javasolt GPU-val ellátott számítógépen futtatni a jegyzetfüzeteket, hogy csökkentsük a várakozási időt nagy modellek esetén.
|
||||
* **GPU memória korlátok**: GPU használata esetén előfordulhat, hogy kifogy a GPU memória, különösen nagy modellek tanítása során.
|
||||
* **GPU memória fogyasztás**: A GPU memória fogyasztása a tanítás során számos tényezőtől függ, beleértve a minibatch méretét.
|
||||
* **Minimális minibatch méret**: Ha GPU memória problémákba ütközöl, próbáld meg csökkenteni a minibatch méretét a kódban.
|
||||
* **TensorFlow GPU memória felszabadítás**: A TensorFlow régebbi verziói nem mindig szabadítják fel megfelelően a GPU memóriát, ha több modellt tanítasz egy Python kernelben. A GPU memória hatékony kezeléséhez beállíthatod, hogy a TensorFlow csak szükség esetén foglaljon GPU memóriát.
|
||||
* **Kód beillesztése**: A TensorFlow beállításához, hogy csak szükség esetén növelje a GPU memória foglalását, illeszd be az alábbi kódot a jegyzetfüzetedbe:
|
||||
Ebben a szakaszban néhány példában elég nagy modelleket fogunk tanítani.
|
||||
* **Használj GPU-támogatott számítógépet**: Ajánlott, hogy a jegyzeteket GPU-t támogató számítógépen futtasd a várakozási idők csökkentése érdekében nagy modellek esetén.
|
||||
* **GPU memória korlátok**: GPU-n való futtatás esetén előfordulhat, hogy elfogy a GPU memória, különösen nagy modellek tanítása közben.
|
||||
* **GPU memória fogyasztás**: A tanulás során fogyasztott GPU memória mennyisége több tényezőtől függ, beleértve a minibatch méretét is.
|
||||
* **Minibatch méret csökkentése**: Ha problémát tapasztalsz a GPU memória miatt, próbáld csökkenteni a minibatch méretet a kódodban.
|
||||
* **TensorFlow GPU memória felszabadítás**: Régebbi TensorFlow verziók nem mindig szabadítják fel megfelelően a GPU memóriát, ha több modellt tanítanak egy Python kernelben. A GPU memória hatékony kezeléséhez konfigurálhatod a TensorFlow-t úgy, hogy csak szükséges esetben foglaljon memóriát.
|
||||
* **Kód beillesztése**: Ahhoz, hogy a TensorFlow csak szükség szerint bővítse a GPU memória lefoglalást, illeszd be a következő kódot a jegyzeteidbe:
|
||||
|
||||
```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)
|
||||
```
|
||||
|
||||
Ha érdekel az NLP klasszikus gépi tanulási perspektívából, látogasd meg [ezt a leckesorozatot](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP).
|
||||
Ha érdekel az NLP klasszikus gépi tanulási nézőpontból, látogasd meg [ezt a tananyagot](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP)
|
||||
|
||||
## Ebben a részben
|
||||
Ebben a részben megtanuljuk:
|
||||
## Ebben a szakaszban
|
||||
Ebben a szakaszban az alábbiakat tanuljuk meg:
|
||||
|
||||
* [Szöveg reprezentálása tensorokként](13-TextRep/README.md)
|
||||
* [Szöveg reprezentálása tenzorokként](13-TextRep/README.md)
|
||||
* [Szóbeágyazások](14-Emdeddings/README.md)
|
||||
* [Nyelvi modellezés](15-LanguageModeling/README.md)
|
||||
* [Nyelvmodellezés](15-LanguageModeling/README.md)
|
||||
* [Rekurzív neurális hálózatok](16-RNN/README.md)
|
||||
* [Generatív hálózatok](17-GenerativeNetworks/README.md)
|
||||
* [Transformerek](18-Transformers/README.md)
|
||||
* [Transzformerek](18-Transformers/README.md)
|
||||
|
||||
**Felelősség kizárása**:
|
||||
Ez a dokumentum az AI fordítási szolgáltatás [Co-op Translator](https://github.com/Azure/co-op-translator) segítségével lett lefordítva. Bár törekszünk a pontosságra, kérjük, vegye figyelembe, hogy az automatikus fordítások hibákat vagy pontatlanságokat tartalmazhatnak. Az eredeti dokumentum az eredeti nyelvén tekintendő hiteles forrásnak. Kritikus információk esetén javasolt professzionális emberi fordítást igénybe venni. Nem vállalunk felelősséget semmilyen félreértésért vagy téves értelmezésért, amely a fordítás használatából eredhet.
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**Jogi nyilatkozat**:
|
||||
Ez a dokumentum az AI fordítási szolgáltatás, a [Co-op Translator](https://github.com/Azure/co-op-translator) segítségével készült. Bár az pontosságra törekszünk, kérjük, vegye figyelembe, hogy az automatikus fordítások hibákat vagy pontatlanságokat tartalmazhatnak. Az eredeti dokumentum az anyanyelvén tekintendő hiteles forrásnak. Fontos információk esetén professzionális emberi fordítást javasolunk. Nem vállalunk felelősséget semmilyen félreértésért vagy téves értelmezésért, amely ebből a fordításból ered.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -1,38 +1,38 @@
|
|||
# Többügynökös rendszerek
|
||||
# Több-ügynökös rendszerek
|
||||
|
||||
Az intelligencia elérésének egyik lehetséges módja az úgynevezett **emergens** (vagy **szinergikus**) megközelítés, amely azon az elven alapul, hogy sok viszonylag egyszerű ügynök együttes viselkedése a rendszer egészének összetettebb (vagy intelligensebb) viselkedését eredményezheti. Elméletileg ez a [Kollektív intelligencia](https://en.wikipedia.org/wiki/Collective_intelligence), az [Emergentizmus](https://en.wikipedia.org/wiki/Global_brain) és az [Evolúciós kibernetika](https://en.wikipedia.org/wiki/Global_brain) elvein alapul, amelyek szerint a magasabb szintű rendszerek valamilyen hozzáadott értéket nyernek, ha megfelelően kombinálják őket alacsonyabb szintű rendszerekből (az úgynevezett *metarendszer-átmenet elve*).
|
||||
Az intelligencia elérésének egyik lehetséges módja az úgynevezett **emergens** (vagy **szinergikus**) megközelítés, amely azon az elven alapul, hogy sok viszonylag egyszerű ügynök együttes viselkedése az egész rendszer összetettebb (vagy intelligensebb) viselkedését eredményezheti. Elméletileg ez a [Kollektív intelligencia](https://en.wikipedia.org/wiki/Collective_intelligence), az [Emergentizmus](https://en.wikipedia.org/wiki/Global_brain) és az [Evolúciós kibernetika](https://en.wikipedia.org/wiki/Global_brain) elveire épül, amelyek azt állítják, hogy a magasabb szintű rendszerek hozzáadott értéket nyernek, ha jól kombináljuk őket az alacsonyabb szintű rendszerekből (az úgynevezett *metarendszer-átmenet elve*).
|
||||
|
||||
## [Előadás előtti kvíz](https://ff-quizzes.netlify.app/en/ai/quiz/45)
|
||||
|
||||
A **többügynökös rendszerek** irányzata az 1990-es években jelent meg a mesterséges intelligenciában, válaszul az internet és az elosztott rendszerek növekedésére. Az egyik klasszikus mesterséges intelligencia tankönyv, az [Artificial Intelligence: A Modern Approach](https://en.wikipedia.org/wiki/Artificial_Intelligence:_A_Modern_Approach), a klasszikus mesterséges intelligenciát a többügynökös rendszerek szemszögéből vizsgálja.
|
||||
A **Több-ügynökös rendszerek** irányvonala az 1990-es években jelent meg a mesterséges intelligenciában az internet és az elosztott rendszerek növekedésére válaszul. Egy klasszikus MI tankönyv, az [Artificial Intelligence: A Modern Approach](https://en.wikipedia.org/wiki/Artificial_Intelligence:_A_Modern_Approach), a klasszikus MI nézőpontját a több-ügynökös rendszerek szemszögéből tárgyalja.
|
||||
|
||||
A többügynökös megközelítés központi eleme az **ügynök** fogalma – egy entitás, amely egy bizonyos **környezetben** él, amelyet érzékelhet és amelyre hatással lehet. Ez egy nagyon tág definíció, és számos különböző típusú és osztályozású ügynök létezhet:
|
||||
A több-ügynökös megközelítés központi fogalma az **ügynök** – egy olyan entitás, amely egy **környezetben** él, amelyet érzékelni és befolyásolni képes. Ez egy nagyon tág meghatározás, és sokféle típusú és osztályozású ügynök létezhet:
|
||||
|
||||
* Az érvelési képességük alapján:
|
||||
- **Reaktív** ügynökök általában egyszerű kérés-válasz típusú viselkedést mutatnak
|
||||
- **Deliberatív** ügynökök valamilyen logikai érvelést és/vagy tervezési képességeket alkalmaznak
|
||||
* Az alapján, hogy hol futtatják a kódjukat:
|
||||
- **Statikus** ügynökök egy dedikált hálózati csomóponton működnek
|
||||
- **Mobil** ügynökök képesek a kódjukat hálózati csomópontok között mozgatni
|
||||
* A viselkedésük alapján:
|
||||
- **Passzív ügynökök** nem rendelkeznek konkrét célokkal. Ezek az ügynökök reagálhatnak külső ingerekre, de maguktól nem kezdeményeznek cselekvéseket.
|
||||
- **Aktív ügynökök** rendelkeznek célokkal, amelyeket követnek
|
||||
- **Kognitív ügynökök** összetett tervezést és érvelést alkalmaznak
|
||||
* Észlelőképességük alapján:
|
||||
- A **reaktív** ügynökök általában egyszerű kérés-válasz típusú viselkedést mutatnak
|
||||
- A **megfontolt** ügynökök valamilyen logikai érvelést és/vagy tervezési képességet alkalmaznak
|
||||
* Az alapján, hogy hol fut az ügynök kódja:
|
||||
- A **statikus** ügynökök dedikált hálózati csomóponton dolgoznak
|
||||
- A **mobil** ügynökök képesek mozgatni a kódjukat a hálózati csomópontok között
|
||||
* Viselkedésük alapján:
|
||||
- A **passzív ügynököknek** nincsenek speciális céljaik. Ilyen ügynökök reagálhatnak külső ingerekre, de nem kezdeményeznek önállóan semmilyen akciót.
|
||||
- Az **aktív ügynököknek** vannak céljaik, amelyeket követnek
|
||||
- A **kognitív ügynökök** bonyolult tervezést és érvelést foglalnak magukban
|
||||
|
||||
A többügynökös rendszereket manapság számos alkalmazásban használják:
|
||||
Manapság a több-ügynökös rendszerek számos alkalmazásban használatosak:
|
||||
|
||||
* Játékokban sok nem játékos karakter (NPC) valamilyen mesterséges intelligenciát alkalmaz, és intelligens ügynöknek tekinthető
|
||||
* Videógyártásban, összetett 3D jelenetek renderelése, amelyek tömegeket tartalmaznak, tipikusan többügynökös szimulációval történik
|
||||
* Rendszermodellezésben a többügynökös megközelítést használják egy összetett modell viselkedésének szimulálására. Például a többügynökös megközelítést sikeresen alkalmazták a COVID-19 betegség globális terjedésének előrejelzésére. Hasonló megközelítést lehet használni egy város forgalmának modellezésére, és annak vizsgálatára, hogyan reagál a közlekedési szabályok változásaira.
|
||||
* Összetett automatizálási rendszerekben minden eszköz független ügynökként működhet, ami a teljes rendszert kevésbé monolitikussá és robusztusabbá teszi.
|
||||
* Játékokban sok nem játékos karakter valamilyen mesterséges intelligenciát alkalmaz, és intelligens ügynöknek tekinthetők
|
||||
* Videógyártásban összetett 3D jelenetek renderelésénél, amelyek tömegeket ábrázolnak, általában több-ügynökös szimulációt használnak
|
||||
* Rendszermodellezésben a több-ügynökös megközelítés egy összetett modell viselkedésének szimulálására szolgál. Például a több-ügynökös megközelítést sikeresen alkalmazták a COVID-19 világméretű terjedésének előrejelzésére. Hasonló megközelítés használható a városi forgalom modellezésére és annak vizsgálatára, hogyan reagál a közlekedési szabályok változásaira.
|
||||
* Összetett automatizálási rendszerekben minden eszköz önálló ügynökként működhet, ami robosztusabbá és kevésbé monolitikussá teszi az egész rendszert.
|
||||
|
||||
Nem fogunk mélyen belemenni a többügynökös rendszerek részleteibe, de megvizsgálunk egy példát a **többügynökös modellezésre**.
|
||||
Nem fogunk mélyen belemenni a több-ügynökös rendszerekbe, de megnézünk egy példát a **Több-ügynökös modellezésre**.
|
||||
|
||||
## NetLogo
|
||||
|
||||
A [NetLogo](https://ccl.northwestern.edu/netlogo/) egy többügynökös modellezési környezet, amely a [Logo](https://en.wikipedia.org/wiki/Logo_(programming_language)) programozási nyelv módosított változatán alapul. Ezt a nyelvet a programozási fogalmak tanítására fejlesztették ki gyerekek számára, és lehetővé teszi egy **teknős** nevű ügynök irányítását, amely mozoghat, nyomot hagyva maga után. Ez lehetővé teszi összetett geometriai alakzatok létrehozását, ami nagyon vizuális módja az ügynök viselkedésének megértésének.
|
||||
A [NetLogo](https://ccl.northwestern.edu/netlogo/) egy több-ügynökös modellező környezet, amely a [Logo](https://en.wikipedia.org/wiki/Logo_(programming_language)) programozási nyelv módosított változatán alapul. Ezt a nyelvet programozási koncepciók tanítására fejlesztették ki gyerekek számára, és lehetővé teszi egy **turtle** nevű ügynök irányítását, amely mozog, és nyomot hagy maga után. Ez lehetővé teszi összetett geometriai alakzatok létrehozását, ami nagyon szemléletes módja az ügynök viselkedésének megértésére.
|
||||
|
||||
A NetLogo-ban sok teknőst hozhatunk létre a `create-turtles` parancs segítségével. Ezután utasíthatjuk az összes teknőst, hogy végezzen el bizonyos műveleteket (az alábbi példában - mozogjon előre 10 pontot):
|
||||
A NetLogo-ban sok teknőst hozhatunk létre a `create-turtles` parancs használatával. Ezután parancsot adhatunk az összes teknősnek valamilyen cselekvésre (az alábbi példában - 10 ponttal előre):
|
||||
|
||||
```
|
||||
create-turtles 10
|
||||
|
|
@ -41,39 +41,39 @@ ask turtles [
|
|||
]
|
||||
```
|
||||
|
||||
Természetesen nem érdekes, ha minden teknős ugyanazt csinálja, ezért `ask` parancs segítségével csoportokat is utasíthatunk, például azokat, amelyek egy bizonyos pont közelében vannak. Különböző *fajtájú* teknősöket is létrehozhatunk a `breed [cats cat]` paranccsal. Itt a `cat` a fajta neve, és meg kell adnunk az egyes és többes számú alakot is, mert a különböző parancsok az érthetőség érdekében különböző formákat használnak.
|
||||
Természetesen nem érdekes, ha az összes teknős ugyanazt csinálja, ezért kérhetjük teknőscsoportok (például egy bizonyos pont közelében lévők) parancsait. A `breed [cats cat]` paranccsal különböző *fajt* is létrehozhatunk teknősökből. Itt a `cat` a fajta neve, és meg kell adni mind az egyes, mind a többes számot, mert a különböző parancsok érthetőség miatt eltérő formákat használnak.
|
||||
|
||||
> ✅ Nem fogunk belemenni a NetLogo nyelv tanulásába – ha érdekel, látogasd meg a kiváló [Beginner's Interactive NetLogo Dictionary](https://ccl.northwestern.edu/netlogo/bind/) oldalt.
|
||||
> ✅ Nem fogunk mélyebben belemenni a NetLogo nyelv megtanulásába – ha érdekel, látogass el a remek [Kezdő interaktív NetLogo szótárba](https://ccl.northwestern.edu/netlogo/bind/).
|
||||
|
||||
Letöltheted és telepítheted a NetLogo-t [innen](https://ccl.northwestern.edu/netlogo/download.shtml), hogy kipróbáld.
|
||||
Letöltheted és telepítheted a NetLogo-t, hogy kipróbáld: [download](https://ccl.northwestern.edu/netlogo/download.shtml).
|
||||
|
||||
### Modellek könyvtára
|
||||
|
||||
A NetLogo egyik nagyszerű tulajdonsága, hogy tartalmaz egy működő modellekből álló könyvtárat, amelyeket kipróbálhatsz. Lépj a **File → Models Library** menüpontra, és számos modellkategóriából választhatsz.
|
||||
A NetLogo nagyszerűsége, hogy tartalmaz egy könyvtár működő modellekkel, amelyeket kipróbálhatsz. Nyisd meg a **File → Models Library** menüpontot, ahol sokféle modellt találsz.
|
||||
|
||||
<img alt="NetLogo Models Library" src="../../../../../translated_images/hu/NetLogo-ModelLib.efe023afb4763c05.webp" width="60%"/>
|
||||
|
||||
> Dmitry Soshnikov által készített képernyőkép a modellek könyvtáráról
|
||||
> Dmitry Soshnikov képernyőképe a modellek könyvtáráról
|
||||
|
||||
Megnyithatsz egy modellt, például **Biology → Flocking**.
|
||||
Megnyithatsz egy modellt, például a **Biology → Flocking** modellt.
|
||||
|
||||
### Főbb elvek
|
||||
### Fő elvek
|
||||
|
||||
A modell megnyitása után a NetLogo fő képernyőjére kerülsz. Itt egy minta modell látható, amely a farkasok és juhok populációját írja le véges erőforrások (fű) mellett.
|
||||
A modell megnyitása után a fő NetLogo képernyőre jutsz. Itt egy minta modell, amely a farkasok és juhok populációját írja le véges erőforrások (fű) mellett.
|
||||
|
||||

|
||||

|
||||
|
||||
> Dmitry Soshnikov által készített képernyőkép
|
||||
> Dmitry Soshnikov képernyőképe
|
||||
|
||||
Ezen a képernyőn láthatod:
|
||||
Ezen a képernyőn a következőket láthatod:
|
||||
|
||||
* Az **Interfész** szekciót, amely tartalmazza:
|
||||
* Az **Interfész** rész, amely tartalmazza:
|
||||
- A fő mezőt, ahol az összes ügynök él
|
||||
- Különböző vezérlőelemeket: gombokat, csúszkákat stb.
|
||||
- Grafikonokat, amelyeken a szimuláció paramétereit jelenítheted meg
|
||||
* A **Kód** fület, amely tartalmazza a szerkesztőt, ahol NetLogo programot írhatsz
|
||||
- Grafikonokat, amelyekkel megjelenítheted a szimuláció paramétereit
|
||||
* A **Kód** fület, amely szerkesztőt tartalmaz, ahol NetLogo programot írhatsz
|
||||
|
||||
A legtöbb esetben az interfész tartalmaz egy **Setup** gombot, amely inicializálja a szimuláció állapotát, és egy **Go** gombot, amely elindítja a végrehajtást. Ezeket a megfelelő kezelők kezelik a kódban, amelyek így néznek ki:
|
||||
A legtöbb esetben az interfészen található egy **Setup** gomb, amely inicializálja a szimuláció állapotát, és egy **Go** gomb, amely elindítja a végrehajtást. Ezeket a kód megfelelő kezelői irányítják, amelyek így néznek ki:
|
||||
|
||||
```
|
||||
to go [
|
||||
|
|
@ -83,54 +83,77 @@ to go [
|
|||
|
||||
A NetLogo világa a következő objektumokból áll:
|
||||
|
||||
* **Ügynökök** (teknősök), amelyek mozoghatnak a mezőn és végezhetnek valamit. Az ügynököket a `ask turtles [...]` szintaxissal utasíthatod, és a zárójelek közötti kódot minden ügynök *teknős módban* hajtja végre.
|
||||
* **Foltok** (patches), amelyek a mező négyzet alakú területei, ahol az ügynökök élnek. Hivatkozhatsz az ugyanazon a folton lévő összes ügynökre, vagy megváltoztathatod a foltok színeit és egyéb tulajdonságait. A foltokat is utasíthatod a `ask patches` paranccsal.
|
||||
* **Megfigyelő** (observer), amely egy egyedi ügynök, és a világot irányítja. Az összes gombkezelő *megfigyelő módban* fut.
|
||||
* **Ügynökök** (teknősök), amelyek mozoghatnak a mezőn és cselekedhetnek. Az ügynököket a `ask turtles [...]` szintaxissal irányítod, és a zárójelben lévő kódot az összes ügynök végrehajtja *teknős módban*.
|
||||
* A **patch-ek** a mező négyzet alakú részei, ahol az ügynökök élnek. Hivatkozhatsz az összes ugyanazon patch-en lévő ügynökre, vagy megváltoztathatod a patch színeit és egyéb tulajdonságait. A `ask patches` parancsal is kérhetsz cselekvést.
|
||||
* Az **Observer** egy egyedi ügynök, amely irányítja a világot. Minden gombkezelő *observer módban* fut.
|
||||
|
||||
> ✅ A többügynökös környezet szépsége, hogy a teknős módban vagy folt módban futó kódot az összes ügynök párhuzamosan hajtja végre. Így kevés kód írásával és az egyes ügynökök viselkedésének programozásával összetett viselkedést hozhatsz létre a szimulációs rendszer egészében.
|
||||
> ✅ Egy több-ügynökös környezet szépsége, hogy a teknős mód vagy patch mód kódot párhuzamosan, egyszerre hajtja végre az összes ügynök, így kis kóddal, egyéni viselkedés programozásával összetett viselkedést alakíthatsz ki az egész szimulációban.
|
||||
|
||||
### Flocking
|
||||
### Fajcsapódás
|
||||
|
||||
A többügynökös viselkedés példájaként vizsgáljuk meg a **[Flocking](https://en.wikipedia.org/wiki/Flocking_(behavior))** jelenséget. A flocking egy összetett minta, amely nagyon hasonlít arra, ahogyan a madárrajok repülnek. Amikor figyeled őket, azt gondolhatod, hogy valamilyen kollektív algoritmust követnek, vagy hogy rendelkeznek valamilyen *kollektív intelligenciával*. Azonban ez az összetett viselkedés akkor jön létre, amikor minden egyes ügynök (ebben az esetben egy *madár*) csak a közvetlen közelében lévő más ügynököket figyeli, és három egyszerű szabályt követ:
|
||||
A több-ügynökös viselkedés példájaként nézzük meg a **[Flocking](https://en.wikipedia.org/wiki/Flocking_(behavior))**-et. A flocking egy összetett minta, amely nagyon hasonlít a madárcsoportok repülési mintázatához. Repülésüket figyelve azt gondolhatod, hogy valamilyen kollektív algoritmust követnek, vagy hogy valamilyen *kollektív intelligenciával* rendelkeznek. Ez az összetett viselkedés akkor keletkezik, amikor az egyes ügynök (itt *madár*) csak a rövid távolságra lévő más ügynököket figyeli, és három egyszerű szabályt követ:
|
||||
|
||||
* **Igazodás** - az ügynök a szomszédos ügynökök átlagos irányába fordul
|
||||
* **Kohézió** - az ügynök a szomszédok átlagos pozíciója felé próbál fordulni (*hosszú távú vonzás*)
|
||||
* **Elkülönülés** - ha túl közel kerül más madarakhoz, távolodni próbál (*rövid távú taszítás*)
|
||||
* **Igazodás** - a szomszédos ügynökök átlagos irányába tart
|
||||
* **Összetartás** - a szomszédok átlagos pozíciója felé tart (*hosszútávú vonzás*)
|
||||
* **Elválasztás** - ha túl közel kerül más madarakhoz, elmozog (*rövid távú taszítás*)
|
||||
|
||||
Futtathatod a flocking példát, és megfigyelheted a viselkedést. Állíthatod a paramétereket, például az *elkülönülés mértékét* vagy a *látótávolságot*, amely meghatározza, hogy a madarak milyen messzire látnak. Figyeld meg, hogy ha a látótávolságot 0-ra csökkented, minden madár megvakul, és a flocking leáll. Ha az elkülönülést 0-ra csökkented, minden madár egy egyenes vonalba gyűlik össze.
|
||||
Lefuttathatod a flocking példát és megfigyelheted a viselkedést. Beállíthatsz paramétereket is, például az *elválasztás mértékét* vagy a *látótávolságot*, amely meghatározza, milyen messzire lát a madár. Ha a látótávolságot 0-ra csökkented, a madarak megvakulnak, és a flocking megszűnik. Ha az elválasztást 0-ra állítod, a madarak egy egyenes vonalba gyűlnek össze.
|
||||
|
||||
> ✅ Válts a **Kód** fülre, és nézd meg, hol vannak a flocking három szabálya (igazodás, kohézió és elkülönülés) megvalósítva a kódban. Figyeld meg, hogy csak azokra az ügynökökre hivatkozunk, amelyek a látótávolságon belül vannak.
|
||||
> ✅ Váltasz a **Kód** fülre és nézd meg, hol vannak megvalósítva a flocking három szabálya (igazodás, összetartás és elválasztás). Figyeld meg, hogy csak azokat az ügynököket veszi figyelembe, amelyek látótávolságon belül vannak.
|
||||
|
||||
### Egyéb modellek, amelyeket érdemes megnézni
|
||||
### Egyéb modellek megtekintése
|
||||
|
||||
Van néhány további érdekes modell, amelyeket kipróbálhatsz:
|
||||
Van néhány érdekes modell, amellyel kísérletezhetsz:
|
||||
|
||||
* **Art → Fireworks** bemutatja, hogyan tekinthető egy tűzijáték az egyes tűzfolyamok kollektív viselkedésének
|
||||
* **Social Science → Traffic Basic** és **Social Science → Traffic Grid** bemutatja a városi forgalom modelljét 1D-ben és 2D rácsban, közlekedési lámpákkal vagy anélkül. Minden autó a következő szabályokat követi:
|
||||
- Ha az előtte lévő hely üres – gyorsít (egy bizonyos maximális sebességig)
|
||||
- Ha akadályt lát maga előtt – fékez (és állíthatod, hogy a sofőr milyen messzire lát)
|
||||
* **Social Science → Party** bemutatja, hogyan csoportosulnak az emberek egy koktélpartin. Megtalálhatod azokat a paraméterkombinációkat, amelyek a csoport boldogságának leggyorsabb növekedéséhez vezetnek.
|
||||
* **Art → Fireworks** bemutatja, hogyan tekinthetjük a tűzijátékot egyéni tűzáramok kollektív viselkedésének
|
||||
* **Social Science → Traffic Basic** és **Social Science → Traffic Grid** modellezik a városi forgalmat 1D és 2D hálózaton, közlekedési lámpákkal vagy anélkül. A szimulációban minden autó a következő szabályokat követi:
|
||||
- Ha előtte üres hely van - gyorsít (egy megadott maximális sebességig)
|
||||
- Ha akadályt lát előtte - fékez (szabályozhatod, milyen messzire lát a sofőr)
|
||||
* **Social Science → Party** bemutatja, hogyan csoportosulnak az emberek egy koktélpartin. Megtalálhatod azokat a paraméterkombinációkat, amelyek a leggyorsabb boldogság-növekedést eredményezik a csoportban.
|
||||
|
||||
Ahogy ezekből a példákból láthatod, a többügynökös szimulációk hasznos eszközök lehetnek egy olyan összetett rendszer viselkedésének megértéséhez, amely egyénekből áll, akik ugyanazt vagy hasonló logikát követnek. Használhatók virtuális ügynökök, például [NPC-k](https://en.wikipedia.org/wiki/NPC) irányítására számítógépes játékokban, vagy ügynökök irányítására 3D animált világokban.
|
||||
Ahogy ezekből a példákból láthatod, a több-ügynökös szimulációk igen hasznosak lehetnek összetett rendszerek viselkedésének megértésében, ahol az egyéni részek ugyanazt vagy hasonló logikát követnek. Használhatók virtuális ügynökök irányítására is, például [NPC-k](https://en.wikipedia.org/wiki/NPC) számítógépes játékokban vagy ügynökök 3D animált világokban.
|
||||
|
||||
## Deliberatív ügynökök
|
||||
## Megfontolt ügynökök
|
||||
|
||||
A fent leírt ügynökök nagyon egyszerűek, és valamilyen algoritmus segítségével reagálnak a környezet változásaira. Ezek **reaktív ügynökök**. Azonban néha az ügynökök képesek érvelni és megtervezni a cselekvéseiket, ebben az esetben **deliberatív ügynököknek** nevezzük őket.
|
||||
A fent ismertetett ügynökök nagyon egyszerűek, környezetváltozásokra reagálnak valamilyen algoritmussal. Ezek az úgynevezett **reaktív ügynökök**. Ugyanakkor néha az ügynökök képesek érvelni és tervezni, amely esetben **megfontolt** ügynököknek hívjuk őket.
|
||||
|
||||
Egy tipikus példa lehet egy személyes ügynök, amely egy embertől kapott utasítást, hogy foglaljon le egy nyaralási utat. Tegyük fel, hogy az interneten sok ügynök él, akik segíthetnek neki. Kapcsolatba kell lépnie más ügynökökkel, hogy megnézze, milyen repülőjáratok érhetők el, milyen árakon kínálnak szállodákat különböző időpontokra, és meg kell próbálnia a legjobb árat kialkudni. Amikor a nyaralási terv elkészül és a tulajdonos megerősíti, folytathatja a foglalást.
|
||||
Egy tipikus példa lehet egy személyes ügynök, amely emberi utasítást kap egy nyaralási túra lefoglalására. Tegyük fel, hogy az interneten sok más ügynök él, akik segíthetnek. Kapcsolatba kell lépnie más ügynökökkel, hogy megtudja, milyen járatok elérhetők, mennyibe kerülnek a hotelek különböző időpontokban, és megpróbálja a legjobb árat kialkudni. Amikor a nyaralási terv elkészül és a tulajdonos megerősíti, tovább léphet a foglalásra.
|
||||
|
||||
Ehhez az ügynököknek **kommunikálniuk** kell. A sikeres kommunikációhoz szükségük van:
|
||||
|
||||
* Valamilyen **szabványos nyelvre a tudás cseréjéhez**, például [Knowledge Interchange Format](https://en.wikipedia.org/wiki/Knowledge_Interchange_Format) (KIF) és [Knowledge Query and Manipulation Language](https://en.wikipedia.org/wiki/Knowledge_Query_and_Manipulation_Language) (KQML). Ezeket a nyelveket a [beszédaktus-elmélet](https://en.wikipedia.org/wiki/Speech_act) alapján tervezték.
|
||||
* Ezeknek a nyelveknek tartalmazniuk kell valamilyen **tárgyalási protokollokat**, amelyek különböző **aukciótípusokon** alapulnak.
|
||||
* Egy **közös ontológiára**, hogy ugyanazokra a fogalmakra hivatkozzanak, ismerve azok szemantikáját
|
||||
* Egy módra, hogy **felfedezzék**, mit tudnak tenni a különböző ügynökök, szintén valamilyen ontológia alapján
|
||||
* Néhány **szabványos nyelvre a tudáscseréhez**, mint például a [Knowledge Interchange Format](https://en.wikipedia.org/wiki/Knowledge_Interchange_Format) (KIF) és a [Knowledge Query and Manipulation Language](https://en.wikipedia.org/wiki/Knowledge_Query_and_Manipulation_Language) (KQML). Ezeket a nyelveket a [Beszédaktus-elmélet](https://en.wikipedia.org/wiki/Speech_act) alapján tervezték.
|
||||
* Ezeknek a nyelveknek tartalmazniuk kell **tárgyalási protokollokat**, különböző **aukciótípusok** alapján.
|
||||
* Egy **közös ontológiára** van szükség, hogy ugyanazokat a fogalmakat használják, ismerve azok jelentését
|
||||
* Olyan módra, amellyel **feltérképezhetik**, hogy mit tudnak a különböző ügynökök, szintén ontológia alapján
|
||||
|
||||
A deliberatív ügynökök sokkal összetettebbek, mint a reaktívak, mert nemcsak a környezet változásaira reagálnak, hanem képesek *kezdeményezni* is cselekvéseket. Az egyik javasolt architektúra a deliberatív ügynökökhöz az úgynevezett Hiedelem-Vágy-Szándék (Belief-Desire-Intention, BDI) ügynök:
|
||||
A megfontolt ügynökök sokkal összetettebbek a reaktívaknál, mert nem csak a környezetváltozásokra reagálnak, hanem képesnek kell lenniük az *akciók kezdeményezésére* is. Az egyik javasolt architektúra egy megfontolt ügynökre a Belief-Desire-Intention (BDI) modell:
|
||||
|
||||
* **Hiedelmek** alkotják az ügynök környezetéről szóló tudás halmazát. Ez lehet egy tudásbázis vagy szabályok halmaza, amelyeket az ügynök alkalmazhat egy adott helyzetre a környezetben.
|
||||
* **Vágyak** határozzák meg, mit akar az ügynök elérni, azaz a céljait. Például a fent említett személyi asszisztens ügynök célja egy utazás lefoglalása, míg egy szállodai ügynök célja a profit maximalizálása.
|
||||
* **Szándékok** azok a konkrét cselekvések, amelyeket az ügynök a céljai elérése érdekében tervez. A cselekvések általában megváltoztat
|
||||
* A **Hiedelmek** alkotnak egy tudásbázist az ügynök környezetéről. Ez lehet egy tudásbázis vagy szabálygyűjtemény, amelyet az ügynök alkalmazhat a környezet adott helyzetére.
|
||||
* A **Vágyak** meghatározzák, mit akar az ügynök, azaz a céljait. Például a személyes asszisztens ügynök célja egy túra lefoglalása, a hotel ügynök célja a profit maximalizálása.
|
||||
* A **Szándékok** azok a konkrét cselekvések, amelyeket az ügynök tervez, hogy elérje céljait. Ezek a cselekvések általában megváltoztatják a környezetet, és kommunikációt indítanak más ügynökökkel.
|
||||
|
||||
Több-ügynökös rendszerek építéséhez elérhetők platformok, mint például a [JADE](https://jade.tilab.com/). [Ez a tanulmány](https://arxiv.org/ftp/arxiv/papers/2007/2007.08961.pdf) áttekintést ad a több-ügynökös platformokról, továbbá rövid történelemről és különböző felhasználási esetekről.
|
||||
|
||||
## Összefoglalás
|
||||
|
||||
A több-ügynökös rendszerek sokféle formát ölthetnek, és sokféle alkalmazásban használhatók.
|
||||
Mindegyik az egyéni ügynök egyszerűbb viselkedésére összpontosít, és a rendszer egészének összetettebb viselkedése a **szinergikus hatás** eredménye.
|
||||
|
||||
## 🚀 Kihívás
|
||||
|
||||
Vidd ki ezt a leckét a valós világba, és próbálj meg elképzelni egy olyan több-ügynökös rendszert, amely megold egy problémát. Mit kellene például egy több-ügynökös rendszernek tennie egy iskolabusz útvonalának optimalizálásához? Hogyan működhetne egy pékségben?
|
||||
|
||||
## [Előadás utáni kvíz](https://ff-quizzes.netlify.app/en/ai/quiz/46)
|
||||
|
||||
## Áttekintés és önálló tanulás
|
||||
|
||||
Nézd át az ilyen rendszerek ipari alkalmazását. Válassz egy területet, mint például a gyártás vagy a videojáték-ipar, és fedezd fel, hogyan használhatók a több-ügynökös rendszerek egyedi problémák megoldására.
|
||||
|
||||
## [NetLogo feladat](assignment.md)
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**Jogi nyilatkozat**:
|
||||
Ez a dokumentum az AI fordítási szolgáltatás, a [Co-op Translator](https://github.com/Azure/co-op-translator) segítségével készült. Bár az pontosságra törekszünk, kérjük, vegye figyelembe, hogy az automatikus fordítások hibákat vagy pontatlanságokat tartalmazhatnak. Az eredeti dokumentum az anyanyelvén tekintendő hiteles forrásnak. Fontos információk esetén professzionális emberi fordítást javasolunk. Nem vállalunk felelősséget semmilyen félreértésért vagy téves értelmezésért, amely ebből a fordításból ered.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -5,6 +5,12 @@
|
|||
"source_file": "AGENTS.md",
|
||||
"language_code": "id"
|
||||
},
|
||||
"CONTRIBUTING.md": {
|
||||
"original_hash": "c6fd7e781b67111a90abd166d0ce4aa0",
|
||||
"translation_date": "2026-07-08T16:18:45+00:00",
|
||||
"source_file": "CONTRIBUTING.md",
|
||||
"language_code": "id"
|
||||
},
|
||||
"README.md": {
|
||||
"original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b",
|
||||
"translation_date": "2026-04-06T20:28:05+00:00",
|
||||
|
|
@ -17,6 +23,19 @@
|
|||
"source_file": "SECURITY.md",
|
||||
"language_code": "id"
|
||||
},
|
||||
"__translation_failures__": {
|
||||
"lessons/sketchnotes/LICENSE.md": {
|
||||
"original_hash": "45ab63a2cd8f5faef6c9b150618837a4",
|
||||
"source_file": "lessons/sketchnotes/LICENSE.md",
|
||||
"language_code": "id",
|
||||
"failure_date": "2026-07-08T16:18:13+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-29T12:52:28+00:00",
|
||||
|
|
@ -54,8 +73,8 @@
|
|||
"language_code": "id"
|
||||
},
|
||||
"examples/README.md": {
|
||||
"original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7",
|
||||
"translation_date": "2025-10-03T11:32:36+00:00",
|
||||
"original_hash": "7883d52c2e2a221e0b07a7b112a149b9",
|
||||
"translation_date": "2026-07-08T16:13:49+00:00",
|
||||
"source_file": "examples/README.md",
|
||||
"language_code": "id"
|
||||
},
|
||||
|
|
@ -66,8 +85,8 @@
|
|||
"language_code": "id"
|
||||
},
|
||||
"lessons/0-course-setup/how-to-run.md": {
|
||||
"original_hash": "a4717bd9103b9f6cd84d534b83534689",
|
||||
"translation_date": "2026-01-16T03:44:39+00:00",
|
||||
"original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1",
|
||||
"translation_date": "2026-07-08T16:14:09+00:00",
|
||||
"source_file": "lessons/0-course-setup/how-to-run.md",
|
||||
"language_code": "id"
|
||||
},
|
||||
|
|
@ -191,6 +210,12 @@
|
|||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md",
|
||||
"language_code": "id"
|
||||
},
|
||||
"lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": {
|
||||
"original_hash": "99b816b6a4957ef4100cee4c4221dff9",
|
||||
"translation_date": "2026-07-08T16:00:35+00:00",
|
||||
"source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb",
|
||||
"language_code": "id"
|
||||
},
|
||||
"lessons/4-ComputerVision/08-TransferLearning/lab/README.md": {
|
||||
"original_hash": "7765935c35fcee69b9fe2d0cfd6963e2",
|
||||
"translation_date": "2025-08-29T12:22:38+00:00",
|
||||
|
|
@ -330,8 +355,8 @@
|
|||
"language_code": "id"
|
||||
},
|
||||
"lessons/5-NLP/README.md": {
|
||||
"original_hash": "8ef02a9318257ea140ed3ed74442096d",
|
||||
"translation_date": "2025-08-29T12:41:43+00:00",
|
||||
"original_hash": "038df6f1a73e49f6430740da083bfd6d",
|
||||
"translation_date": "2026-07-08T16:14:31+00:00",
|
||||
"source_file": "lessons/5-NLP/README.md",
|
||||
"language_code": "id"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -0,0 +1,29 @@
|
|||
# Berkontribusi pada AI-For-Beginners
|
||||
|
||||
Terima kasih atas minat Anda untuk berkontribusi pada AI-For-Beginners! Kami menyambut terjemahan, perbaikan pelajaran, dan koreksi format.
|
||||
|
||||
## Perjanjian Lisensi Kontributor (CLA) Microsoft
|
||||
|
||||
Proyek ini menyambut kontribusi dan saran. Sebagian besar kontribusi mengharuskan Anda menyetujui Perjanjian Lisensi Kontributor (CLA) yang menyatakan bahwa Anda memiliki hak, dan memang memberikan kami hak untuk menggunakan kontribusi Anda. Untuk detail, kunjungi [https://cla.microsoft.com](https://cla.microsoft.com).
|
||||
|
||||
Saat Anda mengajukan pull request, bot CLA secara otomatis akan menentukan apakah Anda perlu memberikan CLA dan menghias PR dengan tepat (misalnya, label, komentar). Cukup ikuti instruksi yang diberikan oleh bot. Anda hanya perlu melakukan ini sekali di seluruh repositori yang menggunakan CLA kami.
|
||||
|
||||
## Cara Berkontribusi
|
||||
|
||||
### 1. Memperbaiki Typo / Kesalahan Kode
|
||||
Jika Anda menemukan typo atau bug di notebook Jupyter atau file markdown pelajaran manapun:
|
||||
1. Fork repositori tersebut.
|
||||
2. Perbaiki typo atau tautan yang rusak.
|
||||
3. Ajukan Pull Request dengan deskripsi perbaikan yang jelas.
|
||||
|
||||
### 2. Mengajukan Terjemahan
|
||||
Kami menyambut terjemahan pelajaran ke dalam bahasa lain! Silakan letakkan terjemahan di bawah direktori `translations/` dengan menggunakan nama folder yang sudah ada di sana (misalnya `translations/es/`, `translations/pt-BR/`, `translations/zh-CN/`).
|
||||
|
||||
Untuk detail lebih lanjut, lihat [etc/CONTRIBUTING.md](etc/CONTRIBUTING.md).
|
||||
|
||||
---
|
||||
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**Penafian**:
|
||||
Dokumen ini telah diterjemahkan menggunakan layanan terjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berupaya untuk mencapai akurasi, harap diketahui bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang sah. Untuk informasi penting, disarankan menggunakan terjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
|
|
@ -1,27 +1,27 @@
|
|||
# Contoh AI Ramah Pemula
|
||||
# Contoh AI untuk Pemula
|
||||
|
||||
Selamat datang! Direktori ini berisi contoh sederhana dan mandiri untuk membantu Anda memulai dengan AI dan pembelajaran mesin. Setiap contoh dirancang agar mudah dipahami dengan komentar yang rinci dan penjelasan langkah demi langkah.
|
||||
Selamat datang! Direktori ini berisi contoh sederhana dan mandiri untuk membantu Anda memulai dengan AI dan pembelajaran mesin. Setiap contoh dirancang ramah pemula dengan komentar terperinci dan penjelasan langkah demi langkah.
|
||||
|
||||
## 📚 Gambaran Contoh
|
||||
## 📚 Ikhtisar Contoh
|
||||
|
||||
| Contoh | Deskripsi | Tingkat Kesulitan | Prasyarat |
|
||||
|--------|-----------|-------------------|-----------|
|
||||
| [Hello AI World](../../../examples/01-hello-ai-world.py) | Program AI pertama Anda - pengenalan pola sederhana | ⭐ Pemula | Dasar-dasar Python |
|
||||
| [Simple Neural Network](../../../examples/02-simple-neural-network.py) | Membangun jaringan neural dari awal | ⭐⭐ Pemula+ | Python, matematika dasar |
|
||||
| [Image Classifier](./03-image-classifier.ipynb) | Mengklasifikasi gambar dengan model yang sudah dilatih | ⭐⭐ Pemula+ | Python, numpy |
|
||||
| [Text Sentiment](../../../examples/04-text-sentiment.py) | Menganalisis sentimen teks (positif/negatif) | ⭐⭐ Pemula+ | Python |
|
||||
|---------|-------------|------------|---------------|
|
||||
| [Hello AI World](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/01-hello-ai-world.py) | Program AI pertamamu - pengenalan pola sederhana | ⭐ Pemula | Dasar Python |
|
||||
| [Simple Neural Network](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/02-simple-neural-network.py) | Membuat jaringan saraf dari awal | ⭐⭐ Pemula+ | Python, matematika dasar |
|
||||
| [Image Classifier](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/03-image-classifier.ipynb) | Mengklasifikasikan gambar dengan model yang sudah dilatih | ⭐⭐ Pemula+ | Python, numpy |
|
||||
| [Text Sentiment](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/04-text-sentiment.py) | Menganalisis sentimen teks (positif/negatif) | ⭐⭐ Pemula+ | Python |
|
||||
|
||||
## 🚀 Memulai
|
||||
|
||||
### Prasyarat
|
||||
|
||||
Pastikan Anda sudah menginstal Python (disarankan versi 3.8 atau lebih tinggi). Instal paket yang diperlukan:
|
||||
Pastikan Anda telah menginstal Python (3.8 atau lebih tinggi disarankan). Instal paket yang diperlukan:
|
||||
|
||||
```bash
|
||||
# For Python scripts
|
||||
# Untuk skrip Python
|
||||
pip install numpy
|
||||
|
||||
# For Jupyter notebooks (image classifier)
|
||||
# Untuk notebook Jupyter (pengklasifikasi gambar)
|
||||
pip install jupyter numpy pillow tensorflow
|
||||
```
|
||||
|
||||
|
|
@ -34,43 +34,43 @@ conda activate ai4beg
|
|||
|
||||
### Menjalankan Contoh
|
||||
|
||||
**Untuk skrip Python (.py files):**
|
||||
**Untuk skrip Python (.py):**
|
||||
```bash
|
||||
python 01-hello-ai-world.py
|
||||
```
|
||||
|
||||
**Untuk Jupyter notebooks (.ipynb files):**
|
||||
**Untuk notebook Jupyter (.ipynb):**
|
||||
```bash
|
||||
jupyter notebook 03-image-classifier.ipynb
|
||||
```
|
||||
|
||||
## 📖 Jalur Pembelajaran
|
||||
|
||||
Kami merekomendasikan mengikuti contoh secara berurutan:
|
||||
Kami menyarankan mengikuti contoh secara urut:
|
||||
|
||||
1. **Mulai dengan "Hello AI World"** - Pelajari dasar-dasar pengenalan pola
|
||||
2. **Bangun Jaringan Neural Sederhana** - Pahami cara kerja jaringan neural
|
||||
1. **Mulai dengan "Hello AI World"** - Pelajari dasar pengenalan pola
|
||||
2. **Bangun Jaringan Saraf Sederhana** - Pahami cara kerja jaringan saraf
|
||||
3. **Coba Pengklasifikasi Gambar** - Lihat AI beraksi dengan gambar nyata
|
||||
4. **Analisis Sentimen Teks** - Jelajahi pemrosesan bahasa alami
|
||||
|
||||
## 💡 Tips untuk Pemula
|
||||
|
||||
- **Baca komentar kode dengan cermat** - Mereka menjelaskan apa yang dilakukan setiap baris
|
||||
- **Bereksperimen!** - Coba ubah nilai dan lihat apa yang terjadi
|
||||
- **Jangan khawatir jika tidak memahami semuanya** - Belajar membutuhkan waktu
|
||||
- **Ajukan pertanyaan** - Gunakan [Papan Diskusi](https://github.com/microsoft/AI-For-Beginners/discussions)
|
||||
- **Baca komentar kode dengan saksama** - Mereka menjelaskan apa yang dilakukan setiap baris
|
||||
- **Bereksperimenlah!** - Cobalah mengubah nilai dan lihat hasilnya
|
||||
- **Jangan khawatir memahami semuanya** - Belajar itu proses yang butuh waktu
|
||||
- **Ajukan pertanyaan** - Gunakan [papan Diskusi](https://github.com/microsoft/AI-For-Beginners/discussions)
|
||||
|
||||
## 🔗 Langkah Selanjutnya
|
||||
|
||||
Setelah menyelesaikan contoh-contoh ini, jelajahi kurikulum lengkap:
|
||||
Setelah menyelesaikan contoh ini, jelajahi kurikulum lengkap:
|
||||
- [Pengantar AI](../lessons/1-Intro/README.md)
|
||||
- [Jaringan Neural](../lessons/3-NeuralNetworks/README.md)
|
||||
- [Visi Komputer](../lessons/4-ComputerVision/README.md)
|
||||
- [Jaringan Saraf](../lessons/3-NeuralNetworks/README.md)
|
||||
- [Penglihatan Komputer](../lessons/4-ComputerVision/README.md)
|
||||
- [Pemrosesan Bahasa Alami](../lessons/5-NLP/README.md)
|
||||
|
||||
## 🤝 Kontribusi
|
||||
## 🤝 Berkontribusi
|
||||
|
||||
Apakah contoh-contoh ini membantu Anda? Bantu kami untuk meningkatkannya:
|
||||
Menemukan contoh ini bermanfaat? Bantu kami memperbaikinya:
|
||||
- Laporkan masalah atau usulkan perbaikan
|
||||
- Tambahkan lebih banyak contoh untuk pemula
|
||||
- Tingkatkan dokumentasi dan komentar
|
||||
|
|
@ -81,5 +81,7 @@ Apakah contoh-contoh ini membantu Anda? Bantu kami untuk meningkatkannya:
|
|||
|
||||
---
|
||||
|
||||
**Penafian**:
|
||||
Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diperhatikan bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan manusia profesional. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
||||
**Penafian**:
|
||||
Dokumen ini telah diterjemahkan menggunakan layanan terjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berupaya untuk mencapai akurasi, harap diketahui bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang sah. Untuk informasi penting, disarankan menggunakan terjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini.
|
||||
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue