diff --git a/translations/ar/.co-op-translator.json b/translations/ar/.co-op-translator.json index 7faec55f51..e518c04b77 100644 --- a/translations/ar/.co-op-translator.json +++ b/translations/ar/.co-op-translator.json @@ -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" }, diff --git a/translations/ar/CONTRIBUTING.md b/translations/ar/CONTRIBUTING.md new file mode 100644 index 0000000000..28ec9bf185 --- /dev/null +++ b/translations/ar/CONTRIBUTING.md @@ -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](https://github.com/Azure/co-op-translator). بينما نسعى للدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو عدم دقة. يجب اعتبار المستند الأصلي بلغته الأصلية المصدر الرسمي والمعتمد. للمعلومات الهامة، يُنصح بالاستعانة بترجمة بشرية محترفة. نحن غير مسؤولين عن أي سوء فهم أو تفسير ناتج عن استخدام هذه الترجمة. + \ No newline at end of file diff --git a/translations/ar/lessons/0-course-setup/how-to-run.md b/translations/ar/lessons/0-course-setup/how-to-run.md index ffe2f34c98..8badb79254 100644 --- a/translations/ar/lessons/0-course-setup/how-to-run.md +++ b/translations/ar/lessons/0-course-setup/how-to-run.md @@ -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](https://github.com/Azure/co-op-translator). على الرغم من أننا نسعى لضمان الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو عدم دقة. يجب اعتبار المستند الأصلي بلغته الأصلية المصدر الرسمي والمعتمد. للمعلومات الحيوية، يُنصح بالاستعانة بالترجمة البشرية الاحترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسير خاطئ ينشأ عن استخدام هذه الترجمة. +تمت ترجمة هذا المستند باستخدام خدمة الترجمة بالذكاء الاصطناعي [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى للدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو عدم دقة. يجب اعتبار المستند الأصلي بلغته الأصلية المصدر الرسمي والمعتمد. للمعلومات الهامة، يُنصح بالاستعانة بترجمة بشرية محترفة. نحن غير مسؤولين عن أي سوء فهم أو تفسير ناتج عن استخدام هذه الترجمة. \ No newline at end of file diff --git a/translations/ar/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/ar/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index 054341d808..262af23ab3 100644 --- a/translations/ar/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/ar/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -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\n**تنويه**:\nتمت ترجمة هذا المستند باستخدام خدمة الترجمة بالذكاء الاصطناعي [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى للدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو عدم دقة. يجب اعتبار المستند الأصلي بلغته الأصلية المصدر الرسمي والمعتمد. للمعلومات الهامة، يُنصح بالاستعانة بترجمة بشرية محترفة. نحن غير مسؤولين عن أي سوء فهم أو تفسير ناتج عن استخدام هذه الترجمة.\n\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, diff --git a/translations/ar/lessons/5-NLP/README.md b/translations/ar/lessons/5-NLP/README.md index cc0d106483..432cf48f58 100644 --- a/translations/ar/lessons/5-NLP/README.md +++ b/translations/ar/lessons/5-NLP/README.md @@ -1,51 +1,51 @@ # معالجة اللغة الطبيعية -![ملخص مهام معالجة اللغة الطبيعية في رسم توضيحي](../../../../translated_images/ar/ai-nlp.b22dcb8ca4707cea.webp) +![ملخص مهام معالجة اللغة الطبيعية في رسم تخطيطي](../../../../translated_images/ar/ai-nlp.b22dcb8ca4707cea.webp) -في هذا القسم، سنركز على استخدام الشبكات العصبية لمعالجة المهام المتعلقة بـ **معالجة اللغة الطبيعية (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). بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو معلومات غير دقيقة. يجب اعتبار المستند الأصلي بلغته الأصلية المصدر الرسمي. للحصول على معلومات حاسمة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة تنشأ عن استخدام هذه الترجمة. \ No newline at end of file +--- + + +**تنويه**: +تمت ترجمة هذا المستند باستخدام خدمة الترجمة بالذكاء الاصطناعي [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى للدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو عدم دقة. يجب اعتبار المستند الأصلي بلغته الأصلية المصدر الرسمي والمعتمد. للمعلومات الهامة، يُنصح بالاستعانة بترجمة بشرية محترفة. نحن غير مسؤولين عن أي سوء فهم أو تفسير ناتج عن استخدام هذه الترجمة. + \ No newline at end of file diff --git a/translations/bg/.co-op-translator.json b/translations/bg/.co-op-translator.json index c00f496dfb..01f79b3489 100644 --- a/translations/bg/.co-op-translator.json +++ b/translations/bg/.co-op-translator.json @@ -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" }, diff --git a/translations/bg/CONTRIBUTING.md b/translations/bg/CONTRIBUTING.md new file mode 100644 index 0000000000..4b63fbeca2 --- /dev/null +++ b/translations/bg/CONTRIBUTING.md @@ -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). + +--- + + +**Отказ от отговорност**: +Този документ е преведен с помощта на AI преводачески услуга [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля имайте предвид, че автоматизираните преводи могат да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за каквито и да е недоразумения или неправилни тълкувания, произтичащи от използването на този превод. + \ No newline at end of file diff --git a/translations/bg/examples/README.md b/translations/bg/examples/README.md index db5ec1a375..d6aa4c04a2 100644 --- a/translations/bg/examples/README.md +++ b/translations/bg/examples/README.md @@ -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). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод. \ No newline at end of file + +**Отказ от отговорност**: +Този документ е преведен с помощта на AI преводачески услуга [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля имайте предвид, че автоматизираните преводи могат да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за каквито и да е недоразумения или неправилни тълкувания, произтичащи от използването на този превод. + \ No newline at end of file diff --git a/translations/bg/lessons/0-course-setup/how-to-run.md b/translations/bg/lessons/0-course-setup/how-to-run.md index 8b230f899d..159c50d515 100644 --- a/translations/bg/lessons/0-course-setup/how-to-run.md +++ b/translations/bg/lessons/0-course-setup/how-to-run.md @@ -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 тетрадки там, за да ги изпълнявате по една. --- **Отказ от отговорност**: -Този документ е преведен с помощта на AI преводаческа услуга [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи могат да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Не носим отговорност за каквито и да е недоразумения или неправилни тълкувания, произтичащи от използването на този превод. +Този документ е преведен с помощта на AI преводачески услуга [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля имайте предвид, че автоматизираните преводи могат да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за каквито и да е недоразумения или неправилни тълкувания, произтичащи от използването на този превод. \ No newline at end of file diff --git a/translations/bg/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/bg/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index b82795ca8d..9b269885d9 100644 --- a/translations/bg/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/bg/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -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\n**Отказ от отговорност**:\nТози документ е преведен с помощта на AI преводачески услуга [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля имайте предвид, че автоматизираните преводи могат да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за каквито и да е недоразумения или неправилни тълкувания, произтичащи от използването на този превод.\n\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, diff --git a/translations/bg/lessons/5-NLP/README.md b/translations/bg/lessons/5-NLP/README.md index 9231fdce6d..eb9efa32fa 100644 --- a/translations/bg/lessons/5-NLP/README.md +++ b/translations/bg/lessons/5-NLP/README.md @@ -1,51 +1,51 @@ # Обработка на естествен език -![Обобщение на задачите в NLP в рисунка](../../../../translated_images/bg/ai-nlp.b22dcb8ca4707cea.webp) +![Обобщение на задачи в NLP в рисунка](../../../../translated_images/bg/ai-nlp.b22dcb8ca4707cea.webp) -В тази секция ще се фокусираме върху използването на невронни мрежи за решаване на задачи, свързани с **обработката на естествен език (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). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод. \ No newline at end of file +--- + + +**Отказ от отговорност**: +Този документ е преведен с помощта на AI преводачески услуга [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля имайте предвид, че автоматизираните преводи могат да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за каквито и да е недоразумения или неправилни тълкувания, произтичащи от използването на този превод. + \ No newline at end of file diff --git a/translations/bn/.co-op-translator.json b/translations/bn/.co-op-translator.json index 4f04e1c256..386294ee30 100644 --- a/translations/bn/.co-op-translator.json +++ b/translations/bn/.co-op-translator.json @@ -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" }, diff --git a/translations/bn/CONTRIBUTING.md b/translations/bn/CONTRIBUTING.md new file mode 100644 index 0000000000..da026a7339 --- /dev/null +++ b/translations/bn/CONTRIBUTING.md @@ -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)। + +--- + + +**অস্বীকৃতি**: +এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনূদিত হয়েছে। যদিও আমরা শুদ্ধতার জন্য চেষ্টা করি, অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল নথিটি তার স্বভাষায় কর্তৃত্বপূর্ণ উৎস হিসেবে বিবেচিত হওয়া উচিত। গুরুত্বপূর্ণ তথ্যের জন্য পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদের ব্যবহারে প্রয়োজনীয় ভুল বোঝাবুঝি বা ভুল ব্যাখ্যার জন্য আমরা দায়বদ্ধ নই। + \ No newline at end of file diff --git a/translations/bn/examples/README.md b/translations/bn/examples/README.md index 6d414b62e9..f76bca1b88 100644 --- a/translations/bn/examples/README.md +++ b/translations/bn/examples/README.md @@ -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) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসাধ্য সঠিকতার জন্য চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না। \ No newline at end of file + +**অস্বীকৃতি**: +এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনূদিত হয়েছে। যদিও আমরা শুদ্ধতার জন্য চেষ্টা করি, অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল নথিটি তার স্বভাষায় কর্তৃত্বপূর্ণ উৎস হিসেবে বিবেচিত হওয়া উচিত। গুরুত্বপূর্ণ তথ্যের জন্য পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদের ব্যবহারে প্রয়োজনীয় ভুল বোঝাবুঝি বা ভুল ব্যাখ্যার জন্য আমরা দায়বদ্ধ নই। + \ No newline at end of file diff --git a/translations/bn/lessons/0-course-setup/how-to-run.md b/translations/bn/lessons/0-course-setup/how-to-run.md index d65b847fbb..b9750d8939 100644 --- a/translations/bn/lessons/0-course-setup/how-to-run.md +++ b/translations/bn/lessons/0-course-setup/how-to-run.md @@ -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](https://github.com/Azure/co-op-translator) ব্যবহার করে অনূদিত হয়েছে। আমরা যথাসাধ্য সঠিকতার চেষ্টা করি, তবে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা ভুল থাকতে পারে। মূল ভাষায় থাকা মূল ডকুমেন্টটিই কর্তৃত্বপ্রাপ্ত উৎস হিসেবে বিবেচিত হওয়া উচিত। গুরুত্বপূর্ণ তথ্যের জন্য পেশাদার মানব অনুবাদ প্রয়োজন। এই অনুবাদের ব্যবহারে সৃষ্ট কোনো ভুল বোঝাবুঝি বা ব্যাখ্যার জন্য আমরা দায়বদ্ধ নই। +**অস্বীকৃতি**: +এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনূদিত হয়েছে। যদিও আমরা শুদ্ধতার জন্য চেষ্টা করি, অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল নথিটি তার স্বভাষায় কর্তৃত্বপূর্ণ উৎস হিসেবে বিবেচিত হওয়া উচিত। গুরুত্বপূর্ণ তথ্যের জন্য পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদের ব্যবহারে প্রয়োজনীয় ভুল বোঝাবুঝি বা ভুল ব্যাখ্যার জন্য আমরা দায়বদ্ধ নই। \ No newline at end of file diff --git a/translations/bn/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/bn/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index 90a3e2636e..aa03c2991e 100644 --- a/translations/bn/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/bn/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -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\n**অস্বীকৃতি**:\nএই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনূদিত হয়েছে। যদিও আমরা শুদ্ধতার জন্য চেষ্টা করি, অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল নথিটি তার স্বভাষায় কর্তৃত্বপূর্ণ উৎস হিসেবে বিবেচিত হওয়া উচিত। গুরুত্বপূর্ণ তথ্যের জন্য পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদের ব্যবহারে প্রয়োজনীয় ভুল বোঝাবুঝি বা ভুল ব্যাখ্যার জন্য আমরা দায়বদ্ধ নই।\n\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, diff --git a/translations/bn/lessons/5-NLP/README.md b/translations/bn/lessons/5-NLP/README.md index 9c568744d3..b699e8bf84 100644 --- a/translations/bn/lessons/5-NLP/README.md +++ b/translations/bn/lessons/5-NLP/README.md @@ -1,51 +1,51 @@ -# প্রাকৃতিক ভাষা প্রক্রিয়াকরণ +# প্রাকৃতিক ভাষা প্রক্রিয়াকরণ -![NLP কাজগুলোর সারাংশ একটি ডুডলে](../../../../translated_images/bn/ai-nlp.b22dcb8ca4707cea.webp) +![দূডলে NLP কাজগুলোর সারাংশ](../../../../translated_images/bn/ai-nlp.b22dcb8ca4707cea.webp) -এই অংশে, আমরা **প্রাকৃতিক ভাষা প্রক্রিয়াকরণ (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) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসাধ্য সঠিক অনুবাদের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। নথিটির মূল ভাষায় থাকা সংস্করণটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে সৃষ্ট কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যার জন্য আমরা দায়ী নই। \ No newline at end of file +--- + + +**অস্বীকৃতি**: +এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনূদিত হয়েছে। যদিও আমরা শুদ্ধতার জন্য চেষ্টা করি, অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল নথিটি তার স্বভাষায় কর্তৃত্বপূর্ণ উৎস হিসেবে বিবেচিত হওয়া উচিত। গুরুত্বপূর্ণ তথ্যের জন্য পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদের ব্যবহারে প্রয়োজনীয় ভুল বোঝাবুঝি বা ভুল ব্যাখ্যার জন্য আমরা দায়বদ্ধ নই। + \ No newline at end of file diff --git a/translations/cs/.co-op-translator.json b/translations/cs/.co-op-translator.json index e770691383..3ef7728620 100644 --- a/translations/cs/.co-op-translator.json +++ b/translations/cs/.co-op-translator.json @@ -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" }, diff --git a/translations/cs/CONTRIBUTING.md b/translations/cs/CONTRIBUTING.md new file mode 100644 index 0000000000..35e1787817 --- /dev/null +++ b/translations/cs/CONTRIBUTING.md @@ -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). + +--- + + +**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. + \ No newline at end of file diff --git a/translations/cs/examples/README.md b/translations/cs/examples/README.md index 041f4bd076..9c7dd6cd81 100644 --- a/translations/cs/examples/README.md +++ b/translations/cs/examples/README.md @@ -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. \ No newline at end of file + +**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. + \ No newline at end of file diff --git a/translations/cs/lessons/0-course-setup/how-to-run.md b/translations/cs/lessons/0-course-setup/how-to-run.md index f881a23a3e..afdd4be007 100644 --- a/translations/cs/lessons/0-course-setup/how-to-run.md +++ b/translations/cs/lessons/0-course-setup/how-to-run.md @@ -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. --- -**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. \ No newline at end of file diff --git a/translations/cs/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/cs/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index 930761daf6..8f5569c21d 100644 --- a/translations/cs/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/cs/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -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\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\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, diff --git a/translations/cs/lessons/5-NLP/README.md b/translations/cs/lessons/5-NLP/README.md index 0f6e263da8..db1b37fdb8 100644 --- a/translations/cs/lessons/5-NLP/README.md +++ b/translations/cs/lessons/5-NLP/README.md @@ -1,51 +1,51 @@ # Zpracování přirozeného jazyka -![Shrnutí úkolů NLP na kresbě](../../../../translated_images/cs/ai-nlp.b22dcb8ca4707cea.webp) +![Shrnutí úkolů NLP ve skicáku](../../../../translated_images/cs/ai-nlp.b22dcb8ca4707cea.webp) -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. \ No newline at end of file +--- + + +**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. + \ No newline at end of file diff --git a/translations/da/.co-op-translator.json b/translations/da/.co-op-translator.json index a69c32bb93..03c3beef21 100644 --- a/translations/da/.co-op-translator.json +++ b/translations/da/.co-op-translator.json @@ -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" }, diff --git a/translations/da/CONTRIBUTING.md b/translations/da/CONTRIBUTING.md new file mode 100644 index 0000000000..e17a1d01c7 --- /dev/null +++ b/translations/da/CONTRIBUTING.md @@ -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). + +--- + + +**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. + \ No newline at end of file diff --git a/translations/da/examples/README.md b/translations/da/examples/README.md index 67eac5626f..814889995c 100644 --- a/translations/da/examples/README.md +++ b/translations/da/examples/README.md @@ -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. \ No newline at end of file + +**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. + \ No newline at end of file diff --git a/translations/da/lessons/0-course-setup/how-to-run.md b/translations/da/lessons/0-course-setup/how-to-run.md index ecabe398c1..9b10a34b9e 100644 --- a/translations/da/lessons/0-course-setup/how-to-run.md +++ b/translations/da/lessons/0-course-setup/how-to-run.md @@ -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. --- -**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. \ No newline at end of file diff --git a/translations/da/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/da/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index f6f1e26548..e83574f72c 100644 --- a/translations/da/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/da/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -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\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\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, diff --git a/translations/da/lessons/5-NLP/README.md b/translations/da/lessons/5-NLP/README.md index d9d6b46ebf..9c0fef65ae 100644 --- a/translations/da/lessons/5-NLP/README.md +++ b/translations/da/lessons/5-NLP/README.md @@ -1,51 +1,51 @@ -# Naturlig Sprogbehandling +# Naturlig Sprogbearbejdning ![Oversigt over NLP-opgaver i en doodle](../../../../translated_images/da/ai-nlp.b22dcb8ca4707cea.webp) -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. \ No newline at end of file + +**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. + \ No newline at end of file diff --git a/translations/de/.co-op-translator.json b/translations/de/.co-op-translator.json index eccc067853..0994551812 100644 --- a/translations/de/.co-op-translator.json +++ b/translations/de/.co-op-translator.json @@ -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" }, diff --git a/translations/de/CONTRIBUTING.md b/translations/de/CONTRIBUTING.md new file mode 100644 index 0000000000..aa020836e3 --- /dev/null +++ b/translations/de/CONTRIBUTING.md @@ -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). + +--- + + +**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. + \ No newline at end of file diff --git a/translations/de/examples/README.md b/translations/de/examples/README.md index 4738b23a74..cf89dba202 100644 --- a/translations/de/examples/README.md +++ b/translations/de/examples/README.md @@ -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. \ No newline at end of file + +**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. + \ No newline at end of file diff --git a/translations/de/lessons/0-course-setup/how-to-run.md b/translations/de/lessons/0-course-setup/how-to-run.md index 1016de8f6a..7e74ca83b4 100644 --- a/translations/de/lessons/0-course-setup/how-to-run.md +++ b/translations/de/lessons/0-course-setup/how-to-run.md @@ -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. --- -**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. \ No newline at end of file diff --git a/translations/de/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/de/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index 04fb8698b1..cb69cd19a2 100644 --- a/translations/de/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/de/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -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\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\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, diff --git a/translations/de/lessons/5-NLP/README.md b/translations/de/lessons/5-NLP/README.md index 9beb5e21ac..9b968b0ad6 100644 --- a/translations/de/lessons/5-NLP/README.md +++ b/translations/de/lessons/5-NLP/README.md @@ -1,69 +1,73 @@ # Verarbeitung natürlicher Sprache -![Zusammenfassung der NLP-Aufgaben in einer Skizze](../../../../lessons/sketchnotes/ai-nlp.png) +![Zusammenfassung der NLP-Aufgaben in einer Skizze](../../../../translated_images/de/ai-nlp.b22dcb8ca4707cea.webp) -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. \ No newline at end of file +--- + + +**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. + \ No newline at end of file diff --git a/translations/el/.co-op-translator.json b/translations/el/.co-op-translator.json index e7886cd0f1..31ced9dfea 100644 --- a/translations/el/.co-op-translator.json +++ b/translations/el/.co-op-translator.json @@ -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" }, diff --git a/translations/el/CONTRIBUTING.md b/translations/el/CONTRIBUTING.md new file mode 100644 index 0000000000..f284f3754c --- /dev/null +++ b/translations/el/CONTRIBUTING.md @@ -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](https://github.com/Azure/co-op-translator). Ενώ επιδιώκουμε την ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή λανθασμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. + \ No newline at end of file diff --git a/translations/el/examples/README.md b/translations/el/examples/README.md index 71dbe17b20..7c7f767f7c 100644 --- a/translations/el/examples/README.md +++ b/translations/el/examples/README.md @@ -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). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να γνωρίζετε ότι οι αυτόματες μεταφράσεις ενδέχεται να περιέχουν σφάλματα ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file + +**Αποποίηση ευθυνών**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία μετάφρασης με τεχνητή νοημοσύνη [Co-op Translator](https://github.com/Azure/co-op-translator). Ενώ επιδιώκουμε την ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή λανθασμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. + \ No newline at end of file diff --git a/translations/el/lessons/0-course-setup/how-to-run.md b/translations/el/lessons/0-course-setup/how-to-run.md index e609d49ecd..6200d8df16 100644 --- a/translations/el/lessons/0-course-setup/how-to-run.md +++ b/translations/el/lessons/0-course-setup/how-to-run.md @@ -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](https://github.com/Azure/co-op-translator). Ενώ προσπαθούμε για ακρίβεια, παρακαλούμε σημειώστε ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη γλώσσα προέλευσής του πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, προτείνεται η επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρανοήσεις ή λανθασμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. +**Αποποίηση ευθυνών**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία μετάφρασης με τεχνητή νοημοσύνη [Co-op Translator](https://github.com/Azure/co-op-translator). Ενώ επιδιώκουμε την ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή λανθασμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file diff --git a/translations/el/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/el/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index 7395b44e6c..a95fb1e639 100644 --- a/translations/el/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/el/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -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\n**Αποποίηση ευθυνών**:\nΑυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία μετάφρασης με τεχνητή νοημοσύνη [Co-op Translator](https://github.com/Azure/co-op-translator). Ενώ επιδιώκουμε την ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή λανθασμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.\n\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, diff --git a/translations/el/lessons/5-NLP/README.md b/translations/el/lessons/5-NLP/README.md index faea1243aa..a335182151 100644 --- a/translations/el/lessons/5-NLP/README.md +++ b/translations/el/lessons/5-NLP/README.md @@ -1,34 +1,34 @@ # Επεξεργασία Φυσικής Γλώσσας -![Περίληψη των εργασιών NLP σε ένα σκίτσο](../../../../translated_images/el/ai-nlp.b22dcb8ca4707cea.webp) +![Περίληψη εργασιών Επεξεργασίας Φυσικής Γλώσσας σε ένα σχέδιο](../../../../translated_images/el/ai-nlp.b22dcb8ca4707cea.webp) -Σε αυτή την ενότητα, θα επικεντρωθούμε στη χρήση Νευρωνικών Δικτύων για την αντιμετώπιση εργασιών που σχετίζονται με την **Επεξεργασία Φυσικής Γλώσσας (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). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτόματες μεταφράσεις ενδέχεται να περιέχουν σφάλματα ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file + +**Αποποίηση ευθυνών**: +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία μετάφρασης με τεχνητή νοημοσύνη [Co-op Translator](https://github.com/Azure/co-op-translator). Ενώ επιδιώκουμε την ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή λανθασμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. + \ No newline at end of file diff --git a/translations/el/lessons/6-Other/23-MultiagentSystems/README.md b/translations/el/lessons/6-Other/23-MultiagentSystems/README.md index 2b5b353b9d..5668190c4b 100644 --- a/translations/el/lessons/6-Other/23-MultiagentSystems/README.md +++ b/translations/el/lessons/6-Other/23-MultiagentSystems/README.md @@ -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**, και θα βρείτε πολλές κατηγορίες μοντέλων για επιλογή. Βιβλιοθήκη Μοντέλων NetLogo -> Στιγμιότυπο οθόνης της βιβλιοθήκης μοντέλων από τον Dmitry Soshnikov +> Ένα στιγμιότυπο της βιβλιοθήκης μοντέλων από τον Dmitry Soshnikov Μπορείτε να ανοίξετε ένα από τα μοντέλα, για παράδειγμα **Biology → Flocking**. ### Κύριες Αρχές -Αφού ανοίξετε το μοντέλο, μεταφέρεστε στην κύρια οθόνη του NetLogo. Εδώ είναι ένα δείγμα μοντέλου που περιγράφει τον πληθυσμό λύκων και προβάτων, δεδομένων πεπερασμένων πόρων (γρασίδι). +Μετά το άνοιγμα του μοντέλου, μεταφέρεστε στην κύρια οθόνη NetLogo. Ακολουθεί ένα δείγμα μοντέλου που περιγράφει τον πληθυσμό λύκων και προβάτων, με δεδομένους πεπερασμένους πόρους (χλόη). ![Κύρια Οθόνη NetLogo](../../../../../translated_images/el/NetLogo-Main.32653711ec1a01b3.webp) > Στιγμιότυπο οθόνης από τον 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](https://github.com/Azure/co-op-translator). Ενώ επιδιώκουμε την ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή λανθασμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. + \ No newline at end of file diff --git a/translations/es/.co-op-translator.json b/translations/es/.co-op-translator.json index 504b0a2144..ceaecfc242 100644 --- a/translations/es/.co-op-translator.json +++ b/translations/es/.co-op-translator.json @@ -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" }, diff --git a/translations/es/CONTRIBUTING.md b/translations/es/CONTRIBUTING.md new file mode 100644 index 0000000000..66d02927d8 --- /dev/null +++ b/translations/es/CONTRIBUTING.md @@ -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). + +--- + + +**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. + \ No newline at end of file diff --git a/translations/es/examples/README.md b/translations/es/examples/README.md index 213e8dace3..0822b4d504 100644 --- a/translations/es/examples/README.md +++ b/translations/es/examples/README.md @@ -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. \ No newline at end of file + +**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. + \ No newline at end of file diff --git a/translations/es/lessons/0-course-setup/how-to-run.md b/translations/es/lessons/0-course-setup/how-to-run.md index 5aa4c0c0ed..9f0a9ce9f4 100644 --- a/translations/es/lessons/0-course-setup/how-to-run.md +++ b/translations/es/lessons/0-course-setup/how-to-run.md @@ -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. --- -**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. \ No newline at end of file diff --git a/translations/es/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/es/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index 80061bbf96..0c14dee47f 100644 --- a/translations/es/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/es/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -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\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\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, diff --git a/translations/es/lessons/5-NLP/README.md b/translations/es/lessons/5-NLP/README.md index 0df5ef9f85..280a672cf3 100644 --- a/translations/es/lessons/5-NLP/README.md +++ b/translations/es/lessons/5-NLP/README.md @@ -1,34 +1,34 @@ # Procesamiento de Lenguaje Natural -![Resumen de tareas de PLN en un dibujo](../../../../lessons/sketchnotes/ai-nlp.png) +![Resumen de tareas de PLN en un garabato](../../../../translated_images/es/ai-nlp.b22dcb8ca4707cea.webp) -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. \ No newline at end of file +--- + + +**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. + \ No newline at end of file diff --git a/translations/et/.co-op-translator.json b/translations/et/.co-op-translator.json index 0a7922696b..12f3d41d5d 100644 --- a/translations/et/.co-op-translator.json +++ b/translations/et/.co-op-translator.json @@ -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" }, diff --git a/translations/et/CONTRIBUTING.md b/translations/et/CONTRIBUTING.md new file mode 100644 index 0000000000..3dfe77dcd2 --- /dev/null +++ b/translations/et/CONTRIBUTING.md @@ -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). + +--- + + +**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. + \ No newline at end of file diff --git a/translations/et/examples/README.md b/translations/et/examples/README.md index 96d774f7a9..0355ab5dd8 100644 --- a/translations/et/examples/README.md +++ b/translations/et/examples/README.md @@ -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. \ No newline at end of file + +**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. + \ No newline at end of file diff --git a/translations/et/lessons/0-course-setup/how-to-run.md b/translations/et/lessons/0-course-setup/how-to-run.md index 412bf8d9b6..4669e3ddb3 100644 --- a/translations/et/lessons/0-course-setup/how-to-run.md +++ b/translations/et/lessons/0-course-setup/how-to-run.md @@ -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. --- -**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. \ No newline at end of file diff --git a/translations/et/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/et/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index 5d971797a1..84b271b20b 100644 --- a/translations/et/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/et/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -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\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\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, diff --git a/translations/et/lessons/5-NLP/README.md b/translations/et/lessons/5-NLP/README.md index fdebe901da..ae1bab6e20 100644 --- a/translations/et/lessons/5-NLP/README.md +++ b/translations/et/lessons/5-NLP/README.md @@ -1,51 +1,51 @@ -# Loodusliku keele töötlemine +# Loomuliku Keele Töötlemine -![NLP ülesannete kokkuvõte visandis](../../../../translated_images/et/ai-nlp.b22dcb8ca4707cea.webp) +![NLP ülesannete kokkuvõte kriipsutamisel](../../../../translated_images/et/ai-nlp.b22dcb8ca4707cea.webp) -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. \ No newline at end of file + +**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. + \ No newline at end of file diff --git a/translations/fa/.co-op-translator.json b/translations/fa/.co-op-translator.json index 33d90c163b..8904b42b4a 100644 --- a/translations/fa/.co-op-translator.json +++ b/translations/fa/.co-op-translator.json @@ -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" }, diff --git a/translations/fa/CONTRIBUTING.md b/translations/fa/CONTRIBUTING.md new file mode 100644 index 0000000000..5134be377f --- /dev/null +++ b/translations/fa/CONTRIBUTING.md @@ -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](https://github.com/Azure/co-op-translator) ترجمه شده است. در حالی که ما در تلاش برای دقت هستیم، لطفاً توجه داشته باشید که ترجمه‌های خودکار ممکن است شامل خطاها یا نادرستی‌هایی باشند. سند اصلی به زبان مادری خود باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حیاتی، ترجمه حرفه‌ای انسانی توصیه می‌شود. ما در قبال هرگونه سوء تفاهم یا برداشت نادرست ناشی از استفاده از این ترجمه مسئولیتی نداریم. + \ No newline at end of file diff --git a/translations/fa/examples/README.md b/translations/fa/examples/README.md index 0211c931ab..9ed2daf51d 100644 --- a/translations/fa/examples/README.md +++ b/translations/fa/examples/README.md @@ -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) ترجمه شده است. در حالی که ما تلاش می‌کنیم دقت را حفظ کنیم، لطفاً توجه داشته باشید که ترجمه‌های خودکار ممکن است شامل خطاها یا نادرستی‌ها باشند. سند اصلی به زبان اصلی آن باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حساس، توصیه می‌شود از ترجمه حرفه‌ای انسانی استفاده کنید. ما مسئولیتی در قبال سوء تفاهم‌ها یا تفسیرهای نادرست ناشی از استفاده از این ترجمه نداریم. \ No newline at end of file + +**سلب مسئولیت**: +این سند با استفاده از سرویس ترجمه هوش مصنوعی [Co-op Translator](https://github.com/Azure/co-op-translator) ترجمه شده است. در حالی که ما در تلاش برای دقت هستیم، لطفاً توجه داشته باشید که ترجمه‌های خودکار ممکن است شامل خطاها یا نادرستی‌هایی باشند. سند اصلی به زبان مادری خود باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حیاتی، ترجمه حرفه‌ای انسانی توصیه می‌شود. ما در قبال هرگونه سوء تفاهم یا برداشت نادرست ناشی از استفاده از این ترجمه مسئولیتی نداریم. + \ No newline at end of file diff --git a/translations/fa/lessons/0-course-setup/how-to-run.md b/translations/fa/lessons/0-course-setup/how-to-run.md index a593a12bca..c813d81c09 100644 --- a/translations/fa/lessons/0-course-setup/how-to-run.md +++ b/translations/fa/lessons/0-course-setup/how-to-run.md @@ -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 است و نوت‌بوک‌های جیوپیتر را یک به یک آنجا آپلود و اجرا کنید. --- -**سلب مسئولیت**: -این سند با استفاده از خدمات ترجمه ماشین (AI) [Co-op Translator](https://github.com/Azure/co-op-translator) ترجمه شده است. در حالی که ما برای دقت تلاش می‌کنیم، لطفاً آگاه باشید که ترجمه‌های خودکار ممکن است حاوی خطاها یا نواقصی باشند. سند اصلی به زبان بومی آن باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حیاتی، ترجمه حرفه‌ای انسانی توصیه می‌شود. ما مسئول هیچ گونه سوءتفاهم یا تفسیر نادرستی که از استفاده این ترجمه ناشی شود، نیستیم. +**سلب مسئولیت**: +این سند با استفاده از سرویس ترجمه هوش مصنوعی [Co-op Translator](https://github.com/Azure/co-op-translator) ترجمه شده است. در حالی که ما در تلاش برای دقت هستیم، لطفاً توجه داشته باشید که ترجمه‌های خودکار ممکن است شامل خطاها یا نادرستی‌هایی باشند. سند اصلی به زبان مادری خود باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حیاتی، ترجمه حرفه‌ای انسانی توصیه می‌شود. ما در قبال هرگونه سوء تفاهم یا برداشت نادرست ناشی از استفاده از این ترجمه مسئولیتی نداریم. \ No newline at end of file diff --git a/translations/fa/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/fa/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index 70a0429147..bc770b0a76 100644 --- a/translations/fa/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/fa/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -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\n**سلب مسئولیت**:\nاین سند با استفاده از سرویس ترجمه هوش مصنوعی [Co-op Translator](https://github.com/Azure/co-op-translator) ترجمه شده است. در حالی که ما در تلاش برای دقت هستیم، لطفاً توجه داشته باشید که ترجمه‌های خودکار ممکن است شامل خطاها یا نادرستی‌هایی باشند. سند اصلی به زبان مادری خود باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حیاتی، ترجمه حرفه‌ای انسانی توصیه می‌شود. ما در قبال هرگونه سوء تفاهم یا برداشت نادرست ناشی از استفاده از این ترجمه مسئولیتی نداریم.\n\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, diff --git a/translations/fa/lessons/5-NLP/README.md b/translations/fa/lessons/5-NLP/README.md index 643df0e091..37094056cd 100644 --- a/translations/fa/lessons/5-NLP/README.md +++ b/translations/fa/lessons/5-NLP/README.md @@ -1,69 +1,73 @@ # پردازش زبان طبیعی -![خلاصه‌ای از وظایف NLP در یک طرح](../../../../lessons/sketchnotes/ai-nlp.png) +![خلاصه‌ای از وظایف پردازش زبان طبیعی در یک نقاشی](../../../../translated_images/fa/ai-nlp.b22dcb8ca4707cea.webp) -در این بخش، ما بر استفاده از شبکه‌های عصبی برای انجام وظایف مرتبط با **پردازش زبان طبیعی (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) ترجمه شده است. در حالی که ما تلاش می‌کنیم دقت را حفظ کنیم، لطفاً توجه داشته باشید که ترجمه‌های خودکار ممکن است حاوی خطاها یا نادرستی‌هایی باشند. سند اصلی به زبان اصلی آن باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حساس، ترجمه حرفه‌ای انسانی توصیه می‌شود. ما هیچ مسئولیتی در قبال سوءتفاهم‌ها یا تفسیرهای نادرست ناشی از استفاده از این ترجمه نداریم. \ No newline at end of file +--- + + +**سلب مسئولیت**: +این سند با استفاده از سرویس ترجمه هوش مصنوعی [Co-op Translator](https://github.com/Azure/co-op-translator) ترجمه شده است. در حالی که ما در تلاش برای دقت هستیم، لطفاً توجه داشته باشید که ترجمه‌های خودکار ممکن است شامل خطاها یا نادرستی‌هایی باشند. سند اصلی به زبان مادری خود باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حیاتی، ترجمه حرفه‌ای انسانی توصیه می‌شود. ما در قبال هرگونه سوء تفاهم یا برداشت نادرست ناشی از استفاده از این ترجمه مسئولیتی نداریم. + \ No newline at end of file diff --git a/translations/fi/.co-op-translator.json b/translations/fi/.co-op-translator.json index 48a6e50d26..e642bc89f6 100644 --- a/translations/fi/.co-op-translator.json +++ b/translations/fi/.co-op-translator.json @@ -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" }, diff --git a/translations/fi/CONTRIBUTING.md b/translations/fi/CONTRIBUTING.md new file mode 100644 index 0000000000..32c1d88fb9 --- /dev/null +++ b/translations/fi/CONTRIBUTING.md @@ -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). + +--- + + +**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. + \ No newline at end of file diff --git a/translations/fi/examples/README.md b/translations/fi/examples/README.md index ecd3fe4053..21dd6bb1bf 100644 --- a/translations/fi/examples/README.md +++ b/translations/fi/examples/README.md @@ -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ä. \ No newline at end of file + +**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. + \ No newline at end of file diff --git a/translations/fi/lessons/0-course-setup/how-to-run.md b/translations/fi/lessons/0-course-setup/how-to-run.md index f38cf3e6f3..df6d6d7882 100644 --- a/translations/fi/lessons/0-course-setup/how-to-run.md +++ b/translations/fi/lessons/0-course-setup/how-to-run.md @@ -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. --- **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. \ No newline at end of file diff --git a/translations/fi/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/fi/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index c15240fd21..a580133f1e 100644 --- a/translations/fi/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/fi/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -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 konvoluutio­kerrosten 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 konvoluutio­kerroksissa.\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\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\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, diff --git a/translations/fi/lessons/5-NLP/README.md b/translations/fi/lessons/5-NLP/README.md index 0e41b28d4a..af605e46d2 100644 --- a/translations/fi/lessons/5-NLP/README.md +++ b/translations/fi/lessons/5-NLP/README.md @@ -1,51 +1,51 @@ # Luonnollisen kielen käsittely -![Yhteenveto NLP-tehtävistä doodlena](../../../../translated_images/fi/ai-nlp.b22dcb8ca4707cea.webp) +![Yhteenveto NLP-tehtävistä piirroksena](../../../../translated_images/fi/ai-nlp.b22dcb8ca4707cea.webp) -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ä. \ No newline at end of file + +**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. + \ No newline at end of file diff --git a/translations/fr/.co-op-translator.json b/translations/fr/.co-op-translator.json index 590de07a64..a3f73104b8 100644 --- a/translations/fr/.co-op-translator.json +++ b/translations/fr/.co-op-translator.json @@ -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" }, diff --git a/translations/fr/CONTRIBUTING.md b/translations/fr/CONTRIBUTING.md new file mode 100644 index 0000000000..532959b44d --- /dev/null +++ b/translations/fr/CONTRIBUTING.md @@ -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). + +--- + + +**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. + \ No newline at end of file diff --git a/translations/fr/examples/README.md b/translations/fr/examples/README.md index b748d1f39c..62cf83dfb2 100644 --- a/translations/fr/examples/README.md +++ b/translations/fr/examples/README.md @@ -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. \ No newline at end of file + +**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. + \ No newline at end of file diff --git a/translations/fr/lessons/0-course-setup/how-to-run.md b/translations/fr/lessons/0-course-setup/how-to-run.md index 95f32fee0c..e5cdedffd0 100644 --- a/translations/fr/lessons/0-course-setup/how-to-run.md +++ b/translations/fr/lessons/0-course-setup/how-to-run.md @@ -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. --- -**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. \ No newline at end of file diff --git a/translations/fr/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/fr/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index 866eb0639c..60b3486663 100644 --- a/translations/fr/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/fr/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -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\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\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, diff --git a/translations/fr/lessons/5-NLP/README.md b/translations/fr/lessons/5-NLP/README.md index 233e2add19..b3d3529615 100644 --- a/translations/fr/lessons/5-NLP/README.md +++ b/translations/fr/lessons/5-NLP/README.md @@ -1,69 +1,73 @@ # Traitement du Langage Naturel -![Résumé des tâches NLP dans un croquis](../../../../translated_images/fr/ai-nlp.b22dcb8ca4707cea.webp) +![Résumé des tâches du TLN dans un croquis](../../../../translated_images/fr/ai-nlp.b22dcb8ca4707cea.webp) -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. \ No newline at end of file +--- + + +**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. + \ No newline at end of file diff --git a/translations/he/.co-op-translator.json b/translations/he/.co-op-translator.json index 02b2e603d9..f66cd4d0a6 100644 --- a/translations/he/.co-op-translator.json +++ b/translations/he/.co-op-translator.json @@ -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" }, diff --git a/translations/he/CONTRIBUTING.md b/translations/he/CONTRIBUTING.md new file mode 100644 index 0000000000..d58b144091 --- /dev/null +++ b/translations/he/CONTRIBUTING.md @@ -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](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עלולים להכיל שגיאות או אי-דיוקים. יש להחשיב את המסמך המקורי בשפתו הטבעית כמקור הסמכות. למידע קריטי מומלץ להשתמש בתרגום מקצועי על ידי מתרגם אדם. אנו לא אחראים לכל אי-הבנה או פירוש שגוי הנובע מהשימוש בתרגום זה. + \ No newline at end of file diff --git a/translations/he/examples/README.md b/translations/he/examples/README.md index 8d166431c9..cb2855a5e1 100644 --- a/translations/he/examples/README.md +++ b/translations/he/examples/README.md @@ -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). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור הסמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה. \ No newline at end of file + +**כתב ויתור**: +מסמך זה תורגם באמצעות שירות תרגום אוטומטי [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עלולים להכיל שגיאות או אי-דיוקים. יש להחשיב את המסמך המקורי בשפתו הטבעית כמקור הסמכות. למידע קריטי מומלץ להשתמש בתרגום מקצועי על ידי מתרגם אדם. אנו לא אחראים לכל אי-הבנה או פירוש שגוי הנובע מהשימוש בתרגום זה. + \ No newline at end of file diff --git a/translations/he/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/he/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index ea1f1f16f8..6344ab279a 100644 --- a/translations/he/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/he/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -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\n**כתב ויתור**:\nמסמך זה תורגם באמצעות שירות תרגום אוטומטי [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עלולים להכיל שגיאות או אי-דיוקים. יש להחשיב את המסמך המקורי בשפתו הטבעית כמקור הסמכות. למידע קריטי מומלץ להשתמש בתרגום מקצועי על ידי מתרגם אדם. אנו לא אחראים לכל אי-הבנה או פירוש שגוי הנובע מהשימוש בתרגום זה.\n\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, diff --git a/translations/he/lessons/5-NLP/README.md b/translations/he/lessons/5-NLP/README.md index 53d366ac80..789f48c688 100644 --- a/translations/he/lessons/5-NLP/README.md +++ b/translations/he/lessons/5-NLP/README.md @@ -1,44 +1,36 @@ # עיבוד שפה טבעית -![סיכום משימות NLP בציור](../../../../translated_images/he/ai-nlp.b22dcb8ca4707cea.webp) +![סיכום משימות NLP ברישום](../../../../translated_images/he/ai-nlp.b22dcb8ca4707cea.webp) -בפרק זה נתמקד בשימוש ברשתות נוירונים לטיפול במשימות הקשורות ל**עיבוד שפה טבעית (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). בעוד שאנו שואפים לדיוק, יש להיות מודעים לכך שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה. \ No newline at end of file + +**כתב ויתור**: +מסמך זה תורגם באמצעות שירות תרגום אוטומטי [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עלולים להכיל שגיאות או אי-דיוקים. יש להחשיב את המסמך המקורי בשפתו הטבעית כמקור הסמכות. למידע קריטי מומלץ להשתמש בתרגום מקצועי על ידי מתרגם אדם. אנו לא אחראים לכל אי-הבנה או פירוש שגוי הנובע מהשימוש בתרגום זה. + \ No newline at end of file diff --git a/translations/hi/.co-op-translator.json b/translations/hi/.co-op-translator.json index 68549b3e1f..fb173ab27d 100644 --- a/translations/hi/.co-op-translator.json +++ b/translations/hi/.co-op-translator.json @@ -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" }, diff --git a/translations/hi/CONTRIBUTING.md b/translations/hi/CONTRIBUTING.md new file mode 100644 index 0000000000..e4524bcdd0 --- /dev/null +++ b/translations/hi/CONTRIBUTING.md @@ -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)। + +--- + + +**अस्वीकरण**: +इस दस्तावेज़ का अनुवाद AI अनुवाद सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) का उपयोग करके किया गया है। जबकि हम सटीकता के लिए प्रयास करते हैं, कृपया ध्यान दें कि स्वचालित अनुवादों में त्रुटियाँ या अशुद्धियाँ हो सकती हैं। मूल दस्तावेज़ अपनी मूल भाषा में ही प्रामाणिक स्रोत माना जाना चाहिए। महत्वपूर्ण जानकारी के लिए, पेशेवर मानव अनुवाद की सिफारिश की जाती है। इस अनुवाद के उपयोग से उत्पन्न किसी भी गलतफहमी या गलत व्याख्या के लिए हम उत्तरदायी नहीं हैं। + \ No newline at end of file diff --git a/translations/hi/examples/README.md b/translations/hi/examples/README.md index cc33382cee..c44f72419f 100644 --- a/translations/hi/examples/README.md +++ b/translations/hi/examples/README.md @@ -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) का उपयोग करके अनुवादित किया गया है। जबकि हम सटीकता के लिए प्रयास करते हैं, कृपया ध्यान दें कि स्वचालित अनुवाद में त्रुटियां या अशुद्धियां हो सकती हैं। मूल भाषा में उपलब्ध मूल दस्तावेज़ को आधिकारिक स्रोत माना जाना चाहिए। महत्वपूर्ण जानकारी के लिए, पेशेवर मानव अनुवाद की सिफारिश की जाती है। इस अनुवाद के उपयोग से उत्पन्न किसी भी गलतफहमी या गलत व्याख्या के लिए हम उत्तरदायी नहीं हैं। \ No newline at end of file + +**अस्वीकरण**: +इस दस्तावेज़ का अनुवाद AI अनुवाद सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) का उपयोग करके किया गया है। जबकि हम सटीकता के लिए प्रयास करते हैं, कृपया ध्यान दें कि स्वचालित अनुवादों में त्रुटियाँ या अशुद्धियाँ हो सकती हैं। मूल दस्तावेज़ अपनी मूल भाषा में ही प्रामाणिक स्रोत माना जाना चाहिए। महत्वपूर्ण जानकारी के लिए, पेशेवर मानव अनुवाद की सिफारिश की जाती है। इस अनुवाद के उपयोग से उत्पन्न किसी भी गलतफहमी या गलत व्याख्या के लिए हम उत्तरदायी नहीं हैं। + \ No newline at end of file diff --git a/translations/hi/lessons/0-course-setup/how-to-run.md b/translations/hi/lessons/0-course-setup/how-to-run.md index 31bfdc456f..887c31fced 100644 --- a/translations/hi/lessons/0-course-setup/how-to-run.md +++ b/translations/hi/lessons/0-course-setup/how-to-run.md @@ -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](https://github.com/Azure/co-op-translator) का उपयोग करके अनुवादित किया गया है। जबकि हम सटीकता के लिए प्रयासरत हैं, कृपया ध्यान दें कि स्वचालित अनुवादों में त्रुटियाँ या असत्यताएं हो सकती हैं। मूल दस्तावेज़ अपनी मूल भाषा में प्रामाणिक स्रोत माना जाना चाहिए। महत्वपूर्ण जानकारी के लिए, पेशेवर मानव अनुवाद की सिफारिश की जाती है। इस अनुवाद के उपयोग से उत्पन्न किसी भी गलतफहमी या गलत व्याख्या के लिए हम ज़िम्मेदार नहीं हैं। +इस दस्तावेज़ का अनुवाद AI अनुवाद सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) का उपयोग करके किया गया है। जबकि हम सटीकता के लिए प्रयास करते हैं, कृपया ध्यान दें कि स्वचालित अनुवादों में त्रुटियाँ या अशुद्धियाँ हो सकती हैं। मूल दस्तावेज़ अपनी मूल भाषा में ही प्रामाणिक स्रोत माना जाना चाहिए। महत्वपूर्ण जानकारी के लिए, पेशेवर मानव अनुवाद की सिफारिश की जाती है। इस अनुवाद के उपयोग से उत्पन्न किसी भी गलतफहमी या गलत व्याख्या के लिए हम उत्तरदायी नहीं हैं। \ No newline at end of file diff --git a/translations/hi/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/hi/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index 90093b7204..6b0c3968a6 100644 --- a/translations/hi/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/hi/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -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\n**अस्वीकरण**:\nइस दस्तावेज़ का अनुवाद AI अनुवाद सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) का उपयोग करके किया गया है। जबकि हम सटीकता के लिए प्रयास करते हैं, कृपया ध्यान दें कि स्वचालित अनुवादों में त्रुटियाँ या अशुद्धियाँ हो सकती हैं। मूल दस्तावेज़ अपनी मूल भाषा में ही प्रामाणिक स्रोत माना जाना चाहिए। महत्वपूर्ण जानकारी के लिए, पेशेवर मानव अनुवाद की सिफारिश की जाती है। इस अनुवाद के उपयोग से उत्पन्न किसी भी गलतफहमी या गलत व्याख्या के लिए हम उत्तरदायी नहीं हैं।\n\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, diff --git a/translations/hi/lessons/5-NLP/README.md b/translations/hi/lessons/5-NLP/README.md index 7f1b247d9e..53b57a1b02 100644 --- a/translations/hi/lessons/5-NLP/README.md +++ b/translations/hi/lessons/5-NLP/README.md @@ -1,69 +1,73 @@ # प्राकृतिक भाषा प्रसंस्करण -![NLP कार्यों का एक स्केच](../../../../lessons/sketchnotes/ai-nlp.png) +![एनएलपी कार्यों का सारांश एक डूडल में](../../../../translated_images/hi/ai-nlp.b22dcb8ca4707cea.webp) -इस खंड में, हम **प्राकृतिक भाषा प्रसंस्करण (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) का उपयोग करके अनुवादित किया गया है। जबकि हम सटीकता के लिए प्रयासरत हैं, कृपया ध्यान दें कि स्वचालित अनुवाद में त्रुटियां या अशुद्धियां हो सकती हैं। मूल भाषा में उपलब्ध मूल दस्तावेज़ को प्रामाणिक स्रोत माना जाना चाहिए। महत्वपूर्ण जानकारी के लिए, पेशेवर मानव अनुवाद की सिफारिश की जाती है। इस अनुवाद के उपयोग से उत्पन्न किसी भी गलतफहमी या गलत व्याख्या के लिए हम उत्तरदायी नहीं हैं। \ No newline at end of file +--- + + +**अस्वीकरण**: +इस दस्तावेज़ का अनुवाद AI अनुवाद सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) का उपयोग करके किया गया है। जबकि हम सटीकता के लिए प्रयास करते हैं, कृपया ध्यान दें कि स्वचालित अनुवादों में त्रुटियाँ या अशुद्धियाँ हो सकती हैं। मूल दस्तावेज़ अपनी मूल भाषा में ही प्रामाणिक स्रोत माना जाना चाहिए। महत्वपूर्ण जानकारी के लिए, पेशेवर मानव अनुवाद की सिफारिश की जाती है। इस अनुवाद के उपयोग से उत्पन्न किसी भी गलतफहमी या गलत व्याख्या के लिए हम उत्तरदायी नहीं हैं। + \ No newline at end of file diff --git a/translations/hi/lessons/6-Other/23-MultiagentSystems/README.md b/translations/hi/lessons/6-Other/23-MultiagentSystems/README.md index c39cd1a9ba..63d719087a 100644 --- a/translations/hi/lessons/6-Other/23-MultiagentSystems/README.md +++ b/translations/hi/lessons/6-Other/23-MultiagentSystems/README.md @@ -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** पर जाएं, और आपके पास चुनने के लिए कई मॉडल श्रेणियां होंगी। NetLogo Models Library -> दिमित्री सोश्निकोव द्वारा मॉडल्स लाइब्रेरी का स्क्रीनशॉट +> दिमित्रि सोश्निकोव द्वारा मॉडल लाइब्रेरी का स्क्रीनशॉट आप एक मॉडल खोल सकते हैं, उदाहरण के लिए **Biology → Flocking**। ### मुख्य सिद्धांत -मॉडल खोलने के बाद, आप मुख्य NetLogo स्क्रीन पर ले जाए जाते हैं। यहां एक नमूना मॉडल है जो सीमित संसाधनों (घास) को ध्यान में रखते हुए भेड़ियों और भेड़ों की आबादी का वर्णन करता है। +मॉडल खोलने के बाद, आप मुख्य NetLogo स्क्रीन पर ले जाए जाते हैं। यहाँ एक नमूना मॉडल है जो भेड़ियों और भेड़ों की आबादी का वर्णन करता है, सीमित संसाधनों (घास) के साथ। ![NetLogo Main Screen](../../../../../translated_images/hi/NetLogo-Main.32653711ec1a01b3.webp) -> दिमित्री सोश्निकोव द्वारा स्क्रीनशॉट +> दिमित्रि सोश्निकोव द्वारा स्क्रीनशॉट इस स्क्रीन पर, आप देख सकते हैं: * **इंटरफेस** सेक्शन जिसमें शामिल हैं: - - मुख्य क्षेत्र, जहां सभी एजेंट रहते हैं - - विभिन्न नियंत्रण: बटन, स्लाइडर्स, आदि। - - ग्राफ़ जो आप सिमुलेशन के पैरामीटर प्रदर्शित करने के लिए उपयोग कर सकते हैं -* **कोड** टैब जिसमें संपादक होता है, जहां आप 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) --- + +**अस्वीकरण**: +इस दस्तावेज़ का अनुवाद AI अनुवाद सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) का उपयोग करके किया गया है। जबकि हम सटीकता के लिए प्रयास करते हैं, कृपया ध्यान दें कि स्वचालित अनुवादों में त्रुटियाँ या अशुद्धियाँ हो सकती हैं। मूल दस्तावेज़ अपनी मूल भाषा में ही प्रामाणिक स्रोत माना जाना चाहिए। महत्वपूर्ण जानकारी के लिए, पेशेवर मानव अनुवाद की सिफारिश की जाती है। इस अनुवाद के उपयोग से उत्पन्न किसी भी गलतफहमी या गलत व्याख्या के लिए हम उत्तरदायी नहीं हैं। + \ No newline at end of file diff --git a/translations/hr/.co-op-translator.json b/translations/hr/.co-op-translator.json index 19e37357f6..7395b1c82b 100644 --- a/translations/hr/.co-op-translator.json +++ b/translations/hr/.co-op-translator.json @@ -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" }, diff --git a/translations/hr/CONTRIBUTING.md b/translations/hr/CONTRIBUTING.md new file mode 100644 index 0000000000..e1a2024ec3 --- /dev/null +++ b/translations/hr/CONTRIBUTING.md @@ -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). + +--- + + +**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. + \ No newline at end of file diff --git a/translations/hr/examples/README.md b/translations/hr/examples/README.md index 9399178d5c..49e1df137f 100644 --- a/translations/hr/examples/README.md +++ b/translations/hr/examples/README.md @@ -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. \ No newline at end of file + +**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. + \ No newline at end of file diff --git a/translations/hr/lessons/0-course-setup/how-to-run.md b/translations/hr/lessons/0-course-setup/how-to-run.md index 837cf6791e..9d593197ab 100644 --- a/translations/hr/lessons/0-course-setup/how-to-run.md +++ b/translations/hr/lessons/0-course-setup/how-to-run.md @@ -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. --- -**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. \ No newline at end of file diff --git a/translations/hr/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/hr/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index 7c9634687e..778e8e21b0 100644 --- a/translations/hr/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/hr/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -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\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\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, diff --git a/translations/hr/lessons/5-NLP/README.md b/translations/hr/lessons/5-NLP/README.md index e5fc75b5ed..349e15d5df 100644 --- a/translations/hr/lessons/5-NLP/README.md +++ b/translations/hr/lessons/5-NLP/README.md @@ -1,51 +1,51 @@ # Obrada Prirodnog Jezika -![Sažetak NLP zadataka u crtežu](../../../../translated_images/hr/ai-nlp.b22dcb8ca4707cea.webp) +![Sažetak NLP zadataka u doodle-u](../../../../translated_images/hr/ai-nlp.b22dcb8ca4707cea.webp) -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. \ No newline at end of file +--- + + +**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. + \ No newline at end of file diff --git a/translations/hu/.co-op-translator.json b/translations/hu/.co-op-translator.json index 15a7b0fdab..0826baae7a 100644 --- a/translations/hu/.co-op-translator.json +++ b/translations/hu/.co-op-translator.json @@ -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" }, diff --git a/translations/hu/CONTRIBUTING.md b/translations/hu/CONTRIBUTING.md new file mode 100644 index 0000000000..f5eb3915e1 --- /dev/null +++ b/translations/hu/CONTRIBUTING.md @@ -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). + +--- + + +**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. + \ No newline at end of file diff --git a/translations/hu/examples/README.md b/translations/hu/examples/README.md index 6c6e1b55da..6768937b01 100644 --- a/translations/hu/examples/README.md +++ b/translations/hu/examples/README.md @@ -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. \ No newline at end of file + +**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. + \ No newline at end of file diff --git a/translations/hu/lessons/0-course-setup/how-to-run.md b/translations/hu/lessons/0-course-setup/how-to-run.md index c6b7c1e9c1..659d5e5c6a 100644 --- a/translations/hu/lessons/0-course-setup/how-to-run.md +++ b/translations/hu/lessons/0-course-setup/how-to-run.md @@ -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. --- **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. \ No newline at end of file diff --git a/translations/hu/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/hu/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index a613976fa0..3610e67296 100644 --- a/translations/hu/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/hu/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -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\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\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, diff --git a/translations/hu/lessons/5-NLP/README.md b/translations/hu/lessons/5-NLP/README.md index c900ccda3f..5badc0125d 100644 --- a/translations/hu/lessons/5-NLP/README.md +++ b/translations/hu/lessons/5-NLP/README.md @@ -1,51 +1,51 @@ -# Természetes Nyelvfeldolgozás +# Természetes Nyelv Feldolgozás -![Összefoglaló az NLP feladatokról egy rajzban](../../../../translated_images/hu/ai-nlp.b22dcb8ca4707cea.webp) +![Összefoglaló az NLP feladatokról egy firkán](../../../../translated_images/hu/ai-nlp.b22dcb8ca4707cea.webp) -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. \ No newline at end of file +--- + + +**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. + \ No newline at end of file diff --git a/translations/hu/lessons/6-Other/23-MultiagentSystems/README.md b/translations/hu/lessons/6-Other/23-MultiagentSystems/README.md index 69fa878f04..171b37eb20 100644 --- a/translations/hu/lessons/6-Other/23-MultiagentSystems/README.md +++ b/translations/hu/lessons/6-Other/23-MultiagentSystems/README.md @@ -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. NetLogo Models Library -> 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. -![NetLogo Main Screen](../../../../../translated_images/hu/NetLogo-Main.32653711ec1a01b3.webp) +![NetLogo Főképernyő](../../../../../translated_images/hu/NetLogo-Main.32653711ec1a01b3.webp) -> 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) --- + +**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. + \ No newline at end of file diff --git a/translations/id/.co-op-translator.json b/translations/id/.co-op-translator.json index 2301d21a93..ffffd4d0fa 100644 --- a/translations/id/.co-op-translator.json +++ b/translations/id/.co-op-translator.json @@ -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" }, diff --git a/translations/id/CONTRIBUTING.md b/translations/id/CONTRIBUTING.md new file mode 100644 index 0000000000..b75ebb2eb2 --- /dev/null +++ b/translations/id/CONTRIBUTING.md @@ -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). + +--- + + +**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. + \ No newline at end of file diff --git a/translations/id/examples/README.md b/translations/id/examples/README.md index 1b7017b032..71923b1546 100644 --- a/translations/id/examples/README.md +++ b/translations/id/examples/README.md @@ -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. \ No newline at end of file + +**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. + \ No newline at end of file diff --git a/translations/id/lessons/0-course-setup/how-to-run.md b/translations/id/lessons/0-course-setup/how-to-run.md index 79901a5b11..9a6cbe9849 100644 --- a/translations/id/lessons/0-course-setup/how-to-run.md +++ b/translations/id/lessons/0-course-setup/how-to-run.md @@ -1,10 +1,10 @@ # Cara Menjalankan Kode -Kurikulum ini berisi banyak contoh dan lab yang dapat dieksekusi yang ingin Anda jalankan. Untuk melakukan ini, Anda memerlukan kemampuan untuk menjalankan kode Python di Jupyter Notebooks yang disediakan sebagai bagian dari kurikulum ini. Anda memiliki beberapa opsi untuk menjalankan kodenya: +Kurikulum ini berisi banyak contoh dan lab yang dapat dijalankan yang mungkin ingin Anda jalankan. Untuk melakukan ini, Anda memerlukan kemampuan menjalankan kode Python di Jupyter Notebooks yang disediakan sebagai bagian dari kurikulum ini. Anda memiliki beberapa opsi untuk menjalankan kode: ## Menjalankan secara lokal di komputer Anda -Untuk menjalankan kode secara lokal di komputer Anda, diperlukan instalasi Python. Salah satu rekomendasinya adalah menginstal **[miniconda](https://conda.io/en/latest/miniconda.html)** - ini adalah instalasi yang relatif ringan yang mendukung pengelola paket `conda` untuk berbagai **lingkungan virtual** Python. +Untuk menjalankan kode secara lokal di komputer Anda, diperlukan instalasi Python. Salah satu rekomendasinya adalah menginstal **[miniconda](https://conda.io/en/latest/miniconda.html)** - ini adalah instalasi yang cukup ringan yang mendukung pengelola paket `conda` untuk berbagai **lingkungan virtual** Python. Setelah Anda menginstal miniconda, kloning repositori dan buat lingkungan virtual yang akan digunakan untuk kursus ini: @@ -21,13 +21,13 @@ Kurikulum ini paling baik digunakan saat membukanya di [Visual Studio Code](http > **Catatan**: Setelah Anda mengkloning dan membuka direktori di VS Code, secara otomatis akan menyarankan Anda untuk menginstal ekstensi Python. Anda juga perlu menginstal miniconda seperti yang dijelaskan di atas. -> **Catatan**: Jika VS Code menyarankan Anda untuk membuka kembali repositori dalam sebuah kontainer, Anda harus menolak ini untuk menggunakan instalasi Python lokal. +> **Catatan**: Jika VS Code menyarankan untuk membuka kembali repositori dalam sebuah kontainer, Anda harus menolak ini untuk menggunakan instalasi Python lokal. -### Menggunakan Jupyter di Peramban +### Menggunakan Jupyter di Browser -Anda juga dapat menggunakan lingkungan Jupyter dari peramban di komputer Anda sendiri. Baik Jupyter klasik maupun JupyterHub menyediakan lingkungan pengembangan yang nyaman dengan fitur pelengkapan otomatis, penyorotan kode, dll. +Anda juga dapat menggunakan lingkungan Jupyter dari browser di komputer Anda sendiri. Baik Jupyter klasik maupun JupyterHub menyediakan lingkungan pengembangan yang nyaman dengan auto-completion, penyorotan kode, dll. -Untuk memulai Jupyter secara lokal, buka direktori kursus, dan jalankan: +Untuk memulai Jupyter secara lokal, pergi ke direktori kursus, dan jalankan: ```bash jupyter notebook @@ -38,34 +38,34 @@ jupyterhub ``` Kemudian Anda dapat menavigasi ke salah satu file `.ipynb`, membukanya, dan mulai bekerja. -### Menjalankan dalam kontainer +### Menjalankan di dalam kontainer -Alternatif lain untuk instalasi Python adalah menjalankan kode dalam sebuah kontainer. Karena repositori kami menyediakan folder khusus `.devcontainer` yang menunjukkan cara membangun kontainer untuk repositori ini, VS Code menawarkan kesempatan untuk membuka kembali kode di dalam kontainer. Ini memerlukan instalasi Docker, dan juga akan lebih kompleks, sehingga kami merekomendasikan ini untuk pengguna yang lebih berpengalaman. +Alternatif lain untuk instalasi Python adalah menjalankan kode dalam kontainer. Karena repositori kami menyediakan folder khusus `.devcontainer` yang mengarahkan bagaimana membangun kontainer untuk repo ini, VS Code menawarkan kesempatan untuk membuka ulang kode di dalam kontainer. Ini memerlukan instalasi Docker, dan juga akan lebih kompleks, jadi kami merekomendasikan hal ini untuk pengguna yang lebih berpengalaman. ## Menjalankan di Cloud -Jika Anda tidak ingin menginstal Python secara lokal, dan memiliki akses ke beberapa sumber daya cloud - alternatif yang baik adalah menjalankan kode di cloud. Ada beberapa cara yang bisa Anda lakukan: +Jika Anda tidak ingin menginstal Python secara lokal, dan memiliki akses ke beberapa sumber daya cloud - alternatif yang baik adalah menjalankan kode di cloud. Ada beberapa cara yang dapat Anda lakukan ini: -* Menggunakan **[GitHub Codespaces](https://github.com/features/codespaces)**, yang merupakan lingkungan virtual yang dibuat untuk Anda di GitHub, dapat diakses melalui antarmuka peramban VS Code. Jika Anda memiliki akses ke Codespaces, Anda cukup mengklik tombol **Code** di repo, memulai codespace, dan langsung dapat menjalankan kodenya. -* Menggunakan **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) menyediakan sumber daya komputasi gratis di cloud bagi orang-orang seperti Anda untuk mencoba beberapa kode di GitHub. Ada tombol di halaman depan untuk membuka repositori di Binder - ini akan membawa Anda dengan cepat ke situs binder, yang akan membangun kontainer dasar dan memulai antarmuka web Jupyter untuk Anda dengan mulus. +* Menggunakan **[GitHub Codespaces](https://github.com/features/codespaces)**, yang merupakan lingkungan virtual yang dibuat untuk Anda di GitHub, dapat diakses melalui antarmuka browser VS Code. Jika Anda memiliki akses ke Codespaces, Anda hanya perlu klik tombol **Code** di repo, mulai codespace, dan segera berjalan. +* Menggunakan **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) menyediakan sumber daya komputasi gratis di cloud untuk orang-orang seperti Anda agar dapat mencoba beberapa kode di GitHub. Ada tombol di halaman depan untuk membuka repositori di Binder - ini akan membawa Anda cepat ke situs binder, yang akan membangun kontainer dasar dan memulai antarmuka web Jupyter untuk Anda secara mulus. -> **Catatan**: Untuk mencegah penyalahgunaan, Binder memblokir akses ke beberapa sumber daya web. Ini mungkin menyebabkan beberapa kode tidak dapat bekerja, yang mengambil model dan/atau dataset dari Internet publik. Anda mungkin perlu mencari solusi alternatif. Selain itu, sumber daya komputasi yang disediakan oleh Binder cukup dasar, sehingga pelatihan akan lambat, terutama pada pelajaran selanjutnya yang lebih kompleks. +> **Catatan**: Untuk mencegah penyalahgunaan, Binder memblokir akses ke beberapa sumber daya web. Ini mungkin akan menghalangi sebagian kode untuk berjalan, terutama yang mengambil model dan/atau dataset dari Internet publik. Anda mungkin perlu mencari solusi alternatif. Selain itu, sumber daya komputasi yang disediakan oleh Binder cukup dasar, jadi pelatihan akan lambat, terutama pada pelajaran yang lebih kompleks di kemudian hari. ## Menjalankan di Cloud dengan GPU -Beberapa pelajaran akhir dalam kurikulum ini akan sangat diuntungkan dengan dukungan GPU. Pelatihan model, misalnya, bisa sangat lambat jika tidak menggunakan GPU. Ada beberapa opsi yang dapat Anda ikuti, terutama jika Anda memiliki akses ke cloud baik melalui [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste), atau melalui institusi Anda: +Beberapa pelajaran terakhir dalam kurikulum ini akan sangat diuntungkan dengan dukungan GPU. Pelatihan model, misalnya, bisa sangat lambat jika tanpa GPU. Ada beberapa opsi yang dapat Anda ikuti, terutama jika Anda memiliki akses ke cloud baik melalui [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste), atau melalui institusi Anda: -* Buat [Data Science Virtual Machine](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) dan sambungkan ke sana melalui Jupyter. Anda kemudian dapat mengkloning repo langsung ke mesin tersebut, dan mulai belajar. NC-series VM menyediakan dukungan GPU. +* Buat [Data Science Virtual Machine](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) dan sambungkan ke mesin tersebut melalui Jupyter. Anda kemudian dapat mengkloning repo langsung ke mesin ini, dan mulai belajar. VM seri NC memiliki dukungan GPU. -> **Catatan**: Beberapa langganan, termasuk Azure for Students, tidak menyediakan dukungan GPU secara default. Anda mungkin perlu mengajukan permintaan dukungan teknis untuk mendapatkan core GPU tambahan. +> **Catatan**: Beberapa langganan, termasuk Azure for Students, tidak menyediakan dukungan GPU secara langsung. Anda mungkin perlu meminta tambahan inti GPU dengan permintaan dukungan teknis. -* Buat [Azure Machine Learning Workspace](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) dan gunakan fitur Notebook di sana. [Video ini](https://azure-for-academics.github.io/quickstart/azureml-papers/) menunjukkan cara mengkloning repositori ke notebook Azure ML dan mulai menggunakannya. +* Buat [Azure Machine Learning Workspace](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) dan kemudian gunakan fitur Notebook di sana. [Video ini](https://azure-for-academics.github.io/quickstart/azureml-papers/) menunjukkan cara mengkloning repositori ke dalam notebook Azure ML dan mulai menggunakannya. -Anda juga dapat menggunakan Google Colab, yang menyediakan dukungan GPU gratis terbatas, dan mengunggah Jupyter Notebooks ke sana untuk dijalankan satu per satu. +Anda juga dapat menggunakan Google Colab, yang menyertakan beberapa dukungan GPU gratis, dan mengunggah Jupyter Notebooks di sana untuk menjalankannya satu per satu. --- **Penafian**: -Dokumen ini telah diterjemahkan menggunakan layanan terjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk akurasi, harap diketahui bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidaktepatan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang berwenang. Untuk informasi yang penting, disarankan menggunakan terjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau salah tafsir yang timbul dari penggunaan terjemahan ini. +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. \ No newline at end of file diff --git a/translations/id/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/id/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index 63d6627528..209a010ce8 100644 --- a/translations/id/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/id/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -4,11 +4,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Model Pra-latih dan Transfer Learning\n", + "# Model yang sudah dilatih sebelumnya dan pembelajaran transfer\n", "\n", - "Melatih CNN bisa memakan banyak waktu, dan membutuhkan banyak data untuk tugas tersebut. Namun, sebagian besar waktu dihabiskan untuk mempelajari filter tingkat rendah terbaik yang digunakan jaringan untuk mengekstrak pola dari gambar. Sebuah pertanyaan alami muncul - bisakah kita menggunakan jaringan neural yang telah dilatih pada satu dataset dan mengadaptasinya untuk mengklasifikasikan gambar yang berbeda tanpa proses pelatihan penuh?\n", + "Melatih CNN bisa memakan banyak waktu, dan dibutuhkan banyak data untuk tugas tersebut. Namun, banyak waktu dihabiskan untuk mempelajari filter tingkat rendah terbaik yang digunakan jaringan untuk mengekstrak pola dari gambar. Sebuah pertanyaan alami muncul - bisakah kita menggunakan jaringan saraf yang sudah dilatih pada satu dataset dan mengadaptasinya untuk mengklasifikasikan gambar yang berbeda tanpa proses pelatihan penuh?\n", "\n", - "Pendekatan ini disebut **transfer learning**, karena kita mentransfer sebagian pengetahuan dari satu model jaringan neural ke model lainnya. Dalam transfer learning, kita biasanya memulai dengan model pra-latih, yang telah dilatih pada dataset gambar besar, seperti **ImageNet**. Model-model tersebut sudah cukup baik dalam mengekstrak berbagai fitur dari gambar umum, dan dalam banyak kasus, hanya dengan membangun sebuah classifier di atas fitur-fitur yang diekstrak tersebut dapat menghasilkan hasil yang baik.\n" + "Pendekatan ini disebut **pembelajaran transfer**, karena kita mentransfer sebagian pengetahuan dari satu model jaringan saraf ke model lain. Dalam pembelajaran transfer, biasanya kita mulai dengan model yang sudah dilatih sebelumnya, yang telah dilatih pada beberapa dataset gambar besar, seperti **ImageNet**. Model-model tersebut sudah bisa melakukan pekerjaan yang baik dalam mengekstrak berbagai fitur dari gambar generik, dan dalam banyak kasus hanya membangun klasifikator di atas fitur yang diekstrak tersebut dapat menghasilkan hasil yang baik.\n" ] }, { @@ -31,7 +31,7 @@ "source": [ "## Dataset Kucing vs. Anjing\n", "\n", - "Dalam unit ini, kita akan menyelesaikan masalah nyata dalam mengklasifikasikan gambar kucing dan anjing. Untuk alasan ini, kita akan menggunakan [Dataset Kucing vs. Anjing dari Kaggle](https://www.kaggle.com/c/dogs-vs-cats), yang juga dapat diunduh [dari Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n", + "Dalam unit ini, kita akan menyelesaikan masalah nyata dalam mengklasifikasikan gambar kucing dan anjing. Untuk alasan ini, kita akan menggunakan [Dataset Kucing vs. Anjing dari Kaggle](https://www.kaggle.com/c/dogs-vs-cats), yang juga bisa diunduh [dari Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n", "\n", "Mari kita unduh dataset ini dan ekstrak ke dalam direktori `data` (proses ini mungkin memakan waktu!):\n" ] @@ -64,7 +64,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Sayangnya, ada beberapa file gambar yang rusak dalam dataset. Kita perlu melakukan pembersihan cepat untuk memeriksa file yang rusak. Agar tidak mengganggu tutorial ini, kami memindahkan kode untuk memverifikasi dataset ke dalam sebuah modul.\n" + "Sayangnya, ada beberapa file gambar yang korup dalam dataset. Kita perlu melakukan pembersihan cepat untuk memeriksa file yang rusak. Agar tidak merusak tutorial ini, kami memindahkan kode untuk memverifikasi dataset ke dalam sebuah modul.\n" ] }, { @@ -335,11 +335,11 @@ "source": [ "## Memuat Dataset\n", "\n", - "Dalam contoh sebelumnya, kita memuat dataset yang sudah tersedia di Keras. Sekarang kita akan bekerja dengan dataset kita sendiri, yang perlu kita muat dari direktori gambar.\n", + "Pada contoh sebelumnya, kita memuat dataset yang sudah bawaan dari Keras. Sekarang kita akan menangani dataset kita sendiri, yang perlu kita muat dari direktori gambar.\n", "\n", - "Dalam kehidupan nyata, ukuran dataset gambar bisa sangat besar, dan kita tidak bisa mengandalkan semua data dapat dimuat ke dalam memori. Oleh karena itu, dataset sering kali direpresentasikan sebagai **generator** yang dapat mengembalikan data dalam minibatch yang sesuai untuk pelatihan.\n", + "Dalam kehidupan nyata, ukuran dataset gambar bisa sangat besar, dan tidak mungkin semua data muat di memori. Oleh karena itu, dataset sering diwakili sebagai **generator** yang dapat mengembalikan data dalam minibatch yang sesuai untuk pelatihan.\n", "\n", - "Untuk menangani klasifikasi gambar, Keras menyertakan fungsi khusus `image_dataset_from_directory`, yang dapat memuat gambar dari subdirektori yang sesuai dengan kelas yang berbeda. Fungsi ini juga mengurus penskalaan gambar, dan dapat membagi dataset menjadi subset pelatihan dan pengujian:\n" + "Untuk menangani klasifikasi gambar, Keras menyertakan fungsi khusus `image_dataset_from_directory`, yang dapat memuat gambar dari subdirektori yang sesuai dengan kelas yang berbeda. Fungsi ini juga mengurus penskalaan gambar, dan juga dapat membagi dataset menjadi subset train dan test:\n" ] }, { @@ -383,7 +383,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Penting untuk menetapkan nilai `seed` yang sama untuk kedua pemanggilan, karena ini memengaruhi pembagian gambar antara dataset pelatihan dan pengujian.\n", + "Penting untuk mengatur nilai `seed` yang sama untuk kedua panggilan, karena ini memengaruhi pembagian gambar antara dataset pelatihan dan pengujian.\n", "\n", "Dataset secara otomatis mengambil nama kelas dari direktori, dan Anda dapat mengaksesnya jika diperlukan dengan memanggil:\n" ] @@ -412,7 +412,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Dataset yang telah kami peroleh dapat langsung diteruskan ke fungsi `fit` untuk melatih model. Dataset tersebut berisi gambar dan label yang sesuai, yang dapat diulang menggunakan konstruksi berikut:\n" + "Dataset yang telah kami dapatkan dapat langsung diteruskan ke fungsi `fit` untuk melatih model. Dataset tersebut berisi baik gambar maupun label yang sesuai, yang dapat diulang menggunakan konstruksi berikut:\n" ] }, { @@ -453,16 +453,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "> **Catatan**: Semua gambar dalam dataset direpresentasikan sebagai tensor titik float dengan rentang 0-255. Sebelum meneruskannya ke jaringan saraf, kita perlu menskalakan nilai-nilai tersebut ke dalam rentang 0-1. Saat memplot gambar, kita juga perlu melakukan hal yang sama, atau mengonversi nilai ke tipe `int` (seperti yang kita lakukan dalam kode di atas), agar menunjukkan kepada `matplotlib` bahwa kita ingin memplot gambar asli yang belum diskalakan.\n" + "> **Catatan**: Semua gambar dalam dataset direpresentasikan sebagai tensor titik mengambang dengan rentang 0-255. Sebelum mengirimkannya ke jaringan syaraf, kita perlu mengubah skala nilai tersebut ke rentang 0-1. Saat memplot gambar, kita juga perlu melakukan hal yang sama, atau mengonversi nilai menjadi tipe `int` (yang kami lakukan dalam kode di atas), agar `matplotlib` menunjukkan bahwa kita ingin memplot gambar asli yang belum diskalakan.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Model yang telah dilatih sebelumnya\n", + "## Model Pra-latih\n", "\n", - "Untuk banyak tugas klasifikasi gambar, kita dapat menemukan model jaringan saraf yang telah dilatih sebelumnya. Banyak dari model tersebut tersedia di dalam namespace `keras.applications`, dan lebih banyak lagi model dapat ditemukan di Internet. Mari kita lihat bagaimana model VGG-16 yang paling sederhana dapat dimuat dan digunakan:\n" + "Untuk banyak tugas klasifikasi gambar, kita dapat menemukan model jaringan saraf yang sudah dilatih sebelumnya. Banyak dari model tersebut tersedia di dalam namespace `keras.applications`, dan lebih banyak lagi model dapat ditemukan di Internet. Mari kita lihat bagaimana model VGG-16 paling sederhana dapat dimuat dan digunakan:\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": [ "Ada beberapa hal penting di sini:\n", - "* Sebelum memberikan input ke jaringan yang sudah dilatih sebelumnya, input tersebut harus diproses terlebih dahulu dengan cara tertentu. Hal ini dilakukan dengan memanggil fungsi `preprocess_input` yang sesuai, yang menerima batch gambar dan mengembalikan bentuk yang telah diproses. Dalam kasus VGG-16, gambar-gambar tersebut dinormalisasi, dan nilai rata-rata yang telah ditentukan untuk setiap saluran dikurangi. Hal ini karena VGG-16 awalnya dilatih dengan pra-pemrosesan seperti ini.\n", - "* Jaringan neural diterapkan pada batch input, dan hasilnya adalah batch tensor berisi 1000 elemen yang menunjukkan probabilitas setiap kelas. Kita dapat menemukan nomor kelas yang paling mungkin dengan memanggil `argmax` pada tensor ini.\n", - "* Hasil yang diperoleh adalah [nomor kelas `ImageNet`](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Untuk memahami hasil ini, kita juga dapat menggunakan fungsi `decode_predictions`, yang mengembalikan n kelas teratas beserta nama-namanya.\n" + "* Sebelum memasukkan input ke jaringan yang sudah dilatih sebelumnya, input harus diproses terlebih dahulu dengan cara tertentu. Ini dilakukan dengan memanggil fungsi `preprocess_input` yang sesuai, yang menerima batch gambar, dan mengembalikan bentuk yang sudah diproses. Dalam kasus VGG-16, gambar dinormalisasi, dan nilai rata-rata yang telah ditentukan untuk setiap saluran dikurangi. Ini karena VGG-16 awalnya dilatih dengan pra-pemrosesan ini.\n", + "* Jaringan saraf diterapkan pada batch input, dan kita menerima sebagai hasil tensor 1000-elemen untuk setiap batch yang menunjukkan probabilitas setiap kelas. Kita dapat menemukan nomor kelas yang paling mungkin dengan memanggil `argmax` pada tensor ini.\n", + "* Hasil yang diperoleh adalah [nomor kelas `ImageNet`](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Untuk memahami hasil ini, kita juga dapat menggunakan fungsi `decode_predictions`, yang mengembalikan n kelas teratas bersama dengan nama mereka.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Mari kita lihat arsitektur jaringan VGG-16:\n" + "Mari kita lihat juga arsitektur jaringan VGG-16:\n" ] }, { @@ -597,9 +607,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Komputasi GPU\n", + "## Perhitungan GPU\n", "\n", - "Jaringan neural dalam, seperti VGG-16 dan arsitektur modern lainnya, membutuhkan daya komputasi yang cukup besar untuk dijalankan. Oleh karena itu, masuk akal untuk menggunakan akselerasi GPU jika tersedia. Untungnya, Keras secara otomatis mempercepat komputasi di GPU jika tersedia. Kita dapat memeriksa apakah Tensorflow dapat menggunakan GPU dengan kode berikut:\n" + "Jaringan neural dalam yang dalam, seperti VGG-16 dan arsitektur modern lainnya memerlukan kekuatan komputasi yang cukup besar untuk dijalankan. Sangat masuk akal untuk menggunakan akselerasi GPU, jika tersedia. Untungnya, Keras secara otomatis mempercepat perhitungan di GPU jika tersedia. Kita dapat memeriksa apakah Tensorflow dapat menggunakan GPU menggunakan kode berikut:\n" ] }, { @@ -626,9 +636,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Mengekstrak Fitur VGG\n", "\n", - "Jika kita ingin menggunakan VGG-16 untuk mengekstrak fitur dari gambar kita, kita memerlukan model tanpa lapisan klasifikasi akhir. Kita dapat menginstansiasi model VGG-16 tanpa lapisan atas menggunakan kode berikut:\n" + "## Mengekstrak fitur VGG\n", + "\n", + "Jika kita ingin menggunakan VGG-16 untuk mengekstrak fitur dari gambar kita, kita membutuhkan model tanpa lapisan klasifikasi akhir. Kita dapat membuat model VGG-16 tanpa lapisan atas menggunakan kode ini:\n" ] }, { @@ -680,9 +691,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Dimensi tensor fitur adalah 7x7x512, tetapi untuk memvisualisasikannya kita harus mengubahnya menjadi bentuk 2D.\n", + "Dimensi tensor fitur adalah 7x7x512, tetapi untuk memvisualisasikannya kami harus mengubahnya menjadi bentuk 2D.\n", "\n", - "Sekarang mari kita coba melihat apakah fitur-fitur tersebut dapat digunakan untuk mengklasifikasikan gambar. Mari kita ambil secara manual sebagian gambar (50 minibatch, dalam kasus ini), dan hitung terlebih dahulu vektor fitur mereka. Kita dapat menggunakan API **dataset** Tensorflow untuk melakukan itu. Fungsi `map` mengambil dataset dan menerapkan lambda-function tertentu untuk mengubahnya. Kita menggunakan mekanisme ini untuk membangun dataset baru, `ds_features_train` dan `ds_features_test`, yang berisi fitur yang diekstraksi oleh VGG sebagai pengganti gambar asli.\n" + "Sekarang mari kita coba lihat apakah fitur-fitur tersebut dapat digunakan untuk mengklasifikasikan gambar. Mari secara manual mengambil beberapa bagian dari gambar (50 minibatch, dalam kasus kami), dan menghitung vektor fiturnya terlebih dahulu. Kita dapat menggunakan API **dataset** Tensorflow untuk melakukan itu. Fungsi `map` mengambil sebuah dataset dan menerapkan fungsi lambda tertentu untuk mengubahnya. Kami menggunakan mekanisme ini untuk membuat dataset baru, `ds_features_train` dan `ds_features_test`, yang berisi fitur yang diekstrak oleh VGG, bukan gambar aslinya.\n" ] }, { @@ -712,9 +723,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Kami menggunakan konstruksi `.take(50)` untuk membatasi ukuran dataset, agar mempercepat demonstrasi kami. Tentu saja, Anda dapat melakukan eksperimen ini pada dataset penuh.\n", + "Kami menggunakan konstruk `.take(50)` untuk membatasi ukuran dataset, agar mempercepat demonstrasi kami. Tentu saja Anda dapat melakukan eksperimen ini pada dataset penuh.\n", "\n", - "Sekarang kita memiliki dataset dengan fitur yang telah diekstraksi, kita dapat melatih sebuah classifier sederhana berbasis dense untuk membedakan antara kucing dan anjing. Jaringan ini akan menerima vektor fitur dengan bentuk (7,7,512), dan menghasilkan satu output yang mewakili apakah itu anjing atau kucing. Karena ini adalah klasifikasi biner, kita menggunakan fungsi aktivasi `sigmoid` dan loss `binary_crossentropy`.\n" + "Sekarang kita memiliki dataset dengan fitur yang telah diekstrak, kita dapat melatih klasifikator dense sederhana untuk membedakan antara kucing dan anjing. Jaringan ini akan menerima vektor fitur berbentuk (7,7,512), dan menghasilkan satu output yang menunjukkan apakah itu anjing atau kucing. Karena ini adalah klasifikasi biner, kami menggunakan fungsi aktivasi `sigmoid` dan loss `binary_crossentropy`.\n" ] }, { @@ -743,13 +754,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Hasilnya luar biasa, kita dapat membedakan antara kucing dan anjing dengan probabilitas hampir 95%! Namun, kami hanya menguji pendekatan ini pada sebagian kecil dari semua gambar, karena ekstraksi fitur manual tampaknya memakan banyak waktu.\n", + "Hasilnya sangat baik, kita dapat membedakan antara kucing dan anjing dengan probabilitas hampir 95%! Namun, kita baru menguji pendekatan ini pada sebagian gambar saja, karena ekstraksi fitur secara manual tampaknya memerlukan banyak waktu.\n", "\n", "## Transfer learning menggunakan satu jaringan VGG\n", "\n", - "Kita juga dapat menghindari proses ekstraksi fitur secara manual dengan menggunakan jaringan VGG-16 asli secara keseluruhan selama pelatihan, dengan menambahkan ekstraktor fitur ke jaringan kita sebagai lapisan pertama.\n", + "Kita juga dapat menghindari perhitungan fitur secara manual dengan menggunakan jaringan VGG-16 asli secara keseluruhan selama pelatihan, dengan menambahkan ekstraktor fitur ke jaringan kita sebagai lapisan pertama.\n", "\n", - "Keindahan arsitektur Keras adalah bahwa model VGG-16 yang telah kita definisikan di atas juga dapat digunakan sebagai lapisan dalam jaringan neural lainnya! Kita hanya perlu membangun jaringan dengan classifier dense di atasnya, lalu melatih seluruh jaringan menggunakan back propagation.\n" + "Keindahan arsitektur Keras adalah model VGG-16 yang telah kita definisikan di atas juga dapat digunakan sebagai lapisan di jaringan neural lain! Kita hanya perlu membangun jaringan dengan pengklasifikasi dense di atasnya, lalu melatih seluruh jaringan menggunakan back propagation.\n" ] }, { @@ -793,13 +804,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Model ini terlihat seperti jaringan klasifikasi end-to-end, yang menerima sebuah gambar dan mengembalikan kelasnya. Namun, hal yang rumit adalah kita ingin VGG16 berfungsi sebagai ekstraktor fitur, bukan untuk dilatih ulang. Oleh karena itu, kita perlu **membekukan bobot ekstraktor fitur konvolusi**. Kita dapat mengakses lapisan pertama jaringan dengan memanggil `model.layers[0]`, dan kita hanya perlu mengatur properti `trainable` ke `False`.\n", + "Model ini terlihat seperti jaringan klasifikasi ujung-ke-ujung, yang menerima sebuah gambar dan mengembalikan kelasnya. Namun, hal yang tricky adalah kita ingin VGG16 berperan sebagai ekstraktor fitur, dan tidak dilatih ulang. Oleh karena itu, kita perlu **membekukan bobot ekstraktor fitur konvolusional**. Kita dapat mengakses lapisan pertama dari jaringan dengan memanggil `model.layers[0]`, dan kita hanya perlu mengatur properti `trainable` menjadi `False`.\n", "\n", - "> **Note**: Pembekuan bobot ekstraktor fitur diperlukan, karena jika tidak, lapisan klasifikasi yang belum terlatih dapat merusak bobot pra-latih asli dari ekstraktor konvolusi.\n", + "> **Catatan**: Pembekuan bobot ekstraktor fitur diperlukan, karena jika tidak, lapisan klasifikasi yang belum dilatih dapat merusak bobot pre-trained asli dari ekstraktor konvolusional.\n", "\n", - "Anda dapat melihat bahwa meskipun jumlah total parameter dalam jaringan kita sekitar 15 juta, kita hanya melatih 25 ribu parameter. Semua parameter lainnya dari filter konvolusi tingkat atas sudah pra-latih. Hal ini baik, karena kita dapat menyempurnakan jumlah parameter yang lebih kecil dengan jumlah contoh yang lebih sedikit.\n", + "Anda dapat melihat bahwa meskipun total jumlah parameter dalam jaringan kita sekitar 15 juta, kita hanya melatih 25 ribu parameter. Semua parameter lain dari filter konvolusional tingkat atas sudah dilatih sebelumnya. Itu bagus, karena kita dapat melakukan fine-tune pada jumlah parameter yang lebih kecil dengan jumlah contoh yang lebih sedikit.\n", "\n", - "Sekarang kita akan melatih jaringan kita dan melihat seberapa baik hasilnya. Harapkan waktu eksekusi yang cukup lama, dan jangan khawatir jika eksekusi tampak seperti berhenti untuk beberapa waktu.\n" + "Sekarang kita akan melatih jaringan kita dan melihat seberapa baik hasil yang bisa didapat. Harapkan waktu berjalan yang agak lama, dan jangan khawatir jika eksekusi tampak beku untuk beberapa waktu.\n" ] }, { @@ -824,11 +835,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Sepertinya kita telah mendapatkan classifier kucing vs. anjing yang cukup akurat!\n", + "Sepertinya kita telah memperoleh classifier kucing vs. anjing yang cukup akurat! \n", "\n", "## Menyimpan dan Memuat Model\n", "\n", - "Setelah kita melatih model, kita dapat menyimpan arsitektur model dan bobot yang telah dilatih ke dalam file untuk digunakan di masa depan:\n" + "Setelah kita melatih model, kita dapat menyimpan arsitektur model dan bobot terlatih ke dalam file untuk digunakan di masa depan:\n" ] }, { @@ -852,7 +863,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Kita kemudian dapat memuat model dari file kapan saja. Anda mungkin merasa ini berguna jika percobaan berikutnya merusak model - Anda tidak perlu memulai dari awal lagi.\n" + "Kita kemudian dapat memuat model dari file kapan saja. Anda mungkin menganggap ini berguna jika eksperimen berikutnya merusak model - Anda tidak perlu memulai dari awal lagi.\n" ] }, { @@ -868,15 +879,15 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Fine-tuning transfer learning\n", + "## Penyempurnaan transfer learning\n", "\n", - "Pada bagian sebelumnya, kita telah melatih lapisan klasifikasi terakhir untuk mengklasifikasikan gambar dalam dataset kita sendiri. Namun, kita belum melatih ulang feature extractor, dan model kita mengandalkan fitur yang telah dipelajari dari data ImageNet. Jika objek Anda secara visual berbeda dari gambar-gambar biasa di ImageNet, kombinasi fitur ini mungkin tidak bekerja dengan optimal. Oleh karena itu, masuk akal untuk mulai melatih lapisan-lapisan konvolusi juga.\n", + "Pada bagian sebelumnya, kita telah melatih lapisan pengklasifikasi terakhir untuk mengklasifikasikan gambar dalam dataset kita sendiri. Namun, kita tidak melatih ulang ekstraktor fitur, dan model kita mengandalkan fitur yang telah dipelajari model dari data ImageNet. Jika objek Anda secara visual berbeda dari gambar ImageNet biasa, kombinasi fitur ini mungkin tidak bekerja dengan baik. Oleh karena itu, masuk akal untuk mulai melatih juga lapisan konvolusi.\n", "\n", - "Untuk melakukannya, kita dapat membuka kembali parameter filter konvolusi yang sebelumnya telah kita bekukan.\n", + "Untuk melakukannya, kita dapat membuka kunci parameter filter konvolusional yang sebelumnya telah kita bekukan.\n", "\n", - "> **Note:** Penting untuk membekukan parameter terlebih dahulu dan melakukan beberapa epoch pelatihan untuk menstabilkan bobot pada lapisan klasifikasi. Jika Anda langsung memulai pelatihan jaringan end-to-end dengan parameter yang tidak dibekukan, kesalahan besar kemungkinan akan merusak bobot yang telah dilatih sebelumnya pada lapisan konvolusi.\n", + "> **Catatan:** Penting untuk membekukan parameter terlebih dahulu dan melakukan beberapa epoch pelatihan untuk menstabilkan bobot pada lapisan klasifikasi. Jika Anda langsung memulai pelatihan jaringan secara menyeluruh dengan parameter yang tidak dibekukan, kesalahan besar kemungkinan akan merusak bobot yang telah dilatih sebelumnya di lapisan konvolusi.\n", "\n", - "Model konvolusi VGG-16 kita berada di dalam lapisan pertama, dan terdiri dari banyak lapisan itu sendiri. Kita dapat melihat strukturnya:\n" + "Model VGG-16 konvolusional kita terletak di dalam lapisan pertama, dan terdiri dari banyak lapisan itu sendiri. Kita dapat melihat strukturnya:\n" ] }, { @@ -945,7 +956,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Kita dapat mencairkan semua lapisan dari basis konvolusional:\n" + "Kita dapat membuka kunci semua lapisan dari dasar konvolusi:\n" ] }, { @@ -961,7 +972,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Namun, membuka pembekuan semuanya sekaligus bukanlah ide terbaik. Kita dapat terlebih dahulu membuka pembekuan hanya beberapa lapisan akhir dari konvolusi, karena mereka mengandung pola tingkat tinggi yang relevan untuk gambar kita. Sebagai contoh, untuk memulai, kita dapat membekukan semua lapisan kecuali 4 lapisan terakhir:\n" + "Namun, mencairkan semuanya sekaligus bukanlah ide terbaik. Kita dapat terlebih dahulu mencairkan hanya beberapa lapisan akhir konvolusi, karena lapisan tersebut mengandung pola tingkat tinggi yang relevan untuk gambar kita. Misalnya, untuk memulai, kita dapat membekukan semua lapisan kecuali 4 lapisan terakhir: \n" ] }, { @@ -1000,11 +1011,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Perhatikan bahwa jumlah parameter yang dapat dilatih meningkat secara signifikan, tetapi masih sekitar 50% dari total parameter.\n", + "Perhatikan bahwa jumlah parameter yang dapat dilatih meningkat secara signifikan, tetapi masih sekitar 50% dari semua parameter.\n", "\n", - "Setelah membuka pembekuan, kita dapat melakukan beberapa epoch pelatihan tambahan (dalam contoh kita, kita hanya akan melakukan satu). Anda juga dapat memilih tingkat pembelajaran yang lebih rendah untuk meminimalkan dampak pada bobot yang telah dilatih sebelumnya. Namun, bahkan dengan tingkat pembelajaran yang rendah, Anda dapat mengharapkan akurasi menurun di awal pelatihan, hingga akhirnya mencapai tingkat yang sedikit lebih tinggi dibandingkan dengan kasus bobot yang tetap.\n", + "Setelah membebaskan (unfreezing), kita bisa melakukan beberapa epoch pelatihan lagi (dalam contoh kami, kami hanya akan melakukan satu). Anda juga bisa memilih tingkat pembelajaran yang lebih rendah, untuk meminimalkan dampak pada bobot yang telah dilatih sebelumnya. Namun, bahkan dengan tingkat pembelajaran yang rendah, Anda dapat mengharapkan akurasi menurun di awal pelatihan, hingga akhirnya mencapai tingkat sedikit lebih tinggi daripada pada kasus bobot tetap.\n", "\n", - "> **Note:** Pelatihan ini berlangsung jauh lebih lambat, karena kita perlu menyebarkan gradien kembali melalui banyak lapisan jaringan!\n" + "> **Catatan:** Pelatihan ini terjadi jauh lebih lambat, karena kita perlu mengpropagasi gradien kembali melalui banyak lapisan jaringan!\n" ] }, { @@ -1028,18 +1039,18 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Kami kemungkinan akan mencapai akurasi pelatihan yang lebih tinggi, karena kami menggunakan jaringan yang lebih kuat dengan lebih banyak parameter, tetapi akurasi validasi mungkin tidak meningkat sebanyak itu.\n", + "Kita kemungkinan akan mencapai akurasi pelatihan yang lebih tinggi, karena kita menggunakan jaringan yang lebih kuat dengan lebih banyak parameter, tetapi akurasi validasi tidak akan meningkat sebanyak itu.\n", "\n", - "Jangan ragu untuk membuka beberapa lapisan jaringan tambahan dan melatih lebih lanjut, untuk melihat apakah Anda dapat mencapai akurasi yang lebih tinggi!\n" + "Silakan buka beberapa lapisan jaringan lagi dan latih lebih lama, untuk melihat apakah Anda dapat mencapai akurasi yang lebih tinggi!\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Model penglihatan komputer lainnya\n", + "## Model visi komputer lainnya\n", "\n", - "VGG-16 adalah salah satu arsitektur penglihatan komputer yang paling sederhana. Keras menyediakan banyak jaringan yang telah dilatih sebelumnya. Di antara jaringan tersebut, yang paling sering digunakan adalah arsitektur **ResNet**, yang dikembangkan oleh Microsoft, dan **Inception** oleh Google. Sebagai contoh, mari kita eksplorasi arsitektur model ResNet-50 yang paling sederhana (ResNet adalah keluarga model dengan kedalaman berbeda, Anda dapat mencoba bereksperimen dengan ResNet-152 jika ingin melihat seperti apa model yang sangat dalam):\n" + "VGG-16 adalah salah satu arsitektur visi komputer yang paling sederhana. Keras menyediakan banyak jaringan yang sudah dilatih sebelumnya. Yang paling sering digunakan di antara itu adalah arsitektur **ResNet**, yang dikembangkan oleh Microsoft, dan **Inception** oleh Google. Sebagai contoh, mari kita jelajahi arsitektur model ResNet-50 yang paling sederhana (ResNet adalah keluarga model dengan kedalaman berbeda, Anda bisa mencoba bereksperimen dengan ResNet-152 jika ingin melihat seperti apa model yang benar-benar dalam): \n" ] }, { @@ -1441,29 +1452,29 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Seperti yang dapat Anda lihat, model ini mengandung blok bangunan yang sudah familiar: lapisan konvolusi, lapisan pooling, dan lapisan klasifikasi padat di akhir. Kita dapat menggunakan model ini dengan cara yang sama persis seperti kita menggunakan VGG-16 untuk transfer learning. Anda dapat mencoba bereksperimen dengan kode di atas, menggunakan berbagai model ResNet sebagai model dasar, dan melihat bagaimana akurasi berubah.\n", + "Seperti yang Anda lihat, model ini mengandung blok bangunan yang sama yang sudah dikenal: lapisan konvolusional, lapisan pooling, dan klasifier dense akhir. Kita dapat menggunakan model ini dengan cara yang persis sama seperti yang telah kita lakukan dengan VGG-16 untuk transfer learning. Anda dapat mencoba bereksperimen dengan kode di atas, menggunakan model ResNet yang berbeda sebagai model dasar, dan melihat bagaimana akurasi berubah.\n", "\n", "## Normalisasi Batch\n", "\n", - "Jaringan ini juga mengandung jenis lapisan lain: **Normalisasi Batch**. Ide dari normalisasi batch adalah untuk membawa nilai-nilai yang mengalir melalui jaringan neural ke interval yang tepat. Biasanya, jaringan neural bekerja paling baik ketika semua nilai berada dalam rentang [-1,1] atau [0,1], dan itulah alasan mengapa kita menskalakan/menormalkan data input kita sesuai. Namun, selama pelatihan jaringan yang dalam, bisa saja terjadi bahwa nilai-nilai menjadi sangat keluar dari rentang ini, yang membuat pelatihan menjadi bermasalah. Lapisan normalisasi batch menghitung rata-rata dan deviasi standar untuk semua nilai dari minibatch saat ini, dan menggunakannya untuk menormalkan sinyal sebelum meneruskannya melalui lapisan jaringan neural. Ini secara signifikan meningkatkan stabilitas jaringan yang dalam.\n" + "Jaringan ini mengandung jenis lapisan lain: **Normalisasi Batch**. Ide dari normalisasi batch adalah untuk membawa nilai-nilai yang mengalir melalui jaringan neural ke interval yang tepat. Biasanya jaringan neural bekerja paling baik ketika semua nilai berada dalam rentang [-1,1] atau [0,1], dan itulah alasan kita menskalakan/mem-normalisasi data input kita sesuai dengan itu. Namun, selama pelatihan jaringan yang dalam, dapat terjadi nilai-nilai keluar jauh dari rentang ini, yang menjadikan pelatihan bermasalah. Lapisan normalisasi batch menghitung rata-rata dan deviasi standar untuk semua nilai dari minibatch saat ini, dan menggunakannya untuk menormalisasi sinyal sebelum melewatinya melalui lapisan jaringan neural. Ini secara signifikan meningkatkan kestabilan jaringan yang dalam.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Intisari\n", + "## Kesimpulan\n", "\n", - "Dengan menggunakan transfer learning, kami dapat dengan cepat membuat sebuah classifier untuk tugas klasifikasi objek khusus kami, dan mencapai akurasi yang tinggi. Namun, contoh ini tidak sepenuhnya adil, karena jaringan VGG-16 asli telah dilatih sebelumnya untuk mengenali kucing dan anjing, sehingga kami hanya menggunakan kembali sebagian besar pola yang sudah ada di jaringan tersebut. Anda dapat mengharapkan akurasi yang lebih rendah pada objek yang lebih spesifik dan tidak umum, seperti detail pada jalur produksi di pabrik, atau berbagai jenis daun pohon.\n", + "Dengan menggunakan transfer learning, kami dapat dengan cepat menyusun pengklasifikasi untuk tugas klasifikasi objek khusus kami, dan mencapai akurasi yang tinggi. Namun, contoh ini tidak sepenuhnya adil, karena jaringan VGG-16 asli telah dilatih sebelumnya untuk mengenali kucing dan anjing, sehingga kami hanya menggunakan kembali sebagian besar pola yang sudah ada dalam jaringan tersebut. Anda dapat mengharapkan akurasi yang lebih rendah pada objek domain khusus yang lebih eksotik, seperti detail di jalur produksi di pabrik, atau daun pohon yang berbeda.\n", "\n", - "Anda dapat melihat bahwa tugas yang lebih kompleks yang sedang kami selesaikan sekarang membutuhkan daya komputasi yang lebih tinggi, dan tidak dapat dengan mudah diselesaikan menggunakan CPU. Pada unit berikutnya, kami akan mencoba menggunakan implementasi yang lebih ringan untuk melatih model yang sama dengan sumber daya komputasi yang lebih rendah, yang menghasilkan akurasi yang hanya sedikit lebih rendah.\n" + "Anda dapat melihat bahwa tugas yang lebih kompleks yang kami selesaikan sekarang membutuhkan daya komputasi yang lebih tinggi, dan tidak dapat dengan mudah diselesaikan pada CPU. Pada unit berikutnya, kami akan mencoba menggunakan implementasi yang lebih ringan untuk melatih model yang sama menggunakan sumber daya komputasi yang lebih rendah, yang menghasilkan akurasi yang hanya sedikit lebih rendah.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**Penafian**: \nDokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berupaya untuk memberikan hasil yang akurat, harap diperhatikan bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang berwenang. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan manusia profesional. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini.\n" + "---\n\n\n**Penafian**:\nDokumen ini telah diterjemahkan menggunakan layanan terjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berupaya untuk 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.\n\n" ] } ], @@ -1484,12 +1495,6 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" - }, - "coopTranslator": { - "original_hash": "c189abc107848f96051085cc30945129", - "translation_date": "2025-08-29T13:36:29+00:00", - "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", - "language_code": "id" } }, "nbformat": 4, diff --git a/translations/id/lessons/5-NLP/README.md b/translations/id/lessons/5-NLP/README.md index da537e7541..198b2f0e65 100644 --- a/translations/id/lessons/5-NLP/README.md +++ b/translations/id/lessons/5-NLP/README.md @@ -1,34 +1,34 @@ # Pemrosesan Bahasa Alami -![Ringkasan tugas NLP dalam bentuk doodle](../../../../translated_images/id/ai-nlp.b22dcb8ca4707cea.webp) +![Ringkasan tugas NLP dalam sebuah doodle](../../../../translated_images/id/ai-nlp.b22dcb8ca4707cea.webp) -Di bagian ini, kita akan fokus pada penggunaan Jaringan Saraf untuk menangani tugas-tugas yang berkaitan dengan **Pemrosesan Bahasa Alami (Natural Language Processing/NLP)**. Ada banyak masalah NLP yang ingin kita selesaikan dengan bantuan komputer: +Dalam bagian ini, kita akan fokus menggunakan Jaringan Saraf untuk menangani tugas-tugas terkait **Pemrosesan Bahasa Alami (NLP)**. Ada banyak masalah NLP yang ingin kita bisa selesaikan dengan komputer: -* **Klasifikasi teks** adalah masalah klasifikasi yang berkaitan dengan urutan teks. Contohnya termasuk mengklasifikasikan pesan e-mail sebagai spam atau bukan spam, atau mengategorikan artikel ke dalam kategori seperti olahraga, bisnis, politik, dll. Selain itu, saat mengembangkan chatbot, kita sering perlu memahami apa yang ingin disampaikan oleh pengguna -- dalam hal ini kita berurusan dengan **klasifikasi maksud**. Dalam klasifikasi maksud, sering kali kita harus menangani banyak kategori. -* **Analisis sentimen** adalah masalah regresi, di mana kita perlu memberikan nilai (sentimen) yang mencerminkan seberapa positif/negatif makna sebuah kalimat. Versi yang lebih canggih dari analisis sentimen adalah **analisis sentimen berbasis aspek** (Aspect-Based Sentiment Analysis/ABSA), di mana kita memberikan sentimen tidak untuk seluruh kalimat, tetapi untuk bagian-bagian tertentu (aspek), misalnya *Di restoran ini, saya suka masakannya, tetapi suasananya sangat buruk*. -* **Pengenalan Entitas Bernama** (Named Entity Recognition/NER) mengacu pada masalah mengekstraksi entitas tertentu dari teks. Sebagai contoh, kita mungkin perlu memahami bahwa dalam frasa *Saya perlu terbang ke Paris besok* kata *besok* merujuk pada TANGGAL, dan *Paris* adalah LOKASI. -* **Ekstraksi kata kunci** mirip dengan NER, tetapi kita perlu mengekstrak kata-kata yang penting untuk makna kalimat secara otomatis, tanpa pelatihan sebelumnya untuk jenis entitas tertentu. -* **Pengelompokan teks** dapat berguna ketika kita ingin mengelompokkan kalimat yang serupa, misalnya, permintaan serupa dalam percakapan dukungan teknis. -* **Menjawab pertanyaan** mengacu pada kemampuan model untuk menjawab pertanyaan tertentu. Model menerima teks dan pertanyaan sebagai input, dan perlu memberikan tempat dalam teks di mana jawaban atas pertanyaan tersebut terkandung (atau, terkadang, menghasilkan teks jawaban). -* **Pembuatan teks** adalah kemampuan model untuk menghasilkan teks baru. Ini dapat dianggap sebagai tugas klasifikasi yang memprediksi huruf/kata berikutnya berdasarkan *teks awal*. Model pembuatan teks yang canggih, seperti GPT-3, mampu menyelesaikan tugas NLP lainnya seperti klasifikasi menggunakan teknik yang disebut [prompt programming](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) atau [prompt engineering](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29). -* **Rangkuman teks** adalah teknik di mana kita ingin komputer "membaca" teks panjang dan meringkasnya dalam beberapa kalimat. -* **Penerjemahan mesin** dapat dilihat sebagai kombinasi pemahaman teks dalam satu bahasa, dan pembuatan teks dalam bahasa lain. +* **Klasifikasi teks** adalah masalah klasifikasi khas yang terkait dengan urutan teks. Contohnya termasuk mengklasifikasikan pesan email sebagai spam vs. tidak spam, atau mengkategorikan artikel sebagai olahraga, bisnis, politik, dll. Juga, saat mengembangkan bot obrolan, kita sering perlu memahami apa yang ingin dikatakan pengguna -- dalam kasus ini kita berurusan dengan **klasifikasi intent**. Seringkali, dalam klasifikasi intent kita perlu menangani banyak kategori. +* **Analisis sentimen** adalah masalah regresi khas, di mana kita perlu memberikan angka (sentimen) yang sesuai dengan seberapa positif/negatif makna suatu kalimat. Versi yang lebih maju dari analisis sentimen adalah **analisis sentimen berbasis aspek** (ABSA), di mana kita memberikan sentimen bukan untuk seluruh kalimat, tapi untuk bagian-bagian berbeda dari kalimat tersebut (aspek), misalnya *Di restoran ini, saya suka masakannya, tapi suasananya buruk*. +* **Pengenalan Entitas Bernama** (NER) merujuk pada masalah mengekstrak entitas tertentu dari teks. Misalnya, kita perlu memahami bahwa dalam frasa *Saya perlu terbang ke Paris besok* kata *besok* merujuk ke TANGGAL, dan *Paris* adalah LOKASI. +* **Ekstraksi kata kunci** mirip dengan NER, tapi kita perlu mengekstrak kata-kata penting untuk makna kalimat secara otomatis, tanpa pelatihan awal untuk jenis entitas tertentu. +* **Pengelompokan teks** dapat berguna ketika kita ingin mengelompokkan kalimat yang mirip, contohnya, permintaan serupa dalam percakapan dukungan teknis. +* **Menjawab pertanyaan** merujuk pada kemampuan model untuk menjawab pertanyaan spesifik. Model menerima teks dan pertanyaan sebagai masukan, dan perlu menyediakan bagian dalam teks di mana jawaban pertanyaan terdapat (atau, kadang-kadang, menghasilkan teks jawaban). +* **Generasi teks** adalah kemampuan model untuk menghasilkan teks baru. Ini dapat dianggap sebagai tugas klasifikasi yang memprediksi huruf/kata berikutnya berdasarkan *prompt teks*. Model generasi teks canggih, seperti GPT-3, mampu menyelesaikan tugas NLP lain seperti klasifikasi dengan teknik yang disebut [prompt programming](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) atau [prompt engineering](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29) +* **Ringkasan teks** adalah teknik dimana kita ingin komputer "membaca" teks panjang dan merangkumnya dalam beberapa kalimat. +* **Penerjemahan mesin** dapat dipandang sebagai kombinasi pemahaman teks dalam satu bahasa, dan menghasilkan teks dalam bahasa lain. -Awalnya, sebagian besar tugas NLP diselesaikan menggunakan metode tradisional seperti tata bahasa. Sebagai contoh, dalam penerjemahan mesin, parser digunakan untuk mengubah kalimat awal menjadi pohon sintaksis, kemudian struktur semantik tingkat tinggi diekstraksi untuk mewakili makna kalimat, dan berdasarkan makna ini serta tata bahasa dari bahasa target, hasilnya dihasilkan. Saat ini, banyak tugas NLP lebih efektif diselesaikan menggunakan jaringan saraf. +Awalnya, sebagian besar tugas NLP diselesaikan menggunakan metode tradisional seperti tata bahasa. Misalnya, dalam penerjemahan mesin, parser digunakan untuk mengubah kalimat awal menjadi pohon sintaksis, kemudian struktur semantik tingkat tinggi diekstrak untuk merepresentasikan makna kalimat, dan berdasarkan makna ini serta tata bahasa bahasa target hasilnya dihasilkan. Saat ini, banyak tugas NLP lebih efektif diselesaikan menggunakan jaringan saraf. -> Banyak metode NLP klasik diimplementasikan dalam pustaka Python [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org). Ada [Buku NLTK](https://www.nltk.org/book/) yang sangat bagus tersedia secara online yang membahas bagaimana berbagai tugas NLP dapat diselesaikan menggunakan NLTK. +> Banyak metode NLP klasik diimplementasikan dalam pustaka Python [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org). Ada buku [NLTK Book](https://www.nltk.org/book/) yang tersedia online yang membahas bagaimana berbagai tugas NLP dapat diselesaikan menggunakan NLTK. -Dalam kursus ini, kita akan lebih banyak fokus pada penggunaan Jaringan Saraf untuk NLP, dan kita akan menggunakan NLTK jika diperlukan. +Dalam kursus kami, kami akan lebih banyak fokus menggunakan Jaringan Saraf untuk NLP, dan kami akan menggunakan NLTK bila diperlukan. -Kita telah mempelajari penggunaan jaringan saraf untuk menangani data tabular dan gambar. Perbedaan utama antara jenis data tersebut dan teks adalah bahwa teks adalah urutan dengan panjang variabel, sementara ukuran input pada gambar sudah diketahui sebelumnya. Meskipun jaringan konvolusi dapat mengekstrak pola dari data input, pola dalam teks lebih kompleks. Misalnya, kita dapat memiliki negasi yang dipisahkan dari subjek oleh banyak kata (misalnya, *Saya tidak suka jeruk*, vs. *Saya tidak suka jeruk besar yang berwarna-warni dan lezat*), dan itu tetap harus diinterpretasikan sebagai satu pola. Oleh karena itu, untuk menangani bahasa, kita perlu memperkenalkan jenis jaringan saraf baru, seperti *jaringan berulang* (recurrent networks) dan *transformer*. +Kita telah belajar menggunakan jaringan saraf untuk menangani data tabular dan gambar. Perbedaan utama antara jenis data tersebut dan teks adalah bahwa teks adalah urutan dengan panjang variabel, sementara ukuran input untuk gambar diketahui sebelumnya. Meskipun jaringan konvolusional bisa mengekstrak pola dari data input, pola dalam teks lebih kompleks. Misalnya, kita dapat memiliki negasi yang terpisah dari subjek dengan jarak kata yang bervariasi (misalnya *Saya tidak suka jeruk*, vs. *Saya tidak suka jeruk besar berwarna cerah yang enak itu*), dan itu tetap harus diinterpretasikan sebagai satu pola. Oleh karena itu, untuk menangani bahasa kita perlu memperkenalkan jenis jaringan saraf baru, seperti *jaringan berulang* dan *transformer*. -## Instalasi Pustaka +## Instalasi Perpustakaan -Jika Anda menggunakan instalasi Python lokal untuk menjalankan kursus ini, Anda mungkin perlu menginstal semua pustaka yang diperlukan untuk NLP menggunakan perintah berikut: +Jika Anda menggunakan instalasi Python lokal untuk menjalankan kursus ini, Anda mungkin perlu menginstal semua perpustakaan yang dibutuhkan untuk NLP dengan perintah berikut: **Untuk PyTorch** ```bash -pip install -r requirements-torch.txt +pip install -r requirements-pytorch.txt ``` **Untuk TensorFlow** ```bash @@ -39,13 +39,13 @@ pip install -r requirements-tf.txt ## Peringatan GPU -Di bagian ini, dalam beberapa contoh kita akan melatih model yang cukup besar. -* **Gunakan Komputer dengan GPU**: Disarankan untuk menjalankan notebook Anda di komputer yang mendukung GPU untuk mengurangi waktu tunggu saat bekerja dengan model besar. -* **Keterbatasan Memori GPU**: Menjalankan di GPU dapat menyebabkan situasi di mana memori GPU habis, terutama saat melatih model besar. +Dalam bagian ini, di beberapa contoh kita akan melatih model yang cukup besar. +* **Gunakan Komputer dengan GPU**: Disarankan menjalankan notebook Anda pada komputer dengan GPU untuk mengurangi waktu tunggu saat bekerja dengan model besar. +* **Keterbatasan Memori GPU**: Menjalankan di GPU bisa menyebabkan kehabisan memori GPU, terutama saat melatih model besar. * **Konsumsi Memori GPU**: Jumlah memori GPU yang digunakan selama pelatihan tergantung pada berbagai faktor, termasuk ukuran minibatch. -* **Minimalkan Ukuran Minibatch**: Jika Anda mengalami masalah memori GPU, pertimbangkan untuk mengurangi ukuran minibatch dalam kode Anda sebagai solusi potensial. -* **Pelepasan Memori GPU TensorFlow**: Versi lama TensorFlow mungkin tidak melepaskan memori GPU dengan benar saat melatih beberapa model dalam satu kernel Python. Untuk mengelola penggunaan memori GPU secara efektif, Anda dapat mengonfigurasi TensorFlow untuk mengalokasikan memori GPU hanya saat diperlukan. -* **Penyertaan Kode**: Untuk mengatur TensorFlow agar hanya menambah alokasi memori GPU saat diperlukan, sertakan kode berikut dalam notebook Anda: +* **Perkecil Ukuran Minibatch**: Jika Anda mengalami masalah memori GPU, pertimbangkan mengurangi ukuran minibatch dalam kode Anda sebagai solusi potensial. +* **Pelepasan Memori GPU di TensorFlow**: Versi TensorFlow lama mungkin tidak melepaskan memori GPU dengan benar saat melatih banyak model dalam satu kernel Python. Untuk mengelola penggunaan memori GPU secara efektif, Anda dapat mengonfigurasi TensorFlow agar hanya mengalokasikan memori GPU sesuai kebutuhan. +* **Inklusi Kode**: Untuk mengatur TensorFlow agar hanya meningkatkan alokasi memori GPU saat diperlukan, sertakan kode berikut dalam notebook Anda: ```python physical_devices = tf.config.list_physical_devices('GPU') @@ -53,10 +53,10 @@ if len(physical_devices)>0: tf.config.experimental.set_memory_growth(physical_devices[0], True) ``` -Jika Anda tertarik mempelajari NLP dari perspektif pembelajaran mesin klasik, kunjungi [rangkaian pelajaran ini](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP) +Jika Anda tertarik belajar NLP dari perspektif ML klasik, kunjungi [rangkaian pelajaran ini](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP) ## Dalam Bagian Ini -Di bagian ini kita akan mempelajari: +Dalam bagian ini kita akan mempelajari tentang: * [Merepresentasikan teks sebagai tensor](13-TextRep/README.md) * [Word Embeddings](14-Emdeddings/README.md) @@ -67,5 +67,7 @@ Di bagian ini kita akan mempelajari: --- -**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 diingat 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 profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file + +**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. + \ No newline at end of file diff --git a/translations/it/.co-op-translator.json b/translations/it/.co-op-translator.json index fecc952206..4d5e7293cb 100644 --- a/translations/it/.co-op-translator.json +++ b/translations/it/.co-op-translator.json @@ -5,6 +5,12 @@ "source_file": "AGENTS.md", "language_code": "it" }, + "CONTRIBUTING.md": { + "original_hash": "c6fd7e781b67111a90abd166d0ce4aa0", + "translation_date": "2026-07-08T21:15:35+00:00", + "source_file": "CONTRIBUTING.md", + "language_code": "it" + }, "README.md": { "original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b", "translation_date": "2026-04-06T21:07:23+00:00", @@ -17,6 +23,19 @@ "source_file": "SECURITY.md", "language_code": "it" }, + "__translation_failures__": { + "lessons/sketchnotes/LICENSE.md": { + "original_hash": "45ab63a2cd8f5faef6c9b150618837a4", + "source_file": "lessons/sketchnotes/LICENSE.md", + "language_code": "it", + "failure_date": "2026-07-08T21:15: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-26T07:15:49+00:00", @@ -54,8 +73,8 @@ "language_code": "it" }, "examples/README.md": { - "original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7", - "translation_date": "2025-10-03T11:30:10+00:00", + "original_hash": "7883d52c2e2a221e0b07a7b112a149b9", + "translation_date": "2026-07-08T21:09:55+00:00", "source_file": "examples/README.md", "language_code": "it" }, @@ -66,8 +85,8 @@ "language_code": "it" }, "lessons/0-course-setup/how-to-run.md": { - "original_hash": "a4717bd9103b9f6cd84d534b83534689", - "translation_date": "2026-01-15T14:20:38+00:00", + "original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1", + "translation_date": "2026-07-08T21:10:18+00:00", "source_file": "lessons/0-course-setup/how-to-run.md", "language_code": "it" }, @@ -191,6 +210,12 @@ "source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md", "language_code": "it" }, + "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": { + "original_hash": "99b816b6a4957ef4100cee4c4221dff9", + "translation_date": "2026-07-08T20:58:18+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", + "language_code": "it" + }, "lessons/4-ComputerVision/08-TransferLearning/lab/README.md": { "original_hash": "7765935c35fcee69b9fe2d0cfd6963e2", "translation_date": "2025-08-26T07:05:08+00:00", @@ -330,8 +355,8 @@ "language_code": "it" }, "lessons/5-NLP/README.md": { - "original_hash": "8ef02a9318257ea140ed3ed74442096d", - "translation_date": "2025-08-26T06:55:02+00:00", + "original_hash": "038df6f1a73e49f6430740da083bfd6d", + "translation_date": "2026-07-08T21:10:44+00:00", "source_file": "lessons/5-NLP/README.md", "language_code": "it" }, diff --git a/translations/it/CONTRIBUTING.md b/translations/it/CONTRIBUTING.md new file mode 100644 index 0000000000..040bb6458e --- /dev/null +++ b/translations/it/CONTRIBUTING.md @@ -0,0 +1,29 @@ +# Contribuire a AI-For-Beginners + +Grazie per il tuo interesse a contribuire a AI-For-Beginners! Accogliamo traduzioni, correzioni delle lezioni e modifiche al formato. + +## Contratto di Licenza per i Collaboratori Microsoft (CLA) + +Questo progetto accoglie contributi e suggerimenti. La maggior parte dei contributi richiede che tu accetti un Contratto di Licenza per i Collaboratori (CLA) dichiarando di avere il diritto e di concederci effettivamente i diritti di utilizzare il tuo contributo. Per dettagli, visita [https://cla.microsoft.com](https://cla.microsoft.com). + +Quando invii una pull request, un bot CLA determinerà automaticamente se devi fornire un CLA e decorerà opportunamente la PR (ad esempio, etichetta, commento). Segui semplicemente le istruzioni fornite dal bot. Dovrai farlo solo una volta per tutti i repository che utilizzano il nostro CLA. + +## Come Contribuire + +### 1. Correzione di Errori di Battitura / Codice +Se trovi un errore di battitura o un bug in qualsiasi notebook Jupyter o file markdown della lezione: +1. Fai il fork del repository. +2. Correggi l'errore di battitura o il collegamento interrotto. +3. Invia una Pull Request con una descrizione chiara della correzione. + +### 2. Invio di Traduzioni +Accogliamo con piacere traduzioni delle lezioni in altre lingue! Si prega di posizionare le traduzioni nella directory `translations/` usando i nomi di cartella esistenti (ad esempio `translations/es/`, `translations/pt-BR/`, `translations/zh-CN/`). + +Per maggiori dettagli, vedi [etc/CONTRIBUTING.md](etc/CONTRIBUTING.md). + +--- + + +**Disclaimer**: +Questo documento è stato tradotto utilizzando il servizio di traduzione AI [Co-op Translator](https://github.com/Azure/co-op-translator). Sebbene ci impegniamo per garantire la precisione, si prega di notare che le traduzioni automatizzate possono contenere errori o imprecisioni. Il documento originale nella sua lingua nativa deve essere considerato la fonte autorevole. Per informazioni critiche, si raccomanda una traduzione professionale effettuata da un essere umano. Non siamo responsabili per eventuali malintesi o interpretazioni errate derivanti dall’uso di questa traduzione. + \ No newline at end of file diff --git a/translations/it/examples/README.md b/translations/it/examples/README.md index 6117e293db..afe4355792 100644 --- a/translations/it/examples/README.md +++ b/translations/it/examples/README.md @@ -1,27 +1,27 @@ -# Esempi di AI per Principianti +# Esempi di Intelligenza Artificiale per Principianti -Benvenuto! Questa directory contiene esempi semplici e autonomi per aiutarti a iniziare con l'intelligenza artificiale e il machine learning. Ogni esempio è progettato per essere adatto ai principianti, con commenti dettagliati e spiegazioni passo dopo passo. +Benvenuto! Questa directory contiene esempi semplici e autonomi per aiutarti a iniziare con l'intelligenza artificiale e il machine learning. Ogni esempio è progettato per essere adatto ai principianti con commenti dettagliati e spiegazioni passo passo. ## 📚 Panoramica degli Esempi | Esempio | Descrizione | Difficoltà | Prerequisiti | |---------|-------------|------------|---------------| -| [Hello AI World](../../../examples/01-hello-ai-world.py) | Il tuo primo programma AI - riconoscimento di pattern semplice | ⭐ Principiante | Nozioni di base su Python | -| [Simple Neural Network](../../../examples/02-simple-neural-network.py) | Costruisci una rete neurale da zero | ⭐⭐ Principiante+ | Python, matematica di base | -| [Image Classifier](./03-image-classifier.ipynb) | Classifica immagini con un modello pre-addestrato | ⭐⭐ Principiante+ | Python, numpy | -| [Text Sentiment](../../../examples/04-text-sentiment.py) | Analizza il sentimento di un testo (positivo/negativo) | ⭐⭐ Principiante+ | Python | +| [Hello AI World](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/01-hello-ai-world.py) | Il tuo primo programma AI - semplice riconoscimento di pattern | ⭐ Principiante | Nozioni base di Python | +| [Simple Neural Network](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/02-simple-neural-network.py) | Costruisci una rete neurale da zero | ⭐⭐ Principiante+ | Python, matematica di base | +| [Image Classifier](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/03-image-classifier.ipynb) | Classifica immagini con un modello pre-addestrato | ⭐⭐ Principiante+ | Python, numpy | +| [Text Sentiment](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/04-text-sentiment.py) | Analizza il sentimento del testo (positivo/negativo) | ⭐⭐ Principiante+ | Python | ## 🚀 Per Iniziare ### Prerequisiti -Assicurati di avere Python installato (consigliato 3.8 o superiore). Installa i pacchetti richiesti: +Assicurati di avere Python installato (consigliata la versione 3.8 o superiore). Installa i pacchetti richiesti: ```bash -# For Python scripts +# Per script Python pip install numpy -# For Jupyter notebooks (image classifier) +# Per notebook Jupyter (classificatore di immagini) pip install jupyter numpy pillow tensorflow ``` @@ -46,21 +46,21 @@ jupyter notebook 03-image-classifier.ipynb ## 📖 Percorso di Apprendimento -Consigliamo di seguire gli esempi in ordine: +Si consiglia di seguire gli esempi in questo ordine: 1. **Inizia con "Hello AI World"** - Impara le basi del riconoscimento di pattern -2. **Costruisci una Semplice Rete Neurale** - Comprendi come funzionano le reti neurali -3. **Prova il Classificatore di Immagini** - Guarda l'AI in azione con immagini reali -4. **Analizza il Sentimento di un Testo** - Esplora l'elaborazione del linguaggio naturale +2. **Costruisci una rete neurale semplice** - Comprendi come funzionano le reti neurali +3. **Prova il classificatore di immagini** - Vedi l'AI in azione con immagini reali +4. **Analizza il sentimento del testo** - Esplora il trattamento del linguaggio naturale ## 💡 Consigli per Principianti - **Leggi attentamente i commenti nel codice** - Spiegano cosa fa ogni riga -- **Sperimenta!** - Prova a cambiare i valori e osserva cosa succede -- **Non preoccuparti di capire tutto subito** - L'apprendimento richiede tempo -- **Fai domande** - Usa il [Forum di discussione](https://github.com/microsoft/AI-For-Beginners/discussions) +- **Sperimenta!** - Prova a cambiare i valori e guarda cosa succede +- **Non preoccuparti di capire tutto subito** - Imparare richiede tempo +- **Fai domande** - Usa il [Forum di Discussione](https://github.com/microsoft/AI-For-Beginners/discussions) -## 🔗 Prossimi Passi +## 🔗 Passi Successivi Dopo aver completato questi esempi, esplora il curriculum completo: - [Introduzione all'AI](../lessons/1-Intro/README.md) @@ -77,9 +77,11 @@ Hai trovato utili questi esempi? Aiutaci a migliorarli: --- -*Ricorda: Ogni esperto è stato un principiante. Buon apprendimento! 🎓* +*Ricorda: ogni esperto è stato una volta un principiante. Buono studio! 🎓* --- -**Disclaimer**: -Questo documento è stato tradotto utilizzando il servizio di traduzione AI [Co-op Translator](https://github.com/Azure/co-op-translator). Sebbene ci impegniamo per garantire l'accuratezza, si prega di notare che le traduzioni automatiche possono contenere errori o imprecisioni. Il documento originale nella sua lingua nativa dovrebbe essere considerato la fonte autorevole. Per informazioni critiche, si raccomanda una traduzione professionale effettuata da un esperto umano. Non siamo responsabili per eventuali incomprensioni o interpretazioni errate derivanti dall'uso di questa traduzione. \ No newline at end of file + +**Disclaimer**: +Questo documento è stato tradotto utilizzando il servizio di traduzione AI [Co-op Translator](https://github.com/Azure/co-op-translator). Sebbene ci impegniamo per garantire la precisione, si prega di notare che le traduzioni automatizzate possono contenere errori o imprecisioni. Il documento originale nella sua lingua nativa deve essere considerato la fonte autorevole. Per informazioni critiche, si raccomanda una traduzione professionale effettuata da un essere umano. Non siamo responsabili per eventuali malintesi o interpretazioni errate derivanti dall’uso di questa traduzione. + \ No newline at end of file diff --git a/translations/it/lessons/0-course-setup/how-to-run.md b/translations/it/lessons/0-course-setup/how-to-run.md index 4adc510de0..a72ecfbac4 100644 --- a/translations/it/lessons/0-course-setup/how-to-run.md +++ b/translations/it/lessons/0-course-setup/how-to-run.md @@ -1,12 +1,12 @@ -# Come eseguire il codice +# Come Eseguire il Codice -Questo curriculum contiene molti esempi eseguibili e laboratori che vorresti eseguire. Per farlo, hai bisogno della capacità di eseguire codice Python nei Jupyter Notebook forniti come parte di questo curriculum. Hai diverse opzioni per eseguire il codice: +Questo curriculum contiene molti esempi eseguibili e laboratori che vorrai eseguire. Per farlo, hai bisogno della possibilità di eseguire codice Python nei Jupyter Notebook forniti come parte di questo curriculum. Hai diverse opzioni per eseguire il codice: ## Esegui localmente sul tuo computer -Per eseguire il codice localmente sul tuo computer, è necessaria un'installazione di Python. Una raccomandazione è installare **[miniconda](https://conda.io/en/latest/miniconda.html)** - si tratta di un'installazione piuttosto leggera che supporta il gestore di pacchetti `conda` per diversi **ambienti virtuali** Python. +Per eseguire il codice localmente sul tuo computer, è necessaria un'installazione di Python. Una raccomandazione è quella di installare **[miniconda](https://conda.io/en/latest/miniconda.html)** - è un'installazione piuttosto leggera che supporta il gestore di pacchetti `conda` per diversi **ambienti virtuali** Python. -Dopo aver installato miniconda, clona il repository e crea un ambiente virtuale da utilizzare per questo corso: +Dopo aver installato miniconda, clona il repository e crea un ambiente virtuale da usare per questo corso: ```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 ``` -### Usare Visual Studio Code con l'estensione Python +### Usare Visual Studio Code con l'Estensione Python -Questo curriculum è meglio utilizzato aprendolo in [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) con l'[estensione Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste). +Questo curriculum è meglio utilizzato aprendolo in [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) con l'[Estensione Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste). -> **Nota**: Una volta che cloni e apri la directory in VS Code, ti suggerirà automaticamente di installare le estensioni Python. Dovrai anche installare miniconda come descritto sopra. +> **Nota**: Una volta che cloni e apri la cartella in VS Code, ti suggerirà automaticamente di installare le estensioni Python. Dovrai anche installare miniconda come descritto sopra. -> **Nota**: Se VS Code ti suggerisce di riaprire il repository in un container, dovresti rifiutare per usare l'installazione Python locale. +> **Nota**: Se VS Code ti suggerisce di riaprire il repository in un contenitore, dovresti rifiutare per usare l'installazione Python locale. -### Usare Jupyter nel browser +### Usare Jupyter nel Browser -Puoi anche usare un ambiente Jupyter dal browser sul tuo computer. Sia il classico Jupyter che JupyterHub offrono un ambiente di sviluppo comodo con completamento automatico, evidenziazione del codice, ecc. +Puoi anche usare un ambiente Jupyter dal browser sul tuo computer. Sia Jupyter classico che JupyterHub forniscono un ambiente di sviluppo comodo con completamento automatico, evidenziazione del codice, ecc. -Per iniziare Jupyter localmente, vai nella directory del corso ed esegui: +Per avviare Jupyter localmente, vai nella cartella del corso ed esegui: ```bash jupyter notebook @@ -36,36 +36,36 @@ o ```bash jupyterhub ``` -Puoi quindi navigare in uno qualsiasi dei file `.ipynb`, aprirli e iniziare a lavorare. +Poi puoi navigare su qualsiasi file `.ipynb`, aprirlo e iniziare a lavorare. ### Esecuzione in contenitore -Un'alternativa all'installazione di Python sarebbe eseguire il codice in un contenitore. Poiché il nostro repository fornisce una cartella speciale `.devcontainer` che spiega come costruire un contenitore per questo repo, VS Code offre l'opportunità di riaprire il codice in un contenitore. Questo richiederà l'installazione di Docker e sarà anche più complesso, quindi lo consigliamo a utenti più esperti. +Un'alternativa all'installazione di Python sarebbe eseguire il codice in un contenitore. Poiché il nostro repository fornisce una cartella speciale `.devcontainer` che indica come costruire un contenitore per questo repo, VS Code offre la possibilità di riaprire il codice in un contenitore. Questo richiederà l'installazione di Docker e sarebbe più complesso, quindi raccomandiamo questo a utenti più esperti. -## Esecuzione nel cloud +## Esecuzione nel Cloud -Se non vuoi installare Python localmente e hai accesso ad alcune risorse cloud, una buona alternativa è eseguire il codice nel cloud. Ci sono diversi modi per farlo: +Se non vuoi installare Python localmente e hai accesso a risorse cloud, un'ottima alternativa è eseguire il codice nel cloud. Ci sono diversi modi per farlo: -* Usare **[GitHub Codespaces](https://github.com/features/codespaces)**, che è un ambiente virtuale creato per te su GitHub, accessibile tramite un'interfaccia browser di VS Code. Se hai accesso a Codespaces, puoi semplicemente cliccare sul pulsante **Code** nel repo, avviare un codespace e iniziare rapidamente. -* Usare **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) offre risorse di calcolo gratuite fornite nel cloud per persone come te per testare del codice su GitHub. C'è un pulsante nella pagina principale per aprire il repository in Binder - questo ti porterà rapidamente al sito di binder, che costruirà un contenitore sottostante e avvierà un'interfaccia web Jupyter per te senza interruzioni. +* Usare **[GitHub Codespaces](https://github.com/features/codespaces)**, che è un ambiente virtuale creato per te su GitHub, accessibile tramite un'interfaccia browser di VS Code. Se hai accesso a Codespaces, puoi semplicemente cliccare il pulsante **Code** nel repo, avviare un codespace e iniziare subito. +* Usare **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) offre risorse di calcolo gratuite nel cloud per persone come te per testare codice su GitHub. C'è un pulsante nella pagina principale per aprire il repository in Binder - questo ti porterà rapidamente al sito di Binder, che costruirà un contenitore sottostante e avvierà un'interfaccia web Jupyter per te senza soluzione di continuità. -> **Nota**: Per prevenire abusi, Binder ha accesso bloccato ad alcune risorse web. Questo potrebbe impedire che parte del codice funzioni, specialmente quello che cerca di scaricare modelli e/o dataset da Internet pubblico. Potresti dover trovare alcune soluzioni alternative. Inoltre, le risorse di calcolo fornite da Binder sono piuttosto basilari, quindi l'addestramento sarà lento, specialmente nelle lezioni successive, più complesse. +> **Nota**: Per prevenire abusi, Binder ha accesso bloccato ad alcune risorse web. Questo può impedire ad alcune parti del codice di funzionare, che recuperano modelli e/o dataset da Internet pubblico. Potresti dover trovare qualche soluzione alternativa. Inoltre, le risorse di calcolo fornite da Binder sono piuttosto basiche, quindi l'addestramento sarà lento, specialmente nelle lezioni più avanzate e complesse. -## Esecuzione nel cloud con GPU +## Esecuzione nel Cloud con GPU -Alcune lezioni successive di questo curriculum trarrebbero grande beneficio dal supporto GPU. L'addestramento dei modelli, per esempio, può essere dolorosamente lento altrimenti. Ci sono alcune opzioni che puoi seguire, specialmente se hai accesso al cloud tramite [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste), o tramite la tua istituzione: +Alcune delle lezioni avanzate in questo curriculum trarrebbero gran beneficio dal supporto GPU. L'addestramento di modelli, per esempio, può essere dolorosamente lento senza. Ci sono alcune opzioni che puoi seguire, specialmente se hai accesso al cloud tramite [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste), o tramite la tua istituzione: -* Crea una [Data Science Virtual Machine](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) e connettiti tramite Jupyter. Puoi quindi clonare il repo direttamente sulla macchina e iniziare a imparare. Le VM della serie NC hanno supporto GPU. +* Creare una [Virtual Machine per Data Science](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) e connettersi ad essa tramite Jupyter. Puoi poi clonare il repo direttamente sulla macchina e iniziare a studiare. Le VM serie NC hanno supporto GPU. -> **Nota**: Alcuni abbonamenti, inclusi Azure for Students, non forniscono supporto GPU di default. Potresti dover richiedere core GPU aggiuntivi tramite richiesta di supporto tecnico. +> **Nota**: Alcuni abbonamenti, incluso Azure for Students, non forniscono supporto GPU predefinito. Potresti dover richiedere core GPU aggiuntivi tramite una richiesta di supporto tecnico. -* Crea un [Azure Machine Learning Workspace](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) e quindi usa la funzione Notebook lì. [Questo video](https://azure-for-academics.github.io/quickstart/azureml-papers/) mostra come clonare un repository in un notebook Azure ML e iniziare a usarlo. +* Creare uno [Azure Machine Learning Workspace](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) e poi usare la funzione Notebook lì. [Questo video](https://azure-for-academics.github.io/quickstart/azureml-papers/) mostra come clonare un repository in un notebook Azure ML e iniziare a usarlo. -Puoi anche usare Google Colab, che viene fornito con un certo supporto GPU gratuito, e caricare lì i Jupyter Notebook per eseguirli uno alla volta. +Puoi anche usare Google Colab, che include un certo supporto GPU gratuito, e caricare i Jupyter Notebook lì per eseguirli uno per uno. --- **Disclaimer**: -Questo documento è stato tradotto utilizzando il servizio di traduzione AI [Co-op Translator](https://github.com/Azure/co-op-translator). Pur impegnandoci per garantire accuratezza, si prega di considerare che le traduzioni automatiche possono contenere errori o inesattezze. Il documento originale nella sua lingua madre deve essere considerato la fonte autorevole. Per informazioni importanti, si consiglia una traduzione professionale effettuata da un esperto umano. Non ci assumiamo responsabilità per eventuali malintesi o interpretazioni errate derivanti dall’uso di questa traduzione. +Questo documento è stato tradotto utilizzando il servizio di traduzione AI [Co-op Translator](https://github.com/Azure/co-op-translator). Sebbene ci impegniamo per garantire la precisione, si prega di notare che le traduzioni automatizzate possono contenere errori o imprecisioni. Il documento originale nella sua lingua nativa deve essere considerato la fonte autorevole. Per informazioni critiche, si raccomanda una traduzione professionale effettuata da un essere umano. Non siamo responsabili per eventuali malintesi o interpretazioni errate derivanti dall’uso di questa traduzione. \ No newline at end of file diff --git a/translations/it/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/it/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index e7bade143b..48322cc1df 100644 --- a/translations/it/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/it/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -4,11 +4,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Modelli pre-addestrati e apprendimento per trasferimento\n", + "# Modelli pre-addestrati e apprendimento trasferito\n", "\n", - "Addestrare le CNN può richiedere molto tempo e una grande quantità di dati. Tuttavia, gran parte del tempo viene impiegato per apprendere i migliori filtri di basso livello che una rete utilizza per estrarre schemi dalle immagini. Sorge una domanda naturale: possiamo utilizzare una rete neurale addestrata su un dataset e adattarla per classificare immagini diverse senza dover eseguire l'intero processo di addestramento?\n", + "L'addestramento delle CNN può richiedere molto tempo e per questo compito è necessario un grande quantitativo di dati. Tuttavia, gran parte del tempo viene speso per imparare i migliori filtri di basso livello che una rete utilizza per estrarre pattern dalle immagini. Sorge dunque una domanda naturale: possiamo usare una rete neurale addestrata su un dataset e adattarla a classificare immagini diverse senza dover completare un processo di addestramento completo?\n", "\n", - "Questo approccio è chiamato **apprendimento per trasferimento**, perché trasferiamo alcune conoscenze da un modello di rete neurale a un altro. Nell'apprendimento per trasferimento, di solito si parte da un modello pre-addestrato, che è stato addestrato su un grande dataset di immagini, come **ImageNet**. Questi modelli sono già in grado di estrarre efficacemente diverse caratteristiche da immagini generiche e, in molti casi, costruire semplicemente un classificatore sopra queste caratteristiche estratte può portare a buoni risultati.\n" + "Questo approccio è chiamato **apprendimento trasferito**, perché trasferiamo una certa conoscenza da un modello di rete neurale a un altro. Nell'apprendimento trasferito, tipicamente iniziamo con un modello pre-addestrato, il quale è stato addestrato su un grande dataset di immagini, come **ImageNet**. Questi modelli sono già in grado di svolgere un buon lavoro nell'estrarre diverse caratteristiche da immagini generiche, e in molti casi costruire un classificatore sopra queste caratteristiche estratte può dare un buon risultato.\n" ] }, { @@ -29,11 +29,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Dataset Cats vs. Dogs\n", + "## Dataset Gatti vs. Cani\n", "\n", - "In questa unità, affronteremo un problema reale di classificazione di immagini di gatti e cani. Per questo motivo, utilizzeremo il [Dataset Cats vs. Dogs di Kaggle](https://www.kaggle.com/c/dogs-vs-cats), che può essere scaricato anche [da Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n", + "In questa unità, risolveremo un problema reale di classificazione delle immagini di gatti e cani. Per questo motivo, utilizzeremo il [Dataset Gatti vs. Cani di Kaggle](https://www.kaggle.com/c/dogs-vs-cats), che può anche essere scaricato [da Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n", "\n", - "Scarichiamo questo dataset ed estraiamolo nella directory `data` (questo processo potrebbe richiedere un po' di tempo!):\n" + "Scarichiamo questo dataset e estraiamolo nella directory `data` (questo processo potrebbe richiedere un po' di tempo!):\n" ] }, { @@ -64,7 +64,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Sfortunatamente, ci sono alcuni file immagine corrotti nel dataset. Dobbiamo fare una rapida pulizia per controllare i file corrotti. Per non appesantire questo tutorial, abbiamo spostato il codice per verificare il dataset in un modulo.\n" + "Purtroppo, ci sono alcuni file immagine corrotti nel set di dati. Dobbiamo fare una rapida pulizia per controllare i file corrotti. Per non rovinare questo tutorial, abbiamo spostato il codice per verificare il set di dati in un modulo.\n" ] }, { @@ -335,11 +335,11 @@ "source": [ "## Caricamento del Dataset\n", "\n", - "Nei precedenti esempi, abbiamo caricato dataset già integrati in Keras. Ora stiamo per lavorare con un nostro dataset, che dobbiamo caricare da una directory di immagini.\n", + "Negli esempi precedenti, abbiamo caricato dataset incorporati in Keras. Ora ci apprestiamo a gestire il nostro dataset, che dobbiamo caricare da una directory di immagini.\n", "\n", - "Nella vita reale, la dimensione dei dataset di immagini può essere piuttosto grande, e non si può fare affidamento sul fatto che tutti i dati possano essere caricati in memoria. Per questo motivo, i dataset sono spesso rappresentati come **generatori** che possono restituire i dati in minibatch adatti per l'addestramento.\n", + "Nella vita reale, la dimensione dei dataset di immagini può essere abbastanza grande, e non si può contare che tutti i dati possano stare in memoria. Pertanto, i dataset sono spesso rappresentati come **generatori** che possono restituire dati in minibatch adatti per l’addestramento.\n", "\n", - "Per gestire la classificazione delle immagini, Keras include una funzione speciale chiamata `image_dataset_from_directory`, che può caricare immagini da sottodirectory corrispondenti a diverse classi. Questa funzione si occupa anche di scalare le immagini e può suddividere il dataset in sottoinsiemi di training e test:\n" + "Per gestire la classificazione delle immagini, Keras include una funzione speciale `image_dataset_from_directory`, che può caricare immagini da sottodirectory corrispondenti a classi diverse. Questa funzione si occupa anche di ridimensionare le immagini e può anche dividere il dataset in sottogruppi di addestramento e test:\n" ] }, { @@ -383,9 +383,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "È importante impostare lo stesso valore di `seed` per entrambe le chiamate, poiché influisce sulla suddivisione delle immagini tra il dataset di addestramento e quello di test.\n", + "È importante impostare lo stesso valore `seed` per entrambe le chiamate, perché influisce sulla divisione delle immagini tra il set di addestramento e quello di test.\n", "\n", - "Il dataset rileva automaticamente i nomi delle classi dalle directory e puoi accedervi, se necessario, chiamando:\n" + "Dataset recupera automaticamente i nomi delle classi dalle directory, e puoi accedervi se necessario chiamando:\n" ] }, { @@ -412,7 +412,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "I dataset che abbiamo ottenuto possono essere direttamente passati alla funzione `fit` per addestrare il modello. Contengono sia immagini corrispondenti che etichette, che possono essere iterate utilizzando la seguente costruzione:\n" + "I set di dati che abbiamo ottenuto possono essere direttamente passati alla funzione `fit` per addestrare il modello. Contengono sia le immagini corrispondenti che le etichette, che possono essere iterate utilizzando la seguente costruzione:\n" ] }, { @@ -453,7 +453,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "> **Nota**: Tutte le immagini nel dataset sono rappresentate come tensori a virgola mobile con intervallo 0-255. Prima di passarle alla rete neurale, dobbiamo scalare questi valori nell'intervallo 0-1. Quando tracciamo le immagini, dobbiamo fare lo stesso oppure convertire i valori nel tipo `int` (come facciamo nel codice sopra), per mostrare a `matplotlib` che vogliamo tracciare l'immagine originale non scalata.\n" + "> **Nota**: Tutte le immagini nel dataset sono rappresentate come tensori a virgola mobile con intervallo 0-255. Prima di passarle alla rete neurale, dobbiamo scalare questi valori nell'intervallo 0-1. Quando tracciamo le immagini, dobbiamo fare lo stesso o convertire i valori in tipo `int` (come facciamo nel codice sopra), per mostrare a `matplotlib` che vogliamo tracciare l'immagine originale non scalata.\n" ] }, { @@ -462,7 +462,7 @@ "source": [ "## Modelli pre-addestrati\n", "\n", - "Per molti compiti di classificazione delle immagini è possibile trovare modelli di reti neurali pre-addestrati. Molti di questi modelli sono disponibili all'interno del namespace `keras.applications`, e ancora più modelli possono essere trovati su Internet. Vediamo come caricare e utilizzare il modello più semplice, VGG-16:\n" + "Per molti compiti di classificazione delle immagini si possono trovare modelli di reti neurali pre-addestrati. Molti di questi modelli sono disponibili all'interno dello spazio dei nomi `keras.applications`, e molti altri modelli si possono trovare su Internet. Vediamo come il modello più semplice, VGG-16, può essere caricato e utilizzato:\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": [ - "Ci sono un paio di cose importanti da tenere a mente:\n", - "\n", - "* Prima di passare un input a qualsiasi rete pre-addestrata, è necessario pre-processarlo in un certo modo. Questo viene fatto chiamando la funzione corrispondente `preprocess_input`, che riceve un batch di immagini e restituisce la loro forma processata. Nel caso di VGG-16, le immagini vengono normalizzate e viene sottratto un valore medio predefinito per ciascun canale. Questo perché VGG-16 è stata originariamente addestrata con questo tipo di pre-elaborazione.\n", - "* La rete neurale viene applicata al batch di input e, come risultato, otteniamo un batch di tensori a 1000 elementi che mostrano la probabilità di ciascuna classe. Possiamo trovare il numero della classe più probabile chiamando `argmax` su questo tensore.\n", - "* Il risultato ottenuto è un [numero di una classe di `ImageNet`](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Per dare un senso a questo risultato, possiamo anche utilizzare la funzione `decode_predictions`, che restituisce le prime n classi insieme ai loro nomi.\n" + "Ci sono un paio di cose importanti qui:\n", + "* Prima di passare un input a una rete pre-addestrata, deve essere pre-elaborato in un certo modo. Questo viene fatto chiamando la corrispondente funzione `preprocess_input`, che riceve un batch di immagini e restituisce la loro forma elaborata. Nel caso di VGG-16, le immagini vengono normalizzate e viene sottratto un valore medio predefinito per ciascun canale. Questo perché VGG-16 è stato originariamente addestrato con questa pre-elaborazione.\n", + "* La rete neurale viene applicata al batch di input, e riceviamo come risultato un batch di tensori da 1000 elementi che mostrano la probabilità di ciascuna classe. Possiamo trovare il numero della classe più probabile chiamando `argmax` su questo tensore.\n", + "* Il risultato ottenuto è un [numero di una classe `ImageNet`](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Per dare un senso a questo risultato, possiamo anche usare la funzione `decode_predictions`, che restituisce le prime n classi insieme ai loro nomi.\n" ] }, { @@ -600,7 +609,7 @@ "source": [ "## Calcoli GPU\n", "\n", - "Le reti neurali profonde, come VGG-16 e altre architetture più moderne, richiedono una notevole potenza di calcolo per funzionare. Ha senso utilizzare l'accelerazione GPU, se disponibile. Fortunatamente, Keras accelera automaticamente i calcoli sulla GPU se è disponibile. Possiamo verificare se Tensorflow è in grado di utilizzare la GPU con il seguente codice:\n" + "Le reti neurali profonde, come VGG-16 e altre architetture più moderne richiedono una notevole potenza di calcolo per funzionare. Ha senso usare l'accelerazione GPU, se disponibile. Fortunatamente, Keras velocizza automaticamente i calcoli sulla GPU se è disponibile. Possiamo verificare se Tensorflow è in grado di utilizzare la GPU con il seguente codice:\n" ] }, { @@ -627,9 +636,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ + "\n", "## Estrazione delle caratteristiche VGG\n", "\n", - "Se vogliamo utilizzare VGG-16 per estrarre caratteristiche dalle nostre immagini, abbiamo bisogno del modello senza gli strati finali di classificazione. Possiamo istanziare il modello VGG-16 senza gli strati superiori utilizzando questo codice:\n" + "Se vogliamo utilizzare VGG-16 per estrarre le caratteristiche dalle nostre immagini, abbiamo bisogno del modello senza i livelli finali di classificazione. Possiamo istanziare il modello VGG-16 senza i livelli superiori usando questo codice:\n" ] }, { @@ -681,9 +691,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "La dimensione del tensore delle caratteristiche è 7x7x512, ma per visualizzarlo abbiamo dovuto riformattarlo in una forma 2D.\n", + "La dimensione del tensore delle caratteristiche è 7x7x512, ma per visualizzarlo abbiamo dovuto rimodellarlo in forma 2D.\n", "\n", - "Ora proviamo a vedere se queste caratteristiche possono essere utilizzate per classificare immagini. Prendiamo manualmente una parte delle immagini (50 minibatch, nel nostro caso) e pre-calcoliamo i loro vettori di caratteristiche. Possiamo utilizzare l'API **dataset** di Tensorflow per farlo. La funzione `map` prende un dataset e applica una lambda-function fornita per trasformarlo. Utilizziamo questo meccanismo per costruire nuovi dataset, `ds_features_train` e `ds_features_test`, che contengono le caratteristiche estratte da VGG invece delle immagini originali.\n" + "Ora proviamo a vedere se queste caratteristiche possono essere utilizzate per classificare le immagini. Prendiamo manualmente una parte delle immagini (50 minibatch, nel nostro caso) e pre-calcoliamo i loro vettori di caratteristiche. Possiamo usare l'API **dataset** di Tensorflow per farlo. La funzione `map` prende un dataset e applica una data lambda-funzione per trasformarlo. Usimo questo meccanismo per costruire nuovi dataset, `ds_features_train` e `ds_features_test`, che contengono caratteristiche estratte da VGG invece delle immagini originali.\n" ] }, { @@ -713,9 +723,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Abbiamo utilizzato la costruzione `.take(50)` per limitare la dimensione del dataset, al fine di velocizzare la nostra dimostrazione. Naturalmente, puoi eseguire questo esperimento sull'intero dataset.\n", + "Abbiamo usato la costruzione `.take(50)` per limitare la dimensione del dataset, per velocizzare la nostra dimostrazione. Naturalmente, puoi eseguire questo esperimento sull'intero dataset.\n", "\n", - "Ora che abbiamo un dataset con caratteristiche estratte, possiamo addestrare un semplice classificatore denso per distinguere tra gatti e cani. Questa rete prenderà un vettore di caratteristiche con forma (7,7,512) e produrrà un output che corrisponde a un cane o a un gatto. Poiché si tratta di una classificazione binaria, utilizziamo la funzione di attivazione `sigmoid` e la perdita `binary_crossentropy`.\n" + "Ora che abbiamo un dataset con caratteristiche estratte, possiamo addestrare un semplice classificatore denso per distinguere tra gatti e cani. Questa rete prenderà un vettore di caratteristiche di forma (7,7,512), e produrrà un output che corrisponde a un cane o a un gatto. Poiché si tratta di una classificazione binaria, usiamo la funzione di attivazione `sigmoid` e la perdita `binary_crossentropy`.\n" ] }, { @@ -744,13 +754,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Il risultato è ottimo, possiamo distinguere tra un gatto e un cane con una probabilità quasi del 95%! Tuttavia, abbiamo testato questo approccio solo su un sottoinsieme di tutte le immagini, perché l'estrazione manuale delle caratteristiche sembra richiedere molto tempo.\n", + "Il risultato è ottimo, possiamo distinguere tra un gatto e un cane con quasi il 95% di probabilità! Tuttavia, abbiamo testato questo approccio solo su un sottoinsieme di tutte le immagini, perché l'estrazione manuale delle caratteristiche sembra richiedere molto tempo.\n", "\n", "## Apprendimento per trasferimento utilizzando una rete VGG\n", "\n", - "Possiamo anche evitare di pre-calcolare manualmente le caratteristiche utilizzando l'intera rete VGG-16 originale durante l'addestramento, aggiungendo un estrattore di caratteristiche alla nostra rete come primo strato.\n", + "Possiamo anche evitare di pre-calcolare manualmente le caratteristiche utilizzando l'originale rete VGG-16 nel suo insieme durante l'addestramento, aggiungendo l'estrattore di caratteristiche alla nostra rete come primo strato.\n", "\n", - "La bellezza dell'architettura di Keras è che il modello VGG-16 che abbiamo definito sopra può essere utilizzato anche come strato in un'altra rete neurale! Basta costruire una rete con un classificatore denso sopra di essa e poi addestrare l'intera rete utilizzando la retropropagazione.\n" + "La bellezza dell'architettura Keras è che il modello VGG-16 che abbiamo definito sopra può anche essere utilizzato come uno strato in un'altra rete neurale! Dobbiamo solo costruire una rete con un classificatore denso sopra di essa, e poi addestrare l'intera rete usando la retropropagazione.\n" ] }, { @@ -794,13 +804,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Questo modello sembra una rete di classificazione end-to-end, che prende un'immagine e restituisce la classe. Tuttavia, la parte complicata è che vogliamo che VGG16 funzioni come un estrattore di caratteristiche e non venga riaddestrato. Pertanto, dobbiamo **bloccare i pesi dell'estrattore di caratteristiche convoluzionali**. Possiamo accedere al primo strato della rete chiamando `model.layers[0]`, e dobbiamo semplicemente impostare la proprietà `trainable` su `False`.\n", + "Questo modello sembra una rete di classificazione end-to-end, che prende un'immagine e restituisce la classe. Tuttavia, la cosa complicata è che vogliamo che VGG16 agisca come estrattore di caratteristiche, e non venga riaddestrato. Pertanto, dobbiamo **congelare i pesi dell'estrattore di caratteristiche convoluzionali**. Possiamo accedere al primo strato della rete chiamando `model.layers[0]`, e dobbiamo solo impostare la proprietà `trainable` su `False`.\n", "\n", - "> **Nota**: Bloccare i pesi dell'estrattore di caratteristiche è necessario, perché altrimenti lo strato classificatore non addestrato potrebbe compromettere i pesi pre-addestrati originali dell'estrattore convoluzionale.\n", + "> **Nota**: Il congelamento dei pesi dell'estrattore di caratteristiche è necessario, perché altrimenti lo strato classificatore non addestrato potrebbe distruggere i pesi pre-addestrati originali dell'estrattore convoluzionale.\n", "\n", - "Puoi notare che, mentre il numero totale di parametri nella nostra rete è di circa 15 milioni, stiamo addestrando solo 25k parametri. Tutti gli altri parametri dei filtri convoluzionali di alto livello sono pre-addestrati. Questo è positivo, perché possiamo ottimizzare un numero più piccolo di parametri con un numero più ridotto di esempi.\n", + "Puoi notare che mentre il numero totale di parametri nella nostra rete è circa 15 milioni, stiamo allenando solo 25k parametri. Tutti gli altri parametri dei filtri convoluzionali di alto livello sono pre-addestrati. Questo è positivo, perché possiamo fare il fine-tuning di un numero minore di parametri con un numero minore di esempi.\n", "\n", - "Ora procederemo con l'addestramento della nostra rete e vedremo quanto possiamo migliorare. Aspettati tempi di esecuzione piuttosto lunghi e non preoccuparti se l'esecuzione sembra bloccata per un po'.\n" + "Ora alleneremo la nostra rete e vedremo quanto possiamo migliorare. Aspettati un tempo di esecuzione piuttosto lungo, e non ti preoccupare se l'esecuzione sembra bloccata per un po'.\n" ] }, { @@ -825,11 +835,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Sembra che abbiamo ottenuto un classificatore abbastanza accurato per gatti contro cani!\n", + "Sembra che abbiamo ottenuto un classificatore di gatti e cani ragionevolmente accurato! \n", "\n", "## Salvare e Caricare il Modello\n", "\n", - "Una volta che abbiamo addestrato il modello, possiamo salvare l'architettura del modello e i pesi addestrati in un file per utilizzi futuri:\n" + "Una volta addestrato il modello, possiamo salvare l’architettura del modello e i pesi addestrati in un file per usi futuri:\n" ] }, { @@ -853,7 +863,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Possiamo quindi caricare il modello dal file in qualsiasi momento. Potresti trovarlo utile nel caso in cui il prossimo esperimento distrugga il modello - non dovresti ricominciare da zero.\n" + "Possiamo quindi caricare il modello dal file in qualsiasi momento. Potresti trovarlo utile nel caso in cui il prossimo esperimento distrugga il modello - non dovresti ricominciare da capo.\n" ] }, { @@ -869,15 +879,15 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Ottimizzazione del transfer learning\n", + "## Apprendimento per trasferimento con messa a punto fine\n", "\n", - "Nella sezione precedente, abbiamo addestrato il livello finale del classificatore per classificare le immagini nel nostro dataset. Tuttavia, non abbiamo riaddestrato l'estrattore di caratteristiche, e il nostro modello si è basato sulle caratteristiche apprese dai dati di ImageNet. Se i tuoi oggetti differiscono visivamente dalle immagini comuni di ImageNet, questa combinazione di caratteristiche potrebbe non funzionare al meglio. Per questo motivo, ha senso iniziare ad addestrare anche i livelli convoluzionali.\n", + "Nella sezione precedente, abbiamo addestrato lo strato finale del classificatore per classificare le immagini nel nostro set di dati. Tuttavia, non abbiamo riaddestrato l'estrattore di caratteristiche, e il nostro modello si è basato sulle caratteristiche che il modello ha appreso dai dati di ImageNet. Se i tuoi oggetti differiscono visivamente dalle immagini ordinarie di ImageNet, questa combinazione di caratteristiche potrebbe non funzionare al meglio. Pertanto ha senso iniziare ad addestrare anche i livelli convoluzionali.\n", "\n", - "Per farlo, possiamo sbloccare i parametri dei filtri convoluzionali che avevamo precedentemente bloccato.\n", + "Per fare ciò, possiamo sbloccare i parametri dei filtri convoluzionali che abbiamo precedentemente congelato. \n", "\n", - "> **Nota:** È importante bloccare prima i parametri e svolgere diversi epoch di addestramento per stabilizzare i pesi nel livello di classificazione. Se inizi immediatamente ad addestrare la rete end-to-end con i parametri sbloccati, è probabile che grandi errori distruggano i pesi pre-addestrati nei livelli convoluzionali.\n", + "> **Nota:** È importante congelare prima i parametri ed eseguire qualche epoca di addestramento per stabilizzare i pesi nello strato di classificazione. Se inizi immediatamente ad addestrare la rete end-to-end con i parametri sbloccati, grandi errori potrebbero distruggere i pesi pre-addestrati negli strati convoluzionali.\n", "\n", - "Il nostro modello convoluzionale VGG-16 si trova all'interno del primo livello ed è composto a sua volta da molti livelli. Possiamo dare un'occhiata alla sua struttura:\n" + "Il nostro modello convoluzionale VGG-16 si trova all'interno del primo strato, e a sua volta è composto da molti strati. Possiamo dare un'occhiata alla sua struttura: \n" ] }, { @@ -945,7 +955,9 @@ { "cell_type": "markdown", "metadata": {}, - "source": [] + "source": [ + "Possiamo sbloccare tutti i layer della base convoluzionale:\n" + ] }, { "cell_type": "code", @@ -960,7 +972,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Tuttavia, sbloccare tutti quanti contemporaneamente non è la soluzione migliore. Possiamo iniziare sbloccando solo alcuni degli ultimi strati di convoluzioni, perché contengono schemi di livello superiore rilevanti per le nostre immagini. Ad esempio, per cominciare, possiamo congelare tutti gli strati tranne gli ultimi 4:\n" + "Tuttavia, sbloccare tutti loro contemporaneamente non è la scelta migliore. Possiamo prima sbloccare solo alcuni degli ultimi strati di convoluzione, perché contengono pattern di livello più alto rilevanti per le nostre immagini. Ad esempio, per cominciare, possiamo bloccare tutti gli strati eccetto gli ultimi 4: \n" ] }, { @@ -999,11 +1011,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Osserva che il numero di parametri allenabili è aumentato significativamente, ma è ancora circa il 50% di tutti i parametri.\n", + "Osserva che il numero di parametri addestrabili è aumentato significativamente, ma è ancora circa il 50% di tutti i parametri.\n", "\n", - "Dopo aver sbloccato i livelli, possiamo fare qualche altra epoca di addestramento (nel nostro esempio, ne faremo solo una). Puoi anche scegliere un tasso di apprendimento più basso, per minimizzare l'impatto sui pesi pre-addestrati. Tuttavia, anche con un tasso di apprendimento basso, puoi aspettarti che la precisione diminuisca all'inizio dell'addestramento, per poi raggiungere un livello leggermente più alto rispetto al caso dei pesi fissi.\n", + "Dopo lo sblocco, possiamo fare ancora qualche epoca di addestramento (nel nostro esempio, ne faremo solo una). Puoi anche selezionare un tasso di apprendimento più basso, per minimizzare l'impatto sui pesi pre-addestrati. Tuttavia, anche con un tasso di apprendimento basso, puoi aspettarti che la precisione cali all'inizio dell'addestramento, fino a raggiungere infine un livello leggermente superiore rispetto al caso con pesi fissi.\n", "\n", - "> **Nota:** Questo addestramento avviene molto più lentamente, perché dobbiamo propagare i gradienti attraverso molti livelli della rete!\n" + "> **Nota:** Questo addestramento avviene molto più lentamente, perché dobbiamo propagare i gradienti indietro attraverso molti strati della rete!\n" ] }, { @@ -1027,9 +1039,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "È probabile che otterremo una maggiore accuratezza di addestramento, poiché stiamo utilizzando una rete più potente con più parametri, ma l'accuratezza di validazione non aumenterà altrettanto.\n", + "Probabilmente otterremo un'accuratezza di addestramento più elevata, perché stiamo utilizzando una rete più potente con più parametri, ma l'accuratezza di validazione non aumenterà altrettanto.\n", "\n", - "Sentiti libero di sbloccare qualche altro livello della rete e continuare l'addestramento per vedere se riesci a raggiungere una maggiore accuratezza!\n" + "Sentiti libero di sbloccare qualche altro strato della rete e allenarti di più, per vedere se riesci a ottenere un'accuratezza maggiore!\n" ] }, { @@ -1038,7 +1050,7 @@ "source": [ "## Altri modelli di visione artificiale\n", "\n", - "VGG-16 è una delle architetture di visione artificiale più semplici. Keras offre molte altre reti pre-addestrate. Tra le più utilizzate ci sono le architetture **ResNet**, sviluppate da Microsoft, e **Inception** di Google. Ad esempio, esploriamo l'architettura del modello ResNet-50 più semplice (ResNet è una famiglia di modelli con profondità diverse; puoi provare a sperimentare con ResNet-152 se vuoi vedere come appare un modello davvero profondo):\n" + "VGG-16 è una delle architetture di visione artificiale più semplici. Keras offre molte altre reti pre-addestrate. Le più utilizzate tra queste sono le architetture **ResNet**, sviluppate da Microsoft, e **Inception** di Google. Ad esempio, esploriamo l'architettura del modello ResNet-50 più semplice (ResNet è una famiglia di modelli con diverse profondità, puoi provare a sperimentare con ResNet-152 se vuoi vedere com'è un modello veramente profondo):\n" ] }, { @@ -1440,11 +1452,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Come puoi vedere, il modello contiene gli stessi blocchi costitutivi familiari: livelli convoluzionali, livelli di pooling e un classificatore denso finale. Possiamo utilizzare questo modello esattamente nello stesso modo in cui abbiamo utilizzato VGG-16 per il transfer learning. Puoi provare a sperimentare con il codice sopra, utilizzando diversi modelli ResNet come modello di base, e osservare come cambia l'accuratezza.\n", + "Come puoi vedere, il modello contiene gli stessi blocchi costitutivi familiari: strati convoluzionali, strati di pooling e classificatore denso finale. Possiamo utilizzare questo modello esattamente nello stesso modo in cui abbiamo usato VGG-16 per il transfer learning. Puoi provare a sperimentare con il codice sopra, usando diversi modelli ResNet come modello base, e vedere come cambia la precisione.\n", "\n", "## Batch Normalization\n", "\n", - "Questa rete contiene un altro tipo di livello: **Batch Normalization**. L'idea della batch normalization è di portare i valori che attraversano la rete neurale nell'intervallo corretto. Di solito, le reti neurali funzionano meglio quando tutti i valori sono nell'intervallo [-1,1] o [0,1], ed è per questo che ridimensioniamo/normalizziamo i nostri dati di input di conseguenza. Tuttavia, durante l'addestramento di una rete profonda, può succedere che i valori escano significativamente da questo intervallo, rendendo l'addestramento problematico. Il livello di batch normalization calcola la media e la deviazione standard per tutti i valori del minibatch corrente e li utilizza per normalizzare il segnale prima di farlo passare attraverso un livello della rete neurale. Questo migliora significativamente la stabilità delle reti profonde.\n" + "Questa rete contiene un altro tipo di strato: **Batch Normalization**. L'idea della batch normalization è portare i valori che fluiscono attraverso la rete neurale nell'intervallo corretto. Di solito le reti neurali funzionano al meglio quando tutti i valori sono nell'intervallo [-1,1] o [0,1], ed è per questo che scaldiamo/normalizziamo i nostri dati di input di conseguenza. Tuttavia, durante l'addestramento di una rete profonda, può succedere che i valori escano significativamente da questo intervallo, il che rende problematico l'addestramento. Lo strato di batch normalization calcola la media e la deviazione standard per tutti i valori del minibatch corrente e li usa per normalizzare il segnale prima di passarlo attraverso uno strato della rete neurale. Questo migliora significativamente la stabilità delle reti profonde.\n" ] }, { @@ -1453,16 +1465,16 @@ "source": [ "## Conclusione\n", "\n", - "Utilizzando il transfer learning, siamo riusciti rapidamente a creare un classificatore per il nostro compito di classificazione di oggetti personalizzati, ottenendo un'elevata accuratezza. Tuttavia, questo esempio non è stato completamente imparziale, poiché la rete originale VGG-16 era pre-addestrata per riconoscere gatti e cani, e quindi abbiamo semplicemente riutilizzato la maggior parte dei pattern già presenti nella rete. È possibile aspettarsi una precisione inferiore su oggetti più esotici e specifici di un dominio, come dettagli su una linea di produzione in una fabbrica o diverse foglie di alberi.\n", + "Utilizzando il transfer learning, siamo stati in grado di mettere rapidamente insieme un classificatore per il nostro compito di classificazione di oggetti personalizzato, raggiungendo un'elevata accuratezza. Tuttavia, questo esempio non è stato completamente equo, perché la rete VGG-16 originale era pre-addestrata per riconoscere gatti e cani, e quindi stavamo solo riutilizzando la maggior parte dei pattern già presenti nella rete. Si può prevedere un'accuratezza inferiore su oggetti più esotici e specifici di dominio, come dettagli su una linea di produzione in uno stabilimento, o diverse foglie di alberi.\n", "\n", - "Si può notare che i compiti più complessi che stiamo affrontando ora richiedono una maggiore potenza di calcolo e non possono essere facilmente risolti con la CPU. Nella prossima unità, cercheremo di utilizzare un'implementazione più leggera per addestrare lo stesso modello utilizzando risorse di calcolo inferiori, ottenendo solo una leggera diminuzione dell'accuratezza.\n" + "Puoi vedere che compiti più complessi che stiamo risolvendo ora richiedono un maggiore potere computazionale e non possono essere facilmente risolti sulla CPU. Nell'unità successiva, proveremo a utilizzare un'implementazione più leggera per addestrare lo stesso modello usando risorse computazionali inferiori, con conseguente solo una leggermente inferiore accuratezza.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**Disclaimer**: \nQuesto documento è stato tradotto utilizzando il servizio di traduzione automatica [Co-op Translator](https://github.com/Azure/co-op-translator). Sebbene ci impegniamo per garantire l'accuratezza, si prega di notare che le traduzioni automatiche possono contenere errori o imprecisioni. Il documento originale nella sua lingua nativa dovrebbe essere considerato la fonte autorevole. Per informazioni critiche, si raccomanda una traduzione professionale effettuata da un traduttore umano. Non siamo responsabili per eventuali incomprensioni o interpretazioni errate derivanti dall'uso di questa traduzione.\n" + "---\n\n\n**Disclaimer**:\nQuesto documento è stato tradotto utilizzando il servizio di traduzione AI [Co-op Translator](https://github.com/Azure/co-op-translator). Sebbene ci impegniamo per garantire la precisione, si prega di notare che le traduzioni automatizzate possono contenere errori o imprecisioni. Il documento originale nella sua lingua nativa deve essere considerato la fonte autorevole. Per informazioni critiche, si raccomanda una traduzione professionale effettuata da un essere umano. Non siamo responsabili per eventuali malintesi o interpretazioni errate derivanti dall’uso di questa traduzione.\n\n" ] } ], @@ -1483,12 +1495,6 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" - }, - "coopTranslator": { - "original_hash": "c189abc107848f96051085cc30945129", - "translation_date": "2025-08-28T13:04:48+00:00", - "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", - "language_code": "it" } }, "nbformat": 4, diff --git a/translations/it/lessons/5-NLP/README.md b/translations/it/lessons/5-NLP/README.md index 77bcc6c61e..87f6903b83 100644 --- a/translations/it/lessons/5-NLP/README.md +++ b/translations/it/lessons/5-NLP/README.md @@ -1,51 +1,51 @@ # Elaborazione del Linguaggio Naturale -![Riepilogo dei compiti NLP in uno schizzo](../../../../translated_images/it/ai-nlp.b22dcb8ca4707cea.webp) +![Riepilogo dei compiti di NLP in uno schizzo](../../../../translated_images/it/ai-nlp.b22dcb8ca4707cea.webp) -In questa sezione ci concentreremo sull'utilizzo delle reti neurali per gestire compiti legati all'**Elaborazione del Linguaggio Naturale (NLP)**. Ci sono molti problemi di NLP che vogliamo che i computer siano in grado di risolvere: +In questa sezione, ci concentreremo sull'uso delle Reti Neurali per affrontare compiti correlati all'**Elaborazione del Linguaggio Naturale (NLP)**. Ci sono molti problemi di NLP che vogliamo che i computer siano in grado di risolvere: -* **Classificazione del testo** è un tipico problema di classificazione relativo alle sequenze di testo. Gli esempi includono la classificazione di e-mail come spam o non-spam, o la categorizzazione di articoli come sport, economia, politica, ecc. Inoltre, nello sviluppo di chatbot, spesso dobbiamo capire cosa l'utente vuole dire -- in questo caso ci occupiamo della **classificazione dell'intento**. Spesso, nella classificazione dell'intento, dobbiamo gestire molte categorie. -* **Analisi del sentiment** è un tipico problema di regressione, dove dobbiamo attribuire un numero (un sentiment) che corrisponde a quanto positivo/negativo è il significato di una frase. Una versione più avanzata dell'analisi del sentiment è l'**analisi del sentiment basata sugli aspetti** (ABSA), dove attribuiamo il sentiment non all'intera frase, ma a diverse parti di essa (aspetti), ad esempio: *In questo ristorante, mi è piaciuta la cucina, ma l'atmosfera era terribile*. -* **Riconoscimento delle entità nominate** (NER) si riferisce al problema di estrarre determinate entità dal testo. Ad esempio, potremmo dover capire che nella frase *Devo volare a Parigi domani* la parola *domani* si riferisce a una DATA, e *Parigi* è una LOCALITÀ. -* **Estrazione di parole chiave** è simile al NER, ma dobbiamo estrarre automaticamente le parole importanti per il significato della frase, senza pre-addestramento per tipi specifici di entità. +* **Classificazione del testo** è un tipico problema di classificazione che riguarda sequenze di testo. Esempi includono la classificazione di messaggi e-mail come spam o non spam, o la categorizzazione di articoli in sport, economia, politica, ecc. Inoltre, nello sviluppo di chatbot, spesso è necessario comprendere cosa l'utente voleva dire -- in questo caso si tratta di **classificazione dell'intento**. Spesso, nella classificazione dell'intento, dobbiamo gestire molte categorie. +* **Analisi del sentiment** è un tipico problema di regressione, dove dobbiamo attribuire un numero (un sentiment) corrispondente a quanto positivo/negativo sia il significato di una frase. Una versione più avanzata dell'analisi del sentiment è l'**analisi del sentiment basata sugli aspetti** (ABSA), dove attribuiamo sentiment non all'intera frase, ma a parti diverse di essa (aspetti), ad esempio *In questo ristorante, mi è piaciuta la cucina, ma l'atmosfera era orribile*. +* **Named Entity Recognition** (NER) si riferisce al problema di estrarre certe entità dal testo. Per esempio, potremmo dover capire che nella frase *Devo volare a Parigi domani* la parola *domani* si riferisce a una DATA, e *Parigi* è una LOCALITÀ. +* **Estrazione di parole chiave** è simile alla NER, ma dobbiamo estrarre automaticamente parole importanti per il significato della frase, senza un pre-addestramento per tipi specifici di entità. * **Clustering del testo** può essere utile quando vogliamo raggruppare insieme frasi simili, ad esempio, richieste simili nelle conversazioni di supporto tecnico. -* **Risposta alle domande** si riferisce alla capacità di un modello di rispondere a una domanda specifica. Il modello riceve un passaggio di testo e una domanda come input, e deve fornire un punto nel testo dove si trova la risposta alla domanda (o, a volte, generare il testo della risposta). -* **Generazione di testo** è la capacità di un modello di generare nuovo testo. Può essere considerato un compito di classificazione che prevede la prossima lettera/parola basandosi su un *prompt di testo*. Modelli avanzati di generazione di testo, come GPT-3, sono in grado di risolvere altri compiti NLP utilizzando una tecnica chiamata [programmazione tramite prompt](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) o [ingegneria dei prompt](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29). -* **Riassunto del testo** è una tecnica in cui vogliamo che un computer "legga" un testo lungo e lo riassuma in poche frasi. -* **Traduzione automatica** può essere vista come una combinazione di comprensione del testo in una lingua e generazione di testo in un'altra. +* **Risposta a domande** si riferisce alla capacità di un modello di rispondere a una domanda specifica. Il modello riceve in input un passaggio di testo e una domanda, e deve fornire un luogo nel testo dove la risposta alla domanda è contenuta (o, talvolta, generare il testo della risposta). +* **Generazione di testo** è la capacità di un modello di generare nuovo testo. Può essere considerata come un compito di classificazione che predice la lettera/parola successiva basandosi su un *prompt di testo*. Modelli avanzati di generazione testuale, come GPT-3, sono in grado di risolvere altri compiti di NLP come la classificazione usando una tecnica chiamata [prompt programming](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) o [prompt engineering](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29) +* **Sintesi del testo** è una tecnica in cui vogliamo che un computer "legga" un testo lungo e lo riassuma in poche frasi. +* **Traduzione automatica** può essere vista come una combinazione della comprensione del testo in una lingua e della generazione del testo in un'altra. -Inizialmente, la maggior parte dei compiti NLP veniva risolta utilizzando metodi tradizionali come le grammatiche. Ad esempio, nella traduzione automatica venivano utilizzati parser per trasformare la frase iniziale in un albero sintattico, poi venivano estratte strutture semantiche di livello superiore per rappresentare il significato della frase, e basandosi su questo significato e sulla grammatica della lingua di destinazione veniva generato il risultato. Oggi, molti compiti NLP vengono risolti in modo più efficace utilizzando reti neurali. +Inizialmente, la maggior parte dei compiti di NLP venivano risolti usando metodi tradizionali come le grammatiche. Ad esempio, nella traduzione automatica venivano usati parser per trasformare la frase iniziale in un albero sintattico, poi venivano estratte strutture semantiche di livello superiore per rappresentare il significato della frase, e basandosi su questo significato e sulla grammatica della lingua di destinazione veniva generato il risultato. Oggi molti compiti di NLP sono risolti in modo più efficace usando reti neurali. -> Molti metodi classici di NLP sono implementati nella libreria Python [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org). È disponibile online un ottimo [Libro NLTK](https://www.nltk.org/book/) che copre come diversi compiti NLP possono essere risolti utilizzando NLTK. +> Molti metodi classici di NLP sono implementati nella libreria Python [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org). È disponibile online un ottimo [Libro NLTK](https://www.nltk.org/book/) che spiega come diversi compiti di NLP possano essere risolti usando NLTK. -Nel nostro corso, ci concentreremo principalmente sull'utilizzo delle reti neurali per il NLP, e utilizzeremo NLTK dove necessario. +Nel nostro corso, ci concentreremo principalmente sull’uso delle Reti Neurali per NLP, e utilizzeremo NLTK quando necessario. -Abbiamo già imparato a utilizzare le reti neurali per gestire dati tabulari e immagini. La principale differenza tra questi tipi di dati e il testo è che il testo è una sequenza di lunghezza variabile, mentre la dimensione dell'input nel caso delle immagini è nota in anticipo. Mentre le reti convoluzionali possono estrarre schemi dai dati di input, gli schemi nel testo sono più complessi. Ad esempio, possiamo avere una negazione separata dal soggetto da molte parole (ad esempio: *Non mi piacciono le arance*, vs. *Non mi piacciono quelle grandi arance colorate e gustose*), e ciò dovrebbe comunque essere interpretato come un unico schema. Pertanto, per gestire il linguaggio dobbiamo introdurre nuovi tipi di reti neurali, come le *reti ricorrenti* e i *transformer*. +Abbiamo già imparato a usare reti neurali per lavorare con dati tabellari e immagini. La principale differenza tra quei tipi di dati e il testo è che il testo è una sequenza di lunghezza variabile, mentre la dimensione dell’input nel caso delle immagini è nota in anticipo. Mentre le reti convoluzionali possono estrarre pattern dai dati di input, i pattern nel testo sono più complessi. Ad esempio, possiamo avere una negazione separata dal soggetto da un numero arbitrario di parole (es. *Non mi piacciono le arance*, vs. *Non mi piacciono quelle grosse arance colorate e gustose*), e ciò dovrebbe ancora essere interpretato come un unico pattern. Quindi, per gestire il linguaggio, dobbiamo introdurre nuovi tipi di reti neurali, come le *reti ricorrenti* e i *transformers*. -## Installare le librerie +## Installazione delle librerie -Se stai utilizzando un'installazione locale di Python per eseguire questo corso, potresti dover installare tutte le librerie necessarie per il NLP utilizzando i seguenti comandi: +Se stai usando un’installazione locale di Python per seguire questo corso, potresti dover installare tutte le librerie necessarie per NLP utilizzando i seguenti comandi: **Per PyTorch** ```bash -pip install -r requirements-torch.txt +pip install -r requirements-pytorch.txt ``` **Per TensorFlow** ```bash pip install -r requirements-tf.txt ``` -> Puoi provare il NLP con TensorFlow su [Microsoft Learn](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste) +> Puoi provare NLP con TensorFlow su [Microsoft Learn](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste) ## Avviso GPU -In questa sezione, in alcuni esempi alleneremo modelli piuttosto grandi. -* **Usa un computer con GPU**: È consigliabile eseguire i tuoi notebook su un computer con GPU per ridurre i tempi di attesa quando lavori con modelli grandi. -* **Vincoli di memoria GPU**: L'esecuzione su GPU può portare a situazioni in cui esaurisci la memoria GPU, specialmente durante l'addestramento di modelli grandi. -* **Consumo di memoria GPU**: La quantità di memoria GPU consumata durante l'addestramento dipende da vari fattori, inclusa la dimensione del minibatch. -* **Riduci la dimensione del minibatch**: Se riscontri problemi di memoria GPU, considera di ridurre la dimensione del minibatch nel tuo codice come possibile soluzione. -* **Rilascio della memoria GPU in TensorFlow**: Le versioni più vecchie di TensorFlow potrebbero non rilasciare correttamente la memoria GPU durante l'addestramento di più modelli all'interno di un kernel Python. Per gestire efficacemente l'uso della memoria GPU, puoi configurare TensorFlow per allocare memoria GPU solo quando necessario. -* **Inclusione del codice**: Per impostare TensorFlow affinché cresca l'allocazione della memoria GPU solo quando richiesto, includi il seguente codice nei tuoi notebook: +In questa sezione, in alcuni degli esempi alleneremo modelli piuttosto grandi. +* **Usa un computer con GPU abilitata**: È consigliabile eseguire i tuoi notebook su un computer con GPU abilitata per ridurre i tempi di attesa quando si lavora con modelli grandi. +* **Vincoli di memoria GPU**: L'esecuzione su GPU può portare a situazioni in cui la memoria GPU si esaurisce, specialmente durante l’addestramento di modelli grandi. +* **Consumo di memoria GPU**: La quantità di memoria GPU consumata durante l’addestramento dipende da vari fattori, inclusa la dimensione del minibatch. +* **Minimizza la dimensione del minibatch**: Se riscontri problemi di memoria GPU, considera di ridurre la dimensione del minibatch nel tuo codice come possibile soluzione. +* **Rilascio di memoria GPU in TensorFlow**: Versioni più vecchie di TensorFlow possono non rilasciare correttamente la memoria GPU quando si addestrano più modelli all'interno dello stesso kernel Python. Per gestire efficacemente l’uso della memoria GPU, puoi configurare TensorFlow per allocare la memoria GPU solo quando necessario. +* **Inclusione del codice**: Per impostare TensorFlow in modo che cresca nell’allocazione della memoria GPU solo quando richiesto, includi il seguente codice nei tuoi notebook: ```python physical_devices = tf.config.list_physical_devices('GPU') @@ -53,7 +53,7 @@ if len(physical_devices)>0: tf.config.experimental.set_memory_growth(physical_devices[0], True) ``` -Se sei interessato a imparare il NLP da una prospettiva di ML classico, visita [questa suite di lezioni](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP) +Se sei interessato a imparare NLP da una prospettiva classica di ML, visita [questa serie di lezioni](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP) ## In questa sezione In questa sezione impareremo: @@ -61,9 +61,13 @@ In questa sezione impareremo: * [Rappresentare il testo come tensori](13-TextRep/README.md) * [Word Embeddings](14-Emdeddings/README.md) * [Modellazione del linguaggio](15-LanguageModeling/README.md) -* [Reti neurali ricorrenti](16-RNN/README.md) +* [Reti Neurali Ricorrenti](16-RNN/README.md) * [Reti generative](17-GenerativeNetworks/README.md) * [Transformers](18-Transformers/README.md) -**Disclaimer**: -Questo documento è stato tradotto utilizzando il servizio di traduzione AI [Co-op Translator](https://github.com/Azure/co-op-translator). Sebbene ci impegniamo per garantire l'accuratezza, si prega di notare che le traduzioni automatiche possono contenere errori o imprecisioni. Il documento originale nella sua lingua nativa dovrebbe essere considerato la fonte autorevole. Per informazioni critiche, si raccomanda una traduzione professionale effettuata da un esperto umano. Non siamo responsabili per eventuali incomprensioni o interpretazioni errate derivanti dall'uso di questa traduzione. \ No newline at end of file +--- + + +**Disclaimer**: +Questo documento è stato tradotto utilizzando il servizio di traduzione AI [Co-op Translator](https://github.com/Azure/co-op-translator). Sebbene ci impegniamo per garantire la precisione, si prega di notare che le traduzioni automatizzate possono contenere errori o imprecisioni. Il documento originale nella sua lingua nativa deve essere considerato la fonte autorevole. Per informazioni critiche, si raccomanda una traduzione professionale effettuata da un essere umano. Non siamo responsabili per eventuali malintesi o interpretazioni errate derivanti dall’uso di questa traduzione. + \ No newline at end of file diff --git a/translations/ja/.co-op-translator.json b/translations/ja/.co-op-translator.json index 8dbacf233b..3a45004748 100644 --- a/translations/ja/.co-op-translator.json +++ b/translations/ja/.co-op-translator.json @@ -5,6 +5,12 @@ "source_file": "AGENTS.md", "language_code": "ja" }, + "CONTRIBUTING.md": { + "original_hash": "c6fd7e781b67111a90abd166d0ce4aa0", + "translation_date": "2026-07-08T19:30:51+00:00", + "source_file": "CONTRIBUTING.md", + "language_code": "ja" + }, "README.md": { "original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b", "translation_date": "2026-04-06T15:51:59+00:00", @@ -17,6 +23,19 @@ "source_file": "SECURITY.md", "language_code": "ja" }, + "__translation_failures__": { + "lessons/sketchnotes/LICENSE.md": { + "original_hash": "45ab63a2cd8f5faef6c9b150618837a4", + "source_file": "lessons/sketchnotes/LICENSE.md", + "language_code": "ja", + "failure_date": "2026-07-08T19:30: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-24T21:20:36+00:00", @@ -54,8 +73,8 @@ "language_code": "ja" }, "examples/README.md": { - "original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7", - "translation_date": "2025-10-03T11:28:09+00:00", + "original_hash": "7883d52c2e2a221e0b07a7b112a149b9", + "translation_date": "2026-07-08T19:24:51+00:00", "source_file": "examples/README.md", "language_code": "ja" }, @@ -66,8 +85,8 @@ "language_code": "ja" }, "lessons/0-course-setup/how-to-run.md": { - "original_hash": "a4717bd9103b9f6cd84d534b83534689", - "translation_date": "2026-01-15T12:09:55+00:00", + "original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1", + "translation_date": "2026-07-08T19:25:18+00:00", "source_file": "lessons/0-course-setup/how-to-run.md", "language_code": "ja" }, @@ -191,6 +210,12 @@ "source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md", "language_code": "ja" }, + "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": { + "original_hash": "99b816b6a4957ef4100cee4c4221dff9", + "translation_date": "2026-07-08T19:15:06+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", + "language_code": "ja" + }, "lessons/4-ComputerVision/08-TransferLearning/lab/README.md": { "original_hash": "7765935c35fcee69b9fe2d0cfd6963e2", "translation_date": "2025-08-24T21:12:31+00:00", @@ -330,8 +355,8 @@ "language_code": "ja" }, "lessons/5-NLP/README.md": { - "original_hash": "8ef02a9318257ea140ed3ed74442096d", - "translation_date": "2025-08-24T21:03:20+00:00", + "original_hash": "038df6f1a73e49f6430740da083bfd6d", + "translation_date": "2026-07-08T19:25:48+00:00", "source_file": "lessons/5-NLP/README.md", "language_code": "ja" }, diff --git a/translations/ja/CONTRIBUTING.md b/translations/ja/CONTRIBUTING.md new file mode 100644 index 0000000000..29019af142 --- /dev/null +++ b/translations/ja/CONTRIBUTING.md @@ -0,0 +1,29 @@ +# AI-For-Beginnersへの貢献について + +AI-For-Beginnersへの貢献に関心を持っていただきありがとうございます!翻訳、レッスンの修正、フォーマットの訂正を歓迎します。 + +## Microsoft コントリビューターライセンス契約 (CLA) + +このプロジェクトは貢献や提案を歓迎しています。ほとんどの貢献には、貢献物の利用権を実際に付与できること、および付与していることを宣言するコントリビューターライセンス契約 (CLA) への同意が必要です。詳細は [https://cla.microsoft.com](https://cla.microsoft.com) をご覧ください。 + +プルリクエストを送信すると、CLAボットが自動的にCLAの提出が必要かどうかを判断し、プルリクエストに適切なラベルやコメントなどを付けます。ボットの指示に従ってください。全リポジトリで一度だけ行えば済みます。 + +## 貢献方法 + +### 1. 誤字・タイプミスやコードエラーの修正 +任意のJupyterノートブックやレッスマークダウンファイルで誤字やバグを見つけた場合: +1. リポジトリをフォークします。 +2. 誤字や壊れたリンクを修正します。 +3. 修正内容を明確に説明したプルリクエストを提出します。 + +### 2. 翻訳の提出 +レッスンの他言語への翻訳を歓迎します!翻訳は既存のフォルダ名に従い、`translations/` ディレクトリの下に配置してください(例:`translations/es/`、`translations/pt-BR/`、`translations/zh-CN/`)。 + +詳細は [etc/CONTRIBUTING.md](etc/CONTRIBUTING.md) をご参照ください。 + +--- + + +**免責事項**: +本書類は AI 翻訳サービス [Co-op Translator](https://github.com/Azure/co-op-translator) を使用して翻訳されています。正確性を期していますが、自動翻訳には誤りや不正確な部分が含まれる可能性があることをご承知おきください。原文の原語版が正式な情報源とみなされるべきです。重要な情報については、専門の人間による翻訳を推奨します。本翻訳の利用により生じたいかなる誤解や解釈違いについても、当方は責任を負いかねます。 + \ No newline at end of file diff --git a/translations/ja/examples/README.md b/translations/ja/examples/README.md index b259c312e7..7f1175ebc8 100644 --- a/translations/ja/examples/README.md +++ b/translations/ja/examples/README.md @@ -1,38 +1,38 @@ # 初心者向け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 +# 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 conda activate ai4beg ``` -### 例の実行方法 +### 実行方法 **Pythonスクリプト(.pyファイル)の場合:** ```bash @@ -44,42 +44,44 @@ python 01-hello-ai-world.py jupyter notebook 03-image-classifier.ipynb ``` -## 📖 学習パス +## 📖 学習の流れ -例を順番に進めることをお勧めします: +以下の順番で例を進めることをおすすめします: -1. **「Hello AI World」から始める** - パターン認識の基本を学ぶ -2. **シンプルなニューラルネットワークを構築する** - ニューラルネットワークの仕組みを理解する -3. **画像分類器を試す** - 実際の画像でAIを体験する -4. **テキスト感情分析を行う** - 自然言語処理を探求する +1. **「Hello AI World」から始める** - パターン認識の基礎を学ぶ +2. シンプルなニューラルネットワークを作る - ニューラルネットワークの仕組みを理解する +3. **Image Classifierに挑戦** - 実際の画像でAIを体験する +4. テキストの感情分析を行う - 自然言語処理を探求する -## 💡 初心者へのヒント +## 💡 初心者向けのヒント -- **コードコメントをよく読む** - 各行が何をしているか説明されています -- **試してみる!** - 値を変更して結果を確認してみましょう -- **すべてを理解しようとしない** - 学習には時間がかかります -- **質問する** - [Discussion board](https://github.com/microsoft/AI-For-Beginners/discussions)を活用してください +- コードのコメントをよく読む - 各行の意味を説明しています +- **実験してみる!** - 値を変えて何が起きるか試しましょう +- すべてを理解しようと焦らないで - 学習は時間がかかります +- 質問をする - [ディスカッションボード](https://github.com/microsoft/AI-For-Beginners/discussions)を利用しましょう ## 🔗 次のステップ -これらの例を完了したら、完全なカリキュラムを探求してください: -- [AIの導入](../lessons/1-Intro/README.md) +これらの例を終えたら、完全なカリキュラムを探求してください: +- [AI入門](../lessons/1-Intro/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)を使用して翻訳されています。正確性を期すよう努めておりますが、自動翻訳には誤りや不正確な部分が含まれる可能性があります。原文(元の言語で記載された文書)を公式な情報源としてご参照ください。重要な情報については、専門の人間による翻訳をお勧めします。本翻訳の利用に起因する誤解や誤認について、当方は一切の責任を負いかねます。 \ No newline at end of file + +**免責事項**: +本書類は AI 翻訳サービス [Co-op Translator](https://github.com/Azure/co-op-translator) を使用して翻訳されています。正確性を期していますが、自動翻訳には誤りや不正確な部分が含まれる可能性があることをご承知おきください。原文の原語版が正式な情報源とみなされるべきです。重要な情報については、専門の人間による翻訳を推奨します。本翻訳の利用により生じたいかなる誤解や解釈違いについても、当方は責任を負いかねます。 + \ No newline at end of file diff --git a/translations/ja/lessons/0-course-setup/how-to-run.md b/translations/ja/lessons/0-course-setup/how-to-run.md index 9b2f4c9b5c..730e6b0ad2 100644 --- a/translations/ja/lessons/0-course-setup/how-to-run.md +++ b/translations/ja/lessons/0-course-setup/how-to-run.md @@ -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の利用 +### Python拡張機能付きVisual Studio Codeの使用 -このカリキュラムは、[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環境を使うこともできます。従来の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に移動でき、即座に基盤となるコンテナを構築して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内にリポジトリを開けます。これにより基盤となるコンテナが構築され、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 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) を作成し、Jupyter経由で接続します。リポジトリをそのままマシンにクローンし、学習を開始できます。NCシリーズのVMは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ノートブックを1つずつアップロードして実行できます。 --- **免責事項**: -本書類はAI翻訳サービス「Co-op Translator」(https://github.com/Azure/co-op-translator)を使用して翻訳されています。正確性には努めておりますが、自動翻訳は誤りや不正確な部分を含む可能性があります。原文の言語による原文書が正式な情報源とみなされるべきです。重要な情報については、専門の人間翻訳を推奨します。本翻訳の利用によって生じたいかなる誤解や誤訳についても、当方は一切責任を負いかねます。 +本書類は AI 翻訳サービス [Co-op Translator](https://github.com/Azure/co-op-translator) を使用して翻訳されています。正確性を期していますが、自動翻訳には誤りや不正確な部分が含まれる可能性があることをご承知おきください。原文の原語版が正式な情報源とみなされるべきです。重要な情報については、専門の人間による翻訳を推奨します。本翻訳の利用により生じたいかなる誤解や解釈違いについても、当方は責任を負いかねます。 \ No newline at end of file diff --git a/translations/ja/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/ja/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index 7de569fff1..7d46586e0a 100644 --- a/translations/ja/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/ja/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -6,9 +6,9 @@ "source": [ "# 事前学習済みモデルと転移学習\n", "\n", - "CNNのトレーニングには多くの時間がかかり、そのためには大量のデータが必要です。しかし、ネットワークが画像からパターンを抽出するために使用する最適な低レベルフィルターを学習することに多くの時間が費やされます。そこで自然に生じる疑問は、あるデータセットで学習したニューラルネットワークを使って、完全なトレーニングプロセスを経ずに異なる画像を分類することができるのか、ということです。\n", + "CNNのトレーニングには多くの時間がかかり、そのために大量のデータが必要です。しかし、多くの時間はネットワークが画像からパターンを抽出するために使用する最適な低レベルフィルターを学習することに費やされます。ここで自然な疑問が生まれます — あるデータセットでトレーニングされたニューラルネットワークを使い、完全なトレーニングプロセスなしで異なる画像の分類に適応させることは可能でしょうか?\n", "\n", - "このアプローチは**転移学習**と呼ばれます。これは、あるニューラルネットワークモデルから別のモデルへ知識を転移することを意味します。転移学習では通常、事前学習済みモデルから始めます。このモデルは、例えば**ImageNet**のような大規模な画像データセットで学習されています。これらのモデルはすでに一般的な画像からさまざまな特徴を抽出するのに優れた性能を発揮しており、多くの場合、それらの抽出された特徴の上に分類器を構築するだけで良い結果を得ることができます。\n" + "この方法は転移学習と呼ばれ、あるニューラルネットワークモデルから別のモデルに知識の一部を転送するためです。転移学習では、通常、ImageNetのような大規模な画像データセットでトレーニングされた事前学習済みモデルから始めます。これらのモデルは既に一般的な画像からさまざまな特徴をうまく抽出でき、多くの場合、抽出された特徴の上に単に分類器を構築するだけで良好な結果を得ることができます。\n" ] }, { @@ -29,11 +29,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 猫 vs. 犬 データセット\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" + "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", @@ -510,17 +520,17 @@ "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) です。この結果を理解するために、クラス名とともに上位 n クラスを返す `decode_predictions` 関数を使うこともできます。\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ミニバッチ)を取り出し、それらの特徴ベクトルを事前に計算します。この処理にはTensorflowの**dataset** APIを使用できます。`map`関数はデータセットを受け取り、指定されたラムダ関数を適用して変換します。この仕組みを利用して、元の画像ではなくVGGで抽出された特徴を含む新しいデータセット、`ds_features_train`と`ds_features_test`を構築します。\n" + "では、これらの特徴が画像を分類するために使えるか試してみましょう。画像の一部(今回の場合は50のミニバッチ)を手動で取り出し、それらの特徴ベクトルを事前に計算します。これにはTensorflowのdataset APIを使うことができます。`map`関数はデータセットを受け取り、指定したラムダ関数を適用して変換します。この仕組みを使って、元の画像の代わりにVGGで抽出した特徴を含む新しいデータセット `ds_features_train` と `ds_features_test` を構築します。\n" ] }, { @@ -712,9 +723,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "デモの速度を上げるために、データセットのサイズを制限するために `.take(50)` を使用しました。もちろん、完全なデータセットでこの実験を行うことも可能です。\n", + "デモの高速化のために、データセットのサイズを制限するために `.take(50)` を使いました。もちろん、この実験は完全なデータセットで実行することもできます。\n", "\n", - "特徴が抽出されたデータセットが準備できたので、猫と犬を区別するためのシンプルな密結合分類器を訓練することができます。このネットワークは形状 (7,7,512) の特徴ベクトルを入力として受け取り、犬または猫のいずれかに対応する1つの出力を生成します。これは二値分類であるため、`sigmoid` 活性化関数と `binary_crossentropy` 損失関数を使用します。\n" + "特徴量を抽出したデータセットができたので、簡単な全結合分類器を訓練して猫と犬を区別できます。このネットワークは形状 (7,7,512) の特徴ベクトルを受け取り、犬または猫のどちらかに対応する1つの出力を生成します。これは二値分類なので、活性化関数に `sigmoid`、損失関数に `binary_crossentropy` を使用します。\n" ] }, { @@ -743,13 +754,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "結果は素晴らしく、猫と犬をほぼ95%の確率で区別できるようになりました!しかし、このアプローチはすべての画像のサブセットでしかテストしていません。なぜなら、手動で特徴を抽出するのにかなりの時間がかかるからです。\n", + "結果は素晴らしく、猫と犬をほぼ95%の確率で区別することができます!しかし、手動で特徴を抽出するのに多くの時間がかかるようなので、このアプローチはすべての画像ではなくその一部にしかテストしていません。\n", "\n", - "## VGGネットワークを使った転移学習\n", + "## 1つのVGGネットワークを使った転移学習\n", "\n", - "手動で特徴を事前計算する手間を省くために、トレーニング中に元のVGG-16ネットワーク全体を使用し、ネットワークの最初の層として特徴抽出器を追加する方法もあります。\n", + "トレーニング中に特徴抽出器をネットワークの最初のレイヤーとして追加し、元のVGG-16ネットワーク全体を使用することで、特徴の手動事前計算を避けることもできます。\n", "\n", - "Kerasのアーキテクチャの素晴らしい点は、上で定義したVGG-16モデルを別のニューラルネットワークの層としても使用できることです!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", - "ネットワーク全体のパラメータ数が約1500万である一方で、実際に学習しているのはわずか25,000パラメータであることに気付くでしょう。トップレベルの畳み込みフィルターのその他のパラメータはすべて学習済みです。これは良いことで、少ない数の例で少ない数のパラメータを微調整することが可能になります。\n", + "ネットワークの総パラメーター数が約1500万であるのに対し、訓練されるパラメーターはわずか2万5千であることに気づくでしょう。他のすべてのパラメーターは最上位の畳み込みフィルターで事前学習済みです。これは良いことで、より少ない例でより少ないパラメーターを微調整できるということです。\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", - "> **Note:** 最初にパラメータを固定し、分類層の重みを安定させるために数エポックのトレーニングを行うことが重要です。もし最初からパラメータを解凍した状態でエンドツーエンドのネットワークをトレーニングし始めると、大きな誤差が畳み込み層の事前学習済みの重みを破壊する可能性があります。\n", + "> **Note:** まずパラメータを凍結し、分類層の重みを安定させるために数エポック分の訓練を行うことが重要です。パラメータ凍結解除の状態で直ちにエンドツーエンドの訓練を開始すると、大きな誤差が畳み込み層の事前学習済み重みを破壊しやすくなります。\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", - "凍結解除後、数エポックの追加トレーニングを行うことができます(この例では1エポックのみ行います)。また、事前学習済みの重みへの影響を最小限に抑えるために、学習率を低く設定することも可能です。ただし、学習率を低くしても、トレーニングの初期段階では精度が一時的に低下することが予想されます。その後、最終的には固定された重みの場合よりもわずかに高いレベルに達するでしょう。\n", + "アンフリーズ後は、もう少しエポック数を増やして学習を行うことができます(この例では1回だけ行います)。また、事前学習済みの重みに与える影響を最小限にするために、学習率を下げることもできます。しかし、学習率が低くても、学習の初めには精度が低下し、その後固定重みで学習した場合よりもわずかに高いレベルに達することが期待されます。\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はさらに多くの事前学習済みネットワークを提供しています。その中でも最も頻繁に使用されるのは、Microsoftが開発した**ResNet**アーキテクチャと、Googleによる**Inception**です。例えば、最もシンプルなResNet-50モデルのアーキテクチャを見てみましょう(ResNetは異なる深さを持つモデルのファミリーであり、非常に深いモデルを見たい場合はResNet-152を試してみることができます)。\n" + "VGG-16は最もシンプルなコンピュータビジョンアーキテクチャの一つです。Kerasはさらに多くの事前学習済みネットワークを提供しています。その中で最もよく使われているものは、Microsoftが開発したResNetアーキテクチャとGoogleのInceptionです。例えば、最もシンプルなResNet-50モデルのアーキテクチャを見てみましょう(ResNetは異なる深さのモデルのファミリーで、実際に非常に深いモデルがどのようなものか見たい場合はResNet-152を試してみることもできます):\n" ] }, { @@ -1441,11 +1452,11 @@ "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" ] }, { @@ -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\n**免責事項**:\n本書類は AI 翻訳サービス [Co-op Translator](https://github.com/Azure/co-op-translator) を使用して翻訳されています。正確性を期していますが、自動翻訳には誤りや不正確な部分が含まれる可能性があることをご承知おきください。原文の原語版が正式な情報源とみなされるべきです。重要な情報については、専門の人間による翻訳を推奨します。本翻訳の利用により生じたいかなる誤解や解釈違いについても、当方は責任を負いかねます。\n\n" ] } ], @@ -1484,12 +1495,6 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" - }, - "coopTranslator": { - "original_hash": "c189abc107848f96051085cc30945129", - "translation_date": "2025-08-30T09:09:33+00:00", - "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", - "language_code": "ja" } }, "nbformat": 4, diff --git a/translations/ja/lessons/5-NLP/README.md b/translations/ja/lessons/5-NLP/README.md index e827a66e72..eae991d192 100644 --- a/translations/ja/lessons/5-NLP/README.md +++ b/translations/ja/lessons/5-NLP/README.md @@ -1,51 +1,51 @@ # 自然言語処理 -![NLPタスクの概要を示すイラスト](../../../../translated_images/ja/ai-nlp.b22dcb8ca4707cea.webp) +![NLPタスクの概要の落書き](../../../../translated_images/ja/ai-nlp.b22dcb8ca4707cea.webp) -このセクションでは、**自然言語処理 (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) はテキストから特定の実体を抽出する問題を指します。例えば、明日パリに飛ばなければならない というフレーズでは 明日 は日時を表し、パリ* は場所を表していると理解する必要があります。 +* キーワード抽出 はNERに似ていますが、特定の実体タイプの事前学習なしに文の意味に重要な単語を自動的に抽出する必要があります。 +* テキストクラスタリング は、技術サポートの会話における類似の要求など、類似した文をまとめたい場合に役立ちます。 +* 質問応答 は、モデルが特定の質問に答える能力を指します。モデルはテキストの通過部分と質問を入力として受け取り、質問の答えが含まれるテキストの部分を提供する(または時には答えのテキストを生成する)必要があります。 +* テキスト生成 は、モデルが新しいテキストを生成する能力です。テキストの一部に基づいて次の文字や単語を予測する分類タスクと見なせます。GPT-3のような高度なテキスト生成モデルは、[prompt programming](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0)や[prompt engineering](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29)という技術を用いて分類など他のNLPタスクも解決可能です。 +* テキスト要約 は、長いテキストをコンピューターに「読ませ」、数文に要約させる技術です。 +* 機械翻訳 は一言語でのテキスト理解と別言語でのテキスト生成の組み合わせと見ることができます。 -初期の頃は、ほとんどのNLPタスクが文法などの従来の方法で解決されていました。例えば、機械翻訳では、初期の文を構文木に変換するためにパーサーが使用され、その後、文の意味を表す高次の意味構造が抽出され、この意味とターゲット言語の文法に基づいて結果が生成されました。現在では、多くのNLPタスクがニューラルネットワークを使用することでより効果的に解決されています。 +当初、多くのNLPタスクは文法解析のような従来の方法で解決されていました。例えば、機械翻訳ではパーサーを使って初期の文を構文木に変換し、そこから文の意味を表す高レベルの意味構造を抽出し、その意味と目的言語の文法に基づいて結果を生成していました。現在、多くのNLPタスクはニューラルネットワークを用いた方が効果的に解決されています。 -> 多くの古典的なNLP手法は、Pythonライブラリの[自然言語処理ツールキット (NLTK)](https://www.nltk.org) に実装されています。異なるNLPタスクをNLTKを使用して解決する方法をカバーした素晴らしい[NLTKの本](https://www.nltk.org/book/)がオンラインで利用可能です。 +> 多くの古典的なNLP手法は [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org) Pythonライブラリに実装されています。NLTKを使った様々なNLPタスクの解決方法を扱った素晴らしい [NLTK Book](https://www.nltk.org/book/) がオンラインで利用可能です。 -このコースでは、主にニューラルネットワークを使用したNLPに焦点を当て、必要に応じてNLTKを使用します。 +当コースでは主にニューラルネットワークを使ったNLPに焦点を当て、必要に応じてNLTKを使用します。 -これまでに、表形式データや画像を扱うためのニューラルネットワークの使用方法を学びました。これらのデータタイプとテキストの主な違いは、テキストが可変長のシーケンスであるのに対し、画像の場合は入力サイズが事前にわかっていることです。畳み込みネットワークは入力データからパターンを抽出できますが、テキストのパターンはより複雑です。例えば、否定が主語から任意の多くの単語で分離される場合があります(例: *私はオレンジが好きではありません* vs. *私はあの大きくてカラフルで美味しいオレンジが好きではありません*)。これでも一つのパターンとして解釈されるべきです。そのため、言語を扱うには、*リカレントネットワーク*や*トランスフォーマー*などの新しいニューラルネットワークタイプを導入する必要があります。 +すでにニューラルネットワークを使って表形式データや画像を扱う方法を学びました。それらのデータタイプとテキストの主な違いは、テキストが可変長のシーケンスであるのに対し、画像の入力サイズは事前に分かっている点です。畳み込みネットワークは入力データからパターンを抽出できますが、テキストのパターンはより複雑です。例えば、否定が主語から離れて多くの単語を挟む場合でも(例:*I do not like oranges*、または *I do not like those big colorful tasty oranges*)それは一つのパターンとして解釈されるべきです。したがって言語処理には、リカレントネットワークトランスフォーマー といった新しいタイプのニューラルネットワークを導入する必要があります。 ## ライブラリのインストール -このコースをローカルのPython環境で実行する場合、以下のコマンドを使用してNLPに必要なライブラリをインストールする必要があります。 +ローカルの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を使用したNLPを試したい場合は、[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) を参照してください -## GPUに関する注意 +## GPUに関する警告 -このセクションでは、一部の例で非常に大きなモデルをトレーニングします。 -* **GPU対応のコンピュータを使用する**: 大きなモデルを扱う際の待機時間を短縮するために、GPU対応のコンピュータでノートブックを実行することをお勧めします。 -* **GPUメモリの制約**: GPUで実行すると、大きなモデルをトレーニングする際にGPUメモリが不足する状況が発生する可能性があります。 -* **GPUメモリ消費量**: トレーニング中のGPUメモリ消費量は、ミニバッチサイズなどのさまざまな要因によって異なります。 -* **ミニバッチサイズを最小化する**: GPUメモリの問題が発生した場合、コード内のミニバッチサイズを減らすことを検討してください。 -* **TensorFlowのGPUメモリ解放**: 古いバージョンのTensorFlowでは、1つのPythonカーネル内で複数のモデルをトレーニングする際にGPUメモリが正しく解放されないことがあります。GPUメモリ使用量を効果的に管理するには、必要に応じてGPUメモリを割り当てるようTensorFlowを設定できます。 -* **コードの追加**: 必要に応じてGPUメモリ割り当てを増やすようTensorFlowを設定するには、以下のコードをノートブックに追加してください。 +このセクションの一部の例では、かなり大きなモデルを訓練します。 +* **GPU対応のコンピューターを使用する**: 大きなモデルを扱う際の待ち時間を短縮するために、GPU対応のコンピューターでノートブックを実行することをおすすめします。 +* **GPUメモリの制約**: GPUで実行すると、特に大きなモデルを訓練する際にGPUメモリ不足になることがあります。 +* **GPUメモリ消費量**: 訓練時に消費されるGPUメモリ量は、ミニバッチサイズを含む様々な要因に依存します。 +* ミニバッチサイズを最小化する: GPUメモリ問題に直面した場合、解決策としてコード内のミニバッチサイズを減らすことを検討してください。 +* **TensorFlowのGPUメモリ解放**: 古いバージョンのTensorFlowは、一つのPythonカーネル内で複数のモデルを訓練すると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) ``` -古典的な機械学習の観点から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) +* [言語モデル](15-LanguageModeling/README.md) * [リカレントニューラルネットワーク](16-RNN/README.md) -* [生成ネットワーク](17-GenerativeNetworks/README.md) +* [生成モデル](17-GenerativeNetworks/README.md) * [トランスフォーマー](18-Transformers/README.md) -**免責事項**: -この文書は、AI翻訳サービス [Co-op Translator](https://github.com/Azure/co-op-translator) を使用して翻訳されています。正確性を追求しておりますが、自動翻訳には誤りや不正確な部分が含まれる可能性があることをご承知おきください。元の言語で記載された文書が公式な情報源とみなされるべきです。重要な情報については、専門の人間による翻訳を推奨します。この翻訳の使用に起因する誤解や誤認について、当方は一切の責任を負いません。 \ No newline at end of file +--- + + +**免責事項**: +本書類は AI 翻訳サービス [Co-op Translator](https://github.com/Azure/co-op-translator) を使用して翻訳されています。正確性を期していますが、自動翻訳には誤りや不正確な部分が含まれる可能性があることをご承知おきください。原文の原語版が正式な情報源とみなされるべきです。重要な情報については、専門の人間による翻訳を推奨します。本翻訳の利用により生じたいかなる誤解や解釈違いについても、当方は責任を負いかねます。 + \ No newline at end of file diff --git a/translations/km/.co-op-translator.json b/translations/km/.co-op-translator.json index f081917337..b5d5d8003e 100644 --- a/translations/km/.co-op-translator.json +++ b/translations/km/.co-op-translator.json @@ -5,6 +5,12 @@ "source_file": "AGENTS.md", "language_code": "km" }, + "CONTRIBUTING.md": { + "original_hash": "c6fd7e781b67111a90abd166d0ce4aa0", + "translation_date": "2026-07-08T20:51:39+00:00", + "source_file": "CONTRIBUTING.md", + "language_code": "km" + }, "README.md": { "original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b", "translation_date": "2026-04-06T17:01:21+00:00", @@ -17,6 +23,19 @@ "source_file": "SECURITY.md", "language_code": "km" }, + "__translation_failures__": { + "lessons/sketchnotes/LICENSE.md": { + "original_hash": "45ab63a2cd8f5faef6c9b150618837a4", + "source_file": "lessons/sketchnotes/LICENSE.md", + "language_code": "km", + "failure_date": "2026-07-08T20:51: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": "2026-04-06T17:01:55+00:00", @@ -60,8 +79,8 @@ "language_code": "km" }, "examples/README.md": { - "original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7", - "translation_date": "2026-04-06T17:03:36+00:00", + "original_hash": "7883d52c2e2a221e0b07a7b112a149b9", + "translation_date": "2026-07-08T20:43:44+00:00", "source_file": "examples/README.md", "language_code": "km" }, @@ -72,8 +91,8 @@ "language_code": "km" }, "lessons/0-course-setup/how-to-run.md": { - "original_hash": "a4717bd9103b9f6cd84d534b83534689", - "translation_date": "2026-04-06T17:06:01+00:00", + "original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1", + "translation_date": "2026-07-08T20:44:16+00:00", "source_file": "lessons/0-course-setup/how-to-run.md", "language_code": "km" }, @@ -306,8 +325,8 @@ "language_code": "km" }, "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": { - "original_hash": "c189abc107848f96051085cc30945129", - "translation_date": "2026-04-06T17:57:58+00:00", + "original_hash": "99b816b6a4957ef4100cee4c4221dff9", + "translation_date": "2026-07-08T20:27:14+00:00", "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", "language_code": "km" }, @@ -600,8 +619,8 @@ "language_code": "km" }, "lessons/5-NLP/README.md": { - "original_hash": "8ef02a9318257ea140ed3ed74442096d", - "translation_date": "2026-04-06T17:12:27+00:00", + "original_hash": "038df6f1a73e49f6430740da083bfd6d", + "translation_date": "2026-07-08T20:44:59+00:00", "source_file": "lessons/5-NLP/README.md", "language_code": "km" }, diff --git a/translations/km/CONTRIBUTING.md b/translations/km/CONTRIBUTING.md new file mode 100644 index 0000000000..4bc33d1020 --- /dev/null +++ b/translations/km/CONTRIBUTING.md @@ -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 របស់ repository។ +2. កែសម្អាតឃ្លាខុស ឬភ្ជាប់ខូច។ +3. ដាក់សំណើ Pull Request ជាមួយពណ៌នាថ្មីនៃការកែលម្អ។ + +### 2. ដាក់សំណើបកប្រែ +យើងសូមស្វាគមន៍ការបកប្រែម៉េរៀនទៅជาทាសារផ្សេងទៀត! សូមដាក់បកប្រែនៅក្នុងថត `translations/` ដោយប្រើឈ្មោះថតដែលមានស្រាប់ (ឧ. `translations/es/`, `translations/pt-BR/`, `translations/zh-CN/`)។ + +សម្រាប់ព័ត៌មានលម្អិត ចូលទៅកាន់ [etc/CONTRIBUTING.md](etc/CONTRIBUTING.md)។ + +--- + + +**ការបដិសេធ**: +ឯកសារនេះត្រូវបានបម្លែងភាសា ដោយប្រើសេវាបម្លែងភាសា AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ទោះយើងខ្ញុំមានក្តីប្រាថ្នាឱ្យបានច្បាស់លាស់ តែសូមយល់ដឹងថាការបម្លែងដោយស្វ័យប្រវត្តិក៏អាចមានកំហុសឬភាពមិនត្រឹមត្រូវ។ ឯកសារដើមជាភាសាទីតាំងគួរត្រូវបានគេប្រើជាប្រភពច្បាស់លាស់។ សម្រាប់ព័ត៌មានសំខាន់ៗ សូមណែនាំឱ្យប្រើប្រាស់ការប្រែដោយមនុស្សជំនាញ។ យើងខ្ញុំមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកស្រាយខុសបន្ទាប់ពីការប្រើប្រាស់ការបម្លែងនេះនោះទេ។ + \ No newline at end of file diff --git a/translations/km/examples/README.md b/translations/km/examples/README.md index df23685f00..d8e979cbd2 100644 --- a/translations/km/examples/README.md +++ b/translations/km/examples/README.md @@ -1,21 +1,21 @@ -# ឧទាហរណ៍ 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 # សម្រាប់ស្គ្រីប Python @@ -25,63 +25,63 @@ pip install numpy pip install jupyter numpy pillow tensorflow ``` -ឬប្រើបរិយាកាស conda ពីមេរៀនសិក្សាសំខាន់៖ +ឬប្រើបរិយាកាស conda ពីមេរៀនស្នូល៖ ```bash conda env create --name ai4beg --file ../environment.yml conda activate ai4beg ``` -### ការប្រតិបត្តិឧទាហរណ៍ +### រត់ឧទាហរណ៍ **សម្រាប់ស្គ្រីប Python (.py files):** ```bash python 01-hello-ai-world.py ``` -**សម្រាប់កំណត់ត្រា Jupyter (.ipynb files):** +**សម្រាប់ក្រដាស់ Jupyter (.ipynb files):** ```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) +- **អានចំណាំក្នុងកូដយ៉ាងម៉ត់ចត់** - ពួកវាបកស្រាយអំពីអ្វីដែលបន្ទាត់នីមួយៗធ្វើ +- **សាកល្បង!** - ព្យាយាមផ្លាស់ប្តូរតម្លៃហើយមើលអ្វីកើតឡើង +- **កុំបារម្ភពីការយល់ដឹងទាំងមូល** - ការរៀនត្រូវការពេលវេលា +- **សួរបញ្ហា** - ប្រើ [កន្លែងពិភាក្សា](https://github.com/microsoft/AI-For-Beginners/discussions) -## 🔗 ជំហានបន្ទាប់ +## 🔗 ជំហ៊ានបន្ទាប់ -បន្ទាប់ពីបញ្ចប់ឧទាហរណ៍ទាំងនេះ ស្វែងយល់ពីមេរៀនពេញលេញ៖ -- [ការណែនាំ AI](../lessons/1-Intro/README.md) -- [បណ្ដាញសរសៃប្រសាទ](../lessons/3-NeuralNetworks/README.md) -- [ចក្ខុវិស័យកុំព្យូទ័រ](../lessons/4-ComputerVision/README.md) -- [ការដំណើរការភាសាមនុស្សធម្មតា](../lessons/5-NLP/README.md) +បន្ទាប់ពីបញ្ចប់ឧទាហរណ៍ទាំងនេះ សូមស្វែងយល់ពីមេរៀនពេញលេញ៖ +- [ការណែនាំអំពី AI](../lessons/1-Intro/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)។ ខណៈពេលយើងខិតខំមានភាពត្រឹមត្រូវ សូមយកចិត្តទុកដាក់ថាការបកប្រែដោយស្វ័យប្រវត្តិអាចមានកំហុសឬភាពមិនត្រឹមត្រូវ។ ឯកសារដើមក្នុងភាសាតំបន់គឺជាចំណោមព័ត៌មានដែលមានអំណាច។ សម្រាប់ព័ត៌មានសំខាន់ គួរតែប្រើការបកប្រែដោយវិជ្ជាជីវៈមនុស្ស។ យើងពុំទទួលខុសត្រូវចំពោះការយល់ច្រឡំឬការបកស្រាយខុសៗចេញពីការប្រើប្រាស់ការបកប្រែនេះទេ។ +**ការបដិសេធ**: +ឯកសារនេះត្រូវបានបម្លែងភាសា ដោយប្រើសេវាបម្លែងភាសា AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ទោះយើងខ្ញុំមានក្តីប្រាថ្នាឱ្យបានច្បាស់លាស់ តែសូមយល់ដឹងថាការបម្លែងដោយស្វ័យប្រវត្តិក៏អាចមានកំហុសឬភាពមិនត្រឹមត្រូវ។ ឯកសារដើមជាភាសាទីតាំងគួរត្រូវបានគេប្រើជាប្រភពច្បាស់លាស់។ សម្រាប់ព័ត៌មានសំខាន់ៗ សូមណែនាំឱ្យប្រើប្រាស់ការប្រែដោយមនុស្សជំនាញ។ យើងខ្ញុំមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកស្រាយខុសបន្ទាប់ពីការប្រើប្រាស់ការបម្លែងនេះនោះទេ។ \ No newline at end of file diff --git a/translations/km/lessons/0-course-setup/how-to-run.md b/translations/km/lessons/0-course-setup/how-to-run.md index dd394043be..891c8cfd78 100644 --- a/translations/km/lessons/0-course-setup/how-to-run.md +++ b/translations/km/lessons/0-course-setup/how-to-run.md @@ -1,12 +1,12 @@ -# របៀបដំណើរកូដ +# របៀបដំណើរការ Code -កម្មវិធីសិក្សានេះមានឧទាហរណ៍អាចអនុវត្ត និងប laboratorio ច្រើនដែលអ្នកត្រូវការដំណើរការ។ ដើម្បីធ្វើដូចនេះ អ្នកត្រូវការជំនាញក្នុងការអនុវត្តកូដ 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 ចប់ សូមលីងគ្មានអ្នកទៅកាន់ឃ្លាំងហើយបង្កើតបរិស្ថានកម្រិតដែលនឹងប្រើសម្រាប់វគ្គនេះ៖ +បន្ទាប់ពីអ្នកដំឡើង miniconda រួច សូម clone ទុក repository ហើយបង្កើតបរិស្ថានវីរុស្សីសម្រាប់ប្រើប្រាស់នៅវិស័យមេរៀននេះ៖ ```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 ជាមួយផ្នែកបន្ថែម Python +### ការប្រើប្រាស់ 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 ដូចបានពិពណ៌នាលើកនៅខាងលើផងដែរ។ +> **សម្គាល់**៖ ម្តងណា​ដែលអ្នក clone ហើយបើកថតឯកសារនៅក្នុង VS Code វានឹងផ្ដល់យោបល់ឱ្យអ្នក​ដំឡើង Python extensions។ អ្នកក៏ត្រូវដំឡើង miniconda ដូចបានណែនាំខាងលើផងដែរ។ -> **សម្គាល់**៖ ប្រសិនបើ VS Code ផ្ដល់អនុសាសន៍ឲ្យអ្នកបើកឃ្លាំងឡើងវិញក្នុងផ្ទុក container អ្នកគួរត្រូវបដិសេធដើម្បីប្រើប្រាស់ Python ដំឡើងក្នុងកុំព្យូទ័រផ្ទាល់ខ្លួន។ +> **សម្គាល់**៖ បើ VS Code ផ្តល់យោបល់ឱ្យអ្នកបើក repository នៅក្នុង container ម្តងទៀត អ្នកគួរតែបដិសេធ ដើម្បីប្រើប្រាស់ Python ចំណុចបុរីពាក់កណ្តាលផ្ទាល់ខ្លួន។ -### ការប្រើប្រាស់ Jupyter ក្នុងកម្មវិធីជ្រើសរើស +### ការប្រើប្រាស់ Jupyter ក្នុងកម្មវិធីបើក​ទៅកាន់ Browser -អ្នកក៏អាចប្រើបរិស្ថាន Jupyter ពីកម្មវិធីជ្រើសរើសនៅលើកុំព្យូទ័ររបស់អ្នកផ្ទាល់។ Jupyter ពីផ្លូវចាស់ និង JupyterHub ផ្តល់បរិស្ថានអភិវឌ្ឍន៍ងាយស្រួលជាមួយការបំពេញឯកសារអូតូ ការពណ៌លើកូដ និង ផ្សេងៗទៀត។ +អ្នកអាចប្រើបរិស្ថាន Jupyter ពី browser នៅលើកុំព្យូទ័រផ្ទាល់ខ្លួនដែរ។ ចំណុចគោលនៃ Jupyter និង JupyterHub ផ្តល់បរិស្ថានអភិវឌ្ឍន៍មានភាពងាយស្រួលជាមួយអូតូបញ្ចូលកូដ ការចម្លងពណ៌កូដ លើកទីផ្សារ។ -ដើម្បីចាប់ផ្តើម Jupyter ក្នុងកុំព្យូទ័ររបស់អ្នក សូមទៅកាន់ថតនៃវគ្គនោះ ហើយដំណើរការ៖ +ដើម្បីចាប់ផ្តើម Jupyter នៅលើកុំព្យូទ័រផ្ទាល់ខ្លួន សូមទៅកាន់ថតដែលមានមេរៀន ហើយដំណើរការ៖ ```bash jupyter notebook @@ -36,36 +36,36 @@ or ```bash jupyterhub ``` -អ្នកអាចរុករកទៅឯកសារ `.ipynb` មួយណាមួយ បើកវា ហើយចាប់ផ្តើមធ្វើការងារ។ +អ្នកអាចទៅរកឯកសារ `.ipynb` មួយណាមួយ បើកវា ហើយចាប់ផ្តើមការងារ។ ### ការដំណើរការនៅក្នុង container -ជម្រើសមួយផ្សេងទៀតសម្រាប់ការដំឡើង Python គឺដំណើរការកូដក្នុង container។ ព្រោះឃ្លាំងរបស់យើងផ្ដល់ថត `.devcontainer` ពិសេសមួយ ដែលបញ្ជាក់ពីរបៀបសែត container សម្រាប់ repo នេះ VS Code ផ្តល់ឱកាសឲ្យបើកកូដឡើងវិញក្នុង container។ វាត្រូវការដំឡើង Docker ហើយក៏ស្មុគស្មាញជាងនេះ ដូច្នេះយើងផ្ដល់អនុសាសន៍ឲ្យអ្នកប្រើប្រាស់មានបទពិសោធន៍ជាង។ +ជម្រើសមួយផ្សេងទៀតសម្រាប់ការដំឡើង Python គឺដំណើរការកូដនៅក្នុង container។ ពីព្រោះ repository របស់យើងផ្តល់ថត `.devcontainer` ដែលបង្ហាញពីរបៀបបង្កើត container សម្រាប់ repo នេះ VS Code ផ្តល់ឱកាសបើកកូដនៅក្នុង container ម្តងទៀត។ វាតម្រូវអោយមានការដំឡើង Docker ហើយវាធ្វើឱ្យមានភាពស្មុគស្មាញខ្លាំង​ជាងមុន ដូច្នេះយើងណែនាំសម្រាប់អ្នកមានបទពិសោធន៍ខ្លះឬច្រើនជាងនេះ។ -## ដំណើរការនៅពាណិជ្ជកម្ម Cloud +## ការដំណើរការនៅក្នុងពពក -ប្រសិនបើអ្នកមិនចង់ដំឡើង Python ក្នុងកុំព្យូទ័រផ្ទាល់ខ្លួន និងមានចូលដំណើរការទៅធនធាន Cloud មួយចំនួន - ជម្រើសល្អមួយគឺដំណើរការកូដនៅពាណិជ្ជកម្ម Cloud។ មានវិធីជាច្រើនដែលអ្នកអាចធ្វើបានដូចខាងក្រោម៖ +ប្រសិនបើអ្នកមិនចង់ដំឡើង Python នៅលើកុំព្យូទ័រផ្ទាល់ខ្លួន និងមានចូលដំណើរការប្រព័ន្ធពពក មួយជម្រើសល្អគឺដំណើរការកូដនៅក្នុងពពក។ មានរបៀបច្រើនដែលអ្នកអាចធ្វើបាន៖ -* ប្រើប្រាស់ **[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 សម្រាប់អ្នកបានយ៉ាងរលូន។ +* ប្រើប្រាស់ **[GitHub Codespaces](https://github.com/features/codespaces)**, វាជាបរិស្ថានវីរុស្សីដែលបានបង្កើតសម្រាប់អ្នកនៅលើ GitHub ដែលអាចចូលបានតាមរយៈផ្ទាំង VS Code នៅក្នុង browser។ ប្រសិនបើអ្នកមានចូលដំណើរការចំពោះ Codespaces អ្នកអាចចុចប៊ូតុង **Code** នៅក្នុង repo ចាប់ផ្តើម codespace ហើយអាចដំណើរការបានភ្លាមៗ។ +* ប្រើប្រាស់ **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**។ [Binder](https://mybinder.org) ផ្តល់អោយមានធនធានកុំព្យូទ័រដោយឥតគិតថ្លៃនៅលើពពកសម្រាប់មនុស្សគ្រប់រូបដូចអ្នកក្នុងការពិសោធន៍កូដនៅលើ GitHub។ មានប៊ូតុងនៅមុខទំព័រដើម្បីបើក repository នៅក្នុង Binder - នេះគួរតែដឹកនាំអ្នកទៅទំព័រ Binder ដោយមាន container បានបង្កើតឡើងដោយស្វ័យប្រវត្តិ ហើយចាប់ផ្តើមផ្ទាំងបង្ហាញ Jupyter ដោយរលូន។ -> **សម្គាល់**៖ ដើម្បីរារាំងការប្រើប្រាស់មិនត្រឹមត្រូវ Binder បានគ្របដណ្តប់ចូលដំណើរការទៅធនធានវ៉ិបមួយចំនួន។ វាអាចលើកឡើងបញ្ហាមួយចំនួនក្នុងកូដដែលយកម៉ូដែលនិង/ឬទិន្នន័យពីអ៊ិនធឺរណិតសាធារណៈ។ អ្នកអាចត្រូវការស្វែងរកវិធីជៀសវាងខ្លះ។ រួចទៀតធនធានកុំព្យូទ័រដែល Binder ផ្តល់គឺមូលដ្ឋានបំផុត ដូច្នេះការបណ្តុះបណ្តាលនឹងយឺតជាង ពិសេសនៅមេរៀនក្រោយៗ ដែលស្មុគស្មាញជាង។ +> **សម្គាល់**៖ ដើម្បីជៀសវាងការប្រើប្រាស់ខុស វេទិកា Binder ត្រូវបានហាមឃាត់ចូលដំណើរការទៅកាន់ធនធានបណ្តាញខ្លះៗ។ វាអាចធ្វើឲ្យកូដខ្លះមិនដំណើរការបាន ដែលទាញយកគំរូ និង/ឬ dataset ពីអ៊ីនធឺណិតសាធារណៈ។ អ្នកប្រហែលជាត្រូវការរកវិធីជំនួសខ្លះ។ ហើយធនធានគណនា​ដែលបានផ្តល់ឲ្យឯកដោយ Binder គឺមានកម្រិតសាមញ្ញ ដូច្នេះការបង្វឹកនឹងយឺត លើកឡើងជាពិសេសនៅមេរៀនបន្ទាប់​ដែលមានស្មុគស្មាញជាងមុន។ -## ដំណើរការនៅពាណិជ្ជកម្ម Cloud ជាមួយ GPU +## ការដំណើរការនៅក្នុងពពកជាមួយ GPU -មេរៀនខាងក្រោយៗក្នុងកម្មវិធីសិក្សានេះនឹងទទួលផលប្រយោជន៍យ៉ាងខ្លាំងពីការគាំទ្រ GPU។ ការបណ្តុះបណ្តាលម៉ូដែល ដូចជាគំរូ អាចយឺតយ៉ាវបើគ្មាន GPU។ មានជម្រើសពីរបៀបដែលអ្នកអាចអនុវត្តបាន ជាពិសេស ប្រសិនបើអ្នកមានចូលដំណើរការទៅពាណិជ្ជកម្ម Cloud តាមរយៈ [Azure for Students](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) ឬតាមរយៈស្ថាប័នរបស់អ្នក៖ -* បង្កើត [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។ +* បង្កើត [Data Science Virtual Machine](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) ហើយភ្ជាប់ចូលតាម Jupyter។ អ្នកអាច clone repo បានផ្ទាល់លើម៉ាស៊ីន ហើយចាប់ផ្តើមរៀន។ VM គ្រប់គ្រង 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/) បង្ហាញពីរបៀបលីង repo ទៅក្នុង Azure ML notebook ហើយចាប់ផ្តើមប្រើប្រាស់។ +* បង្កើត [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/) បង្ហាញពីរបៀប clone repository ចូលក្នុង Azure ML notebook ហើយចាប់ផ្តើមប្រើប្រាស់វា។ -អ្នកក៏អាចប្រើ Google Colab ដែលមានការគាំទ្រពី GPU ដោយឥតគិតថ្លៃ និងផ្ទុក Jupyter Notebooks ទៅទីនោះដើម្បីអនុវត្តមួយម៉ឺនុយម្ដង។ +អ្នកក៏អាចប្រើ Google Colab ដែលផ្តល់ការគាំទ្រ GPU ឥតគិតថ្លៃខ្លះៗ ហើយផ្ទុក Jupyter Notebooks ទៅនោះដើម្បីដំណើរការបានមួយតាមមួយ។ --- -**ការបដិសេធ**៖ -ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ បើទោះបីយើងខិតខំរកភាពត្រឹមត្រូវក្របខ័ណ្ឌក៏ដោយ សូមដឹងថាការបកប្រែដោយស្វ័យប្រវត្តអាចមានកំហុស ឬការមិនត្រឹមត្រូវខ្លះ។ ឯកសារដើមជាភាសាដើមគួរត្រូវបានគិតថាជា ប្រភពផ្លូវការបំផុត។ សម្រាប់ព័ត៌មានសំខាន់ៗ អង្គការបកប្រែដោយមនុស្សជំនាញត្រូវបានផ្ដល់អនុសាសន៍។ យើងមិនមានការទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកស្រាយខុសប្រកបដោយការប្រើប្រាស់ការបកប្រែនេះឡើយ។ +**ការបដិសេធ**: +ឯកសារនេះត្រូវបានបម្លែងភាសា ដោយប្រើសេវាបម្លែងភាសា AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ទោះយើងខ្ញុំមានក្តីប្រាថ្នាឱ្យបានច្បាស់លាស់ តែសូមយល់ដឹងថាការបម្លែងដោយស្វ័យប្រវត្តិក៏អាចមានកំហុសឬភាពមិនត្រឹមត្រូវ។ ឯកសារដើមជាភាសាទីតាំងគួរត្រូវបានគេប្រើជាប្រភពច្បាស់លាស់។ សម្រាប់ព័ត៌មានសំខាន់ៗ សូមណែនាំឱ្យប្រើប្រាស់ការប្រែដោយមនុស្សជំនាញ។ យើងខ្ញុំមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកស្រាយខុសបន្ទាប់ពីការប្រើប្រាស់ការបម្លែងនេះនោះទេ។ \ No newline at end of file diff --git a/translations/km/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/km/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index 02583d39a2..2520dc214c 100644 --- a/translations/km/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/km/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -4,11 +4,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# ម៉ូឌែលបានបណ្ដុះបណ្ដាលជាមុន និងការរៀនផ្ទេរ\n", + "# ម៉ូឌែលដែលបានបណ្តុះបណ្តាលជាមុន និងការរៀនផ្ទេរ\n", "\n", - "ការបណ្ដុះបណ្ដាល CNN អាចចំណាយពេលយូរ និងត្រូវការទិន្នន័យច្រើនសម្រាប់ភារកិច្ចនោះ។ ទោះយ៉ាងណាក្ដី ពេលភាគច្រើនត្រូវបានប្រើសម្រាប់រៀនបន្ទះតម្រៀបកម្រិតទាបដ៏ល្អបំផុតដែលបណ្តាញកំពុងប្រើសម្រាប់បំបែកលំរូពីរូបភាព។ សំណួរធម្មជាតិមួយកើតឡើង - តើយើងអាចប្រើបណ្តាញប្រសិត្រដែលបានបណ្ដុះបណ្ដាលមួយទៅលើទិន្នន័យមួយ ហើយបត់ប្រើវាសម្រាប់ចាត់ថ្នាក់រូបភាពផ្សេងគ្នាបាន ដោយគ្មានដំណើរការបណ្តុះបណ្ដាលពេញលេញទេមែន?\n", + "ការបណ្តុះបណ្តាល CNNs អាចចំណាយពេលវេលាច្រើន និងតម្រូវឱ្យមានទិន្នន័យច្រើនសម្រាប់ដំណើរការនោះ។ ទោះយ៉ាងណា ភាគច្រើននៃពេលវេលាត្រូវបានចំណាយដើម្បីរៀនតម្រៀបមូលដ្ឋានល្អបំផុតដែលបណ្តាញកំពុងប្រើដើម្បីដកយកលំនាំពីរូបភាព។ សំណួរតាមធម្មជាតិមួយកើតឡើង- តើយើងអាចប្រើបណ្តាញសួន្យដែលបានបណ្តុះបណ្តាលលើសំណុំទិន្នន័យមួយ និងទ្រង់ទ្រាយវាឡើងវិញសម្រាប់ចាត់ថ្នាក់រូបភាពផ្សេងទៀតដោយគ្មានដំណើរការបណ្តុះបណ្តាលពេញលេញទេ?\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 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", - "នៅក្នុងឧទាហរណ៍មុនៗ យើងបានកំពុងបញ្ជូលឃ្លាំងទិន្នន័យដែលបានបង្កើតរួចនៅក្នុង 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" + "Dataset ចាប់យក​ឈ្មោះថ្នាក់​ពីថត​ដើម​ដោយស្វ័យប្រវត្តិ ហើយ​អ្នកអាច​ចូលប្រើ​ទៅកាន់​ពួកវាប្រសិន​បើ​ត្រូវការ​ដោយ​ហៅ៖\n" ] }, { @@ -412,7 +412,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "តំណាងទិន្នន័យដែលយើងបានទទួលអាចត្រូវបានផ្ទាល់បញ្ជូនទៅកាន់មុខងារ `fit` ដើម្បីបណ្តុះបណ្តាលម៉ូដែល។ ដំណើរការទាំងនេះមានរូបភាព និង ស្លាកដែលពាក់ព័ន្ធគ្នាទាំងពីរ និងអាចជារឿកបានតាមរយៈការរចនាដូចខាងក្រោម៖\n" + "សំណុំទិន្នន័យដែលយើងបានទទួលអាចផ្តល់ឲ្យមុខងារ `fit` ដើម្បីបណ្តុះម៉ូឌែលដោយផ្ទាល់។ វាមានរូបភាពនិងស្លាកនានាដែលគួរត្រូវបានពិនិត្យឡើងវិញសម្រាប់ឱកាសតាមរយៈរចនាសម្ព័ន្ធដូចខាងក្រោម៖\n" ] }, { @@ -453,16 +453,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "> **ចំណាំ**៖ រូបភាពទាំងអស់ក្នុងសំណុំទិន្នន័យត្រូវបានតំណាងជាតង់ស័រពិន្ទុលន់ចរន្តអចលន៍ដែលមានជម្លោះពី 0-255។ មុនពេលផ្ញើវាទៅបណ្តាញសរសៃប្រសាទ យើងត្រូវតែបំលែងតម្លៃទាំងនេះទៅជាជួរពី 0-1។ នៅពេលគូរស្រស់រូបភាព យើងត្រូវធ្វើដូចគ្នា ឬបំលែងតម្លៃទៅប្រភេទ `int` (ដែលយើងបានធ្វើក្នុងកូដខាងលើ) ដើម្បីបង្ហាញឲ្យ `matplotlib` ដឹងថាយើងចង់គូររូបភាពដើមដែលមិនបានបំលែង។\n" + "> **កំណត់សម្គាល់**៖ រូបភាពទាំងអស់នៅក្នុងឃ្លាំងទិន្នន័យ ត្រូវបានតំណាងជាទិន្នន័យ floatint point ដែលមានជួរពី 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", @@ -511,16 +521,16 @@ "metadata": {}, "source": [ "មានរឿងសំខាន់ពីរបីនៅទីនេះ៖\n", - "* មុននឹងបញ្ជូនការបញ្ចូលទៅកាន់បណ្ដាញដែលបានបណ្តុះបណ្តាលមុន គឺត្រូវតែបម្រុងទុកជាមុនដោយវិធីមួយជាក់លាក់។ វាត្រូវបានធ្វើឡើងដោយការហៅមុខងារ `preprocess_input` ដែលទទួលបានបាត់នៃរូបភាព ហើយត្រឡប់ឲ្យមានទ្រង់ទ្រាយដែលបានដំណើរការ។ នៅក្នុងករណី VGG-16 រូបភាពត្រូវបានធម្មតាទ្រង់ទ្រាយ និងតម្លៃមធ្យមដែលបានកំណត់សម្រាប់បញ្ជាប់មួយៗត្រូវបានដក។ នេះមានមូលហេតុថា VGG-16 ត្រូវបានបណ្តុះបណ្តាលដោយវិធី pre-processing នេះដើមជាមុន។\n", - "* បណ្ដាញប្រសាទត្រូវបានអនុវត្តទៅលើបាត់បញ្ចូល ហើយយើងទទួលបានជាលទ្ធផលបាត់ tensor ១០០០-ធាតុ ដែលបង្ហាញអំពីប្រហែលនៃថ្នាក់នីមួយៗ។ យើងអាចស្វែងរកលេខថ្នាក់ដែលមានប្រហែលខ្ពស់បំផុតដោយហៅ `argmax` លើ tensor នេះ។\n", - "* លទ្ធផលដែលបានទទួលគឺជា [លេខនៃថ្នាក់ `ImageNet`](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a)។ ដើម្បីយល់ន័យលទ្ធផលនេះ យើងអាចប្រើមុខងារ `decode_predictions` ដែលត្រឡប់ថ្នាក់ខ្ពស់ n សមាជកជាមួយនឹងឈ្មោះរបស់ពួកវា។\n" + "* មុនពេលផ្ទេរបញ្ចូលទៅកាន់បណ្ដាញដែលបានហ្វឹកហាត់រួចហើយណាមួយ វាត្រូវបានដំណើរការដំបូងមួយរបៀបជាក់លាក់ទេ។ នេះត្រូវបានធ្វើដោយការហៅមុខងារ `preprocess_input` ដែលទទួលបានច្រកបញ្ចូលនៃរូបភាព ហើយត្រឡប់រូបភាពដែលបានដំណើរការឡើងវិញ។ សម្រាប់ VGG-16 រូបភាពត្រូវបានផ្ទៀងផ្ទាត់ស្ដង់ដារ ហើយតម្លៃមធ្យមមួយដែលបានកំណត់ជាមុនសម្រាប់ប៉ារ៉ាម៉ែត្រនីមួយៗត្រូវបានដកចេញ។ នេះគឺដោយសារតែ VGG-16 ត្រូវបានហ្វឹកហាត់ដើមជាមួយនឹងការដំណើរការដូចនេះ។\n", + "* បណ្ដាញនឺរូនត្រូវបានអនុវត្តទៅលើច្រកបញ្ចូល ហើយយើងទទួលបានជាលទ្ធផលជាច្រកបញ្ចូលដែលមានទិន្នន័យ 1000 ធាតុបង្ហាញឱកាសរបស់ថ្នាក់នីមួយៗ។ យើងអាចស្វែងរកលេខថ្នាក់ដែលមានឱកាសខ្ពស់ជាងគេ ដោយហៅ `argmax` លើទិន្នន័យនេះ។\n", + "* លទ្ធផលដែលបានទទួលគឺជាអង្គលេខមួយនៃថ្នាក់ `ImageNet`។ ដើម្បីយល់អំពីលទ្ធផលនេះ អ្នកអាចប្រើមុខងារ `decode_predictions` ដែលចេញថ្នាក់កំពូល n រួមជាមួយឈ្មោះរបស់ពួកគេ។\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "មកមើលសំណង់វិស្វកម្មនៃបណ្តាញ VGG-16 ផង:\n" + "មកមើលរចនាសម្ព័ន្ធនៃបណ្ដាញ VGG-16 ផងដែរ៖\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": [ - "## ការដកមុខងារ 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", + "ទំហំដែនលក្ខណៈ (feature tensor) គឺ 7x7x512 ប៉ុន្តៃ​រ​ដើម្បី​មើល​ឃើញ​វា​យើង​ត្រូវ​បម្លែង​វា​ទៅ​រូបរាង 2D។\n", "\n", - "ឥឡូវនេះ​សូម​ព្យាយាម​មើល​ថា​លក្ខណៈ​ទាំង​នោះ​អាច​ត្រូវ​បាន​ប្រើ​ដើម្បីចាត់​ថ្នាក់​រូបភាព​ដែរឬ​ទេ។ យើង​សូម​ជ្រើស​រើស​ផ្នែក​មួយ​នៃ​រូបភាព (50 មីនីបាច) ដោយ​ដៃ ហើយ​គណនា​មុន​វិចិត្រ​លក្ខណៈ​របស់​ពួកវា។ យើង​អាច​ប្រើ API **dataset** របស់ Tensorflow ដើម្បីធ្វើ​ពួក​វា។ មុខងារ `map` ទទួល​បាន dataset ហើយ​អនុវត្ត​លំដាប់​ឡំបដ្ឋាន​មួយ​ដើម្បី​បម្លែង​វា។ យើង​ប្រើ​យន្តការ​នេះ​ដើម្បីបង្កើត dataset ថ្មី `ds_features_train` និង `ds_features_test` ដែល​រួម​មាន​លក្ខណៈ​ដែល​បាន​យក​ចេញ​ពី VGG ជំនួស​រូបភាព​ដើម។\n" + "ឥឡូវនេះ យើង​រៀន​ពី​មើល​វា​ថា លក្ខណៈ​ទាំង​នេះ​អាច​ប្រើបាន​សម្រាប់ចាត់ថ្នាក់​រូបភាព​ឬទេ។ យើង​ត្រូវ​ចាប់ផ្ដើម​យក​ផ្នែក​មួយ​សម្រាប់​រូបភាព​មួយ​ចំនួន (50 minibatches, នៅ​សំណុំរបស់​យើង) ហើយ​គណនា​លទ្ធភាព​ប្រេសាស់​របស់​វា​មុន។ យើង​អាច​ប្រើកម្មវិធី API **dataset** នៃ Tensorflow សម្រាប់​ធ្វើ​វា។ មុខងារ `map` ទទួល dataset មួយ ហើយ​អនុវត្ត​ឲ្យ​មុខងារ lambda ដែល​ផ្ដល់សម្រាប់​បម្លែង​វា។ យើង​ប្រើ​គន្លងនេះ​ដើម្បី​បង្កើត dataset ថ្មី​បានជា `ds_features_train` និង `ds_features_test` ដែល​មានលក្ខណៈ​ដកស្រង់​ពី VGG ជំនួសរូបភាពដើម។\n" ] }, { @@ -712,9 +723,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "យើងបានប្រើសំណល់ `.take(50)` ដើម្បីដាក់កំណត់ទំហំឃ្លាំងទិន្នន័យ ដើម្បីលឿនការបង្ហាញរបស់យើង។ អ្នកអាចព្យាយាមការប្រតិបត្តិនេះលើឃ្លាំងទិន្នន័យទាំងមូលបានច្បាស់ជាក់។\n", + "យើងបានប្រើកូដ `.take(50)` ដើម្បីកំណត់ទំហំឃ្លាំងទិន្នន័យ ដើម្បីបំណ‘sើរឲ្យការបង្ហាញរបស់យើងរហ័សឡើង។ ប្រសិនបើអ្នកចង់ អ្នកអាច​ធ្វើ​តេស្ត​នេះ​លើឃ្លាំង​ទិន្នន័យ​គ្រប់លំដាប់។\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", + "## ការរៀនផ្ទេរប្រើបណ្តាញ 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 ដំណើរការជាអ្នកដកលក្ខណៈ (feature extractor) ហើយមិនត្រូវបានបណ្ដុះបណ្ដាលឡើងវិញឡើយ។ ដូចនេះ យើងត្រូវតែ **កសWeightនៃអ្នកដកលក្ខណៈ convolutional**។ យើងអាចចូលដល់ស្រទាប់ដំបូងនៃបណ្តាញដោយហៅ `model.layers[0]` ហើយតែតម្រូវឲ្យកំណត់អថេរជាតិ `trainable` ទៅជា `False`។\n", + "ម៉ូដែលនេះដូចជាបណ្ដាញចាត់ថ្នាក់ចាប់ពីដំបូងដល់បញ្ចប់ ដែលទទួលរូបភាពមួយ និងត្រឡប់ថ្នាក់។ ទោះជាយ៉ាងណា រឿងដែលគួរឱ្យច្របូកច្របល់គឺ យើងចង់ឲ្យ VGG16 ធ្វើតួជាអ្នកបញ្ចេញលក្ខណៈពិសេស ហើយមិនត្រូវបានបណ្តុះបណ្តាលឡើងវិញទេ។ ដូច្នេះ យើងត្រូវតែ **ផ្អាកទម្ងន់នៃអ្នកបញ្ចេញលក្ខណៈពិសេស convolutional**។ យើងអាចចូលទៅកាន់ស្រទាប់ដំបូងនៃបណ្ដាញដោយហៅ `model.layers[0]` ហើយយើងត្រូវតែបញ្ចេញគុណលក្ខណៈ `trainable` ទៅជា `False`។\n", "\n", - "> **ចំណាំ**: ការកសWeight នៃអ្នកដកលក្ខណៈត្រូវបានតម្រូវប្រើ ព្រោះប្រសិនបើមិនដូច្នោះ ស្រទាប់ក្លាស៊ីហ្វាយដែលមិនបានបណ្ដុះបណ្ដាលអាចបំផ្លាញWeight ពីដើមដែលត្រូវបានបណ្ដុះបណ្ដាលរួចរបស់អ្នកដកលក្ខណៈ convolutional។\n", + "> **ចំណាំ**: ការផ្អាកទម្ងន់នៃអ្នកបញ្ចេញលក្ខណៈពិសេសគឺចាំបាច់ ព្រោះបើមិនដូច្នោះស្រទាប់ចាត់ថ្នាក់ដែលមិនបានបណ្តុះអាចបំផ្លាញទម្ងន់ដើមដែលបានបណ្តុះរួចរបស់អ្នកបញ្ចេញ convolutional។\n", "\n", - "អ្នកអាចសង្កេតបានថា ខណៈដែលចំនួនប៉ារ៉ាម៉ែត្រសរុបក្នុងបណ្តាញរបស់យើងប្រហែល 15 លាន យើងកំពុងបណ្ដុះបណ្ដាលតែប៉ារ៉ាម៉ែត្រ 25k ប៉ុណ្ណោះ។ ប៉ារ៉ាម៉ែត្រដទៃទៀតនៃរន្ធរន្ធ convolutional កម្រិតលើកំពុងត្រូវបានបណ្ដុះបណ្ដាលរួច។ នេះគឺល្អ ព្រោះយើងអាចបញ្ច្រាស់បណ្ដុះបណ្ដាលលើចំនួនប៉ារ៉ាម៉ែត្រតិចជាមួយនឹងគំរូតិច។\n", + "អ្នកអាចសង្កេតឃើញថា ខណៈដែលចំនួនប៉ារ៉ាម៉ែត្រសរុបក្នុងបណ្ដាញរបស់យើងប្រហែល 15 លានយូវ ប៉ុន្តែយើងកំពុងបណ្តុះបណ្តាលតែ 25 ពាន់ប៉ារ៉ាម៉ែត្រ màtnទេ។ ប៉ារ៉ាម៉ែត្រផ្សេងទៀតទាំងអស់នៃឧបករណ៍បំលែង convolutional កំពូលត្រូវបានបណ្តុះរួចហើយ។ នេះល្អ ព្រោះយើងអាចត្រួតពិនិត្យបូកបញ្ចូលប៉ារ៉ាម៉ែត្រ ចំនួនតិចជាមួយនឹងឧទាហរណ៍ចំនួនតិច។\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": [ - "## ការធ្វើ Fine-tuning លើការផ្ទេរសិក្សា\n", + "## ការបញ្ចេញបន្ទាន់សម្រាប់ការរៀនផ្ទេរ\n", "\n", - "នៅក្នុងផ្នែកមុន យើងបានបណ្តុះបណ្តាលស្រទាប់ក្រុមចុងក្រោយដើម្បីចាត់ថ្នាក់រូបភាពក្នុងឌាតាបេសផ្ទាល់ខ្លួនរបស់យើង។ ទោះយ៉ាងណា យើងមិនបានបណ្តុះបណ្តាលឡើងវិញឧបករណ៍ដោះស្រាយលក្ខណៈទេ ហើយម៉ូដែលរបស់យើងពឹងផ្អែកលើលក្ខណៈដែលម៉ូដែលបានរៀនពីទិន្នន័យ ImageNet។ ប្រសិនបើវត្ថុរបស់អ្នកមានរូបរាងខុសពីរូបភាព ImageNet ទូទៅ ការប្រមាញ់លក្ខណៈនេះអាចមិនដំណើរការល្អបំផុតទេទេ។ ដូច្នេះការចាប់ផ្តើមបណ្តុះបណ្តាលស្រទាប់កុងវូលូស្យុងក៏មានអត្ថន័យ។\n", + "នៅក្នុងផ្នែកមុន យើងបានបណ្តុះបណ្តាលស្រទាប់ក្រុមចុងក្រោយដើម្បីចាត់ថ្នាក់រូបភាពក្នុងផ្ទាំងទិន្នន័យរបស់យើង។ ទោះយ៉ាងណា យើងមិនបានបណ្តុះបណ្តាលឡើងវិញឧបករណ៍ចាប់អត្ថបទនោះឡើយ ហើយម៉ូដែលរបស់យើងពឹងផ្អែកលើលក្ខណៈដែលម៉ូដែលបានរៀនលើទិន្នន័យ ImageNet។ ប្រសិនបើវត្ថុរបស់អ្នកមានរាងមិនដូចរូបភាព ImageNet ទូទៅ ការរួមបញ្ចូលលក្ខណៈនេះអាចមិនដំណើរការល្អបំផុតទេ។ ដូច្នេះ វាមានហេតុផលក្នុងការចាប់ផ្តើមបណ្តុះបណ្តាលស្រទាប់ convolutional ផងដែរ។\n", "\n", - "ដើម្បីធ្វើវា យើងអាចដោះសោរព៉ារ៉ាម៉ែត្រ ក្នុងតំណកុងវូលូស្យុងដែលយើងបានចុះត្រជាក់មុននេះ។\n", + "ដើម្បីធ្វើវា យើងអាចដោះបិទប៉ារ៉ាម៉ែត្រពិន្ទុចម្រាស់ convolutional ដែលយើងបានបិទរួចហើយបាន។\n", "\n", - "> **សម្គាល់៖** គឺសំខាន់ដែលអ្នកត្រូវតែបោះត្រជាក់ព៉ារ៉ាម៉ែត្រជាមុនសិន និងធ្វើបណ្តុះបណ្តាលពីរបីសិទ្ឋិ ដើម្បីស្ថេរភាពទំងន់ក្នុងស្រទាប់ចាត់ថ្នាក់។ ប្រសិនបើអ្នកចាប់ផ្តើមបណ្តុះបណ្តាលបណ្ដាញពីដើមដល់ចុងពីរព៉ារ៉ាម៉ែត្រដែលមិនត្រជាក់ ទំហំពំហួសធំៗអាចបំផ្លាញទំងន់ដែលបានបណ្តុះបណ្តាលមុននៅស្រទាប់កុងវូលូស្យុង។\n", + "> **សំគាល់៖** វាសំខាន់ដែលអ្នកត្រូវបិទប៉ារ៉ាម៉ែត្រ​មុន និងអនុវត្ត​ការបង្រៀនជាអគ្គិសនីច្រើនដើម្បីស្ថាបនាភាពថាមពលនៅក្នុងស្រទាប់ចាត់ថ្នាក់។ ប្រសិនបើអ្នកចាប់ផ្តើមបណ្តុះបណ្តាលបណ្តាញពីចុងដល់ចុងភ្លាមដោយប៉ារ៉ាម៉ែត្រដែលមិនបានបិទ អំពើខុសខាតធំបំផុតនឹងបំផ្លាញទម្ងន់ដែលបានបណ្តុះបណ្តាលជាមុននៅក្នុងស្រទាប់ convolutional។\n", "\n", - "ម៉ូដែល VGG-16 កុងវូលូស្យុងរបស់យើងស្ថិតនៅខាងក្នុងស្រទាប់ទីមួយ ហើយវាផ្ទុកស្រទាប់ជាច្រើនផ្ទាល់ខ្លួន។ យើងអាចមើលទៅលើរចនាសម្ព័ន្ធរបស់វា៖ \n" + "ម៉ូដែល convolutional VGG-16 របស់យើងស្ថិតនៅខាងក្នុងស្រទាប់ដំបូង ហើយវាមានស្រទាប់ជាច្រើនផ្ទាល់ខ្លួន។ យើងអាចមើលទៅលើរចនាសម្ព័ន្ធរបស់វាពីព្រោះ៖ \n" ] }, { @@ -945,7 +956,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "យើងអាចដោះសោរ (unfreeze) ស្រទាប់ទាំងអស់របស់មូលដ្ឋានកំណត់ចំណុច convolutional:\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" + "> **ចំណាំ៖** ការបណ្តុះបណ្តាលនេះកើតឡើងយឺតជាងមុន ចំពោះព្រោះយើងត្រូវដំណើរការវិលត្រឡប់ក្រោយ gradient តាមជាន់ជាច្រើននៃបណ្តាញ!\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** ដែលបានបង្កើតដោយ Microsoft និង **Inception** ដោយ Google។ ឧទាហរណ៍ មកជួយស្វែងយល់អំពីសំណង់នៃម៉ូដែល ResNet-50 ដែលសាមញ្ញបំផុត (ResNet គឺជាគ្រួសារម៉ូដែលមួយមានជម្រៅខុសគ្នា អ្នកអាចសាកល្បងជាមួយ ResNet-152 ប្រសិនបើអ្នកចង់មើលម៉ូដែលជម្រៅពិតមើលទៅដូចម្តេច):\n" ] }, { @@ -1441,29 +1452,29 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "ដូចដែលអ្នកអាចមើលឃើញ ម៉ូឌែលមានបន្ទះកំណត់ដូចគ្នា ដែលស្គាល់ថា៖ ស្រទាប់ convolutional, ស្រទាប់ pooling និងខ្នាតឡើងវិញ dense classifier ចុងក្រោយ។ យើងអាចប្រើម៉ូឌែលនេះបានដូចដដែលដូចពេលដែលយើងបានប្រើ VGG-16 សម្រាប់ការសិក្សាផ្ទេរ។ អ្នកអាចសាកល្បងជាមួយកូដខាងលើ ដោយប្រើម៉ូឌែល ResNet ផ្សេងៗជាមូលដ្ឋាន ហើយមើលថានិរន្តភាពបំលាស់ប្តូរ​ដូចម្តេច។\n", + "ដូចដែលអ្នកអាចឃើញ ម៉ូដែលមានគ្រាប់បង្កើតដែលស្គាល់សុំពីមុនដូចគ្នា៖ ស្រទាប់កុងវូលូស្យូនល បង្រួមស្រទាប់ និងក្រុមចុងក្រោយគឺក្រុមចំណាត់ថ្នាក់ធាតុច្រើន។ យើងអាចប្រើម៉ូដែលនេះដោយបែបដដែលជាមួយដែលយើងបានប្រើ VGG-16 សម្រាប់ការរៀនប្ដូរ។ អ្នកអាចសាកល្បងហូបចូលក្នុងកូដខាងលើ ដោយប្រើម៉ូដែល ResNet ផ្សេងៗជាមូលដ្ឋាន ហើយមើលថាតើភាពត្រឹមត្រូវផ្លាស់ប្តូរយ៉ាងដូចម្តេច។\n", "\n", - "## ការធម្មតាប្រមូលផ្ទុកជាក្រុម\n", + "## ការធម្មតាបាឡ៍នៃបន្ទះ\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ឯកសារនេះបានបំលែងដោយប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ បើទោះបីយើងខិតខំដល់ភាពត្រឹមត្រូវក៏ដោយ សូមយកចិត្តទុកដាក់ថា ការបកប្រែដោយស្វ័យប្រវត្តិអាចមានកំហុស ឬភាពមិនត្រឹមត្រូវខ្លះៗ។ ឯកសារដើមជាភាសាដើមគួរត្រូវបានគេរាប់ថាជា ប្រភពអាជ្ញាធរដ៏ត្រឹមត្រូវ។ សម្រាប់ព័ត៌មានសំខាន់ៗ សូមផ្តល់អាទិភាពការបកប្រែដោយអ្នកជំនាញមនុស្ស។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកប្រែខុសៗដែលកើតឡើងពីការប្រើប្រាស់ការបកប្រែនេះឡើយ។\n\n" + "---\n\n\n**ការបដិសេធ**:\nឯកសារនេះត្រូវបានបម្លែងភាសា ដោយប្រើសេវាបម្លែងភាសា AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ទោះយើងខ្ញុំមានក្តីប្រាថ្នាឱ្យបានច្បាស់លាស់ តែសូមយល់ដឹងថាការបម្លែងដោយស្វ័យប្រវត្តិក៏អាចមានកំហុសឬភាពមិនត្រឹមត្រូវ។ ឯកសារដើមជាភាសាទីតាំងគួរត្រូវបានគេប្រើជាប្រភពច្បាស់លាស់។ សម្រាប់ព័ត៌មានសំខាន់ៗ សូមណែនាំឱ្យប្រើប្រាស់ការប្រែដោយមនុស្សជំនាញ។ យើងខ្ញុំមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកស្រាយខុសបន្ទាប់ពីការប្រើប្រាស់ការបម្លែងនេះនោះទេ។\n\n" ] } ], diff --git a/translations/km/lessons/5-NLP/README.md b/translations/km/lessons/5-NLP/README.md index 134cacedd2..7882b1c683 100644 --- a/translations/km/lessons/5-NLP/README.md +++ b/translations/km/lessons/5-NLP/README.md @@ -1,34 +1,34 @@ -# ការគ្រប់គ្រងភាសាប្រពៃណី +# ការកែចេញភាសាធម្មជាតិ -![សង្ខេបពីភារកិច្ច NLP នៅក្នុងរូបភាពសំលៀកបំពាក់](../../../../translated_images/km/ai-nlp.b22dcb8ca4707cea.webp) +![សរុបអំពីភារកិច្ច NLP ក្នុងការគ្រាស់ឯកសារ](../../../../translated_images/km/ai-nlp.b22dcb8ca4707cea.webp) -នៅក្នុងផ្នែកនេះ យើងនឹងផ្តោតលើការប្រើប្រាស់បណ្តាញប្រព័ន្ធប្រសាទដើម្បីដោះស្រាយភារកិច្ចដែលទាក់ទងនឹង **ការគ្រប់គ្រងភាសាប្រពៃណី (NLP)**។ មានបញ្ហា NLP ជាច្រើនដែលយើងចង់ឲ្យកុំព្យូទ័រអាចដោះស្រាយបាន៖ +នៅក្នុងផ្នែកនេះ យើងនឹងផ្តោតលើការប្រើប្រាស់បណ្ដាញប្រព័ន្ធប្រតិបត្តិការជាសរសៃប្រព័ន្ធដើម្បីដោះស្រាយភារកិច្ចទាក់ទងនឹង **ការកែចេញភាសាធម្មជាតិ (NLP)**។ មានបញ្ហា 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)។ -* **ការសង្ខេបអត្ថបទ** គឺជាបច្ចេកទេសនៅពេលដែលយើងចង់ឲ្យកុំព្យូទ័រប្រាប់ "អាន" អត្ថបទវែង និងសង្ខេបវា​ក្នុងឃ្លា​ចំនួនតិច។ -* **ការបកប្រែម៉ាស៊ីន** អាចមើលថាជាការរួមបញ្ចូលរវាងការយល់ដឹងអត្ថបទក្នុងភាសាមួយ និងការបង្កើតអត្ថបទក្នុងភាសាមួយផ្សេងទៀត។ +* **កំណាត់ចំណាត់ថ្នាក់អត្ថបទ** ជាបញ្ហាកំណាត់ចំណាត់ថ្នាក់ជារឿយៗទាក់ទងទៅនឹងលំដាប់អត្ថបទ។ ឧទាហរណ៍ មានការចាត់ថ្នាក់សារអ៊ីម៉ែលជាសារស្ពាម ឬមិនមែនស្ពាម ឬចាត់ថ្នាក់អត្ថបទជា កីឡា អាជីវកម្ម នយោបាយ និងផ្សេងទៀត។ ក៏ដូចជាក្នុងការអភិវឌ្ឍប័តបច្ចេកវិទ្យាចម្លែកយើងតែងត្រូវការយល់ពីអ្វីដែលអ្នកប្រើប្រាស់ចង់និយាយ — ក្នុងករណីនេះយើងកំពុងដោះស្រាយ **ចំណាត់ថ្នាក់បំណង**។ ជាញឹកញាប់ នៅក្នុងការចាត់ថ្នាក់ទៅលើបំណងយើងត្រូវដោះស្រាយជាច្រើនប្រភេទ។ +* **វិភាគអារម្មណ៍** ជាបញ្ហាឧបសម្ព័ន្ធដែលយើងត្រូវផ្ដល់លេខមួយ (មតិយោបល់) ដែលសមមូលទៅនឹងដែលមានន័យជាកំណត់ចំពោះការសំដែងអារម្មណ៍ស្របតាមចំណុចវិជ្ជមាន ឬអវិជ្ជមាននៃប្រយោគ។ កំណែប្រសើរជាងវិភាគអារម្មណ៍គឺ **វិភាគអារម្មណ៍ផ្អែកលើមុខងារ** (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 ចាស់ៗជាច្រើនត្រូវបានអនុវត្តក្នុងបណ្ណាល័យ Python [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org)។ មានសៀវភៅ [NLTK Book](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 នៅពេលចាំបាច់។ -យើងបានរៀនពីការប្រើបណ្តាញប្រព័ន្ធប្រសាទសម្រាប់ទិន្នន័យតារាង និងរូបភាពរួចហើយ។ ផ្សេងគ្នាចម្បងរវាងទិន្នន័យទាំងនេះនឹងអត្ថបទគឺអត្ថបទគឺជាខ្សែវែងប្រែប្រួល ខណៈពេលដែលកម្រាតបញ្ចូលក្នុងរូបភាពត្រូវបានដឹងជាមុន។ ទោះបីបណ្តាញបរាជ័យអាចយករៀបចំប្លង់ពីទិន្នន័យបញ្ចូល ប្លង់ក្នុងអត្ថបទមានភាពស្មុគស្មាញជាង។ ឧ. យើងអាចមានការបដិសេធចេញពីប្រធានបទជាច្រើនពាក្យបាន​ដោយគ្រាន់តែជាការបដិសេធសម្រាប់ពាក្យជាច្រើន (ឧ. *ខ្ញុំមិនចូលចិត្តផ្លែទាំងអង់* ទៅវិញទៅមក *ខ្ញុំមិនចូលចិត្តផ្លែទាំងអាំងធំនិងពណ៌ស្រស់* ) ហើយនោះគួរតែត្រូវបានបកស្រាយថាជាប្លង់តែមួយ។ ដូច្នេះ ដើម្បីសម្របសម្រួលភាសាយើងត្រូវបញ្ចូលប្រភេទបណ្តាញប្រព័ន្ធប្រសាទថ្មីៗដូចជា *បណ្តាញត្រឡប់* និង *transfomers*។ +យើងបានរៀនរួចជាភាសាមាននៅលើការប្រើបណ្ដាញប្រព័ន្ធសម្រាប់ទិន្នន័យពុម្ព និងរូបភាព។ ខុសគ្នាចម្បងរវាងទិន្នន័យទាំងនោះនិងអត្ថបទគឺ អត្ថបទជាលំដាប់ដែលមានប្រវែងមិនទៀងទាត់ ខណៈដែលទំហំបញ្ចូលក្នុងករណីរូបភាពត្រូវបានគ្រប់គ្រងជាមុន។ ខណៈដែលបណ្ដាញអាចជ្រូកយកគំរូពីទិន្នន័យបញ្ចូល ការស្វែងរកគំរូនៅក្នុងអត្ថបទមានភាពស្មុគស្មាញជាង។ ឧទាហរណ៍ អាចមានប្រយោគបដិសេធដែលបែងចែកពីប្រធានបទដោយពាក្យជាច្រើន (ឧ. *ខ្ញុំមិនចូលចិត្តក្រូចទេ* ប្រៀបធៀបនឹង *ខ្ញុំមិនចូលចិត្តក្រូចធំៗពណ៌ស្អាតឆ្ងាញ់ទេ* ) ហើយវានឹងត្រូវបានពន្យល់ថាជាគំរូមួយ។ ដូច្នេះ ដើម្បីដោះស្រាយភាសា យើងត្រូវបានណែនាំប្រភេទបណ្ដាញប្រព័ន្ធប្រតិបត្តិការថ្មីៗ ដូចជា *បណ្ដាញជុំវិញ* និង *transformers*។ ## ដំឡើងបណ្ណាល័យ -បើអ្នកកំពុងប្រើការដំឡើង Python នៅលើកុំព្យូទ័រផ្ទាល់ខ្លួន ដើម្បីបើកអនុវត្តវគ្គនេះ អ្នកប្រហែលត្រូវតែដំឡើងបណ្ណាល័យទាំងអស់ដែលត្រូវការនៃ NLP ដោយប្រើពាក្យបញ្ជានិយមដូចខាងក្រោម៖ +ប្រសិនបើអ្នកកំពុងប្រើការតំឡើង Python មូលដ្ឋានដើម្បីរត់វគ្គនេះ អ្នកប្រហែលជាត្រូវតែដំឡើងបណ្ណាល័យទាំងអស់ដែលត្រូវការសម្រាប់ NLP ដោយប្រើពាក្យបញ្ជាទាំងនេះ៖ **សម្រាប់ PyTorch** ```bash -pip install -r requirements-torch.txt +pip install -r requirements-pytorch.txt ``` **សម្រាប់ TensorFlow** ```bash @@ -37,15 +37,15 @@ 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) -## សេចក្ដីវិភាគ GPU +## ការព្រមាន GPU -នៅក្នុងផ្នែកនេះ នៅខ្លះខ្លះនៃឧទាហរណ៍យើងនឹងហាត់គំរូដែលមានទំហំធំជាងមុន។ -* **ប្រើកុំព្យូទ័រដែលមាន GPU**៖ ជាការណែនាំឲ្យបើកកំណត់ត្រារបស់អ្នកលើកុំព្យូទ័រដែលមាន GPU ដើម្បីកាត់បន្ថយពេលរង់ចាំពេលធ្វើការជាមួយគំរូទំហំធំ។ -* **កំណត់ជំហរចងចំណង GPU**៖ ការប្រើ GPU អាចនាំឲ្យមានស្ថានភាពដែលអង្គចងចំណង GPU គាត់ប្រេងដាច់ពេលហាត់គំរូធំៗ។ -* **ការប្រើប្រាស់អង្គចងចំណង GPU**៖ បរិមាណអង្គចងចំណង GPU ប្រើពេលហាត់គំរូអាស្រ័យលើប៉ារ៉ាម៉ែត្រ ផ្សេងៗ រួមមានទំហំជំពូកតូច (minibatch)។ -* **កាត់បន្ថយទំហំជំពូកតូច**៖ ប្រសិនបើអ្នកប្រឈមមុខបញ្ហាអង្គចងចំណង GPU អ្នកអាចពិចារណាកាត់បន្ថយទំហំជំពូកតូចនៅក្នុងកូដរបស់អ្នកជាជម្រើសមួយ។ -* **ការដោះស្រាយបញ្ហាអង្គចងចំណង GPU ក្នុង TensorFlow**៖ កំណែចាស់ៗនៃ TensorFlow អាចមិនបញ្ឈប់ការប្រើប្រាស់អង្គចងចំណង GPU យ៉ាងត្រឹមត្រូវ នៅពេលហាត់គំរូច្រើនក្នុងកឺណែល Python មួយ។ ដើម្បីគ្រប់គ្រងការប្រើប្រាស់អង្គចងចំណង GPU ជាដំណោះស្រាយ អ្នកអាចកំណត់ TensorFlow ឲ្យបន្ថែមអង្គចងចំណង GPU ពេញតែត្រូវការតែប៉ុណ្ណោះ។ -* **ការបញ្ចូលកូដ**៖ ដើម្បីកំណត់ឲ្យ TensorFlow កំណត់បន្ថែមអង្គចងចំណង GPU លើកដំបូងតែពេលគាំទ្រ អ្នកអាចបញ្ចូលកូដខាងក្រោមក្នុងកំណត់ត្រារបស់អ្នក៖ +នៅក្នុងផ្នែកនេះ នៅក្នុងឧទាហរណ៍ខ្លះៗ យើងនឹងបណ្តុះបណ្តាលគំរូដែលមានទំហំធំប៉ុន្មាន។ +* **ប្រើកុំព្យូទ័រមាន GPU**៖ គួរឱ្យរត់កំណត់ត្រារបស់អ្នកលើកុំព្យូទ័រដែលមាន GPU ដើម្បីកាត់បន្ថយពេលរងចាំពេលធ្វើការជាមួយគំរូធំៗ។ +* **កំហិតអង្គចងចាំ GPU**៖ ការរត់លើ GPU អាចនាំឲ្យមានករណីអ្នកប្រើអង្គចងចាំ GPU មិនគ្រប់គ្រាន់ ពិសេសពេលបណ្តុះគំរូធំ។ +* **ការប្រើប្រាស់អង្គចងចាំ GPU**៖ បរិមាណអង្គចងចាំ GPU ដែលបានប្រើពេលបណ្តុះគំរូអាស្រ័យលើកត្តាច្រើន រួមមានទំហំខ្មៅ។ +* **បន្ថយទំហំខ្មៅ**៖ ប្រសិនបើអ្នកប្រឈមមុខនឹងបញ្ហាអង្គចងចាំ GPU សូមពិចារណាកាត់បន្ថយទំហំខ្មៅក្នុងកូដរបស់អ្នកជាជម្រើស។ +* **ការចេញវិញអង្គចងចាំ GPU នៅ TensorFlow**៖ ភាពចាស់របស់ TensorFlow អាចមិនចេញអង្គចងចាំ GPU ត្រឹមត្រូវពេលបណ្តុះគំរូជាច្រើនក្នុងធុង Python តែមួយ។ ដើម្បីគ្រប់គ្រងការប្រើប្រាស់អង្គចងចាំ GPU បានប្រសើរជាងមុន អ្នកអាចកំណត់ TensorFlow ឲ្យបែងចែកអង្គចងចាំ GPU តាមត្រូវតែប្រើ។ +* **បញ្ចូលកូដ**៖ ដើម្បីកំណត់ TensorFlow ឲ្យបង្កើនការបែងចែកអង្គចងចាំ GPU តែពេលដែលត្រូវការ សូមបញ្ចូលកូដខាងក្រោមក្នុងកំណត់ត្រារបស់អ្នក៖ ```python physical_devices = tf.config.list_physical_devices('GPU') @@ -53,21 +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 ពីទស្សនៈ ML ដั้งដើម សូមចូលទៅកាន់ [ឈុតមេរៀននេះ](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP) ## នៅក្នុងផ្នែកនេះ -នៅក្នុងផ្នែកនេះ យើងនឹងរៀនអំពី៖ +នៅក្នុងផ្នែកនេះ យើងនឹងរៀនពី៖ -* [តំណាងអត្ថបទជាទិន្នន័យ tensor](13-TextRep/README.md) -* [ការដាក់ពាក្យជាតំណ](14-Emdeddings/README.md) -* [ម៉ូដែលភាសា](15-LanguageModeling/README.md) -* [បណ្តាញប្រព័ន្ធប្រសាទត្រឡប់](16-RNN/README.md) -* [បណ្តាញបង្កើត](17-GenerativeNetworks/README.md) +* [កំណត់តំណាងអត្ថបទជាតង់ស័រ](13-TextRep/README.md) +* [ការបញ្ចូលពាក្យ](14-Emdeddings/README.md) +* [ការម៉ូដែលភាសា](15-LanguageModeling/README.md) +* [បណ្ដាញអាចប្រើឡើងវិញ](16-RNN/README.md) +* [បណ្ដាញបង្កើត](17-GenerativeNetworks/README.md) * [Transformers](18-Transformers/README.md) --- -**ការបដិសេធ**៖ -ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ រួមទាំងយើងខិតខំប្រឹងប្រែងដើម្បីភាពត្រឹមត្រូវ ក៏សូមយល់ដឹងថាការបកប្រែដោយស្វ័យប្រវត្តិអាចមានកំហុសឬភាពមិនត្រឹមត្រូវ។ ឯកសារដើមជាភាសាដើមគួរត្រូវបានយកជាធនាគារដែលមានសិទ្ធិ។ សម្រាប់ព័ត៌មានសំខាន់ ការបកប្រែដោយអ្នកជំនាញជាថ្នាក់មនុស្សត្រូវបានណែនាំ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំឬការបកប្រែខុសពីការប្រើប្រាស់ការបកប្រែនេះឡើយ។ +**ការបដិសេធ**: +ឯកសារនេះត្រូវបានបម្លែងភាសា ដោយប្រើសេវាបម្លែងភាសា AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ទោះយើងខ្ញុំមានក្តីប្រាថ្នាឱ្យបានច្បាស់លាស់ តែសូមយល់ដឹងថាការបម្លែងដោយស្វ័យប្រវត្តិក៏អាចមានកំហុសឬភាពមិនត្រឹមត្រូវ។ ឯកសារដើមជាភាសាទីតាំងគួរត្រូវបានគេប្រើជាប្រភពច្បាស់លាស់។ សម្រាប់ព័ត៌មានសំខាន់ៗ សូមណែនាំឱ្យប្រើប្រាស់ការប្រែដោយមនុស្សជំនាញ។ យើងខ្ញុំមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកស្រាយខុសបន្ទាប់ពីការប្រើប្រាស់ការបម្លែងនេះនោះទេ។ \ No newline at end of file diff --git a/translations/kn/.co-op-translator.json b/translations/kn/.co-op-translator.json index 0043256a29..ac3354b3a9 100644 --- a/translations/kn/.co-op-translator.json +++ b/translations/kn/.co-op-translator.json @@ -5,6 +5,12 @@ "source_file": "AGENTS.md", "language_code": "kn" }, + "CONTRIBUTING.md": { + "original_hash": "c6fd7e781b67111a90abd166d0ce4aa0", + "translation_date": "2026-07-08T20:51:23+00:00", + "source_file": "CONTRIBUTING.md", + "language_code": "kn" + }, "README.md": { "original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b", "translation_date": "2026-04-06T16:56:31+00:00", @@ -17,6 +23,19 @@ "source_file": "SECURITY.md", "language_code": "kn" }, + "__translation_failures__": { + "lessons/sketchnotes/LICENSE.md": { + "original_hash": "45ab63a2cd8f5faef6c9b150618837a4", + "source_file": "lessons/sketchnotes/LICENSE.md", + "language_code": "kn", + "failure_date": "2026-07-08T20:43:18+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-11-25T20:22:49+00:00", @@ -54,8 +73,8 @@ "language_code": "kn" }, "examples/README.md": { - "original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7", - "translation_date": "2025-11-25T20:35:16+00:00", + "original_hash": "7883d52c2e2a221e0b07a7b112a149b9", + "translation_date": "2026-07-08T20:34:31+00:00", "source_file": "examples/README.md", "language_code": "kn" }, @@ -66,8 +85,8 @@ "language_code": "kn" }, "lessons/0-course-setup/how-to-run.md": { - "original_hash": "a4717bd9103b9f6cd84d534b83534689", - "translation_date": "2026-01-17T02:19:30+00:00", + "original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1", + "translation_date": "2026-07-08T20:34:56+00:00", "source_file": "lessons/0-course-setup/how-to-run.md", "language_code": "kn" }, @@ -191,6 +210,12 @@ "source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md", "language_code": "kn" }, + "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": { + "original_hash": "99b816b6a4957ef4100cee4c4221dff9", + "translation_date": "2026-07-08T20:24:51+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", + "language_code": "kn" + }, "lessons/4-ComputerVision/08-TransferLearning/lab/README.md": { "original_hash": "7765935c35fcee69b9fe2d0cfd6963e2", "translation_date": "2025-11-25T22:44:23+00:00", @@ -330,8 +355,8 @@ "language_code": "kn" }, "lessons/5-NLP/README.md": { - "original_hash": "8ef02a9318257ea140ed3ed74442096d", - "translation_date": "2025-11-25T21:16:26+00:00", + "original_hash": "038df6f1a73e49f6430740da083bfd6d", + "translation_date": "2026-07-08T20:35:26+00:00", "source_file": "lessons/5-NLP/README.md", "language_code": "kn" }, diff --git a/translations/kn/CONTRIBUTING.md b/translations/kn/CONTRIBUTING.md new file mode 100644 index 0000000000..fe791b8c5a --- /dev/null +++ b/translations/kn/CONTRIBUTING.md @@ -0,0 +1,29 @@ +# AI-For-Beginners ಗೆ ಸಹಕಾರ ನೀಡುವುದು + +AI-For-Beginners ಗೆ ಸಹಕಾರ ನೀಡಲು ನಿಮ್ಮ ಆಸಕ್ತಿಗೆ ಧನ್ಯವಾದಗಳು! ನಾವು ಭಾಷಾಂತರಗಳು, ಪಾಠದ ದೋಷಗಳ ಸರಿಪಡಣೆಗಳು ಮತ್ತು ಸ್ವರೂಪಣಾ ಸರಿಪಡಣೆಗಳನ್ನು ಸ್ವಾಗತಿಸುತ್ತೇವೆ. + +## ಮೈಕ್ರೋಸಾಫ್ಟ್ ಸಹಾಯಕರ ಪರವಾನಗಿ ಒಪ್ಪಂದ (CLA) + +ಈ ಯೋಜನೆ ಸಹಕಾರಗಳು ಮತ್ತು ಶಿಫಾರಸುಗಳನ್ನು ಸ್ವಾಗತಿಸುತ್ತದೆ. ಬಹುಶಃ ಸಹಕಾರಗಳು Contributor License Agreement (CLA) ಗೆ ಒಪ್ಪಿಗೆಯಾಗಿರಬೇಕು, ಇದು ನೀವು ನಿಮ್ಮ ವಹಿವಾಟನ್ನು ಬಳಸಲು ಹಕ್ಕು ಹೊಂದಿದ್ದೀರಿ ಮತ್ತು ನಿಜವಾಗಿಯೂ ಹಕ್ಕುಗಳನ್ನು ನೀಡುತ್ತಿದ್ದೀರಂತೆ ಘೋಷಿಸುತ್ತದೆ. ವಿವರಗಳಿಗೆ, ಭೇಟಿ ನೀಡಿ [https://cla.microsoft.com](https://cla.microsoft.com). + +ನೀವು ಒಂದು ಪುಲ್ ವಿನಂತಿ ಸಲ್ಲಿಸುವಾಗ, CLA-ಬಾಟ್ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಅದು ನಿಮಗೆ CLA ಒದಗಿಸುವ ಅಗತ್ಯವಿದೆಯೇ ಎಂದು ನಿರ್ಧರಿಸಿ ಪ್ರ(PR) ಯನ್ನು ತಕ್ಕ labels ಮತ್ತು ಟಿಪ್ಪಣಿಗಳನ್ನು ಸೇರಿಸುತ್ತದೆ. ಬಾಟ್ ನೀಡುವ ಸೂಚನೆಗಳನ್ನು ಅನುಸರಿಸಿ. ನಮ್ಮ CLA ಬಳಸಿ ಎಲ್ಲ ರೆಪೊಸಿಟರಿಗಳಲ್ಲಿ ನೀವು ಇದನ್ನು ಒಂದೇ ಬಾರಿ ಮಾಡಬೇಕಾಗುತ್ತದೆ. + +## ಸಹಕಾರ ಹೇಗೆ ನೀಡಬೇಕು + +### 1. ಟೈಪೋಗಳು / ಕೋಡ್ ದೋಷಗಳನ್ನು ಸರಿಪಡಿಸುವುದು +ನೀವು ಯಾವುದೇ Jupyter ನೋಟ್ಬುಕ್ ಅಥವಾ ಪಾಠದ(markdown) ಕಡೆಯಲ್ಲಿ ಟೈಪೋ ಅಥವಾ ದೋಷ ಕಂಡುಹಿಡಿದರೆ: +1. ರೆಪೊಸಿಟರಿ fork ಮಾಡಿ. +2. ಟೈಪೋ ಅಥವಾ ದೋಷದ ಲಿಂಕ್ ಸರಿಪಡಿಸಿ. +3. ಸ್ಪಷ್ಟ ವಿವರಣೆ ಹೊಂದಿದ ಪುಲ್ ವಿನಂತಿಯನ್ನು ಸಲ್ಲಿಸಿ. + +### 2. ಭಾಷಾಂತರಗಳನ್ನು ಸಲ್ಲಿಸುವುದು +ನಾವು ಪಾಠಗಳನ್ನು ಬೇರೆ ಭಾಷೆಗಳಿಗೆ ಭಾಷಾಂತರಗಳನ್ನು ಸ್ವಾಗತಿಸುತ್ತೇವೆ! ದಯವಿಟ್ಟು ಭಾಷಾಂತರಗಳನ್ನು `translations/` ಡೈರೆಕ್ಟರಿಯಡಿಯಲ್ಲಿ ಇಡಿರಿ, ಅಲ್ಲಿ ಇದೆ ಇದ್ದ ಫೋಲ್ಡರ್ ಹೆಸರುಗಳನ್ನು ಬಳಸಿ (ಉದಾಹರಣೆಗೆ `translations/es/`, `translations/pt-BR/`, `translations/zh-CN/`). + +ಹೆಚ್ಚಿನ ವಿವರಗಳಿಗೆ, ನೋಡಿ [etc/CONTRIBUTING.md](etc/CONTRIBUTING.md). + +--- + + +**ಅಸ್ವೀಕಾರ**: +ಈ ದಸ್ತಾವೇಜು AI ಅನುವಾದ ಸೇವೆ [Co-op Translator](https://github.com/Azure/co-op-translator) ಬಳಸಿ ಅನುವಾದಿಸಲಾಗಿದೆ. ನಾವು ನಿಖರತೆಯನ್ನು ಸಾಧಿಸಲು ಪ್ರಯತ್ನಿಸುತ್ತಿದ್ದರೂ, ದಯವಿಟ್ಟು ಗಮನಿಸಿ, ಸ್ವಯಂಚಾಲಿತ ಅನುವಾದಗಳಲ್ಲಿ ದೋಷಗಳು ಅಥವಾ ಅಸಡ್ಡೆಗಳು ಇರಬಹುದು. ಮೂಲ ಭಾಷೆಯಲ್ಲಿರುವ ಮೂಲ ದಸ್ತಾವೇಜು ಪ್ರಾಮಾಣಿಕ ಮೂಲವೆಂದು ಪರಿಗಣಿಸಬೇಕು. ಪ್ರಮುಖ ಮಾಹಿತಿಗಾಗಿ, ವೃತ್ತಿಪರ ಮಾನವ ಅನುವಾದವನ್ನು ಶಿಫಾರಸು ಮಾಡಲಾಗುತ್ತದೆ. ಈ ಅನುವಾದವನ್ನು ಬಳಸುವ ಮೂಲಕ ಉಂಟಾಗುವ ಯಾವುದೇ ತಪ್ಪು ಅರ್ಥಗಳ ಅಥವಾ ತಪ್ಪು ವ್ಯಾಖ್ಯಾನಗಳ ಬಗ್ಗೆ ನಾವು ಹೊಣೆಗಾರರಲ್ಲ. + \ No newline at end of file diff --git a/translations/kn/examples/README.md b/translations/kn/examples/README.md index 3791013943..9ee737a31a 100644 --- a/translations/kn/examples/README.md +++ b/translations/kn/examples/README.md @@ -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 -# ಪೈಥಾನ್ ಸ್ಕ್ರಿಪ್ಟ್‌ಗಳಿಗೆ +# ಪೈಥಾನ್ ಲಿಪಿಗಳಿಗೆ pip install numpy -# ಜುಪೈಟರ್ ನೋಟ್ಬುಕ್‌ಗಳಿಗೆ (ಚಿತ್ರ ವರ್ಗೀಕರಣೆ) +# ಜುಪಿಟರ್ ನೋಟ್‌ಬುಕ್‌ಗಳಿಗೆ (ಚಿತ್ರ ವರ್ಗೀಕರಣೆ) pip install jupyter numpy pillow tensorflow ``` -ಅಥವಾ ಮುಖ್ಯ ಪಠ್ಯಕ್ರಮದಿಂದ conda ಪರಿಸರವನ್ನು ಬಳಸಿ: +ಅಥವಾ ಮುಖ್ಯ ಪಾಠಕ್ರಮದಿಂದ conda ಪರಿಸರವನ್ನು ಉಪಯೋಗಿಸಿ: ```bash conda env create --name ai4beg --file ../environment.yml @@ -34,54 +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. **ಸರಳ ನೂರಲ್ ನೆಟ್‌ವರ್ಕ್ ನirmaಣ ಮಾಡಿ** - ನೂರಲ್ ನೆಟ್‌ವರ್ಕ್‌ಗಳು ಹೇಗೆ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತವೆ ಅರ್ಥಮಾಡಿಕೊಳ್ಳಿ +3. **ಚಿತ್ರ ವರ್ಗೀಕರಣೆ ಪ್ರಯತ್ನಿಸಿ** - ನಿಜವಾದ ಚಿತ್ರಗಳೊಂದಿಗೆ AI ಅನ್ನು ನೋಡಿ +4. **ಪಠ್ಯ ಭಾವನೆ ವಿಶ್ಲೇಷಿಸಿ** - ನೈಸರ್ಗಿಕ ಭಾಷಾ ಪ್ರಕ್ರಿಯೆಯನ್ನು ಅನ್ವೇಷಿಸಿ ## 💡 ಆರಂಭಿಕರಿಗಾಗಿ ಸಲಹೆಗಳು -- **ಕೋಡ್ ಕಾಮೆಂಟ್‌ಗಳನ್ನು ಗಮನದಿಂದ ಓದಿ** - ಪ್ರತಿಯೊಂದು ಸಾಲು ಏನು ಮಾಡುತ್ತದೆ ಎಂದು ವಿವರಿಸುತ್ತದೆ -- **ಪ್ರಯೋಗ ಮಾಡಿ!** - ಮೌಲ್ಯಗಳನ್ನು ಬದಲಾಯಿಸಿ ಮತ್ತು ಪರಿಣಾಮವನ್ನು ನೋಡಿ -- **ಎಲ್ಲವನ್ನೂ ತಕ್ಷಣ ಅರ್ಥಮಾಡಿಕೊಳ್ಳಲು ಚಿಂತೆ ಮಾಡಬೇಡಿ** - ಕಲಿಕೆ ಸಮಯ ತೆಗೆದುಕೊಳ್ಳುತ್ತದೆ -- **ಪ್ರಶ್ನೆಗಳನ್ನು ಕೇಳಿ** - [ಚರ್ಚಾ ಫಲಕ](https://github.com/microsoft/AI-For-Beginners/discussions) ಬಳಸಿ +- **ಕೋಡ್ ಟಿಪ್ಪಣಿಗಳನ್ನು ಮನಃಪೂರ್ವಕವಾಗಿ ಓದಿ** - ಪ್ರತಿಯೊಂದು ಸಾಲಿನಲ್ಲಿ ಏನು ಮಾಡುವುದೆಂದು ವಿವರಿಸಲಾಗಿದೆ +- **ಪ್ರಯೋಗ ಮಾಡಿ!** - ಮೌಲ್ಯಗಳನ್ನು ಬದಲಿಸಿ ಮತ್ತು ಪರಿಣಾಮವನ್ನು ನೋಡಿ +- **ಎಲ್ಲವನ್ನೂ ಅರ್ಥಮಾಡಿಕೊಳ್ಳಲು ಒತ್ತಡಪಡಿಸಿಕೊಳ್ಳಬೇಡಿ** - ಕಲಿಕೆ ಸಮಯ ತೆಗೆದುಕೊಳ್ಳುತ್ತದೆ +- **ಪ್ರಶ್ನೆ ಕೇಳಿರಿ** - [ಚರ್ಚಾ ಫಲಕವನ್ನು](https://github.com/microsoft/AI-For-Beginners/discussions) ಬಳಸಿರಿ -## 🔗 ಮುಂದಿನ ಹಂತಗಳು +## 🔗 ಮುಂದಿನ ಹೆಜ್ಜೆಗಳು -ಈ ಉದಾಹರಣೆಗಳನ್ನು ಪೂರ್ಣಗೊಳಿಸಿದ ನಂತರ, ಸಂಪೂರ್ಣ ಪಠ್ಯಕ್ರಮವನ್ನು ಅನ್ವೇಷಿಸಿ: +ಈ ಉದಾಹರಣೆಗಳನ್ನು ಪೂರ್ಣಗೊಳಿಸಿದ ನಂತರ, ಸಂಪೂರ್ಣ ಪಾಠಕ್ರಮವನ್ನು ಅನ್ವೇಷಿಸಿ: - [AI ಪರಿಚಯ](../lessons/1-Intro/README.md) -- [ನ್ಯೂರಲ್ ನೆಟ್‌ವರ್ಕ್‌ಗಳು](../lessons/3-NeuralNetworks/README.md) -- [ಕಂಪ್ಯೂಟರ್ ದೃಷ್ಟಿ](../lessons/4-ComputerVision/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) ಬಳಸಿ ಅನುವಾದಿಸಲಾಗಿದೆ. ನಾವು ನಿಖರತೆಯಿಗಾಗಿ ಪ್ರಯತ್ನಿಸುತ್ತಿದ್ದರೂ, ಸ್ವಯಂಚಾಲಿತ ಅನುವಾದಗಳಲ್ಲಿ ದೋಷಗಳು ಅಥವಾ ಅಸತ್ಯತೆಗಳು ಇರಬಹುದು ಎಂದು ದಯವಿಟ್ಟು ಗಮನಿಸಿ. ಮೂಲ ಭಾಷೆಯಲ್ಲಿರುವ ಮೂಲ ದಸ್ತಾವೇಜನ್ನು ಅಧಿಕೃತ ಮೂಲವಾಗಿ ಪರಿಗಣಿಸಬೇಕು. ಮಹತ್ವದ ಮಾಹಿತಿಗಾಗಿ, ವೃತ್ತಿಪರ ಮಾನವ ಅನುವಾದವನ್ನು ಶಿಫಾರಸು ಮಾಡಲಾಗುತ್ತದೆ. ಈ ಅನುವಾದ ಬಳಕೆಯಿಂದ ಉಂಟಾಗುವ ಯಾವುದೇ ತಪ್ಪು ಅರ್ಥಮಾಡಿಕೊಳ್ಳುವಿಕೆ ಅಥವಾ ತಪ್ಪು ವಿವರಣೆಗಳಿಗೆ ನಾವು ಹೊಣೆಗಾರರಾಗುವುದಿಲ್ಲ. +**ಅಸ್ವೀಕಾರ**: +ಈ ದಸ್ತಾವೇಜು AI ಅನುವಾದ ಸೇವೆ [Co-op Translator](https://github.com/Azure/co-op-translator) ಬಳಸಿ ಅನುವಾದಿಸಲಾಗಿದೆ. ನಾವು ನಿಖರತೆಯನ್ನು ಸಾಧಿಸಲು ಪ್ರಯತ್ನಿಸುತ್ತಿದ್ದರೂ, ದಯವಿಟ್ಟು ಗಮನಿಸಿ, ಸ್ವಯಂಚಾಲಿತ ಅನುವಾದಗಳಲ್ಲಿ ದೋಷಗಳು ಅಥವಾ ಅಸಡ್ಡೆಗಳು ಇರಬಹುದು. ಮೂಲ ಭಾಷೆಯಲ್ಲಿರುವ ಮೂಲ ದಸ್ತಾವೇಜು ಪ್ರಾಮಾಣಿಕ ಮೂಲವೆಂದು ಪರಿಗಣಿಸಬೇಕು. ಪ್ರಮುಖ ಮಾಹಿತಿಗಾಗಿ, ವೃತ್ತಿಪರ ಮಾನವ ಅನುವಾದವನ್ನು ಶಿಫಾರಸು ಮಾಡಲಾಗುತ್ತದೆ. ಈ ಅನುವಾದವನ್ನು ಬಳಸುವ ಮೂಲಕ ಉಂಟಾಗುವ ಯಾವುದೇ ತಪ್ಪು ಅರ್ಥಗಳ ಅಥವಾ ತಪ್ಪು ವ್ಯಾಖ್ಯಾನಗಳ ಬಗ್ಗೆ ನಾವು ಹೊಣೆಗಾರರಲ್ಲ. \ No newline at end of file diff --git a/translations/kn/lessons/0-course-setup/how-to-run.md b/translations/kn/lessons/0-course-setup/how-to-run.md index 5a1abb3e41..5a0098328e 100644 --- a/translations/kn/lessons/0-course-setup/how-to-run.md +++ b/translations/kn/lessons/0-course-setup/how-to-run.md @@ -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 ವಿಸ್ತರಣೆ](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 ಪರಿಸರವನ್ನು కూడా ಬಳಸಬಹುದು. ಕ್ಲಾಸಿಕಲ್ Jupyter ಮತ್ತು JupyterHub ಎರಡೂ ಸ್ವಯಂ-ಪೂರ್ಣಗೊಳಿಸುವಿಕೆ, ಕೋಡ್ ಹೈಲೈಟಿಂಗ್ ಮುಂತಾದ ವೈಶಿಷ್ಟ್ಯಗಳೊಂದಿಗೆ ಸುಲಭ ಅಭಿವೃದ್ಧಿ ಪರಿಸರವನ್ನು ಒದಗಿಸುತ್ತವೆ. +ನೀವು ನಿಮ್ಮದೇ ಕಂಪ್ಯೂಟರ್‌ನ ಬ್ರೌಸರ್‌ನಲ್ಲಿ Jupyter ಪರಿಸರವನ್ನು ಸಹ ಬಳಸಬಹುದು. ಕ್ಲಾಸಿಕಲ್ Jupyter ಮತ್ತು JupyterHub ಎರಡೂ ಸ್ವಯಂಚಾಲಿತ ಪೂರ್ಣಗೊಂಡಿಕೆ, ಕೋಡ್ ಹೈಲೈಟಿಂಗ್ ಮತ್ತು ಇತರ ಸುಲಭತೆಗಳೊಂದಿಗೆ ಅನುಕೂಲಕರ ಅಭಿವೃದ್ಧಿ ಪರಿಸರವನ್ನು ಒದಗಿಸುತ್ತವೆ. -ಸ್ಥಳೀಯವಾಗಿ Jupyter ಪ್ರಾರಂಭಿಸಲು, ಕೋರ್ಸ್ ಡೈರೆಕ್ಟರಿಗೆ ಹೋಗಿ, ಈ ಕೆಳಗಿನ ಆಜ್ಞೆಯನ್ನು ಚಾಲನೆಮಾಡಿ: +Jupyter ಅನ್ನು ಸ್ಥಳೀಯವಾಗಿ ಪ್ರಾರಂಭಿಸಲು, ಕೋರ್ಸ್ ಡೈರೆಕ್ಟರಿಗೆ ಹೋಗಿ ಮತ್ತು ನಡಿಸಿ: ```bash jupyter notebook ``` -ಅಥವಾ + ಅಥವಾ ```bash jupyterhub ``` -ನಂತರ ನೀವು ಯಾವುದೇ `.ipynb` ಫೈಲ್‌ಗಳಿಗೆ ಪರಿಗಣನೆ ಮಾಡಿ, ಅವುಗಳನ್ನು ತೆರೆಯಬಹುದು ಮತ್ತು ಕೆಲಸ ಪ್ರಾರಂಭಿಸಬಹುದು. + ನಂತರ ನೀವು ಯಾವುದೇ `.ipynb` ಫೈಲ್‌ಗಳಿಗೆ ತೆರಳಿ, ಅವುಗಳನ್ನು ತೆರೆಯಬಹುದು ಮತ್ತು ಕಾರ್ಯನಿರ್ವಹಣೆ ಪ್ರಾರಂಭಿಸಬಹುದು. -### ಕಂಟೇನರ್‌ನಲ್ಲಿ ಚಾಲನೆ +### ಕಂಟೇನರ್‌ನಲ್ಲಿ ನಡಿಸುವುದು -Python ಇನ್‌ಸ್ಟಾಲೇಶನ್‌ಗೆ ಒಂದು ಪರ್ಯಾಯವಾಗಿ, ಕೋಡ್ ಅನ್ನು ಕಂಟೇನರ್‌ನಲ್ಲಿ ಚಾಲನೆ ಮಾಡಬಹುದು. ನಮ್ಮ ಡಿಪೊ ಒಂದು ವಿಶೇಷ `.devcontainer` ಫೋಲ್ಡರ್ ಅನ್ನು ಒದಗಿಸುತ್ತದೆ, ಇದರಲ್ಲಿ ಈ ರೆಪೊಗೆ ಕುರಿತ ಕಂಟೇನರ್‌ನ ನಿರ್ಮಾಣ ನಿರ್ದೇಶನವಿದೆ; VS Code ಕೋಡ್ ಅನ್ನು ಕಂಟೇನರ್‌ನಲ್ಲಿ ಮರುತೆರೆದುಕೊಳ್ಳುವ ಅವಕಾಶವನ್ನು ನೀಡುತ್ತದೆ. ಇದಕ್ಕೆ Docker ಇನ್‌ಸ್ಟಾಲೇಶನ್ ಅಗತ್ಯವಿದ್ದು, ಸ್ವಲ್ಪ ಗართულವಾಗಿರಬಹುದಾದ್ದರಿಂದ ಅನುಭವಿಸಿದ ಬಳಕೆದಾರರಿಗೆ ಇದನ್ನು ಶಿಫಾರಸು ಮಾಡುತ್ತೇವೆ. +Python ಸ್ಥಾಪನೆಯ ಪರ್ಯಾಯವಾಗಿ, ನೀವು ಕೋಡ್ ಅನ್ನು ಒಂದು ಕಂಟೇನರ್‌ನಲ್ಲಿ ನಡಿಸಬಹುದು. ನಮ್ಮ ಥಳಿ ಒಂದು ವಿಶೇಷ `.devcontainer` ಫೋಲ್ಡರ್ ಅನ್ನು ಒದಗಿಸುತ್ತದೆ, ಇದು ಈ ರೆಪೋಗೆ ಕಂಟೇನರ್ ಅನ್ನು ಹೇಗೆ ನಿರ್ಮಿಸುವುದು ಎಂಬುದನ್ನು ಸೂಚಿಸುತ್ತದೆ, ಮತ್ತು VS Code ನಿಂದ ಕೋಡ್ ಅನ್ನು ಕಂಟೇನರ್‌ನಲ್ಲಿ ಮರುತೆರೆೆಯಲು ಅವಕಾಶವನ್ನು ನೀಡುತ್ತದೆ. ಇದಕ್ಕೆ Docker ಸ್ಥಾಪನೆ ಅಗತ್ಯವಿದ್ದು, ಮತ್ತಷ್ಟು ಸಂಕೀರ್ಣವಾಗಿರುತ್ತದೆ. ಆದ್ದರಿಂದ, ಇದರ ಬಳಕೆ ಅನುಭವ ಹೊಂದಿರುವ ಬಳಕೆದಾರರಿಗೆ ಮಾತ್ರ ಶಿಫಾರಸು ಮಾಡಲಾಗಿದೆ. -## ಮೇಘದಲ್ಲಿ (Cloud) ಚಾಲನೆ +## ಕ್ಲೌಡ್‌ನಲ್ಲಿ ನಡಿಸುವುದು -Python ಅನ್ನು ಸ್ಥಳೀಯವಾಗಿ ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಿಕೊಳ್ಳಲು ಇಚ್ಛೆ ಇಲ್ಲದಿದ್ದರೆ ಮತ್ತು ನೀವು ಕೆಲವು ಮೇಘ ಸಂಪನ್ಮೂಲಗಳ ಪ್ರವೇಶ ಹೊಂದಿದ್ದರೆ, ಕೋಡ್ ಅನ್ನು ಮೇಘದಲ್ಲಿ ಚಾಲನೆ ಮಾಡುವುದು ಉತ್ತಮ ಪರ್ಯಾಯವಾಗಿದೆ. ನೀವು ಇದನ್ನು ಮಾಡುವ ಹಲವು ಮಾರ್ಗಗಳಿವೆ: +ನೀವು 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 Web接口。 +* **[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 ನಲ್ಲಿನ ಕೆಲವು ಕೋಡ್ ಪರೀಕ್ಷಿಸಲು ಮಂದಿಗೆ ಅರ್ಪಿಸುವ ಮುಕ್ತ ಕ್ಲೌಡ್ ಗಣನೆಯ ಸಂಪನ್ಮೂಲಗಳನ್ನು ಒದಗಿಸುತ್ತದೆ. ಮುಂಭಾಗದ ಪುಟದಲ್ಲಿ ರೆಪೊನ್ನು ಬಿಂಡರ್‌ನಲ್ಲಿ ತೆರೆಸಲು ಒಂದು ಬಟ್ಟನಿದೆ — ಇದು ನಿಮಗೆ ವೇಗವಾಗಿ ಬಿಂಡರ್ ಸೈಟ್‌ಕ್ಕೆ ತಂದು ಕೊಡುವುದು, ಅದು ಒಂದು ಕಂಟೇನರ್ ನಿರ್ಮಿಸಿ ಸ್ವಯಂಚಾಲಿತ Jupyter ವೆಬ್ ಇಂಟರ್ಫೇಸನ್ನು ಪ್ರಾರಂಭಿಸುವುದರಿಂದ. -> **ಸೂಚನೆ**: ಅವ್ಯವಸ್ಥೆ ತಡೆಯಲು, Binder ಕೆಲವು ವೆಬ್ ಸಂಪನ್ಮೂಲಗಳಿಗೆ ಪ್ರವೇಶವನ್ನು ಬ್ಲಾಕ್ ಮಾಡುತ್ತದೆ. ಇದರಿಂದ ಸಾರ್ವಜನಿಕ ಇಂಟರ್ನೆಟ್‌ನಿಂದ ಮಾದರಿಗಳು ಅಥವಾ ಡೇಟಾಸೆಟ್‌ಗಳನ್ನು ಪಡೆಯುವ ಕೆಲ ಕೋಡ್ ಕಾರ್ಯನಿರ್ವಹಿಸದು. ನೀವು ಕೆಲವು ಪರ್ಯಾಯಗಳನ್ನು ಕಂಡುಹಿಡಿಯಬೇಕಾಗಬಹುದು. ಜೊತೆಗೆ, Binder ನೀಡುವ ಗಣನಾ ಸಂಪನ್ಮೂಲಗಳು ಸರಳವಾಗಿವೆ, ಆದ್ದರಿಂದ ತರಬೇತಿಗು ಪ್ರಕ್ರಿಯೆ ನಿಧಾನವಾಗಬಹುದು, ವಿಶೇಷವಾಗಿ ನಂತರದ ಸಂಕೀರ್ಣ ಪಾಠಗಳಲ್ಲಿ. +> **ಗಮನಿಸಿ**: ದುರupyೋಗವನ್ನು ತಡೆಹಿಡಿಯಲು, ಬಿಂಡರ್ ಕೆಲವು ವೆಬ್ ಸಂಪನ್ಮೂಲಗಳನ್ನು ತಡೆಹಿಡಿದಿದೆ. ಇದು ಕೆಲವು ಕೋಡ್‌ಗಳು ಸಾರ್ವಜನಿಕ ಅಂತರ್ಜಾಲದಿಂದ ಮಾದರಿಗಳು ಮತ್ತು/ಅಥವಾ ಡೇಟಾಸೆಟ್‌ಗಳನ್ನು ಪಡೆದುಕೊಳ್ಳಲು ಕಾರ್ಯನಿರ್ವಹಿಸಿ ತಡೆಯಬಹುದು. ನೀವು ಕೆಲವು ಪರಿಹಾರಗಳನ್ನು ಕಂಡುಹಿಡಿಯಬೇಕಾಗಬಹುದು. ಜೊತೆಗೆ, ಬಿಂಡರ್ ಒದಗಿಸುವ ಗಣನೆಯ ಸಂಪನ್ಮೂಲಗಳು ಆಧುನಿಕ ಅಲ್ಲ, ಆದ್ದರಿಂದ ತರಬೇತಿ ನಿಧಾನವಾಗಿರುತ್ತದೆ, ವಿಶೇಷವಾಗಿ ನಂತರದ ಸಂಕೀರ್ಣ ಪಾಠಗಳಲ್ಲಿ. -## 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 ಸಿರಿಯಸ್ VM ಗಳು GPU ಬೆಂಬಲ ಹೊಂದಿವೆ. +* [ಡೇಟಾ ಸೈನ್ಸ್ ವರ್ಚುವಲ್ ಮಷೀನ್](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) ರಚಿಸಿ ಮತ್ತು Jupyter ಮೂಲಕ ಸಂಪರ್ಕಿಸಿ. ನಂತರ ನೀವು ಥಳಿಯನ್ನು ನೇರವಾಗಿ ಮಷೀನ್‌ಗೆ ಕ್ಲೋನ್ ಮಾಡಿ, ಕಲಿಕೆ ಪ್ರಾರಂಭಿಸಬಹುದು. NC-ಸಿರಿಯಸ್ VM ಗಳು 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) ರಚಿಸಿ, ನಂತರ ಅಲ್ಲಿ ನೋಟ್‌ಬುಕ್ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಬಳಸಿಕೊಳ್ಳಿ. [ಈ ವೀಡಿಯೋ](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 ನೋಟ್ಬುಕ್‌ಗಳನ್ನು ಅಪ್‌ಲೋಡ್ ಮಾಡಿ ಒಂದೊಂದಾಗಿ ಕಾರ್ಯಗತಗೊಳಿಸಬಹುದು. --- -**ತಗ್ಗಿಸುವುದು**: -ಈ ದಸ್ತಾವೇಜು AI ಅನುವಾದ ಸೇವೆ [Co-op Translator](https://github.com/Azure/co-op-translator) ಬಳಸಿ ಅನುವದಿಸಲಾಗಿದೆ. ನಾವು ನಿಖರತೆಗೆ ಪ್ರಯತ್ನಿಸಿದರೂ ಸಹ ಸ್ವಯಂಚಾಲಿತ ಅನುವಾದಗಳಲ್ಲಿ ದೋಷಗಳು ಅಥವಾ ತಪ್ಪಾದ ವಿವರಗಳು ಇದ್ದಿರಬಹುದು ಎಂದು ದಯವಿಟ್ಟು ಗಮನಿಸಿರಿ. ಮೂಲ ಭಾಷೆಯಲ್ಲಿನ ದಸ್ತಾವೇಜನ್ನು ಅಧಿಕೃತ ಮೂಲವೆಂದು ಪರಿಗಣಿಸಬೇಕು. ಪ್ರಮುಖ ಮಾಹಿತಿಗಾಗಿ ವೃತ್ತಿಪರ ಮನುಷ್ಯ ಅನುವಾದವನ್ನು ಶಿಫಾರಸು ಮಾಡಲಾಗುತ್ತದೆ. ಈ ಅನುವಾದದ ಬಳಕೆಯಿಂದ ಉಂಟಾಗುವ ಯಾವುದೇ ತಿರಸ್ಕಾರಗಳು ಅಥವಾ ತಪ್ಪಾಗುವ ಅರ್ಥಗಳ ಬಗ್ಗೆ ನಾವು ಜವಾಬ್ದಾರಿಯಲ್ಲ. +**ಅಸ್ವೀಕಾರ**: +ಈ ದಸ್ತಾವೇಜು AI ಅನುವಾದ ಸೇವೆ [Co-op Translator](https://github.com/Azure/co-op-translator) ಬಳಸಿ ಅನುವಾದಿಸಲಾಗಿದೆ. ನಾವು ನಿಖರತೆಯನ್ನು ಸಾಧಿಸಲು ಪ್ರಯತ್ನಿಸುತ್ತಿದ್ದರೂ, ದಯವಿಟ್ಟು ಗಮನಿಸಿ, ಸ್ವಯಂಚಾಲಿತ ಅನುವಾದಗಳಲ್ಲಿ ದೋಷಗಳು ಅಥವಾ ಅಸಡ್ಡೆಗಳು ಇರಬಹುದು. ಮೂಲ ಭಾಷೆಯಲ್ಲಿರುವ ಮೂಲ ದಸ್ತಾವೇಜು ಪ್ರಾಮಾಣಿಕ ಮೂಲವೆಂದು ಪರಿಗಣಿಸಬೇಕು. ಪ್ರಮುಖ ಮಾಹಿತಿಗಾಗಿ, ವೃತ್ತಿಪರ ಮಾನವ ಅನುವಾದವನ್ನು ಶಿಫಾರಸು ಮಾಡಲಾಗುತ್ತದೆ. ಈ ಅನುವಾದವನ್ನು ಬಳಸುವ ಮೂಲಕ ಉಂಟಾಗುವ ಯಾವುದೇ ತಪ್ಪು ಅರ್ಥಗಳ ಅಥವಾ ತಪ್ಪು ವ್ಯಾಖ್ಯಾನಗಳ ಬಗ್ಗೆ ನಾವು ಹೊಣೆಗಾರರಲ್ಲ. \ No newline at end of file diff --git a/translations/kn/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/kn/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index 5d12000f6a..82999dcd4e 100644 --- a/translations/kn/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/kn/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -1,1497 +1,1502 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# ಪೂರ್ವ-ಪ್ರಶಿಕ್ಷಿತ ಮಾದರಿಗಳು ಮತ್ತು ವರ್ಗಾವಣೆ ಅಧ್ಯಯನ\n", - "\n", - "CNNಗಳನ್ನು ತರಬೇತಿಗೊಳಿಸಲು ಬಹಳ ಸಮಯ ಬೇಕಾಗುತ್ತದೆ ಮತ್ತು ಅದಕ್ಕಾಗಿ ಹೆಚ್ಚಿನ ಡೇಟಾ ಅಗತ್ಯವಿರುತ್ತದೆ. ಆದರೆ, ಹೆಚ್ಚಿನ ಸಮಯವು ಚಿತ್ರಗಳಿಂದ ಮಾದರಿಗಳನ್ನು ಹೊರತೆಗೆಯಲು ನೆಟ್‌ವರ್ಕ್ ಬಳಸುವ ಅತ್ಯುತ್ತಮ ಕಡಿಮೆ-ಮಟ್ಟದ ಫಿಲ್ಟರ್‌ಗಳನ್ನು ಕಲಿಯಲು ವ್ಯಯವಾಗುತ್ತದೆ. ಒಂದು ಸಹಜ ಪ್ರಶ್ನೆ ಉದ್ಭವಿಸುತ್ತದೆ - ನಾವು ಒಂದು ಡೇಟಾಸೆಟ್‌ನಲ್ಲಿ ತರಬೇತಿಗೊಳಿಸಿದ ನ್ಯೂರಲ್ ನೆಟ್‌ವರ್ಕ್ ಅನ್ನು ಬಳಸಿಕೊಂಡು, ಸಂಪೂರ್ಣ ತರಬೇತಿ ಪ್ರಕ್ರಿಯೆಯಿಲ್ಲದೆ ವಿಭಿನ್ನ ಚಿತ್ರಗಳನ್ನು ವರ್ಗೀಕರಿಸಲು ಅದನ್ನು ಹೊಂದಿಸಬಹುದೇ?\n", - "\n", - "ಈ ವಿಧಾನವನ್ನು **ವರ್ಗಾವಣೆ ಅಧ್ಯಯನ** ಎಂದು ಕರೆಯುತ್ತಾರೆ, ಏಕೆಂದರೆ ನಾವು ಒಂದು ನ್ಯೂರಲ್ ನೆಟ್‌ವರ್ಕ್ ಮಾದರಿಯಿಂದ ಇನ್ನೊಂದು ಮಾದರಿಗೆ ಕೆಲವು ಜ್ಞಾನವನ್ನು ವರ್ಗಾಯಿಸುತ್ತೇವೆ. ವರ್ಗಾವಣೆ ಅಧ್ಯಯನದಲ್ಲಿ, ನಾವು ಸಾಮಾನ್ಯವಾಗಿ ಪೂರ್ವ-ಪ್ರಶಿಕ್ಷಿತ ಮಾದರಿಯಿಂದ ಪ್ರಾರಂಭಿಸುತ್ತೇವೆ, ಅದು **ImageNet** ಮುಂತಾದ ದೊಡ್ಡ ಚಿತ್ರ ಡೇಟಾಸೆಟ್‌ನಲ್ಲಿ ತರಬೇತಿಗೊಳಿಸಲಾಗಿದೆ. ಆ ಮಾದರಿಗಳು ಸಾಮಾನ್ಯ ಚಿತ್ರಗಳಿಂದ ವಿಭಿನ್ನ ಲಕ್ಷಣಗಳನ್ನು ಹೊರತೆಗೆಯಲು ಈಗಾಗಲೇ ಉತ್ತಮ ಕೆಲಸ ಮಾಡಬಹುದು, ಮತ್ತು ಬಹುತೇಕ ಸಂದರ್ಭಗಳಲ್ಲಿ ಆ ಹೊರತೆಗೆಯಲಾದ ಲಕ್ಷಣಗಳ ಮೇಲೆ ಕ್ಲಾಸಿಫೈಯರ್ ನಿರ್ಮಿಸುವುದರಿಂದ ಉತ್ತಮ ಫಲಿತಾಂಶ ಸಿಗಬಹುದು.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import tensorflow as tf\n", - "from tensorflow import keras\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - "import os\n", - "from tfcv import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## ಬೆಕ್ಕುಗಳು ಮತ್ತು ನಾಯಿಗಳು ಡೇಟಾಸೆಟ್\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", - "\n", - "ಈ ಡೇಟಾಸೆಟ್ ಅನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡಿ `data` ಡೈರೆಕ್ಟರಿಯಲ್ಲಿ ಎಕ್ಸ್ಟ್ರ್ಯಾಕ್ಟ್ ಮಾಡೋಣ (ಈ ಪ್ರಕ್ರಿಯೆಗೆ ಸ್ವಲ್ಪ ಸಮಯ ಬೇಕಾಗಬಹುದು!):\n" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "if not os.path.exists('data/kagglecatsanddogs_5340.zip'):\n", - " !wget -P data https://download.microsoft.com/download/3/E/1/3E1C3F21-ECDB-4869-8368-6DEBA77B919F/kagglecatsanddogs_5340.zip" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "import zipfile\n", - "if not os.path.exists('data/PetImages'):\n", - " with zipfile.ZipFile('data/kagglecatsanddogs_5340.zip', 'r') as zip_ref:\n", - " zip_ref.extractall('data')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "ದುರದೃಷ್ಟವಶಾತ್, ಡೇಟಾಸೆಟ್‌ನಲ್ಲಿ ಕೆಲವು ಹಾಳಾದ ಚಿತ್ರ ಫೈಲ್‌ಗಳಿವೆ. ಹಾಳಾದ ಫೈಲ್‌ಗಳನ್ನು ಪರಿಶೀಲಿಸಲು ನಾವು ತ್ವರಿತ ಶುದ್ಧೀಕರಣ ಮಾಡಬೇಕಾಗಿದೆ. ಈ ಟ್ಯುಟೋರಿಯಲ್ ಅನ್ನು ಹಾಳುಮಾಡದಂತೆ, ಡೇಟಾಸೆಟ್ ಪರಿಶೀಲಿಸುವ ಕೋಡ್ ಅನ್ನು ಒಂದು ಮೋಡ್ಯೂಲ್‌ಗೆ ಸ್ಥಳಾಂತರಿಸಿದ್ದೇವೆ.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Corrupt image or wrong format: data/PetImages/Cat/12235.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/2663.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/4929.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/8183.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/11083.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/6435.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/6491.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/7968.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/6768.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/11397.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/8295.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/4874.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/23.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/11864.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/3491.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/11729.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/3197.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/10874.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/6376.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/9361.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/9328.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/910.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/2021.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/666.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/3710.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/9171.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/6906.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/11095.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/660.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/8415.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/3161.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/850.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/7003.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/1267.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/7642.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/8553.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/6900.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/4334.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/10404.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/6980.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/936.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/9619.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/3300.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/7647.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/2742.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/9565.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/1757.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/11874.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/1936.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/5077.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/7845.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/8832.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/11935.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/9208.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/4322.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/7978.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/10820.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/391.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/10073.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/8958.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/8470.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/445.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/4821.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/11565.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/4351.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/4833.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/140.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/3153.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/5370.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/5819.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/3649.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/4293.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/3967.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/1937.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/10125.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/1386.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/4750.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/6029.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/5614.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/2569.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/9778.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/6486.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/11210.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/7502.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/2189.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/1151.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/4629.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/12080.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/10501.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/1914.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/11086.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/4000.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/9100.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/5553.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/12269.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/5243.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/3288.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/11912.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/3320.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/11166.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/8194.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/2353.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/9026.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/8557.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/7969.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/8693.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/4367.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/1900.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/5730.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/9961.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/8126.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/8521.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/11560.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/11233.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/11675.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/8889.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/9414.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/3588.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/10353.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/10733.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/6238.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/5618.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/7743.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/10747.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/6503.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/11410.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/5955.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/2915.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/3136.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/4086.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/2905.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/2494.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/3546.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/5547.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/9851.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/9188.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/4203.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/8715.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/4640.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/1866.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/7718.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/7514.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/1017.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/12102.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/296.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/6718.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/11253.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/10173.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/11849.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/10383.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/10678.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/5790.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/6318.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/1884.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/4654.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/9145.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/2479.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/12289.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/2688.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/4134.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/10637.jpg\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/anaconda/envs/py38_tensorflow/lib/python3.8/site-packages/PIL/TiffImagePlugin.py:793: UserWarning: Truncated File Read\n", - " warnings.warn(str(msg))\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Corrupt image or wrong format: data/PetImages/Dog/543.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/8730.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/12114.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/522.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/10863.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/10401.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/7739.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/561.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/1308.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/9643.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/3155.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/5736.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/4257.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/11853.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/6855.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/1259.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/7652.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/573.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/11702.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/414.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/4301.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/9500.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/10726.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/9367.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/2877.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/10907.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/10972.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/7311.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/10797.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/2317.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/7128.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/6500.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/11285.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/6430.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/6032.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/10969.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/8364.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/11692.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/3038.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/5604.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/565.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/9640.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/7459.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/6305.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/6555.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/11590.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/6059.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/3927.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/10705.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/2384.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/3885.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/663.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/9043.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/8563.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/9556.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/9967.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/10158.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/5263.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/8641.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/7369.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/4924.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/10351.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/6213.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/5104.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/1356.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/7133.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/7112.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/1168.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/719.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/50.jpg\n" - ] - } - ], - "source": [ - "check_image_dir('data/PetImages/Cat/*.jpg')\n", - "check_image_dir('data/PetImages/Dog/*.jpg')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## ಡೇಟಾಸೆಟ್ ಅನ್ನು ಲೋಡ್ ಮಾಡುವುದು\n", - "\n", - "ಹಿಂದಿನ ಉದಾಹರಣೆಗಳಲ್ಲಿ, ನಾವು Keras ನಲ್ಲಿ ನಿರ್ಮಿಸಲಾದ ಡೇಟಾಸೆಟ್‌ಗಳನ್ನು ಲೋಡ್ ಮಾಡುತ್ತಿದ್ದೆವು. ಈಗ ನಾವು ನಮ್ಮ ಸ್ವಂತ ಡೇಟಾಸೆಟ್ ಅನ್ನು ಹ್ಯಾಂಡಲ್ ಮಾಡಬೇಕಾಗಿದೆ, ಅದನ್ನು ಚಿತ್ರಗಳ ಡೈರೆಕ್ಟರಿಯಿಂದ ಲೋಡ್ ಮಾಡಬೇಕಾಗುತ್ತದೆ.\n", - "\n", - "ವಾಸ್ತವಿಕ ಜೀವನದಲ್ಲಿ, ಚಿತ್ರ ಡೇಟಾಸೆಟ್‌ಗಳ ಗಾತ್ರ ಬಹಳ ದೊಡ್ಡದಾಗಿರಬಹುದು, ಮತ್ತು ಎಲ್ಲಾ ಡೇಟಾವನ್ನು ಮೆಮೊರಿಯಲ್ಲಿ ಇರಿಸುವುದಕ್ಕೆ ನಂಬಿಕೆ ಇಡಲಾಗುವುದಿಲ್ಲ. ಆದ್ದರಿಂದ, ಡೇಟಾಸೆಟ್‌ಗಳನ್ನು ಸಾಮಾನ್ಯವಾಗಿ ತರಬೇತಿಗೆ ಸೂಕ್ತವಾದ ಸಣ್ಣ ಬ್ಯಾಚ್‌ಗಳಲ್ಲಿ ಡೇಟಾವನ್ನು ನೀಡುವ **ಜನರೇಟರ್‌ಗಳು** ಆಗಿ ಪ್ರತಿನಿಧಿಸಲಾಗುತ್ತದೆ.\n", - "\n", - "ಚಿತ್ರ ವರ್ಗೀಕರಣವನ್ನು ಹ್ಯಾಂಡಲ್ ಮಾಡಲು, Keras ವಿಶೇಷ ಫಂಕ್ಷನ್ `image_dataset_from_directory` ಅನ್ನು ಒಳಗೊಂಡಿದೆ, ಇದು ವಿಭಿನ್ನ ವರ್ಗಗಳಿಗೆ ಹೊಂದಿಕೊಂಡ ಉಪಡೈರೆಕ್ಟರಿಗಳಿಂದ ಚಿತ್ರಗಳನ್ನು ಲೋಡ್ ಮಾಡಬಹುದು. ಈ ಫಂಕ್ಷನ್ ಚಿತ್ರಗಳನ್ನು ಸ್ಕೇಲ್ ಮಾಡುವುದನ್ನು ಕೂಡ ನೋಡಿಕೊಳ್ಳುತ್ತದೆ, ಮತ್ತು ಡೇಟಾಸೆಟ್ ಅನ್ನು ತರಬೇತಿ ಮತ್ತು ಪರೀಕ್ಷಾ ಉಪಸಮೂಹಗಳಾಗಿ ವಿಭಜಿಸುವುದನ್ನು ಸಹ ಮಾಡಬಹುದು:\n" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Found 24769 files belonging to 2 classes.\n", - "Using 19816 files for training.\n", - "Found 24769 files belonging to 2 classes.\n", - "Using 4953 files for validation.\n" - ] - } - ], - "source": [ - "data_dir = 'data/PetImages'\n", - "batch_size = 64\n", - "ds_train = keras.preprocessing.image_dataset_from_directory(\n", - " data_dir,\n", - " validation_split = 0.2,\n", - " subset = 'training',\n", - " seed = 13,\n", - " image_size = (224,224),\n", - " batch_size = batch_size\n", - ")\n", - "ds_test = keras.preprocessing.image_dataset_from_directory(\n", - " data_dir,\n", - " validation_split = 0.2,\n", - " subset = 'validation',\n", - " seed = 13,\n", - " image_size = (224,224),\n", - " batch_size = batch_size\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "ಎರಡು ಕರೆಗಳಿಗೂ ಒಂದೇ `seed` ಮೌಲ್ಯವನ್ನು ಹೊಂದಿಸುವುದು ಮುಖ್ಯ, ಏಕೆಂದರೆ ಇದು ತರಬೇತಿ ಮತ್ತು ಪರೀಕ್ಷಾ ಡೇಟಾಸೆಟ್‌ಗಳ ನಡುವೆ ಚಿತ್ರಗಳ ವಿಭಜನೆಗೆ ಪ್ರಭಾವ ಬೀರುತ್ತದೆ.\n", - "\n", - "ಡೇಟಾಸೆಟ್ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಡೈರೆಕ್ಟರಿಗಳಿಂದ ವರ್ಗದ ಹೆಸರುಗಳನ್ನು ತೆಗೆದುಕೊಳ್ಳುತ್ತದೆ, ಮತ್ತು ಅವುಗಳನ್ನು ಬೇಕಾದರೆ ಈ ಕೆಳಗಿನಂತೆ ಕರೆಮಾಡಿ ಪ್ರವೇಶಿಸಬಹುದು:\n" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['Cat', 'Dog']" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ds_train.class_names" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "ನಾವು ಪಡೆದ ಡೇಟಾಸೆಟ್‌ಗಳನ್ನು ನೇರವಾಗಿ `fit` ಫಂಕ್ಷನ್‌ಗೆ ಪಾಸ್ ಮಾಡಿ ಮಾದರಿಯನ್ನು ತರಬೇತಿಗೆ ಒಳಪಡಿಸಬಹುದು. ಅವುಗಳಲ್ಲಿ ಸಂಬಂಧಿಸಿದ ಚಿತ್ರಗಳು ಮತ್ತು ಲೇಬಲ್ಗಳು ಎರಡೂ ಇರುತ್ತವೆ, ಅವುಗಳನ್ನು ಕೆಳಗಿನ ರಚನೆಯ ಮೂಲಕ ಲೂಪ್ ಮಾಡಬಹುದು:\n" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Training batch shape: features=(64, 224, 224, 3), labels=(64,)\n" - ] - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "for x,y in ds_train:\n", - " print(f\"Training batch shape: features={x.shape}, labels={y.shape}\")\n", - " x_sample, y_sample = x,y\n", - " break\n", - " \n", - "display_dataset(x_sample.numpy().astype(np.int),np.expand_dims(y_sample,1),classes=ds_train.class_names)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "> **ಗಮನಿಸಿ**: ಡೇಟಾಸೆಟ್‌ನಲ್ಲಿರುವ ಎಲ್ಲಾ ಚಿತ್ರಗಳು 0-255 ಶ್ರೇಣಿಯ ಫ್ಲೋಟಿಂಗ್ ಪಾಯಿಂಟ್ ಟೆನ್ಸರ್‌ಗಳಾಗಿ ಪ್ರತಿನಿಧಿಸಲಾಗಿವೆ. ಅವುಗಳನ್ನು ನ್ಯೂರಲ್ ನೆಟ್‌ವರ್ಕ್‌ಗೆ ಪಾಸ್ ಮಾಡುವ ಮೊದಲು, ಆ ಮೌಲ್ಯಗಳನ್ನು 0-1 ಶ್ರೇಣಿಗೆ ಸ್ಕೇಲ್ ಮಾಡಬೇಕಾಗುತ್ತದೆ. ಚಿತ್ರಗಳನ್ನು ಪ್ಲಾಟ್ ಮಾಡುವಾಗ, ನಾವು ಅದೇ ಕೆಲಸ ಮಾಡಬೇಕಾಗುತ್ತದೆ ಅಥವಾ ಮೌಲ್ಯಗಳನ್ನು `int` ಪ್ರಕಾರಕ್ಕೆ ಪರಿವರ್ತಿಸಬೇಕು (ಮೇಲಿನ ಕೋಡ್‌ನಲ್ಲಿ ನಾವು ಮಾಡಿರುವಂತೆ), ಇದರಿಂದ `matplotlib`ಗೆ ನಾವು ಮೂಲ ಅಸ್ಕೇಲ್ಡ್ ಆಗದ ಚಿತ್ರವನ್ನು ಪ್ಲಾಟ್ ಮಾಡಲು ಬಯಸುತ್ತೇವೆ ಎಂದು ತೋರಿಸಬಹುದು.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## ಪೂರ್ವ-ತರಬೇತಿ ಪಡೆದ ಮಾದರಿಗಳು\n", - "\n", - "ಬಹುತೆಕ ಚಿತ್ರ ವರ್ಗೀಕರಣ ಕಾರ್ಯಗಳಿಗೆ ಪೂರ್ವ-ತರಬೇತಿ ಪಡೆದ ನ್ಯೂರಲ್ ನೆಟ್‌ವರ್ಕ್ ಮಾದರಿಗಳನ್ನು ಕಂಡುಹಿಡಿಯಬಹುದು. ಆ ಮಾದರಿಗಳಲ್ಲಿ ಬಹುತೇಕವು `keras.applications` ನಾಮಸ್ಥಳದಲ್ಲಿ ಲಭ್ಯವಿದ್ದು, ಇನ್ನಷ್ಟು ಮಾದರಿಗಳನ್ನು ಇಂಟರ್ನೆಟ್‌ನಲ್ಲಿ ಕೂಡ ಹುಡುಕಬಹುದು. ಸರಳವಾದ VGG-16 ಮಾದರಿಯನ್ನು ಹೇಗೆ ಲೋಡ್ ಮಾಡಿ ಬಳಸಬಹುದು ಎಂದು ನೋಡೋಣ:\n" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Downloading data from https://storage.googleapis.com/tensorflow/keras-applications/vgg16/vgg16_weights_tf_dim_ordering_tf_kernels.h5\n", - "553467904/553467096 [==============================] - 6s 0us/step\n", - "Most probable class = [208]\n", - "Downloading data from https://storage.googleapis.com/download.tensorflow.org/data/imagenet_class_index.json\n", - "40960/35363 [==================================] - 0s 0us/step\n" - ] - }, - { - "data": { - "text/plain": [ - "[[('n02099712', 'Labrador_retriever', 0.5340957),\n", - " ('n02100236', 'German_short-haired_pointer', 0.0939442),\n", - " ('n02092339', 'Weimaraner', 0.08160535),\n", - " ('n02099849', 'Chesapeake_Bay_retriever', 0.057179328),\n", - " ('n02109047', 'Great_Dane', 0.03733857)]]" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "vgg = keras.applications.VGG16()\n", - "inp = keras.applications.vgg16.preprocess_input(x_sample[:1])\n", - "\n", - "res = vgg(inp)\n", - "print(f\"Most probable class = {tf.argmax(res,1)}\")\n", - "\n", - "keras.applications.vgg16.decode_predictions(res.numpy())" - ] - }, - { - "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" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "ನಾವು VGG-16 ನೆಟ್‌ವರ್ಕ್‌ನ ವಾಸ್ತುಶಿಲ್ಪವನ್ನು ಕೂಡ ನೋಡೋಣ:\n" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Model: \"vgg16\"\n", - "_________________________________________________________________\n", - "Layer (type) Output Shape Param # \n", - "=================================================================\n", - "input_1 (InputLayer) [(None, 224, 224, 3)] 0 \n", - "_________________________________________________________________\n", - "block1_conv1 (Conv2D) (None, 224, 224, 64) 1792 \n", - "_________________________________________________________________\n", - "block1_conv2 (Conv2D) (None, 224, 224, 64) 36928 \n", - "_________________________________________________________________\n", - "block1_pool (MaxPooling2D) (None, 112, 112, 64) 0 \n", - "_________________________________________________________________\n", - "block2_conv1 (Conv2D) (None, 112, 112, 128) 73856 \n", - "_________________________________________________________________\n", - "block2_conv2 (Conv2D) (None, 112, 112, 128) 147584 \n", - "_________________________________________________________________\n", - "block2_pool (MaxPooling2D) (None, 56, 56, 128) 0 \n", - "_________________________________________________________________\n", - "block3_conv1 (Conv2D) (None, 56, 56, 256) 295168 \n", - "_________________________________________________________________\n", - "block3_conv2 (Conv2D) (None, 56, 56, 256) 590080 \n", - "_________________________________________________________________\n", - "block3_conv3 (Conv2D) (None, 56, 56, 256) 590080 \n", - "_________________________________________________________________\n", - "block3_pool (MaxPooling2D) (None, 28, 28, 256) 0 \n", - "_________________________________________________________________\n", - "block4_conv1 (Conv2D) (None, 28, 28, 512) 1180160 \n", - "_________________________________________________________________\n", - "block4_conv2 (Conv2D) (None, 28, 28, 512) 2359808 \n", - "_________________________________________________________________\n", - "block4_conv3 (Conv2D) (None, 28, 28, 512) 2359808 \n", - "_________________________________________________________________\n", - "block4_pool (MaxPooling2D) (None, 14, 14, 512) 0 \n", - "_________________________________________________________________\n", - "block5_conv1 (Conv2D) (None, 14, 14, 512) 2359808 \n", - "_________________________________________________________________\n", - "block5_conv2 (Conv2D) (None, 14, 14, 512) 2359808 \n", - "_________________________________________________________________\n", - "block5_conv3 (Conv2D) (None, 14, 14, 512) 2359808 \n", - "_________________________________________________________________\n", - "block5_pool (MaxPooling2D) (None, 7, 7, 512) 0 \n", - "_________________________________________________________________\n", - "flatten (Flatten) (None, 25088) 0 \n", - "_________________________________________________________________\n", - "fc1 (Dense) (None, 4096) 102764544 \n", - "_________________________________________________________________\n", - "fc2 (Dense) (None, 4096) 16781312 \n", - "_________________________________________________________________\n", - "predictions (Dense) (None, 1000) 4097000 \n", - "=================================================================\n", - "Total params: 138,357,544\n", - "Trainable params: 138,357,544\n", - "Non-trainable params: 0\n", - "_________________________________________________________________\n" - ] - } - ], - "source": [ - "vgg.summary()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## GPU ಗಣನೆಗಳು\n", - "\n", - "VGG-16 ಮತ್ತು ಇತರ ಆಧುನಿಕ ಆರ್ಕಿಟೆಕ್ಚರ್‌ಗಳಂತಹ ಡೀಪ್ ನ್ಯೂರಲ್ ನೆಟ್‌ವರ್ಕ್‌ಗಳು ಕಾರ್ಯನಿರ್ವಹಿಸಲು ಸಾಕಷ್ಟು ಗಣನಾಶಕ್ತಿಯನ್ನು ಅಗತ್ಯವಿರುತ್ತದೆ. GPU ವೇಗವರ್ಧನೆ ಲಭ್ಯವಿದ್ದರೆ ಅದನ್ನು ಬಳಸುವುದು ತಕ್ಕದ್ದು. ಭಾಗ್ಯವಶಾತ್, Keras ಲಭ್ಯವಿದ್ದರೆ GPU ಮೇಲೆ ಗಣನೆಗಳನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ವೇಗಗೊಳಿಸುತ್ತದೆ. Tensorflow GPU ಬಳಸಬಹುದೇ ಎಂದು ಕೆಳಗಿನ ಕೋಡ್ ಮೂಲಕ ಪರಿಶೀಲಿಸಬಹುದು:\n" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "tf.config.list_physical_devices('GPU')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## VGG ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಹೊರತೆಗೆಯುವುದು\n", - "\n", - "ನಾವು ನಮ್ಮ ಚಿತ್ರಗಳಿಂದ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಹೊರತೆಗೆಯಲು VGG-16 ಅನ್ನು ಬಳಸಬೇಕಾದರೆ, ಅಂತಿಮ ವರ್ಗೀಕರಣ ಪದರಗಳಿಲ್ಲದ ಮಾದರಿಯನ್ನು ಬೇಕಾಗುತ್ತದೆ. ಮೇಲಿನ ಪದರಗಳಿಲ್ಲದೆ VGG-16 ಮಾದರಿಯನ್ನು ಈ ಕೋಡ್ ಬಳಸಿ ಸೃಷ್ಟಿಸಬಹುದು:\n" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Shape after applying VGG-16: (7, 7, 512)\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "vgg = keras.applications.VGG16(include_top=False)\n", - "\n", - "inp = keras.applications.vgg16.preprocess_input(x_sample[:1])\n", - "res = vgg(inp)\n", - "print(f\"Shape after applying VGG-16: {res[0].shape}\")\n", - "plt.figure(figsize=(15,3))\n", - "plt.imshow(res[0].numpy().reshape(-1,512))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "ಫೀಚರ್ ಟೆನ್ಸರ್‌ನ ಆಯಾಮ 7x7x512 ಆಗಿದೆ, ಆದರೆ ಅದನ್ನು ದೃಶ್ಯೀಕರಿಸಲು ನಾವು ಅದನ್ನು 2D ರೂಪಕ್ಕೆ ಮರುರೂಪಿಸಬೇಕಾಯಿತು.\n", - "\n", - "ಈಗ ಆ ಫೀಚರ್‌ಗಳನ್ನು ಚಿತ್ರಗಳನ್ನು ವರ್ಗೀಕರಿಸಲು ಬಳಸಬಹುದೇ ಎಂದು ನೋಡೋಣ. ಕೈಯಿಂದ ಕೆಲವು ಚಿತ್ರಗಳ ಭಾಗವನ್ನು (ನಮ್ಮ ಪ್ರಕರಣದಲ್ಲಿ 50 ಮಿನಿಬ್ಯಾಚ್‌ಗಳು) ತೆಗೆದು, ಅವುಗಳ ಫೀಚರ್ ವೆಕ್ಟರ್‌ಗಳನ್ನು ಪೂರ್ವಗಣನೆ ಮಾಡೋಣ. ಅದಕ್ಕಾಗಿ ನಾವು Tensorflow **dataset** API ಅನ್ನು ಬಳಸಬಹುದು. `map` ಫಂಕ್ಷನ್ ಒಂದು ಡೇಟಾಸೆಟ್ ಅನ್ನು ತೆಗೆದು, ನೀಡಲಾದ ಲ್ಯಾಂಬ್ಡಾ-ಫಂಕ್ಷನ್ ಅನ್ನು ಅನ್ವಯಿಸಿ ಅದನ್ನು ಪರಿವರ್ತಿಸುತ್ತದೆ. ಈ ವಿಧಾನವನ್ನು ಬಳಸಿಕೊಂಡು ನಾವು ಮೂಲ ಚಿತ್ರಗಳ ಬದಲು VGG-ನಿಂದ ಪಡೆದ ಫೀಚರ್‌ಗಳನ್ನು ಹೊಂದಿರುವ ಹೊಸ ಡೇಟಾಸೆಟ್‌ಗಳು, `ds_features_train` ಮತ್ತು `ds_features_test` ಅನ್ನು ರಚಿಸುತ್ತೇವೆ.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(64, 7, 7, 512) (64,)\n" - ] - } - ], - "source": [ - "num = batch_size*50\n", - "ds_features_train = ds_train.take(50).map(lambda x,y : (vgg(x),y))\n", - "ds_features_test = ds_test.take(10).map(lambda x,y : (vgg(x),y))\n", - "\n", - "for x,y in ds_features_train:\n", - " print(x.shape,y.shape)\n", - " break" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "ನಾವು ನಮ್ಮ ಪ್ರದರ್ಶನವನ್ನು ವೇಗಗೊಳಿಸಲು ಡೇಟಾಸೆಟ್ ಗಾತ್ರವನ್ನು ಮಿತಿಗೊಳಿಸಲು `.take(50)` ರಚನೆಯನ್ನು ಬಳಸಿದ್ದೇವೆ. ನೀವು ನಿಶ್ಚಿತವಾಗಿ ಈ ಪ್ರಯೋಗವನ್ನು ಸಂಪೂರ್ಣ ಡೇಟಾಸೆಟ್ ಮೇಲೆ ನಡೆಸಬಹುದು.\n", - "\n", - "ಈಗ ನಾವು ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಹೊರತೆಗೆಯಲಾದ ಡೇಟಾಸೆಟ್ ಹೊಂದಿದ್ದೇವೆ, ನಾವು ಬೆಕ್ಕು ಮತ್ತು ನಾಯಿ ನಡುವಿನ ವ್ಯತ್ಯಾಸವನ್ನು ಗುರುತಿಸಲು ಸರಳ ಡೆನ್ಸ್ ವರ್ಗೀಕರಣವನ್ನು ತರಬೇತುಗೊಳಿಸಬಹುದು. ಈ ನೆಟ್‌ವರ್ಕ್ (7,7,512) ಆಕಾರದ ವೈಶಿಷ್ಟ್ಯ ವೆಕ್ಟರ್ ಅನ್ನು ತೆಗೆದು, ನಾಯಿ ಅಥವಾ ಬೆಕ್ಕಿಗೆ ಹೊಂದುವ ಒಂದು ಔಟ್‌ಪುಟ್ ಅನ್ನು ಉತ್ಪಾದಿಸುತ್ತದೆ. ಇದು ದ್ವಿಮುಖ ವರ್ಗೀಕರಣವಾಗಿರುವುದರಿಂದ, ನಾವು `sigmoid` ಸಕ್ರಿಯತೆ ಕಾರ್ಯ ಮತ್ತು `binary_crossentropy` ನಷ್ಟವನ್ನು ಬಳಸುತ್ತೇವೆ.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "50/50 [==============================] - 1896s 38s/step - loss: 1.4845 - acc: 0.9144 - val_loss: 0.7220 - val_acc: 0.9516\n" - ] - } - ], - "source": [ - "model = keras.models.Sequential([\n", - " keras.layers.Flatten(input_shape=(7,7,512)),\n", - " keras.layers.Dense(1,activation='sigmoid')\n", - "])\n", - "model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc'])\n", - "hist = model.fit(ds_features_train, validation_data=ds_features_test)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "ಫಲಿತಾಂಶ ಅದ್ಭುತವಾಗಿದೆ, ನಾವು ಬೆಕ್ಕು ಮತ್ತು ನಾಯಿ ನಡುವಿನ ಭೇದವನ್ನು ಸುಮಾರು 95% ಸಾಧ್ಯತೆಯಿಂದ ಗುರುತಿಸಬಹುದು! ಆದರೆ, ನಾವು ಈ ವಿಧಾನವನ್ನು ಎಲ್ಲಾ ಚಿತ್ರಗಳ ಉಪಸಮೂಹದಲ್ಲಿ ಮಾತ್ರ ಪರೀಕ್ಷಿಸಿದ್ದೇವೆ, ಏಕೆಂದರೆ ಕೈಯಿಂದ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಹೊರತೆಗೆಯುವುದು ಬಹಳ ಸಮಯ ತೆಗೆದುಕೊಳ್ಳುತ್ತದೆ ಎಂದು ತೋರುತ್ತದೆ.\n", - "\n", - "## ಒಂದು VGG ನೆಟ್‌ವರ್ಕ್ ಬಳಸಿ ಟ್ರಾನ್ಸ್‌ಫರ್ ಲರ್ನಿಂಗ್\n", - "\n", - "ಮೂಲ VGG-16 ನೆಟ್‌ವರ್ಕ್ ಅನ್ನು ಸಂಪೂರ್ಣವಾಗಿ ತರಬೇತಿಯಲ್ಲಿ ಬಳಸಿಕೊಂಡು, ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಕೈಯಿಂದ ಪೂರ್ವಗಣನೆ ಮಾಡುವುದು ತಪ್ಪಿಸಬಹುದು, ನಮ್ಮ ನೆಟ್‌ವರ್ಕ್‌ಗೆ ಮೊದಲ ಲೇಯರ್ ಆಗಿ ವೈಶಿಷ್ಟ್ಯ ಹೊರತೆಗೆಯುವ ಘಟಕವನ್ನು ಸೇರಿಸುವ ಮೂಲಕ.\n", - "\n", - "ಕೆರಾಸ್ ವಾಸ್ತುಶಿಲ್ಪದ ಸೌಂದರ್ಯವೆಂದರೆ, ನಾವು ಮೇಲ್ನೋಟದಲ್ಲಿ ವ್ಯಾಖ್ಯಾನಿಸಿದ VGG-16 ಮಾದರಿಯನ್ನು ಇನ್ನೊಂದು ನ್ಯೂರಲ್ ನೆಟ್‌ವರ್ಕ್‌ನಲ್ಲಿ ಲೇಯರ್ ಆಗಿ ಬಳಸಬಹುದು! ನಾವು ಅದಕ್ಕೆ ಮೇಲ್ಭಾಗದಲ್ಲಿ ಡೆನ್ಸ್ ವರ್ಗೀಕರಣಕಾರಿಯನ್ನು ನಿರ್ಮಿಸಿ, ನಂತರ ಬ್ಯಾಕ್ ಪ್ರೋಪಗೇಶನ್ ಬಳಸಿ ಸಂಪೂರ್ಣ ನೆಟ್‌ವರ್ಕ್ ಅನ್ನು ತರಬೇತಿಗೊಳಿಸಬಹುದು.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Model: \"sequential\"\n", - "_________________________________________________________________\n", - "Layer (type) Output Shape Param # \n", - "=================================================================\n", - "vgg16 (Functional) (None, 7, 7, 512) 14714688 \n", - "_________________________________________________________________\n", - "flatten (Flatten) (None, 25088) 0 \n", - "_________________________________________________________________\n", - "dense (Dense) (None, 1) 25089 \n", - "=================================================================\n", - "Total params: 14,739,777\n", - "Trainable params: 25,089\n", - "Non-trainable params: 14,714,688\n", - "_________________________________________________________________\n" - ] - } - ], - "source": [ - "model = keras.models.Sequential()\n", - "model.add(keras.applications.VGG16(include_top=False,input_shape=(224,224,3)))\n", - "model.add(keras.layers.Flatten())\n", - "model.add(keras.layers.Dense(1,activation='sigmoid'))\n", - "\n", - "model.layers[0].trainable = False\n", - "\n", - "model.summary()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "ಈ ಮಾದರಿ ಒಂದು ಎಂಡ್-ಟು-ಎಂಡ್ ವರ್ಗೀಕರಣ ನೆಟ್‌ವರ್ಕ್‌ ಆಗಿದ್ದು, ಇದು ಚಿತ್ರವನ್ನು ತೆಗೆದುಕೊಂಡು ವರ್ಗವನ್ನು ನೀಡುತ್ತದೆ. ಆದರೆ, ಕಷ್ಟದ ವಿಷಯವೆಂದರೆ ನಾವು VGG16 ಅನ್ನು ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ತೆಗೆದುಕೊಳ್ಳುವ ಸಾಧನವಾಗಿ ಬಳಸಬೇಕು, ಮತ್ತು ಅದನ್ನು ಮರು-ಪ್ರಶಿಕ್ಷಣ ಮಾಡಬಾರದು. ಆದ್ದರಿಂದ, ನಾವು **ಕನ್ವಲ್ಯೂಷನಲ್ ವೈಶಿಷ್ಟ್ಯಗಳ ತೂಕಗಳನ್ನು ಫ್ರೀಜ್ ಮಾಡಬೇಕು**. ನಾವು ನೆಟ್‌ವರ್ಕ್‌ನ ಮೊದಲ ಲೇಯರ್‌ಗೆ `model.layers[0]` ಅನ್ನು ಕರೆಸಿ ಪ್ರವೇಶಿಸಬಹುದು, ಮತ್ತು `trainable` ಗುಣಲಕ್ಷಣವನ್ನು `False` ಗೆ ಸೆಟ್ ಮಾಡಬೇಕಾಗುತ್ತದೆ.\n", - "\n", - "> **Note**: ವೈಶಿಷ್ಟ್ಯಗಳ ತೂಕಗಳನ್ನು ಫ್ರೀಜ್ ಮಾಡುವುದು ಅಗತ್ಯ, ಏಕೆಂದರೆ ಇಲ್ಲದಿದ್ದರೆ ತರಬೇತಿಗೊಳ್ಳದ ವರ್ಗೀಕರಣ ಲೇಯರ್ ಮೂಲ ಪೂರ್ವ-ತರಬೇತಿಗೊಂಡ ಕನ್ವಲ್ಯೂಷನಲ್ ತೂಕಗಳನ್ನು ಹಾಳುಮಾಡಬಹುದು.\n", - "\n", - "ನಮ್ಮ ನೆಟ್‌ವರ್ಕ್‌ನ ಒಟ್ಟು ಪ್ಯಾರಾಮೀಟರ್‌ಗಳ ಸಂಖ್ಯೆ ಸುಮಾರು 15 ಮಿಲಿಯನ್ ಇದ್ದರೂ, ನಾವು ಕೇವಲ 25 ಸಾವಿರ ಪ್ಯಾರಾಮೀಟರ್‌ಗಳನ್ನು ಮಾತ್ರ ತರಬೇತಿಗೊಳಿಸುತ್ತಿದ್ದೇವೆ ಎಂದು ನೀವು ಗಮನಿಸಬಹುದು. ಮೇಲ್ಮಟ್ಟದ ಕನ್ವಲ್ಯೂಷನಲ್ ಫಿಲ್ಟರ್‌ಗಳ ಇತರ ಎಲ್ಲಾ ಪ್ಯಾರಾಮೀಟರ್‌ಗಳು ಪೂರ್ವ-ತರಬೇತಿಗೊಂಡವು. ಇದು ಉತ್ತಮ, ಏಕೆಂದರೆ ನಾವು ಕಡಿಮೆ ಸಂಖ್ಯೆಯ ಉದಾಹರಣೆಗಳೊಂದಿಗೆ ಕಡಿಮೆ ಸಂಖ್ಯೆಯ ಪ್ಯಾರಾಮೀಟರ್‌ಗಳನ್ನು ಸೂಕ್ಷ್ಮವಾಗಿ ಹೊಂದಿಸಬಹುದು.\n", - "\n", - "ನಾವು ಈಗ ನಮ್ಮ ನೆಟ್‌ವರ್ಕ್ ಅನ್ನು ತರಬೇತಿಗೊಳಿಸಿ, ಎಷ್ಟು ಉತ್ತಮವಾಗಬಹುದು ಎಂದು ನೋಡೋಣ. ನಿರೀಕ್ಷಿಸಿ, ಕಾರ್ಯಾಚರಣೆ ಸ್ವಲ್ಪ ಸಮಯ ತೆಗೆದುಕೊಳ್ಳಬಹುದು, ಮತ್ತು ಕಾರ್ಯಾಚರಣೆ ಕೆಲವು ಸಮಯಕ್ಕೆ ಸ್ಥಗಿತಗೊಂಡಂತೆ ಕಾಣಿಸಿದರೂ ಚಿಂತೆ ಮಾಡಬೇಡಿ.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "310/310 [==============================] - 265s 716ms/step - loss: 0.9917 - acc: 0.9512 - val_loss: 0.8156 - val_acc: 0.9671\n" - ] - } - ], - "source": [ - "model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc'])\n", - "hist = model.fit(ds_train, validation_data=ds_test)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "ನಾವು ಸಾಕಷ್ಟು ನಿಖರವಾದ ಬೆಕ್ಕುಗಳು ಮತ್ತು ನಾಯಿ ವರ್ಗೀಕರಣವನ್ನು ಪಡೆದಿದ್ದೇವೆ ಎಂದು ತೋರುತ್ತದೆ!\n", - "\n", - "## ಮಾದರಿಯನ್ನು ಉಳಿಸುವುದು ಮತ್ತು ಲೋಡ್ ಮಾಡುವುದು\n", - "\n", - "ನಾವು ಮಾದರಿಯನ್ನು ತರಬೇತಿಮಾಡಿದ ನಂತರ, ಭವಿಷ್ಯದಲ್ಲಿ ಬಳಸಲು ಮಾದರಿ ರಚನೆ ಮತ್ತು ತರಬೇತಿಗೊಂಡ ತೂಕಗಳನ್ನು ಫೈಲ್‌ಗೆ ಉಳಿಸಬಹುದು:\n" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "INFO:tensorflow:Assets written to: data/cats_dogs.tf/assets\n" - ] - } - ], - "source": [ - "model.save('data/cats_dogs.tf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "ನಾವು ನಂತರ ಯಾವುದೇ ಸಮಯದಲ್ಲಿ ಫೈಲ್‌ನಿಂದ ಮಾದರಿಯನ್ನು ಲೋಡ್ ಮಾಡಬಹುದು. ಮುಂದಿನ ಪ್ರಯೋಗವು ಮಾದರಿಯನ್ನು ನಾಶಮಾಡಿದರೆ ಇದು ನಿಮಗೆ ಉಪಯುಕ್ತವಾಗಬಹುದು - ನೀವು ಆರಂಭದಿಂದಲೇ ಪುನಃ ಪ್ರಾರಂಭಿಸುವ ಅಗತ್ಯವಿರುವುದಿಲ್ಲ.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "model = keras.models.load_model('data/cats_dogs.tf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## ಫೈನ್-ಟ್ಯೂನಿಂಗ್ ಟ್ರಾನ್ಸ್‌ಫರ್ ಲರ್ನಿಂಗ್\n", - "\n", - "ಹಿಂದಿನ ವಿಭಾಗದಲ್ಲಿ, ನಾವು ನಮ್ಮದೇ ಡೇಟಾಸೆಟ್‌ನ ಚಿತ್ರಗಳನ್ನು ವರ್ಗೀಕರಿಸಲು ಅಂತಿಮ ವರ್ಗೀಕರಣ ಲೇಯರ್ ಅನ್ನು ತರಬೇತುಗೊಂಡಿದ್ದೇವೆ. ಆದರೆ, ನಾವು ಫೀಚರ್ ಎಕ್ಸ್ಟ್ರ್ಯಾಕ್ಟರ್ ಅನ್ನು ಮರುತರಬೇತುಗೊಳಿಸಿಲ್ಲ, ಮತ್ತು ನಮ್ಮ ಮಾದರಿ ImageNet ಡೇಟಾದ ಮೇಲೆ ಕಲಿತ ಫೀಚರ್‌ಗಳ ಮೇಲೆ ಅವಲಂಬಿತವಾಗಿದೆ. ನಿಮ್ಮ ವಸ್ತುಗಳು ಸಾಮಾನ್ಯ ImageNet ಚಿತ್ರಗಳಿಂದ ದೃಶ್ಯವಾಗಿ ಭಿನ್ನವಾಗಿದ್ದರೆ, ಈ ಫೀಚರ್‌ಗಳ ಸಂಯೋಜನೆ ಉತ್ತಮವಾಗಿ ಕೆಲಸ ಮಾಡದಿರಬಹುದು. ಆದ್ದರಿಂದ, ಕಾನ್ವಲ್ಯೂಷನಲ್ ಲೇಯರ್‌ಗಳನ್ನು ಕೂಡ ತರಬೇತುಗೊಳಿಸುವುದು ಅರ್ಥಪೂರ್ಣ.\n", - "\n", - "ಅದಕ್ಕಾಗಿ, ನಾವು ಹಿಂದಿನ ಬಾರಿ ಫ್ರೀಜ್ ಮಾಡಿದ್ದ ಕಾನ್ವಲ್ಯೂಷನಲ್ ಫಿಲ್ಟರ್ ಪ್ಯಾರಾಮೀಟರ್‌ಗಳನ್ನು ಅನ್ಫ್ರೀಜ್ ಮಾಡಬಹುದು.\n", - "\n", - "> **Note:** ಮೊದಲಿಗೆ ಪ್ಯಾರಾಮೀಟರ್‌ಗಳನ್ನು ಫ್ರೀಜ್ ಮಾಡಿ, ನಂತರ ವರ್ಗೀಕರಣ ಲೇಯರ್‌ನ ತೂಕಗಳನ್ನು ಸ್ಥಿರಗೊಳಿಸಲು ಹಲವಾರು ಎಪೋಕ್‌ಗಳ ತರಬೇತಿ ನಡೆಸುವುದು ಮುಖ್ಯ. ನೀವು ತಕ್ಷಣವೇ ಅನ್ಫ್ರೀಜ್ ಮಾಡಿದ ಪ್ಯಾರಾಮೀಟರ್‌ಗಳೊಂದಿಗೆ ಎಂಡ್-ಟು-ಎಂಡ್ ನೆಟ್‌ವರ್ಕ್ ತರಬೇತಿ ಪ್ರಾರಂಭಿಸಿದರೆ, ದೊಡ್ಡ ದೋಷಗಳು ಕಾನ್ವಲ್ಯೂಷನಲ್ ಲೇಯರ್‌ಗಳ ಪೂರ್ವ-ತರಬೇತುಗೊಂಡ ತೂಕಗಳನ್ನು ಹಾಳುಮಾಡಬಹುದು.\n", - "\n", - "ನಮ್ಮ ಕಾನ್ವಲ್ಯೂಷನಲ್ VGG-16 ಮಾದರಿ ಮೊದಲ ಲೇಯರ್ ಒಳಗೆ ಇದೆ, ಮತ್ತು ಅದು ಅನೇಕ ಲೇಯರ್‌ಗಳಿಂದ ಕೂಡಿದೆ. ಅದರ ರಚನೆಯನ್ನು ನೋಡಬಹುದು:\n" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Model: \"vgg16\"\n", - "_________________________________________________________________\n", - "Layer (type) Output Shape Param # \n", - "=================================================================\n", - "input_1 (InputLayer) [(None, 224, 224, 3)] 0 \n", - "_________________________________________________________________\n", - "block1_conv1 (Conv2D) (None, 224, 224, 64) 1792 \n", - "_________________________________________________________________\n", - "block1_conv2 (Conv2D) (None, 224, 224, 64) 36928 \n", - "_________________________________________________________________\n", - "block1_pool (MaxPooling2D) (None, 112, 112, 64) 0 \n", - "_________________________________________________________________\n", - "block2_conv1 (Conv2D) (None, 112, 112, 128) 73856 \n", - "_________________________________________________________________\n", - "block2_conv2 (Conv2D) (None, 112, 112, 128) 147584 \n", - "_________________________________________________________________\n", - "block2_pool (MaxPooling2D) (None, 56, 56, 128) 0 \n", - "_________________________________________________________________\n", - "block3_conv1 (Conv2D) (None, 56, 56, 256) 295168 \n", - "_________________________________________________________________\n", - "block3_conv2 (Conv2D) (None, 56, 56, 256) 590080 \n", - "_________________________________________________________________\n", - "block3_conv3 (Conv2D) (None, 56, 56, 256) 590080 \n", - "_________________________________________________________________\n", - "block3_pool (MaxPooling2D) (None, 28, 28, 256) 0 \n", - "_________________________________________________________________\n", - "block4_conv1 (Conv2D) (None, 28, 28, 512) 1180160 \n", - "_________________________________________________________________\n", - "block4_conv2 (Conv2D) (None, 28, 28, 512) 2359808 \n", - "_________________________________________________________________\n", - "block4_conv3 (Conv2D) (None, 28, 28, 512) 2359808 \n", - "_________________________________________________________________\n", - "block4_pool (MaxPooling2D) (None, 14, 14, 512) 0 \n", - "_________________________________________________________________\n", - "block5_conv1 (Conv2D) (None, 14, 14, 512) 2359808 \n", - "_________________________________________________________________\n", - "block5_conv2 (Conv2D) (None, 14, 14, 512) 2359808 \n", - "_________________________________________________________________\n", - "block5_conv3 (Conv2D) (None, 14, 14, 512) 2359808 \n", - "_________________________________________________________________\n", - "block5_pool (MaxPooling2D) (None, 7, 7, 512) 0 \n", - "=================================================================\n", - "Total params: 14,714,688\n", - "Trainable params: 0\n", - "Non-trainable params: 14,714,688\n", - "_________________________________________________________________\n" - ] - } - ], - "source": [ - "model.layers[0].summary()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "ನಾವು ಸಂಯೋಜನಾ ಆಧಾರದ ಎಲ್ಲಾ ಪದರಗಳನ್ನು ಅನ್ಫ್ರೀಜ್ ಮಾಡಬಹುದು:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "model.layers[0].trainable = True" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "ಆದರೆ, ಎಲ್ಲವನ್ನೂ ಒಂದೇ ಸಮಯದಲ್ಲಿ ಅನ್ಫ್ರೀಜ್ ಮಾಡುವುದು ಉತ್ತಮ ಐಡಿಯಾ ಅಲ್ಲ. ನಾವು ಮೊದಲು ಕೆಲವು ಕೊನೆಯ ಕನ್ವಲ್ಯೂಷನ್ ಲೇಯರ್‌ಗಳನ್ನು ಮಾತ್ರ ಅನ್ಫ್ರೀಜ್ ಮಾಡಬಹುದು, ಏಕೆಂದರೆ ಅವು ನಮ್ಮ ಚಿತ್ರಗಳಿಗೆ ಸಂಬಂಧಿಸಿದ ಉನ್ನತ ಮಟ್ಟದ ಮಾದರಿಗಳನ್ನು ಹೊಂದಿವೆ. ಉದಾಹರಣೆಗೆ, ಪ್ರಾರಂಭಿಸಲು, ನಾವು ಕೊನೆಯ 4 ಲೇಯರ್‌ಗಳನ್ನು ಹೊರತುಪಡಿಸಿ ಎಲ್ಲಾ ಲೇಯರ್‌ಗಳನ್ನು ಫ್ರೀಜ್ ಮಾಡಬಹುದು:\n" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Model: \"sequential\"\n", - "_________________________________________________________________\n", - "Layer (type) Output Shape Param # \n", - "=================================================================\n", - "vgg16 (Functional) (None, 7, 7, 512) 14714688 \n", - "_________________________________________________________________\n", - "flatten (Flatten) (None, 25088) 0 \n", - "_________________________________________________________________\n", - "dense (Dense) (None, 1) 25089 \n", - "=================================================================\n", - "Total params: 14,739,777\n", - "Trainable params: 7,104,513\n", - "Non-trainable params: 7,635,264\n", - "_________________________________________________________________\n" - ] - } - ], - "source": [ - "for i in range(len(model.layers[0].layers)-4):\n", - " model.layers[0].layers[i].trainable = False\n", - "model.summary()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "ಟ್ರೇನಬಲ್ ಪ್ಯಾರಾಮೀಟರ್‌ಗಳ ಸಂಖ್ಯೆ ಬಹಳಷ್ಟು ಹೆಚ್ಚಾಗಿದೆ ಎಂದು ಗಮನಿಸಿ, ಆದರೆ ಇದು ಇನ್ನೂ ಎಲ್ಲಾ ಪ್ಯಾರಾಮೀಟರ್‌ಗಳ ಸುತ್ತಮುತ್ತ 50% ಆಗಿದೆ.\n", - "\n", - "ಅನ್‌ಫ್ರೀಜ್ ಮಾಡಿದ ನಂತರ, ನಾವು ಇನ್ನೂ ಕೆಲವು ಎಪೋಕ್‌ಗಳ ತರಬೇತಿಯನ್ನು ಮಾಡಬಹುದು (ನಮ್ಮ ಉದಾಹರಣೆಯಲ್ಲಿ, ನಾವು ಕೇವಲ ಒಂದು ಎಪೋಕ್ ಮಾಡುತ್ತೇವೆ). ಪೂರ್ವ-ತರಬೇತಿಗೊಂಡ ತೂಕಗಳ ಮೇಲೆ ಪರಿಣಾಮವನ್ನು ಕಡಿಮೆ ಮಾಡಲು ನೀವು ಕಡಿಮೆ ಲರ್ನಿಂಗ್ ರೇಟ್ ಆಯ್ಕೆ ಮಾಡಬಹುದು. ಆದಾಗ್ಯೂ, ಕಡಿಮೆ ಲರ್ನಿಂಗ್ ರೇಟ್ ಇದ್ದರೂ, ತರಬೇತಿಯ ಆರಂಭದಲ್ಲಿ ಖಚಿತತೆ ಕುಸಿಯಬಹುದು ಎಂದು ನಿರೀಕ್ಷಿಸಬಹುದು, ಕೊನೆಗೆ ಸ್ಥಿರ ತೂಕಗಳಿಗಿಂತ ಸ್ವಲ್ಪ ಹೆಚ್ಚು ಮಟ್ಟವನ್ನು ತಲುಪುತ್ತದೆ.\n", - "\n", - "> **Note:** ಈ ತರಬೇತಿ ಬಹಳ ನಿಧಾನವಾಗಿ ನಡೆಯುತ್ತದೆ, ಏಕೆಂದರೆ ನಾವು ನೆಟ್‌ವರ್ಕ್‌ನ ಅನೇಕ ಲೇಯರ್‌ಗಳ ಮೂಲಕ ಗ್ರೇಡಿಯಂಟ್‌ಗಳನ್ನು ಹಿಂದಕ್ಕೆ ಹರಿಸಲು ಬೇಕಾಗುತ್ತದೆ!\n" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "310/310 [==============================] - 201s 645ms/step - loss: 0.5270 - acc: 0.9776 - val_loss: 1.4132 - val_acc: 0.9653\n" - ] - } - ], - "source": [ - "hist = model.fit(ds_train, validation_data=ds_test)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "ನಾವು ಹೆಚ್ಚು ಶಕ್ತಿಶಾಲಿ ನೆಟ್‌ವರ್ಕ್ ಮತ್ತು ಹೆಚ್ಚಿನ ಪ್ಯಾರಾಮೀಟರ್‌ಗಳನ್ನು ಬಳಸುತ್ತಿರುವುದರಿಂದ ತರಬೇತಿ ನಿಖರತೆಯನ್ನು ಹೆಚ್ಚಿಸಲು ಸಾಧ್ಯತೆ ಇದೆ, ಆದರೆ ಮಾನ್ಯತೆ ನಿಖರತೆ ಅಷ್ಟಾಗಿ ಹೆಚ್ಚಾಗುವುದಿಲ್ಲ.\n", - "\n", - "ನೀವು ನೆಟ್‌ವರ್ಕ್‌ನ ಇನ್ನಷ್ಟು ಕೆಲವು ಲೇಯರ್‌ಗಳನ್ನು ಅನ್ಫ್ರೀಜ್ ಮಾಡಿ ಹೆಚ್ಚು ತರಬೇತಿ ನೀಡಬಹುದು, ಇದರಿಂದ ನೀವು ಹೆಚ್ಚು ನಿಖರತೆಯನ್ನು ಸಾಧಿಸಬಹುದೇ ಎಂದು ನೋಡಬಹುದು!\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## ಇತರೆ ಕಂಪ್ಯೂಟರ್ ವೀಕ್ಷಣಾ ಮಾದರಿಗಳು\n", - "\n", - "VGG-16 ಅತ್ಯಂತ ಸರಳ ಕಂಪ್ಯೂಟರ್ ವೀಕ್ಷಣಾ ವಾಸ್ತುಶಿಲ್ಪಗಳಲ್ಲಿ ಒಂದಾಗಿದೆ. Keras ಇನ್ನಷ್ಟು ಪೂರ್ವ-ಪ್ರಶಿಕ್ಷಿತ ನೆಟ್‌ವರ್ಕ್‌ಗಳನ್ನು ಒದಗಿಸುತ್ತದೆ. ಅವುಗಳಲ್ಲಿ ಅತ್ಯಂತ ಹೆಚ್ಚು ಬಳಸುವವು Microsoft ಅಭಿವೃದ್ಧಿಪಡಿಸಿದ **ResNet** ವಾಸ್ತುಶಿಲ್ಪಗಳು ಮತ್ತು Google ನ **Inception** ಆಗಿವೆ. ಉದಾಹರಣೆಗೆ, ಸರಳವಾದ ResNet-50 ಮಾದರಿಯ ವಾಸ್ತುಶಿಲ್ಪವನ್ನು ಪರಿಶೀಲಿಸೋಣ (ResNet ವಿವಿಧ ಆಳದ ಮಾದರಿಗಳ ಕುಟುಂಬ, ನೀವು ResNet-152 ಅನ್ನು ಪ್ರಯೋಗಿಸಿ ನೋಡಬಹುದು, ಅದು ನಿಜವಾಗಿಯೂ ಆಳವಾದ ಮಾದರಿ ಹೇಗಿರುತ್ತದೆ ಎಂಬುದನ್ನು ತಿಳಿಯಲು):\n" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Model: \"resnet50\"\n", - "__________________________________________________________________________________________________\n", - "Layer (type) Output Shape Param # Connected to \n", - "==================================================================================================\n", - "input_3 (InputLayer) [(None, 224, 224, 3) 0 \n", - "__________________________________________________________________________________________________\n", - "conv1_pad (ZeroPadding2D) (None, 230, 230, 3) 0 input_3[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv1_conv (Conv2D) (None, 112, 112, 64) 9472 conv1_pad[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv1_bn (BatchNormalization) (None, 112, 112, 64) 256 conv1_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv1_relu (Activation) (None, 112, 112, 64) 0 conv1_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "pool1_pad (ZeroPadding2D) (None, 114, 114, 64) 0 conv1_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "pool1_pool (MaxPooling2D) (None, 56, 56, 64) 0 pool1_pad[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block1_1_conv (Conv2D) (None, 56, 56, 64) 4160 pool1_pool[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block1_1_bn (BatchNormali (None, 56, 56, 64) 256 conv2_block1_1_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block1_1_relu (Activation (None, 56, 56, 64) 0 conv2_block1_1_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block1_2_conv (Conv2D) (None, 56, 56, 64) 36928 conv2_block1_1_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block1_2_bn (BatchNormali (None, 56, 56, 64) 256 conv2_block1_2_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block1_2_relu (Activation (None, 56, 56, 64) 0 conv2_block1_2_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block1_0_conv (Conv2D) (None, 56, 56, 256) 16640 pool1_pool[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block1_3_conv (Conv2D) (None, 56, 56, 256) 16640 conv2_block1_2_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block1_0_bn (BatchNormali (None, 56, 56, 256) 1024 conv2_block1_0_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block1_3_bn (BatchNormali (None, 56, 56, 256) 1024 conv2_block1_3_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block1_add (Add) (None, 56, 56, 256) 0 conv2_block1_0_bn[0][0] \n", - " conv2_block1_3_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block1_out (Activation) (None, 56, 56, 256) 0 conv2_block1_add[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block2_1_conv (Conv2D) (None, 56, 56, 64) 16448 conv2_block1_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block2_1_bn (BatchNormali (None, 56, 56, 64) 256 conv2_block2_1_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block2_1_relu (Activation (None, 56, 56, 64) 0 conv2_block2_1_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block2_2_conv (Conv2D) (None, 56, 56, 64) 36928 conv2_block2_1_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block2_2_bn (BatchNormali (None, 56, 56, 64) 256 conv2_block2_2_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block2_2_relu (Activation (None, 56, 56, 64) 0 conv2_block2_2_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block2_3_conv (Conv2D) (None, 56, 56, 256) 16640 conv2_block2_2_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block2_3_bn (BatchNormali (None, 56, 56, 256) 1024 conv2_block2_3_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block2_add (Add) (None, 56, 56, 256) 0 conv2_block1_out[0][0] \n", - " conv2_block2_3_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block2_out (Activation) (None, 56, 56, 256) 0 conv2_block2_add[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block3_1_conv (Conv2D) (None, 56, 56, 64) 16448 conv2_block2_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block3_1_bn (BatchNormali (None, 56, 56, 64) 256 conv2_block3_1_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block3_1_relu (Activation (None, 56, 56, 64) 0 conv2_block3_1_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block3_2_conv (Conv2D) (None, 56, 56, 64) 36928 conv2_block3_1_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block3_2_bn (BatchNormali (None, 56, 56, 64) 256 conv2_block3_2_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block3_2_relu (Activation (None, 56, 56, 64) 0 conv2_block3_2_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block3_3_conv (Conv2D) (None, 56, 56, 256) 16640 conv2_block3_2_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block3_3_bn (BatchNormali (None, 56, 56, 256) 1024 conv2_block3_3_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block3_add (Add) (None, 56, 56, 256) 0 conv2_block2_out[0][0] \n", - " conv2_block3_3_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block3_out (Activation) (None, 56, 56, 256) 0 conv2_block3_add[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block1_1_conv (Conv2D) (None, 28, 28, 128) 32896 conv2_block3_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block1_1_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block1_1_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block1_1_relu (Activation (None, 28, 28, 128) 0 conv3_block1_1_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block1_2_conv (Conv2D) (None, 28, 28, 128) 147584 conv3_block1_1_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block1_2_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block1_2_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block1_2_relu (Activation (None, 28, 28, 128) 0 conv3_block1_2_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block1_0_conv (Conv2D) (None, 28, 28, 512) 131584 conv2_block3_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block1_3_conv (Conv2D) (None, 28, 28, 512) 66048 conv3_block1_2_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block1_0_bn (BatchNormali (None, 28, 28, 512) 2048 conv3_block1_0_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block1_3_bn (BatchNormali (None, 28, 28, 512) 2048 conv3_block1_3_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block1_add (Add) (None, 28, 28, 512) 0 conv3_block1_0_bn[0][0] \n", - " conv3_block1_3_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block1_out (Activation) (None, 28, 28, 512) 0 conv3_block1_add[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block2_1_conv (Conv2D) (None, 28, 28, 128) 65664 conv3_block1_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block2_1_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block2_1_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block2_1_relu (Activation (None, 28, 28, 128) 0 conv3_block2_1_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block2_2_conv (Conv2D) (None, 28, 28, 128) 147584 conv3_block2_1_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block2_2_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block2_2_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block2_2_relu (Activation (None, 28, 28, 128) 0 conv3_block2_2_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block2_3_conv (Conv2D) (None, 28, 28, 512) 66048 conv3_block2_2_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block2_3_bn (BatchNormali (None, 28, 28, 512) 2048 conv3_block2_3_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block2_add (Add) (None, 28, 28, 512) 0 conv3_block1_out[0][0] \n", - " conv3_block2_3_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block2_out (Activation) (None, 28, 28, 512) 0 conv3_block2_add[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block3_1_conv (Conv2D) (None, 28, 28, 128) 65664 conv3_block2_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block3_1_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block3_1_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block3_1_relu (Activation (None, 28, 28, 128) 0 conv3_block3_1_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block3_2_conv (Conv2D) (None, 28, 28, 128) 147584 conv3_block3_1_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block3_2_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block3_2_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block3_2_relu (Activation (None, 28, 28, 128) 0 conv3_block3_2_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block3_3_conv (Conv2D) (None, 28, 28, 512) 66048 conv3_block3_2_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block3_3_bn (BatchNormali (None, 28, 28, 512) 2048 conv3_block3_3_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block3_add (Add) (None, 28, 28, 512) 0 conv3_block2_out[0][0] \n", - " conv3_block3_3_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block3_out (Activation) (None, 28, 28, 512) 0 conv3_block3_add[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block4_1_conv (Conv2D) (None, 28, 28, 128) 65664 conv3_block3_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block4_1_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block4_1_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block4_1_relu (Activation (None, 28, 28, 128) 0 conv3_block4_1_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block4_2_conv (Conv2D) (None, 28, 28, 128) 147584 conv3_block4_1_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block4_2_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block4_2_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block4_2_relu (Activation (None, 28, 28, 128) 0 conv3_block4_2_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block4_3_conv (Conv2D) (None, 28, 28, 512) 66048 conv3_block4_2_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block4_3_bn (BatchNormali (None, 28, 28, 512) 2048 conv3_block4_3_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block4_add (Add) (None, 28, 28, 512) 0 conv3_block3_out[0][0] \n", - " conv3_block4_3_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block4_out (Activation) (None, 28, 28, 512) 0 conv3_block4_add[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block1_1_conv (Conv2D) (None, 14, 14, 256) 131328 conv3_block4_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block1_1_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block1_1_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block1_1_relu (Activation (None, 14, 14, 256) 0 conv4_block1_1_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block1_2_conv (Conv2D) (None, 14, 14, 256) 590080 conv4_block1_1_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block1_2_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block1_2_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block1_2_relu (Activation (None, 14, 14, 256) 0 conv4_block1_2_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block1_0_conv (Conv2D) (None, 14, 14, 1024) 525312 conv3_block4_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block1_3_conv (Conv2D) (None, 14, 14, 1024) 263168 conv4_block1_2_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block1_0_bn (BatchNormali (None, 14, 14, 1024) 4096 conv4_block1_0_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block1_3_bn (BatchNormali (None, 14, 14, 1024) 4096 conv4_block1_3_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block1_add (Add) (None, 14, 14, 1024) 0 conv4_block1_0_bn[0][0] \n", - " conv4_block1_3_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block1_out (Activation) (None, 14, 14, 1024) 0 conv4_block1_add[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block2_1_conv (Conv2D) (None, 14, 14, 256) 262400 conv4_block1_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block2_1_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block2_1_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block2_1_relu (Activation (None, 14, 14, 256) 0 conv4_block2_1_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block2_2_conv (Conv2D) (None, 14, 14, 256) 590080 conv4_block2_1_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block2_2_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block2_2_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block2_2_relu (Activation (None, 14, 14, 256) 0 conv4_block2_2_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block2_3_conv (Conv2D) (None, 14, 14, 1024) 263168 conv4_block2_2_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block2_3_bn (BatchNormali (None, 14, 14, 1024) 4096 conv4_block2_3_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block2_add (Add) (None, 14, 14, 1024) 0 conv4_block1_out[0][0] \n", - " conv4_block2_3_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block2_out (Activation) (None, 14, 14, 1024) 0 conv4_block2_add[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block3_1_conv (Conv2D) (None, 14, 14, 256) 262400 conv4_block2_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block3_1_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block3_1_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block3_1_relu (Activation (None, 14, 14, 256) 0 conv4_block3_1_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block3_2_conv (Conv2D) (None, 14, 14, 256) 590080 conv4_block3_1_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block3_2_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block3_2_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block3_2_relu (Activation (None, 14, 14, 256) 0 conv4_block3_2_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block3_3_conv (Conv2D) (None, 14, 14, 1024) 263168 conv4_block3_2_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block3_3_bn (BatchNormali (None, 14, 14, 1024) 4096 conv4_block3_3_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block3_add (Add) (None, 14, 14, 1024) 0 conv4_block2_out[0][0] \n", - " conv4_block3_3_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block3_out (Activation) (None, 14, 14, 1024) 0 conv4_block3_add[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block4_1_conv (Conv2D) (None, 14, 14, 256) 262400 conv4_block3_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block4_1_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block4_1_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block4_1_relu (Activation (None, 14, 14, 256) 0 conv4_block4_1_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block4_2_conv (Conv2D) (None, 14, 14, 256) 590080 conv4_block4_1_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block4_2_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block4_2_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block4_2_relu (Activation (None, 14, 14, 256) 0 conv4_block4_2_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block4_3_conv (Conv2D) (None, 14, 14, 1024) 263168 conv4_block4_2_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block4_3_bn (BatchNormali (None, 14, 14, 1024) 4096 conv4_block4_3_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block4_add (Add) (None, 14, 14, 1024) 0 conv4_block3_out[0][0] \n", - " conv4_block4_3_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block4_out (Activation) (None, 14, 14, 1024) 0 conv4_block4_add[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block5_1_conv (Conv2D) (None, 14, 14, 256) 262400 conv4_block4_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block5_1_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block5_1_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block5_1_relu (Activation (None, 14, 14, 256) 0 conv4_block5_1_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block5_2_conv (Conv2D) (None, 14, 14, 256) 590080 conv4_block5_1_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block5_2_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block5_2_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block5_2_relu (Activation (None, 14, 14, 256) 0 conv4_block5_2_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block5_3_conv (Conv2D) (None, 14, 14, 1024) 263168 conv4_block5_2_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block5_3_bn (BatchNormali (None, 14, 14, 1024) 4096 conv4_block5_3_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block5_add (Add) (None, 14, 14, 1024) 0 conv4_block4_out[0][0] \n", - " conv4_block5_3_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block5_out (Activation) (None, 14, 14, 1024) 0 conv4_block5_add[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block6_1_conv (Conv2D) (None, 14, 14, 256) 262400 conv4_block5_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block6_1_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block6_1_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block6_1_relu (Activation (None, 14, 14, 256) 0 conv4_block6_1_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block6_2_conv (Conv2D) (None, 14, 14, 256) 590080 conv4_block6_1_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block6_2_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block6_2_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block6_2_relu (Activation (None, 14, 14, 256) 0 conv4_block6_2_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block6_3_conv (Conv2D) (None, 14, 14, 1024) 263168 conv4_block6_2_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block6_3_bn (BatchNormali (None, 14, 14, 1024) 4096 conv4_block6_3_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block6_add (Add) (None, 14, 14, 1024) 0 conv4_block5_out[0][0] \n", - " conv4_block6_3_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block6_out (Activation) (None, 14, 14, 1024) 0 conv4_block6_add[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block1_1_conv (Conv2D) (None, 7, 7, 512) 524800 conv4_block6_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block1_1_bn (BatchNormali (None, 7, 7, 512) 2048 conv5_block1_1_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block1_1_relu (Activation (None, 7, 7, 512) 0 conv5_block1_1_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block1_2_conv (Conv2D) (None, 7, 7, 512) 2359808 conv5_block1_1_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block1_2_bn (BatchNormali (None, 7, 7, 512) 2048 conv5_block1_2_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block1_2_relu (Activation (None, 7, 7, 512) 0 conv5_block1_2_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block1_0_conv (Conv2D) (None, 7, 7, 2048) 2099200 conv4_block6_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block1_3_conv (Conv2D) (None, 7, 7, 2048) 1050624 conv5_block1_2_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block1_0_bn (BatchNormali (None, 7, 7, 2048) 8192 conv5_block1_0_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block1_3_bn (BatchNormali (None, 7, 7, 2048) 8192 conv5_block1_3_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block1_add (Add) (None, 7, 7, 2048) 0 conv5_block1_0_bn[0][0] \n", - " conv5_block1_3_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block1_out (Activation) (None, 7, 7, 2048) 0 conv5_block1_add[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block2_1_conv (Conv2D) (None, 7, 7, 512) 1049088 conv5_block1_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block2_1_bn (BatchNormali (None, 7, 7, 512) 2048 conv5_block2_1_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block2_1_relu (Activation (None, 7, 7, 512) 0 conv5_block2_1_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block2_2_conv (Conv2D) (None, 7, 7, 512) 2359808 conv5_block2_1_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block2_2_bn (BatchNormali (None, 7, 7, 512) 2048 conv5_block2_2_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block2_2_relu (Activation (None, 7, 7, 512) 0 conv5_block2_2_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block2_3_conv (Conv2D) (None, 7, 7, 2048) 1050624 conv5_block2_2_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block2_3_bn (BatchNormali (None, 7, 7, 2048) 8192 conv5_block2_3_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block2_add (Add) (None, 7, 7, 2048) 0 conv5_block1_out[0][0] \n", - " conv5_block2_3_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block2_out (Activation) (None, 7, 7, 2048) 0 conv5_block2_add[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block3_1_conv (Conv2D) (None, 7, 7, 512) 1049088 conv5_block2_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block3_1_bn (BatchNormali (None, 7, 7, 512) 2048 conv5_block3_1_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block3_1_relu (Activation (None, 7, 7, 512) 0 conv5_block3_1_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block3_2_conv (Conv2D) (None, 7, 7, 512) 2359808 conv5_block3_1_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block3_2_bn (BatchNormali (None, 7, 7, 512) 2048 conv5_block3_2_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block3_2_relu (Activation (None, 7, 7, 512) 0 conv5_block3_2_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block3_3_conv (Conv2D) (None, 7, 7, 2048) 1050624 conv5_block3_2_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block3_3_bn (BatchNormali (None, 7, 7, 2048) 8192 conv5_block3_3_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block3_add (Add) (None, 7, 7, 2048) 0 conv5_block2_out[0][0] \n", - " conv5_block3_3_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block3_out (Activation) (None, 7, 7, 2048) 0 conv5_block3_add[0][0] \n", - "__________________________________________________________________________________________________\n", - "avg_pool (GlobalAveragePooling2 (None, 2048) 0 conv5_block3_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "predictions (Dense) (None, 1000) 2049000 avg_pool[0][0] \n", - "==================================================================================================\n", - "Total params: 25,636,712\n", - "Trainable params: 25,583,592\n", - "Non-trainable params: 53,120\n", - "__________________________________________________________________________________________________\n" - ] - } - ], - "source": [ - "resnet = keras.applications.ResNet50()\n", - "resnet.summary()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "ನೀವು ನೋಡಬಹುದು, ಮಾದರಿಯಲ್ಲಿ ಅದೇ ಪರಿಚಿತ ಕಟ್ಟಡ ಘಟಕಗಳು ಇವೆ: ಸಂಯೋಜನಾ ಪದರಗಳು, ಪೂಲಿಂಗ್ ಪದರಗಳು ಮತ್ತು ಅಂತಿಮ ದಟ್ಟವಾದ ವರ್ಗೀಕರಣಕಾರ. ನಾವು ಈ ಮಾದರಿಯನ್ನು VGG-16 ಅನ್ನು ವರ್ಗಾಂತರ ಕಲಿಕೆಗೆ ಬಳಸಿದಂತೆ ನಿಖರವಾಗಿ ಅದೇ ರೀತಿಯಲ್ಲಿ ಬಳಸಬಹುದು. ಮೇಲಿನ ಕೋಡ್‌ನೊಂದಿಗೆ ಪ್ರಯೋಗ ಮಾಡಿ, ಬೇಸ್ ಮಾದರಿಯಾಗಿ ವಿಭಿನ್ನ ResNet ಮಾದರಿಗಳನ್ನು ಬಳಸಿಕೊಂಡು, ನಿಖರತೆ ಹೇಗೆ ಬದಲಾಗುತ್ತದೆ ಎಂದು ನೋಡಬಹುದು.\n", - "\n", - "## ಬ್ಯಾಚ್ ನಾರ್ಮಲೈಜೆಷನ್\n", - "\n", - "ಈ ಜಾಲದಲ್ಲಿ ಇನ್ನೊಂದು ರೀತಿಯ ಪದರವಿದೆ: **ಬ್ಯಾಚ್ ನಾರ್ಮಲೈಜೆಷನ್**. ಬ್ಯಾಚ್ ನಾರ್ಮಲೈಜೆಷನ್‌ನ ಆಲೋಚನೆ ಎಂದರೆ ನ್ಯೂರಲ್ ನೆಟ್‌ವರ್ಕ್ ಮೂಲಕ ಹರಿಯುವ ಮೌಲ್ಯಗಳನ್ನು ಸರಿಯಾದ ವ್ಯಾಪ್ತಿಗೆ ತರುವುದಾಗಿದೆ. ಸಾಮಾನ್ಯವಾಗಿ ನ್ಯೂರಲ್ ನೆಟ್‌ವರ್ಕ್‌ಗಳು ಎಲ್ಲಾ ಮೌಲ್ಯಗಳು [-1,1] ಅಥವಾ [0,1] ವ್ಯಾಪ್ತಿಯಲ್ಲಿ ಇದ್ದಾಗ ಉತ್ತಮವಾಗಿ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತವೆ, ಅದಕ್ಕಾಗಿ ನಾವು ನಮ್ಮ ಇನ್‌ಪುಟ್ ಡೇಟಾವನ್ನು ಅನುಗುಣವಾಗಿ ಮಾಪನ/ನಾರ್ಮಲೈಸ್ ಮಾಡುತ್ತೇವೆ. ಆದರೆ, ಆಳವಾದ ಜಾಲದ ತರಬೇತಿಯಲ್ಲಿ, ಮೌಲ್ಯಗಳು ಈ ವ್ಯಾಪ್ತಿಯಿಂದ ಬಹಳಷ್ಟು ಹೊರಗೆ ಹೋಗಬಹುದು, ಇದರಿಂದ ತರಬೇತಿ ಸಮಸ್ಯೆಯಾಗುತ್ತದೆ. ಬ್ಯಾಚ್ ನಾರ್ಮಲೈಜೆಷನ್ ಪದರವು ಪ್ರಸ್ತುತ ಮಿನಿಬ್ಯಾಚ್‌ನ ಎಲ್ಲಾ ಮೌಲ್ಯಗಳ ಸರಾಸರಿ ಮತ್ತು ಮಾನಕ ವಿಚಲನವನ್ನು ಲೆಕ್ಕಹಾಕಿ, ಅವುಗಳನ್ನು ಬಳಸಿ ಸಿಗ್ನಲ್ ಅನ್ನು ನಾರ್ಮಲೈಸ್ ಮಾಡಿ ನಂತರ ನ್ಯೂರಲ್ ನೆಟ್‌ವರ್ಕ್ ಪದರಕ್ಕೆ ಕಳುಹಿಸುತ್ತದೆ. ಇದು ಆಳವಾದ ಜಾಲಗಳ ಸ್ಥಿರತೆಯನ್ನು ಬಹಳಷ್ಟು ಸುಧಾರಿಸುತ್ತದೆ.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## ಮುಖ್ಯಾಂಶ\n", - "\n", - "ಟ್ರಾನ್ಸ್‌ಫರ್ ಲರ್ನಿಂಗ್ ಬಳಸಿ, ನಾವು ನಮ್ಮ ಕಸ್ಟಮ್ ವಸ್ತು ವರ್ಗೀಕರಣ ಕಾರ್ಯಕ್ಕಾಗಿ ಶೀಘ್ರವಾಗಿ ಕ್ಲಾಸಿಫೈಯರ್ ರಚಿಸಿ, ಹೆಚ್ಚಿನ ನಿಖರತೆಯನ್ನು ಸಾಧಿಸಬಹುದು. ಆದರೆ, ಈ ಉದಾಹರಣೆ ಸಂಪೂರ್ಣವಾಗಿ ನ್ಯಾಯಸಮ್ಮತವಾಗಿರಲಿಲ್ಲ, ಏಕೆಂದರೆ ಮೂಲ VGG-16 ನೆಟ್‌ವರ್ಕ್ ಬೆಕ್ಕು ಮತ್ತು ನಾಯಿ ಗುರುತಿಸಲು ಪೂರ್ವಪ್ರಶಿಕ್ಷಿತವಾಗಿತ್ತು, ಆದ್ದರಿಂದ ನಾವು ನೆಟ್‌ವರ್ಕ್‌ನಲ್ಲಿ ಈಗಾಗಲೇ ಇದ್ದ ಹೆಚ್ಚಿನ ಮಾದರಿಗಳನ್ನು ಮರುಬಳಕೆ ಮಾಡುತ್ತಿದ್ದೇವೆ. ನೀವು ಹೆಚ್ಚು ವಿಶಿಷ್ಟ ಕ್ಷೇತ್ರ-ನಿರ್ದಿಷ್ಟ ವಸ್ತುಗಳ ಮೇಲೆ ಕಡಿಮೆ ನಿಖರತೆಯನ್ನು ನಿರೀಕ್ಷಿಸಬಹುದು, ಉದಾಹರಣೆಗೆ ಕಾರ್ಖಾನೆ ಉತ್ಪಾದನಾ ಲೈನ್‌ನ ವಿವರಗಳು ಅಥವಾ ವಿಭಿನ್ನ ಮರದ ಎಲೆಗಳು.\n", - "\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" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "py38_tensorflow", - "language": "python", - "name": "conda-env-py38_tensorflow-py" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.10" - }, - "coopTranslator": { - "original_hash": "c189abc107848f96051085cc30945129", - "translation_date": "2025-11-26T01:01:43+00:00", - "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", - "language_code": "kn" - } - }, - "nbformat": 4, - "nbformat_minor": 4 +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# ಪೂರ್ವ-ತರಬೇತಿ ಮಾಡಲಾದ ಮಾದರಿಗಳು ಮತ್ತು ವರ್ಗಾವಣೆ ಕಲಿಕೆ\n", + "\n", + "CNNಗಳನ್ನು ತರಬೇತಿಗೆ ಹೆಚ್ಚು ಸಮಯ ಬೇಕಾಗುತ್ತದೆ ಮತ್ತು ಈ ಕಾರ್ಯಕ್ಕಾಗಿ ಹೆಚ್ಚಿನ ಡೇಟಾ ಅಗತ್ಯವಿದೆ. ಆದರೆ, ಬಹುಮಾನವಾಗಿಯೂ ಸಮಯವನ್ನು ನೆಟ್ವರ್ಕ್ ಇಮೇಜ್‌ಗಳಿಂದ ಮಾದರಿಗಳನ್ನು ಹೊರತೆಗೆದುಕೊಳ್ಳಲು ಬಳಸುವ ಉತ್ತಮ ಕಡಿಮೆ-ಮಟ್ಟದ ಫಿಲ್ಟರ್‌ಗಳನ್ನು ಕಲಿಯಲು ಕಳೆಯುತ್ತದೆ. ಒಂದು ಸಹಜ ಪ್ರಶ್ನೆ ಉದ್ಭವಿಸುತ್ತದೆ - ಒಂದೇ ಡೇಟಾಸೆಟ್‌ನಲ್ಲಿ ತರಬೇತುಗೊಂಡ ನಿರೂಪಕ ನೆಟ್ವರ್ಕ್ ಅನ್ನು ನಾವು ಬಳಸಿಕೊಂಡು ಸಂಪೂರ್ಣ ತರಬೇತಿ ಪ್ರಕ್ರಿಯೆಯಿಲ್ಲದೆ ವಿಭಿನ್ನ ಚಿತ್ರಗಳನ್ನು ವರ್ಗೀಕರಿಸಲು ಹೊಂದಿಕೊಳ್ಳಬಹುದೇ?\n", + "\n", + "ಈ ವಿಧಾನವನ್ನು **ವರ್ಗಾವಣೆ ಕಲಿಕೆ** ಎಂದು ಕರೆಯುತ್ತಾರೆ, ಏಕೆಂದರೆ ನಾವು ಒಂದೊಂದು ನಿರೂಪಕ ನೆಟ್‌ವರ್ಕ್ ಮಾದರಿಯಿಂದ ಇನ್ನೊಂದಕ್ಕೆ ಕೆಲವು ಜ್ಞಾನವನ್ನು ವರ್ಗಾಯಿಸುವುದು. ವರ್ಗಾವಣೆ ಕಲಿಕೆಯಲ್ಲಿ, ನಾವು ಸಾಮಾನ್ಯವಾಗಿ ದೊಡ್ಡ ಚಿತ್ರ ಡೇಟಾಸೆಟ್‌ನ ಮೇಲೆ ತರಬೇತುಗೊಂಡಿರುವ ಪೂರ್ವ-ತರಬೇತಿ ಮಾಡಲಾದ ಮಾದರಿಯಿಂದ ಪ್ರಾರಂಭಿಸುತ್ತೇವೆ, ಉದಾಹರಣೆಗೆ **ImageNet**. ಆ ಮಾದರಿಗಳು ಈಗಾಗಲೇ ಸಾಮಾನ್ಯ ಚಿತ್ರಗಳಿಂದ ವೈವಿಧ್ಯಮಯ ಲಕ್ಷಣಗಳನ್ನು ಬಂದಿದೆ ಹೊಡೆಯಲು ಉತ್ತಮ ಕೆಲಸ ಮಾಡಬಹುದು, ಮತ್ತು ಅನೇಕ ಸಂದರ್ಭಗಳಲ್ಲಿ ಆ ಹೊರತೆಗೆಯಲ್ಪಟ್ಟ ಲಕ್ಷಣಗಳ ಮೇಲೆ ಕೇವಲ ವರ್ಗೀಕರಿಸುವ ಮಾದರಿಯನ್ನು ನಿರ್ಮಿಸುವುದು ಉತ್ತಮ ಫಲಿತಾಂಶ ನೀಡಬಹುದು.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import tensorflow as tf\n", + "from tensorflow import keras\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import os\n", + "from tfcv import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## ಬೆಕ್ಕುಗಳು ಮತ್ತು ನಾಯಿಗಳು ಡೇಟಾಸೆಟ್\n", + "\n", + "ಈ ಘಟಕದಲ್ಲಿ, ನಾವು ಬೆಕ್ಕುಗಳು ಮತ್ತು ನಾಯಿಗಳ ಚಿತ್ರಗಳನ್ನು ವರ್ಗೀಕರಿಸುವ ನೈಜ ಜೀವನದ ಸಮಸ್ಯೆಯನ್ನು ಪರಿಹರಿಸುವೆವು. ಇದಕ್ಕಾಗಿ, ನಾವು [Kaggle Cats vs. Dogs Dataset](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" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "if not os.path.exists('data/kagglecatsanddogs_5340.zip'):\n", + " !wget -P data https://download.microsoft.com/download/3/E/1/3E1C3F21-ECDB-4869-8368-6DEBA77B919F/kagglecatsanddogs_5340.zip" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import zipfile\n", + "if not os.path.exists('data/PetImages'):\n", + " with zipfile.ZipFile('data/kagglecatsanddogs_5340.zip', 'r') as zip_ref:\n", + " zip_ref.extractall('data')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "ದುರದೃಷ್ಟವಶಾತ್, ಡೇಟಾಸೆಟ್‌ನಲ್ಲಿ ಕೆಲವು ಹಾನಿಯಾದ ಚಿತ್ರ ಫೈಲ್‌ಗಳಿವೆ. ಹಾನಿಯಾದ ಫೈಲ್‌ಗಳನ್ನು ಪರಿಶೀಲಿಸಲು ತ್ವರಿತ ಶುದ್ಧೀಕರಣ ಮಾಡಲು ನಮಗೆ ಬೇಕಾಗಿದೆ. ಈ ಟ್ಯುತೋರियल‌ಗೆ ಹಾನಿ ಮಾಡದಂತೆ, ನಾವು ಡೇಟಾಸೆಟ್ ಪರಿಶೀಲಿಸಲು ಕೋಡ್ ಅನ್ನು ಒಂದು ಮড್ಯೂಲ್‌ಗೆ ಸ್ಥಳಾಂತರಿಸಿದ್ದೇವೆ.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Corrupt image or wrong format: data/PetImages/Cat/12235.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/2663.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/4929.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/8183.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/11083.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/6435.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/6491.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/7968.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/6768.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/11397.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/8295.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/4874.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/23.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/11864.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/3491.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/11729.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/3197.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/10874.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/6376.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/9361.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/9328.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/910.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/2021.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/666.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/3710.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/9171.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/6906.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/11095.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/660.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/8415.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/3161.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/850.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/7003.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/1267.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/7642.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/8553.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/6900.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/4334.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/10404.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/6980.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/936.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/9619.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/3300.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/7647.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/2742.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/9565.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/1757.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/11874.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/1936.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/5077.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/7845.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/8832.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/11935.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/9208.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/4322.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/7978.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/10820.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/391.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/10073.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/8958.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/8470.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/445.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/4821.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/11565.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/4351.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/4833.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/140.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/3153.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/5370.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/5819.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/3649.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/4293.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/3967.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/1937.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/10125.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/1386.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/4750.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/6029.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/5614.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/2569.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/9778.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/6486.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/11210.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/7502.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/2189.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/1151.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/4629.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/12080.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/10501.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/1914.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/11086.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/4000.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/9100.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/5553.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/12269.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/5243.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/3288.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/11912.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/3320.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/11166.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/8194.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/2353.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/9026.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/8557.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/7969.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/8693.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/4367.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/1900.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/5730.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/9961.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/8126.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/8521.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/11560.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/11233.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/11675.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/8889.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/9414.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/3588.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/10353.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/10733.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/6238.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/5618.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/7743.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/10747.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/6503.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/11410.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/5955.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/2915.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/3136.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/4086.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/2905.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/2494.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/3546.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/5547.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/9851.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/9188.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/4203.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/8715.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/4640.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/1866.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/7718.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/7514.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/1017.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/12102.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/296.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/6718.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/11253.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/10173.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/11849.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/10383.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/10678.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/5790.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/6318.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/1884.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/4654.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/9145.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/2479.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/12289.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/2688.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/4134.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/10637.jpg\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/anaconda/envs/py38_tensorflow/lib/python3.8/site-packages/PIL/TiffImagePlugin.py:793: UserWarning: Truncated File Read\n", + " warnings.warn(str(msg))\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Corrupt image or wrong format: data/PetImages/Dog/543.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/8730.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/12114.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/522.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/10863.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/10401.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/7739.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/561.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/1308.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/9643.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/3155.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/5736.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/4257.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/11853.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/6855.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/1259.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/7652.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/573.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/11702.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/414.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/4301.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/9500.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/10726.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/9367.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/2877.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/10907.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/10972.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/7311.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/10797.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/2317.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/7128.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/6500.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/11285.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/6430.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/6032.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/10969.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/8364.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/11692.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/3038.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/5604.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/565.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/9640.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/7459.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/6305.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/6555.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/11590.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/6059.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/3927.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/10705.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/2384.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/3885.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/663.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/9043.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/8563.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/9556.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/9967.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/10158.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/5263.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/8641.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/7369.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/4924.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/10351.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/6213.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/5104.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/1356.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/7133.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/7112.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/1168.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/719.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/50.jpg\n" + ] + } + ], + "source": [ + "check_image_dir('data/PetImages/Cat/*.jpg')\n", + "check_image_dir('data/PetImages/Dog/*.jpg')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## ಡೇಟಾಸೆಟ್ ಅನ್ನು ಲೋಡ್ ಮಾಡುವುದು\n", + "\n", + "ಹಿಂದಿನ ಉದಾಹರಣೆಗಳಲ್ಲಿ, ನಾವು ಕೇರಾಸ್‌ನಲ್ಲಿ ಬಿಲ್ಟ್-ಇನ್ ಆಗಿರುವ ಡೇಟಾಸೆಟ್‌ಗಳನ್ನು ಲೋಡ್ ಮಾಡುತ್ತಿದ್ದೇವೆ. ಈಗ ನಾವು ನಮ್ಮದೇ ಡೇಟಾಸೆಟ್ ಅನ್ನು ಸಂಭಾಳಿಸಬೇಕಾಗಿದೆ, ಅದನ್ನು ಚಿತ್ರಗಳ ಡೈರಕ್ಟರಿಯಿಂದ ಲೋಡ್ ಮಾಡಬೇಕಾಗಿದೆ.\n", + "\n", + "ನೈಜ ಜೀವನದಲ್ಲಿ, ಚಿತ್ರ ಡೇಟಾಸೆಟ್‌ಗಳ ಗಾತ್ರ ಬಹಳ ದೊಡ್ಡದಾಗಬಹುದು, ಮತ್ತು ಎಲ್ಲಾ ಡೇಟಾ ಸ್ಮೃತಿಯಲ್ಲಿ ಫಿಟ್ ಆಗುವುದಿಲ್ಲ ಎಂದು ನಂಬಲಾಗದು. ಆದ್ದರಿಂದ, ಡೇಟಾಸೆಟ್‌ಗಳನ್ನು ಸಾಮಾನ್ಯವಾಗಿ ತರಬೇತಿಗೆ ಸೂಕ್ತವಾದ ಮಿನಿಬ್ಯಾಚ್‌ಗಳಲ್ಲಿ ಡೇಟಾವನ್ನು ಕೊಡಬಹುದಾದ **ಜೆನೆರೆಟರ್‌ಗಳು** ಎಂದು ಪ್ರತಿನಿಧಿಸಲಾಗುತ್ತದೆ.\n", + "\n", + "ಚಿತ್ರ ಶ್ರೇಣೀಕರಣಕ್ಕೆ ವ್ಯವಸ್ಥೆ ಮಾಡಲಿಕ್ಕಾಗಿ, ಕೇರಾಸ್ ವಿಶೇಷ ಫಂಕ್ಷನ್ `image_dataset_from_directory` ಅನ್ನು ಒಳಗೊಂಡಿದೆ, ಅದು ವೈವಿಧ್ಯಮಯ ವರ್ಗಗಳಿಗೆ ಹೊಂದಿಕೊಂಡ ಉಪಡೈರಕ್ಟರಿಗಳಿಂದ ಚಿತ್ರಗಳನ್ನು ಲೋಡ್ ಮಾಡಬಹುದು. ಈ ಫಂಕ್ಷನ್ ಚಿತ್ರಗಳನ್ನು ಸ್ಕೇಲ್ ಮಾಡಲು ಸಹ ಜವಾಬ್ದಾರಿಯಿದೆ ಮತ್ತು ಡೇಟಾಸೆಟ್ ಅನ್ನು ತರಬೇತಿ ಮತ್ತು ಪರೀಕ್ಷಾ ಉಪಸಮೂಹಗಳಾಗಿ ವಿಭಜಿಸಬಹುದು:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Found 24769 files belonging to 2 classes.\n", + "Using 19816 files for training.\n", + "Found 24769 files belonging to 2 classes.\n", + "Using 4953 files for validation.\n" + ] + } + ], + "source": [ + "data_dir = 'data/PetImages'\n", + "batch_size = 64\n", + "ds_train = keras.preprocessing.image_dataset_from_directory(\n", + " data_dir,\n", + " validation_split = 0.2,\n", + " subset = 'training',\n", + " seed = 13,\n", + " image_size = (224,224),\n", + " batch_size = batch_size\n", + ")\n", + "ds_test = keras.preprocessing.image_dataset_from_directory(\n", + " data_dir,\n", + " validation_split = 0.2,\n", + " subset = 'validation',\n", + " seed = 13,\n", + " image_size = (224,224),\n", + " batch_size = batch_size\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "ತರಬೆತಿ ಮತ್ತು ಪರೀಕ್ಷಾ ಡೇಟಾಸೆಟ್‌ಗಳ ನಡುವೆ ಚಿತ್ರಗಳ ವಿಭಜನೆಗೆ ಪರಿಣಾಮಕಾರಿಯಾಗುತ್ತದೆ, ಆದ್ದರಿಂದ ಎರಡೂ ಕರೆಗಳಿಗೆ ಒಂದೇ `seed` ಮೌಲ್ಯವನ್ನು ಹೊಂದಿಸುವುದು ಮುಖ್ಯವಾಗಿದೆ.\n", + "\n", + "ಡೇಟಾಸೆಟ್ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಡೈರೆಕ್ಟರಿಗಳಿಂದ ವರ್ಗದ ಹೆಸರುಗಳನ್ನು ಆಯ್ಕೆ ಮಾಡುತ್ತದೆ, ಮತ್ತು ಅವುಗಳನ್ನು ಅಗತ್ಯವಿದ್ದರೆ ನೀವು ಕೆಳಗಿನ ವಿಧಾನದಿಂದ ಪ್ರವೇಶಿಸಬಹುದು:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['Cat', 'Dog']" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ds_train.class_names" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "ನಾವು ಪಡೆದಿರುವ ಡೇಟಾಸೆಟ್‌ಗಳನ್ನು ನೇರವಾಗಿ `fit` ಫಂಕ್ಷನ್‌ಗೆPassed ಮಾಡಬಹುದು ಮಾದರಿಯನ್ನು ತರಬೇತಿಗೊಳಿಸಲು. ಅವುಗಳಲ್ಲಿ ತದ್ವioleಕ ಚಿತ್ರಗಳು ಮತ್ತು ಲೇಬಲ್ಗಳಿದ್ದು, ಕೆಳಗಿನ ರಚನೆಯ ಮೂಲಕ ಲೂಪಿಂಗ್ ಮಾಡಬಹುದು:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training batch shape: features=(64, 224, 224, 3), labels=(64,)\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "for x,y in ds_train:\n", + " print(f\"Training batch shape: features={x.shape}, labels={y.shape}\")\n", + " x_sample, y_sample = x,y\n", + " break\n", + " \n", + "display_dataset(x_sample.numpy().astype(np.int),np.expand_dims(y_sample,1),classes=ds_train.class_names)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "> **ಗಮನಿಸಿ**: ಡೇಟಾಸೆಟ್‌ನಲ್ಲಿನ ಎಲ್ಲಾ ಚಿತ್ರಗಳು 0-255 ಪರಿಧಿಯ ಫ್ಲೋಟಿಂಗ್ ಪಾಯಿಂಟ್ ಟೆನ್ಸರ್‌ಗಳಾಗಿ ಪ್ರತಿನಿಧಿಸಲಾಗುತ್ತವೆ. ಅವುಗಳನ್ನು ನ್ಯೂರಲ್ ನೆಟ್ವರ್ಕ್‌ಗೆ ಕಳುಹಿಸುವ ಮುನ್ನ, ಆ ಮೌಲ್ಯಗಳನ್ನು 0-1 ಪರಿಧಿಗೆ ಪರಿಮಾಪಿಸಬೇಕಾಗುತ್ತದೆ. ಚಿತ್ರಗಳನ್ನು ರೇಖಾಚಿತ್ರ ಮಾಡುತ್ತಿರುವಾಗ, ಅದೇ ರೀತಿಯೇ ಮಾಡಬೇಕಾಗುತ್ತದೆ ಅಥವಾ ಮೌಲ್ಯಗಳನ್ನು `int` ಪ್ರಕಾರಕ್ಕೆ ಪರಿವರ್ತಿಸಬೇಕಾಗುತ್ತದೆ (ಮೇಲಿನ ಕೋಡ್‌ಗೆ ನಾವು ಮಾಡುತ್ತಿರುವಂತೆ), ಮೂಲ ಅಣಗು ಮಾಡದ ಚಿತ್ರವನ್ನು `matplotlib`ಗೆ ತೋರಿಸಲು. \n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## ಪೂರ್ವ-ಶಿಕ್ಷಿತ ಮಾದರಿಗಳು\n", + "\n", + "ಅನೇಕ ಚಿತ್ರ ವರ್ಗೀಕರಣ ಕೆಲಸಗಳಿಗೆ ವ್ಯಕ್ತಿಸುವ ಪೂರ್ವ-ಶಿಕ್ಷಿತ ನ್ಯೂರಲ್ ನೆಟ್‌ವರ್ಕ್ ಮಾದರಿಗಳನ್ನು ಕಂಡುಹಿಡಿಯಬಹುದು. ಆಮದ್ಯಾದ ಮಾದರಿಗಳ ನಾನೂ ಆದವುಗಳು `keras.applications` ಹೆಸರುಸ್ಥಳದಲ್ಲಿ ಲಭ್ಯವಿದ್ದು, ಇನ್ನೂ ಹೆಚ್ಚಿನ ಮಾದರಿಗಳನ್ನು ಇಂಟರ್ನೆಟ್‌ನಲ್ಲಿ ಕಾಣಬಹುದು. ಸರಳವಾದ VGG-16 ಮಾದರಿಯನ್ನು ಹೇಗೆ ಲೋಡ್ ಮಾಡಿ ಬಳಸುವುದು ನೋಡೋಣ:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Downloading data from https://storage.googleapis.com/tensorflow/keras-applications/vgg16/vgg16_weights_tf_dim_ordering_tf_kernels.h5\n", + "553467904/553467096 [==============================] - 6s 0us/step\n", + "Most probable class = [208]\n", + "Downloading data from https://storage.googleapis.com/download.tensorflow.org/data/imagenet_class_index.json\n", + "40960/35363 [==================================] - 0s 0us/step\n" + ] + }, + { + "data": { + "text/plain": [ + "[[('n02099712', 'Labrador_retriever', 0.5340957),\n", + " ('n02100236', 'German_short-haired_pointer', 0.0939442),\n", + " ('n02092339', 'Weimaraner', 0.08160535),\n", + " ('n02099849', 'Chesapeake_Bay_retriever', 0.057179328),\n", + " ('n02109047', 'Great_Dane', 0.03733857)]]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# 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", + "print(f\"Most probable class = {tf.argmax(res,1)}\")\n", + "\n", + "keras.applications.vgg16.decode_predictions(res.numpy())" + ] + }, + { + "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" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "ನಾವು VGG-16 ಜಾಲದ ವಾಸ್ತುಶಿಲ್ಪವನ್ನು ಸಹ ನೋಡುೋಣ: \n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"vgg16\"\n", + "_________________________________________________________________\n", + "Layer (type) Output Shape Param # \n", + "=================================================================\n", + "input_1 (InputLayer) [(None, 224, 224, 3)] 0 \n", + "_________________________________________________________________\n", + "block1_conv1 (Conv2D) (None, 224, 224, 64) 1792 \n", + "_________________________________________________________________\n", + "block1_conv2 (Conv2D) (None, 224, 224, 64) 36928 \n", + "_________________________________________________________________\n", + "block1_pool (MaxPooling2D) (None, 112, 112, 64) 0 \n", + "_________________________________________________________________\n", + "block2_conv1 (Conv2D) (None, 112, 112, 128) 73856 \n", + "_________________________________________________________________\n", + "block2_conv2 (Conv2D) (None, 112, 112, 128) 147584 \n", + "_________________________________________________________________\n", + "block2_pool (MaxPooling2D) (None, 56, 56, 128) 0 \n", + "_________________________________________________________________\n", + "block3_conv1 (Conv2D) (None, 56, 56, 256) 295168 \n", + "_________________________________________________________________\n", + "block3_conv2 (Conv2D) (None, 56, 56, 256) 590080 \n", + "_________________________________________________________________\n", + "block3_conv3 (Conv2D) (None, 56, 56, 256) 590080 \n", + "_________________________________________________________________\n", + "block3_pool (MaxPooling2D) (None, 28, 28, 256) 0 \n", + "_________________________________________________________________\n", + "block4_conv1 (Conv2D) (None, 28, 28, 512) 1180160 \n", + "_________________________________________________________________\n", + "block4_conv2 (Conv2D) (None, 28, 28, 512) 2359808 \n", + "_________________________________________________________________\n", + "block4_conv3 (Conv2D) (None, 28, 28, 512) 2359808 \n", + "_________________________________________________________________\n", + "block4_pool (MaxPooling2D) (None, 14, 14, 512) 0 \n", + "_________________________________________________________________\n", + "block5_conv1 (Conv2D) (None, 14, 14, 512) 2359808 \n", + "_________________________________________________________________\n", + "block5_conv2 (Conv2D) (None, 14, 14, 512) 2359808 \n", + "_________________________________________________________________\n", + "block5_conv3 (Conv2D) (None, 14, 14, 512) 2359808 \n", + "_________________________________________________________________\n", + "block5_pool (MaxPooling2D) (None, 7, 7, 512) 0 \n", + "_________________________________________________________________\n", + "flatten (Flatten) (None, 25088) 0 \n", + "_________________________________________________________________\n", + "fc1 (Dense) (None, 4096) 102764544 \n", + "_________________________________________________________________\n", + "fc2 (Dense) (None, 4096) 16781312 \n", + "_________________________________________________________________\n", + "predictions (Dense) (None, 1000) 4097000 \n", + "=================================================================\n", + "Total params: 138,357,544\n", + "Trainable params: 138,357,544\n", + "Non-trainable params: 0\n", + "_________________________________________________________________\n" + ] + } + ], + "source": [ + "vgg.summary()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## ಜಿಪಿಯು ಲೆಕ್ಕಾಚಾರಗಳು\n", + "\n", + "VGG-16 ಮತ್ತು ಇತರ ಆಧುನಿಕ ವಿನ್ಯಾಸಗಳಂತಹ ಆಳವಾದ ನ್ಯೂರಲ್ ನೆಟ್‌ವರ್ಕ್‌ಗಳು ಕಾರ್ಯಗತಗೊಳಿಸಲು ಸಾಕಷ್ಟು ಗಣನಾ ಶಕ್ತಿ ಅಗತ್ಯವಿದೆ. ಲಭ್ಯವಿದ್ದಲ್ಲಿ ಜಿಪಿಯು ವೇಗವರ್ಧನೆಯನ್ನು ಬಳಸುವುದು ಅರ್ಥಪೂರ್ಣ. ಸುಲಭವಾಗಿ, ಕೆರಾಸ್ ಲಭ್ಯವಿದ್ದರೆ ಜಿಪಿಯುನಲ್ಲಿ ಲೆಕ್ಕಾಚಾರಗಳನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ವೇಗಗೊಳಿಸುತ್ತದೆ. ಟೆನ್ಸರ್‌ಫ್ಲೋ ಜಿಪಿಯುವನ್ನು ಬಳಸಬಹುದೇ ಎಂದು ಪರಿಶೀಲಿಸಲು ಕೆಳಗಿನ ಕೋಡ್ ಬಳಸಬಹುದು:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tf.config.list_physical_devices('GPU')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## VGG ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಹೊರತೆಗೆಯುವಿಕೆ\n", + "\n", + "ನಾವು ನಾವು ಚಿತ್ರಗಳಿಂದ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಹೊರತೆಗೆಯಲು VGG-16 ಬಳಸಬೇಕಿದ್ದರೆ, ಕೊನೆ ವರ್ಗೀಕರಣ ಪದರಗಳಿಲ್ಲದೇ ಮಾಡೆಲ್ ಬೇಕಾಗುತ್ತದೆ. ನಾವು ತಲೆ ಪದರಗಳಿಲ್ಲದೆ VGG-16 ಮಾಡೆಲ್ ಅನ್ನು ಈ ಕೋಡ್ ಬಳಸಿ ನಿರ್ಮಿಸಬಹುದು:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Shape after applying VGG-16: (7, 7, 512)\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "vgg = keras.applications.VGG16(include_top=False)\n", + "\n", + "inp = keras.applications.vgg16.preprocess_input(x_sample[:1])\n", + "res = vgg(inp)\n", + "print(f\"Shape after applying VGG-16: {res[0].shape}\")\n", + "plt.figure(figsize=(15,3))\n", + "plt.imshow(res[0].numpy().reshape(-1,512))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "ಫೀಚರ್ ಟೆನ್ಸರ್‌ನ ಆಯಾಮ 7x7x512 ಆಗಿದೆ, ಆದರೆ ಅದನ್ನು ದೃಶ್ಯೀಕರಿಸಲು ನಾವು ಅದನ್ನು 2ಡಿ ಸ್ವರೂಪಕ್ಕೆ ಮರುರೂಪಿಸಬೇಕಾಗಿತ್ತು.\n", + "\n", + "ಈಗ ಆ ಫೀಚರ್‌ಗಳನ್ನು ಚಿತ್ರಗಳನ್ನು ವರ್ಗೀಕರಿಸಲು ಬಳಸಬಹುದೋ ನೋಡೋಣ. ಕೈಯಿಂದ ಕೆಲವು ಚಿತ್ರ ಭಾಗಗಳನ್ನು (ನಮ್ಮ ಪ್ರಕರಣದಲ್ಲಿ 50 ಮಿನಿಬ್ಯಾಚ್‌ಗಳನ್ನು) ತೆಗೆದು ಅವುಗಳ ಫೀಚರ್ ವೆಕ್ಟರ್‌ಗಳನ್ನು ಪೂರ್ವಗಣನೆ ಮಾಡೋಣ. ಇದಕ್ಕಾಗಿ Tensorflow **dataset** API ಅನ್ನು ನಾವು ಬಳಸಬಹುದು. `map` ಫಂಕ್ಷನ್ ಒಂದು ಡೇಟಾಸೆಟ್ ಅನ್ನು ತೆಗೆದು ನೀಡಲಾದ ಲ್ಯಾಂಬ್ಡಾ-ಫಂಕ್ಷನನ್ನು ಅವನಾಯಕರಾಗಿ ಶೋಧಿಸಿದಂತೆ ಅನ್ವಯಿಸುತ್ತದೆ. ನಾವು ಈ ರೀತಿ ಮೂಲ ಚಿತ್ರಗಳ ಬದಲು VGG‌ನಿಂದ ಪಡೆದ ಫೀಚರ್‌ಗಳನ್ನು ಹೊಂದಿರುವ ಹೊಸ ಡೇಟಾಸೆಟ್‌ಗಳು `ds_features_train` ಮತ್ತು `ds_features_test` ರಚಿಸುತ್ತೇವೆ.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(64, 7, 7, 512) (64,)\n" + ] + } + ], + "source": [ + "num = batch_size*50\n", + "ds_features_train = ds_train.take(50).map(lambda x,y : (vgg(x),y))\n", + "ds_features_test = ds_test.take(10).map(lambda x,y : (vgg(x),y))\n", + "\n", + "for x,y in ds_features_train:\n", + " print(x.shape,y.shape)\n", + " break" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "ನಾವು ನಮ್ಮ ಪ್ರದರ್ಶನವನ್ನು ವೇಗವಾಗಿ ಮಾಡಲು ಡೇಟಾಸೆಟ್ ಗಾತ್ರವನ್ನು ಮಿತಿಗೊಳಿಸಲು `.take(50)` ನಿರ್ಮಾಣವನ್ನು ಬಳಿಸಿದೆವು. ನೀವು ನಿಶ್ಚಿತವಾಗಿಯೂ ಈ ಪ್ರಯೋಗವನ್ನು ಸಂಪೂರ್ಣ ಡೇಟಾಸೆಟ್ ನಲ್ಲಿ ನಡೆಸಬಹುದು.\n", + "\n", + "ಈಗ ನಮಗೆ ಗುಡಿಸುವ ವೈಶಿಷ್ಟ್ಯಗಳೊಂದಿಗೆ ಡೇಟಾಸೆಟ್ ಇದ್ದುದರಿಂದ, ನಾವು ಬೆಕ್ಕು ಮತ್ತು ನಾಯಿಗಳನ್ನು ವ್ಯತ್ಯಾಸಗೊಳಿಸಲು ಸರಳ ದಟ್ಟ ತರಗತಿಕೋರಿಯನ್ನು ತರಬೇಹಿಸಲು ಸಾಧ್ಯವಾಗಿದೆ. ಈ ನೆಟ್ವರ್ಕ್ (7,7,512) ಆಕಾರದ ವೈಶಿಷ್ಟ್ಯ ವೆಕ್ಟರ್ ತೆಗೆದುಕೊಳ್ಳುತ್ತದೆ, ಮತ್ತು ಒಂದು ಔಟ್‌ಪುಟ್ ಅನ್ನು ಉತ್ಪತ್ತಿ ಮಾಡುತ್ತದೆ ಅದು ನಾಯಿಗೆ ಅಥವಾ ಬೆಕ್ಕಿಗೆ ಹೊಂದಿರುತ್ತದೆ. ಇದೊಂದು ದ್ವಿ-ವರ್ಗ ವರ್ಗೀಕರಣವಾಗಿರುವುದರಿಂದ, ನಾವು `sigmoid` ಸಕ್ರಿಯತೆ ಕಾರ್ಯ ಮತ್ತು `binary_crossentropy` ನಷ್ಟವನ್ನು ಬಳಸುತ್ತೇವೆ.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "50/50 [==============================] - 1896s 38s/step - loss: 1.4845 - acc: 0.9144 - val_loss: 0.7220 - val_acc: 0.9516\n" + ] + } + ], + "source": [ + "model = keras.models.Sequential([\n", + " keras.layers.Flatten(input_shape=(7,7,512)),\n", + " keras.layers.Dense(1,activation='sigmoid')\n", + "])\n", + "model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc'])\n", + "hist = model.fit(ds_features_train, validation_data=ds_features_test)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "ಫಲಿತಾಂಶ ಅದ್ಭುತವಾಗಿದೆ, ನಾವು ಸಿoಹು ಮತ್ತು ನಾಯಿ ನಡುವಿನ ವ್ಯತ್ಯಾಸವನ್ನು ಸುಮಾರು 95% ಸಂಭಾವ್ಯತೆಯಿಂದ ಗುರುತಿಸಬಹುದು! ಆದಾಗ್ಯೂ, ನಾವು ಈ ರೀತಿಯ ಮಾರ್ಗವನ್ನು ಎಲ್ಲಾ ಚಿತ್ರಗಳ ಒಂದು ಉಪಸಮೂಹದಲ್ಲಿ ಮಾತ್ರ ಪರೀಕ್ಷಿಸಿದ್ದೇವೆ, ಏಕೆಂದರೆ ಕೈಯಿಂದ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ನಿರ್ವಹಿಸುವುದು ಹೆಚ್ಚಿನ ಸಮಯವನ್ನು ತೆಗೆದುಕೊಳ್ಳುತ್ತದೆ ಎಂದು ಕಂಡುಬಂದಿದೆ.\n", + "\n", + "## ಒಂದು VGG ನೆಟ್‌ವರ್ಕ್ ಬಳಸಿ ವರ್ಗಾಂತರ ಕಲಿಕೆ\n", + "\n", + "ತರಬೇತಿಯ ಸಮಯದಲ್ಲಿ ಸಂಪೂರ್ಣವಾಗಿ ಮೂಲ VGG-16 ನೆಟ್‌ವರ್ಕ್ ಅನ್ನು ಬಳಸುವುದರಿಂದ ಕೈಯಿಂದ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಪೂರ್ವಲెక్కಿಸುವ ಅವಶ್ಯಕತೆ ಇಲ್ಲದೆಯೂ ಆಗಬಹುದು, ನಮ್ಮ ನೆಟ್‌ವರ್ಕ್‌ಗೆ ಮೊದಲ ಪದರವಾಗಿ ವೈಶಿಷ್ಟ್ಯ ಸಂಗ್ರಾಹಕವನ್ನು ಸೇರಿಸುವ ಮೂಲಕ.\n", + "\n", + "ಕೆರಾಗಳ ವಾಸ್ತುಶಿಲ್ಪದ ಸೌಂದರ್ಯವೆಂದರೆ ನಾವು ಮೇಲ್ಮನ್ಯಾಸಿಸಿರುವ VGG-16 ಮಾದರಿ ಮತ್ತೊಂದು ನ್ಯೂರಲ್ ನೆಟ್‌ವರ್ಕ್‌ನಲ್ಲಿ ಒಂದು ಪದರವಾಗಿ ಬಳಸಬಹುದಾಗಿದೆ! ನಾವು ಅಲ್ಲಿ ದಕ್ಷ ವರ್ಗೀಕರಿಸಲು ಒಂದು ಡೆನ್ಸ್ ಕ್ಲಾಸಿಫೈಯರ್‌ನ್ನು ನಿರ್ಮಿಸಿ, ನಂತರ ಹಿಂದಿನ ಪ್ರಸಾರವನ್ನು ಬಳಸಿ ಸಂಪೂರ್ಣ ನೆಟ್‌ವರ್ಕ್ ಅನ್ನು ತರಬೇತಿಮಾಡಬೇಕಾಗುತ್ತದೆ.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"sequential\"\n", + "_________________________________________________________________\n", + "Layer (type) Output Shape Param # \n", + "=================================================================\n", + "vgg16 (Functional) (None, 7, 7, 512) 14714688 \n", + "_________________________________________________________________\n", + "flatten (Flatten) (None, 25088) 0 \n", + "_________________________________________________________________\n", + "dense (Dense) (None, 1) 25089 \n", + "=================================================================\n", + "Total params: 14,739,777\n", + "Trainable params: 25,089\n", + "Non-trainable params: 14,714,688\n", + "_________________________________________________________________\n" + ] + } + ], + "source": [ + "model = keras.models.Sequential()\n", + "model.add(keras.applications.VGG16(include_top=False,input_shape=(224,224,3)))\n", + "model.add(keras.layers.Flatten())\n", + "model.add(keras.layers.Dense(1,activation='sigmoid'))\n", + "\n", + "model.layers[0].trainable = False\n", + "\n", + "model.summary()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "ಈ ಮಾದರಿ ಒಂದು ಎಂಡ್-ಟು-ಎಂಡ್ ವರ್ಗೀಕರಣ ನೆಯನ್ನು ಹೋಲುತ್ತದೆ, ಇದು ಒಂದು ಚಿತ್ರವನ್ನು ತೆಗೆದು ತರಗತಿಯನ್ನು 반환ಿಸುತ್ತದೆ. ಆದಾಗ್ಯೂ, ಕುತೂಹಲಕಾರಿ ಸಂಗತಿ ಎಂದರೆ ನಾವು VGG16 ಅನ್ನು ಫೀಚರ್ ಎಕ್ಸ್ಟ್ರ್ಯಾಕ್ಟರ್ ಆಗಿ ಬಳಸಲು ಬಯಸುತ್ತೇವೆ, ಮತ್ತು ಅದನ್ನು ಮರುಪ್ರಶಿಕ್ಷಣ ಮಾಡಬೆಕಾಗಿಲ್ಲ. ಆದ್ದರಿಂದ, ನಮಗೆ **ಕನ್ವೊಲ್ಯೂಷನಲ್ ಫೀಚರ್ ಎಕ್ಸ್ಟ್ರ್ಯಾಕ್ಟರ್ ಖಂಡಿತವಾಗಿ ತಣಿಸಬೇಕು**. ನಾವು ನೆಟ್‌ವರ್ಕ್‌ನ ಮೊದಲ ಲೇಯರ್ ಅನ್ನು `model.layers[0]` ಅನ್ನು ಕರೆ ಮಾಡಿ ಪ್ರವೇಶಿಸಬಹುದು, ಮತ್ತು ಟೇನ್‌ಅಬಲ್ `trainable` ಗುಣಲಕ್ಷಣವನ್ನು `False`ಗೆ ಸೆಟ್ ಮಾಡಬೇಕಾಗುತ್ತದೆ.\n", + "\n", + "> **ಗಮನಿಸಿ**: ಫೀಚರ್ ಎಕ್ಸ್ಟ್ರ್ಯಾಕ್ಟರ್ ತೂಕಗಳನ್ನು ತಣಿಸುವುದು ಅಗತ್ಯವಿದೆ, ಏಕೆಂದರೆ ಇಲ್ಲದಿದ್ದರೆ ಅಶಿಕ್ಷಿತ ವರ್ಗೀಕರಣ ಲೇಯರ್ ಮೂಲ ಪೂರ್ವ-ಪ್ರಶಿಕ್ಷಿತ ಕನ್ವೊಲ್ಯೂಷನಲ್ ತೂಕಗಳನ್ನು ನಾಶ ಮಾಡಬಹುದು.\n", + "\n", + "ನೀವು ಗಮನಿಸಬಹುದು ನಮ್ಮ ನೆಟ್‌ವರ್ಕ್‌ನ ಒಟ್ಟು ಪ್ಯಾರಾಮೀಟರ್‌ಗಳ ಸಂಖ್ಯೆ ಸುಮಾರು 15 ದಶಲಕ್ಷ ಇದ್ದರೂ, ನಾವು ಕೇವಲ 25,000 ಪ್ಯಾರಾಮೀಟರ್‌ಗಳನ್ನು ಮಾತ್ರ ತರಬೇತಿ ಮಾಡುತ್ತೇವೆ. ಮೇಲ್ದರ್ಜೆಯ ಕನ್ವೊಲ್ಯೂಷನಲ್ ಫಿಲ್ಟರ್‌ಗಳ ಇತರೆ ಎಲ್ಲಾ ಪ್ಯಾರಾಮೀಟರ್‌ಗಳು ಪೂರ್ವ-ಪ್ರಶಿಕ್ಷಿತವಾಗಿವೆ. ಅದು ಉತ್ತಮ, ಏಕೆಂದರೆ ನಾವು ಕಡಿಮೆ ಸಂಖ್ಯೆಯ ಉದಾಹರಣೆಗಳನ್ನು ಬಳಸಿಕೊಂಡು ಕಡಿಮೆ সংখ্যೆಯ ಪ್ಯಾರಾಮೀಟರ್‌ಗಳನ್ನೇ ಫೈನ ಟ್ಯೂನ್ ಮಾಡಬಹುದು.\n", + "\n", + "ಈಗ ನಾವು ನಮ್ಮ ನೆಟ್‌ವರ್ಕ್ ಅನ್ನು ತರಬೇತಿಗೊಳಿಸಿ ಎಷ್ಟು ಉತ್ತಮವಾಗಬಹುದು ಎಂದು ನೋಡೋಣ. ಬಹುಶಃ ಬಹಳ ಸಮಯ ತೆಗೆದುಕೊಳ್ಳಬಹುದು, ಮತ್ತು ನಿರ್ವಹಣೆಯು ಕೆಲ ಸಮಯ ಕಡಿಮೆಯಾಗಿ ನಿಂತಂತೆ ತೋರುವ ಸಾಧ್ಯತೆ ಇದ್ದರೆ ಚಿಂತೆ ಮಾಡಬೇಡಿ.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "310/310 [==============================] - 265s 716ms/step - loss: 0.9917 - acc: 0.9512 - val_loss: 0.8156 - val_acc: 0.9671\n" + ] + } + ], + "source": [ + "model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc'])\n", + "hist = model.fit(ds_train, validation_data=ds_test)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "ನಮಗೆ ಯುಕ್ತಿಸಂಗತವಾಗಿ ನಿಖರವಾದ ಬೆಕ್ಕೆರುಳು vs. ನಾಯಿ ವರ್ಗೀಕರಿಸುವ ಯಂತ್ರ ಸಿಕ್ಕಿದೆ ಎನ್ನಿಸುತ್ತದೆ! \n", + "\n", + "## ಮಾದರಿಯನ್ನು ಉಳಿಸುವುದು ಮತ್ತು ಲೋಡ್ ಮಾಡುವುದು\n", + "\n", + "ಮಾದರಿಯನ್ನು ತರಬೇತಿಗೆ ಮಾಡಿದ ಬಳಿಕ, ನಾವು ಮುಂದಿನ ಉಪಯೋಗಕ್ಕಾಗಿ ಮಾದರಿಯ ರಚನೆ ಮತ್ತು ತರಬೇತಿಗೊಳಿಸಿದ ತೂಕಗಳನ್ನು ಫೈಲಾಗ್ ಉಳಿಸಬಹುದು:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "INFO:tensorflow:Assets written to: data/cats_dogs.tf/assets\n" + ] + } + ], + "source": [ + "model.save('data/cats_dogs.tf')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "ನಾವು ನಂತರ ಯಾವಾಗ ಬೇಕಾದರೂ ಫೈಲ್‌ನಲ್ಲಿ ಇರುವುದು ಮಾದರಿಯನ್ನು ಲೋಡ್ ಮಾಡಬಹುದು. ಮುಂದಿನ ಪ್ರಯೋಗವು ಮಾದರಿಯನ್ನು ನಾಶಮಾಡಬಹುದು ಎಂಬ ಸಂದರ್ಭಗಳಲ್ಲಿ ಇದು ನಿಮಗೆ ಉಪಯುಕ್ತವಾಗಬಹುದು - ನೀವು ಶೂನ್ಯದಿಂದ ಮರುಪ್ರಾರಂಭಿಸುವ ಅಗತ್ಯವಿರುದಲ್ಲ.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "model = keras.models.load_model('data/cats_dogs.tf')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## ಫೈನ್-ಟ್ಯೂನಿಂಗ್ ಸ್ಥಳಾಂತರ ಅಧ್ಯಯನ\n", + "\n", + "ಹಿಂದಿನ ವಿಭಾಗದಲ್ಲಿ, ನಾವು ನಮ್ಮದೇ ಡೇಟಾಸೆಟ್‌ನಲ್ಲಿ ಚಿತ್ರಗಳನ್ನು ವರ್ಗೀಕರಿಸಲು ಅಂತಿಮ ವರ್ಗೀಕರಿಸುವ ಲೇಯರ್ ಅನ್ನು ತರಬೇತಿಪಡಿಸಿದ್ದೇವೆ. ಆದಾಗ್ಯೂ, ನಾವು ಫೀಚರ್ ಎಕ್ಸ್‌ಟ್ರ್ಯಾಕ್ಟರ್ ಅನ್ನು ಮರು-ತರಬೇತಿಪಡಿಸಿರುವುದಿಲ್ಲ, ಮತ್ತು ನಮ್ಮ ಮಾದರಿ ImageNet ಡೇಟಾದ ಮೇಲೆ ಕಲಿತಿರುವ ಫೀಚರ್‌ಗಳ ಮೇಲೆ ನಂಬಿಕೊಂಡಿತ್ತು. ನಿಮ್ಮ ವಸ್ತುಗಳು ಸಾಮಾನ್ಯ ImageNet ಚಿತ್ರಗಳಿಂದ ದೃಶ್ಯವಾಗಿ ವಿಭಿನ್ನವಾಗಿದ್ದರೆ, ಈ ಫೀಚರ್‌ಗಳ ಸಂಯೋಜನೆ ಉತ್ತಮವಾಗಿ ಕೆಲಸ ಮಾಡದೇ ಇರುವ ಸಾಧ್ಯತೆ ಇದೆ. ಆದ್ದರಿಂದ ಸಂವೇದನಶೀಲ ಲೇಯರ್‌ಗಳನ್ನು ತರಬೇತಿಪಡಿಸುವುದನ್ನು ಆರಂಭಿಸುವುದು ಯುಕ್ತಿಯಾಗಿದೆ.\n", + "\n", + "ಅದಕ್ಕಾಗಿ, ನಾವು ಹಿಂದಿನಿಂದಲೇ ಮುಬ್ಬಾಗಿಸಿರುವ ಸಂವೇದನಶೀಲ ಫಿಲ್ಟರ್ ಪ್ಯಾರಾಮೀಟರ್‌ಗಳನ್ನು ಅನ್ಫ್ರೀಜ್ ಮಾಡಬಹುದು.\n", + "\n", + "> **ಗಮನಿಸಿ:** ನಿಮ್ಮನ್ನು ಮೊದಲಿಗೆ ಪ್ಯಾರಾಮೀಟರ್‌ಗಳನ್ನು ಮುಬ್ಬಾಗಿಸಿ ತರಬೇತಿ ಹಲವಾರು ಯುಗಗಳಲ್ಲಿ ನಡೆಸುವ ಮೂಲಕ ವರ್ಗೀಕರಿಸುವ ಲೇಯರ್‌ನ ತೂಕಗಳನ್ನು ಸ್ಥಿರಪಡಿಸುವುದು ಮುಖ್ಯವಾಗಿದೆ. ನಿಮಗಿತ್ತಿನಲ್ಲಿ ಮುಬ್ಬಾಗಿಸದ ಪ್ಯಾರಾಮೀಟರ್‌ಗಳೊಂದಿಗೆ ಸಂಪೂರ್ಣ ನೆಟ್‌ವರ್ಕ್ ಅನ್ನು ತಕ್ಷಣ ತರಬೇತಿಪಡಿಸಿದರೆ, ದೊಡ್ಡ ದೋಷಗಳು ಸಂವೇದನಶೀಲ ಲೇಯರ್‌ಗಳ ಪೂರ್ವ-ತರಬೇತಿಪಡಿಸಿದ ತೂಕಗಳನ್ನು ಹಾಳುಮಾಡಬಹುದು.\n", + "\n", + "ನಮ್ಮ ಸಂವೇದನಶೀಲ VGG-16 ಮಾದರಿ ಪ್ರಥಮ ಲೇಯರ್ ಒಳಗೆ ಇರುವ ಮತ್ತು ಅದು ಹಲವಾರು ಲೇಯರ್‌ಗಳನ್ನು ಒಳಗೊಂಡಿದೆ. ಅದರ ರಚನೆಯನ್ನು ನೋಡಬಹುದು:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"vgg16\"\n", + "_________________________________________________________________\n", + "Layer (type) Output Shape Param # \n", + "=================================================================\n", + "input_1 (InputLayer) [(None, 224, 224, 3)] 0 \n", + "_________________________________________________________________\n", + "block1_conv1 (Conv2D) (None, 224, 224, 64) 1792 \n", + "_________________________________________________________________\n", + "block1_conv2 (Conv2D) (None, 224, 224, 64) 36928 \n", + "_________________________________________________________________\n", + "block1_pool (MaxPooling2D) (None, 112, 112, 64) 0 \n", + "_________________________________________________________________\n", + "block2_conv1 (Conv2D) (None, 112, 112, 128) 73856 \n", + "_________________________________________________________________\n", + "block2_conv2 (Conv2D) (None, 112, 112, 128) 147584 \n", + "_________________________________________________________________\n", + "block2_pool (MaxPooling2D) (None, 56, 56, 128) 0 \n", + "_________________________________________________________________\n", + "block3_conv1 (Conv2D) (None, 56, 56, 256) 295168 \n", + "_________________________________________________________________\n", + "block3_conv2 (Conv2D) (None, 56, 56, 256) 590080 \n", + "_________________________________________________________________\n", + "block3_conv3 (Conv2D) (None, 56, 56, 256) 590080 \n", + "_________________________________________________________________\n", + "block3_pool (MaxPooling2D) (None, 28, 28, 256) 0 \n", + "_________________________________________________________________\n", + "block4_conv1 (Conv2D) (None, 28, 28, 512) 1180160 \n", + "_________________________________________________________________\n", + "block4_conv2 (Conv2D) (None, 28, 28, 512) 2359808 \n", + "_________________________________________________________________\n", + "block4_conv3 (Conv2D) (None, 28, 28, 512) 2359808 \n", + "_________________________________________________________________\n", + "block4_pool (MaxPooling2D) (None, 14, 14, 512) 0 \n", + "_________________________________________________________________\n", + "block5_conv1 (Conv2D) (None, 14, 14, 512) 2359808 \n", + "_________________________________________________________________\n", + "block5_conv2 (Conv2D) (None, 14, 14, 512) 2359808 \n", + "_________________________________________________________________\n", + "block5_conv3 (Conv2D) (None, 14, 14, 512) 2359808 \n", + "_________________________________________________________________\n", + "block5_pool (MaxPooling2D) (None, 7, 7, 512) 0 \n", + "=================================================================\n", + "Total params: 14,714,688\n", + "Trainable params: 0\n", + "Non-trainable params: 14,714,688\n", + "_________________________________________________________________\n" + ] + } + ], + "source": [ + "model.layers[0].summary()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "ನಾವು ಸಕಲ ಪರದೆಗಳ ಸಂಯೋಜಕ ಮೂಲದ 모든 ಅಂಶಗಳನ್ನು ಅನ್ಫ್ರೀಜ್ ಮಾಡಬಹುದು:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "model.layers[0].trainable = True" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "ಆದಾಗ್ಯೂ, ಎಲ್ಲವನ್ನೂ ಒಂದೇ ಸಮಯದಲ್ಲಿ ಅನ್ಫ್ರೀಜ್ ಮಾಡುವುದು ಉತ್ತಮ ಐಡಿಯಾ ಅಲ್ಲ. ನಾವು ಮೊದಲಿಗೆ ಕೊನೆಯಲ್ಲಿ ಇರುವ ಕೆಲವು ಕೊನ್ವಲ್ಯೂಷನ್ ಲೇಯರ್‌ಗಳನ್ನು ಮಾತ್ರ ಅನ್ಫ್ರೀಜ್ ಮಾಡಬಹುದು, ಏಕೆಂದರೆ ಅವು ನಮ್ಮ ಚಿತ್ರಗಳಿಗೆ ಸಂಬಂಧಿಸಿದ ಉನ್ನತ ಮಟ್ಟದ ಮಾದರಿಗಳನ್ನು ಹೊಂದಿವೆ. ಉದಾಹರಣೆಗೆ, ಮೊದಲಿಗೆ, ಕೊನೆಯ 4ನ್ನು ಬಿಟ್ಟು ಎಲ್ಲಾ ಲೇಯರ್‌ಗಳನ್ನು ಫ್ರೀಜ್ ಮಾಡಬಹುದು: \n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"sequential\"\n", + "_________________________________________________________________\n", + "Layer (type) Output Shape Param # \n", + "=================================================================\n", + "vgg16 (Functional) (None, 7, 7, 512) 14714688 \n", + "_________________________________________________________________\n", + "flatten (Flatten) (None, 25088) 0 \n", + "_________________________________________________________________\n", + "dense (Dense) (None, 1) 25089 \n", + "=================================================================\n", + "Total params: 14,739,777\n", + "Trainable params: 7,104,513\n", + "Non-trainable params: 7,635,264\n", + "_________________________________________________________________\n" + ] + } + ], + "source": [ + "for i in range(len(model.layers[0].layers)-4):\n", + " model.layers[0].layers[i].trainable = False\n", + "model.summary()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "ತರಬೇತಿ ಪಡೆಯುವ ಪರಿಮಾಣಗಳ ಸಂಖ್ಯೆ ಗಮನಾರ್ಹವಾಗಿ ಹೆಚ್ಚಾಗಿದೆ, ಆದರೂ ಅದು ಎಲ್ಲಾ ಪರಿಮಾಣಗಳ ಸುಮಾರು 50% ಬದಿ ಇದೆ ಎಂದು ಗಮನಿಸಿ.\n", + "\n", + "ಅನ್ವಶೀಲಗೊಳಿಸುವಿಕೆಯ ನಂತರ, ನಾವು ಇನ್ನೂ ಕೆಲವು ಚಕ್ರಗಳ ತರಬೇತಿಯನ್ನು ಮಾಡಬಹುದು (ನմ್ರ ಉದಾಹರಣೆಯಲ್ಲಿ, ನಾವು ಒಂದೇ ಒಂದು ಮಾಡುತ್ತೇವೆ). ನೀವು ಹಿಂದಿನ ತರಬೇತಿಗೊಂಡ ತೂಕಗಳ ಮೇಲೆ ಪ್ರಭಾವವನ್ನು ಕಡಿಮೆ ಮಾಡಲು ಕಡಿಮೆ ಕಲಿಕೆಯ ದರವನ್ನು ಆಯ್ಕೆಮಾಡಬಹುದು. ಆದಾಗ್ಯೂ, ಕಡಿಮೆ ಕಲಿಕೆಯ ದರ ಇದ್ದರೂ ಸಹ, ನೀವು ತರಬೇತಿಯ ಆರಂಭದಲ್ಲಿ ಖಚಿತತೆ ಕೆಳಗೆ ಇಳಿಯುವ ಸಾಧ್ಯತೆಯನ್ನು ನಿರೀಕ್ಷಿಸಬಹುದು, ಕೊನೆಗೆ ಸ್ಥಿರ ತೂಕಗಳ ಸಂದರ್ಭದಲ್ಲಿ ಇರುವಕ್ಕಿಂತ ಸ್ವಲ್ಪ ಹೆಚ್ಚು ಮಟ್ಟವನ್ನು ತಲುಪುತ್ತದೆ.\n", + "\n", + "> **ಗಮನಿಸಿ:** ಈ ತರಬೇತಿ ಬಹಳ ನಿಧಾನವಾಗಿ ನಡೆಯುತ್ತದೆ, ಏಕೆಂದರೆ ನಮಗೆ ನೆಟ್ವರ್ಕಿನ ಅನೇಕ ಮಟ್ಟಗಳ ಮೂಲಕ ಗ್ರೇಡಿಯಂಟ್‌ಗಳನ್ನು ಹಿಂದಕ್ಕೆ ಹರಿಸಲು ಒಳಿತು!\n" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "310/310 [==============================] - 201s 645ms/step - loss: 0.5270 - acc: 0.9776 - val_loss: 1.4132 - val_acc: 0.9653\n" + ] + } + ], + "source": [ + "hist = model.fit(ds_train, validation_data=ds_test)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "ನಾವು ಹೆಚ್ಚಿನ تربತಿ ಶುದ್ಧತೆಯನ್ನು ಸಾಧಿಸಲು ಸಾಧ್ಯ, ಏಕೆಂದರೆ ನಾವು ಹೆಚ್ಚು ಪಾರಾಮೀಟರ್‌ಗಳೊಂದಿಗೆ ಹೆಚ್ಚು ಶಕ್ತಿಶಾಲಿ ನೆಟ್‌ವರ್ಕ್ ಅನ್ನು ಬಳಸಿುತ್ತಿರುವೆವು, ಆದರೆ ಮಾನ್ಯತೆ ಶುದ್ಧತೆ ಹೆಚ್ಚಾಗುವುದಿಲ್ಲ.\n", + "\n", + "ನೀವು ನೆಟ್‌ವರ್ಕ್‌ನ ಇನ್ನಷ್ಟು پرتಿಗೆಯ ಲೇಯರ್‌ಗಳನ್ನು ಅನ್ಲಾಕ್ ಮಾಡಿ, ಹೆಚ್ಚು تربತಿ ಮಾಡಲು ಮುಕ್ತವಾಗಿ ಪ್ರಯತ್ನಿಸಿ, ನೀವು ಹೆಚ್ಚಿನ ಶುದ್ಧತೆ ಸಾಧಿಸಬಹುದೇ ಎಂಬುದನ್ನು ನೋಡಿ!\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## ಇತರೆ ಕಂಪ್ಯೂಟರ್ ವೀಕ್ಷಣಾ ಮಾದರಿಗಳು\n", + "\n", + "VGG-16 ಬಹುಮುಖ್ಯವಾಗಿ ಸರಳ ಕಂಪ್ಯೂಟರ್ ವೀಕ್ಷಣಾ ವಾಸ್ತುಶಿಲ್ಪಗಳಲ್ಲಿ ಒಂದಾಗಿದೆ. Keras ಹಲವಾರು ಪೂರ್ವ-ತರಬೇತಿ ಪಡೆದ ನೆಟ್‌ವರ್ಕ್‌ಗಳನ್ನು ಒದಗಿಸುತ್ತದೆ. ಅವುಗಳಲ್ಲಿ ಅತ್ಯಂತ ಹೆಚ್ಚಿನ ಬಳಕೆಯಾದವುಗಳಾಗಿ Microsoft ಅಭಿವೃದ್ಧಿಪಡಿಸಿದ **ResNet** ವಾಸ್ತುಶಿಲ್ಪಗಳು ಮತ್ತು Google ಯಿಂದ **Inception** ಉಂಟು. ಉದಾಹರಣೆಗೆ, ಸರಳವಾದ ResNet-50 ಮಾದರಿಯ ವಾಸ್ತುಶಿಲ್ಪವನ್ನು ಅನ್ವೇಷಿಸೋಣ (ResNet ವಿವಿಧ ಆಳವಿರುವ ಮಾದರಿಗಳ ಕುಟುಂಬವಾಗಿದೆ, ನಿಜವಾಗಿಯೂ ಆಳವಾದ ಮಾದರಿಯನ್ನು ನೋಡಿ ತಿಳಿಯಲು ನೀವು ResNet-152 ಅನ್ನು ಪ್ರಯೋಗಿಸಬಹುದು):\n" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"resnet50\"\n", + "__________________________________________________________________________________________________\n", + "Layer (type) Output Shape Param # Connected to \n", + "==================================================================================================\n", + "input_3 (InputLayer) [(None, 224, 224, 3) 0 \n", + "__________________________________________________________________________________________________\n", + "conv1_pad (ZeroPadding2D) (None, 230, 230, 3) 0 input_3[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv1_conv (Conv2D) (None, 112, 112, 64) 9472 conv1_pad[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv1_bn (BatchNormalization) (None, 112, 112, 64) 256 conv1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv1_relu (Activation) (None, 112, 112, 64) 0 conv1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "pool1_pad (ZeroPadding2D) (None, 114, 114, 64) 0 conv1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "pool1_pool (MaxPooling2D) (None, 56, 56, 64) 0 pool1_pad[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block1_1_conv (Conv2D) (None, 56, 56, 64) 4160 pool1_pool[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block1_1_bn (BatchNormali (None, 56, 56, 64) 256 conv2_block1_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block1_1_relu (Activation (None, 56, 56, 64) 0 conv2_block1_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block1_2_conv (Conv2D) (None, 56, 56, 64) 36928 conv2_block1_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block1_2_bn (BatchNormali (None, 56, 56, 64) 256 conv2_block1_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block1_2_relu (Activation (None, 56, 56, 64) 0 conv2_block1_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block1_0_conv (Conv2D) (None, 56, 56, 256) 16640 pool1_pool[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block1_3_conv (Conv2D) (None, 56, 56, 256) 16640 conv2_block1_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block1_0_bn (BatchNormali (None, 56, 56, 256) 1024 conv2_block1_0_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block1_3_bn (BatchNormali (None, 56, 56, 256) 1024 conv2_block1_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block1_add (Add) (None, 56, 56, 256) 0 conv2_block1_0_bn[0][0] \n", + " conv2_block1_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block1_out (Activation) (None, 56, 56, 256) 0 conv2_block1_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block2_1_conv (Conv2D) (None, 56, 56, 64) 16448 conv2_block1_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block2_1_bn (BatchNormali (None, 56, 56, 64) 256 conv2_block2_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block2_1_relu (Activation (None, 56, 56, 64) 0 conv2_block2_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block2_2_conv (Conv2D) (None, 56, 56, 64) 36928 conv2_block2_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block2_2_bn (BatchNormali (None, 56, 56, 64) 256 conv2_block2_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block2_2_relu (Activation (None, 56, 56, 64) 0 conv2_block2_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block2_3_conv (Conv2D) (None, 56, 56, 256) 16640 conv2_block2_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block2_3_bn (BatchNormali (None, 56, 56, 256) 1024 conv2_block2_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block2_add (Add) (None, 56, 56, 256) 0 conv2_block1_out[0][0] \n", + " conv2_block2_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block2_out (Activation) (None, 56, 56, 256) 0 conv2_block2_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block3_1_conv (Conv2D) (None, 56, 56, 64) 16448 conv2_block2_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block3_1_bn (BatchNormali (None, 56, 56, 64) 256 conv2_block3_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block3_1_relu (Activation (None, 56, 56, 64) 0 conv2_block3_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block3_2_conv (Conv2D) (None, 56, 56, 64) 36928 conv2_block3_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block3_2_bn (BatchNormali (None, 56, 56, 64) 256 conv2_block3_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block3_2_relu (Activation (None, 56, 56, 64) 0 conv2_block3_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block3_3_conv (Conv2D) (None, 56, 56, 256) 16640 conv2_block3_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block3_3_bn (BatchNormali (None, 56, 56, 256) 1024 conv2_block3_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block3_add (Add) (None, 56, 56, 256) 0 conv2_block2_out[0][0] \n", + " conv2_block3_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block3_out (Activation) (None, 56, 56, 256) 0 conv2_block3_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block1_1_conv (Conv2D) (None, 28, 28, 128) 32896 conv2_block3_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block1_1_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block1_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block1_1_relu (Activation (None, 28, 28, 128) 0 conv3_block1_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block1_2_conv (Conv2D) (None, 28, 28, 128) 147584 conv3_block1_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block1_2_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block1_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block1_2_relu (Activation (None, 28, 28, 128) 0 conv3_block1_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block1_0_conv (Conv2D) (None, 28, 28, 512) 131584 conv2_block3_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block1_3_conv (Conv2D) (None, 28, 28, 512) 66048 conv3_block1_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block1_0_bn (BatchNormali (None, 28, 28, 512) 2048 conv3_block1_0_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block1_3_bn (BatchNormali (None, 28, 28, 512) 2048 conv3_block1_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block1_add (Add) (None, 28, 28, 512) 0 conv3_block1_0_bn[0][0] \n", + " conv3_block1_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block1_out (Activation) (None, 28, 28, 512) 0 conv3_block1_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block2_1_conv (Conv2D) (None, 28, 28, 128) 65664 conv3_block1_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block2_1_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block2_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block2_1_relu (Activation (None, 28, 28, 128) 0 conv3_block2_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block2_2_conv (Conv2D) (None, 28, 28, 128) 147584 conv3_block2_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block2_2_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block2_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block2_2_relu (Activation (None, 28, 28, 128) 0 conv3_block2_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block2_3_conv (Conv2D) (None, 28, 28, 512) 66048 conv3_block2_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block2_3_bn (BatchNormali (None, 28, 28, 512) 2048 conv3_block2_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block2_add (Add) (None, 28, 28, 512) 0 conv3_block1_out[0][0] \n", + " conv3_block2_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block2_out (Activation) (None, 28, 28, 512) 0 conv3_block2_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block3_1_conv (Conv2D) (None, 28, 28, 128) 65664 conv3_block2_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block3_1_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block3_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block3_1_relu (Activation (None, 28, 28, 128) 0 conv3_block3_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block3_2_conv (Conv2D) (None, 28, 28, 128) 147584 conv3_block3_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block3_2_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block3_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block3_2_relu (Activation (None, 28, 28, 128) 0 conv3_block3_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block3_3_conv (Conv2D) (None, 28, 28, 512) 66048 conv3_block3_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block3_3_bn (BatchNormali (None, 28, 28, 512) 2048 conv3_block3_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block3_add (Add) (None, 28, 28, 512) 0 conv3_block2_out[0][0] \n", + " conv3_block3_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block3_out (Activation) (None, 28, 28, 512) 0 conv3_block3_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block4_1_conv (Conv2D) (None, 28, 28, 128) 65664 conv3_block3_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block4_1_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block4_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block4_1_relu (Activation (None, 28, 28, 128) 0 conv3_block4_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block4_2_conv (Conv2D) (None, 28, 28, 128) 147584 conv3_block4_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block4_2_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block4_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block4_2_relu (Activation (None, 28, 28, 128) 0 conv3_block4_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block4_3_conv (Conv2D) (None, 28, 28, 512) 66048 conv3_block4_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block4_3_bn (BatchNormali (None, 28, 28, 512) 2048 conv3_block4_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block4_add (Add) (None, 28, 28, 512) 0 conv3_block3_out[0][0] \n", + " conv3_block4_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block4_out (Activation) (None, 28, 28, 512) 0 conv3_block4_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block1_1_conv (Conv2D) (None, 14, 14, 256) 131328 conv3_block4_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block1_1_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block1_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block1_1_relu (Activation (None, 14, 14, 256) 0 conv4_block1_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block1_2_conv (Conv2D) (None, 14, 14, 256) 590080 conv4_block1_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block1_2_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block1_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block1_2_relu (Activation (None, 14, 14, 256) 0 conv4_block1_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block1_0_conv (Conv2D) (None, 14, 14, 1024) 525312 conv3_block4_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block1_3_conv (Conv2D) (None, 14, 14, 1024) 263168 conv4_block1_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block1_0_bn (BatchNormali (None, 14, 14, 1024) 4096 conv4_block1_0_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block1_3_bn (BatchNormali (None, 14, 14, 1024) 4096 conv4_block1_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block1_add (Add) (None, 14, 14, 1024) 0 conv4_block1_0_bn[0][0] \n", + " conv4_block1_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block1_out (Activation) (None, 14, 14, 1024) 0 conv4_block1_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block2_1_conv (Conv2D) (None, 14, 14, 256) 262400 conv4_block1_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block2_1_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block2_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block2_1_relu (Activation (None, 14, 14, 256) 0 conv4_block2_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block2_2_conv (Conv2D) (None, 14, 14, 256) 590080 conv4_block2_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block2_2_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block2_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block2_2_relu (Activation (None, 14, 14, 256) 0 conv4_block2_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block2_3_conv (Conv2D) (None, 14, 14, 1024) 263168 conv4_block2_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block2_3_bn (BatchNormali (None, 14, 14, 1024) 4096 conv4_block2_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block2_add (Add) (None, 14, 14, 1024) 0 conv4_block1_out[0][0] \n", + " conv4_block2_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block2_out (Activation) (None, 14, 14, 1024) 0 conv4_block2_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block3_1_conv (Conv2D) (None, 14, 14, 256) 262400 conv4_block2_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block3_1_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block3_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block3_1_relu (Activation (None, 14, 14, 256) 0 conv4_block3_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block3_2_conv (Conv2D) (None, 14, 14, 256) 590080 conv4_block3_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block3_2_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block3_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block3_2_relu (Activation (None, 14, 14, 256) 0 conv4_block3_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block3_3_conv (Conv2D) (None, 14, 14, 1024) 263168 conv4_block3_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block3_3_bn (BatchNormali (None, 14, 14, 1024) 4096 conv4_block3_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block3_add (Add) (None, 14, 14, 1024) 0 conv4_block2_out[0][0] \n", + " conv4_block3_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block3_out (Activation) (None, 14, 14, 1024) 0 conv4_block3_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block4_1_conv (Conv2D) (None, 14, 14, 256) 262400 conv4_block3_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block4_1_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block4_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block4_1_relu (Activation (None, 14, 14, 256) 0 conv4_block4_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block4_2_conv (Conv2D) (None, 14, 14, 256) 590080 conv4_block4_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block4_2_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block4_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block4_2_relu (Activation (None, 14, 14, 256) 0 conv4_block4_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block4_3_conv (Conv2D) (None, 14, 14, 1024) 263168 conv4_block4_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block4_3_bn (BatchNormali (None, 14, 14, 1024) 4096 conv4_block4_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block4_add (Add) (None, 14, 14, 1024) 0 conv4_block3_out[0][0] \n", + " conv4_block4_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block4_out (Activation) (None, 14, 14, 1024) 0 conv4_block4_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block5_1_conv (Conv2D) (None, 14, 14, 256) 262400 conv4_block4_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block5_1_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block5_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block5_1_relu (Activation (None, 14, 14, 256) 0 conv4_block5_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block5_2_conv (Conv2D) (None, 14, 14, 256) 590080 conv4_block5_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block5_2_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block5_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block5_2_relu (Activation (None, 14, 14, 256) 0 conv4_block5_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block5_3_conv (Conv2D) (None, 14, 14, 1024) 263168 conv4_block5_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block5_3_bn (BatchNormali (None, 14, 14, 1024) 4096 conv4_block5_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block5_add (Add) (None, 14, 14, 1024) 0 conv4_block4_out[0][0] \n", + " conv4_block5_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block5_out (Activation) (None, 14, 14, 1024) 0 conv4_block5_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block6_1_conv (Conv2D) (None, 14, 14, 256) 262400 conv4_block5_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block6_1_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block6_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block6_1_relu (Activation (None, 14, 14, 256) 0 conv4_block6_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block6_2_conv (Conv2D) (None, 14, 14, 256) 590080 conv4_block6_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block6_2_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block6_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block6_2_relu (Activation (None, 14, 14, 256) 0 conv4_block6_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block6_3_conv (Conv2D) (None, 14, 14, 1024) 263168 conv4_block6_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block6_3_bn (BatchNormali (None, 14, 14, 1024) 4096 conv4_block6_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block6_add (Add) (None, 14, 14, 1024) 0 conv4_block5_out[0][0] \n", + " conv4_block6_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block6_out (Activation) (None, 14, 14, 1024) 0 conv4_block6_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block1_1_conv (Conv2D) (None, 7, 7, 512) 524800 conv4_block6_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block1_1_bn (BatchNormali (None, 7, 7, 512) 2048 conv5_block1_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block1_1_relu (Activation (None, 7, 7, 512) 0 conv5_block1_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block1_2_conv (Conv2D) (None, 7, 7, 512) 2359808 conv5_block1_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block1_2_bn (BatchNormali (None, 7, 7, 512) 2048 conv5_block1_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block1_2_relu (Activation (None, 7, 7, 512) 0 conv5_block1_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block1_0_conv (Conv2D) (None, 7, 7, 2048) 2099200 conv4_block6_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block1_3_conv (Conv2D) (None, 7, 7, 2048) 1050624 conv5_block1_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block1_0_bn (BatchNormali (None, 7, 7, 2048) 8192 conv5_block1_0_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block1_3_bn (BatchNormali (None, 7, 7, 2048) 8192 conv5_block1_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block1_add (Add) (None, 7, 7, 2048) 0 conv5_block1_0_bn[0][0] \n", + " conv5_block1_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block1_out (Activation) (None, 7, 7, 2048) 0 conv5_block1_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block2_1_conv (Conv2D) (None, 7, 7, 512) 1049088 conv5_block1_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block2_1_bn (BatchNormali (None, 7, 7, 512) 2048 conv5_block2_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block2_1_relu (Activation (None, 7, 7, 512) 0 conv5_block2_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block2_2_conv (Conv2D) (None, 7, 7, 512) 2359808 conv5_block2_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block2_2_bn (BatchNormali (None, 7, 7, 512) 2048 conv5_block2_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block2_2_relu (Activation (None, 7, 7, 512) 0 conv5_block2_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block2_3_conv (Conv2D) (None, 7, 7, 2048) 1050624 conv5_block2_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block2_3_bn (BatchNormali (None, 7, 7, 2048) 8192 conv5_block2_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block2_add (Add) (None, 7, 7, 2048) 0 conv5_block1_out[0][0] \n", + " conv5_block2_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block2_out (Activation) (None, 7, 7, 2048) 0 conv5_block2_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block3_1_conv (Conv2D) (None, 7, 7, 512) 1049088 conv5_block2_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block3_1_bn (BatchNormali (None, 7, 7, 512) 2048 conv5_block3_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block3_1_relu (Activation (None, 7, 7, 512) 0 conv5_block3_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block3_2_conv (Conv2D) (None, 7, 7, 512) 2359808 conv5_block3_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block3_2_bn (BatchNormali (None, 7, 7, 512) 2048 conv5_block3_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block3_2_relu (Activation (None, 7, 7, 512) 0 conv5_block3_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block3_3_conv (Conv2D) (None, 7, 7, 2048) 1050624 conv5_block3_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block3_3_bn (BatchNormali (None, 7, 7, 2048) 8192 conv5_block3_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block3_add (Add) (None, 7, 7, 2048) 0 conv5_block2_out[0][0] \n", + " conv5_block3_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block3_out (Activation) (None, 7, 7, 2048) 0 conv5_block3_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "avg_pool (GlobalAveragePooling2 (None, 2048) 0 conv5_block3_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "predictions (Dense) (None, 1000) 2049000 avg_pool[0][0] \n", + "==================================================================================================\n", + "Total params: 25,636,712\n", + "Trainable params: 25,583,592\n", + "Non-trainable params: 53,120\n", + "__________________________________________________________________________________________________\n" + ] + } + ], + "source": [ + "resnet = keras.applications.ResNet50()\n", + "resnet.summary()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "ನೀವು ನೋಡಬಹುದು, ಈ ಮಾದರಿ ಅದೇ ಪರಿಚಿತ ನಿರ್ಮಾಣ ಘಟಕಗಳನ್ನು ಹೊಂದಿದೆ: ಸಂಯೋಜಕ ಲೇಯರ್‌ಗಳು, ಪೂಲಿಂಗ್ ಲೇಯರ್‌ಗಳು ಮತ್ತು ಅಂತಿಮ ಘನ ವರ್ಗೀಕರಣಕಾರ. ನಾವು ಈ ಮಾದರಿಯನ್ನು ಸ್ವಲ್ಪಸಮಯದಿಂದ VGG-16 ಅನ್ನು ಟ್ರಾನ್ಸ್‌ಫರ್ ಲರ್ನಿಂಗ್‌ಗಾಗಿ ಬಳಸುತ್ತಿರುವುದನ್ನು ಬೇರೆಯಾಗಿ ಬಳಸಬಹುದಾಗಿದೆ. ನೀವು ಮೇಲಿನ ಕೋಡ್‌ನೊಂದಿಗೆ ವಿವಿಧ ResNet ಮಾದರಿಗಳನ್ನು ಮೂಲ ಮಾದರಿಯಾಗಿ ಉಪಯೋಗಿಸುವ ಮೂಲಕ ಪ್ರಯೋಗ ಮಾಡಬಹುದು ಮತ್ತು ನಿಖರತೆ ಹೇಗೆ ಬದಲಾಗುತ್ತದೆ ಎಂಬುದನ್ನು ನೋಡಿ.\n", + "\n", + "## ಬ್ಯಾಚ್ ನಾರ್ಮಲೈಜೆಷನ್\n", + "\n", + "ಈ ಜಾಲವು ಮತ್ತೊಂದು ರೀತಿಯ ಲೇಯರ್ ಅನ್ನು ಒಳಗೊಂಡಿದೆ: **ಬ್ಯಾಚ್ ನಾರ್ಮಲೈಜೆಷನ್**. ಬ್ಯಾಚ್ ನಾರ್ಮಲೈಜೆಷನ್‌ನ ಸಂಶಯವೆಂದರೆ ನ್ಯೂರಲ್ ನೆಟ್ವರ್ಕ್ ಮೂಲಕ ಹರಿದಾಡುವ ಮೌಲ್ಯಗಳನ್ನು ಸರಿಯಾದ ವಿಭಾಜನೆಗೆ ತರುವುದಾಗಿದೆ. ಸಾಮಾನ್ಯವಾಗಿ ನ್ಯೂರಲ್ ನೆಟ್ವರ್ಕ್‌ಗಳು ಎಲ್ಲ ಮೌಲ್ಯಗಳು [-1,1] ಅಥವಾ [0,1] ಶ್ರೇಣಿಯಲ್ಲಿ ಇದಾಗಿದ್ದಾಗ ಉತ್ತಮವಾಗಿ ಕೆಲಸ ಮಾಡುತ್ತವೆ, ಹಾಗೂ ಆದ್ದರಿಂದ ನಾವು ನಮ್ಮ ಇನ್‌ಪುಟ್ ಡೇಟಾವನ್ನು ತಕ್ಕಂತೆ ಪರಿಭ್ರಮನ ಮಾಡುತ್ತೇವೆ/ನಾರ್ಮಲೈಸ್ ಮಾಡುತ್ತೇವೆ. ಆದಾಗ್ಯೂ, ಆಳವಾದ ಜಾಲದ ತರಬೇತಿ ವೇಳೆ, ಮೌಲ್ಯಗಳು ಬಹುಮಾನವಾಗಿಯೂ ಈ ಶ್ರೇಣೆಯ ಹೊರಗೆ ಹೋಗಬಹುದಾಗಿದೆ, ಇದು ತರಬೇತಿಯನ್ನು ಸಮಸ್ಯೆಗೊಳಿಸುತ್ತದೆ. ಬ್ಯಾಚ್ ನಾರ್ಮಲೈಜೆಷನ್ ಲೇಯರ್ ಪ್ರಸ್ತುತ ಮಿನಿಬ್ಯಾಚ್‌ನ ಎಲ್ಲಾ ಮೌಲ್ಯಗಳ ಸರಾಸರಿ ಮತ್ತು ಮಾನದಂಡ ವಿಪರ್ಯಾಸವನ್ನು ಲೆಕ್ಕಿಸಿ, ಮತ್ತು ಅವುಗಳನ್ನು ಬಳಸಿಕೊಂಡು ನ್ಯೂರಲ್ ನೆಟ್ವರ್ಕ್ ಲೇಯರ್ ಮೂಲಕ ಸಿಗ್ನಲ್‌ನ್ನು ಗುಣಾತ್ಮಕಗೊಳಿಸುವ ಮುನ್ನ ನಾರ್ಮಲೈಸ್ ಮಾಡುತ್ತದೆ. ಇದು ಆಳವಾದ ಜಾಲಗಳ ಸ್ಥಿತಿಶೀಲತೆಯನ್ನು ಪ್ರಮುಖವಾಗಿ ಸುಧಾರಿಸುತ್ತದೆ.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## ಸಾರಾಂಶ\n", + "\n", + "ಟ್ರಾನ್ಸ್‌ಫರ್ ಲರ್ನಿಂಗ್ ಅನ್ನು ಬಳಸಿಕೊಂಡು, ನಾವು ನಮ್ಮ ಕಸ್ಟಮ್ ವಸ್ತು ವರ್ಗೀಕರಣ ಕಾರ್ಯಕ್ಕಾಗಿ ವೇಗವಾಗಿ ವರ್ಗೀಕರಣ ಯಂತ್ರವನ್ನು ರಚಿಸಲು ಮತ್ತು ಹೆಚ್ಚಿನ ನಿಖರತೆಯನ್ನು ಸಾಧಿಸಲು ಸಾಧ್ಯವಾಯಿತು. ಆದರೆ, ಈ ಉದಾಹರಣೆ ಸಂಪೂರ್ಣವಾಗಿ ನ್ಯಾಯಯುತವಾಗಿರಲಿಲ್ಲ, ಏಕೆಂದರೆ ಮೂಲ VGG-16 ನೆಟ್‌ವರ್ಕ್ ಹಂಸೆ ಮತ್ತು ನಾಯಿಗಳನ್ನು ಗುರುತಿಸಲು ಪೂರ್ವಭಾವಿಯಾಗಿ ತರಬೇತುದಾಯಿತು, ಹಾಗಾಗಿ ನಾವು ನೆಟ್‌ವರ್ಕ್‌ನಲ್ಲಿ ಈಗಾಗಲೇ ಇದ್ದ większość ಮಾದರಿಗಳನ್ನು ಮತ್ತೆ ಉಪಯೋಗಿಸುತ್ತಿದ್ದೇವೆ. ಉತ್ಪಾದನಾ ಲೈನ್‌ನ ವಿವರಗಳು ಅಥವಾ ವಿಭಿನ್ನ ಮರದ ಎಲೆಗಳಂತೆ ವಿಶೇಷ ಪ್ರಾಂತ್ಯದ ವಸ್ತುಗಳ ಮೇಲೆ ಕಡಿಮೆ ನಿಖರತೆಯನ್ನು ನಿರೀಕ್ಷಿಸಬಹುದು.\n", + "\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" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "py38_tensorflow", + "language": "python", + "name": "conda-env-py38_tensorflow-py" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 4 } \ No newline at end of file diff --git a/translations/kn/lessons/5-NLP/README.md b/translations/kn/lessons/5-NLP/README.md index e15bb48587..9ac74df45d 100644 --- a/translations/kn/lessons/5-NLP/README.md +++ b/translations/kn/lessons/5-NLP/README.md @@ -1,51 +1,51 @@ # ನೈಸರ್ಗಿಕ ಭಾಷಾ ಪ್ರಕ್ರಿಯೆ -![NLP ಕಾರ್ಯಗಳ ಸಾರಾಂಶವನ್ನು ಡೂಡಲ್‌ನಲ್ಲಿ](../../../../translated_images/kn/ai-nlp.b22dcb8ca4707cea.webp) +![NLP ಕಾರ್ಯಗಳ ಸಾರಾಂಶವೊಂದರ ಡೂದಲ](../../../../translated_images/kn/ai-nlp.b22dcb8ca4707cea.webp) -ಈ ವಿಭಾಗದಲ್ಲಿ, ನಾವು ನ್ಯೂರಲ್ ನೆಟ್‌ವರ್ಕ್‌ಗಳನ್ನು ಬಳಸಿಕೊಂಡು **ನೈಸರ್ಗಿಕ ಭಾಷಾ ಪ್ರಕ್ರಿಯೆ (NLP)** ಸಂಬಂಧಿತ ಕಾರ್ಯಗಳನ್ನು ನಿರ್ವಹಿಸುವುದರ ಮೇಲೆ ಗಮನಹರಿಸುವೆವು. ಕಂಪ್ಯೂಟರ್‌ಗಳು ಪರಿಹರಿಸಬೇಕಾದ ಅನೇಕ NLP ಸಮಸ್ಯೆಗಳಿವೆ: +ಈ ವಿಭಾಗದಲ್ಲಿ, ನಾವು ನ್ಯೂರಲ್ ನೆಟ್‌ವರ್ಕ್‌ಗಳನ್ನು ಬಳಸಿಕೊಂಡು **ನೈಸರ್ಗಿಕ ಭಾಷಾ ಪ್ರಕ್ರಿಯೆ (NLP)** ಸಂಬಂಧಿತ ಕಾರ್ಯಗಳನ್ನು ನಿರ್ವಹಿಸುವುದಕ್ಕೆ ಗಮನ ಹರಿಸುವೆವು. ಗಣಕ ಯಂತ್ರಗಳು ಅನೇಕ NLP ಸಮಸ್ಯೆಗಳನ್ನು ಪರಿಹರಿಸಲು ಸಾಧ್ಯವಾಗಬೇಕು: -* **ಪಠ್ಯ ವರ್ಗೀಕರಣ** ಎಂದರೆ ಪಠ್ಯ ಕ್ರಮಗಳ ಸಂಬಂಧಿಸಿದ ಸಾಮಾನ್ಯ ವರ್ಗೀಕರಣ ಸಮಸ್ಯೆ. ಉದಾಹರಣೆಗೆ, ಇಮೇಲ್ ಸಂದೇಶಗಳನ್ನು ಸ್ಪ್ಯಾಮ್ ಅಥವಾ ಸ್ಪ್ಯಾಮ್ ಅಲ್ಲ ಎಂದು ವರ್ಗೀಕರಿಸುವುದು, ಅಥವಾ ಲೇಖನಗಳನ್ನು ಕ್ರೀಡೆ, ವ್ಯವಹಾರ, ರಾಜಕಾರಣ ಇತ್ಯಾದಿಯಾಗಿ ವರ್ಗೀಕರಿಸುವುದು. ಚಾಟ್ ಬಾಟ್‌ಗಳನ್ನು ಅಭಿವೃದ್ಧಿಪಡಿಸುವಾಗ, ಬಳಕೆದಾರನು ಏನು ಹೇಳಲು ಬಯಸಿದನು ಎಂಬುದನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳಬೇಕಾಗುತ್ತದೆ — ಇದನ್ನು **ಉದ್ದೇಶ ವರ್ಗೀಕರಣ** ಎಂದು ಕರೆಯುತ್ತಾರೆ. ಉದ್ದೇಶ ವರ್ಗೀಕರಣದಲ್ಲಿ ಸಾಮಾನ್ಯವಾಗಿ ಅನೇಕ ವರ್ಗಗಳನ್ನು ನಿರ್ವಹಿಸಬೇಕಾಗುತ್ತದೆ. -* **ಭಾವನಾತ್ಮಕ ವಿಶ್ಲೇಷಣೆ** ಎಂದರೆ ಒಂದು ವಾಕ್ಯದ ಅರ್ಥವು ಎಷ್ಟು ಧನಾತ್ಮಕ ಅಥವಾ ಋಣಾತ್ಮಕ ಎಂಬುದನ್ನು ಸೂಚಿಸುವ ಸಂಖ್ಯೆಯನ್ನು (ಭಾವನೆಯನ್ನು) ನೀಡುವ ಸಾಮಾನ್ಯ ರಿಗ್ರೆಷನ್ ಸಮಸ್ಯೆ. ಭಾವನಾತ್ಮಕ ವಿಶ್ಲೇಷಣೆಯ ಹೆಚ್ಚು ಪ್ರಗತಿಶೀಲ ಆವೃತ್ತಿ **ಅಂಶಾಧಾರಿತ ಭಾವನಾತ್ಮಕ ವಿಶ್ಲೇಷಣೆ** (ABSA), ಇದರಲ್ಲಿ ಭಾವನೆ ಸಂಪೂರ್ಣ ವಾಕ್ಯಕ್ಕೆ ಅಲ್ಲದೆ ಅದರ ವಿಭಿನ್ನ ಭಾಗಗಳಿಗೆ (ಅಂಶಗಳಿಗೆ) ನೀಡಲಾಗುತ್ತದೆ, ಉದಾ. *ಈ ರೆಸ್ಟೋರೆಂಟ್‌ನಲ್ಲಿ, ನನಗೆ ಆಹಾರ ಇಷ್ಟವಾಯಿತು, ಆದರೆ ವಾತಾವರಣ ಭಯಂಕರವಾಗಿತ್ತು*. -* **ನಾಮಿತ ಘಟಕ ಗುರುತಿಸುವಿಕೆ** (NER) ಎಂದರೆ ಪಠ್ಯದಿಂದ ನಿರ್ದಿಷ್ಟ ಘಟಕಗಳನ್ನು ಹೊರತೆಗೆಯುವ ಸಮಸ್ಯೆ. ಉದಾಹರಣೆಗೆ, *ನಾನು ನಾಳೆ ಪ್ಯಾರಿಸ್‌ಗೆ ಹಾರಬೇಕಾಗಿದೆ* ಎಂಬ ವಾಕ್ಯದಲ್ಲಿ *ನಾಳೆ* ಎಂಬ ಪದವು ದಿನಾಂಕವನ್ನು ಸೂಚಿಸುತ್ತದೆ ಮತ್ತು *ಪ್ಯಾರಿಸ್* ಸ್ಥಳವನ್ನು ಸೂಚಿಸುತ್ತದೆ ಎಂದು ಅರ್ಥಮಾಡಿಕೊಳ್ಳಬೇಕಾಗುತ್ತದೆ. -* **ಕೀವರ್ಡ್ ಹೊರತೆಗೆಯುವಿಕೆ** NER ಗೆ ಸಮಾನವಾಗಿದೆ, ಆದರೆ ನಾವು ನಿರ್ದಿಷ್ಟ ಘಟಕ ಪ್ರಕಾರಗಳಿಗೆ ಪೂರ್ವ-ಪ್ರಶಿಕ್ಷಣವಿಲ್ಲದೆ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ವಾಕ್ಯದ ಅರ್ಥಕ್ಕೆ ಮುಖ್ಯವಾದ ಪದಗಳನ್ನು ಹೊರತೆಗೆಯಬೇಕಾಗುತ್ತದೆ. -* **ಪಠ್ಯ ಗುಂಪುಮಾಡುವಿಕೆ** ಸಮಾನವಾದ ವಾಕ್ಯಗಳನ್ನು ಗುಂಪುಮಾಡಲು ಉಪಯುಕ್ತವಾಗಬಹುದು, ಉದಾಹರಣೆಗೆ ತಾಂತ್ರಿಕ ಬೆಂಬಲ ಸಂಭಾಷಣೆಗಳಲ್ಲಿ ಸಮಾನ ವಿನಂತಿಗಳನ್ನು ಗುಂಪುಮಾಡುವುದು. -* **ಪ್ರಶ್ನೆ ಉತ್ತರಿಸುವಿಕೆ** ಎಂದರೆ ಮಾದರಿ ನಿರ್ದಿಷ್ಟ ಪ್ರಶ್ನೆಗೆ ಉತ್ತರ ನೀಡುವ ಸಾಮರ್ಥ್ಯ. ಮಾದರಿ ಪಠ್ಯ ಭಾಗ ಮತ್ತು ಪ್ರಶ್ನೆಯನ್ನು ಇನ್‌ಪುಟ್ ಆಗಿ ಪಡೆಯುತ್ತದೆ ಮತ್ತು ಪ್ರಶ್ನೆಗೆ ಉತ್ತರ ಇರುವ ಪಠ್ಯದ ಸ್ಥಳವನ್ನು ನೀಡಬೇಕಾಗುತ್ತದೆ (ಅಥವಾ ಕೆಲವೊಮ್ಮೆ ಉತ್ತರ ಪಠ್ಯವನ್ನು ರಚಿಸಬೇಕಾಗುತ್ತದೆ). -* **ಪಠ್ಯ ರಚನೆ** ಎಂದರೆ ಮಾದರಿ ಹೊಸ ಪಠ್ಯವನ್ನು ರಚಿಸುವ ಸಾಮರ್ಥ್ಯ. ಇದನ್ನು ಕೆಲವು *ಪಠ್ಯ ಪ್ರಾಂಪ್ಟ್* ಆಧರಿಸಿ ಮುಂದಿನ ಅಕ್ಷರ/ಪದವನ್ನು ಭವಿಷ್ಯವಾಣಿ ಮಾಡುವ ವರ್ಗೀಕರಣ ಕಾರ್ಯವೆಂದು ಪರಿಗಣಿಸಬಹುದು. GPT-3 ಮುಂತಾದ ಪ್ರಗತಿಶೀಲ ಪಠ್ಯ ರಚನೆ ಮಾದರಿಗಳು [prompt programming](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) ಅಥವಾ [prompt engineering](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29) ಎಂಬ ತಂತ್ರಗಳನ್ನು ಬಳಸಿ ಇತರ NLP ಕಾರ್ಯಗಳನ್ನು ಸಹ ಪರಿಹರಿಸಬಹುದು. -* **ಪಠ್ಯ ಸಾರಾಂಶ** ಎಂದರೆ ಕಂಪ್ಯೂಟರ್‌ನ್ನು ದೀರ್ಘ ಪಠ್ಯವನ್ನು "ಓದಿ" ಅದನ್ನು ಕೆಲವು ವಾಕ್ಯಗಳಲ್ಲಿ ಸಾರಾಂಶಗೊಳಿಸುವ ತಂತ್ರ. -* **ಯಂತ್ರ ಅನುವಾದ** ಒಂದು ಭಾಷೆಯ ಪಠ್ಯ ಅರ್ಥಮಾಡಿಕೊಳ್ಳುವಿಕೆ ಮತ್ತು ಮತ್ತೊಂದು ಭಾಷೆಯಲ್ಲಿ ಪಠ್ಯ ರಚನೆಯ ಸಂಯೋಜನೆಯಾಗಿ ಪರಿಗಣಿಸಬಹುದು. +* **ಟೆಕ್ಸ್ಟ್ ವರ್ಗೀಕರಣ** ಎನ್ನುವುದು ಪಠ್ಯ ಕ್ರಮಗಳ ಸಾದಾರಣ ವರ್ಗೀಕರಣ ಸಮಸ್ಯೆಯಾಗಿದೆ. ಉದಾಹರಣೆಗೆ, ಇಮೇಲ್ ಸಂದೇಶಗಳನ್ನು ಸ್ಪ್ಯಾಮ್ ಅಥವಾ ಸ್ಪ್ಯಾಮ್ ಅಲ್ಲದಂತೆ ವರ್ಗೀಕರಿಸುವುದು, ಅಥವಾ ಲೇಖನಗಳನ್ನು ಕ್ರೀಡೆ, ವ್ಯಾಪಾರ, ರಾಜಕಾರಣ ಮುಂತಾದಂತೆ ವರ್ಗೀಕರಿಸುವುದು. ಚಾಟ್ ಬಾಟ್‌ಗಳನ್ನು ಅಭಿವೃದ್ಧಿಪಡಿಸುವಾಗ, ನಾವು ಸಾಮಾನ್ಯವಾಗಿ ಬಳಕೆದಾರನ ಉದ್ದೇಶವನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳಬೇಕಾಗುತ್ತದೆ -- ಈ ಸಂದರ್ಭದಲ್ಲಿ ನಾವು **ಉದ್ದೇಶ ವರ್ಗೀಕರಣ** ಜೊತೆ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತೇವೆ. ಬಹುಶಃ, ಉದ್ದೇಶ ವರ್ಗೀಕರಣದಲ್ಲಿ ಅನೇಕ ವರ್ಗಗಳನ್ನು ಕೈಗಾರಿಕೆ ಮಾಡಬೇಕಾಗಬಹುದು. +* **ಭಾವ ವಿಶ್ಲೇಷಣೆ** ಎನ್ನುವುದು ಸಾದಾರಣ ರಿಗ್ರೇಶನ್ ಸಮಸ್ಯೆಯಾಗಿದ್ದು, ವಾಕ್ಯದ ಅರ್ಥವು ಧನಾತ್ಮಕ ಅಥವಾ ಋಣಾತ್ಮಕವೆಂಬುದನ್ನು ತೋರುವ ಸಂಖ್ಯೆಯನ್ನು (ಭಾವನೆಯನ್ನು) ಅಂಕೆ ಮಾಡಬೇಕಾಗುತ್ತದೆ. ಭಾವ ವಿಶ್ಲೇಷಣೆಯ ಮುಂದುವರೆದ ರೂಪವು **ಪರಿಕಲ್ಪನೆ ಆಧಾರಿತ ಭಾವ ವಿಶ್ಲೇಷಣೆ** (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 ಕಾರ್ಯಗಳನ್ನು ವಿಶ್ಲೇಷಣೆ ಸೇರಿದಂತೆ ಬಗೆಹರಿಸಬಲ್ಲವು. +* **ಪಠ್ಯ ಸಂಕ್ಷೇಪಣೆ** ಎಂದರೆ ಗಣಕ ಯಂತ್ರವು ದೀರ್ಘ ಪಠ್ಯವನ್ನು "ಓದಿ" ಕೆಲವು ವಾಕ್ಯಗಳಲ್ಲಿ ಸಂಕ್ಷೇಪಿಸುವ ತಂತ್ರ. +* **ಯಂತ್ರ ಭಾಷಾಂತರ** ಅನ್ನು ಒಂದು ಭಾಷೆಯಲ್ಲಿ ಪಠ್ಯ ಬುದ್ಧಿವಂತಿಕೆಯನ್ನು ಮತ್ತು ಇನ್ನೊಂದು ಭಾಷೆಯಲ್ಲಿ ಪಠ್ಯ ಸೃಷ್ಟಿಮಾಡುವ ಸಂಯೋಜನೆಯಾಗಿ ನೋಡಬಹುದು. -ಆರಂಭದಲ್ಲಿ, ಹೆಚ್ಚಿನ NLP ಕಾರ್ಯಗಳನ್ನು ವ್ಯಾಕರಣಗಳಂತಹ ಪರಂಪರাগত ವಿಧಾನಗಳಿಂದ ಪರಿಹರಿಸಲಾಗುತ್ತಿತ್ತು. ಉದಾಹರಣೆಗೆ, ಯಂತ್ರ ಅನುವಾದದಲ್ಲಿ ಪ್ರಾರಂಭಿಕ ವಾಕ್ಯವನ್ನು ವ್ಯಾಕರಣ ವೃಕ್ಷಕ್ಕೆ ಪರಿವರ್ತಿಸಲು ಪಾರ್ಸರ್‌ಗಳನ್ನು ಬಳಸಲಾಗುತ್ತಿತ್ತು, ನಂತರ ವಾಕ್ಯದ ಅರ್ಥವನ್ನು ಪ್ರತಿನಿಧಿಸುವ ಉನ್ನತ ಮಟ್ಟದ ಅರ್ಥಾತ್ಮಕ ರಚನೆಗಳನ್ನು ಹೊರತೆಗೆಯಲಾಗುತ್ತಿತ್ತು, ಮತ್ತು ಈ ಅರ್ಥ ಮತ್ತು ಗುರಿ ಭಾಷೆಯ ವ್ಯಾಕರಣ ಆಧರಿಸಿ ಫಲಿತಾಂಶವನ್ನು ರಚಿಸಲಾಗುತ್ತಿತ್ತು. ಇಂದಿನ ದಿನಗಳಲ್ಲಿ, ಅನೇಕ NLP ಕಾರ್ಯಗಳನ್ನು ನ್ಯೂರಲ್ ನೆಟ್‌ವರ್ಕ್‌ಗಳ ಮೂಲಕ ಹೆಚ್ಚು ಪರಿಣಾಮಕಾರಿಯಾಗಿ ಪರಿಹರಿಸಲಾಗುತ್ತಿದೆ. +ಪ್ರಾರಂಭದಲ್ಲಿ ಬಹುತೇಕ NLP ಕಾರ್ಯಗಳನ್ನು ವ್ಯಾಕರಣಗಳಂತಹ ಪರಂಪರागत ವಿಧಾನಗಳನ್ನು ಬಳಸಿಕೊಂಡು ಪರಿಹರಿಸಲಾಗುತಿತ್ತು. ಉದಾಹರಣೆಗೆ, ಯಂತ್ರ ಭಾಷಾಂತರದಲ್ಲಿ ಆವೃತ್ತಿ ವಾಕ್ಯವನ್ನು ವಾಕ್ಯವಿಜ್ಞಾನ ಮರವಾಗಿಕೊಡಲು ಪಾರ್ಸರ್‌ಗಳು ಉಪಯೋಗಿಸಲಾಯಿತು, ನಂತರ ವಾಕ್ಯದ ಅರ್ಥವನ್ನು ಪ್ರತಿನಿಧಿಸುವ ಉನ್ನತತಮ ಸ್ಥಾನದ ಅರ್ಥಿಕ ರಚನೆಗಳನ್ನು ತೆಗೆಯಲಾಯಿತು ಮತ್ತು ಗುರಿ ಭಾಷೆಯ ವ್ಯಾಕರಣ ಆಧರಿಸಿ ಫಲಿತಾಂಶವನ್ನು ಸೃಷ್ಟಿಸಲಾಯಿತು. ಇತ್ತೀಚೆಗೆ, ಅನೇಕ NLP ಕಾರ್ಯಗಳನ್ನು ನ್ಯೂರಲ್ ನೆಟ್‌ವರ್ಕ್‌ಗಳ ಬಳಕೆಯೊಂದಿಗೆ ಹೆಚ್ಚು ಪರಿಣಾಮಕಾರಿಯಾಗಿ ಪರಿಹರಿಸಲಾಗುತ್ತಿದೆ. -> ಅನೇಕ ಶ್ರೇಷ್ಟ NLP ವಿಧಾನಗಳು [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org) ಪೈಥಾನ್ ಗ್ರಂಥಾಲಯದಲ್ಲಿ ಅನುಷ್ಠಾನಗೊಳ್ಳುತ್ತವೆ. ವಿವಿಧ NLP ಕಾರ್ಯಗಳನ್ನು NLTK ಬಳಸಿ ಹೇಗೆ ಪರಿಹರಿಸಬಹುದು ಎಂಬುದನ್ನು ವಿವರಿಸುವ [NLTK ಪುಸ್ತಕ](https://www.nltk.org/book/) ಆನ್‌ಲೈನ್‌ನಲ್ಲಿ ಲಭ್ಯವಿದೆ. +> ಬಹುತೇಕ ಶ್ರೇಷ್ಟ ಪರಂಪರাগত NLP ವಿಧಾನಗಳು [ನೈಸರ್ಗಿಕ ಭಾಷಾ ಪ್ರಕ್ರಿಯೆ ಉಪಕರಣ ಕಿಟ್ (NLTK)](https://www.nltk.org) ಮೇಲಾಗಿರುವ ಪೈಥಾನ್ ಗ್ರಂಥಾಲಯದಲ್ಲಿ ಅಳವಡಿಸಲಾಗಿವೆ. ವಿಭಿನ್ನ NLP ಕಾರ್ಯಗಳನ್ನು NLTK ಬಳಸಿಕೊಂಡು ಹೇಗೆ ಬಗೆಹರಿಸಬಹುದು ಎಂಬುದನ್ನು ಒಳಗೊಂಡ ಅತ್ಯುತ್ತಮ [NLTK ಪುಸ್ತಕ](https://www.nltk.org/book/) ಆನ್‌ಲાઈન ಲಭ್ಯವಿದೆ. -ನಮ್ಮ ಕೋರ್ಸ್‌ನಲ್ಲಿ, ನಾವು ಮುಖ್ಯವಾಗಿ NLP ಗಾಗಿ ನ್ಯೂರಲ್ ನೆಟ್‌ವರ್ಕ್‌ಗಳನ್ನು ಬಳಸುವುದರ ಮೇಲೆ ಗಮನಹರಿಸುವೆವು ಮತ್ತು ಅಗತ್ಯವಿದ್ದಲ್ಲಿ NLTK ಅನ್ನು ಬಳಸುವೆವು. +ನಮ್ಮ ಕೋರ್ಸ್‌ನಲ್ಲಿ, ನಾವು ಹೆಚ್ಚಿನ ಅವಧಿಗೆ NLPಗಾಗಿ ನ್ಯೂರಲ್ ನೆಟ್‌ವರ್ಕ್‌ಗಳನ್ನು ಬಳಸುತ್ತೇವೆ ಮತ್ತು ಅಗತ್ಯಪಡಿಸಿದರೆ NLTK ಕೂಡ ಬಳಸುತ್ತೇವೆ. -ನಾವು ಈಗಾಗಲೇ ಟೇಬ್ಯುಲರ್ ಡೇಟಾ ಮತ್ತು ಚಿತ್ರಗಳೊಂದಿಗೆ ನ್ಯೂರಲ್ ನೆಟ್‌ವರ್ಕ್‌ಗಳನ್ನು ಬಳಸುವುದನ್ನು ಕಲಿತಿದ್ದೇವೆ. ಆ ಡೇಟಾ ಪ್ರಕಾರಗಳ ಮತ್ತು ಪಠ್ಯದ ನಡುವಿನ ಮುಖ್ಯ ವ್ಯತ್ಯಾಸವೆಂದರೆ ಪಠ್ಯವು ಬದಲಾಗುವ ಉದ್ದದ ಕ್ರಮವಾಗಿದ್ದು, ಚಿತ್ರಗಳ ಇನ್‌ಪುಟ್ ಗಾತ್ರ ಮುಂಚಿತವಾಗಿ ತಿಳಿದಿರುತ್ತದೆ. ಸಂವೇದಿ ನೆಟ್‌ವರ್ಕ್‌ಗಳು ಇನ್‌ಪುಟ್ ಡೇಟಾದಿಂದ ಮಾದರಿಗಳನ್ನು ಹೊರತೆಗೆಯಬಹುದು, ಆದರೆ ಪಠ್ಯದ ಮಾದರಿಗಳು ಹೆಚ್ಚು ಸಂಕೀರ್ಣವಾಗಿವೆ. ಉದಾ., ನಕಾರಾತ್ಮಕತೆ ವಿಷಯದಿಂದ ದೂರವಿರುವ ಪದಗಳ ನಡುವೆ ಇರಬಹುದು (ಉದಾ. *ನನಗೆ ಕಿತ್ತಳೆಗಳು ಇಷ್ಟವಿಲ್ಲ*, ಮತ್ತು *ನನಗೆ ಆ ದೊಡ್ಡ ಬಣ್ಣಬರಹದ ರುಚಿಕರ ಕಿತ್ತಳೆಗಳು ಇಷ್ಟವಿಲ್ಲ*), ಮತ್ತು ಅದನ್ನು ಒಂದೇ ಮಾದರಿಯಾಗಿ ಅರ್ಥಮಾಡಿಕೊಳ್ಳಬೇಕು. ಆದ್ದರಿಂದ, ಭಾಷೆಯನ್ನು ನಿರ್ವಹಿಸಲು ನಾವು ಹೊಸ ನ್ಯೂರಲ್ ನೆಟ್‌ವರ್ಕ್ ಪ್ರಕಾರಗಳನ್ನು ಪರಿಚಯಿಸಬೇಕಾಗುತ್ತದೆ, ಉದಾ. *ಪುನರಾವರ್ತಿತ ನೆಟ್‌ವರ್ಕ್‌ಗಳು* ಮತ್ತು *ಟ್ರಾನ್ಸ್‌ಫಾರ್ಮರ್‌ಗಳು*. +ನಾವು ಈಗಾಗಲೇ ಟ್ಯಾಬ್ಯುಲರ್ ಡೇಟಾ ಮತ್ತು ಚಿತ್ರಗಳನ್ನು ಹೊಂದಿರುವಲ್ಲಿ ನ್ಯೂರಲ್ ನೆಟ್‌ವರ್ಕ್‌ಗಳನ್ನು ಬಳಸಿದ ಬಗ್ಗೆ ಕಲಿತಿದ್ದೇವೆ. ಆ ಡೇಟಾ ಪ್ರಕಾರಗಳ ಮತ್ತು ಪಠ್ಯದ ಮುಖ್ಯ ಅಂತರ್ಬೇದವು ಪಠ್ಯದ ಕ್ರಮವು ಬದಲಾಗುವ ಉದ್ದದ ಒಂದು ಶ್ರೇಣಿ ಆಗಿದ್ದರೆ, ಚಿತ್ರಗಳ ಇನ್ಪುಟ್ ಗಾತ್ರವನ್ನು ಪೂರ್ವನಿಗದಿಪಡಿಸಲಾಗಿದೆ ಎಂದು ತಿಳಿದುಕೊಳ್ಳಲಾಗಿದೆ. ಸಮೂಕ ಗುಣಗಳು ಇನ್‌ಪುಟ್ ಡೇಟಾದಿಂದ ಹೊರತರಬಹುದು ಎಂದು ಸನ್‌ವಲಯಿತ ಜಾಲಗಳು ಹೇಗೆ ಪ್ರಕಾರಗಳನ್ನು ತೆಗೆದುಕೊಳ್ಳುತ್ತದೆಯೋ, ಪಠ್ಯದ ಪ್ರಕಾರಗಳು ಹೆಚ್ಚು ಸಂಕೀರ್ಣವಾಗಿವೆ. ಉದಾ., ನಿರಾಕರಣವು ವಿಷಯದಿಂದ ಬೇರ್ಪಡಿಸಬಹುದಾದಷ್ಟು ಹಲವಾರು ಪದಗಳಿಗೆ (ಉದಾ. *ನನಗೆ ಬೆರಳುಹಣ್ಣುಗಳ ಇಷ್ಟವಿಲ್ಲ*, ಹೋಲಿಕೆ ಮಾಡಿರುವಂತೆ *ನನಗೆ ಆ ದೊಡ್ಡ ಬಣ್ಣಬರದ ರುಚಿಕರ ಬೆರಳುಹಣ್ಣುಗಳು ಇಷ್ಟವಿಲ್ಲ*) ಇರಬಹುದು, ಆದರೂ ಇದು ಒಂದು ಪ್ರಕಾರವನು ತಾಳಿಕೊಳ್ಳಬೇಕು. ಹೀಗಾಗಿ, ಭಾಷೆಯನ್ನು ನಿರ್ವಹಿಸಲು ನಾವು ಹೊಸ ನ್ಯೂರಲ್ ನೆಟ್‌ವರ್ಕ್ ಪ್ರಕಾರಗಳನ್ನು ಪರಿಚಯಿಸಬೇಕಾಗುತ್ತದೆ, ಉದಾ., *ಪುನರಾವೃತ್ತ ಜಾಲಗಳು* ಮತ್ತು *ರೂಪಾಂತರಕಗಳು*. ## ಗ್ರಂಥಾಲಯಗಳನ್ನು ಸ್ಥಾಪಿಸಿ -ನೀವು ಈ ಕೋರ್ಸ್ ಅನ್ನು ಸ್ಥಳೀಯ ಪೈಥಾನ್ ಸ್ಥಾಪನೆಯೊಂದಿಗೆ ನಡೆಸುತ್ತಿದ್ದರೆ, ಕೆಳಗಿನ ಆಜ್ಞೆಗಳನ್ನು ಬಳಸಿ NLP ಗಾಗಿ ಅಗತ್ಯವಿರುವ ಎಲ್ಲಾ ಗ್ರಂಥಾಲಯಗಳನ್ನು ಸ್ಥಾಪಿಸಬೇಕಾಗಬಹುದು: +ನೀವು ಈ ಕೋರ್ಸ್ ಅನ್ನು ಚಾಲನೆ ಮಾಡಲು ಸ್ಥಳೀಯ ಪೈಥಾನ್ ಸ್ಥಾಪನೆ ಅನ್ನು ಬಳಸುತ್ತಿದ್ದರೆ, ಕೆಳಗಿನ ಆಜ್ಞೆಗಳನ್ನು ಬಳಸಿ NLPಗೆ ಅಗತ್ಯವಿರುವ ಎಲ್ಲಾ ಗ್ರಂಥಾಲಯಗಳನ್ನು ಸ್ಥಾಪಿಸಬೇಕಾಗಬಹುದು: -**ಪೈಟಾರ್ಚ್ ಗಾಗಿ** +**ಪೈಟಾರ್ಚ್‌ಗಾಗಿ** ```bash -pip install -r requirements-torch.txt +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) ನಲ್ಲಿ ಟೆನ್ಸರ್‌ಫ್ಲೋ ಬಳಸಿ NLP ಪ್ರಯತ್ನಿಸಬಹುದು +> ನೀವು [Microsoft Learn](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste) ನಲ್ಲಿ ಟೆನ್ಸರ್‌ಫ್ಲೋ ಸಹಿತ NLP ಪ್ರಯತ್ನಿಸಬಹುದು -## GPU ಎಚ್ಚರಿಕೆ +## ಜಿಪಿಯು ಎಚ್ಚರಿಕೆ -ಈ ವಿಭಾಗದಲ್ಲಿ, ಕೆಲವು ಉದಾಹರಣೆಗಳಲ್ಲಿ ನಾವು ಬಹಳ ದೊಡ್ಡ ಮಾದರಿಗಳನ್ನು ತರಬೇತುಗೊಳಿಸುವೆವು. -* **GPU-ಸಕ್ರಿಯ ಕಂಪ್ಯೂಟರ್ ಬಳಸಿ**: ದೊಡ್ಡ ಮಾದರಿಗಳೊಂದಿಗೆ ಕೆಲಸ ಮಾಡುವಾಗ ಕಾಯುವ ಸಮಯವನ್ನು ಕಡಿಮೆ ಮಾಡಲು ನಿಮ್ಮ ನೋಟ್ಬುಕ್‌ಗಳನ್ನು GPU-ಸಕ್ರಿಯ ಕಂಪ್ಯೂಟರ್‌ನಲ್ಲಿ ನಡೆಸುವುದು ಶಿಫಾರಸು ಮಾಡಲಾಗಿದೆ. -* **GPU ಮೆಮೊರಿ ಮಿತಿಗಳು**: ದೊಡ್ಡ ಮಾದರಿಗಳನ್ನು ತರಬೇತುಗೊಳಿಸುವಾಗ GPU ಮೆಮೊರಿ ಮುಗಿಯುವ ಪರಿಸ್ಥಿತಿಗಳು ಸಂಭವಿಸಬಹುದು. -* **GPU ಮೆಮೊರಿ ಬಳಕೆ**: ತರಬೇತಿ ಸಮಯದಲ್ಲಿ ಬಳಕೆಯಾದ GPU ಮೆಮೊರಿ ಪ್ರಮಾಣವು ವಿವಿಧ ಅಂಶಗಳ ಮೇಲೆ ಅವಲಂಬಿತವಾಗಿರುತ್ತದೆ, ಅದರಲ್ಲಿ ಮಿನಿಬ್ಯಾಚ್ ಗಾತ್ರವೂ ಸೇರಿದೆ. -* **ಮಿನಿಬ್ಯಾಚ್ ಗಾತ್ರವನ್ನು ಕಡಿಮೆ ಮಾಡಿ**: GPU ಮೆಮೊರಿ ಸಮಸ್ಯೆ ಎದುರಾದರೆ, ನಿಮ್ಮ ಕೋಡ್‌ನಲ್ಲಿ ಮಿನಿಬ್ಯಾಚ್ ಗಾತ್ರವನ್ನು ಕಡಿಮೆ ಮಾಡುವುದನ್ನು ಪರಿಗಣಿಸಿ. -* **ಟೆನ್ಸರ್‌ಫ್ಲೋ GPU ಮೆಮೊರಿ ಬಿಡುಗಡೆ**: ಹಳೆಯ ಟೆನ್ಸರ್‌ಫ್ಲೋ ಆವೃತ್ತಿಗಳು ಒಂದೇ ಪೈಥಾನ್ ಕರ್ಣಲ್‌ನಲ್ಲಿ ಅನೇಕ ಮಾದರಿಗಳನ್ನು ತರಬೇತುಗೊಳಿಸುವಾಗ GPU ಮೆಮೊರಿಯನ್ನು ಸರಿಯಾಗಿ ಬಿಡುಗಡೆ ಮಾಡದಿರಬಹುದು. GPU ಮೆಮೊರಿ ಬಳಕೆಯನ್ನು ಪರಿಣಾಮಕಾರಿಯಾಗಿ ನಿರ್ವಹಿಸಲು, ಟೆನ್ಸರ್‌ಫ್ಲೋವನ್ನು ಅಗತ್ಯವಿರುವಷ್ಟೇ GPU ಮೆಮೊರಿ ಹಂಚಿಕೊಳ್ಳುವಂತೆ ಸಂರಚಿಸಬಹುದು. -* **ಕೋಡ್ ಸೇರಿಸುವಿಕೆ**: ಟೆನ್ಸರ್‌ಫ್ಲೋವನ್ನು ಅಗತ್ಯವಿರುವಾಗ ಮಾತ್ರ GPU ಮೆಮೊರಿ ಹಂಚಿಕೊಳ್ಳುವಂತೆ ಹೊಂದಿಸಲು, ನಿಮ್ಮ ನೋಟ್ಬುಕ್‌ಗಳಲ್ಲಿ ಕೆಳಗಿನ ಕೋಡ್ ಸೇರಿಸಿ: +ಈ ವಿಭಾಗದಲ್ಲಿ, ಕೆಲವು ಉದಾಹರಣೆಗಳಲ್ಲಿ ನಾವು ತುಂಬಾ ದೊಡ್ಡ ಮಾದರಿಗಳನ್ನು ತರಬೇತಿ ನೀಡಲಿದ್ದೇವೆ. +* **ಜಿಪಿಯು ಸಕ್ರೀಯ ಕಂಪ್ಯೂಟರ್ ಬಳಸಿ**: ದೊಡ್ಡ ಮಾದರಿಗಳೊಂದಿಗೆ ಕೆಲಸ ಮಾಡುವಾಗ ಕಾಯುವ ಸಮಯವನ್ನು ಕಡಿಮೆ ಮಾಡಲು ಜಿಪಿಯು ಸಕ್ರೀಯ ಕಂಪ್ಯೂಟರ್‌ನಲ್ಲಿ ನಿಮ್ಮ ನೋಟ್ಬುಕ್‌ಗಳನ್ನು ಚಾಲನೆಯಲ್ಲಿಡುವುದು ಸೂಕ್ತ. +* **ಜಿಪಿಯು ಸ್ಮೃತಿ ನಿರ್ಬಂಧಗಳು**: ದೊಡ್ಡ ಮಾದರಿಗಳನ್ನು ತರಬೇತಿ ನೀಡಬಹುದಾದಾಗ ಜಿಪಿಯು ಸ್ಮೃತಿಯನ್ನು ದಾಟಿ ಹೋಗುವ ಸ್ಥಿತಿಗಳು ಬರುವ ಸಾಧ್ಯತೆ ಇದೆ. +* **ಜಿಪಿಯು ಸ್ಮೃತಿ ಬಳಕೆ**: ತರಬೇತಿ ವೇಳೆ ಬಳಕೆಯಾಗುವ ಜಿಪಿಯು ಸ್ಮೃತಿ ಪ್ರಮಾಣವು ವಿಭಿನ್ನ ಅಂಶಗಳ ಮೇಲೆ ಅವಲಂಬಿತವಾಗಿರುತ್ತದೆ, ತನಿಖಾ ಬ್ಯಾಚ್ ಗಾತ್ರ ಕೂಡ ಒಂದಾಗಿದೆ. +* **ತನಿಖಾ ಬ್ಯಾಚ್ ಗಾತ್ರ ಕಡಿಮೆ ಮಾಡಿ**: ನೀವು ಜಿಪಿಯು ಸ್ಮೃತಿ ಸಮಸ್ಯೆಗಳನ್ನು ಎದುರಿಸಿದರೆ, ನಿಮ್ಮ ಕೋಡ್‌ನಲ್ಲಿ tiny ಬ್ಯಾಚ್ ಗಾತ್ರವನ್ನು ಕಡಿಮೆ ಮಾಡುವುದನ್ನು ಪರಿಗಣಿಸಿ. +* **ಟೆನ್ಸರ್‌ಫ್ಲೋ ಜಿಪಿಯು ಸ್ಮೃತಿ ಬಿಡುಗಡೆ**: ಹಳೆಯ ಟENSORFLOW ಆವೃತ್ತಿಗಳು ಒಂದು ಪೈಥಾನ್ ಕರ್ಣಲ್‌ನಲ್ಲಿ ಹಲವು ಮಾದರಿಗಳನ್ನು ತರಬೇತಿ ನೀಡುವಾಗ ಜಿಪಿಯು ಸ್ಮೃತಿಯನ್ನು ಸರಿಯಾಗಿ ಬಿಡುಗಡೆ ಮಾಡದೆ ಇರಬಹುದು. ಜಿಪಿಯು ಸ್ಮೃತಿ ಬಳಕೆಯನ್ನು ಪರಿಣಾಮಕಾರಿಯಾಗಿ ನಿರ್ವಹಿಸಲು, ಟೆನ್ಸರ್‌ಫ್ಲೋಯನ್ನು ಜಿಪಿಯು ಸ್ಮೃತಿ ಅಗತ್ಯವಿರುವಾಗ ಮಾತ್ರ ಹಂಚಿಕೊಂಡಂತೆ ಕಾನ್ಫಿಗರ್ ಮಾಡಬಹುದು. +* **ಕೋಡ್ ಸೇರಿಸೋದು**: ಟೆನ್ಸರ್‌ಫ್ಲೋಯನ್ನು ಜಿಪಿಯು ಸ್ಮೃತಿ ಅಗತ್ಯವಿರುವಾಗ ಮಾತ್ರ ವಿಸ್ತರಿಸುವಂತೆ ಸೆಟ್ಟು ಮಾಡಲು, ನಿಮ್ಮ ನೋಟ್ಬುಕ್‌ಗಳಲ್ಲಿ ಕೆಳಗಿನ ಕೋಡ್ ಸೇರಿಸಿ: ```python physical_devices = tf.config.list_physical_devices('GPU') @@ -53,21 +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) ಭೇಟಿ ನೀಡಿ +ನೀವು ಶ್ರೇಷ್ಟ ML ದೃಷ್ಟಿಕೋನದಿಂದ 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) +* [ಪದ 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) ಬಳಸಿ ಅನುವಾದಿಸಲಾಗಿದೆ. ನಾವು ನಿಖರತೆಯಿಗಾಗಿ ಪ್ರಯತ್ನಿಸುತ್ತಿದ್ದರೂ, ಸ್ವಯಂಚಾಲಿತ ಅನುವಾದಗಳಲ್ಲಿ ತಪ್ಪುಗಳು ಅಥವಾ ಅಸತ್ಯತೆಗಳು ಇರಬಹುದು ಎಂದು ದಯವಿಟ್ಟು ಗಮನಿಸಿ. ಮೂಲ ಭಾಷೆಯಲ್ಲಿರುವ ಮೂಲ ದಸ್ತಾವೇಜನ್ನು ಅಧಿಕೃತ ಮೂಲವೆಂದು ಪರಿಗಣಿಸಬೇಕು. ಪ್ರಮುಖ ಮಾಹಿತಿಗಾಗಿ, ವೃತ್ತಿಪರ ಮಾನವ ಅನುವಾದವನ್ನು ಶಿಫಾರಸು ಮಾಡಲಾಗುತ್ತದೆ. ಈ ಅನುವಾದ ಬಳಕೆಯಿಂದ ಉಂಟಾಗುವ ಯಾವುದೇ ತಪ್ಪು ಅರ್ಥಮಾಡಿಕೊಳ್ಳುವಿಕೆ ಅಥವಾ ತಪ್ಪು ವಿವರಣೆಗಳಿಗೆ ನಾವು ಹೊಣೆಗಾರರಾಗುವುದಿಲ್ಲ. +**ಅಸ್ವೀಕಾರ**: +ಈ ದಸ್ತಾವೇಜು AI ಅನುವಾದ ಸೇವೆ [Co-op Translator](https://github.com/Azure/co-op-translator) ಬಳಸಿ ಅನುವಾದಿಸಲಾಗಿದೆ. ನಾವು ನಿಖರತೆಯನ್ನು ಸಾಧಿಸಲು ಪ್ರಯತ್ನಿಸುತ್ತಿದ್ದರೂ, ದಯವಿಟ್ಟು ಗಮನಿಸಿ, ಸ್ವಯಂಚಾಲಿತ ಅನುವಾದಗಳಲ್ಲಿ ದೋಷಗಳು ಅಥವಾ ಅಸಡ್ಡೆಗಳು ಇರಬಹುದು. ಮೂಲ ಭಾಷೆಯಲ್ಲಿರುವ ಮೂಲ ದಸ್ತಾವೇಜು ಪ್ರಾಮಾಣಿಕ ಮೂಲವೆಂದು ಪರಿಗಣಿಸಬೇಕು. ಪ್ರಮುಖ ಮಾಹಿತಿಗಾಗಿ, ವೃತ್ತಿಪರ ಮಾನವ ಅನುವಾದವನ್ನು ಶಿಫಾರಸು ಮಾಡಲಾಗುತ್ತದೆ. ಈ ಅನುವಾದವನ್ನು ಬಳಸುವ ಮೂಲಕ ಉಂಟಾಗುವ ಯಾವುದೇ ತಪ್ಪು ಅರ್ಥಗಳ ಅಥವಾ ತಪ್ಪು ವ್ಯಾಖ್ಯಾನಗಳ ಬಗ್ಗೆ ನಾವು ಹೊಣೆಗಾರರಲ್ಲ. \ No newline at end of file diff --git a/translations/ko/.co-op-translator.json b/translations/ko/.co-op-translator.json index 5b002c573e..1fdf6b70dc 100644 --- a/translations/ko/.co-op-translator.json +++ b/translations/ko/.co-op-translator.json @@ -5,6 +5,12 @@ "source_file": "AGENTS.md", "language_code": "ko" }, + "CONTRIBUTING.md": { + "original_hash": "c6fd7e781b67111a90abd166d0ce4aa0", + "translation_date": "2026-07-08T19:07:51+00:00", + "source_file": "CONTRIBUTING.md", + "language_code": "ko" + }, "README.md": { "original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b", "translation_date": "2026-04-06T20:48:08+00:00", @@ -17,6 +23,19 @@ "source_file": "SECURITY.md", "language_code": "ko" }, + "__translation_failures__": { + "lessons/sketchnotes/LICENSE.md": { + "original_hash": "45ab63a2cd8f5faef6c9b150618837a4", + "source_file": "lessons/sketchnotes/LICENSE.md", + "language_code": "ko", + "failure_date": "2026-07-08T18:56:31+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:38:25+00:00", @@ -54,8 +73,8 @@ "language_code": "ko" }, "examples/README.md": { - "original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7", - "translation_date": "2025-10-03T11:28:24+00:00", + "original_hash": "7883d52c2e2a221e0b07a7b112a149b9", + "translation_date": "2026-07-08T18:52:19+00:00", "source_file": "examples/README.md", "language_code": "ko" }, @@ -66,8 +85,8 @@ "language_code": "ko" }, "lessons/0-course-setup/how-to-run.md": { - "original_hash": "a4717bd9103b9f6cd84d534b83534689", - "translation_date": "2026-01-15T12:57:22+00:00", + "original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1", + "translation_date": "2026-07-08T18:52:37+00:00", "source_file": "lessons/0-course-setup/how-to-run.md", "language_code": "ko" }, @@ -191,6 +210,12 @@ "source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md", "language_code": "ko" }, + "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": { + "original_hash": "99b816b6a4957ef4100cee4c4221dff9", + "translation_date": "2026-07-08T18:48:44+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", + "language_code": "ko" + }, "lessons/4-ComputerVision/08-TransferLearning/lab/README.md": { "original_hash": "7765935c35fcee69b9fe2d0cfd6963e2", "translation_date": "2025-08-24T21:32:01+00:00", @@ -330,8 +355,8 @@ "language_code": "ko" }, "lessons/5-NLP/README.md": { - "original_hash": "8ef02a9318257ea140ed3ed74442096d", - "translation_date": "2025-08-24T21:23:24+00:00", + "original_hash": "038df6f1a73e49f6430740da083bfd6d", + "translation_date": "2026-07-08T18:53:01+00:00", "source_file": "lessons/5-NLP/README.md", "language_code": "ko" }, diff --git a/translations/ko/CONTRIBUTING.md b/translations/ko/CONTRIBUTING.md new file mode 100644 index 0000000000..b8bb456708 --- /dev/null +++ b/translations/ko/CONTRIBUTING.md @@ -0,0 +1,29 @@ +# AI-For-Beginners에 기여하기 + +AI-For-Beginners에 기여해 주셔서 감사합니다! 번역, 수업 수정, 형식 교정을 환영합니다. + +## Microsoft 기여자 라이선스 계약(CLA) + +이 프로젝트는 기여와 제안을 환영합니다. 대부분의 기여는 기여자가 해당 기여에 대한 권한이 있으며 실제로 권한을 부여한다는 내용을 담은 기여자 라이선스 계약(CLA)에 동의해야 합니다. 자세한 내용은 [https://cla.microsoft.com](https://cla.microsoft.com)을 참조하세요. + +풀 리퀘스트를 제출하면 CLA-봇이 자동으로 CLA 제출 여부를 판단하고 PR에 적절한 표시(예: 라벨, 댓글)를 합니다. 봇이 제공하는 지침을 따르면 됩니다. 모든 저장소에서 CLA 사용 시 한 번만 이 과정을 거치면 됩니다. + +## 기여 방법 + +### 1. 오타 / 코드 오류 수정 +Jupyter 노트북이나 수업 마크다운 파일에서 오타나 버그를 발견하면: +1. 저장소를 포크합니다. +2. 오타나 깨진 링크를 수정합니다. +3. 수정 내용을 명확히 설명하는 풀 리퀘스트를 제출합니다. + +### 2. 번역 제출 +수업을 다른 언어로 번역해 주시면 환영합니다! 번역 파일은 `translations/` 디렉터리 내 기존 폴더 이름(`translations/es/`, `translations/pt-BR/`, `translations/zh-CN/` 등)을 사용하여 배치해 주세요. + +자세한 내용은 [etc/CONTRIBUTING.md](etc/CONTRIBUTING.md)를 참조하세요. + +--- + + +**면책 조항**: +이 문서는 AI 번역 서비스 [Co-op Translator](https://github.com/Azure/co-op-translator)를 사용하여 번역되었습니다. 정확성을 기하기 위해 노력하고 있으나, 자동 번역은 오류나 부정확한 부분이 있을 수 있음을 유의하시기 바랍니다. 원본 문서의 원어본이 권위 있는 자료로 간주되어야 합니다. 중요한 정보의 경우, 전문가의 인간 번역을 권장합니다. 이 번역 사용으로 인해 발생하는 오해나 잘못된 해석에 대해 당사는 책임을 지지 않습니다. + \ No newline at end of file diff --git a/translations/ko/examples/README.md b/translations/ko/examples/README.md index 2e9c1f50cf..1c788e8472 100644 --- a/translations/ko/examples/README.md +++ b/translations/ko/examples/README.md @@ -1,27 +1,27 @@ -# 초보자를 위한 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 ``` @@ -32,37 +32,37 @@ conda env create --name ai4beg --file ../environment.yml 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. **이미지 분류기 시도해보기** - 실제 이미지로 AI 적용해 보기 +4. **텍스트 감정 분석** - 자연어 처리 탐험하기 -## 💡 초보자를 위한 팁 +## 💡 초보자 팁 -- **코드 주석을 꼼꼼히 읽으세요** - 각 줄이 무엇을 하는지 설명합니다 -- **실험해보세요!** - 값을 변경해보고 결과를 확인하세요 -- **모든 것을 이해하려고 걱정하지 마세요** - 학습은 시간이 걸립니다 -- **질문하세요** - [토론 게시판](https://github.com/microsoft/AI-For-Beginners/discussions)을 활용하세요 +- **코드 주석을 꼼꼼히 읽으세요** - 각 줄이 무엇을 하는지 설명함 +- **실험해보세요!** - 값을 바꿔보고 어떤 변화가 있는지 확인하세요 +- **모든 것을 완벽히 이해하지 않아도 괜찮아요** - 학습은 시간이 걸립니다 +- 질문하세요 - [토론 게시판](https://github.com/microsoft/AI-For-Beginners/discussions)을 활용하세요 ## 🔗 다음 단계 -이 예제를 완료한 후, 전체 커리큘럼을 탐색해보세요: +이 예제를 완료한 후, 전체 커리큘럼을 탐색하세요: - [AI 소개](../lessons/1-Intro/README.md) - [신경망](../lessons/3-NeuralNetworks/README.md) - [컴퓨터 비전](../lessons/4-ComputerVision/README.md) @@ -70,10 +70,10 @@ 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)를 사용하여 번역되었습니다. 정확성을 위해 최선을 다하고 있으나, 자동 번역에는 오류나 부정확성이 포함될 수 있습니다. 원본 문서(원어로 작성된 문서)를 권위 있는 자료로 간주해야 합니다. 중요한 정보의 경우, 전문 번역가에 의한 번역을 권장합니다. 이 번역 사용으로 인해 발생하는 오해나 잘못된 해석에 대해 당사는 책임을 지지 않습니다. \ No newline at end of file + +**면책 조항**: +이 문서는 AI 번역 서비스 [Co-op Translator](https://github.com/Azure/co-op-translator)를 사용하여 번역되었습니다. 정확성을 기하기 위해 노력하고 있으나, 자동 번역은 오류나 부정확한 부분이 있을 수 있음을 유의하시기 바랍니다. 원본 문서의 원어본이 권위 있는 자료로 간주되어야 합니다. 중요한 정보의 경우, 전문가의 인간 번역을 권장합니다. 이 번역 사용으로 인해 발생하는 오해나 잘못된 해석에 대해 당사는 책임을 지지 않습니다. + \ No newline at end of file diff --git a/translations/ko/lessons/0-course-setup/how-to-run.md b/translations/ko/lessons/0-course-setup/how-to-run.md index 3c2fb90186..de97f2ac9d 100644 --- a/translations/ko/lessons/0-course-setup/how-to-run.md +++ b/translations/ko/lessons/0-course-setup/how-to-run.md @@ -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)** 를 설치하는 것입니다. miniconda는 가벼운 설치 방식으로, 다양한 Python 가상 환경을 지원하는 `conda` 패키지 관리자를 제공합니다. -miniconda를 설치한 후, 저장소를 복제하고 이 과정에 사용할 가상 환경을 만드십시오: +miniconda를 설치한 후 리포지토리를 클론하고 이 과정에 사용할 가상 환경을 생성합니다: ```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 ``` -### Python 확장 기능과 함께 Visual Studio Code 사용 +### Python 확장과 함께 Visual Studio Code 사용하기 -이 커리큘럼은 [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 환경도 사용할 수 있습니다. 고전적인 Jupyter와 JupyterHub 모두 자동 완성, 코드 강조 등 편리한 개발 환경을 제공합니다. +자신의 컴퓨터 브라우저에서 Jupyter 환경을 사용할 수도 있습니다. 전통적인 Jupyter와 JupyterHub 모두 자동 완성, 코드 하이라이트 등의 편리한 개발 환경을 제공합니다. -로컬로 Jupyter를 시작하려면, 과정 디렉터리로 이동하여 다음을 실행하세요: +로컬에서 Jupyter를 시작하려면, 과정 디렉터리로 이동하여 다음을 실행하세요: ```bash jupyter notebook @@ -36,36 +36,36 @@ jupyter notebook ```bash jupyterhub ``` -그런 다음 `.ipynb` 파일 중 아무거나 찾아 열어 작업을 시작할 수 있습니다. +그런 다음 `.ipynb` 파일 중 원하는 것을 찾아 열고 작업을 시작할 수 있습니다. -### 컨테이너에서 실행 +### 컨테이너에서 실행하기 -Python 설치에 대한 대안으로 컨테이너에서 코드를 실행할 수 있습니다. 저장소는 이 저장소용 컨테이너 빌드 방법을 안내하는 특별한 `.devcontainer` 폴더를 제공하므로, VS Code는 코드를 컨테이너에서 다시 열 기회를 제공합니다. 이 방법은 Docker 설치가 필요하며 좀 더 복잡하므로, 숙련된 사용자에게 권장합니다. +Python 설치 대신 컨테이너에서 코드를 실행하는 방법도 있습니다. 이 리포지토리는 컨테이너를 빌드하는 방법을 안내하는 특별한 `.devcontainer` 폴더를 제공하므로 VS Code가 코드를 컨테이너에서 다시 열 수 있는 기능을 제공합니다. 이 방법은 Docker 설치가 필요하고 다소 복잡하므로, 경험이 있는 사용자에게 권장합니다. -## 클라우드에서 실행 +## 클라우드에서 실행하기 -로컬에 Python을 설치하고 싶지 않고, 클라우드 자원에 접근할 수 있다면 클라우드에서 코드를 실행하는 좋은 대안이 있습니다. 다음과 같은 방법들이 있습니다: +로컬에 Python을 설치하지 않고 클라우드 자원에 접근할 수 있다면, 클라우드에서 코드를 실행하는 것도 좋은 대안입니다. 이를 할 수 있는 여러 방법이 있습니다: -* **[GitHub Codespaces](https://github.com/features/codespaces)** 사용하기: GitHub에서 가상 환경을 만들어 VS Code 브라우저 인터페이스를 통해 접근할 수 있습니다. Codespaces에 접근 권한이 있으면 저장소의 **Code** 버튼을 클릭해 codespace를 시작하고 빠르게 실행할 수 있습니다. -* **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)** 사용하기: [Binder](https://mybinder.org)는 GitHub상의 코드를 테스트할 수 있도록 클라우드에서 무료 컴퓨팅 자원을 제공합니다. 저장소 첫 페이지에 Binder에서 저장소를 열 수 있는 버튼이 있어, 이를 클릭하면 기저 컨테이너가 빌드되고 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 사이트로 빠르게 이동해 해당 컨테이너를 빌드하고 Jupyter 웹 인터페이스를 원활하게 시작할 수 있습니다. -> **참고**: 오용 방지를 위해 Binder에서는 일부 웹 자원 접근이 차단됩니다. 이로 인해 공개 인터넷에서 모델이나 데이터셋을 가져오는 일부 코드가 작동하지 않을 수 있습니다. 일부 우회 방법을 찾아야 할 수 있습니다. 또한 Binder에서 제공하는 컴퓨팅 자원은 초보 수준이므로, 특히 나중에 복잡한 수업에서는 훈련 속도가 느립니다. +> 참고: Binder는 남용 방지를 위해 일부 웹 자원 접근을 차단합니다. 이로 인해 공개 인터넷에서 모델이나 데이터셋을 불러오는 코드가 제대로 작동하지 않을 수 있습니다. 우회 방법을 찾아야 할 수도 있습니다. 또한, Binder가 제공하는 컴퓨팅 자원은 기본적인 수준이므로 이후의 복잡한 수업에서는 학습 속도가 느릴 수 있습니다. -## GPU가 포함된 클라우드에서 실행 +## GPU가 탑재된 클라우드에서 실행하기 -이 커리큘럼의 후반 수업 중 일부는 GPU 지원이 크게 도움이 됩니다. 예를 들어 모델 훈련은 그렇지 않으면 매우 느릴 수 있습니다. 특히 [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) 또는 기관을 통해 클라우드에 접근할 수 있다면 다음 옵션들을 고려할 수 있습니다: +이 교과 과정의 후반부 수업들은 GPU 지원이 크게 도움이 됩니다. 예를 들어 모델 학습이 그렇지 않으면 매우 느릴 수 있습니다. 특히 [Azure 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)을 생성하고 Jupyter로 연결하기. 머신에 리포지토리를 클론해서 바로 학습할 수 있습니다. NC 시리즈 VM은 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 노트북에 리포지토리를 클론해서 사용하는 방법을 보여줍니다. -또한 일부 무료 GPU 지원이 포함된 Google Colab을 사용할 수도 있으며, Jupyter 노트북을 업로드해 차례대로 실행할 수 있습니다. +또한 Google Colab을 이용하면 무료 GPU 지원과 함께 Jupyter 노트북을 하나씩 업로드해 실행할 수 있습니다. --- -**면책 조항**: -이 문서는 AI 번역 서비스 [Co-op Translator](https://github.com/Azure/co-op-translator)를 이용하여 번역되었습니다. 정확성을 위해 최선을 다했지만, 자동 번역에는 오류나 부정확성이 포함될 수 있음을 유의하시기 바랍니다. 원문은 해당 언어의 원본 문서가 공식적인 출처로 간주되어야 합니다. 중요한 정보의 경우 전문적인 인간 번역을 권장합니다. 본 번역 사용으로 인한 오해나 잘못된 해석에 대해서는 책임을 지지 않습니다. +**면책 조항**: +이 문서는 AI 번역 서비스 [Co-op Translator](https://github.com/Azure/co-op-translator)를 사용하여 번역되었습니다. 정확성을 기하기 위해 노력하고 있으나, 자동 번역은 오류나 부정확한 부분이 있을 수 있음을 유의하시기 바랍니다. 원본 문서의 원어본이 권위 있는 자료로 간주되어야 합니다. 중요한 정보의 경우, 전문가의 인간 번역을 권장합니다. 이 번역 사용으로 인해 발생하는 오해나 잘못된 해석에 대해 당사는 책임을 지지 않습니다. \ No newline at end of file diff --git a/translations/ko/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/ko/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index 2842cf8864..0792283767 100644 --- a/translations/ko/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/ko/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -4,11 +4,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# 사전 학습된 모델과 전이 학습\n", + "# 사전 학습된 모델과 전이학습\n", "\n", - "CNN을 훈련시키는 데는 많은 시간이 걸리며, 이를 위해 많은 데이터가 필요합니다. 하지만 대부분의 시간은 네트워크가 이미지를 통해 패턴을 추출하기 위해 사용하는 최적의 저수준 필터를 학습하는 데 소비됩니다. 여기서 자연스럽게 한 가지 질문이 떠오릅니다 - 한 데이터셋에서 훈련된 신경망을 사용하여 완전한 훈련 과정을 거치지 않고 다른 이미지를 분류하는 데 적응시킬 수 있을까요?\n", + "CNN을 훈련시키는 데는 많은 시간이 걸리고, 그 작업에는 많은 데이터가 필요합니다. 하지만 대부분의 시간은 네트워크가 이미지에서 패턴을 추출하기 위해 사용하는 최적의 저수준 필터를 학습하는 데 소비됩니다. 자연스러운 질문이 생깁니다 - 한 데이터셋에서 학습된 신경망을 사용하여 전체 훈련 과정을 거치지 않고도 다른 이미지를 분류하도록 적응시킬 수 있을까요?\n", "\n", - "이 접근법은 **전이 학습**이라고 불리며, 이는 한 신경망 모델에서 다른 모델로 일부 지식을 전이하는 것을 의미합니다. 전이 학습에서는 일반적으로 **ImageNet**과 같은 대규모 이미지 데이터셋에서 훈련된 사전 학습된 모델로 시작합니다. 이러한 모델은 이미 일반적인 이미지에서 다양한 특징을 추출하는 데 뛰어난 성능을 발휘할 수 있으며, 많은 경우 이러한 추출된 특징 위에 분류기를 구축하는 것만으로도 좋은 결과를 얻을 수 있습니다.\n" + "이러한 접근법을 **전이학습(transfer learning)** 이라고 부르는데, 이는 한 신경망 모델에서 다른 신경망 모델로 일부 지식을 전달하기 때문입니다. 전이학습에서는 일반적으로 ImageNet과 같은 대규모 이미지 데이터셋으로 이미 훈련된 사전 학습된 모델을 시작점으로 사용합니다. 이러한 모델들은 이미 일반 이미지에서 다양한 특징을 잘 추출할 수 있으며, 많은 경우 추출된 특징 위에 분류기를 구축하는 것만으로도 좋은 결과를 얻을 수 있습니다.\n" ] }, { @@ -29,11 +29,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 고양이 vs. 개 데이터셋\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" + "불행히도, 데이터셋에 일부 손상된 이미지 파일이 있습니다. 손상된 파일을 확인하기 위해 빠른 정리를 해야 합니다. 이 튜토리얼을 방해하지 않기 위해 데이터셋을 검증하는 코드를 모듈로 옮겼습니다.\n" ] }, { @@ -333,13 +333,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 데이터셋 로드하기\n", + "## 데이터셋 로딩하기\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 범위로 값을 스케일링해야 합니다. 이미지를 플로팅할 때는 동일하게 스케일링하거나, 원본 스케일되지 않은 이미지를 플로팅하고자 `matplotlib`에 알리기 위해 값들을 `int` 타입으로 변환해야 합니다(위 코드에서 수행한 대로).\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", @@ -510,11 +520,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "여기에서 중요한 몇 가지 사항이 있습니다:\n", - "\n", - "* 사전 학습된 네트워크에 입력을 전달하기 전에 특정 방식으로 전처리해야 합니다. 이를 위해 해당 `preprocess_input` 함수를 호출하며, 이 함수는 이미지 배치를 받아 처리된 형태로 반환합니다. VGG-16의 경우, 이미지는 정규화되고, 각 채널에 대해 미리 정의된 평균값이 차감됩니다. 이는 VGG-16이 원래 이러한 전처리 과정을 거쳐 학습되었기 때문입니다.\n", - "* 신경망은 입력 배치에 적용되며, 결과로 각 클래스의 확률을 나타내는 1000-요소 텐서 배치를 반환합니다. 이 텐서에서 `argmax`를 호출하면 가장 가능성이 높은 클래스 번호를 찾을 수 있습니다.\n", - "* 얻어진 결과는 [`ImageNet` 클래스의 번호](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a)입니다. 이 결과를 이해하기 위해 `decode_predictions` 함수를 사용할 수도 있으며, 이 함수는 상위 n개의 클래스와 그 이름을 함께 반환합니다.\n" + "여기에 몇 가지 중요한 사항이 있습니다:\n", + "* 어떤 사전 학습된 네트워크에 입력을 전달하기 전에 특정 방식으로 전처리 되어야 합니다. 이는 이미지 배치를 받아 처리된 형태를 반환하는 해당 `preprocess_input` 함수를 호출함으로써 수행됩니다. VGG-16의 경우 이미지가 정규화되고 각 채널에 대해 사전에 정의된 평균 값이 빼집니다. 이는 VGG-16이 원래 이 전처리와 함께 학습되었기 때문입니다.\n", + "* 신경망은 입력 배치에 적용되고, 결과로 각 클래스의 확률을 나타내는 1000요소 텐서 배치를 받습니다. 이 텐서에 `argmax`를 호출하여 가장 확률이 높은 클래스 번호를 찾을 수 있습니다.\n", + "* 얻어진 결과는 [‘ImageNet’ 클래스 번호](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a)입니다. 이 결과를 의미 있게 만들기 위해, 상위 n개 클래스와 그 이름을 반환하는 `decode_predictions` 함수도 사용할 수 있습니다.\n" ] }, { @@ -600,7 +609,7 @@ "source": [ "## GPU 계산\n", "\n", - "VGG-16과 같은 딥 뉴럴 네트워크 및 기타 최신 아키텍처는 실행하는 데 상당한 계산 능력을 필요로 합니다. GPU 가속을 사용할 수 있다면 이를 활용하는 것이 합리적입니다. 다행히도 Keras는 GPU가 사용 가능한 경우 자동으로 계산 속도를 높여줍니다. Tensorflow가 GPU를 사용할 수 있는지 확인하려면 다음 코드를 사용할 수 있습니다:\n" + "VGG-16과 같은 딥 신경망 및 기타 최신 아키텍처는 실행에 상당한 계산 성능을 요구합니다. 사용할 수 있다면 GPU 가속을 사용하는 것이 합리적입니다. 다행히도, Keras는 GPU가 있으면 자동으로 계산을 가속화합니다. 다음 코드를 사용하여 Tensorflow가 GPU를 사용할 수 있는지 확인할 수 있습니다:\n" ] }, { @@ -627,9 +636,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## VGG 특징 추출하기\n", "\n", - "이미지에서 VGG-16을 사용해 특징을 추출하려면, 최종 분류 계층이 없는 모델이 필요합니다. 아래 코드를 사용하여 상위 계층이 없는 VGG-16 모델을 인스턴스화할 수 있습니다:\n" + "## VGG 특징 추출\n", + "\n", + "이미지에서 특징을 추출하기 위해 VGG-16을 사용하려면, 최종 분류 계층이 없는 모델이 필요합니다. 다음 코드를 사용하여 상단 계층 없는 VGG-16 모델을 인스턴스화할 수 있습니다:\n" ] }, { @@ -681,9 +691,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "특징 텐서의 차원은 7x7x512이지만, 이를 시각화하기 위해 2D 형태로 재구성해야 했습니다.\n", + "특징 텐서의 차원은 7x7x512이지만, 이를 시각화하기 위해 2D 형식으로 재구성해야 했습니다.\n", "\n", - "이제 이러한 특징들이 이미지를 분류하는 데 사용될 수 있는지 확인해 봅시다. 이미지를 일부 수동으로 선택해 보겠습니다 (우리의 경우 50개의 미니배치). 그리고 이들의 특징 벡터를 미리 계산합니다. 이를 위해 Tensorflow **dataset** API를 사용할 수 있습니다. `map` 함수는 데이터셋을 받아 주어진 람다 함수를 적용하여 변환합니다. 이 메커니즘을 사용하여 원본 이미지 대신 VGG에서 추출한 특징을 포함하는 새로운 데이터셋, `ds_features_train`과 `ds_features_test`를 생성합니다.\n" + "이제 이러한 특징들이 이미지 분류에 사용될 수 있는지 살펴보겠습니다. 수동으로 일부 이미지(우리 경우에는 50개의 미니배치)를 선택하고, 그들의 특징 벡터를 미리 계산해 봅시다. Tensorflow **dataset** API를 사용하여 이를 수행할 수 있습니다. `map` 함수는 데이터셋을 받아 주어진 람다 함수로 변환 작업을 적용합니다. 이 메커니즘을 이용해 원본 이미지 대신 VGG에서 추출한 특징을 포함하는 새로운 데이터셋인 `ds_features_train`과 `ds_features_test`를 생성합니다.\n" ] }, { @@ -713,9 +723,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "우리는 `.take(50)` 구문을 사용하여 데이터셋 크기를 제한하고, 데모 속도를 높였습니다. 물론 전체 데이터셋에서 이 실험을 수행할 수도 있습니다.\n", + "우리는 데모를 빠르게 진행하기 위해 데이터셋 크기를 제한하는 `.take(50)` 구문을 사용했습니다. 물론 전체 데이터셋으로도 이 실험을 수행할 수 있습니다.\n", "\n", - "이제 추출된 특징을 가진 데이터셋이 준비되었으니, 간단한 밀집 분류기를 훈련시켜 고양이와 개를 구분해 보겠습니다. 이 네트워크는 (7,7,512) 형태의 특징 벡터를 입력으로 받아, 개 또는 고양이에 해당하는 하나의 출력을 생성합니다. 이진 분류이기 때문에 `sigmoid` 활성화 함수와 `binary_crossentropy` 손실 함수를 사용합니다.\n" + "이제 추출된 특징을 가진 데이터셋이 준비되었으므로, 고양이와 개를 구분하는 간단한 밀집 분류기를 학습시킬 수 있습니다. 이 네트워크는 (7,7,512) 형태의 특징 벡터를 입력받아 개 또는 고양이에 해당하는 하나의 출력을 생성합니다. 이진 분류이기 때문에 `sigmoid` 활성화 함수와 `binary_crossentropy` 손실 함수를 사용합니다.\n" ] }, { @@ -744,13 +754,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "결과는 훌륭합니다. 고양이와 개를 거의 95%의 확률로 구분할 수 있습니다! 하지만, 이 접근법을 모든 이미지에 대해 테스트한 것은 아니며, 수동으로 특징을 추출하는 데 시간이 많이 걸리기 때문입니다.\n", + "결과가 매우 좋습니다. 고양이와 개를 거의 95% 확률로 구분할 수 있습니다! 하지만 수동으로 특징 추출하는 데 시간이 오래 걸리는 것 같아 전체 이미지 중 일부에 대해서만 이 방식을 테스트했습니다.\n", "\n", - "## VGG 네트워크를 활용한 전이 학습\n", + "## 하나의 VGG 네트워크를 이용한 전이 학습\n", "\n", - "수동으로 특징을 사전에 계산하는 과정을 피하기 위해, 원래의 VGG-16 네트워크를 전체적으로 훈련에 사용하고, 네트워크의 첫 번째 레이어로 특징 추출기를 추가할 수 있습니다.\n", + "학습 중에 특징 추출기를 네트워크의 첫 번째 레이어로 추가하여 원래의 VGG-16 네트워크를 전체로 사용하는 방식으로 수동으로 특징을 미리 계산하는 작업을 피할 수도 있습니다.\n", "\n", - "Keras 아키텍처의 장점은 위에서 정의한 VGG-16 모델을 또 다른 신경망의 레이어로도 사용할 수 있다는 점입니다! 우리는 단지 그 위에 밀집 분류기를 추가한 네트워크를 구성하고, 역전파를 사용해 전체 네트워크를 훈련시키기만 하면 됩니다.\n" + "Keras 아키텍처의 장점은, 위에서 정의한 VGG-16 모델을 다른 신경망의 레이어로도 사용할 수 있다는 점입니다! 단지 그 위에 분류용 Dense 레이어를 쌓아서 전체 네트워크를 역전파 방식으로 학습시키면 됩니다.\n" ] }, { @@ -794,13 +804,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "이 모델은 이미지를 입력으로 받아 클래스를 반환하는 엔드투엔드 분류 네트워크처럼 보입니다. 하지만 여기서 중요한 점은, VGG16을 특징 추출기로 사용하고 재학습시키지 않는 것입니다. 따라서, **합성곱 특징 추출기의 가중치를 고정(Freeze)** 해야 합니다. 네트워크의 첫 번째 레이어는 `model.layers[0]`을 호출하여 접근할 수 있으며, `trainable` 속성을 `False`로 설정하기만 하면 됩니다.\n", + "이 모델은 이미지를 입력받아 클래스를 반환하는 종단 간 분류 네트워크처럼 보입니다. 하지만 까다로운 점은 VGG16을 특징 추출기로 사용하고 재학습하지 않으려는 것입니다. 따라서 **합성곱 특징 추출기의 가중치를 고정(freeze)** 해야 합니다. 네트워크의 첫 번째 레이어에 `model.layers[0]`으로 접근할 수 있으며, `trainable` 속성을 `False`로 설정하기만 하면 됩니다.\n", "\n", - "> **Note**: 특징 추출기의 가중치를 고정하는 이유는, 그렇지 않으면 학습되지 않은 분류기 레이어가 합성곱 추출기의 원래 사전 학습된 가중치를 망가뜨릴 수 있기 때문입니다.\n", + "> 참고: 특징 추출기 가중치를 고정해야 하는 이유는, 그렇지 않으면 훈련되지 않은 분류기 계층이 합성곱 추출기의 원래 사전학습된 가중치를 손상시킬 수 있기 때문입니다.\n", "\n", - "네트워크의 전체 파라미터 수가 약 1,500만 개인 반면, 실제로 학습되는 파라미터는 2만 5천 개에 불과하다는 점을 알 수 있습니다. 상위 레벨 합성곱 필터의 나머지 모든 파라미터는 사전 학습된 상태입니다. 이는 좋은 점인데, 왜냐하면 적은 수의 예제로 적은 수의 파라미터를 미세 조정할 수 있기 때문입니다.\n", + "네트워크 전체 파라미터 수가 약 1500만 개인 반면, 훈련되는 파라미터는 2만 5천 개 뿐인 것을 알 수 있습니다. 최상위 합성곱 필터의 모든 다른 파라미터는 사전학습된 상태입니다. 이는 적은 수의 예제로 더 적은 수의 파라미터를 미세 조정할 수 있기 때문에 좋은 점입니다.\n", "\n", - "이제 네트워크를 학습시키고 얼마나 좋은 성능을 낼 수 있는지 확인해 보겠습니다. 실행 시간이 꽤 길어질 수 있으니, 실행이 잠시 멈춘 것처럼 보여도 걱정하지 마세요.\n" + "이제 네트워크를 훈련시키고 얼마나 잘 되는지 확인해 보겠습니다. 실행 시간이 꽤 길어질 수 있으니, 잠시 실행이 멈춘 것 같아도 걱정하지 마세요.\n" ] }, { @@ -825,11 +835,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "고양이와 개를 구분하는 분류기를 꽤 정확하게 얻은 것 같네요!\n", + "꽤 정확한 고양이 대 개 분류기를 얻은 것 같습니다! \n", "\n", "## 모델 저장 및 불러오기\n", "\n", - "모델을 훈련시킨 후에는, 모델의 아키텍처와 학습된 가중치를 파일로 저장하여 나중에 사용할 수 있습니다:\n" + "모델을 학습한 후에는, 나중에 사용하기 위해 모델 아키텍처와 학습된 가중치를 파일에 저장할 수 있습니다:\n" ] }, { @@ -853,7 +863,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "우리는 언제든 파일에서 모델을 로드할 수 있습니다. 다음 실험이 모델을 손상시킬 경우 유용할 수 있습니다 - 처음부터 다시 시작할 필요가 없을 것입니다.\n" + "그런 다음 언제든지 파일에서 모델을 불러올 수 있습니다. 다음 실험에서 모델이 손상되는 경우에 유용할 수 있습니다 - 처음부터 다시 시작할 필요가 없게 됩니다.\n" ] }, { @@ -869,15 +879,15 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 전이 학습 미세 조정\n", + "## 미세 조정된 전이 학습\n", "\n", - "이전 섹션에서는 최종 분류기 계층을 학습시켜 우리 데이터셋의 이미지를 분류했습니다. 하지만 특징 추출기는 재학습하지 않았으며, 모델은 ImageNet 데이터에서 학습한 특징에 의존했습니다. 만약 여러분의 객체가 일반적인 ImageNet 이미지와 시각적으로 다르다면, 이러한 특징 조합이 최적의 결과를 내지 못할 수 있습니다. 따라서 컨볼루션 계층도 학습을 시작하는 것이 합리적입니다.\n", + "이전 섹션에서는 최종 분류기 계층을 학습하여 우리 자체 데이터셋의 이미지를 분류했습니다. 그러나 특징 추출기는 재학습하지 않았으며, 우리 모델은 ImageNet 데이터에서 학습된 특징에 의존했습니다. 만약 객체가 일반 ImageNet 이미지와 시각적으로 다르다면, 이러한 특징 조합이 최적이 아닐 수 있습니다. 따라서 컨볼루션 계층도 학습을 시작하는 것이 합리적입니다.\n", "\n", - "이를 위해 이전에 고정했던 컨볼루션 필터 매개변수를 해제할 수 있습니다.\n", + "이를 위해 이전에 고정했던 컨볼루션 필터 매개변수의 고정을 해제할 수 있습니다.\n", "\n", - "> **Note:** 먼저 매개변수를 고정하고 분류 계층의 가중치를 안정화하기 위해 몇 번의 에포크 동안 학습을 수행하는 것이 중요합니다. 만약 매개변수를 해제한 상태로 바로 엔드 투 엔드 네트워크 학습을 시작하면, 큰 오류로 인해 컨볼루션 계층의 사전 학습된 가중치가 손상될 가능성이 높습니다.\n", + "> **참고:** 먼저 매개변수를 고정하고 분류기 계층의 가중치를 안정화하기 위해 몇 에포크 동안 학습하는 것이 중요합니다. 매개변수 고정 해제 상태로 즉시 end-to-end 네트워크 학습을 시작하면 큰 오차가 컨볼루션 계층의 사전 학습된 가중치를 파괴할 가능성이 높습니다.\n", "\n", - "우리의 컨볼루션 VGG-16 모델은 첫 번째 계층 안에 위치하며, 자체적으로 여러 계층으로 구성되어 있습니다. 그 구조를 살펴볼 수 있습니다:\n" + "우리 컨볼루션 VGG-16 모델은 첫 번째 계층 내부에 위치하며, 여러 계층으로 구성되어 있습니다. 그 구조를 살펴볼 수 있습니다:\n" ] }, { @@ -946,7 +956,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "우리는 합성곱 기반의 모든 층을 해제할 수 있습니다:\n" + "합성곱 베이스의 모든 레이어를 언프리즈할 수 있습니다:\n" ] }, { @@ -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", - "동결을 해제한 후에는 몇 번 더 에포크를 진행할 수 있습니다 (이 예제에서는 한 번만 진행합니다). 또한, 사전 학습된 가중치에 미치는 영향을 최소화하기 위해 더 낮은 학습률을 선택할 수도 있습니다. 하지만 낮은 학습률을 사용하더라도 훈련 초반에는 정확도가 떨어질 수 있으며, 이후 고정된 가중치를 사용한 경우보다 약간 더 높은 수준에 도달하게 됩니다.\n", + "동결 해제 후에는 몇 번 더 에포크를 진행할 수 있습니다(예제에서는 한 번만 수행합니다). 사전 학습된 가중치에 미치는 영향을 최소화하기 위해 더 낮은 학습률을 선택할 수도 있습니다. 하지만 낮은 학습률을 사용하더라도 훈련 초기에는 정확도가 떨어졌다가, 결국 고정 가중치의 경우보다 약간 더 높은 수준에 도달할 것으로 기대할 수 있습니다.\n", "\n", - "> **Note:** 이 훈련은 훨씬 느리게 진행됩니다. 네트워크의 많은 레이어를 통해 그래디언트를 역전파해야 하기 때문입니다!\n" + "> **참고:** 이 훈련은 네트워크의 여러 계층을 거쳐 역전파해야 하기 때문에 훨씬 느리게 진행됩니다!\n" ] }, { @@ -1029,18 +1039,18 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "우리는 더 많은 매개변수를 가진 더 강력한 네트워크를 사용하고 있기 때문에 훈련 정확도가 더 높아질 가능성이 있습니다. 하지만 검증 정확도는 그렇게 많이 증가하지 않을 것입니다.\n", + "우리는 더 많은 매개변수를 가진 더 강력한 네트워크를 사용하고 있기 때문에 더 높은 훈련 정확도를 달성할 가능성이 높지만, 검증 정확도는 그만큼 크게 증가하지 않을 것입니다.\n", "\n", - "네트워크의 몇 가지 추가 레이어를 자유롭게 해제하고 더 훈련하여 더 높은 정확도를 달성할 수 있는지 확인해보세요!\n" + "네트워크의 몇 개 층을 더 해제하고 더 많이 훈련시켜 보면서 더 높은 정확도를 달성할 수 있는지 확인해 보세요!\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## 기타 컴퓨터 비전 모델\n", + "## 다른 컴퓨터 비전 모델\n", "\n", - "VGG-16은 가장 간단한 컴퓨터 비전 아키텍처 중 하나입니다. Keras는 더 많은 사전 학습된 네트워크를 제공합니다. 그중 가장 자주 사용되는 것은 Microsoft에서 개발한 **ResNet** 아키텍처와 Google의 **Inception**입니다. 예를 들어, 가장 간단한 ResNet-50 모델의 아키텍처를 살펴보겠습니다 (ResNet은 깊이에 따라 다양한 모델로 구성된 가족이며, 정말 깊은 모델이 어떤 모습인지 보고 싶다면 ResNet-152를 실험해볼 수 있습니다).\n" + "VGG-16은 가장 단순한 컴퓨터 비전 아키텍처 중 하나입니다. Keras는 더 많은 사전 학습 네트워크를 제공합니다. 그 중 가장 자주 사용되는 것은 Microsoft에서 개발한 **ResNet** 아키텍처와 Google의 Inception입니다. 예를 들어, 가장 간단한 ResNet-50 모델의 아키텍처를 살펴보겠습니다(ResNet은 깊이가 다른 모델들로 구성된 시리즈이며, 정말 깊은 모델이 궁금하다면 ResNet-152도 실험해볼 수 있습니다):\n" ] }, { @@ -1442,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\n**면책 조항**:\n이 문서는 AI 번역 서비스 [Co-op Translator](https://github.com/Azure/co-op-translator)를 사용하여 번역되었습니다. 정확성을 기하기 위해 노력하고 있으나, 자동 번역은 오류나 부정확한 부분이 있을 수 있음을 유의하시기 바랍니다. 원본 문서의 원어본이 권위 있는 자료로 간주되어야 합니다. 중요한 정보의 경우, 전문가의 인간 번역을 권장합니다. 이 번역 사용으로 인해 발생하는 오해나 잘못된 해석에 대해 당사는 책임을 지지 않습니다.\n\n" ] } ], @@ -1485,12 +1495,6 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" - }, - "coopTranslator": { - "original_hash": "c189abc107848f96051085cc30945129", - "translation_date": "2025-08-31T12:45:20+00:00", - "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", - "language_code": "ko" } }, "nbformat": 4, diff --git a/translations/ko/lessons/5-NLP/README.md b/translations/ko/lessons/5-NLP/README.md index e80bc71a1b..aa27adf5c5 100644 --- a/translations/ko/lessons/5-NLP/README.md +++ b/translations/ko/lessons/5-NLP/README.md @@ -1,69 +1,73 @@ -# 자연어 처리 +# 자연어 처리 -![NLP 작업 요약 스케치](../../../../translated_images/ko/ai-nlp.b22dcb8ca4707cea.webp) +![NLP 작업 요약 스케치](../../../../translated_images/ko/ai-nlp.b22dcb8ca4707cea.webp) -이 섹션에서는 **자연어 처리(NLP)**와 관련된 작업을 처리하기 위해 신경망을 사용하는 방법에 대해 집중적으로 다룹니다. 컴퓨터가 해결할 수 있기를 바라는 많은 NLP 문제들이 있습니다: +이 섹션에서는 **자연어 처리 (NLP)** 관련 작업을 다루기 위해 신경망을 사용하는 것에 집중할 것입니다. 컴퓨터가 해결할 수 있길 원하는 여러 NLP 문제가 있습니다: -* **텍스트 분류**는 텍스트 시퀀스와 관련된 전형적인 분류 문제입니다. 예를 들어, 이메일 메시지를 스팸과 비스팸으로 분류하거나, 기사를 스포츠, 비즈니스, 정치 등으로 분류하는 작업이 있습니다. 또한, 챗봇을 개발할 때 사용자가 무엇을 말하고 싶어하는지 이해해야 하는 경우가 많습니다. 이 경우 **의도 분류(intent classification)**를 다루게 됩니다. 의도 분류에서는 종종 많은 카테고리를 처리해야 합니다. -* **감정 분석**은 전형적인 회귀 문제로, 문장의 긍정적/부정적 의미를 나타내는 숫자(감정)를 부여해야 합니다. 감정 분석의 더 발전된 버전은 **측면 기반 감정 분석(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와 같은 고급 텍스트 생성 모델은 [프롬프트 프로그래밍](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 작업이 신경망을 사용해 더 효과적으로 해결됩니다. -> 많은 고전적인 NLP 방법은 [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org) Python 라이브러리에 구현되어 있습니다. 다양한 NLP 작업을 NLTK를 사용하여 해결하는 방법을 다룬 훌륭한 [NLTK Book](https://www.nltk.org/book/)이 온라인에서 제공됩니다. +> 많은 고전적인 NLP 방법들이 [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org) 파이썬 라이브러리로 구현되어 있습니다. 다양한 NLP 작업을 NLTK로 해결하는 방법을 다루는 훌륭한 [NLTK 책](https://www.nltk.org/book/)도 온라인에서 볼 수 있습니다. -이 강의에서는 주로 NLP를 위해 신경망을 사용하는 데 초점을 맞추고, 필요한 경우 NLTK를 사용할 것입니다. +본 과정에서는 주로 NLP를 위해 신경망을 사용하는 데 집중하며 필요에 따라 NLTK를 사용할 것입니다. -우리는 이미 표 형식 데이터와 이미지 처리를 위해 신경망을 사용하는 방법에 대해 배웠습니다. 이러한 데이터 유형과 텍스트의 주요 차이점은 텍스트가 가변 길이의 시퀀스라는 점입니다. 반면, 이미지의 경우 입력 크기가 미리 정해져 있습니다. 합성곱 신경망은 입력 데이터에서 패턴을 추출할 수 있지만, 텍스트의 패턴은 더 복잡합니다. 예를 들어, 부정어가 주어와 여러 단어로 분리될 수 있습니다(예: *나는 오렌지를 좋아하지 않는다* vs. *나는 저 크고 화려하고 맛있는 오렌지를 좋아하지 않는다*). 이러한 경우에도 하나의 패턴으로 해석되어야 합니다. 따라서 언어를 처리하려면 *순환 신경망(recurrent networks)* 및 *트랜스포머(transformers)*와 같은 새로운 신경망 유형을 도입해야 합니다. +우리는 이미 신경망을 표 형태 데이터와 이미지 데이터를 다루는 데 사용하는 방법을 배웠습니다. 이들 데이터와 텍스트의 주요 차이점은 텍스트가 가변 길이의 시퀀스라는 점이고, 이미지의 경우 입력 크기가 미리 정해져 있다는 점입니다. 컨벌루션 네트워크가 입력 데이터에서 패턴을 추출할 수 있지만, 텍스트의 패턴은 더 복잡합니다. 예를 들어, 부정이 주어와 떨어질 수 있는데도(예: *나는 오렌지를 좋아하지 않는다* 와 *나는 그 크고 화려하며 맛있는 오렌지를 좋아하지 않는다*), 이는 하나의 패턴으로 해석되어야 합니다. 따라서 언어를 다루려면 순환 신경망트랜스포머 같은 새로운 신경망 유형을 도입해야 합니다. -## 라이브러리 설치 +## 라이브러리 설치 -이 강의를 로컬 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 ``` -> TensorFlow를 사용한 NLP를 [Microsoft Learn](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste)에서 시도해볼 수 있습니다. +> [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 메모리 양은 미니배치 크기 등 다양한 요인에 따라 달라집니다. -* **미니배치 크기 최소화**: GPU 메모리 문제가 발생하면 코드에서 미니배치 크기를 줄이는 것을 고려해보세요. -* **TensorFlow GPU 메모리 해제**: TensorFlow의 이전 버전은 하나의 Python 커널에서 여러 모델을 훈련할 때 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') 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)을 방문하세요. -클래식 ML 관점에서 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)를 사용하여 번역되었습니다. 정확성을 위해 최선을 다하고 있지만, 자동 번역에는 오류나 부정확성이 포함될 수 있습니다. 원본 문서를 해당 언어로 작성된 상태에서 권위 있는 자료로 간주해야 합니다. 중요한 정보의 경우, 전문적인 인간 번역을 권장합니다. 이 번역 사용으로 인해 발생하는 오해나 잘못된 해석에 대해 당사는 책임을 지지 않습니다. \ No newline at end of file + +**면책 조항**: +이 문서는 AI 번역 서비스 [Co-op Translator](https://github.com/Azure/co-op-translator)를 사용하여 번역되었습니다. 정확성을 기하기 위해 노력하고 있으나, 자동 번역은 오류나 부정확한 부분이 있을 수 있음을 유의하시기 바랍니다. 원본 문서의 원어본이 권위 있는 자료로 간주되어야 합니다. 중요한 정보의 경우, 전문가의 인간 번역을 권장합니다. 이 번역 사용으로 인해 발생하는 오해나 잘못된 해석에 대해 당사는 책임을 지지 않습니다. + \ No newline at end of file diff --git a/translations/lt/.co-op-translator.json b/translations/lt/.co-op-translator.json index 9d5082bffc..655a74c163 100644 --- a/translations/lt/.co-op-translator.json +++ b/translations/lt/.co-op-translator.json @@ -5,6 +5,12 @@ "source_file": "AGENTS.md", "language_code": "lt" }, + "CONTRIBUTING.md": { + "original_hash": "c6fd7e781b67111a90abd166d0ce4aa0", + "translation_date": "2026-07-08T15:01:01+00:00", + "source_file": "CONTRIBUTING.md", + "language_code": "lt" + }, "README.md": { "original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b", "translation_date": "2026-04-06T20:34:04+00:00", @@ -17,6 +23,19 @@ "source_file": "SECURITY.md", "language_code": "lt" }, + "__translation_failures__": { + "lessons/sketchnotes/LICENSE.md": { + "original_hash": "45ab63a2cd8f5faef6c9b150618837a4", + "source_file": "lessons/sketchnotes/LICENSE.md", + "language_code": "lt", + "failure_date": "2026-07-08T14:51:55+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-31T18:04:59+00:00", @@ -54,8 +73,8 @@ "language_code": "lt" }, "examples/README.md": { - "original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7", - "translation_date": "2025-10-03T11:35:44+00:00", + "original_hash": "7883d52c2e2a221e0b07a7b112a149b9", + "translation_date": "2026-07-08T14:47:33+00:00", "source_file": "examples/README.md", "language_code": "lt" }, @@ -66,8 +85,8 @@ "language_code": "lt" }, "lessons/0-course-setup/how-to-run.md": { - "original_hash": "a4717bd9103b9f6cd84d534b83534689", - "translation_date": "2026-01-16T06:50:56+00:00", + "original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1", + "translation_date": "2026-07-08T14:47:54+00:00", "source_file": "lessons/0-course-setup/how-to-run.md", "language_code": "lt" }, @@ -191,6 +210,12 @@ "source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md", "language_code": "lt" }, + "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": { + "original_hash": "99b816b6a4957ef4100cee4c4221dff9", + "translation_date": "2026-07-08T14:34:46+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", + "language_code": "lt" + }, "lessons/4-ComputerVision/08-TransferLearning/lab/README.md": { "original_hash": "7765935c35fcee69b9fe2d0cfd6963e2", "translation_date": "2025-08-31T17:38:50+00:00", @@ -330,8 +355,8 @@ "language_code": "lt" }, "lessons/5-NLP/README.md": { - "original_hash": "8ef02a9318257ea140ed3ed74442096d", - "translation_date": "2025-08-31T17:55:03+00:00", + "original_hash": "038df6f1a73e49f6430740da083bfd6d", + "translation_date": "2026-07-08T14:48:23+00:00", "source_file": "lessons/5-NLP/README.md", "language_code": "lt" }, diff --git a/translations/lt/CONTRIBUTING.md b/translations/lt/CONTRIBUTING.md new file mode 100644 index 0000000000..f32feb9a3f --- /dev/null +++ b/translations/lt/CONTRIBUTING.md @@ -0,0 +1,29 @@ +# Prisidėjimas prie AI-For-Beginners + +Dėkojame už susidomėjimą prisidėti prie AI-For-Beginners! Kviečiame teikti vertimus, pamokų pataisas ir formatavimo taisymus. + +## Microsoft Bendradarbio Licencijos Sutartis (CLA) + +Šis projektas laukią indėlių ir pasiūlymų. Daugumai indėlių reikia sutikti su Bendradarbio Licencijos Sutartimi (CLA), kurioje pareiškiama, kad turite teisę ir iš tikrųjų suteikiate mums teises naudoti jūsų indėlį. Daugiau informacijos rasite adresu [https://cla.microsoft.com](https://cla.microsoft.com). + +Kai pateikiate pull request, CLA-botas automatiškai nustatys, ar turite pateikti CLA, ir atitinkamai pažymės PR (pvz., pridės žymą, komentarą). Tiesiog vykdykite bot'o nurodymus. Tai reikės padaryti tik kartą visuose saugyklose, kuriose naudojama mūsų CLA. + +## Kaip prisidėti + +### 1. Rašybos ir Kodo Klaidos Taisymas +Jei radote rašybos klaidą ar programinės įrangos klaidą bet kuriame Jupyter užraše ar pamokos markdown faile: +1. Šakinkite (fork) saugyklą. +2. Pataisykite rašybos klaidą ar neveikiantį nuorodą. +3. Pateikite Pull Request su aiškiu taisymo aprašymu. + +### 2. Vertimų Pateikimas +Laukiame pamokų vertimų į kitas kalbas! Prašome dėti vertimus į katalogą `translations/` naudodami ten esančius aplankų pavadinimus (pvz., `translations/es/`, `translations/pt-BR/`, `translations/zh-CN/`). + +Daugiau informacijos rasite [etc/CONTRIBUTING.md](etc/CONTRIBUTING.md). + +--- + + +**Atsakomybės apribojimas**: +Šis dokumentas buvo išverstas naudojant dirbtinio intelekto vertimo paslaugą [Co-op Translator](https://github.com/Azure/co-op-translator). Nors siekiame tikslumo, prašome atkreipti dėmesį, kad automatiniai vertimai gali turėti klaidų ar netikslumų. Originalus dokumentas jo gimtąja kalba laikomas autoritetingu šaltiniu. Svarbiai informacijai rekomenduojama naudoti profesionalų žmogiškąjį vertimą. Mes neatsakome už jokius nesusipratimus ar neteisingą interpretaciją, kilusią naudojantis šiuo vertimu. + \ No newline at end of file diff --git a/translations/lt/examples/README.md b/translations/lt/examples/README.md index bd7b506df2..59fa386c77 100644 --- a/translations/lt/examples/README.md +++ b/translations/lt/examples/README.md @@ -1,27 +1,27 @@ -# Pradedančiųjų AI pavyzdžiai +# Pradedantiesiems Draugiški AI Pavyzdžiai -Sveiki! Šiame kataloge rasite paprastus, savarankiškus pavyzdžius, kurie padės jums pradėti dirbti su AI ir mašininio mokymosi technologijomis. Kiekvienas pavyzdys yra sukurtas taip, kad būtų draugiškas pradedantiesiems, su išsamiais komentarais ir žingsnis po žingsnio paaiškinimais. +Sveiki! Šiame kataloge rasite paprastų, savarankiškų pavyzdžių, kurie padės jums pradėti dirbti su dirbtiniu intelektu ir mašininiu mokymusi. Kiekvienas pavyzdys sukurtas taip, kad būtų draugiškas pradedantiesiems su išsamiais komentarais ir žingsnis po žingsnio paaiškinimais. -## 📚 Pavyzdžių apžvalga +## 📚 Pavyzdžių Apžvalga -| Pavyzdys | Aprašymas | Sudėtingumas | Reikalavimai | -|----------|-----------|--------------|--------------| -| [Hello AI World](../../../examples/01-hello-ai-world.py) | Jūsų pirmoji AI programa – paprastas šablonų atpažinimas | ⭐ Pradedantysis | Python pagrindai | -| [Paprastas neuroninis tinklas](../../../examples/02-simple-neural-network.py) | Sukurkite neuroninį tinklą nuo nulio | ⭐⭐ Pradedantysis+ | Python, pagrindinė matematika | -| [Vaizdų klasifikatorius](./03-image-classifier.ipynb) | Klasifikuokite vaizdus naudodami iš anksto apmokytą modelį | ⭐⭐ Pradedantysis+ | Python, numpy | -| [Teksto sentimentas](../../../examples/04-text-sentiment.py) | Analizuokite teksto sentimentą (teigiamas/neigiamas) | ⭐⭐ Pradedantysis+ | Python | +| Pavyzdys | Aprašymas | Sudėtingumas | Išankstinės Žinios | +|---------|-------------|------------|---------------| +| [Hello AI World](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/01-hello-ai-world.py) | Jūsų pirmoji AI programa - paprasta šablonų atpažinimas | ⭐ Pradedantysis | Python pagrindai | +| [Simple Neural Network](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/02-simple-neural-network.py) | Sukurkite nervinį tinklą nuo nulio | ⭐⭐ Pradedantysis+ | Python, pagrindinė matematika | +| [Image Classifier](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/03-image-classifier.ipynb) | Klasifikuokite paveikslėlius su iš anksto apmokytu modeliu | ⭐⭐ Pradedantysis+ | Python, numpy | +| [Text Sentiment](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/04-text-sentiment.py) | Analizuokite teksto nuotaiką (teigiama/neigiama) | ⭐⭐ Pradedantysis+ | Python | ## 🚀 Pradžia -### Reikalavimai +### Išankstinės sąlygos -Įsitikinkite, kad turite įdiegtą Python (rekomenduojama 3.8 ar naujesnė versija). Įdiekite reikalingus paketus: +Įsitikinkite, kad turite įdiegtą Python (rekomenduojama 3.8 arba naujesnė). Įdiekite reikiamus paketus: ```bash -# For Python scripts +# Skirta Python scenarijams pip install numpy -# For Jupyter notebooks (image classifier) +# Skirta Jupyter užrašų knygelėms (vaizdų klasifikatorius) pip install jupyter numpy pillow tensorflow ``` @@ -32,7 +32,7 @@ conda env create --name ai4beg --file ../environment.yml conda activate ai4beg ``` -### Pavyzdžių paleidimas +### Pavyzdžių Vykdymas **Python skriptams (.py failai):** ```bash @@ -44,42 +44,44 @@ python 01-hello-ai-world.py jupyter notebook 03-image-classifier.ipynb ``` -## 📖 Mokymosi kelias +## 📖 Mokymosi Kelias -Rekomenduojame sekti pavyzdžius iš eilės: +Rekomenduojame sekti pavyzdžius tokia tvarka: -1. **Pradėkite nuo "Hello AI World"** – Sužinokite šablonų atpažinimo pagrindus -2. **Sukurkite paprastą neuroninį tinklą** – Supraskite, kaip veikia neuroniniai tinklai -3. **Išbandykite vaizdų klasifikatorių** – Pamatykite AI veikimą su realiais vaizdais -4. **Analizuokite teksto sentimentą** – Tyrinėkite natūralios kalbos apdorojimą +1. **Pradėkite nuo "Hello AI World"** - Išmokite pagrindus apie šablonų atpažinimą +2. **Sukurkite Paprastą Nervinį Tinklą** - Supraskite, kaip veikia nerviniai tinklai +3. **Išbandykite Paveikslėlių Klasifikatorių** - Pamatykite AI veikimą su realiais vaizdais +4. **Analizuokite Teksto Nuotaiką** - Tyrinėkite natūralios kalbos apdorojimą -## 💡 Patarimai pradedantiesiems +## 💡 Patarimai Pradedantiesiems -- **Atidžiai skaitykite kodo komentarus** – Jie paaiškina, ką daro kiekviena eilutė -- **Eksperimentuokite!** – Pabandykite keisti reikšmes ir stebėkite rezultatus -- **Nesijaudinkite, jei ne viską suprasite** – Mokymasis užtrunka -- **Užduokite klausimus** – Naudokitės [Diskusijų lenta](https://github.com/microsoft/AI-For-Beginners/discussions) +- **Atidžiai skaitykite kodo komentarus** - Jie paaiškina, ką kiekviena eilutė atlieka +- **Eksperimentuokite!** - Pabandykite keisti reikšmes ir pamatykite, kas vyksta +- **Nesijaudinkite, jei nesuprantate visko iš karto** - Mokymasis užtrunka laiko +- **Užduokite klausimus** - Naudokitės [Diskusijų lenta](https://github.com/microsoft/AI-For-Beginners/discussions) -## 🔗 Kiti žingsniai +## 🔗 Tolimesni Žingsniai -Baigę šiuos pavyzdžius, tyrinėkite visą mokymo planą: +Užbaigus šiuos pavyzdžius, tyrinėkite visą mokymo planą: - [Įvadas į AI](../lessons/1-Intro/README.md) -- [Neuroniniai tinklai](../lessons/3-NeuralNetworks/README.md) -- [Kompiuterinis matymas](../lessons/4-ComputerVision/README.md) -- [Natūralios kalbos apdorojimas](../lessons/5-NLP/README.md) +- [Nerviniai Tinklai](../lessons/3-NeuralNetworks/README.md) +- [Kompiuterinė Vizija](../lessons/4-ComputerVision/README.md) +- [Natūrali Kalbos Apdorojimas](../lessons/5-NLP/README.md) -## 🤝 Prisidėkite +## 🤝 Prisidėjimas -Ar šie pavyzdžiai buvo naudingi? Padėkite mums juos patobulinti: -- Praneškite apie problemas arba siūlykite patobulinimus +Ar šie pavyzdžiai jums buvo naudingi? Padėkite mums juos patobulinti: +- Praneškite apie klaidas arba pasiūlykite patobulinimus - Pridėkite daugiau pavyzdžių pradedantiesiems - Tobulinkite dokumentaciją ir komentarus --- -*Atminkite: Kiekvienas ekspertas kažkada buvo pradedantysis. Sėkmingo mokymosi! 🎓* +*Prisiminkite: Kiekvienas ekspertas kadaise buvo pradedantysis. Sėkmingo mokymosi! 🎓* --- -**Atsakomybės atsisakymas**: -Šis dokumentas buvo išverstas naudojant AI vertimo paslaugą [Co-op Translator](https://github.com/Azure/co-op-translator). Nors siekiame tikslumo, prašome atkreipti dėmesį, kad automatiniai vertimai gali turėti klaidų ar netikslumų. Originalus dokumentas jo gimtąja kalba turėtų būti laikomas autoritetingu šaltiniu. Dėl svarbios informacijos rekomenduojama profesionali žmogaus vertimo paslauga. Mes neprisiimame atsakomybės už nesusipratimus ar neteisingus aiškinimus, atsiradusius naudojant šį vertimą. \ No newline at end of file + +**Atsakomybės apribojimas**: +Šis dokumentas buvo išverstas naudojant dirbtinio intelekto vertimo paslaugą [Co-op Translator](https://github.com/Azure/co-op-translator). Nors siekiame tikslumo, prašome atkreipti dėmesį, kad automatiniai vertimai gali turėti klaidų ar netikslumų. Originalus dokumentas jo gimtąja kalba laikomas autoritetingu šaltiniu. Svarbiai informacijai rekomenduojama naudoti profesionalų žmogiškąjį vertimą. Mes neatsakome už jokius nesusipratimus ar neteisingą interpretaciją, kilusią naudojantis šiuo vertimu. + \ No newline at end of file diff --git a/translations/lt/lessons/0-course-setup/how-to-run.md b/translations/lt/lessons/0-course-setup/how-to-run.md index 72f59d4693..cf70a796a7 100644 --- a/translations/lt/lessons/0-course-setup/how-to-run.md +++ b/translations/lt/lessons/0-course-setup/how-to-run.md @@ -1,12 +1,12 @@ # Kaip paleisti kodą -Ši mokymo programa apima daug vykdomų pavyzdžių ir laboratorinių darbų, kuriuos norėsite paleisti. Tam jums reikalinga galimybė vykdyti Python kodą Jupyter užrašinėse, pateiktose kaip šios mokymo programos dalis. Turite keletą galimybių kodui paleisti: +Šioje mokymo programoje yra daug vykdomų pavyzdžių ir laboratorinių darbų, kuriuos norėsite paleisti. Tam reikia galimybės vykdyti Python kodą Jupyter užrašuose, kurie pateikti kaip šios mokymo programos dalis. Turite keletą galimybių, kaip paleisti kodą: -## Paleisti vietoje savo kompiuteryje +## Vykdyti vietoje savo kompiuteryje -Norėdami paleisti kodą vietoje savo kompiuteryje, reikia įdiegti Python. Vienas iš rekomenduojamų sprendimų yra įdiegti **[miniconda](https://conda.io/en/latest/miniconda.html)** – tai gana lengvas diegimas, palaikantis `conda` paketo tvarkyklę skirtingoms Python **virtualioms aplinkoms**. +Norint paleisti kodą vietoje savo kompiuteryje, reikia turėti įdiegtą Python. Viena iš rekomendacijų – įdiegti **[miniconda](https://conda.io/en/latest/miniconda.html)** – tai pakankamai lengvas diegimas, kuris palaiko `conda` paketų tvarkyklę skirtingoms Python **virtualioms aplinkoms**. -Įdiegę minicondą, klonuokite saugyklą ir susikurkite virtualią aplinką, kuri bus naudojama šiam kursui: +Įdiegus miniconda, nuklonuokite saugyklą ir sukurkite virtualią aplinką, kuri bus naudojama šiame kurse: ```bash git clone http://github.com/microsoft/ai-for-beginners @@ -15,17 +15,17 @@ conda env create --name ai4beg --file .devcontainer/environment.yml conda activate ai4beg ``` -### Naudojant Visual Studio Code su Python plėtiniu +### Naudojant Visual Studio Code su Python papildiniu -Ši mokymo programa geriausiai naudojama atidarius ją [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) su [Python plėtiniu](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste). +Šią mokymo programą geriausia naudoti atidarant ją [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) su [Python Extension](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste). -> **Pastaba**: Kai klonuojate ir atidarote katalogą VS Code, jis automatiškai pasiūlys įdiegti Python plėtinius. Taip pat turėsite įdiegti minicondą, kaip aprašyta aukščiau. +> **Pastaba**: Kai tik nuklonuosite ir atidarysite katalogą VS Code, jis automatiškai pasiūlys įdiegti Python papildinius. Taip pat turėsite įdiegti miniconda, kaip aprašyta aukščiau. -> **Pastaba**: Jei VS Code pasiūlys jums iš naujo atidaryti saugyklą konteineryje, turėtumėte tai atmesti, kad naudotumėte vietinę Python diegimą. +> **Pastaba**: Jei VS Code siūlo atidaryti saugyklą konteineryje, turėtumėte atsisakyti šio pasiūlymo, kad naudotumėte vietoje įdiegtą Python. ### Naudojant Jupyter naršyklėje -Taip pat galite naudoti Jupyter aplinką per naršyklę savo kompiuteryje. Tiek klasikinis Jupyter, tiek JupyterHub suteikia patogią kūrimo aplinką su automatinio pildymo galimybėmis, kodo paryškinimu ir kita. +Taip pat galite naudoti Jupyter aplinką naršyklėje savo kompiuteryje. Tiek klasikinis Jupyter, tiek JupyterHub suteikia patogią vystymo aplinką su automatinio pildymo, kodo paryškinimo ir kitomis funkcijomis. Norėdami paleisti Jupyter vietoje, eikite į kurso katalogą ir vykdykite: @@ -36,36 +36,36 @@ arba ```bash jupyterhub ``` -Tada galite pereiti į bet kurį `.ipynb` failą, atidaryti jį ir pradėti darbą. +Tuomet galite naršyti bet kurį iš `.ipynb` failų, atidaryti juos ir pradėti darbą. -### Paleidimas konteineryje +### Vykdymas konteineryje -Viena iš alternatyvų Python diegimui būtų kodą paleisti konteineryje. Kadangi mūsų saugykloje yra specialus `.devcontainer` aplankas, kuris nurodo, kaip sukurti konteinerį šiai saugyklai, VS Code siūlo galimybę iš naujo atidaryti kodą konteineryje. Tai reikalauja Docker diegimo ir yra sudėtingiau, todėl rekomenduojame tai labiau pažengusiems vartotojams. +Vienas iš Python diegimo alternatyvų yra paleisti kodą konteineryje. Kadangi mūsų saugykla turi specialų `.devcontainer` katalogą, kuris nurodo, kaip sukurti konteinerį šiai saugyklai, VS Code siūlo galimybę iš naujo atidaryti kodą konteineryje. Tam reikės įdiegti Docker, ir tai bus sudėtingiau, todėl rekomenduojame šį būdą labiau patyrusiems vartotojams. -## Paleidimas debesyje +## Vykdymas debesyje -Jei nenorite diegti Python vietoje ir turite prieigą prie debesijos – gera alternatyva būtų paleisti kodą debesyje. Yra keletas būdų, kaip tai padaryti: +Jei nenorite diegti Python vietoje ir turite prieigą prie kokių nors debesies išteklių – geras pasirinkimas būtų vykdyti kodą debesyje. Tai galite padaryti keliais būdais: -* Naudojant **[GitHub Codespaces](https://github.com/features/codespaces)** – tai virtuali aplinka, sukurta jums GitHub platformoje, pasiekiama per VS Code naršyklės sąsają. Jei turite prieigą prie Codespaces, tiesiog spustelėkite **Code** mygtuką saugykloje, paleiskite codespace ir pradėkite darbą vos per kelias minutes. -* Naudojant **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) suteikia nemokamas skaičiavimo išteklių debesyje žmonėms, kaip jūs, norintiems išbandyti kodą iš GitHub. Pagrindiniame puslapyje yra mygtukas, leidžiantis atidaryti saugyklą Binder platformoje – tai greitai nuves į Binder svetainę, kuri sukurs fono konteinerį ir sklandžiai paleis Jupyter interneto sąsają. +* Naudojant **[GitHub Codespaces](https://github.com/features/codespaces)**, tai yra virtuali aplinka, sukurta jums GitHub platformoje, pasiekiama per VS Code naršyklės sąsają. Jei turite prieigą prie Codespaces, tiesiog spauskite **Code** mygtuką saugykloje, pradėkite codespace ir pradėkite dirbti labai greitai. +* Naudojant **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) suteikia nemokamus skaičiavimo išteklius debesyje žmonėms, norintiems išbandyti kodą GitHub platformoje. Pagrindiniame puslapyje yra mygtukas atidaryti saugyklą Binder – tai greitai nukels jus į Binder svetainę, kuri sukuria konteinerį ir sklandžiai paleidžia Jupyter interneto sąsają. -> **Pastaba**: Siekiant išvengti piktnaudžiavimo, Binder prieiga prie kai kurių interneto išteklių yra blokuojama. Tai gali trukdyti veikti kai kuriems kodams, kurie parsisiunčia modelius ir/ar duomenų rinkinius iš viešojo interneto. Gali tekti ieškoti sprendimų. Taip pat Binderyje teikiami skaičiavimo ištekliai yra pakankamai baziniai, todėl modelių mokymas bus lėtas, ypač vėlesniuose sudėtingesniuose pamokų etapuose. +> **Pastaba**: Norint išvengti piktnaudžiavimo, Binder blokuoja prieigą prie kai kurių internetinių šaltinių. Tai gali neleisti veikti kai kuriems kodo fragmentams, kurie naudoja modelius ir (arba) duomenų rinkinius iš interneto. Gali prireikti rasti sprendimų. Taip pat Binder skirti skaičiavimo ištekliai yra gana pagrindiniai, todėl treniruotės bus lėtos, ypač vėlesnėse, sudėtingesnėse pamokose. -## Paleidimas debesyje su GPU palaikymu +## Vykdymas debesyje su GPU -Kai kurios vėlesnės pamokos šioje mokymo programoje labai naudos GPU palaikymą. Pavyzdžiui, modelių mokymas kitu atveju gali būti labai lėtas. Galite rinktis kelis variantus, ypač jei turite prieigą prie debesijos per [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) arba per savo instituciją: +Kai kurios vėlesnės šios mokymo programos pamokos labai naudotųsi GPU palaikymu. Modelių mokymas, pavyzdžiui, kitu atveju gali būti labai lėtas. Yra keletas variantų, kuriuos galite pasirinkti, ypač jei turite prieigą prie debesies per [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) arba per savo instituciją: -* Sukurkite [Data Science Virtual Machine](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) ir prisijunkite prie jos per Jupyter. Tuomet galite klonuoti saugyklą tiesiai į mašiną ir pradėti mokytis. NC serijos VM turi GPU palaikymą. +* Sukurkite [Data Science Virtual Machine](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) ir prisijunkite prie jos per Jupyter. Galite tiesiog nuklonuoti saugyklą tiesiai į šį kompiuterį ir pradėti mokytis. NC serijos VM turi GPU palaikymą. -> **Pastaba**: Kai kurios prenumeratos, įskaitant Azure for Students, pagal nutylėjimą GPU palaikymo neteikia. Gali prireikti pateikti techninės pagalbos užklausą dėl papildomų GPU branduolių. +> **Pastaba**: Kai kurios prenumeratos, įskaitant Azure for Students, pagal nutylėjimą neteikia GPU palaikymo. Gali prireikti pateikti užklausą techninės pagalbos skyriui dėl papildomų GPU branduolių. -* Sukurkite [Azure Machine Learning Workspace](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) ir naudokite ten Notebook funkciją. [Šis vaizdo įrašas](https://azure-for-academics.github.io/quickstart/azureml-papers/) rodo, kaip klonuoti saugyklą į Azure ML užrašinę ir pradėti ją naudoti. +* Sukurkite [Azure Machine Learning Workspace](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste), o tada naudokite ten esančią Notebook funkciją. [Šis video](https://azure-for-academics.github.io/quickstart/azureml-papers/) parodo, kaip nuklonuoti saugyklą į Azure ML užrašinį ir pradėti jį naudoti. -Taip pat galite naudoti Google Colab, kuris suteikia nemokamą GPU palaikymą, ir įkelti Jupyter užrašines po vieną, kad jas vykdytumėte. +Taip pat galite naudoti Google Colab, kuris suteikia nemokamą GPU palaikymą, ir įkelti Jupyter užrašus ten, kad paleistumėte juos po vieną. --- -**Atsakomybės apribojimas**: -Šis dokumentas išverstas naudojant dirbtinio intelekto vertimo paslaugą [Co-op Translator](https://github.com/Azure/co-op-translator). Nors stengiamės užtikrinti tikslumą, prašome atkreipti dėmesį, kad automatizuoti vertimai gali turėti klaidų arba netikslumų. Originalus dokumentas gimtąja kalba turi būti laikomas autoritetingu šaltiniu. Kritinei informacijai rekomenduojama naudoti profesionalų žmogaus vertimą. Mes neprisiimame atsakomybės už bet kokius nesusipratimus ar neteisingus aiškinimus, kilusius dėl šio vertimo naudojimo. +**Atsakomybės apribojimas**: +Šis dokumentas buvo išverstas naudojant dirbtinio intelekto vertimo paslaugą [Co-op Translator](https://github.com/Azure/co-op-translator). Nors siekiame tikslumo, prašome atkreipti dėmesį, kad automatiniai vertimai gali turėti klaidų ar netikslumų. Originalus dokumentas jo gimtąja kalba laikomas autoritetingu šaltiniu. Svarbiai informacijai rekomenduojama naudoti profesionalų žmogiškąjį vertimą. Mes neatsakome už jokius nesusipratimus ar neteisingą interpretaciją, kilusią naudojantis šiuo vertimu. \ No newline at end of file diff --git a/translations/lt/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/lt/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index 3923b9dd95..a9acd2cf70 100644 --- a/translations/lt/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/lt/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -4,11 +4,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Iš anksto apmokyti modeliai ir perkėlimo mokymasis\n", + "# Iš anksto apmokyti modeliai ir perdavimo mokymasis\n", "\n", - "CNN tinklų mokymas gali užtrukti daug laiko ir reikalauti didelio duomenų kiekio. Tačiau didelė dalis laiko skiriama tam, kad tinklas išmoktų geriausius žemo lygio filtrus, kuriuos jis naudoja raštams iš vaizdų išgauti. Natūraliai kyla klausimas – ar galime naudoti neuroninį tinklą, apmokytą viename duomenų rinkinyje, ir pritaikyti jį kitų vaizdų klasifikavimui be pilno mokymo proceso?\n", + "Konvoliucinių neuroninių tinklų (CNN) mokymas gali užtrukti daug laiko, o tam reikalinga daug duomenų. Tačiau daug laiko praleidžiama mokantis geriausių žemo lygio filtrų, kuriuos tinklas naudoja atpažinti vaizdų raštus. Kyla natūralus klausimas – ar galime naudoti neuroninį tinklą, apmokytą vienam duomenų rinkiniui, ir pritaikyti jį skirtingų vaizdų klasifikavimui be pilno mokymo proceso?\n", "\n", - "Šis metodas vadinamas **perkėlimo mokymusi**, nes mes perkeliame tam tikras žinias iš vieno neuroninio tinklo modelio į kitą. Perkėlimo mokymesi dažniausiai pradedame nuo iš anksto apmokyto modelio, kuris buvo apmokytas naudojant didelį vaizdų duomenų rinkinį, pavyzdžiui, **ImageNet**. Tokie modeliai jau geba gerai išgauti įvairias savybes iš bendrinių vaizdų, ir daugeliu atvejų, sukūrus klasifikatorių ant šių išgautų savybių, galima pasiekti gerų rezultatų.\n" + "Šis požiūris vadinamas **perdavimo mokymusi**, nes mes perduodame dalį žinių iš vieno neuroninio tinklo modelio kitam. Perdavimo mokymesi paprastai pradedame nuo iš anksto apmokyto modelio, kuris buvo apmokytas naudodamas didelį vaizdų duomenų rinkinį, pavyzdžiui, **ImageNet**. Tokie modeliai jau geba gerai išgauti įvairias savybes iš bendrinių vaizdų, ir daugeliu atvejų pakanka ant tų išgautų savybių pastatyti klasifikatorių, kad būtų pasiektas geras rezultatas.\n" ] }, { @@ -29,11 +29,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Kačių ir šunų duomenų rinkinys\n", + "## Katinai prieš šunis duomenų rinkinys\n", "\n", - "Šiame skyriuje spręsime realaus gyvenimo problemą – kačių ir šunų vaizdų klasifikavimą. Tam naudosime [Kaggle Cats vs. Dogs Dataset](https://www.kaggle.com/c/dogs-vs-cats), kurį taip pat galima atsisiųsti [iš Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n", + "Šiame skyriuje spręsime realaus gyvenimo užduotį – klasifikuoti katinų ir šunų nuotraukas. Tam naudosime [Kaggle Cats vs. Dogs Dataset](https://www.kaggle.com/c/dogs-vs-cats), kurį taip pat galima atsisiųsti [iš Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n", "\n", - "Atsisiųskime šį duomenų rinkinį ir išskleiskime jį į `data` katalogą (šis procesas gali užtrukti!).\n" + "Atsisiųskime šį duomenų rinkinį ir išarchyvuokime jį į `data` katalogą (šis procesas gali užtrukti!):\n" ] }, { @@ -64,7 +64,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Deja, duomenų rinkinyje yra keletas sugadintų vaizdo failų. Turime greitai išvalyti, kad patikrintume sugadintus failus. Kad nesugadintume šio mokymo, kodą duomenų rinkinio patikrinimui perkėlėme į modulį.\n" + "Deja, duomenų rinkinyje yra keletas sugadintų vaizdų failų. Turime greitai juos patikrinti dėl sugadintų failų. Kad nesugadintume šio vadovo, perkėlėme kodo patikrinimą į modulį.\n" ] }, { @@ -335,11 +335,11 @@ "source": [ "## Duomenų rinkinio įkėlimas\n", "\n", - "Ankstesniuose pavyzdžiuose mes įkeldavome duomenų rinkinius, kurie jau yra integruoti į Keras. Dabar mes dirbsime su savo duomenų rinkiniu, kurį reikia įkelti iš vaizdų katalogo.\n", + "Ankstesniuose pavyzdžiuose mes įkėlėme Keras įmontuotus duomenų rinkinius. Dabar ketiname dirbti su savo duomenų rinkiniu, kurį reikia įkelti iš paveikslėlių katalogo.\n", "\n", - "Realiame gyvenime vaizdų duomenų rinkinių dydis gali būti gana didelis, todėl negalima tikėtis, kad visi duomenys tilps į atmintį. Dėl to duomenų rinkiniai dažnai pateikiami kaip **generatoriai**, kurie gali grąžinti duomenis mažomis partijomis, tinkamomis mokymui.\n", + "Realiame gyvenime vaizdų duomenų rinkinio dydis gali būti gana didelis, todėl negalima pasikliauti, kad visi duomenys tilps atmintyje. Todėl duomenų rinkiniai dažnai pateikiami kaip **generatoriai**, kurie gali grąžinti duomenis mažuose partijose, tinkamuose mokymui.\n", "\n", - "Norint dirbti su vaizdų klasifikavimu, Keras turi specialią funkciją `image_dataset_from_directory`, kuri gali įkelti vaizdus iš subkatalogų, atitinkančių skirtingas klases. Ši funkcija taip pat pasirūpina vaizdų mastelio keitimu ir gali padalinti duomenų rinkinį į mokymo ir testavimo poskirsnius:\n" + "Norint dirbti su vaizdų klasifikacija, Keras įtraukė specialią funkciją `image_dataset_from_directory`, kuri gali įkelti paveikslėlius iš potankių, atitinkančių įvairias klases. Ši funkcija taip pat rūpinasi vaizdų mastelio keitimu, ir ji gali padalyti duomenų rinkinį į mokymo ir testavimo pogrupius:\n" ] }, { @@ -383,9 +383,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Svarbu nustatyti tą pačią `seed` reikšmę abiem iškvietimams, nes ji turi įtakos vaizdų paskirstymui tarp mokymo ir testavimo duomenų rinkinių.\n", + "Svarbu nustatyti tą patį `seed` reikšmę abiem kvietimams, nes tai veikia vaizdų paskirstymą tarp mokymo ir testavimo duomenų rinkinių.\n", "\n", - "Duomenų rinkinys automatiškai paima klasių pavadinimus iš katalogų, ir, jei reikia, galite juos pasiekti iškviesdami:\n" + "Duomenų rinkinys automatiškai parenka klasės pavadinimus iš katalogų, ir jei reikia, galite juos pasiekti kviesdami:\n" ] }, { @@ -412,7 +412,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Duomenų rinkiniai, kuriuos gavome, gali būti tiesiogiai perduoti `fit` funkcijai, kad būtų apmokytas modelis. Jie apima tiek atitinkamus vaizdus, tiek žymes, kurios gali būti kartojamos naudojant šią konstrukciją:\n" + "Gauti duomenų rinkiniai gali būti tiesiogiai perduoti funkcijai `fit`, kad būtų apmokytas modelis. Jie talpina tiek atitinkamus vaizdus, tiek etiketes, kurias galima apdoroti naudojant šią konstrukciją:\n" ] }, { @@ -453,7 +453,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "> **Pastaba**: Visos vaizdų duomenų rinkinio nuotraukos yra pateiktos kaip slankiojo kablelio tensoriai, kurių reikšmės yra diapazone nuo 0 iki 255. Prieš perduodant jas neuroniniam tinklui, turime šias reikšmes skalėti į diapazoną nuo 0 iki 1. Vaizdams vaizduoti taip pat turime atlikti tą patį arba konvertuoti reikšmes į `int` tipą (kaip tai darome aukščiau pateiktame kode), kad `matplotlib` suprastų, jog norime pavaizduoti originalų neskalintą vaizdą.\n" + "> **Pastaba**: Visos duomenų rinkinio nuotraukos yra pateikiamos kaip plaukiojančio kablelio taškų tensoriai intervale nuo 0 iki 255. Prieš perduodant jas neuroniniam tinklui, turime šias reikšmes sumažinti iki intervalo 0-1. Vaizduojant nuotraukas, turime arba atlikti tą patį, arba konvertuoti reikšmes į `int` tipą (kaip darome aukščiau pateiktame kode), kad parodytume `matplotlib`, jog norime pavaizduoti originalią nesumažintą nuotrauką.\n" ] }, { @@ -462,7 +462,7 @@ "source": [ "## Iš anksto apmokyti modeliai\n", "\n", - "Daugeliui vaizdų klasifikavimo užduočių galima rasti iš anksto apmokytus neuroninių tinklų modelius. Daugelis šių modelių yra pasiekiami `keras.applications` erdvėje, o dar daugiau modelių galima rasti internete. Pažiūrėkime, kaip galima įkelti ir naudoti paprasčiausią VGG-16 modelį:\n" + "Daugelio vaizdų klasifikavimo užduočių atvejais galima rasti iš anksto apmokytus neuroninių tinklų modelius. Daugelis tokių modelių yra prieinami `keras.applications` vardų srities viduje, o dar daugiau modelių galima rasti internete. Pažiūrėkime, kaip galima įkelti ir naudoti paprasčiausią 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,20 +520,17 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Yra keletas svarbių dalykų:\n", - "\n", - "* Prieš perduodant įvestį bet kokiam iš anksto apmokytam tinklui, ją reikia tam tikru būdu apdoroti. Tai atliekama iškviečiant atitinkamą funkciją `preprocess_input`, kuri gauna vaizdų paketą ir grąžina jų apdorotą formą. VGG-16 atveju vaizdai yra normalizuojami, o iš kiekvieno kanalo atimama iš anksto nustatyta vidutinė vertė. Taip yra todėl, kad VGG-16 buvo iš pradžių apmokytas naudojant tokį išankstinį apdorojimą.\n", - "\n", - "* Neuroninis tinklas taikomas įvesties paketui, ir kaip rezultatą gauname 1000 elementų tensorų paketą, kuris rodo kiekvienos klasės tikimybę. Labiausiai tikėtinos klasės numerį galime rasti iškviesdami `argmax` šiai tensoriaus reikšmei.\n", - "\n", - "* Gautas rezultatas yra [`ImageNet` klasės numeris](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Kad šis rezultatas būtų suprantamas, galime naudoti funkciją `decode_predictions`, kuri grąžina n geriausių klasių kartu su jų pavadinimais.\n" + "Čia yra keletas svarbių dalykų:\n", + "* Prieš perduodant įvestį bet kuriam iš anksto apmokytam tinklui, ji turi būti tam tikru būdu išankstinai apdorota. Tai atliekama kviečiant atitinkamą `preprocess_input` funkciją, kuri gauna vaizdų partiją ir grąžina jų apdorotą formą. VGG-16 atveju vaizdai yra normalizuojami, o nuo kiekvieno kanalo atimama tam tikra iš anksto apibrėžta vidutinė reikšmė. Taip yra todėl, kad VGG-16 iš pradžių buvo apmokytas su tokiu išankstiniu apdorojimu.\n", + "* Procedūroje tinklas taikomas įėjimo partijai, ir gauname rezultatą – 1000 elementų tenzorių partiją, kuriame nurodoma tikimybė kiekvienai klasei. Galime rasti tikėtiniausios klasės numerį kviesdami `argmax` šiam tenzoriui.\n", + "* Gautas rezultatas yra [„ImageNet“ klasės numeris](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Norint suprasti šį rezultatą, galima naudoti ir `decode_predictions` funkciją, kuri pateikia viršutines n klases kartu su jų pavadinimais.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Pažvelkime ir į VGG-16 tinklo architektūrą:\n" + "Pažiūrėkime ir į VGG-16 tinklo architektūrą:\n" ] }, { @@ -602,7 +609,7 @@ "source": [ "## GPU skaičiavimai\n", "\n", - "Gilūs neuroniniai tinklai, tokie kaip VGG-16 ir kitos modernesnės architektūros, reikalauja nemažai skaičiavimo galios. Todėl logiška pasinaudoti GPU pagreitinimu, jei jis yra prieinamas. Laimei, Keras automatiškai pagreitina skaičiavimus GPU, jei jis yra pasiekiamas. Galime patikrinti, ar Tensorflow gali naudoti GPU, naudodami šį kodą:\n" + "Gilieji neuroniniai tinklai, tokie kaip VGG-16 ir kitos modernesnės architektūros, reikalauja gana daug skaičiavimo galios. Prasminga naudoti GPU pagreitį, jei jis prieinamas. Laimei, Keras automatiškai pagreitina skaičiavimus GPU, jei jis yra prieinamas. Galime patikrinti, ar Tensorflow gali naudoti GPU, naudodami šį kodą:\n" ] }, { @@ -629,9 +636,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Ištraukiant VGG savybes\n", "\n", - "Jei norime naudoti VGG-16 modelį, kad išgautume savybes iš savo vaizdų, mums reikia modelio be galutinių klasifikavimo sluoksnių. Galime sukurti VGG-16 modelį be viršutinių sluoksnių naudodami šį kodą:\n" + "## VGG požymių išgavimas\n", + "\n", + "Jei norime naudoti VGG-16 modelį, kad išgautume požymius iš mūsų vaizdų, mums reikalingas modelis be galutinių klasifikavimo sluoksnių. Galime sukurti VGG-16 modelį be viršutinių sluoksnių naudodami šį kodą:\n" ] }, { @@ -683,9 +691,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Funkcijų tensoriaus matmenys yra 7x7x512, tačiau norėdami jį vizualizuoti, turėjome jį pertvarkyti į 2D formą.\n", + "Funkcijų tūrio matmenys yra 7x7x512, tačiau norint juos vizualizuoti, turėjome pakeisti formą į 2D.\n", "\n", - "Dabar pabandykime išsiaiškinti, ar šias funkcijas galima naudoti vaizdams klasifikuoti. Rankiniu būdu paimsime dalį vaizdų (mūsų atveju – 50 mini partijų) ir iš anksto apskaičiuosime jų funkcijų vektorius. Tam galime naudoti Tensorflow **dataset** API. `map` funkcija paima duomenų rinkinį ir pritaiko jam pateiktą lambda funkciją, kad transformuotų duomenis. Naudojame šį mechanizmą, kad sukurtume naujus duomenų rinkinius, `ds_features_train` ir `ds_features_test`, kuriuose yra VGG išgautos funkcijos vietoj originalių vaizdų.\n" + "Dabar pamėginkime pažiūrėti, ar šios funkcijos gali būti naudojamos paveikslėlių klasifikavimui. Rankiniu būdu paimsime dalį paveikslėlių (50 mažųjų partijų, mūsų atveju) ir iš anksto apskaičiuosime jų funkcijų vektorius. Tam galime naudoti Tensorflow **dataset** API. Funkcija `map` paima duomenų rinkinį ir taiko jam nurodytą lambda funkciją, kad jį transformuotų. Šio mechanizmo pagalba sukuriame naujus duomenų rinkinius, `ds_features_train` ir `ds_features_test`, kurie vietoje originalių paveikslėlių turi VGG išgautas funkcijas.\n" ] }, { @@ -715,9 +723,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Mes naudojome konstrukciją `.take(50)`, kad apribotume duomenų rinkinio dydį ir pagreitintume demonstraciją. Žinoma, galite atlikti šį eksperimentą su visu duomenų rinkiniu.\n", + "Naudojome konstruktą `.take(50)`, kad apribotume duomenų rinkinio dydį ir paspartintume mūsų demonstraciją. Žinoma, šį eksperimentą galite atlikti su pilnu duomenų rinkiniu.\n", "\n", - "Dabar, kai turime duomenų rinkinį su išgautomis savybėmis, galime apmokyti paprastą tankų klasifikatorių, kuris atskirtų kates nuo šunų. Šis tinklas priims savybių vektorių, kurio forma yra (7,7,512), ir pateiks vieną rezultatą, kuris atitinka arba šunį, arba katę. Kadangi tai yra dvejetainė klasifikacija, naudojame `sigmoid` aktyvacijos funkciją ir `binary_crossentropy` nuostolių funkciją.\n" + "Dabar, kai turime duomenų rinkinį su ištrauktomis savybėmis, galime apmokyti paprastą tankų klasifikatorių, skirtą atskirti kates nuo šunų. Šis tinklas priims savybių vektorių, kurio forma (7,7,512), ir pagamins vieną rezultatą, kuris atitinka arba šunį, arba katę. Kadangi tai dvejetainė klasifikacija, naudojame `sigmoid` aktyvacijos funkciją ir `binary_crossentropy` nuostolio funkciją.\n" ] }, { @@ -746,13 +754,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Rezultatas puikus – galime atskirti katę nuo šuns beveik 95% tikslumu! Tačiau šį metodą išbandėme tik su dalimi visų vaizdų, nes rankinis požymių išskyrimas užima daug laiko.\n", + "Rezultatas yra puikus, galime atskirti katę nuo šuns su beveik 95% tikimybe! Tačiau šį metodą išbandėme tik su dalimi visų paveikslėlių, nes rankinis požymių išskyrimas atrodo labai daug laiko reikalaujantis.\n", "\n", "## Perkėlimo mokymasis naudojant vieną VGG tinklą\n", "\n", - "Taip pat galime išvengti rankinio požymių išankstinio skaičiavimo, naudodami originalų VGG-16 tinklą kaip visumą mokymo metu, pridėdami požymių išskyrimo sluoksnį kaip pirmąjį mūsų tinklo sluoksnį.\n", + "Taip pat galime išvengti rankinio požymių išankstinio apskaičiavimo, naudodami originalų VGG-16 tinklą kaip visą apmokymo metu, pridėdami požymių ištraukiklį kaip pirmą sluoksnį mūsų tinkle.\n", "\n", - "Keras architektūros privalumas yra tas, kad aukščiau apibrėžtas VGG-16 modelis gali būti naudojamas kaip sluoksnis kitame neuroniniame tinkle! Tereikia sukurti tinklą su tankiu klasifikatoriumi viršuje ir tada visą tinklą mokyti naudojant atgalinį sklidimą.\n" + "Keras architektūros grožis yra tas, kad aukščiau aprašytas VGG-16 modelis taip pat gali būti naudojamas kaip sluoksnis kitoje neuroninėje tinkle! Tiesiog reikia sukurti tinklą su tankiu klasifikatoriumi viršuje ir apmokyti visą tinklą naudodami atgalinį sklidimą.\n" ] }, { @@ -796,13 +804,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Šis modelis atrodo kaip pilno ciklo klasifikavimo tinklas, kuris priima vaizdą ir grąžina klasę. Tačiau sudėtinga dalis yra ta, kad mes norime, jog VGG16 veiktų kaip požymių ištraukiklis, o ne būtų iš naujo apmokytas. Todėl turime **užfiksuoti konvoliucinio požymių ištraukiklio svorius**. Pirmąjį tinklo sluoksnį galime pasiekti iškviesdami `model.layers[0]`, ir mums tereikia nustatyti `trainable` savybę į `False`.\n", + "Šis modelis atrodo kaip pilnas klasifikacijos tinklas, kuris gauna paveikslėlį ir grąžina klasę. Tačiau sudėtinga tai, kad norime, jog VGG16 veiktų kaip bruožų išgavėjas ir nebūtų pereikaluojamas. Todėl reikia **užšaldyti konvoliucinio bruožų išgavėjo svorius**. Galime pasiekti pirmą tinklo sluoksnį iškviesdami `model.layers[0]`, ir tereikia nustatyti `trainable` savybę į `False`.\n", "\n", - "> **Pastaba**: Požymių ištraukiklio svorių užfiksavimas yra būtinas, nes kitaip neapmokytas klasifikatoriaus sluoksnis gali sugadinti originalius iš anksto apmokytus konvoliucinio ištraukiklio svorius.\n", + "> **Pastaba**: Bruožų išgavėjo svorių užšaldymas yra reikalingas, nes kitaip nepereinamas klasifikatoriaus sluoksnis gali sunaikinti originalius iš anksto apmokytus konvoliucinio išgavėjo svorius.\n", "\n", - "Galite pastebėti, kad nors bendras mūsų tinklo parametrų skaičius yra apie 15 milijonų, mes treniruojame tik 25 tūkst. parametrų. Visi kiti aukščiausio lygio konvoliucinių filtrų parametrai yra iš anksto apmokyti. Tai yra gerai, nes galime optimizuoti mažesnį parametrų skaičių naudodami mažesnį pavyzdžių kiekį.\n", + "Galite pastebėti, kad nors bendras tinklo parametrų skaičius yra apie 15 milijonų, mes mokome tik 25 tūkstančius parametrų. Visi kiti viršutinio lygio konvoliucinių filtrų parametrai yra iš anksto apmokyti. Tai yra gerai, nes galime tikslinti mažesnį parametrų skaičių su mažesniu pavyzdžių kiekiu.\n", "\n", - "Dabar apmokysime savo tinklą ir pažiūrėsime, kokių rezultatų galime pasiekti. Tikėkitės gana ilgo vykdymo laiko ir nesijaudinkite, jei vykdymas tam tikrą laiką atrodo sustingęs.\n" + "Dabar apmokysime mūsų tinklą ir pažiūrėsime, kaip gerai galime pasiekti rezultatus. Tikėkitės pakankamai ilgo mokymo laiko ir nesijaudinkite, jei vykdymas tam tikrą laiką atrodys sustojęs.\n" ] }, { @@ -827,11 +835,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Atrodo, kad mums pavyko sukurti gana tikslų kačių ir šunų klasifikatorių!\n", + "Atrodo, kad mums pavyko sukurti pakankamai tikslų kačių ir šunų klasifikatorių! \n", "\n", "## Modelio išsaugojimas ir įkėlimas\n", "\n", - "Kai modelis yra apmokytas, galime išsaugoti modelio architektūrą ir apmokytus svorius faile, kad galėtume naudoti ateityje:\n" + "Kai išmokome modelį, galime išsaugoti modelio architektūrą ir apmokytus svorius į failą tolimesniam naudojimui:\n" ] }, { @@ -855,7 +863,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Tada galime bet kada įkelti modelį iš failo. Tai gali būti naudinga, jei kitas eksperimentas sugadintų modelį – nereikėtų pradėti nuo nulio.\n" + "Modelį galime bet kada įkelti iš failo. Tai gali būti naudinga, jei kitas eksperimentas sugadina modelį – nereikės pradėti nuo nulio.\n" ] }, { @@ -871,15 +879,15 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Perėjimas prie mokymosi pritaikymo\n", + "## Perkėlimo mokymosi smulkus reguliavimas\n", "\n", - "Ankstesniame skyriuje mes apmokėme galutinį klasifikatoriaus sluoksnį, kad jis klasifikuotų vaizdus mūsų pačių duomenų rinkinyje. Tačiau mes nepermokėme požymių ištraukiklio, ir mūsų modelis rėmėsi požymiais, kuriuos jis išmoko iš ImageNet duomenų. Jei jūsų objektai vizualiai skiriasi nuo įprastų ImageNet vaizdų, toks požymių derinys gali neveikti geriausiai. Todėl prasminga pradėti mokyti ir konvoliucinius sluoksnius.\n", + "Ankstesniame skyriuje mes išmokėme paskutinį klasifikatoriaus sluoksnį klasifikuoti paveikslėlius mūsų duomenų rinkinyje. Tačiau mes neišmokėme iš naujo ypatybių ištraukiklio, ir mūsų modelis rėmėsi ypatybėmis, kurias modelis buvo išmokęs ImageNet duomenyse. Jeigu jūsų objektai vizualiai skiriasi nuo įprastinių ImageNet paveikslėlių, ši ypatybių kombinacija gali būti ne pati geriausia. Todėl prasminga ir pradėti mokyti konvoliucinius sluoksnius.\n", "\n", - "Norėdami tai padaryti, galime atšildyti konvoliucinių filtrų parametrus, kuriuos anksčiau buvome užšaldę.\n", + "Tam mes galime atšildyti konvoliucinių filtrų parametrus, kuriuos anksčiau užšaldėme.\n", "\n", - "> **Note:** Svarbu pirmiausia užšaldyti parametrus ir atlikti kelis mokymo epochas, kad stabilizuotumėte svorius klasifikatoriaus sluoksnyje. Jei iš karto pradėsite mokyti tinklą nuo pradžios iki pabaigos su atšildytais parametrais, didelės klaidos gali sugadinti iš anksto apmokytus svorius konvoliuciniuose sluoksniuose.\n", + "> **Pastaba:** Svarbu pirmiausia užšaldyti parametrus ir atlikti kelis mokymo epochus, kad stabilizuotumėte svorius klasifikacijos sluoksnyje. Jei iš karto pradėsite mokyti visą tinklą su atšildytais parametrais, didelės klaidos gali sunaikinti iš anksto išmoktus svorius konvoliuciniuose sluoksniuose.\n", "\n", - "Mūsų konvoliucinis VGG-16 modelis yra pirmame sluoksnyje ir pats susideda iš daugelio sluoksnių. Galime pažvelgti į jo struktūrą:\n" + "Mūsų konvoliucinis VGG-16 modelis yra pirmojo sluoksnio viduje ir jis pats susideda iš daug sluoksnių. Galime pažvelgti į jo struktūrą:\n" ] }, { @@ -948,7 +956,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Mes galime atšildyti visus konvoliucinės bazės sluoksnius:\n" + "Galime atšaldyti visas konvoliucinio pagrindo sluoksnius:\n" ] }, { @@ -964,7 +972,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Tačiau atšildyti visus iš karto nėra geriausia idėja. Pirmiausia galime atšildyti tik kelis paskutinius konvoliucijų sluoksnius, nes jie turi aukštesnio lygio šablonus, kurie yra svarbūs mūsų vaizdams. Pavyzdžiui, pradžiai galime užšaldyti visus sluoksnius, išskyrus paskutinius 4:\n" + "Tačiau vienu metu atšildyti visus sluoksnius nėra geriausia idėja. Pirmiausia galime atšildyti tik kelis paskutinius konvoliucinius sluoksnius, nes jie apima aukštesnio lygio šablonus, kurie yra svarbūs mūsų paveikslėliams. Pvz., pradžiai galime užšaldyti visus sluoksnius, išskyrus paskutinius 4:\n" ] }, { @@ -1003,11 +1011,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Atkreipkite dėmesį, kad treniruojamų parametrų skaičius žymiai padidėjo, tačiau vis tiek sudaro apie 50% visų parametrų.\n", + "Pastebėkite, kad apmokomų parametrų skaičius žymiai padidėjo, bet vis tiek sudaro maždaug 50 % visų parametrų.\n", "\n", - "Po atrakinimo galime atlikti dar kelis treniravimo epochus (mūsų pavyzdyje atliksime tik vieną). Taip pat galite pasirinkti mažesnį mokymosi greitį, kad sumažintumėte poveikį iš anksto apmokytiems svoriams. Tačiau net ir esant mažam mokymosi greičiui, galite tikėtis, kad tikslumas treniravimo pradžioje sumažės, kol galiausiai pasieks šiek tiek aukštesnį lygį nei fiksuotų svorių atveju.\n", + "Atšilus užšaldymui, galime atlikti keletą papildomų apmokymų epochų (mūsų pavyzdyje atliksime tik vieną). Taip pat galite pasirinkti mažesnį mokymosi greitį, kad sumažintumėte poveikį iš anksto apmokėtiems svoriams. Tačiau net ir su mažu mokymosi greičiu galite tikėtis, kad tikslumas sumažės apmokymo pradžioje, kol galų gale pasieks šiek tiek aukštesnį lygį nei fiksuotų svorių atveju.\n", "\n", - "> **Pastaba:** Šis treniravimas vyksta daug lėčiau, nes turime skleisti gradientus atgal per daugelį tinklo sluoksnių!\n" + "> **Pastaba:** Šis mokymas vyksta daug lėčiau, nes reikia atgal per daugelį tinklo sluoksnių skleisti gradientus!\n" ] }, { @@ -1031,9 +1039,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Mes tikriausiai pasieksime didesnį treniravimo tikslumą, nes naudojame galingesnį tinklą su daugiau parametrų, tačiau patikros tikslumas nepadidės tiek daug.\n", + "Tikėtina, kad pasieksime didesnį mokymo tikslumą, nes naudojame galingesnį tinklą su daugiau parametrų, tačiau validacijos tikslumas nepadidės tiek daug.\n", "\n", - "Drąsiai atšaldykite kelis papildomus tinklo sluoksnius ir treniruokite toliau, kad pamatytumėte, ar galite pasiekti didesnį tikslumą!\n" + "Drąsiai atšaldykite dar kelis tinklo sluoksnius ir mokykite toliau, kad pamatytumėte, ar sugebėsite pasiekti didesnį tikslumą!\n" ] }, { @@ -1042,7 +1050,7 @@ "source": [ "## Kiti kompiuterinės regos modeliai\n", "\n", - "VGG-16 yra viena iš paprasčiausių kompiuterinės regos architektūrų. Keras siūlo daug daugiau iš anksto apmokytų tinklų. Dažniausiai naudojami tarp jų yra **ResNet** architektūros, sukurtos Microsoft, ir **Inception** iš Google. Pavyzdžiui, pažvelkime į paprasčiausio ResNet-50 modelio architektūrą (ResNet yra modelių šeima su skirtingu gyliu, galite pabandyti eksperimentuoti su ResNet-152, jei norite pamatyti, kaip atrodo tikrai gilus modelis):\n" + "VGG-16 yra viena paprasčiausių kompiuterinės regos architektūrų. Keras suteikia daug daugiau iš anksto apmokytų tinklų. Dažniausiai naudojamos iš jų yra **ResNet** architektūros, sukurtos Microsoft, ir **Inception** iš Google. Pavyzdžiui, pažvelkime į paprasčiausio ResNet-50 modelio architektūrą (ResNet yra modelių šeima su skirtingu gylį, jei norite pamatyti, kaip atrodo tikrai gilus modelis, galite išbandyti ResNet-152):\n" ] }, { @@ -1444,29 +1452,29 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Kaip matote, modelis sudarytas iš tų pačių pažįstamų komponentų: konvoliucinių sluoksnių, telkimo sluoksnių ir galutinio tankaus klasifikatoriaus. Šį modelį galime naudoti lygiai taip pat, kaip naudojome VGG-16 perkėlimo mokymuisi. Galite eksperimentuoti su aukščiau pateiktu kodu, naudodami skirtingus ResNet modelius kaip bazinį modelį, ir stebėti, kaip keičiasi tikslumas.\n", + "Kaip matote, modelyje yra tie patys pažįstami blokai: konvoliuciniai sluoksniai, sutraukimo sluoksniai ir galutinis tankus klasifikatorius. Šią modelį galima naudoti visiškai taip pat, kaip naudojome VGG-16 perdavimui mokytis. Galite pabandyti eksperimentuoti su aukščiau pateiktu kodu, naudodami skirtingus ResNet modelius kaip bazinį modelį ir stebėti, kaip keičiasi tikslumas.\n", "\n", - "## Partijų normalizavimas\n", + "## Papildomas normalizavimas per partiją\n", "\n", - "Šiame tinkle yra dar vienas sluoksnio tipas: **Partijų normalizavimas**. Partijų normalizavimo idėja yra sureguliuoti reikšmes, kurios keliauja per neuroninį tinklą, į tinkamą intervalą. Paprastai neuroniniai tinklai veikia geriausiai, kai visos reikšmės yra intervale [-1,1] arba [0,1], todėl mes atitinkamai masteliuojame/normalizuojame įvesties duomenis. Tačiau mokant gilų tinklą gali nutikti taip, kad reikšmės smarkiai išeina už šio intervalo ribų, o tai apsunkina mokymą. Partijų normalizavimo sluoksnis apskaičiuoja dabartinės mini partijos vidurkį ir standartinį nuokrypį ir naudoja juos signalui normalizuoti prieš perduodant jį per neuroninio tinklo sluoksnį. Tai žymiai pagerina giliųjų tinklų stabilumą.\n" + "Šiame tinkle yra dar vienas sluoksnio tipas: **partijos normalizavimas**. Partijos normalizavimo idėja yra pritaikyti reikšmes, kurios teka per neuroninį tinklą, tinkamam intervalui. Paprastai neuroniniai tinklai geriausiai veikdavo, kai visos reikšmės buvo intervale [-1,1] arba [0,1], todėl mes atitinkamai mastome/normalizuojame įvesties duomenis. Tačiau giliosios mokymosi tinklo mokymo metu gali nutikti, kad reikšmės ženkliai išeina už šio intervalo ribų, kas apsunkina mokymąsi. Partijos normalizavimo sluoksnis apskaičiuoja vidurkį ir standartinį nuokrypį visoms dabartinės minibaterijos reikšmėms ir naudoja juos signalo normalizavimui prieš perduodant jį per neuroninio tinklo sluoksnį. Tai žymiai pagerina giliųjų tinklų stabilumą.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Pagrindinė mintis\n", + "## Apibendrinimas\n", "\n", - "Naudodami perkėlimo mokymąsi, mes greitai sukūrėme klasifikatorių mūsų individualiai objektų klasifikavimo užduočiai ir pasiekėme aukštą tikslumą. Tačiau šis pavyzdys nebuvo visiškai sąžiningas, nes originalus VGG-16 tinklas buvo iš anksto apmokytas atpažinti kates ir šunis, todėl mes tiesiog pakartotinai panaudojome daugumą jau esančių tinklo šablonų. Galite tikėtis mažesnio tikslumo, kai dirbama su egzotiškesniais, specifiniais objektais, pavyzdžiui, gamyklos gamybos linijos detalėmis ar skirtingais medžių lapais.\n", + "Naudodami perkeliamąjį mokymą, galėjome greitai sukurti klasifikatorių mūsų pasirinktam objektų klasifikavimo uždaviniui ir pasiekti aukštą tikslumą. Tačiau šis pavyzdys nebuvo visiškai sąžiningas, nes originalus VGG-16 tinklas buvo iš anksto apmokytas atpažinti kates ir šunis, todėl mes tiesiog pakartotinai panaudojome daugumą šiame tinkle jau esančių modelių. Galite tikėtis mažesnio tikslumo su egzotiškesniais, specifiniais domeno objektais, pavyzdžiui, gamybos linijos detalėmis gamykloje ar skirtingų medžių lapais.\n", "\n", - "Galite pastebėti, kad sudėtingesnėms užduotims, kurias dabar sprendžiame, reikia didesnės skaičiavimo galios ir jos negali būti lengvai išspręstos naudojant tik CPU. Kitoje dalyje bandysime naudoti lengvesnę įgyvendinimo versiją, kad apmokytume tą patį modelį su mažesniais skaičiavimo resursais, o tai duos tik šiek tiek mažesnį tikslumą.\n" + "Matote, kad sudėtingesni uždaviniai, kuriuos dabar sprendžiame, reikalauja didesnio skaičiavimo pajėgumo ir jų negalima lengvai išspręsti tik naudojant CPU. Kitame skyriuje mes bandysime naudoti lengvesnę įgyvendinimo versiją tam pačiam modeliui apmokyti su mažesnėmis skaičiavimo ištekliais, kas duos tik šiek tiek mažesnį tikslumą.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**Atsakomybės apribojimas**: \nŠis dokumentas buvo išverstas naudojant dirbtinio intelekto vertimo paslaugą [Co-op Translator](https://github.com/Azure/co-op-translator). Nors siekiame tikslumo, atkreipkite dėmesį, kad automatiniai vertimai gali turėti klaidų ar netikslumų. Originalus dokumentas jo gimtąja kalba turėtų būti laikomas autoritetingu šaltiniu. Kritinei informacijai rekomenduojama naudoti profesionalų žmogaus vertimą. Mes neprisiimame atsakomybės už nesusipratimus ar klaidingus aiškinimus, kylančius dėl šio vertimo naudojimo.\n" + "---\n\n\n**Atsakomybės apribojimas**:\nŠis dokumentas buvo išverstas naudojant dirbtinio intelekto vertimo paslaugą [Co-op Translator](https://github.com/Azure/co-op-translator). Nors siekiame tikslumo, prašome atkreipti dėmesį, kad automatiniai vertimai gali turėti klaidų ar netikslumų. Originalus dokumentas jo gimtąja kalba laikomas autoritetingu šaltiniu. Svarbiai informacijai rekomenduojama naudoti profesionalų žmogiškąjį vertimą. Mes neatsakome už jokius nesusipratimus ar neteisingą interpretaciją, kilusią naudojantis šiuo vertimu.\n\n" ] } ], @@ -1487,12 +1495,6 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" - }, - "coopTranslator": { - "original_hash": "c189abc107848f96051085cc30945129", - "translation_date": "2025-08-31T12:46:44+00:00", - "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", - "language_code": "lt" } }, "nbformat": 4, diff --git a/translations/lt/lessons/5-NLP/README.md b/translations/lt/lessons/5-NLP/README.md index e4d8afa843..4649482fb7 100644 --- a/translations/lt/lessons/5-NLP/README.md +++ b/translations/lt/lessons/5-NLP/README.md @@ -1,51 +1,51 @@ # Natūralios kalbos apdorojimas -![NLP užduočių santrauka piešinyje](../../../../translated_images/lt/ai-nlp.b22dcb8ca4707cea.webp) +![Santrauka apie NLP užduotis vaizduojanti piešinuką](../../../../translated_images/lt/ai-nlp.b22dcb8ca4707cea.webp) -Šiame skyriuje mes sutelksime dėmesį į neuroninių tinklų naudojimą užduotims, susijusioms su **natūralios kalbos apdorojimu (NLP)**. Yra daugybė NLP problemų, kurias norime, kad kompiuteriai galėtų išspręsti: +Šioje dalyje mes susitelksime į neuroninių tinklų naudojimą užduotims, susijusioms su **natūralios kalbos apdorojimu (NLP)**. Yra daug NLP problemų, kurias norime, kad kompiuteriai galėtų spręsti: -* **Teksto klasifikavimas** yra tipiška klasifikavimo problema, susijusi su teksto sekų analizavimu. Pavyzdžiai apima el. laiškų klasifikavimą kaip šlamštą ar ne šlamštą arba straipsnių kategorijų nustatymą, pvz., sportas, verslas, politika ir kt. Taip pat, kuriant pokalbių robotus, dažnai reikia suprasti, ką vartotojas norėjo pasakyti – šiuo atveju susiduriame su **ketinimų klasifikavimu**. Ketinimų klasifikavime dažnai reikia dirbti su daugybe kategorijų. -* **Nuotaikos analizė** yra tipiška regresijos problema, kurioje reikia priskirti skaičių (nuotaiką), atitinkantį, kiek teigiamas/neigiamas yra sakinio prasmė. Pažangesnė nuotaikos analizės versija yra **nuotaikos analizė pagal aspektus** (ABSA), kur nuotaika priskiriama ne visam sakiniui, o skirtingoms jo dalims (aspektams), pvz., *Šiame restorane man patiko virtuvė, bet atmosfera buvo siaubinga*. -* **Pavadintų objektų atpažinimas** (NER) reiškia problemą, kai reikia išgauti tam tikrus objektus iš teksto. Pavyzdžiui, frazėje *Man reikia skristi į Paryžių rytoj* žodis *rytoj* reiškia DATĄ, o *Paryžius* yra VIETA. -* **Raktinių žodžių išgavimas** yra panašus į NER, tačiau reikia automatiškai išgauti žodžius, svarbius sakinio prasmei, be išankstinio mokymo konkretiems objektų tipams. -* **Teksto grupavimas** gali būti naudingas, kai norime sugrupuoti panašius sakinius, pavyzdžiui, panašius prašymus techninės pagalbos pokalbiuose. -* **Klausimų atsakymas** reiškia modelio gebėjimą atsakyti į konkretų klausimą. Modelis gauna teksto ištrauką ir klausimą kaip įvestį, o jam reikia pateikti vietą tekste, kur yra atsakymas į klausimą (arba kartais sugeneruoti atsakymo tekstą). -* **Teksto generavimas** yra modelio gebėjimas generuoti naują tekstą. Tai galima laikyti klasifikavimo užduotimi, kurioje prognozuojamas kitas raidė/žodis pagal tam tikrą *teksto užuominą*. Pažangūs teksto generavimo modeliai, tokie kaip GPT-3, gali spręsti kitas NLP užduotis, pvz., klasifikavimą, naudojant techniką, vadinamą [užuominų programavimu](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) arba [užuominų inžinerija](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29). -* **Teksto santrauka** yra technika, kai norime, kad kompiuteris "perskaitytų" ilgą tekstą ir apibendrintų jį keliomis sakiniais. -* **Mašininis vertimas** gali būti laikomas teksto supratimo viena kalba ir teksto generavimo kita kalba deriniu. +* **Teksto klasifikacija** yra tipinė klasifikacijos problema, susijusi su tekstinių sekų klasifikavimu. Pavyzdžiai apima el. laiškų žymėjimą kaip šlamštas ir ne šlamštas, ar straipsnių kategorijavimą į sportą, verslą, politiką ir pan. Taip pat, kuriant pokalbių robotus, dažnai reikia suprasti, ką vartotojas norėjo pasakyti – tokiu atveju mes sprendžiame **ketinimų klasifikavimo** užduotį. Dažnai ketinimų klasifikacijoje tenka dirbti su daugeliu kategorijų. +* **Nuotaikos analizė** yra tipinė regresijos užduotis, kur reikia priskirti skaičių (nuotaiką), atitinkančią, kiek teigiama ar neigiama sakinio reikšmė. Išplėstinė nuotaikos analizės versija yra **aspektinė nuotaikos analizė** (ABSA), kur nuotaika priskiriama ne visam sakiniui, o skirtingoms jo dalims (aspektams), pvz. *Šiame restorane man patiko virtuvė, bet atmosfera buvo baisi*. +* **Vardinių vienetų atpažinimas** (NER) reiškia problemą iš teksto išskirti tam tikrus vienetus. Pavyzdžiui, turime suprasti, kad frazėje *Man reikia rytoj nuskristi į Paryžių* žodis *rytoj* reiškia DATĄ, o *Paryžius* yra VIETA. +* **Raktinių žodžių išskyrimas** yra panašus į NER, tačiau reikia automatiškai išskirti svarbius žodžius sakinio reikšmei be išankstinio apmokymo pagal konkrečius vienetų tipus. +* **Teksto grupavimas** gali būti naudingas, kai norime suskirstyti panašius sakinius į grupes, pavyzdžiui, panašius užklausimus techninės pagalbos pokalbiuose. +* **Klausimų atsakymas** reiškia modelio gebėjimą atsakyti į konkretų klausimą. Modelis gauna teksto ištrauką ir klausimą kaip įvestį ir turi pateikti vietą tekste, kur randamas atsakymas (arba kartais sugeneruoti atsakymo tekstą). +* **Teksto generavimas** yra modelio gebėjimas kurti naują tekstą. Tai galima laikyti klasifikacijos užduotimi, kuri pagal tam tikrą *teksto užuominą* prognozuoja kitą raidę/žodį. Pažangūs teksto generavimo modeliai, tokie kaip GPT-3, gali spręsti kitas NLP užduotis, tokias kaip klasifikacija, naudodami vadinamąją [užuominos programavimą](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) ar [užuominos inžineriją](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29) +* **Teksto santrauka** yra technika, kai norime, kad kompiuteris „perskaitytų“ ilgą tekstą ir apibendrintų jį keliomis sakiniais. +* **Mašinų vertimas** gali būti laikomas teksto supratimo vienoje kalboje ir teksto generavimo kitoje kalboje deriniu. -Iš pradžių dauguma NLP užduočių buvo sprendžiamos naudojant tradicinius metodus, tokius kaip gramatikos. Pavyzdžiui, mašininiame vertime buvo naudojami analizatoriai, kad pradinė frazė būtų paversta sintaksės medžiu, tada buvo išgaunamos aukštesnio lygio semantinės struktūros, kad būtų atspindėta sakinio prasmė, ir remiantis šia prasme bei tikslinės kalbos gramatika buvo generuojamas rezultatas. Šiandien daugelis NLP užduočių efektyviau sprendžiamos naudojant neuroninius tinklus. +Iš pradžių daugumą NLP užduočių spręsdavo tradiciniais metodais, tokiais kaip gramatikos taisyklės. Pavyzdžiui, mašininiame vertime naudoti analizatoriai (parseriai), kurie pradines sakinių struktūras paversdavo sintaksinėmis medžio struktūromis, tuomet išgavus aukštesnio lygio semantines struktūras atstovauti sakinio prasmę, ir remiantis šia prasme bei tikslinės kalbos gramatika sugeneruoti rezultatą. Šiandien daug NLP užduočių efektyviau sprendžiama naudojant neuroninius tinklus. -> Daugelis klasikinių NLP metodų yra įgyvendinti [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org) Python bibliotekoje. Internete yra puiki [NLTK knyga](https://www.nltk.org/book/), kurioje aptariama, kaip skirtingos NLP užduotys gali būti sprendžiamos naudojant NLTK. +> Daugelis klasikinių NLP metodų yra įgyvendinti [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org) Python bibliotekoje. Yra puiki [NLTK Knyga](https://www.nltk.org/book/), prieinama internete, kurioje aptariama, kaip skirtingas NLP užduotis galima spręsti naudojant NLTK. -Mūsų kurse mes daugiausia dėmesio skirsime neuroninių tinklų naudojimui NLP, o NLTK naudosime, kai to reikės. +Mūsų kurse daugiausia dėmesio skirsime neuroniniams tinklams NLP srityje ir naudosime NLTK, kai to reikės. -Mes jau išmokome naudoti neuroninius tinklus darbui su lenteliniais duomenimis ir vaizdais. Pagrindinis skirtumas tarp šių duomenų tipų ir teksto yra tas, kad tekstas yra kintamo ilgio seka, o vaizdų atveju įvesties dydis yra žinomas iš anksto. Nors konvoliuciniai tinklai gali išgauti šablonus iš įvesties duomenų, šablonai tekste yra sudėtingesni. Pvz., neigimas gali būti atskirtas nuo subjekto daugybe žodžių (pvz., *Man nepatinka apelsinai* vs. *Man nepatinka tie dideli spalvingi skanūs apelsinai*), ir tai vis tiek turėtų būti interpretuojama kaip vienas šablonas. Todėl, norint apdoroti kalbą, reikia įvesti naujus neuroninių tinklų tipus, tokius kaip *rekurentiniai tinklai* ir *transformeriai*. +Jau esame išmokę naudoti neuroninius tinklus darbui su lenteliniu duomenimis ir vaizdais. Pagrindinis skirtumas tarp tokių duomenų ir teksto yra tas, kad tekstas yra kintamo ilgio seka, o įvesties dydis vaizdų atveju yra iš anksto žinomas. Nors konvoliuciniai tinklai gali išgauti modelius iš įvesties duomenų, teksto modeliai yra sudėtingesni. Pvz., neigimo žodžiai gali būti atskirti nuo veiksnio žodžio daugybe žodžių (pvz., *Man nepatinka apelsinai* ir *Man nepatinka tie dideli spalvingi skanūs apelsinai*), tačiau tai vis tiek turėtų būti interpretuojama kaip vienas modelis. Todėl kalbos apdorojimui reikia naudoti naujas neuroninių tinklų rūšis, tokias kaip *rekursiniai tinklai* ir *transformeriai*. ## Bibliotekų įdiegimas -Jei naudojate vietinę Python instaliaciją šiam kursui vykdyti, jums gali prireikti įdiegti visas reikalingas NLP bibliotekas naudojant šias komandas: +Jei naudojate vietinę Python instaliaciją šiam kursui vykdyti, jums gali prireikti įdiegti visas reikalingas NLP bibliotekas naudodami šias komandas: -**PyTorch** +**PyTorch atveju** ```bash -pip install -r requirements-torch.txt +pip install -r requirements-pytorch.txt ``` -**TensorFlow** +**TensorFlow atveju** ```bash pip install -r requirements-tf.txt ``` > NLP su TensorFlow galite išbandyti [Microsoft Learn](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste) -## GPU Įspėjimas +## Įspėjimas dėl GPU -Šiame skyriuje kai kuriuose pavyzdžiuose mes treniruosime gana didelius modelius. -* **Naudokite kompiuterį su GPU**: Patartina vykdyti savo užrašų knygeles kompiuteryje su GPU, kad sumažintumėte laukimo laiką dirbant su dideliais modeliais. -* **GPU atminties apribojimai**: Naudojant GPU gali kilti situacijų, kai pritrūksta GPU atminties, ypač treniruojant didelius modelius. -* **GPU atminties naudojimas**: GPU atminties kiekis, sunaudojamas treniruotės metu, priklauso nuo įvairių veiksnių, įskaitant mini paketų dydį. -* **Mažinkite mini paketų dydį**: Jei susiduriate su GPU atminties problemomis, apsvarstykite galimybę sumažinti mini paketų dydį savo kode kaip galimą sprendimą. -* **TensorFlow GPU atminties išlaisvinimas**: Senesnės TensorFlow versijos gali neteisingai išlaisvinti GPU atmintį, kai treniruojami keli modeliai viename Python branduolyje. Norėdami efektyviai valdyti GPU atminties naudojimą, galite sukonfigūruoti TensorFlow, kad GPU atmintis būtų paskirstoma tik tada, kai to reikia. -* **Kodo įtraukimas**: Norėdami nustatyti TensorFlow, kad GPU atmintis būtų paskirstoma tik tada, kai to reikia, įtraukite šį kodą į savo užrašų knygeles: +Šioje dalyje kai kuriuose pavyzdžiuose mokysime gana didelius modelius. +* **Naudokite kompiuterį su GPU**: patartina paleisti savo užrašų knygutes (notebook) kompiuteryje su GPU, kad sumažintumėte laukimo laiką dirbant su dideliais modeliais. +* **GPU atminties apribojimai**: dirbant su GPU gali atsirasti atvejų, kai pritrūksta GPU atminties, ypač treniruojant didelius modelius. +* **GPU atminties naudojimas**: GPU atminties sunaudojimas treniruočių metu priklauso nuo daugelio veiksnių, įskaitant mini paketo dydį. +* **Sumažinkite mini paketo dydį**: jei kyla GPU atminties problemų, apsvarstykite mini paketo dydžio sumažinimą savo kode kaip galimą sprendimą. +* **TensorFlow GPU atminties išlaisvinimas**: senesnės TensorFlow versijos gali neteisingai išlaisvinti GPU atmintį treniruojant kelis modelius viename Python branduolyje. Norint efektyviai valdyti GPU atminties naudojimą, galite sukonfigūruoti TensorFlow taip, kad GPU atmintis būtų rezervuojama tik būtiniausiais atvejais. +* **Kodo įtraukimas**: norint, kad TensorFlow GPU atmintį pritrauktų tik augant poreikiui, įtraukite šį kodą į savo užrašų knygutes: ```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) ``` -Jei jus domina NLP mokymasis iš klasikinės ML perspektyvos, apsilankykite [šiame pamokų rinkinyje](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP). +Jei jus domina NLP mokymasis iš klasikinio ML požiūrio, apsilankykite [šiame pamokų rinkinyje](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP) -## Šiame skyriuje -Šiame skyriuje mes išmoksime: +## Šioje dalyje +Šioje dalyje mes sužinosime apie: -* [Teksto atvaizdavimas kaip tensoriai](13-TextRep/README.md) -* [Žodžių įterpimai](14-Emdeddings/README.md) -* [Kalbos modeliavimas](15-LanguageModeling/README.md) -* [Rekurentiniai neuroniniai tinklai](16-RNN/README.md) -* [Generatyviniai tinklai](17-GenerativeNetworks/README.md) -* [Transformeriai](18-Transformers/README.md) +* [Teksto vaizdavimą tensoriais](13-TextRep/README.md) +* [Žodžių įterpimus](14-Emdeddings/README.md) +* [Kalbos modeliavimą](15-LanguageModeling/README.md) +* [Rekursinius neuroninius tinklus](16-RNN/README.md) +* [Generatyvinius tinklus](17-GenerativeNetworks/README.md) +* [Transformerius](18-Transformers/README.md) --- -**Atsakomybės apribojimas**: -Šis dokumentas buvo išverstas naudojant AI vertimo paslaugą [Co-op Translator](https://github.com/Azure/co-op-translator). Nors siekiame tikslumo, prašome atkreipti dėmesį, kad automatiniai vertimai gali turėti klaidų ar netikslumų. Originalus dokumentas jo gimtąja kalba turėtų būti laikomas autoritetingu šaltiniu. Kritinei informacijai rekomenduojama naudoti profesionalų žmogaus vertimą. Mes neprisiimame atsakomybės už nesusipratimus ar klaidingus interpretavimus, atsiradusius dėl šio vertimo naudojimo. \ No newline at end of file + +**Atsakomybės apribojimas**: +Šis dokumentas buvo išverstas naudojant dirbtinio intelekto vertimo paslaugą [Co-op Translator](https://github.com/Azure/co-op-translator). Nors siekiame tikslumo, prašome atkreipti dėmesį, kad automatiniai vertimai gali turėti klaidų ar netikslumų. Originalus dokumentas jo gimtąja kalba laikomas autoritetingu šaltiniu. Svarbiai informacijai rekomenduojama naudoti profesionalų žmogiškąjį vertimą. Mes neatsakome už jokius nesusipratimus ar neteisingą interpretaciją, kilusią naudojantis šiuo vertimu. + \ No newline at end of file diff --git a/translations/ml/.co-op-translator.json b/translations/ml/.co-op-translator.json index 6bd8728b0d..2d9c69e89b 100644 --- a/translations/ml/.co-op-translator.json +++ b/translations/ml/.co-op-translator.json @@ -1,10 +1,16 @@ { "AGENTS.md": { "original_hash": "6b11a37115944252ab3ed04e358d830d", - "translation_date": "2025-11-25T19:53:59+00:00", + "translation_date": "2026-07-08T20:28:27+00:00", "source_file": "AGENTS.md", "language_code": "ml" }, + "CONTRIBUTING.md": { + "original_hash": "c6fd7e781b67111a90abd166d0ce4aa0", + "translation_date": "2026-07-08T20:51:15+00:00", + "source_file": "CONTRIBUTING.md", + "language_code": "ml" + }, "README.md": { "original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b", "translation_date": "2026-04-06T16:54:02+00:00", @@ -17,6 +23,19 @@ "source_file": "SECURITY.md", "language_code": "ml" }, + "__translation_failures__": { + "lessons/sketchnotes/LICENSE.md": { + "original_hash": "45ab63a2cd8f5faef6c9b150618837a4", + "source_file": "lessons/sketchnotes/LICENSE.md", + "language_code": "ml", + "failure_date": "2026-07-08T20:34: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-11-25T20:22:23+00:00", @@ -54,8 +73,8 @@ "language_code": "ml" }, "examples/README.md": { - "original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7", - "translation_date": "2025-11-25T20:34:04+00:00", + "original_hash": "7883d52c2e2a221e0b07a7b112a149b9", + "translation_date": "2026-07-08T20:28:49+00:00", "source_file": "examples/README.md", "language_code": "ml" }, @@ -66,8 +85,8 @@ "language_code": "ml" }, "lessons/0-course-setup/how-to-run.md": { - "original_hash": "a4717bd9103b9f6cd84d534b83534689", - "translation_date": "2026-01-17T02:14:15+00:00", + "original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1", + "translation_date": "2026-07-08T20:29:14+00:00", "source_file": "lessons/0-course-setup/how-to-run.md", "language_code": "ml" }, @@ -191,6 +210,12 @@ "source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md", "language_code": "ml" }, + "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": { + "original_hash": "99b816b6a4957ef4100cee4c4221dff9", + "translation_date": "2026-07-08T20:23:12+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", + "language_code": "ml" + }, "lessons/4-ComputerVision/08-TransferLearning/lab/README.md": { "original_hash": "7765935c35fcee69b9fe2d0cfd6963e2", "translation_date": "2025-11-25T22:43:57+00:00", @@ -330,8 +355,8 @@ "language_code": "ml" }, "lessons/5-NLP/README.md": { - "original_hash": "8ef02a9318257ea140ed3ed74442096d", - "translation_date": "2025-11-25T21:14:29+00:00", + "original_hash": "038df6f1a73e49f6430740da083bfd6d", + "translation_date": "2026-07-08T20:29:51+00:00", "source_file": "lessons/5-NLP/README.md", "language_code": "ml" }, diff --git a/translations/ml/AGENTS.md b/translations/ml/AGENTS.md index 896cb217dc..19ef2303fa 100644 --- a/translations/ml/AGENTS.md +++ b/translations/ml/AGENTS.md @@ -1,141 +1,136 @@ # AGENTS.md -## പ്രോജക്ട് അവലോകനം +## പദ്ധതിയുടെ അവലോകനം -AI for Beginners ഒരു സമഗ്രമായ 12 ആഴ്ച, 24 പാഠങ്ങളുള്ള പാഠ്യപദ്ധതിയാണ്, ഇത് കൃത്രിമ ബുദ്ധിമുട്ടിന്റെ അടിസ്ഥാനങ്ങൾ ഉൾക്കൊള്ളുന്നു. ഈ വിദ്യാഭ്യാസ സംഭരണം പ്രായോഗിക പാഠങ്ങൾ Jupyter Notebooks ഉപയോഗിച്ച്, ക്വിസുകൾ, ഹാൻഡ്‌സ്-ഓൺ ലാബുകൾ എന്നിവ ഉൾക്കൊള്ളുന്നു. പാഠ്യപദ്ധതി ഉൾക്കൊള്ളുന്നത്: +കൃത്രിമ ബുദ്ധിമുട്ടിന്റെ അടിസ്ഥാനതത്വങ്ങളെ ഉൾക്കൊള്ളുന്ന സമഗ്രമായ 12 ആഴ്ച, 24 പാഠപദ്ധതിയായ AI for Beginners. Jupyter നോട്ട്ബുക്കുകൾ, ക്വിസ്, ഹാൻഡ്‌സോൺ ലാബുകൾ എന്നിവ ഉപയോഗിച്ച് പ്രായോഗിക പാഠങ്ങൾ ഉൾക്കൊള്ളുന്ന ഈ വിദ്യാഭ്യാസ റീപ്പോസിറ്ററി. പാഠപദ്ധതി ഉൾക്കൊള്ളുന്നു: -- നിഘണ്ടു പ്രതിനിധാനം, വിദഗ്ധ സിസ്റ്റങ്ങൾ എന്നിവയുള്ള സിംബോളിക് AI -- TensorFlow, PyTorch ഉപയോഗിച്ചുള്ള ന്യൂറൽ നെറ്റ്‌വർക്കുകളും ഡീപ്പ് ലേണിംഗും -- കമ്പ്യൂട്ടർ വിഷൻ സാങ്കേതിക വിദ്യകളും ആർക്കിടെക്ചറുകളും -- ട്രാൻസ്ഫോർമറുകളും BERT ഉൾപ്പെടെയുള്ള നാചുറൽ ലാംഗ്വേജ് പ്രോസസ്സിംഗ് (NLP) -- പ്രത്യേക വിഷയങ്ങൾ: ജെനറ്റിക് ആൽഗോരിതങ്ങൾ, റീ ഇൻഫോഴ്‌സ്‌മെന്റ് ലേണിംഗ്, മൾട്ടി-ഏജന്റ് സിസ്റ്റങ്ങൾ -- AI നൈതികതയും ഉത്തരവാദിത്വമുള്ള AI സിദ്ധാന്തങ്ങളും +- കൃത്യമായ ബുദ്ധിമുട്ട് (Symbolic AI) ന知识 പ്രതിനിധീകരണവും വിദഗ്ധ സമ്പ്രദായങ്ങളും +- TensorFlow ഉം PyTorch ഉം ഉപയോഗിച്ച് നറുകപ്പെട്ട നെറ്റ്‌വർക്കുകളും ഡീപ് ലേർണിങ്ങും +- കമ്പ്യൂട്ടർ വിഷ്വൽ സാങ്കേതിക വിദ്യകളും ഘടനകളും +- ട്രാൻസ്ഫോർമറുകളും BERT ഉം ഉൾപ്പെടുന്ന പ്രകൃതി ഭാഷാ പ്രോസസ്സിംഗ് (NLP) +- പ്രത്യേക വിഷയങ്ങൾ: ജനിതക ആൽഗോരിതങ്ങൾ, ശക്തീകരണ പഠനം, മൾട്ടി-എജന്റ് സംവിധാനങ്ങൾ +- AI എഥിക്സ്, ഉത്തരവാദിത്വമുള്ള AI സിദ്ധാന്തങ്ങൾ -**പ്രധാന സാങ്കേതികവിദ്യകൾ:** Python 3, Jupyter Notebooks, TensorFlow, PyTorch, Keras, OpenCV, Vue.js (ക്വിസ് ആപ്പിനായി) +**പ്രധാന സാങ്കേതികവിദ്യകൾ:** Python 3, Jupyter നോട്ട്ബുക്കുകൾ, TensorFlow, PyTorch, Keras, OpenCV, Vue.js (ക്വിസ് ആപ്പിന്) -**ആർക്കിടെക്ചർ:** വിഷയപ്രകാരം ക്രമീകരിച്ച Jupyter Notebooks ഉള്ള വിദ്യാഭ്യാസ ഉള്ളടക്ക സംഭരണം, Vue.js അടിസ്ഥാനമാക്കിയുള്ള ക്വിസ് ആപ്പ്, വ്യാപകമായ ബഹുഭാഷാ പിന്തുണ. +**ഘടന:** വിഷയംപ്രകാരം ക്രമീകരിച്ച Jupyter നോട്ട്ബുക്കുകളുള്ള വിദ്യാഭ്യാസ ഉള്ളടക്ക റീപ്പോസിറ്ററി, Vue.js അടിസ്ഥാനത്തിലുള്ള ക്വിസ് ആപ്പ്, വ്യാപകമായ ബഹുഭാഷാ പിന്തുണ. -## സെറ്റപ്പ് കമാൻഡുകൾ +## സജ്ജീകരണ കമാൻഡുകൾ -### പ്രാഥമിക ഡെവലപ്പ്മെന്റ് പരിസ്ഥിതി (Python/Jupyter) +### പ്രാഥമിക വികസന പരിപ്രേക്ഷ്യം (Python/Jupyter) -പാഠ്യപദ്ധതി Python, Jupyter Notebooks ഉപയോഗിച്ച് പ്രവർത്തിക്കാൻ രൂപകൽപ്പന ചെയ്തതാണ്. ശുപാർശ ചെയ്യുന്നത് miniconda ഉപയോഗിക്കുകയാണ്: +പാഠപദ്ധതി Python ഉം Jupyter നോട്ട്ബുക്കുകളും ഉപയോഗിച്ച് പ്രവർത്തിക്കുന്നതിനു രൂപകല്‍പ്പന ചെയ്‌തതാണ്. miniconda ഉപയോഗിക്കുക എന്നതാണ് ശിപാർശ ചെയ്യപ്പെട്ട രീതിയ۔ ```bash # റിപ്പോസിറ്ററി ക്ലോൺ ചെയ്യുക git clone https://github.com/microsoft/ai-for-beginners cd ai-for-beginners -# കോൺഡാ എൻവയോൺമെന്റ് സൃഷ്ടിച്ച് സജീവമാക്കുക +# കൊണ്ടാ എൻവയോൺമെന്റ് സൃഷ്ടിച്ച് സജീവമാക്കുക conda env create --name ai4beg --file environment.yml conda activate ai4beg -# ജൂപ്പിറ്റർ നോട്ട്‌ബുക്ക് ആരംഭിക്കുക +# Jupyter നോട്ട്‌ബുക്ക് തുടങ്ങുക jupyter notebook # അല്ലെങ്കിൽ jupyter lab ``` - -### ബദൽ: devcontainer ഉപയോഗിക്കൽ +### विकल्प: devcontainer ഉപയോഗിക്കൽ ```bash -# VS കോഡിൽ തുറന്ന് പ്രോംപ്റ്റ് വന്നപ്പോൾ "കണ്ടെയ്‌നറിൽ വീണ്ടും തുറക്കുക" തിരഞ്ഞെടുക്കുക -# ഡെവ്കണ്ടെയ്‌നർ സ്വയം പരിസ്ഥിതി സജ്ജമാക്കും +# VS കോഡിൽ തുറന്ന് പ്രാപ്തനായപ്പോൾ "കൺറ്റെയിനറിൽ പുനർവിടുക" തെരഞ്ഞെടുക്കുക +# ഡെവ്കൺറ്റെയ്നർ സ്വയം പരിസ്ഥിതി സജ്ജമാക്കും ``` +### ക്വിസ് ആപ്പ് സജ്ജീകരണം -### ക്വിസ് ആപ്പ് സെറ്റപ്പ് - -ക്വിസ് ആപ്പ് ഒരു വേർതിരിച്ച Vue.js ആപ്പാണ്, സ്ഥിതിചെയ്യുന്നത് `etc/quiz-app/` എന്ന ഫോൾഡറിൽ: +ക്വിസ് ആപ്പ് സ്വതന്ത്രമായ Vue.js ആപ്പാണ്, `etc/quiz-app/` ൽ സ്ഥിതിചെയ്യുന്നു: ```bash cd etc/quiz-app npm install -npm run serve # വികസന സെർവർ -npm run build # ഉത്പാദന ബിൽഡ് -npm run lint # ലിന്റ് ചെയ്ത് ഫയലുകൾ ശരിയാക്കുക +npm run serve # വികസന സർവർ +npm run build # ഉത്പാദന നിർമ്മാണം +npm run lint # ലിന്റും ഫയലുകൾ ശരിയാക്കുക ``` +## വികസനം വർക്ക്‌ഫ്ലോ -## ഡെവലപ്പ്മെന്റ് പ്രവൃത്തി പ്രവാഹം - -### Jupyter Notebooks ഉപയോഗിച്ച് ജോലി ചെയ്യൽ +### Jupyter നോട്ട്ബുക്കുകളുമായി ജോലി ചെയ്യുക -1. **ലോകൽ ഡെവലപ്പ്മെന്റ്:** +1. **ലോകൽ വികസനം:** - conda പരിസ്ഥിതി സജീവമാക്കുക: `conda activate ai4beg` - Jupyter ആരംഭിക്കുക: `jupyter notebook` അല്ലെങ്കിൽ `jupyter lab` - - പാഠം ഫോൾഡറുകളിലേക്ക് പോകുക, `.ipynb` ഫയലുകൾ തുറക്കുക + - പാഠ ഫോൾഡറുകളിലേക്ക് നീങ്ങുക, `.ipynb` ഫയലുകൾ തുറക്കുക - പാഠങ്ങൾ പിന്തുടരാൻ സെല്ലുകൾ ഇന്ററാക്ടീവായി പ്രവർത്തിപ്പിക്കുക -2. **Python എക്സ്റ്റൻഷൻ ഉപയോഗിച്ച് VS Code:** - - റിപോസിറ്ററി VS Code-ൽ തുറക്കുക +2. **Python എക്സ്റ്റൻഷൻ ഉള്ള VS Code:** + - റീപ്പോസിറ്ററി VS Code ൽ തുറക്കുക - Python എക്സ്റ്റൻഷൻ ഇൻസ്റ്റാൾ ചെയ്യുക - - VS Code സ്വയം conda പരിസ്ഥിതിയെ കണ്ടെത്തി ഉപയോഗിക്കും - - `.ipynb` ഫയലുകൾ നേരിട്ട് VS Code-ൽ തുറക്കുക + - VS Code സ്വയം conda പരിസ്ഥിതിയെ കണ്ടെത്തുകയും ഉപയോഗിക്കുകയും ചെയ്യും + - `.ipynb` ഫയലുകൾ നേരിട്ട് VS Code ൽ തുറക്കുക -3. **ക്ലൗഡ് ഡെവലപ്പ്മെന്റ്:** +3. **ക്ലൗഡ് വികസനം:** - **GitHub Codespaces:** "Code" → "Codespaces" → "Create codespace on main" ക്ലിക്ക് ചെയ്യുക - - **Binder:** README-യിലെ Binder ബാഡ്ജ് ഉപയോഗിച്ച് ബ്രൗസറിൽ ആരംഭിക്കുക - - ശ്രദ്ധിക്കുക: Binder-ന് പരിമിതമായ റിസോഴ്‌സുകളും ചില വെബ് ആക്‌സസ് നിയന്ത്രണങ്ങളും ഉണ്ട് + - **Binder:** READMEയിൽ ഉള്ള Binder ബാഡ്ജ് ഉപയോഗിച്ച് ബ്രൗസറിൽ ആരംഭിക്കുക + - കുറിപ്പ്: Binder ലിമിറ്റഡ് റിസോഴ്‌സുകളുള്ളതാണ്, ചില വെബ് ആക്‌സസ് നിയന്ത്രണങ്ങളുണ്ട് -### പുരോഗമന പാഠങ്ങൾക്കുള്ള GPU പിന്തുണ +### ഉയർന്ന പാഠങ്ങൾക്ക് GPU പിന്തുണ -പിന്നീട് വരുന്ന പാഠങ്ങൾ GPU ആക്സിലറേഷൻ ഉപയോഗിച്ച് വളരെ പ്രയോജനപ്പെടും: +പിന്നീട് പാഠങ്ങൾ GPU അനുഗ്രഹനം വലിയ പിന്തുണയുള്ളതാണ്: -- **Azure Data Science VM:** GPU പിന്തുണയുള്ള NC-സീരീസ് VM-കൾ ഉപയോഗിക്കുക -- **Azure Machine Learning:** GPU കംപ്യൂട്ട് ഉപയോഗിച്ച് നോട്ട്‌ബുക്ക് ഫീച്ചറുകൾ ഉപയോഗിക്കുക -- **Google Colab:** നോട്ട്‌ബുക്കുകൾ വ്യക്തിഗതമായി അപ്‌ലോഡ് ചെയ്യുക (ഫ്രീ GPU പിന്തുണയുണ്ട്) +- **Azure Data Science VM:** GPU പിന്തുണയുള്ള NC-സീരീസ് VMകൾ ഉപയോഗിക്കുക +- **Azure Machine Learning:** GPU കംപ്യൂട്ടർ പിന്തുണയുള്ള നോട്ട്ബുക്ക് ഫീച്ചറുകൾ ഉപയോഗിക്കുക +- **Google Colab:** നോട്ട്ബുക്കുകൾ പ്രത്യേകം അപ്‌ലോഡ് ചെയ്യുക ( സൗജന്യ GPU പിന്തുണയുണ്ട് ) -### ക്വിസ് ആപ്പ് ഡെവലപ്പ്മെന്റ് +### ക്വിസ് ആപ്പ് വികസനം ```bash cd etc/quiz-app -npm run serve # http://localhost:8080 ൽ ഹോട്ട്-റീലോഡ് ഡെവലപ്പ്മെന്റ് സെർവർ +npm run serve # http://localhost:8080-ലുള്ള ഹോട്ട്-റിലോഡ് വികസന സർവർ ``` +## പരിശോധനാനിർദ്ദേശങ്ങൾ -## ടെസ്റ്റിംഗ് നിർദ്ദേശങ്ങൾ - -ഇത് സോഫ്റ്റ്‌വെയർ ടെസ്റ്റിംഗിനേക്കാൾ പഠന ഉള്ളടക്കത്തെ കേന്ദ്രീകരിച്ചുള്ള വിദ്യാഭ്യാസ സംഭരണമാണ്. പരമ്പരാഗത ടെസ്റ്റ് സ്യൂട്ട് ഇല്ല. +സോഫ്റ്റ്വെയർ പരിശോധന ചിലവുകൾക്കല്ല, ഇത് ഒരു വിദ്യാഭ്യാസ റീപ്പോസിറ്ററിയാണ്. പരമ്പരാഗത ടെസ്റ്റ് സ്യൂട്ട് ഇല്ല. ### സാധൂകരിക്കൽ സമീപനങ്ങൾ: -1. **Jupyter Notebooks:** കോഡ് ഉദാഹരണങ്ങൾ പ്രവർത്തിക്കുന്നുണ്ടോ എന്ന് പരിശോധിക്കാൻ സെല്ലുകൾ ക്രമത്തിൽ പ്രവർത്തിപ്പിക്കുക -2. **ക്വിസ് ആപ്പ് ടെസ്റ്റിംഗ്:** ഡെവലപ്പ്മെന്റ് സെർവറിലൂടെ മാനുവൽ ടെസ്റ്റിംഗ് -3. **പരിഭാഷാ സാധൂകരിക്കൽ:** `translations/` ഫോൾഡറിൽ പരിഭാഷാ ഉള്ളടക്കം പരിശോധിക്കുക -4. **ക്വിസ് ആപ്പ് ലിന്റിംഗ്:** `etc/quiz-app/`-ൽ `npm run lint` പ്രവർത്തിപ്പിക്കുക +1. **Jupyter നോട്ട്ബുക്കുകൾ:** കോഡ് ഉദാഹരണങ്ങൾ പാടുപെടാതെ പ്രവർത്തിക്കുന്നത് പരിശോധിക്കാൻ സെല്ലുകൾ നിരപരാധിത്വത്തിൽ പ്രവർത്തിപ്പിക്കുക +2. **ക്വിസ് ആപ്പ് പരിശോധന:** വികസന സർവറിലൂടെ കൈകാര്യം ചെയ്ത പരിശോധന +3. **മൂല്യനിർണയ പരിശോധന:** `translations/` ഫോൾഡറിലുള്ള പരിഭാഷകൾ പരിശോധിക്കുക +4. **ക്വിസ് ആപ്പ് ലിന്റിംഗ്:** `etc/quiz-app/` ൽ `npm run lint` നടത്തുക ### കോഡ് ഉദാഹരണങ്ങൾ പ്രവർത്തിപ്പിക്കൽ: ```bash -# ആദ്യം പരിസ്ഥിതി സജീവമാക്കുക +# പരിസ്ഥിതി ആദ്യം പ്രാപ്തമാക്കുക conda activate ai4beg -# പൈത്തൺ സ്ക്രിപ്റ്റുകൾ നേരിട്ട് പ്രവർത്തിപ്പിക്കുക +# പൈത്തൺ സ്ക്രിപ്റ്റുകൾ നേരിട്ട് 실행ിക്കുക python lessons/4-ComputerVision/07-ConvNets/pytorchcv.py # അല്ലെങ്കിൽ നോട്ട്‌ബുക്കുകൾ പ്രവർത്തിപ്പിക്കുക jupyter notebook lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb ``` - ## കോഡ് ശൈലി ### Python കോഡ് ശൈലി -- വിദ്യാഭ്യാസ കോഡിനായി സ്റ്റാൻഡേർഡ് Python കൺവെൻഷനുകൾ -- പഠനത്തിന് മുൻഗണന നൽകുന്ന വ്യക്തമായ, വായിക്കാൻ എളുപ്പമുള്ള കോഡ് -- പ്രധാന ആശയങ്ങൾ വിശദീകരിക്കുന്ന കമന്റുകൾ -- Jupyter Notebook-സൗഹൃദം: സെല്ലുകൾ സ്വയംപര്യാപ്തമായിരിക്കണം എത്രയും സാധ്യമായിടത്തോളം -- പാഠ്യപദ്ധതിക്ക് കർശനമായ ലിന്റിംഗ് ആവശ്യകതയില്ല +- വിദ്യാഭ്യാസ കോഡിനുള്ള സ്റ്റാൻഡേർഡ് Python രീതികൾ പാലിക്കുക +- പഠനാനുകൂലമായി വ്യക്തമായി വായിക്കാവുന്ന കോഡ്, ഒപ്റ്റിമൈസേഷനിൽ മുൻഗണന നൽകാതെ +- പ്രധാന ആശയങ്ങൾ വിശദീകരിക്കുന്ന കുറിപ്പുകൾ +- Jupyter നോട്ട്ബുക്ക് സൗഹൃദം: സെല്ലുകൾ സ്വയംപര്യാപ്തവുമായ മുഖ്യങ്ങള്‍ ആയിരിക്കണം +- പാഠപദ്ധതി ഉള്ളടക്കത്തിന് കർശനമായ ലിന്റിംഗ് സ്വഭാവമില്ല ### JavaScript/Vue.js (ക്വിസ് ആപ്പ്) -- `etc/quiz-app/package.json`-ൽ ESLint കോൺഫിഗറേഷൻ +- `etc/quiz-app/package.json` ൽ ESLint ക്രമീകരണം - പ്രശ്നങ്ങൾ പരിശോധിക്കാൻ, സ്വയം പരിഹരിക്കാൻ `npm run lint` പ്രവർത്തിപ്പിക്കുക -- Vue 2.x കൺവെൻഷനുകൾ -- ഘടക അടിസ്ഥാന ആർക്കിടെക്ചർ +- Vue 2.x പാരമ്പര്യം +- ഘടക ആധാരിത ഘടന ### ഫയൽ ക്രമീകരണം @@ -158,12 +153,11 @@ etc/ translations/ # Multi-language translations ``` - -## ബിൽഡ് & ഡിപ്ലോയ്മെന്റ് +## നിർമ്മാണം, വിന്യാസം ### Jupyter ഉള്ളടക്കം -ബിൽഡ് പ്രക്രിയ ആവശ്യമില്ല - Jupyter Notebooks നേരിട്ട് പ്രവർത്തിപ്പിക്കും. +നിർമാണ പ്രക്രിയ വേണ്ട - Jupyter നോട്ട്ബുക്കുകൾ നേരിട്ട് പ്രവർത്തിക്കുന്നു. ### ക്വിസ് ആപ്പ് @@ -174,55 +168,54 @@ cd etc/quiz-app npm run serve # ഉത്പാദന ബിൽഡ് -npm run build # etc/quiz-app/dist/ ലേക്ക് ഔട്ട്പുട്ട് +npm run build # etc/quiz-app/dist/ ലേക്ക് പുറത്തുവിടുന്നു -# Azure സ്റ്റാറ്റിക് വെബ് ആപ്പുകളിൽ വിന്യസിക്കുക -# Azure സ്വയം GitHub Actions വർക്ക്‌ഫ്ലോ സൃഷ്ടിക്കുന്നു -# വിശദമായ വിന്യാസ നിർദ്ദേശങ്ങൾക്കായി etc/quiz-app/README.md കാണുക +# Azure Static Web Apps-ലേക്ക് വിന്യസിക്കുക +# Azure സ്വയം GitHub Actions പ്രവൃത്തി പ്രക്രിയ സൃഷ്ടിക്കുന്നു +# വിന്യസന വിശദീകരണങ്ങൾക്ക് etc/quiz-app/README.md കാണുക ``` - ### ഡോക്യുമെന്റേഷൻ സൈറ്റ് -റിപ്പോസിറ്ററി ഡോക്സിഫൈ ഉപയോഗിക്കുന്നു: -- `index.html` പ്രവേശന പോയിന്റ് -- ബിൽഡ് ആവശ്യമില്ല - GitHub Pages വഴി നേരിട്ട് സർവ് ചെയ്യുന്നു -- ആക്‌സസ് ചെയ്യുക: https://microsoft.github.io/AI-For-Beginners/ +ഡോക്സിഫൈ ഉപയോഗിച്ച് റീപ്പോസിറ്ററി ഡോക്യുമെന്റേഷൻ സേവനം ചെയ്യുന്നു: +- `index.html` എൻട്രി പോയിന്റ് ആയി പ്രവർത്തിക്കുന്നു +- നിർമ്മാണം ആവശ്യമില്ല - GitHub Pages വഴി നേരിട്ട് സേവനം ചെയ്യുന്നു +- ആക്‌സസ് ചെയ്യാം: https://microsoft.github.io/AI-For-Beginners/ -## സംഭാവനാ മാർഗ്ഗനിർദ്ദേശങ്ങൾ +## സംഭാവന മാർഗ്ഗനിർദേശങ്ങൾ ### പുൾ റിക്വസ്റ്റ് പ്രക്രിയ -1. **ശീർഷകം ഫോർമാറ്റ്:** മാറ്റം വ്യക്തമാക്കുന്ന വ്യക്തമായ, വിവരണാത്മകമായ ശീർഷകങ്ങൾ -2. **CLA ആവശ്യകത:** Microsoft CLA ഒപ്പിടണം (സ്വയം പരിശോധന) -3. **ഉള്ളടക്ക മാർഗ്ഗനിർദ്ദേശങ്ങൾ:** - - വിദ്യാഭ്യാസ ലക്ഷ്യവും തുടക്കക്കാർക്ക് അനുയോജ്യമായ സമീപനവും പാലിക്കുക - - നോട്ട്‌ബുക്കിലെ എല്ലാ കോഡ് ഉദാഹരണങ്ങളും പരീക്ഷിക്കുക - - നോട്ട്‌ബുക്കുകൾ തുടർച്ചയായി പ്രവർത്തിക്കുന്നുണ്ടെന്ന് ഉറപ്പാക്കുക - - ഇംഗ്ലീഷ് ഉള്ളടക്കം മാറ്റിയാൽ പരിഭാഷകൾ അപ്ഡേറ്റ് ചെയ്യുക -4. **ക്വിസ് ആപ്പ് മാറ്റങ്ങൾ:** കമ്മിറ്റ് ചെയ്യുന്നതിന് മുമ്പ് `npm run lint` പ്രവർത്തിപ്പിക്കുക +1. **തലക്കെട്ട് രൂപം:** മാറ്റം വ്യക്തമാക്കുന്ന വ്യക്തമായ, വിവരണാത്മക തലക്കെട്ടുകൾ +2. **CLA ആവശ്യകത:** Microsoft CLA ഒപ്പിടൽ (സ്വയംകർത്തമായ പരിശോധന) +3. **ഉള്ളടക്ക മാർഗ്ഗരേഖകൾ:** + - വിദ്യാഭ്യാസ കേന്ദ്രീകരിക്കുകയും ആരംഭക_mac_opt അടിയും നിലനിർത്തുക + - നോട്ട്ബുക്കുകളിൽ ഉള്ള കോഡ് ഉദാഹരണങ്ങൾ എല്ലാം ടെസ്റ്റ് ചെയ്യുക + - നോട്ട്ബുക്കുകൾ തുടങ്ങി അവസാനംവരെ പ്രവർത്തിക്കുന്നുണ്ടെന്ന് ഉറപ്പാക്കുക + - ഇംഗ്ലീഷ് ഉള്ളടക്കം മാറ്റിയാൽ വിവർത്തനങ്ങൾ അപ്‌ഡേറ്റ് ചെയ്യുക +4. **ക്വിസ് ആപ്പ് മാറ്റങ്ങൾ:** കമ്മിറ്റ്‌ ചെയ്യുന്നതിന് മുമ്പ് `npm run lint` നടത്തുക -### പരിഭാഷാ സംഭാവനകൾ +### വിവർത്തന സംഭാവനകൾ -- GitHub Actions ഉപയോഗിച്ച് co-op-translator വഴി ഓട്ടോമാറ്റിക് പരിഭാഷകൾ -- മാനുവൽ പരിഭാഷകൾ `translations//`-ൽ -- ക്വിസ് പരിഭാഷകൾ `etc/quiz-app/src/assets/translations/`-ൽ -- പിന്തുണയുള്ള ഭാഷകൾ: 40+ (പൂർണ്ണ പട്ടിക README-യിൽ കാണുക) +- GitHub Actions ഉപയോഗിച്ച് co-op-translator വഴി ആസ്വയിച്ച വിവർത്തനങ്ങൾ +- മാനുവൽ വിവർത്തനങ്ങൾ `translations//` ൽ +- ക്വിസ് വിവർത്തനങ്ങൾ `etc/quiz-app/src/assets/translations/` ൽ +- പിന്തുണയുള്ള ഭാഷകൾ: 40+ (പൂർണ്ണ പട്ടികക്ക് README നോക്കുക) ### സജീവ സംഭാവന മേഖലകൾ -നിലവിലെ ആവശ്യങ്ങൾക്കായി `etc/CONTRIBUTING.md` കാണുക: -- ഡീപ്പ് റീ ഇൻഫോഴ്‌സ്‌മെന്റ് ലേണിംഗ് വിഭാഗങ്ങൾ -- ഒബ്ജക്റ്റ് ഡിറ്റക്ഷൻ മെച്ചപ്പെടുത്തലുകൾ -- നെയിംഡ് എൻറ്റിറ്റി റെക്കഗ്നിഷൻ ഉദാഹരണങ്ങൾ -- കസ്റ്റം എംബെഡ്ഡിംഗ് ട്രെയിനിംഗ് സാമ്പിളുകൾ +ഇപ്പോഴത്തെ ആവശ്യമുകൾക്കായി `etc/CONTRIBUTING.md` കാണുക: +- ഡീപ് ശക്തീകരണ പഠനം എന്നിവ +- വസ്തു തിരിച്ചറിവ് മെച്ചപ്പെടുത്തലുകൾ +- നാമപ്പെടുത്തിയ സങ്കേത തിരിച്ചറിവ് ഉദാഹരണങ്ങൾ +- കസ്റ്റം എംബെഡ്ഡിംഗ് പരിശീലന സാമ്പിളുകൾ -## പരിസ്ഥിതി ക്രമീകരണം +## പരിസ്ഥിതി കോൺഫിഗറേഷൻ -### ആവശ്യമായ ആശ്രിതങ്ങൾ +### ആവശ്യമായ ഡിപ്പെൻഡൻസികൾ ```bash -# കോർ പൈത്തൺ പാക്കേജുകൾ (requirements.txt ൽ നിന്നുള്ള) +# മുകളിൽ ആവശ്യമായ പാക്കേജുകൾ (requirements.txt) നിന്നും കോർ പൈത്തൺ പാക്കേജുകൾ tensorflow==2.17.0 torch (via conda) torchvision (via conda) @@ -235,38 +228,36 @@ matplotlib==3.9 jupyter ``` +### പരിസ്ഥിതി വേരിയബിൾസ് -### പരിസ്ഥിതി വേരിയബിളുകൾ - -അടിസ്ഥാന ഉപയോഗത്തിന് പ്രത്യേക പരിസ്ഥിതി വേരിയബിളുകൾ ആവശ്യമില്ല. +അടിസ്ഥാന ഉപയോഗത്തിനായി പ്രത്യേക പരിസ്ഥിതി വേരിയബിൾസ് ആവശ്യമില്ല. -Azure ഡിപ്ലോയ്മെന്റുകൾക്കായി (ക്വിസ് ആപ്പ്): -- `AZURE_STATIC_WEB_APPS_API_TOKEN` (Azure സ്വയം സജ്ജമാക്കും) +Azure വിന്യാസങ്ങൾക്ക് (ക്വിസ് ആപ്പ്): +- `AZURE_STATIC_WEB_APPS_API_TOKEN` (Azure സ്വയം സജ്ജമാക്കുന്നു) -## ഡീബഗ്ഗിംഗ് & പ്രശ്നപരിഹാരം +## ഡീബഗ്ഗിംഗ്, പ്രശ്ന പരിഹാരം -### സാധാരണ പ്രശ്നങ്ങൾ +### പൊതു പ്രശ്നങ്ങൾ -**പ്രശ്നം:** Conda പരിസ്ഥിതി സൃഷ്ടിക്കൽ പരാജയപ്പെടുന്നു -- **പരിഹാരം:** ആദ്യം conda അപ്ഡേറ്റ് ചെയ്യുക: `conda update conda -y` -- മതിയായ ഡിസ്ക് സ്പേസ് ഉറപ്പാക്കുക (50GB ശുപാർശ) +**പ്രശ്നം:** Conda പരിസ്ഥിതി സൃഷ്ടി പരാജയമാണ് +- **പരിഹാരം:** ആദ്യം conda അപ്‌ഡേറ്റ് ചെയ്യുക: `conda update conda -y` +- മതിയായ ഡ്രൈവ് സ്പേസ് ഉറപ്പാക്കുക (50GB ശുപാർശ) -**പ്രശ്നം:** Jupyter kernel കണ്ടെത്താനാകുന്നില്ല -- **പരിഹാരം:** +**പ്രശ്നം:** Jupyter കർണൽ കണ്ടെത്താനാകുന്നില്ല +- **പരിഹാരം:** ```bash conda activate ai4beg python -m ipykernel install --user --name ai4beg ``` +**പ്രശ്നം:** നോട്ട്ബുക്കുകളിൽ GPU കണ്ടെത്താനാകുന്നില്ല +- **പരിഹാരം:** + - CUDA ഇൻസ്റ്റാൾ ചെയ്തിരിക്കുന്നുവോ പരിശോധിക്കുക: `nvidia-smi` + - PyTorch GPU അഡപ്‌ട്ടർ പരിശോധന: `python -c "import torch; print(torch.cuda.is_available())"` + - TensorFlow GPU പരിശോധിക്കൽ: `python -c "import tensorflow as tf; print(tf.config.list_physical_devices('GPU'))"` -**പ്രശ്നം:** നോട്ട്‌ബുക്കുകളിൽ GPU കണ്ടെത്താനാകുന്നില്ല -- **പരിഹാരം:** - - CUDA ഇൻസ്റ്റലേഷൻ പരിശോധിക്കുക: `nvidia-smi` - - PyTorch GPU ലഭ്യത പരിശോധിക്കുക: `python -c "import torch; print(torch.cuda.is_available())"` - - TensorFlow GPU ലഭ്യത പരിശോധിക്കുക: `python -c "import tensorflow as tf; print(tf.config.list_physical_devices('GPU'))"` - -**പ്രശ്നം:** ക്വിസ് ആപ്പ് ആരംഭിക്കുന്നില്ല -- **പരിഹാരം:** +**പ്രശ്നം:** ക്വിസ് ആപ്പ് ആരംഭിക്കുന്നില്ല +- **പരിഹാരം:** ```bash cd etc/quiz-app rm -rf node_modules package-lock.json @@ -274,56 +265,55 @@ Azure ഡിപ്ലോയ്മെന്റുകൾക്കായി (ക് npm run serve ``` - -**പ്രശ്നം:** Binder ടൈംഔട്ട് അല്ലെങ്കിൽ ഡൗൺലോഡുകൾ തടയുന്നു -- **പരിഹാരം:** മികച്ച റിസോഴ്‌സ് ആക്‌സസിനായി GitHub Codespaces അല്ലെങ്കിൽ ലോകൽ സെറ്റപ്പ് ഉപയോഗിക്കുക +**പ്രശ്നം:** Binder സമയം പാർത്തുകൂടി അല്ലെങ്കിൽ ഡൗൺലോഡുകൾ തടയുന്നു +- **പരിഹാരം:** മികച്ച റിസോഴ്‌സ് ആക്‌സസിനായി GitHub Codespaces അല്ലെങ്കിൽ ലോകൽ സജ്ജീകരണം ഉപയോഗിക്കുക ### മെമ്മറി പ്രശ്നങ്ങൾ -ചില പാഠങ്ങൾ വലിയ RAM ആവശ്യപ്പെടുന്നു (8GB+ ശുപാർശ): -- റിസോഴ്‌സ്-ഇന്റൻസീവ് പാഠങ്ങൾക്കായി ക്ലൗഡ് VM-കൾ ഉപയോഗിക്കുക -- മോഡലുകൾ ട്രെയിൻ ചെയ്യുമ്പോൾ മറ്റ് ആപ്ലിക്കേഷനുകൾ അടയ്ക്കുക -- മെമ്മറി കുറയുമ്പോൾ നോട്ട്‌ബുക്കുകളിൽ ബാച്ച് സൈസ് കുറയ്ക്കുക +ചില പാഠങ്ങൾക്ക് വലിയ റാം ആവശ്യമുണ്ട് (കുറഞ്ഞത് 8GB ശുപാർശ ചെയ്യുന്നു): +- പ്രയാസമേറിയ പാഠങ്ങൾക്ക് ക്ലൗഡ് VMകൾ ഉപയോഗിക്കുക +- മോഡൽ ട്രെയ്‌നിംഗ് സമയത്ത് മറ്റ് ആപ്പുകൾ അടയ്ക്കുക +- മെമ്മറി പൂർണ്ണമായാൽ നോട്ട്ബുക്കുകളിൽ ബാച്ച് വലുപ്പം കുറക്കുക ## അധിക കുറിപ്പുകൾ -### കോഴ്‌സ് ഇൻസ്ട്രക്ടർമാർക്കായി +### പാഠം പകർന്നടുക്കുന്ന അധ്യാപകർക്ക് -- പഠന മാർഗ്ഗനിർദ്ദേശങ്ങൾക്ക് `lessons/0-course-setup/for-teachers.md` കാണുക -- പാഠങ്ങൾ സ്വയംപര്യാപ്തമാണ്, തുടർച്ചയായി അല്ലെങ്കിൽ തിരഞ്ഞെടുക്കി പഠിപ്പിക്കാം -- ഏകദേശം 12 ആഴ്ച, ആഴ്ചയിൽ 2 പാഠങ്ങൾ +- പഠന മാർഗ്ഗനിർദേശങ്ങൾക്ക് `lessons/0-course-setup/for-teachers.md` കാണുക +- പാഠങ്ങൾ സ്വയംപര്യാപ്തവായും പരമ്പരയായി പഠിപ്പിക്കാവുന്നതുമായും ആണ് +- കാൽപ്പനിക സമയം: 12 ആഴ്ച, ആഴ്ചയ്ക്ക് 2 പാഠങ്ങൾ ### ക്ലൗഡ് റിസോഴ്‌സുകൾ -- **Azure for Students:** വിദ്യാർത്ഥികൾക്ക് സൗജന്യ ക്രെഡിറ്റുകൾ -- **Microsoft Learn:** പാഠ്യപദ്ധതിയുമായി ബന്ധിപ്പിച്ച അനുബന്ധ പഠന പാതകൾ -- **Binder:** സൗജന്യമാണ്, പക്ഷേ പരിമിതമായ റിസോഴ്‌സുകളും ചില നെറ്റ്‌വർക്ക് നിയന്ത്രണങ്ങളും +- **വിദ്യാർത്ഥികൾക്കായി Azure:** ഫ്രീ ക്രെഡിറ്റുകൾ ലഭ്യമാണ് +- **Microsoft Learn:** ബഹുഭാഷാ പഠനപാതകളും ബന്ധിപ്പിച്ചിട്ടുള്ളത് +- **Binder:** സൗജന്യമാണ്, പക്ഷേ ചില സർക്കാർ നിയന്ത്രണങ്ങളിലും പരിധികളിലും -### കോഡ് പ്രവർത്തന ഓപ്ഷനുകൾ +### കോഡ് എക്സിക്യൂഷൻ ഓപ്ഷനുകൾ -1. **ലോകൽ (ശുപാർശ):** പൂർണ്ണ നിയന്ത്രണം, മികച്ച പ്രകടനം, GPU പിന്തുണ -2. **GitHub Codespaces:** ക്ലൗഡ് അടിസ്ഥാനമാക്കിയ VS Code, വേഗത്തിലുള്ള ആക്‌സസിനായി -3. **Binder:** ബ്രൗസർ അടിസ്ഥാനമാക്കിയ Jupyter, സൗജന്യമാണ് പക്ഷേ പരിമിതം -4. **Azure ML Notebooks:** GPU പിന്തുണയുള്ള എന്റർപ്രൈസ് ഓപ്ഷൻ -5. **Google Colab:** നോട്ട്‌ബുക്കുകൾ വ്യക്തിഗതമായി അപ്‌ലോഡ് ചെയ്യുക, സൗജന്യ GPU ലെയർ ലഭ്യമാണ് +1. **ലോകൽ (ശിപാർശ):** പൂർണ്ണ നിയന്ത്രണം, മികച്ച പ്രകടനം, GPU പിന്തുണ +2. **GitHub Codespaces:** ക്ലൗഡ് അടിസ്ഥാനമാക്കിയുള്ള VS കോഡ്, പെട്ടെന്ന് ആക്‌സസിനായി നല്ലത് +3. **Binder:** ബ്രൗസർ അടിസ്ഥാനമാക്കി Jupyter, സൗജന്യമാണ്, പക്ഷേ പരിമിതിയായ +4. **Azure ML നോട്ട്ബുക്കുകൾ:** GPU പിന്തുണയോടെ എന്റർപ്രൈസ് ഓപ്ഷൻ +5. **Google Colab:** നോട്ട്ബുക്കുകൾ ഒറ്റത്തവണ അപ്‌ലോഡ് ചെയ്യുക, സൗജന്യ GPU തരം ലഭ്യമാണ് -### നോട്ട്‌ബുക്കുകളുമായി ജോലി ചെയ്യൽ +### നോട്ട്ബുക്കുകളുമായി ജോലി ചെയ്യൽ -- പഠനത്തിനായി സെൽ-ബൈ-സെൽ പ്രവർത്തിപ്പിക്കാൻ രൂപകൽപ്പന ചെയ്തിരിക്കുന്നു -- പല നോട്ട്‌ബുക്കുകളും ആദ്യ പ്രവർത്തനത്തിൽ ഡാറ്റാസെറ്റുകൾ ഡൗൺലോഡ് ചെയ്യും (സമയം എടുക്കാം) -- ചില മോഡലുകൾക്ക് യുക്തിസഹമായ ട്രെയിനിംഗിനായി GPU ആവശ്യമാണ് +- പഠനത്തിനായി സെല്ലിനടിയായി നോട്ട്ബുക്കുകൾ പ്രവർത്തിക്കാൻ രൂപകല്‍പ്പന ചെയ്‌തതാണ് +- ആദ്യ പ്രവർത്തനത്തിൽ പല നോട്ട്ബുക്കുകളും ഡാറ്റാസെറ്റുകൾ ഡൗൺലോഡ് ചെയ്യുന്നു (സമയം വേണ്ടാം) +- ചില മോഡലുകൾ യുക്തിപരമായ പരിശീലന സമയത്തിനായി GPU ആവശ്യമാണ് - കംപ്യൂട്ട് ആവശ്യകത കുറയ്ക്കാൻ മുൻകൂട്ടി പരിശീലിച്ച മോഡലുകൾ ഉപയോഗിക്കുന്നു ### പ്രകടന പരിഗണനകൾ -- പിന്നീട് വരുന്ന കമ്പ്യൂട്ടർ വിഷൻ പാഠങ്ങൾ (CNNs, GANs) GPU-യിൽ നിന്ന് പ്രയോജനം നേടും -- NLP ട്രാൻസ്ഫോർമർ പാഠങ്ങൾ വലിയ RAM ആവശ്യപ്പെടാം -- തുടക്കം മുതൽ പരിശീലനം വിദ്യാഭ്യാസപരമാണ്, പക്ഷേ സമയം കൂടുതലെടുക്കും -- ട്രാൻസ്ഫർ ലേണിംഗ് ഉദാഹരണങ്ങൾ പരിശീലന സമയം കുറയ്ക്കുന്നു +- പിന്നീട് കമ്പ്യൂട്ടർ വിഷ്വൻ പാഠങ്ങൾ (CNN, GAN) GPU ഉപയോ​ഗിച്ച് മെച്ചപ്പെടുത്തുന്നു +- NLP ട്രാൻസ്ഫോർമർ പാഠങ്ങൾക്ക് വലിയ RAM ആവശ്യമാകും +- അടിസ്ഥാനത്തിൽ നിന്ന് പരിശീലനം സമയം കൂടുതലാണ്, എന്നാൽ പഠനപരമായതാണ് +- ട്രാൻസ്ഫർ പഠന ഉദാഹരണങ്ങൾ പരിശീലന സമയം കുറഞ്ഞു --- -**അസൂയാ**: -ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖ അധികാരപരമായ ഉറവിടമായി കണക്കാക്കണം. നിർണായക വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനത്തിന്റെ ഉപയോഗത്തിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല. +**അറിയിപ്പ്**: +ഈ രേഖ AI പരിഭാഷാ സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് പരിഭാഷപ്പെടുത്തിയതാണ്. ഞങ്ങൾ കൃത്യതയ്ക്കായി ശ്രമിക്കുന്നുവെങ്കിലും, ഓട്ടോമേറ്റഡ് പരിഭാഷകളിൽ പിഴവുകൾ അല്ലെങ്കിൽ തെറ്റായ വിവരങ്ങൾ ഉണ്ടാകാൻ സാധ്യതയുണ്ട്. അതിന്റെ സ്വാഭാവിക ഭാഷയിലുള്ള അസൽ രേഖയാണ് പ്രാമാണികമായ ഉറവിടമായി പരിഗണിക്കേണ്ടത്. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ പരിഭാഷ ശുപാർശ ചെയ്യുന്നു. ഈ പരിഭാഷ ഉപയോഗിച്ച് ഉണ്ടാകുന്ന തെറ്റിദ്ധാരണകൾ അല്ലെങ്കിൽ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കായി ഞങ്ങൾ ഉത്തരവാദികളല്ല. \ No newline at end of file diff --git a/translations/ml/CONTRIBUTING.md b/translations/ml/CONTRIBUTING.md new file mode 100644 index 0000000000..f85e2cb02b --- /dev/null +++ b/translations/ml/CONTRIBUTING.md @@ -0,0 +1,29 @@ +# AI-For-Beginners-ലേക്ക് സംഭാവന നൽകൽ + +AI-For-Beginners-ലേക്ക് സംഭാവന നൽകുന്നതിൽ നിങ്ങളുടെ താൽപര്യത്തിന് നന്ദി! വിവർത്തനങ്ങൾ, പാഠം ശരിയാക്കലുകൾ, ഫോർമാറ്റ് ശരിയാക്കലുകൾ എന്നിവ ഞങ്ങൾ സ്വാഗതം ചെയ്യുന്നു. + +## Microsoft സംഭാവനാ ലൈസൻസ് കരാർ (CLA) + +ഈ പ്രോജക്റ്റ് സംഭാവനകളും നിർദേശങ്ങളും സ്വാഗതം ചെയ്യുന്നു. ഭൂരിഭാഗം സംഭാവനകൾക്ക് Contributor License Agreement (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). + +--- + + +**അറിയിപ്പ്**: +ഈ രേഖ AI പരിഭാഷാ സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് പരിഭാഷപ്പെടുത്തിയതാണ്. ഞങ്ങൾ കൃത്യതയ്ക്കായി ശ്രമിക്കുന്നുവെങ്കിലും, ഓട്ടോമേറ്റഡ് പരിഭാഷകളിൽ പിഴവുകൾ അല്ലെങ്കിൽ തെറ്റായ വിവരങ്ങൾ ഉണ്ടാകാൻ സാധ്യതയുണ്ട്. അതിന്റെ സ്വാഭാവിക ഭാഷയിലുള്ള അസൽ രേഖയാണ് പ്രാമാണികമായ ഉറവിടമായി പരിഗണിക്കേണ്ടത്. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ പരിഭാഷ ശുപാർശ ചെയ്യുന്നു. ഈ പരിഭാഷ ഉപയോഗിച്ച് ഉണ്ടാകുന്ന തെറ്റിദ്ധാരണകൾ അല്ലെങ്കിൽ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കായി ഞങ്ങൾ ഉത്തരവാദികളല്ല. + \ No newline at end of file diff --git a/translations/ml/examples/README.md b/translations/ml/examples/README.md index e711c2c1cc..b7b48207bc 100644 --- a/translations/ml/examples/README.md +++ b/translations/ml/examples/README.md @@ -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) | ടെക്സ്റ്റിന്റെ മനോഭാവം (സ pozitive/negative) വിശകലനം ചെയ്യുക | ⭐⭐ തുടക്കക്കാർ+ | Python | +| [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) | വാചകത്തിന്റെ സംഭവം വിശകലനം ചെയ്യുക (സഖാത്മക/നിഷേധാത്മക) | ⭐⭐ തുടക്കക്കാരൻ+ | പൈതൺ | -## 🚀 ആരംഭിക്കുന്നത് +## 🚀 തുടക്കം കുറിക്കുക -### മുൻപരിചയം +### ആവശ്യമായ മുൻപരിചയം -Python ഇൻസ്റ്റാൾ ചെയ്തിട്ടുണ്ടെന്ന് ഉറപ്പാക്കുക (3.8 അല്ലെങ്കിൽ അതിനുമുകളിൽ ശുപാർശ ചെയ്യുന്നു). ആവശ്യമായ പാക്കേജുകൾ ഇൻസ്റ്റാൾ ചെയ്യുക: +നിങ്ങളുടെ കമ്പ്യൂട്ടറിലേക്ക് പൈതൺ ഇൻസ്റ്റാൾ ചെയ്തുള്ള വിവരം ഉറപ്പാക്കുക (3.8 അല്ലെങ്കിൽ അതിനുമുമ്പ് ശുപാർശ ചെയ്യപ്പെടുന്നു). ആവശ്യമായ പാക്കേജുകൾ ഇൻസ്റ്റാൾ ചെയ്യുക: ```bash -# പൈത്തൺ സ്ക്രിപ്റ്റുകൾക്കായി +# പൈഥൺ സ്ക്രിപ്റ്റുകൾക്കായി pip install numpy # ജൂപ്പിറ്റർ നോട്ട്‌ബുക്കുകൾക്കായി (ഇമേജ് ക്ലാസിഫയർ) pip install jupyter numpy pillow tensorflow ``` -അല്ലെങ്കിൽ പ്രധാന പാഠ്യപദ്ധതിയിൽ നിന്നുള്ള conda പരിസ്ഥിതി ഉപയോഗിക്കുക: +അല്ലെങ്കിൽ പ്രധാന കോഴ്‌സിൽ നിന്നും കോണ്ടാ എൻവയോൺമെന്റ് ഉപയോഗിക്കുക: ```bash conda env create --name ai4beg --file ../environment.yml @@ -34,54 +34,54 @@ conda activate ai4beg ### ഉദാഹരണങ്ങൾ പ്രവർത്തിപ്പിക്കൽ -**Python സ്ക്രിപ്റ്റുകൾക്കായി (.py ഫയലുകൾ):** +**പൈതൺ സ്‌ക്രിപ്റ്റുകൾക്കായി (.py ഫയലുകൾ):** ```bash python 01-hello-ai-world.py ``` -**Jupyter നോട്ട്‌ബുക്കുകൾക്കായി (.ipynb ഫയലുകൾ):** +**ജൂപ്പിറ്റർ നോട്ട്ബുക്കുകൾക്കായി (.ipynb ഫയലുകൾ):** ```bash jupyter notebook 03-image-classifier.ipynb ``` -## 📖 പഠന മാർഗ്ഗം +## 📖 പഠന മാർഗ്ഗരേഖ -ഉദാഹരണങ്ങൾ ക്രമത്തിൽ പിന്തുടരാൻ ഞങ്ങൾ ശുപാർശ ചെയ്യുന്നു: +നിർദേശിച്ചിരിക്കുന്ന ക്രമത്തിലും മാർഗ്ഗരേഖയിൽ ഉൾപ്പെടുന്ന ഉദാഹരണങ്ങൾ അനുഗമിക്കുക: -1. **"Hello AI World" -ൽ തുടങ്ങുക** - പാറ്റേൺ തിരിച്ചറിയലിന്റെ അടിസ്ഥാനങ്ങൾ പഠിക്കുക -2. **ഒരു ലളിതമായ ന്യൂറൽ നെറ്റ്‌വർക്ക് നിർമ്മിക്കുക** - ന്യൂറൽ നെറ്റ്‌വർക്ക് എങ്ങനെ പ്രവർത്തിക്കുന്നു എന്ന് മനസിലാക്കുക -3. **ചിത്ര വർഗ്ഗീകരണം പരീക്ഷിക്കുക** - യഥാർത്ഥ ചിത്രങ്ങളുമായി AI പ്രവർത്തനം കാണുക -4. **ടെക്സ്റ്റ് മനോഭാവം വിശകലനം ചെയ്യുക** - സ്വാഭാവിക ഭാഷാ പ്രോസസ്സിംഗ് അന്വേഷിക്കുക +1. **"Hello AI World"-ൽ തുടങ്ങുക** - പാറ്റേൺ തിരിച്ചറിവിന്റെ അടിസ്ഥാനങ്ങൾ പഠിക്കുക +2. **ലളിതമായ തലച്ചോറ് ശൃംഖല നിർമ്മിക്കുക** - Neural Network എങ്ങനെ പ്രവർത്തിക്കുന്നുവെന്ന് മനസിലാക്കുക +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) -- [സ്വാഭാവിക ഭാഷാ പ്രോസസ്സിംഗ്](../lessons/5-NLP/README.md) +- [തലച്ചോറ് ശൃംഖലകൾ](../lessons/3-NeuralNetworks/README.md) +- [കമ്പ്യൂട്ടർ വിസൻ](../lessons/4-ComputerVision/README.md) +- [സ്വാഭാവിക ഭാഷാ പ്രോസസിംഗ്](../lessons/5-NLP/README.md) -## 🤝 സംഭാവനകൾ +## 🤝 സംഭാവന ചെയ്യുക -ഈ ഉദാഹരണങ്ങൾ സഹായകമാണെന്ന് തോന്നുന്നുവോ? അവ മെച്ചപ്പെടുത്താൻ സഹായിക്കുക: +ഈ ഉദാഹരണങ്ങൾ നിങ്ങൾക്ക് സഹായകരമായോയെന്ന് തോന്നുന്നുവെങ്കിൽ, അവ മെച്ചപ്പെടുത്താൻ സഹായിക്കൂ: - പ്രശ്നങ്ങൾ റിപ്പോർട്ട് ചെയ്യുക അല്ലെങ്കിൽ മെച്ചപ്പെടുത്തലുകൾ നിർദ്ദേശിക്കുക -- തുടക്കക്കാർക്കായി കൂടുതൽ ഉദാഹരണങ്ങൾ ചേർക്കുക -- ഡോക്യുമെന്റേഷൻ, കമന്റുകൾ മെച്ചപ്പെടുത്തുക +- തുടക്കക്കാർക്ക് കൂടുതൽ ഉദാഹരണങ്ങൾ ചേർക്കുക +- ഡോക്യുമെന്റേഷൻ, കുറിപ്പുകൾ മെച്ചപ്പെടുത്തുക --- -*ഓർക്കുക: ഓരോ വിദഗ്ധനും ഒരിക്കൽ തുടക്കക്കാരനായിരുന്നു. സന്തോഷകരമായ പഠനം! 🎓* +*ഓർക്കുക: mỗi വിദഗ്ധനും ഒരുപാട് മുമ്പായി തുടക്കക്കാരനായിരുന്നു. സന്തോഷകരമായ പഠനം! 🎓* --- -**അസൂയാ**: -ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖ അധികാരമുള്ള ഉറവിടമായി കണക്കാക്കണം. നിർണായക വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല. +**അറിയിപ്പ്**: +ഈ രേഖ AI പരിഭാഷാ സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് പരിഭാഷപ്പെടുത്തിയതാണ്. ഞങ്ങൾ കൃത്യതയ്ക്കായി ശ്രമിക്കുന്നുവെങ്കിലും, ഓട്ടോമേറ്റഡ് പരിഭാഷകളിൽ പിഴവുകൾ അല്ലെങ്കിൽ തെറ്റായ വിവരങ്ങൾ ഉണ്ടാകാൻ സാധ്യതയുണ്ട്. അതിന്റെ സ്വാഭാവിക ഭാഷയിലുള്ള അസൽ രേഖയാണ് പ്രാമാണികമായ ഉറവിടമായി പരിഗണിക്കേണ്ടത്. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ പരിഭാഷ ശുപാർശ ചെയ്യുന്നു. ഈ പരിഭാഷ ഉപയോഗിച്ച് ഉണ്ടാകുന്ന തെറ്റിദ്ധാരണകൾ അല്ലെങ്കിൽ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കായി ഞങ്ങൾ ഉത്തരവാദികളല്ല. \ No newline at end of file diff --git a/translations/ml/lessons/0-course-setup/how-to-run.md b/translations/ml/lessons/0-course-setup/how-to-run.md index 06b222eee2..b7efd5197f 100644 --- a/translations/ml/lessons/0-course-setup/how-to-run.md +++ b/translations/ml/lessons/0-course-setup/how-to-run.md @@ -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,58 +15,57 @@ conda env create --name ai4beg --file .devcontainer/environment.yml conda activate ai4beg ``` -### Python എക്സ്റ്റൻഷനോടെ Visual Studio Code ഉപയോഗിക്കൽ +### Python Extension ഉപയോഗിച്ച് Visual Studio Code ഉപയോഗിക്കൽ -ഈ പാഠ്യപദ്ധതിയിൽ ഉൾപ്പെടുന്ന ഫയലുകൾ [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** ബട്ടൺ ക്ലിക്കുചെയ്ത് കോഡ്സ്പേസ് ആരംഭിപ്പിച്ച് വൈകാതെ പ്രവർത്തനക്ഷമമാക്കാം. -* **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)** ഉപയോഗിക്കുക. [Binder](https://mybinder.org) GitHub-ൽ ചില കോഡ് പരീക്ഷിക്കാൻ സൗജന്യ ക്ലൗഡ് കംപ്യൂട്ടിംഗ് വിഭവങ്ങൾ നൽകുന്നു. ഫ്രണ്ട് പേജിൽ റെപ്പോസിറ്ററി Binder-ൽ തുറക്കാനുള്ള ബട്ടൺ ഉണ്ട് - അത് നിങ്ങളെ നേരിട്ട് ബൈണ്ടർ സൈറ്റിലേക്കു കൊണ്ടുപോകും, അടിസ്ഥാനം കോണ്ടെയ്‌നർ നിർമിച്ച് Jupyter വെബ് ഇന്റർഫേസ് സജ്ജമാക്കും. +* GitHub ൽ നിങ്ങക്കായി സൃഷ്ടിച്ച ഒരു വിചിത്ര പരിതസ്ഥിതിയായ **[GitHub Codespaces](https://github.com/features/codespaces)** ഉപയോഗിക്കുക, ഇത് 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 യുമായി ക്ലൗഡിൽ ഓടിക്കൽ -ഈ പാഠ്യപദ്ധതിയിലെ ചില പിന്നീട് വരുന്ന പാഠങ്ങൾ 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 വഴിയേ അതുമായി കണക്ട് ചെയ്യുക. പിന്നീട് Maschine-ല്‌ റെപ്പോ ക്ലോൺ ചെയ്ത് പഠനം ആരംഭിക്കാം. NC-സീരിസ് VMs 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-സീരീസ് VM-കൾ 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](https://github.com/Azure/co-op-translator) എന്ന എഐ വിവർത്തന സേവനം ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തമാണ്. ഞങ്ങൾ ശരിശുദ്ധതയിൽ ശ്രമിച്ചിരുന്നെങ്കിലും, സ്വയമേവ ഉള്ള വിവർത്തനങ്ങളിൽ പിഴവുകൾ അല്ലെങ്കിൽ അശുദ്ധികളുണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ ഭാഷയിൽ ഉള്ള മൗലിക രേഖ പ്രാധാന്യവാനായ ഉറവിടമായി മാറ്റി കണ്ടിരിക്കണം. പ്രധാന വിവരങ്ങൾക്ക് പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം നിർദ്ദേശിക്കുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുള്ള എല്ലാ തെറ്റുകൾക്കും അല്ലെങ്കിൽ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കും ഞങ്ങൾ ഉത്തരവാദിത്തം വഹിക്കുന്നില്ല. +**അറിയിപ്പ്**: +ഈ രേഖ AI പരിഭാഷാ സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് പരിഭാഷപ്പെടുത്തിയതാണ്. ഞങ്ങൾ കൃത്യതയ്ക്കായി ശ്രമിക്കുന്നുവെങ്കിലും, ഓട്ടോമേറ്റഡ് പരിഭാഷകളിൽ പിഴവുകൾ അല്ലെങ്കിൽ തെറ്റായ വിവരങ്ങൾ ഉണ്ടാകാൻ സാധ്യതയുണ്ട്. അതിന്റെ സ്വാഭാവിക ഭാഷയിലുള്ള അസൽ രേഖയാണ് പ്രാമാണികമായ ഉറവിടമായി പരിഗണിക്കേണ്ടത്. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ പരിഭാഷ ശുപാർശ ചെയ്യുന്നു. ഈ പരിഭാഷ ഉപയോഗിച്ച് ഉണ്ടാകുന്ന തെറ്റിദ്ധാരണകൾ അല്ലെങ്കിൽ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കായി ഞങ്ങൾ ഉത്തരവാദികളല്ല. \ No newline at end of file diff --git a/translations/ml/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/ml/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index a53d280725..2e35689940 100644 --- a/translations/ml/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/ml/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -1,1497 +1,1502 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# മുൻപരിചയമുള്ള മോഡലുകളും ട്രാൻസ്ഫർ ലേണിംഗും\n", - "\n", - "CNN-കൾ പരിശീലിപ്പിക്കാൻ വളരെ സമയം വേണ്ടിവരും, കൂടാതെ അതിനായി വലിയ ഡാറ്റ ആവശ്യമാണ്. എന്നാൽ, ഒരു വലിയ ഭാഗം സമയം ചെലവഴിക്കുന്നത് ഒരു നെറ്റ്‌വർക്കിന്റെ ഏറ്റവും മികച്ച ലോ-ലെവൽ ഫിൽട്ടറുകൾ പഠിക്കാൻ ആണ്, അവ ചിത്രങ്ങളിൽ നിന്നുള്ള പാറ്റേണുകൾ എടുക്കാൻ ഉപയോഗിക്കുന്നു. ഒരു സ്വാഭാവികമായ ചോദ്യം ഉയരുന്നു - ഒരു ഡാറ്റാസെറ്റിൽ പരിശീലിപ്പിച്ച ഒരു ന്യൂറൽ നെറ്റ്‌വർക്ക് ഉപയോഗിച്ച്, പൂർണ്ണ പരിശീലന പ്രക്രിയയില്ലാതെ വ്യത്യസ്ത ചിത്രങ്ങൾ വർഗ്ഗീകരിക്കാൻ അതിനെ അനുയോജ്യമായി മാറ്റാമോ?\n", - "\n", - "ഈ സമീപനം **ട്രാൻസ്ഫർ ലേണിംഗ്** എന്ന് വിളിക്കുന്നു, കാരണം ഒരു ന്യൂറൽ നെറ്റ്‌വർക്ക് മോഡലിൽ നിന്നുള്ള ചില അറിവ് മറ്റൊരു മോഡലിലേക്ക് മാറ്റുന്നു. ട്രാൻസ്ഫർ ലേണിംഗിൽ, സാധാരണയായി, വലിയ ചിത്ര ഡാറ്റാസെറ്റിൽ, ഉദാഹരണത്തിന് **ImageNet**-ൽ, മുൻപരിചയമുള്ള ഒരു മോഡലിൽ നിന്ന് ആരംഭിക്കുന്നു. ആ മോഡലുകൾ സാധാരണ ചിത്രങ്ങളിൽ നിന്നുള്ള വ്യത്യസ്ത ഫീച്ചറുകൾ എടുക്കുന്നതിൽ ഇതിനകം നല്ല പ്രകടനം കാണിക്കുന്നു, പലപ്പോഴും ആ ഫീച്ചറുകളുടെ മുകളിൽ ഒരു ക്ലാസിഫയർ നിർമ്മിക്കുന്നത് നല്ല ഫലം നൽകും.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import tensorflow as tf\n", - "from tensorflow import keras\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - "import os\n", - "from tfcv import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## പൂച്ചകളും നായകളും ഡാറ്റാസെറ്റ്\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", - "\n", - "ഈ ഡാറ്റാസെറ്റ് ഡൗൺലോഡ് ചെയ്ത് `data` ഡയറക്ടറിയിൽ എക്സ്ട്രാക്റ്റ് ചെയ്യാം (ഈ പ്രക്രിയക്ക് കുറച്ച് സമയം എടുക്കാം!):\n" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "if not os.path.exists('data/kagglecatsanddogs_5340.zip'):\n", - " !wget -P data https://download.microsoft.com/download/3/E/1/3E1C3F21-ECDB-4869-8368-6DEBA77B919F/kagglecatsanddogs_5340.zip" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "import zipfile\n", - "if not os.path.exists('data/PetImages'):\n", - " with zipfile.ZipFile('data/kagglecatsanddogs_5340.zip', 'r') as zip_ref:\n", - " zip_ref.extractall('data')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "ദുരിതകരമായി, ഡാറ്റാസെറ്റിൽ ചില കുഴപ്പമുള്ള ഇമേജ് ഫയലുകൾ ഉണ്ട്. കുഴപ്പമുള്ള ഫയലുകൾ പരിശോധിക്കാൻ നമുക്ക് വേഗത്തിൽ ക്ലീനിംഗ് നടത്തേണ്ടതുണ്ട്. ഈ ട്യൂട്ടോറിയൽ നശിപ്പിക്കാതിരിക്കാൻ, ഡാറ്റാസെറ്റ് പരിശോധിക്കുന്ന കോഡ് ഒരു മോഡ്യൂളിലേക്ക് മാറ്റി.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Corrupt image or wrong format: data/PetImages/Cat/12235.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/2663.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/4929.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/8183.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/11083.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/6435.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/6491.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/7968.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/6768.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/11397.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/8295.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/4874.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/23.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/11864.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/3491.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/11729.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/3197.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/10874.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/6376.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/9361.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/9328.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/910.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/2021.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/666.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/3710.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/9171.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/6906.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/11095.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/660.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/8415.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/3161.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/850.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/7003.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/1267.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/7642.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/8553.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/6900.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/4334.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/10404.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/6980.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/936.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/9619.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/3300.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/7647.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/2742.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/9565.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/1757.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/11874.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/1936.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/5077.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/7845.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/8832.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/11935.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/9208.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/4322.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/7978.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/10820.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/391.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/10073.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/8958.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/8470.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/445.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/4821.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/11565.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/4351.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/4833.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/140.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/3153.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/5370.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/5819.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/3649.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/4293.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/3967.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/1937.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/10125.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/1386.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/4750.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/6029.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/5614.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/2569.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/9778.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/6486.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/11210.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/7502.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/2189.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/1151.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/4629.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/12080.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/10501.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/1914.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/11086.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/4000.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/9100.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/5553.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/12269.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/5243.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/3288.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/11912.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/3320.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/11166.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/8194.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/2353.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/9026.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/8557.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/7969.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/8693.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/4367.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/1900.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/5730.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/9961.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/8126.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/8521.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/11560.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/11233.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/11675.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/8889.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/9414.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/3588.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/10353.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/10733.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/6238.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/5618.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/7743.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/10747.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/6503.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/11410.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/5955.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/2915.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/3136.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/4086.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/2905.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/2494.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/3546.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/5547.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/9851.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/9188.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/4203.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/8715.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/4640.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/1866.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/7718.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/7514.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/1017.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/12102.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/296.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/6718.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/11253.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/10173.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/11849.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/10383.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/10678.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/5790.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/6318.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/1884.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/4654.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/9145.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/2479.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/12289.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/2688.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/4134.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/10637.jpg\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/anaconda/envs/py38_tensorflow/lib/python3.8/site-packages/PIL/TiffImagePlugin.py:793: UserWarning: Truncated File Read\n", - " warnings.warn(str(msg))\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Corrupt image or wrong format: data/PetImages/Dog/543.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/8730.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/12114.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/522.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/10863.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/10401.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/7739.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/561.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/1308.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/9643.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/3155.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/5736.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/4257.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/11853.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/6855.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/1259.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/7652.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/573.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/11702.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/414.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/4301.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/9500.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/10726.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/9367.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/2877.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/10907.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/10972.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/7311.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/10797.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/2317.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/7128.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/6500.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/11285.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/6430.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/6032.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/10969.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/8364.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/11692.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/3038.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/5604.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/565.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/9640.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/7459.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/6305.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/6555.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/11590.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/6059.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/3927.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/10705.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/2384.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/3885.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/663.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/9043.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/8563.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/9556.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/9967.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/10158.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/5263.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/8641.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/7369.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/4924.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/10351.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/6213.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/5104.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/1356.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/7133.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/7112.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/1168.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/719.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/50.jpg\n" - ] - } - ], - "source": [ - "check_image_dir('data/PetImages/Cat/*.jpg')\n", - "check_image_dir('data/PetImages/Dog/*.jpg')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## ഡാറ്റാസെറ്റ് ലോഡ് ചെയ്യൽ\n", - "\n", - "മുൻ ഉദാഹരണങ്ങളിൽ, നാം Keras-ൽ ഉൾപ്പെടുത്തിയിരിക്കുന്ന ഡാറ്റാസെറ്റുകൾ ലോഡ് ചെയ്തിരുന്നു. ഇപ്പോൾ നാം നമ്മുടെ സ്വന്തം ഡാറ്റാസെറ്റുമായി ഇടപഴകുകയാണ്, അത് ചിത്രങ്ങളുടെ ഒരു ഡയറക്ടറിയിൽ നിന്ന് ലോഡ് ചെയ്യേണ്ടതാണ്.\n", - "\n", - "യഥാർത്ഥ ജീവിതത്തിൽ, ചിത്ര ഡാറ്റാസെറ്റുകളുടെ വലിപ്പം വളരെ വലുതായിരിക്കാം, എല്ലാ ഡാറ്റയും മെമ്മറിയിൽ ഒതുക്കാൻ കഴിയുമെന്ന് ആശ്രയിക്കാനാകില്ല. അതിനാൽ, ഡാറ്റാസെറ്റുകൾ സാധാരണയായി ട്രെയിനിംഗിന് അനുയോജ്യമായ മിനിബാച്ചുകളായി ഡാറ്റ നൽകുന്ന **ജനറേറ്ററുകളായി** പ്രതിനിധീകരിക്കപ്പെടുന്നു.\n", - "\n", - "ചിത്ര വർഗ്ഗീകരണവുമായി ഇടപഴകാൻ, Keras പ്രത്യേക ഫംഗ്ഷൻ `image_dataset_from_directory` ഉൾപ്പെടുത്തിയിട്ടുണ്ട്, ഇത് വ്യത്യസ്ത ക്ലാസുകളുമായി ബന്ധപ്പെട്ട സബ് ഡയറക്ടറികളിൽ നിന്ന് ചിത്രങ്ങൾ ലോഡ് ചെയ്യാൻ കഴിയും. ഈ ഫംഗ്ഷൻ ചിത്രങ്ങളുടെ സ്കെയിലിംഗും കൈകാര്യം ചെയ്യുന്നു, കൂടാതെ ഡാറ്റാസെറ്റ് ട്രെയിൻ, ടെസ്റ്റ് ഉപസെറ്റുകളായി വിഭജിക്കാനും കഴിയും:\n" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Found 24769 files belonging to 2 classes.\n", - "Using 19816 files for training.\n", - "Found 24769 files belonging to 2 classes.\n", - "Using 4953 files for validation.\n" - ] - } - ], - "source": [ - "data_dir = 'data/PetImages'\n", - "batch_size = 64\n", - "ds_train = keras.preprocessing.image_dataset_from_directory(\n", - " data_dir,\n", - " validation_split = 0.2,\n", - " subset = 'training',\n", - " seed = 13,\n", - " image_size = (224,224),\n", - " batch_size = batch_size\n", - ")\n", - "ds_test = keras.preprocessing.image_dataset_from_directory(\n", - " data_dir,\n", - " validation_split = 0.2,\n", - " subset = 'validation',\n", - " seed = 13,\n", - " image_size = (224,224),\n", - " batch_size = batch_size\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "രണ്ടു കോൾസിനും ഒരേ `seed` മൂല്യം സജ്ജീകരിക്കുന്നത് പ്രധാനമാണ്, കാരണം ഇത് ട്രെയിൻ, ടെസ്റ്റ് ഡാറ്റാസെറ്റുകൾക്കിടയിലെ ചിത്രങ്ങളുടെ വിഭജനം ബാധിക്കുന്നു.\n", - "\n", - "ഡാറ്റാസെറ്റ് ഡയറക്ടറികളിൽ നിന്നാണ് ക്ലാസ് നാമങ്ങൾ സ്വയം എടുക്കുന്നത്, ആവശ്യമായാൽ നിങ്ങൾക്ക് അവയെ വിളിച്ച് ആക്‌സസ് ചെയ്യാം:\n" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['Cat', 'Dog']" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ds_train.class_names" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "നാം ലഭിച്ച ഡാറ്റാസെറ്റുകൾ മോഡൽ പരിശീലിപ്പിക്കാൻ നേരിട്ട് `fit` ഫംഗ്ഷനിലേക്ക് നൽകാം. അവയിൽ അനുയോജ്യമായ ചിത്രങ്ങളും ലേബലുകളും ഉൾപ്പെടുന്നു, ഇവയെ താഴെ കാണുന്ന ഘടന ഉപയോഗിച്ച് ലൂപ്പ് ചെയ്യാം:\n" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Training batch shape: features=(64, 224, 224, 3), labels=(64,)\n" - ] - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "for x,y in ds_train:\n", - " print(f\"Training batch shape: features={x.shape}, labels={y.shape}\")\n", - " x_sample, y_sample = x,y\n", - " break\n", - " \n", - "display_dataset(x_sample.numpy().astype(np.int),np.expand_dims(y_sample,1),classes=ds_train.class_names)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "> **കുറിപ്പ്**: ഡാറ്റാസെറ്റിലെ എല്ലാ ചിത്രങ്ങളും 0-255 പരിധിയിലുള്ള ഫ്ലോട്ടിംഗ് പോയിന്റ് ടെൻസറുകളായി പ്രതിനിധീകരിച്ചിരിക്കുന്നു. അവയെ ന്യൂറൽ നെറ്റ്‌വർക്കിലേക്ക് നൽകുന്നതിന് മുമ്പ്, ആ മൂല്യങ്ങളെ 0-1 പരിധിയിലേക്ക് സ്കെയിൽ ചെയ്യേണ്ടതുണ്ട്. ചിത്രങ്ങൾ പ്ലോട്ട് ചെയ്യുമ്പോൾ, അതേപോലെ ചെയ്യേണ്ടതോ, അല്ലെങ്കിൽ മൂല്യങ്ങളെ `int` തരം (മുകളിൽ കൊടുത്തിരിക്കുന്ന കോഡിൽ ചെയ്തതുപോലെ) ആയി മാറ്റേണ്ടതോ ഉണ്ട്, അതിലൂടെ `matplotlib`-ന് നാം അസ്കെയിൽ ചെയ്ത യഥാർത്ഥ ചിത്രം പ്ലോട്ട് ചെയ്യണമെന്ന് കാണിക്കാം.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## മുൻകൂട്ടി പരിശീലിപ്പിച്ച മോഡലുകൾ\n", - "\n", - "ചിത്ര വർഗ്ഗീകരണത്തിന് വേണ്ടിയുള്ള പല ജോലികൾക്കും മുൻകൂട്ടി പരിശീലിപ്പിച്ച ന്യൂറൽ നെറ്റ്‌വർക്ക് മോഡലുകൾ കണ്ടെത്താൻ കഴിയും. ആ മോഡലുകളിൽ പലതും `keras.applications` നെയിംസ്പേസിനുള്ളിൽ ലഭ്യമാണ്, കൂടാതെ ഇന്റർനെറ്റിൽ കൂടുതൽ മോഡലുകൾ ലഭ്യമാണ്. ഏറ്റവും ലളിതമായ VGG-16 മോഡൽ എങ്ങനെ ലോഡ് ചെയ്ത് ഉപയോഗിക്കാമെന്ന് നോക്കാം:\n" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Downloading data from https://storage.googleapis.com/tensorflow/keras-applications/vgg16/vgg16_weights_tf_dim_ordering_tf_kernels.h5\n", - "553467904/553467096 [==============================] - 6s 0us/step\n", - "Most probable class = [208]\n", - "Downloading data from https://storage.googleapis.com/download.tensorflow.org/data/imagenet_class_index.json\n", - "40960/35363 [==================================] - 0s 0us/step\n" - ] - }, - { - "data": { - "text/plain": [ - "[[('n02099712', 'Labrador_retriever', 0.5340957),\n", - " ('n02100236', 'German_short-haired_pointer', 0.0939442),\n", - " ('n02092339', 'Weimaraner', 0.08160535),\n", - " ('n02099849', 'Chesapeake_Bay_retriever', 0.057179328),\n", - " ('n02109047', 'Great_Dane', 0.03733857)]]" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "vgg = keras.applications.VGG16()\n", - "inp = keras.applications.vgg16.preprocess_input(x_sample[:1])\n", - "\n", - "res = vgg(inp)\n", - "print(f\"Most probable class = {tf.argmax(res,1)}\")\n", - "\n", - "keras.applications.vgg16.decode_predictions(res.numpy())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "ഇവിടെ ചില പ്രധാന കാര്യങ്ങളുണ്ട്:\n", - "* ഏതെങ്കിലും പ്രീ-ട്രെയിൻ ചെയ്ത നെറ്റ്‌വർക്കിലേക്ക് ഇൻപുട്ട് നൽകുന്നതിന് മുമ്പ് അത് ഒരു പ്രത്യേക രീതിയിൽ പ്രീ-പ്രോസസ് ചെയ്യണം. ഇത് ചെയ്യുന്നത് ബന്ധപ്പെട്ട `preprocess_input` ഫംഗ്ഷൻ വിളിച്ച് ആണ്, ഇത് ഒരു ബാച്ച് ചിത്രങ്ങൾ സ്വീകരിച്ച് അവയുടെ പ്രോസസ്സ് ചെയ്ത രൂപം തിരികെ നൽകുന്നു. VGG-16 ന്റെ കാര്യത്തിൽ, ചിത്രങ്ങൾ നോർമലൈസ് ചെയ്യപ്പെടുകയും ഓരോ ചാനലിനും മുൻകൂട്ടി നിർവചിച്ച ശരാശരി മൂല്യം കുറയ്ക്കപ്പെടുകയും ചെയ്യുന്നു. കാരണം VGG-16 യഥാർത്ഥത്തിൽ ഈ പ്രീ-പ്രോസസ്സിംഗ് ഉപയോഗിച്ച് പരിശീലിപ്പിക്കപ്പെട്ടതാണ്.\n", - "* ന്യുറൽ നെറ്റ്‌വർക്ക് ഇൻപുട്ട് ബാച്ചിൽ പ്രയോഗിക്കപ്പെടുന്നു, ഫലമായി ഓരോ ക്ലാസിന്റെയും സാധ്യത കാണിക്കുന്ന 1000-ഘടക ടENSOR ബാച്ച് ലഭിക്കുന്നു. ഈ ടENSOR-ൽ `argmax` വിളിച്ച് ഏറ്റവും സാധ്യതയുള്ള ക്ലാസ് നമ്പർ കണ്ടെത്താം.\n", - "* ലഭിച്ച ഫലം ഒരു [ImageNet ക്ലാസിന്റെ നമ്പർ](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a) ആണ്. ഈ ഫലത്തിന് അർത്ഥം നൽകാൻ, നാം `decode_predictions` ഫംഗ്ഷൻ ഉപയോഗിക്കാം, ഇത് ടോപ്പ് n ക്ലാസുകൾ അവരുടെ പേരുകളോടൊപ്പം തിരികെ നൽകുന്നു.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "വീജിജി-16 നെറ്റ്‌വർക്കിന്റെ ആർക്കിടെക്ചറും നോക്കാം:\n" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Model: \"vgg16\"\n", - "_________________________________________________________________\n", - "Layer (type) Output Shape Param # \n", - "=================================================================\n", - "input_1 (InputLayer) [(None, 224, 224, 3)] 0 \n", - "_________________________________________________________________\n", - "block1_conv1 (Conv2D) (None, 224, 224, 64) 1792 \n", - "_________________________________________________________________\n", - "block1_conv2 (Conv2D) (None, 224, 224, 64) 36928 \n", - "_________________________________________________________________\n", - "block1_pool (MaxPooling2D) (None, 112, 112, 64) 0 \n", - "_________________________________________________________________\n", - "block2_conv1 (Conv2D) (None, 112, 112, 128) 73856 \n", - "_________________________________________________________________\n", - "block2_conv2 (Conv2D) (None, 112, 112, 128) 147584 \n", - "_________________________________________________________________\n", - "block2_pool (MaxPooling2D) (None, 56, 56, 128) 0 \n", - "_________________________________________________________________\n", - "block3_conv1 (Conv2D) (None, 56, 56, 256) 295168 \n", - "_________________________________________________________________\n", - "block3_conv2 (Conv2D) (None, 56, 56, 256) 590080 \n", - "_________________________________________________________________\n", - "block3_conv3 (Conv2D) (None, 56, 56, 256) 590080 \n", - "_________________________________________________________________\n", - "block3_pool (MaxPooling2D) (None, 28, 28, 256) 0 \n", - "_________________________________________________________________\n", - "block4_conv1 (Conv2D) (None, 28, 28, 512) 1180160 \n", - "_________________________________________________________________\n", - "block4_conv2 (Conv2D) (None, 28, 28, 512) 2359808 \n", - "_________________________________________________________________\n", - "block4_conv3 (Conv2D) (None, 28, 28, 512) 2359808 \n", - "_________________________________________________________________\n", - "block4_pool (MaxPooling2D) (None, 14, 14, 512) 0 \n", - "_________________________________________________________________\n", - "block5_conv1 (Conv2D) (None, 14, 14, 512) 2359808 \n", - "_________________________________________________________________\n", - "block5_conv2 (Conv2D) (None, 14, 14, 512) 2359808 \n", - "_________________________________________________________________\n", - "block5_conv3 (Conv2D) (None, 14, 14, 512) 2359808 \n", - "_________________________________________________________________\n", - "block5_pool (MaxPooling2D) (None, 7, 7, 512) 0 \n", - "_________________________________________________________________\n", - "flatten (Flatten) (None, 25088) 0 \n", - "_________________________________________________________________\n", - "fc1 (Dense) (None, 4096) 102764544 \n", - "_________________________________________________________________\n", - "fc2 (Dense) (None, 4096) 16781312 \n", - "_________________________________________________________________\n", - "predictions (Dense) (None, 1000) 4097000 \n", - "=================================================================\n", - "Total params: 138,357,544\n", - "Trainable params: 138,357,544\n", - "Non-trainable params: 0\n", - "_________________________________________________________________\n" - ] - } - ], - "source": [ - "vgg.summary()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## GPU കണക്കുകൂട്ടലുകൾ\n", - "\n", - "VGG-16 പോലുള്ള ഡീപ്പ് ന്യൂറൽ നെറ്റ്വർക്കുകളും മറ്റ് ആധുനിക ആർക്കിടെക്ചറുകളും പ്രവർത്തിക്കാൻ വളരെ അധികം കണക്കുകൂട്ടൽ ശേഷി ആവശ്യമാണ്. GPU ആക്സിലറേഷൻ ലഭ്യമായാൽ അത് ഉപയോഗിക്കുന്നത് യുക്തിയുള്ളതാണ്. ഭാഗ്യവശാൽ, Keras GPU ലഭ്യമായാൽ കണക്കുകൂട്ടലുകൾ സ്വയം വേഗത്തിലാക്കുന്നു. Tensorflow GPU ഉപയോഗിക്കാൻ കഴിയുന്നുണ്ടോ എന്ന് താഴെ കൊടുത്തിരിക്കുന്ന കോഡ് ഉപയോഗിച്ച് പരിശോധിക്കാം:\n" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "tf.config.list_physical_devices('GPU')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## VGG ഫീച്ചറുകൾ എടുക്കൽ\n", - "\n", - "നമ്മുടെ ചിത്രങ്ങളിൽ നിന്ന് ഫീച്ചറുകൾ എടുക്കാൻ VGG-16 ഉപയോഗിക്കണമെങ്കിൽ, അവസാന ക്ലാസിഫിക്കേഷൻ ലെയറുകൾ ഇല്ലാത്ത മോഡൽ വേണം. ടോപ്പ് ലെയറുകൾ ഇല്ലാതെ VGG-16 മോഡൽ സൃഷ്ടിക്കാൻ ഈ കോഡ് ഉപയോഗിക്കാം:\n" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Shape after applying VGG-16: (7, 7, 512)\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "vgg = keras.applications.VGG16(include_top=False)\n", - "\n", - "inp = keras.applications.vgg16.preprocess_input(x_sample[:1])\n", - "res = vgg(inp)\n", - "print(f\"Shape after applying VGG-16: {res[0].shape}\")\n", - "plt.figure(figsize=(15,3))\n", - "plt.imshow(res[0].numpy().reshape(-1,512))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "ഫീച്ചർ ടെൻസറിന്റെ അളവ് 7x7x512 ആണ്, പക്ഷേ അതിനെ ദൃശ്യവൽക്കരിക്കാൻ 2D രൂപത്തിലേക്ക് പുനഃരൂപീകരിക്കേണ്ടി വന്നു.\n", - "\n", - "ഇപ്പോൾ ആ ഫീച്ചറുകൾ ചിത്രങ്ങൾ വർഗ്ഗീകരിക്കാൻ ഉപയോഗിക്കാമോ എന്ന് നോക്കാം. ചില ചിത്രങ്ങളുടെ ഭാഗം (നമ്മുടെ കേസിൽ 50 മിനിബാച്ചുകൾ) കൈമാറി, അവയുടെ ഫീച്ചർ വെക്ടറുകൾ മുൻകൂട്ടി കണക്കാക്കാം. അതിന് Tensorflow **dataset** API ഉപയോഗിക്കാം. `map` ഫംഗ്ഷൻ ഒരു dataset എടുത്ത് നൽകിയ ലാംബ്ഡാ ഫംഗ്ഷൻ പ്രയോഗിച്ച് അതിനെ മാറ്റുന്നു. ഈ സംവിധാനം ഉപയോഗിച്ച്, VGG-നാൽ എക്സ്ട്രാക്റ്റ് ചെയ്ത ഫീച്ചറുകൾ അടങ്ങിയ പുതിയ dataset-കൾ, `ds_features_train` ഉം `ds_features_test` ഉം നിർമ്മിക്കുന്നു, അവിടെ യഥാർത്ഥ ചിത്രങ്ങൾക്കുപകരം ഫീച്ചറുകൾ ഉൾപ്പെടുന്നു.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(64, 7, 7, 512) (64,)\n" - ] - } - ], - "source": [ - "num = batch_size*50\n", - "ds_features_train = ds_train.take(50).map(lambda x,y : (vgg(x),y))\n", - "ds_features_test = ds_test.take(10).map(lambda x,y : (vgg(x),y))\n", - "\n", - "for x,y in ds_features_train:\n", - " print(x.shape,y.shape)\n", - " break" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "നാം ഡാറ്റാസെറ്റ് വലിപ്പം പരിമിതപ്പെടുത്താൻ `.take(50)` എന്ന കൺസ്ട്രക്ഷൻ ഉപയോഗിച്ചു, നമ്മുടെ പ്രദർശനം വേഗത്തിലാക്കാൻ. നിങ്ങൾക്ക് തീർച്ചയായും ഈ പരീക്ഷണം പൂർണ്ണ ഡാറ്റാസെറ്റിൽ നടത്താം.\n", - "\n", - "ഇപ്പോൾ നമുക്ക് എക്സ്ട്രാക്റ്റ് ചെയ്ത ഫീച്ചറുകളുള്ള ഒരു ഡാറ്റാസെറ്റ് ഉണ്ടാകുമ്പോൾ, പൂച്ചകളും നായകളും വേർതിരിക്കാൻ ഒരു ലളിതമായ ഡെൻസ് ക്ലാസിഫയർ പരിശീലിപ്പിക്കാം. ഈ നെറ്റ്‌വർക്ക് (7,7,512) ആകൃതിയിലുള്ള ഫീച്ചർ വെക്ടർ സ്വീകരിച്ച്, നായയോ പൂച്ചയോ ആയ ഒരു ഔട്ട്പുട്ട് നൽകും. ഇത് ബൈനറി ക്ലാസിഫിക്കേഷൻ ആയതിനാൽ, `sigmoid` ആക്ടിവേഷൻ ഫംഗ്ഷനും `binary_crossentropy` ലോസ്സും ഉപയോഗിക്കുന്നു.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "50/50 [==============================] - 1896s 38s/step - loss: 1.4845 - acc: 0.9144 - val_loss: 0.7220 - val_acc: 0.9516\n" - ] - } - ], - "source": [ - "model = keras.models.Sequential([\n", - " keras.layers.Flatten(input_shape=(7,7,512)),\n", - " keras.layers.Dense(1,activation='sigmoid')\n", - "])\n", - "model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc'])\n", - "hist = model.fit(ds_features_train, validation_data=ds_features_test)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "ഫലം മികച്ചതാണ്, പൂച്ചയും നായയും ഏകദേശം 95% സാധ്യതയോടെ വേർതിരിക്കാൻ കഴിയും! എന്നാൽ, മാനുവൽ ഫീച്ചർ എക്സ്ട്രാക്ഷൻ വളരെ സമയം എടുക്കുന്നുണ്ടെന്ന് തോന്നുന്നതിനാൽ, ഞങ്ങൾ ഈ സമീപനം എല്ലാ ചിത്രങ്ങളിലേക്കും പരീക്ഷിച്ചിട്ടില്ല, വെറും ഒരു ഉപസമൂഹത്തിൽ മാത്രമാണ് പരീക്ഷിച്ചത്.\n", - "\n", - "## ഒരു VGG നെറ്റ്‌വർക്കിനെ ഉപയോഗിച്ച് ട്രാൻസ്ഫർ ലേണിംഗ്\n", - "\n", - "മാനുവൽ ആയി ഫീച്ചറുകൾ മുൻകൂട്ടി കണക്കാക്കാതെ, ട്രെയിനിംഗിനിടെ മുഴുവൻ ഒറിജിനൽ VGG-16 നെറ്റ്‌വർക്ക് ഉപയോഗിച്ച്, ഫീച്ചർ എക്സ്ട്രാക്ടറെ ആദ്യ ലെയറായി ഞങ്ങളുടെ നെറ്റ്‌വർക്കിൽ ചേർക്കാം.\n", - "\n", - "Keras ആർക്കിടെക്ചറിന്റെ സുന്ദരത ഇതാണ്: മുകളിൽ നിർവചിച്ച VGG-16 മോഡൽ മറ്റൊരു ന്യൂറൽ നെറ്റ്‌വർക്കിൽ ഒരു ലെയറായി ഉപയോഗിക്കാം! അതിന് മുകളിൽ ഡെൻസ് ക്ലാസിഫയർ ചേർത്ത്, പിന്നീടു ബാക്ക് പ്രൊപ്പഗേഷൻ ഉപയോഗിച്ച് മുഴുവൻ നെറ്റ്‌വർക്ക് ട്രെയിൻ ചെയ്യാം.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Model: \"sequential\"\n", - "_________________________________________________________________\n", - "Layer (type) Output Shape Param # \n", - "=================================================================\n", - "vgg16 (Functional) (None, 7, 7, 512) 14714688 \n", - "_________________________________________________________________\n", - "flatten (Flatten) (None, 25088) 0 \n", - "_________________________________________________________________\n", - "dense (Dense) (None, 1) 25089 \n", - "=================================================================\n", - "Total params: 14,739,777\n", - "Trainable params: 25,089\n", - "Non-trainable params: 14,714,688\n", - "_________________________________________________________________\n" - ] - } - ], - "source": [ - "model = keras.models.Sequential()\n", - "model.add(keras.applications.VGG16(include_top=False,input_shape=(224,224,3)))\n", - "model.add(keras.layers.Flatten())\n", - "model.add(keras.layers.Dense(1,activation='sigmoid'))\n", - "\n", - "model.layers[0].trainable = False\n", - "\n", - "model.summary()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "ഈ മോഡൽ ഒരു end-to-end ക്ലാസിഫിക്കേഷൻ നെറ്റ്‌വർക്കിനെപ്പോലെ ആണ്, ഒരു ചിത്രം എടുത്ത് ക്ലാസ് തിരിച്ചറിയുന്നു. എന്നാൽ, സങ്കീർണ്ണമായ കാര്യം എന്തെന്നാൽ, VGG16-നെ ഫീച്ചർ എക്സ്ട്രാക്ടറായി ഉപയോഗിക്കണം, പുനഃപരിശീലനം നടത്തേണ്ടതില്ല. അതിനാൽ, convolutional ഫീച്ചർ എക്സ്ട്രാക്ടറിന്റെ വെയ്റ്റുകൾ **ഫ്രീസ് ചെയ്യേണ്ടതാണ്**. നെറ്റ്‌വർക്കിന്റെ ആദ്യ ലെയർ `model.layers[0]` എന്ന കോൾ വഴി ആക്‌സസ് ചെയ്യാം, പിന്നെ `trainable` പ്രോപ്പർട്ടി `False` ആയി സജ്ജീകരിക്കണം.\n", - "\n", - "> **Note**: ഫീച്ചർ എക്സ്ട്രാക്ടർ വെയ്റ്റുകൾ ഫ്രീസ് ചെയ്യുന്നത് അത്യാവശ്യമാണ്, കാരണം അല്ലെങ്കിൽ പരിശീലനമില്ലാത്ത ക്ലാസിഫയർ ലെയർ convolutional എക്സ്ട്രാക്ടറിന്റെ മുൻപരിശീലിത വെയ്റ്റുകൾ നശിപ്പിക്കാം.\n", - "\n", - "നമ്മുടെ നെറ്റ്‌വർക്കിലെ മൊത്തം പാരാമീറ്ററുകളുടെ എണ്ണം ഏകദേശം 15 മില്യൺ ആണെങ്കിലും, നാം വെറും 25,000 പാരാമീറ്ററുകൾ മാത്രമാണ് പരിശീലിപ്പിക്കുന്നത് എന്ന് ശ്രദ്ധിക്കാം. മുകളിൽ ഉള്ള convolutional ഫിൽട്ടറുകളുടെ മറ്റ് എല്ലാ പാരാമീറ്ററുകളും മുൻപരിശീലിതമാണ്. ഇത് നല്ലതാണ്, കാരണം കുറച്ച് ഉദാഹരണങ്ങളോടെ കുറച്ച് പാരാമീറ്ററുകൾ ഫൈൻ-ട്യൂൺ ചെയ്യാൻ സാധിക്കുന്നു.\n", - "\n", - "ഇപ്പോൾ നാം നമ്മുടെ നെറ്റ്‌വർക്ക് പരിശീലിപ്പിച്ച് എത്രത്തോളം നല്ലത് ആകാമെന്ന് നോക്കാം. പ്രവർത്തനം കുറച്ച് സമയം നീണ്ടേക്കാം എന്ന് പ്രതീക്ഷിക്കുക, ചിലപ്പോൾ പ്രവർത്തനം നിർത്തിയിരിക്കുന്നതുപോലെ തോന്നിയാലും ആശങ്കപ്പെടേണ്ടതില്ല.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "310/310 [==============================] - 265s 716ms/step - loss: 0.9917 - acc: 0.9512 - val_loss: 0.8156 - val_acc: 0.9671\n" - ] - } - ], - "source": [ - "model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc'])\n", - "hist = model.fit(ds_train, validation_data=ds_test)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "നമുക്ക് ശരാശരി കൃത്യതയുള്ള പൂച്ചകളും നായകളും തിരിച്ചറിയുന്ന ക്ലാസിഫയർ ലഭിച്ചിരിക്കുന്നു എന്ന് തോന്നുന്നു!\n", - "\n", - "## മോഡൽ സേവ് ചെയ്യലും ലോഡ് ചെയ്യലും\n", - "\n", - "മോഡൽ പരിശീലിപ്പിച്ചതിനു ശേഷം, ഭാവിയിൽ ഉപയോഗിക്കാനായി മോഡൽ ആർക്കിടെക്ചറും പരിശീലിപ്പിച്ച വെയ്റ്റുകളും ഒരു ഫയലിൽ സേവ് ചെയ്യാം:\n" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "INFO:tensorflow:Assets written to: data/cats_dogs.tf/assets\n" - ] - } - ], - "source": [ - "model.save('data/cats_dogs.tf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "നാം പിന്നീട് മോഡൽ ഫയലിൽ നിന്ന് എപ്പോൾ വേണമെങ്കിലും ലോഡ് ചെയ്യാൻ കഴിയും. അടുത്ത പരീക്ഷണം മോഡൽ നശിപ്പിച്ചാൽ ഇത് ഉപകാരപ്രദമായിരിക്കാം - നിങ്ങൾക്ക് തുടക്കം മുതൽ വീണ്ടും തുടങ്ങേണ്ടതില്ല.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "model = keras.models.load_model('data/cats_dogs.tf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## ഫൈൻ-ട്യൂണിംഗ് ട്രാൻസ്ഫർ ലേണിംഗ്\n", - "\n", - "മുൻവഭാഗത്തിൽ, ഞങ്ങൾ നമ്മുടെ സ്വന്തം ഡാറ്റാസെറ്റിലെ ചിത്രങ്ങൾ ക്ലാസിഫൈ ചെയ്യാൻ അവസാന ക്ലാസിഫയർ ലെയർ പരിശീലിപ്പിച്ചു. എന്നാൽ, ഫീച്ചർ എക്സ്ട്രാക്ടറെ പുനർപരിശീലനം ചെയ്തില്ല, ഞങ്ങളുടെ മോഡൽ ImageNet ഡാറ്റയിൽ മോഡൽ പഠിച്ച ഫീച്ചറുകളിലാണ് ആശ്രയിച്ചിരിക്കുന്നത്. നിങ്ങളുടെ വസ്തുക്കൾ സാധാരണ ImageNet ചിത്രങ്ങളിൽ നിന്ന് ദൃശ്യപരമായി വ്യത്യസ്തമാണെങ്കിൽ, ഈ ഫീച്ചറുകളുടെ സംയോജനം ഏറ്റവും നല്ലതായിരിക്കില്ല. അതിനാൽ കോൺവല്യൂഷണൽ ലെയറുകളും പരിശീലിപ്പിക്കാൻ തുടങ്ങുന്നത് യുക്തിയുള്ളതാണ്.\n", - "\n", - "അത് ചെയ്യാൻ, മുമ്പ് ഫ്രോസൺ ചെയ്ത കോൺവല്യൂഷണൽ ഫിൽട്ടർ പാരാമീറ്ററുകൾ അൺഫ്രീസ് ചെയ്യാം.\n", - "\n", - "> **Note:** പാരാമീറ്ററുകൾ ആദ്യം ഫ്രീസ് ചെയ്ത് ക്ലാസിഫിക്കേഷൻ ലെയറിലെ വെയ്റ്റുകൾ സ്ഥിരതയാർജ്ജിക്കാൻ കുറച്ച് എപ്പോക്കുകൾ പരിശീലനം നടത്തുന്നത് പ്രധാനമാണ്. പാരാമീറ്ററുകൾ അൺഫ്രീസ് ചെയ്ത നിലയിൽ ഉടൻ തന്നെ എൻഡ്-ടു-എൻഡ് നെറ്റ്‌വർക്ക് പരിശീലിപ്പിക്കാൻ തുടങ്ങുകയാണെങ്കിൽ, വലിയ പിശകുകൾ കോൺവല്യൂഷണൽ ലെയറുകളിലെ മുൻപരിശീലിത വെയ്റ്റുകൾ നശിപ്പിക്കാനുള്ള സാധ്യത കൂടുതലാണ്.\n", - "\n", - "ഞങ്ങളുടെ കോൺവല്യൂഷണൽ VGG-16 മോഡൽ ആദ്യ ലെയറിനുള്ളിൽ സ്ഥിതിചെയ്യുന്നു, അത് തന്നെ നിരവധി ലെയറുകൾ അടങ്ങിയതാണ്. അതിന്റെ ഘടന നോക്കാം:\n" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Model: \"vgg16\"\n", - "_________________________________________________________________\n", - "Layer (type) Output Shape Param # \n", - "=================================================================\n", - "input_1 (InputLayer) [(None, 224, 224, 3)] 0 \n", - "_________________________________________________________________\n", - "block1_conv1 (Conv2D) (None, 224, 224, 64) 1792 \n", - "_________________________________________________________________\n", - "block1_conv2 (Conv2D) (None, 224, 224, 64) 36928 \n", - "_________________________________________________________________\n", - "block1_pool (MaxPooling2D) (None, 112, 112, 64) 0 \n", - "_________________________________________________________________\n", - "block2_conv1 (Conv2D) (None, 112, 112, 128) 73856 \n", - "_________________________________________________________________\n", - "block2_conv2 (Conv2D) (None, 112, 112, 128) 147584 \n", - "_________________________________________________________________\n", - "block2_pool (MaxPooling2D) (None, 56, 56, 128) 0 \n", - "_________________________________________________________________\n", - "block3_conv1 (Conv2D) (None, 56, 56, 256) 295168 \n", - "_________________________________________________________________\n", - "block3_conv2 (Conv2D) (None, 56, 56, 256) 590080 \n", - "_________________________________________________________________\n", - "block3_conv3 (Conv2D) (None, 56, 56, 256) 590080 \n", - "_________________________________________________________________\n", - "block3_pool (MaxPooling2D) (None, 28, 28, 256) 0 \n", - "_________________________________________________________________\n", - "block4_conv1 (Conv2D) (None, 28, 28, 512) 1180160 \n", - "_________________________________________________________________\n", - "block4_conv2 (Conv2D) (None, 28, 28, 512) 2359808 \n", - "_________________________________________________________________\n", - "block4_conv3 (Conv2D) (None, 28, 28, 512) 2359808 \n", - "_________________________________________________________________\n", - "block4_pool (MaxPooling2D) (None, 14, 14, 512) 0 \n", - "_________________________________________________________________\n", - "block5_conv1 (Conv2D) (None, 14, 14, 512) 2359808 \n", - "_________________________________________________________________\n", - "block5_conv2 (Conv2D) (None, 14, 14, 512) 2359808 \n", - "_________________________________________________________________\n", - "block5_conv3 (Conv2D) (None, 14, 14, 512) 2359808 \n", - "_________________________________________________________________\n", - "block5_pool (MaxPooling2D) (None, 7, 7, 512) 0 \n", - "=================================================================\n", - "Total params: 14,714,688\n", - "Trainable params: 0\n", - "Non-trainable params: 14,714,688\n", - "_________________________________________________________________\n" - ] - } - ], - "source": [ - "model.layers[0].summary()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "നാം കോൺവല്യൂഷണൽ ബേസ് എല്ലാ ലെയറുകളും അൺഫ്രീസ് ചെയ്യാൻ കഴിയും:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "model.layers[0].trainable = True" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "എങ്കിലും, എല്ലാം ഒരുമിച്ച് അൺഫ്രീസ് ചെയ്യുന്നത് ഏറ്റവും നല്ല ആശയമല്ല. നമ്മുടെ ചിത്രങ്ങൾക്ക് പ്രസക്തമായ ഉയർന്ന തലത്തിലുള്ള പാറ്റേണുകൾ അടങ്ങിയിരിക്കുന്നതിനാൽ ആദ്യം ചില അവസാന കോൺവല്യൂഷൻ ലെയറുകൾ മാത്രം അൺഫ്രീസ് ചെയ്യാം. ഉദാഹരണത്തിന്, ആദ്യം, അവസാന 4 ലെയറുകൾ ഒഴികെ എല്ലാ ലെയറുകളും ഫ്രീസ് ചെയ്യാം:\n" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Model: \"sequential\"\n", - "_________________________________________________________________\n", - "Layer (type) Output Shape Param # \n", - "=================================================================\n", - "vgg16 (Functional) (None, 7, 7, 512) 14714688 \n", - "_________________________________________________________________\n", - "flatten (Flatten) (None, 25088) 0 \n", - "_________________________________________________________________\n", - "dense (Dense) (None, 1) 25089 \n", - "=================================================================\n", - "Total params: 14,739,777\n", - "Trainable params: 7,104,513\n", - "Non-trainable params: 7,635,264\n", - "_________________________________________________________________\n" - ] - } - ], - "source": [ - "for i in range(len(model.layers[0].layers)-4):\n", - " model.layers[0].layers[i].trainable = False\n", - "model.summary()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "പരിശീലനയോഗ്യമായ പാരാമീറ്ററുകളുടെ എണ്ണം ഗണ്യമായി വർദ്ധിച്ചുവെന്ന് ശ്രദ്ധിക്കുക, എന്നാൽ ഇത് എല്ലാപാരാമീറ്ററുകളുടെ ഏകദേശം 50% മാത്രമാണ്.\n", - "\n", - "അൺഫ്രീസ് ചെയ്തശേഷം, നാം കുറച്ച് കൂടുതൽ എപ്പോക്കുകൾ പരിശീലനം നടത്താം (നമ്മുടെ ഉദാഹരണത്തിൽ, നാം ഒരു എപ്പോക്ക് മാത്രം നടത്തും). മുൻപരിചയമുള്ള വെയ്റ്റുകളിലെ സ്വാധീനം കുറയ്ക്കാൻ താഴ്ന്ന ലേണിംഗ് റേറ്റ് തിരഞ്ഞെടുക്കാം. എങ്കിലും, കുറഞ്ഞ ലേണിംഗ് റേറ്റിനൊപ്പം പോലും, പരിശീലനത്തിന്റെ തുടക്കത്തിൽ കൃത്യത കുറയുമെന്ന് പ്രതീക്ഷിക്കാം, പിന്നീട് സ്ഥിരമായ വെയ്റ്റുകളേക്കാൾ അല്പം ഉയർന്ന നിലയിൽ എത്തും.\n", - "\n", - "> **Note:** ഈ പരിശീലനം വളരെ മന്ദഗതിയിലാണ് നടക്കുന്നത്, കാരണം നമുക്ക് നെറ്റ്‌വർക്കിലെ നിരവധി ലെയറുകളിലൂടെ ഗ്രേഡിയന്റുകൾ തിരിച്ചടക്കേണ്ടതുണ്ട്!\n" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "310/310 [==============================] - 201s 645ms/step - loss: 0.5270 - acc: 0.9776 - val_loss: 1.4132 - val_acc: 0.9653\n" - ] - } - ], - "source": [ - "hist = model.fit(ds_train, validation_data=ds_test)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "നാം കൂടുതൽ പാരാമീറ്ററുകളുള്ള ശക്തമായ നെറ്റ്‌വർക്ക് ഉപയോഗിക്കുന്നതിനാൽ പരിശീലന കൃത്യത കൂടുതലാകാൻ സാധ്യതയുണ്ട്, എന്നാൽ സാധുവായ കൃത്യത അത്ര കൂടുതലാകില്ല.\n", - "\n", - "നിങ്ങൾക്ക് കൂടുതൽ കൃത്യത നേടാൻ കഴിയുന്നുണ്ടോ എന്ന് പരിശോധിക്കാൻ നെറ്റ്‌വർക്കിന്റെ കുറച്ച് കൂടുതൽ ലെയറുകൾ അൺഫ്രീസ് ചെയ്ത് കൂടുതൽ പരിശീലനം നടത്താൻ മടിക്കേണ്ട.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## മറ്റ് കമ്പ്യൂട്ടർ വിഷൻ മോഡലുകൾ\n", - "\n", - "VGG-16 ഏറ്റവും ലളിതമായ കമ്പ്യൂട്ടർ വിഷൻ ആർക്കിടെക്ചറുകളിൽ ഒന്നാണ്. Keras നിരവധി മുൻകൂട്ടി പരിശീലിച്ച നെറ്റ്വർക്കുകൾ നൽകുന്നു. അവയിൽ ഏറ്റവും വ്യാപകമായി ഉപയോഗിക്കുന്നവയാണ് Microsoft വികസിപ്പിച്ച **ResNet** ആർക്കിടെക്ചറുകളും Googleയുടെ **Inception** മോഡലും. ഉദാഹരണത്തിന്, ഏറ്റവും ലളിതമായ ResNet-50 മോഡലിന്റെ ആർക്കിടെക്ചർ പരിശോധിക്കാം (ResNet വ്യത്യസ്ത ആഴമുള്ള മോഡലുകളുടെ ഒരു കുടുംബമാണ്, നിങ്ങൾക്ക് ResNet-152 പരീക്ഷിച്ച് വളരെ ആഴമുള്ള മോഡൽ എങ്ങനെയാണെന്ന് കാണാം):\n" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Model: \"resnet50\"\n", - "__________________________________________________________________________________________________\n", - "Layer (type) Output Shape Param # Connected to \n", - "==================================================================================================\n", - "input_3 (InputLayer) [(None, 224, 224, 3) 0 \n", - "__________________________________________________________________________________________________\n", - "conv1_pad (ZeroPadding2D) (None, 230, 230, 3) 0 input_3[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv1_conv (Conv2D) (None, 112, 112, 64) 9472 conv1_pad[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv1_bn (BatchNormalization) (None, 112, 112, 64) 256 conv1_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv1_relu (Activation) (None, 112, 112, 64) 0 conv1_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "pool1_pad (ZeroPadding2D) (None, 114, 114, 64) 0 conv1_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "pool1_pool (MaxPooling2D) (None, 56, 56, 64) 0 pool1_pad[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block1_1_conv (Conv2D) (None, 56, 56, 64) 4160 pool1_pool[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block1_1_bn (BatchNormali (None, 56, 56, 64) 256 conv2_block1_1_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block1_1_relu (Activation (None, 56, 56, 64) 0 conv2_block1_1_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block1_2_conv (Conv2D) (None, 56, 56, 64) 36928 conv2_block1_1_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block1_2_bn (BatchNormali (None, 56, 56, 64) 256 conv2_block1_2_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block1_2_relu (Activation (None, 56, 56, 64) 0 conv2_block1_2_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block1_0_conv (Conv2D) (None, 56, 56, 256) 16640 pool1_pool[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block1_3_conv (Conv2D) (None, 56, 56, 256) 16640 conv2_block1_2_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block1_0_bn (BatchNormali (None, 56, 56, 256) 1024 conv2_block1_0_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block1_3_bn (BatchNormali (None, 56, 56, 256) 1024 conv2_block1_3_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block1_add (Add) (None, 56, 56, 256) 0 conv2_block1_0_bn[0][0] \n", - " conv2_block1_3_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block1_out (Activation) (None, 56, 56, 256) 0 conv2_block1_add[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block2_1_conv (Conv2D) (None, 56, 56, 64) 16448 conv2_block1_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block2_1_bn (BatchNormali (None, 56, 56, 64) 256 conv2_block2_1_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block2_1_relu (Activation (None, 56, 56, 64) 0 conv2_block2_1_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block2_2_conv (Conv2D) (None, 56, 56, 64) 36928 conv2_block2_1_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block2_2_bn (BatchNormali (None, 56, 56, 64) 256 conv2_block2_2_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block2_2_relu (Activation (None, 56, 56, 64) 0 conv2_block2_2_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block2_3_conv (Conv2D) (None, 56, 56, 256) 16640 conv2_block2_2_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block2_3_bn (BatchNormali (None, 56, 56, 256) 1024 conv2_block2_3_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block2_add (Add) (None, 56, 56, 256) 0 conv2_block1_out[0][0] \n", - " conv2_block2_3_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block2_out (Activation) (None, 56, 56, 256) 0 conv2_block2_add[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block3_1_conv (Conv2D) (None, 56, 56, 64) 16448 conv2_block2_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block3_1_bn (BatchNormali (None, 56, 56, 64) 256 conv2_block3_1_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block3_1_relu (Activation (None, 56, 56, 64) 0 conv2_block3_1_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block3_2_conv (Conv2D) (None, 56, 56, 64) 36928 conv2_block3_1_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block3_2_bn (BatchNormali (None, 56, 56, 64) 256 conv2_block3_2_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block3_2_relu (Activation (None, 56, 56, 64) 0 conv2_block3_2_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block3_3_conv (Conv2D) (None, 56, 56, 256) 16640 conv2_block3_2_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block3_3_bn (BatchNormali (None, 56, 56, 256) 1024 conv2_block3_3_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block3_add (Add) (None, 56, 56, 256) 0 conv2_block2_out[0][0] \n", - " conv2_block3_3_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block3_out (Activation) (None, 56, 56, 256) 0 conv2_block3_add[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block1_1_conv (Conv2D) (None, 28, 28, 128) 32896 conv2_block3_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block1_1_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block1_1_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block1_1_relu (Activation (None, 28, 28, 128) 0 conv3_block1_1_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block1_2_conv (Conv2D) (None, 28, 28, 128) 147584 conv3_block1_1_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block1_2_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block1_2_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block1_2_relu (Activation (None, 28, 28, 128) 0 conv3_block1_2_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block1_0_conv (Conv2D) (None, 28, 28, 512) 131584 conv2_block3_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block1_3_conv (Conv2D) (None, 28, 28, 512) 66048 conv3_block1_2_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block1_0_bn (BatchNormali (None, 28, 28, 512) 2048 conv3_block1_0_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block1_3_bn (BatchNormali (None, 28, 28, 512) 2048 conv3_block1_3_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block1_add (Add) (None, 28, 28, 512) 0 conv3_block1_0_bn[0][0] \n", - " conv3_block1_3_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block1_out (Activation) (None, 28, 28, 512) 0 conv3_block1_add[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block2_1_conv (Conv2D) (None, 28, 28, 128) 65664 conv3_block1_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block2_1_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block2_1_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block2_1_relu (Activation (None, 28, 28, 128) 0 conv3_block2_1_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block2_2_conv (Conv2D) (None, 28, 28, 128) 147584 conv3_block2_1_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block2_2_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block2_2_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block2_2_relu (Activation (None, 28, 28, 128) 0 conv3_block2_2_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block2_3_conv (Conv2D) (None, 28, 28, 512) 66048 conv3_block2_2_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block2_3_bn (BatchNormali (None, 28, 28, 512) 2048 conv3_block2_3_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block2_add (Add) (None, 28, 28, 512) 0 conv3_block1_out[0][0] \n", - " conv3_block2_3_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block2_out (Activation) (None, 28, 28, 512) 0 conv3_block2_add[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block3_1_conv (Conv2D) (None, 28, 28, 128) 65664 conv3_block2_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block3_1_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block3_1_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block3_1_relu (Activation (None, 28, 28, 128) 0 conv3_block3_1_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block3_2_conv (Conv2D) (None, 28, 28, 128) 147584 conv3_block3_1_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block3_2_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block3_2_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block3_2_relu (Activation (None, 28, 28, 128) 0 conv3_block3_2_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block3_3_conv (Conv2D) (None, 28, 28, 512) 66048 conv3_block3_2_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block3_3_bn (BatchNormali (None, 28, 28, 512) 2048 conv3_block3_3_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block3_add (Add) (None, 28, 28, 512) 0 conv3_block2_out[0][0] \n", - " conv3_block3_3_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block3_out (Activation) (None, 28, 28, 512) 0 conv3_block3_add[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block4_1_conv (Conv2D) (None, 28, 28, 128) 65664 conv3_block3_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block4_1_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block4_1_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block4_1_relu (Activation (None, 28, 28, 128) 0 conv3_block4_1_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block4_2_conv (Conv2D) (None, 28, 28, 128) 147584 conv3_block4_1_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block4_2_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block4_2_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block4_2_relu (Activation (None, 28, 28, 128) 0 conv3_block4_2_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block4_3_conv (Conv2D) (None, 28, 28, 512) 66048 conv3_block4_2_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block4_3_bn (BatchNormali (None, 28, 28, 512) 2048 conv3_block4_3_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block4_add (Add) (None, 28, 28, 512) 0 conv3_block3_out[0][0] \n", - " conv3_block4_3_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block4_out (Activation) (None, 28, 28, 512) 0 conv3_block4_add[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block1_1_conv (Conv2D) (None, 14, 14, 256) 131328 conv3_block4_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block1_1_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block1_1_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block1_1_relu (Activation (None, 14, 14, 256) 0 conv4_block1_1_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block1_2_conv (Conv2D) (None, 14, 14, 256) 590080 conv4_block1_1_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block1_2_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block1_2_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block1_2_relu (Activation (None, 14, 14, 256) 0 conv4_block1_2_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block1_0_conv (Conv2D) (None, 14, 14, 1024) 525312 conv3_block4_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block1_3_conv (Conv2D) (None, 14, 14, 1024) 263168 conv4_block1_2_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block1_0_bn (BatchNormali (None, 14, 14, 1024) 4096 conv4_block1_0_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block1_3_bn (BatchNormali (None, 14, 14, 1024) 4096 conv4_block1_3_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block1_add (Add) (None, 14, 14, 1024) 0 conv4_block1_0_bn[0][0] \n", - " conv4_block1_3_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block1_out (Activation) (None, 14, 14, 1024) 0 conv4_block1_add[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block2_1_conv (Conv2D) (None, 14, 14, 256) 262400 conv4_block1_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block2_1_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block2_1_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block2_1_relu (Activation (None, 14, 14, 256) 0 conv4_block2_1_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block2_2_conv (Conv2D) (None, 14, 14, 256) 590080 conv4_block2_1_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block2_2_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block2_2_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block2_2_relu (Activation (None, 14, 14, 256) 0 conv4_block2_2_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block2_3_conv (Conv2D) (None, 14, 14, 1024) 263168 conv4_block2_2_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block2_3_bn (BatchNormali (None, 14, 14, 1024) 4096 conv4_block2_3_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block2_add (Add) (None, 14, 14, 1024) 0 conv4_block1_out[0][0] \n", - " conv4_block2_3_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block2_out (Activation) (None, 14, 14, 1024) 0 conv4_block2_add[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block3_1_conv (Conv2D) (None, 14, 14, 256) 262400 conv4_block2_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block3_1_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block3_1_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block3_1_relu (Activation (None, 14, 14, 256) 0 conv4_block3_1_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block3_2_conv (Conv2D) (None, 14, 14, 256) 590080 conv4_block3_1_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block3_2_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block3_2_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block3_2_relu (Activation (None, 14, 14, 256) 0 conv4_block3_2_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block3_3_conv (Conv2D) (None, 14, 14, 1024) 263168 conv4_block3_2_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block3_3_bn (BatchNormali (None, 14, 14, 1024) 4096 conv4_block3_3_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block3_add (Add) (None, 14, 14, 1024) 0 conv4_block2_out[0][0] \n", - " conv4_block3_3_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block3_out (Activation) (None, 14, 14, 1024) 0 conv4_block3_add[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block4_1_conv (Conv2D) (None, 14, 14, 256) 262400 conv4_block3_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block4_1_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block4_1_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block4_1_relu (Activation (None, 14, 14, 256) 0 conv4_block4_1_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block4_2_conv (Conv2D) (None, 14, 14, 256) 590080 conv4_block4_1_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block4_2_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block4_2_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block4_2_relu (Activation (None, 14, 14, 256) 0 conv4_block4_2_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block4_3_conv (Conv2D) (None, 14, 14, 1024) 263168 conv4_block4_2_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block4_3_bn (BatchNormali (None, 14, 14, 1024) 4096 conv4_block4_3_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block4_add (Add) (None, 14, 14, 1024) 0 conv4_block3_out[0][0] \n", - " conv4_block4_3_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block4_out (Activation) (None, 14, 14, 1024) 0 conv4_block4_add[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block5_1_conv (Conv2D) (None, 14, 14, 256) 262400 conv4_block4_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block5_1_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block5_1_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block5_1_relu (Activation (None, 14, 14, 256) 0 conv4_block5_1_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block5_2_conv (Conv2D) (None, 14, 14, 256) 590080 conv4_block5_1_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block5_2_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block5_2_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block5_2_relu (Activation (None, 14, 14, 256) 0 conv4_block5_2_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block5_3_conv (Conv2D) (None, 14, 14, 1024) 263168 conv4_block5_2_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block5_3_bn (BatchNormali (None, 14, 14, 1024) 4096 conv4_block5_3_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block5_add (Add) (None, 14, 14, 1024) 0 conv4_block4_out[0][0] \n", - " conv4_block5_3_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block5_out (Activation) (None, 14, 14, 1024) 0 conv4_block5_add[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block6_1_conv (Conv2D) (None, 14, 14, 256) 262400 conv4_block5_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block6_1_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block6_1_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block6_1_relu (Activation (None, 14, 14, 256) 0 conv4_block6_1_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block6_2_conv (Conv2D) (None, 14, 14, 256) 590080 conv4_block6_1_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block6_2_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block6_2_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block6_2_relu (Activation (None, 14, 14, 256) 0 conv4_block6_2_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block6_3_conv (Conv2D) (None, 14, 14, 1024) 263168 conv4_block6_2_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block6_3_bn (BatchNormali (None, 14, 14, 1024) 4096 conv4_block6_3_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block6_add (Add) (None, 14, 14, 1024) 0 conv4_block5_out[0][0] \n", - " conv4_block6_3_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block6_out (Activation) (None, 14, 14, 1024) 0 conv4_block6_add[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block1_1_conv (Conv2D) (None, 7, 7, 512) 524800 conv4_block6_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block1_1_bn (BatchNormali (None, 7, 7, 512) 2048 conv5_block1_1_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block1_1_relu (Activation (None, 7, 7, 512) 0 conv5_block1_1_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block1_2_conv (Conv2D) (None, 7, 7, 512) 2359808 conv5_block1_1_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block1_2_bn (BatchNormali (None, 7, 7, 512) 2048 conv5_block1_2_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block1_2_relu (Activation (None, 7, 7, 512) 0 conv5_block1_2_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block1_0_conv (Conv2D) (None, 7, 7, 2048) 2099200 conv4_block6_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block1_3_conv (Conv2D) (None, 7, 7, 2048) 1050624 conv5_block1_2_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block1_0_bn (BatchNormali (None, 7, 7, 2048) 8192 conv5_block1_0_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block1_3_bn (BatchNormali (None, 7, 7, 2048) 8192 conv5_block1_3_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block1_add (Add) (None, 7, 7, 2048) 0 conv5_block1_0_bn[0][0] \n", - " conv5_block1_3_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block1_out (Activation) (None, 7, 7, 2048) 0 conv5_block1_add[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block2_1_conv (Conv2D) (None, 7, 7, 512) 1049088 conv5_block1_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block2_1_bn (BatchNormali (None, 7, 7, 512) 2048 conv5_block2_1_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block2_1_relu (Activation (None, 7, 7, 512) 0 conv5_block2_1_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block2_2_conv (Conv2D) (None, 7, 7, 512) 2359808 conv5_block2_1_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block2_2_bn (BatchNormali (None, 7, 7, 512) 2048 conv5_block2_2_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block2_2_relu (Activation (None, 7, 7, 512) 0 conv5_block2_2_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block2_3_conv (Conv2D) (None, 7, 7, 2048) 1050624 conv5_block2_2_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block2_3_bn (BatchNormali (None, 7, 7, 2048) 8192 conv5_block2_3_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block2_add (Add) (None, 7, 7, 2048) 0 conv5_block1_out[0][0] \n", - " conv5_block2_3_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block2_out (Activation) (None, 7, 7, 2048) 0 conv5_block2_add[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block3_1_conv (Conv2D) (None, 7, 7, 512) 1049088 conv5_block2_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block3_1_bn (BatchNormali (None, 7, 7, 512) 2048 conv5_block3_1_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block3_1_relu (Activation (None, 7, 7, 512) 0 conv5_block3_1_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block3_2_conv (Conv2D) (None, 7, 7, 512) 2359808 conv5_block3_1_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block3_2_bn (BatchNormali (None, 7, 7, 512) 2048 conv5_block3_2_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block3_2_relu (Activation (None, 7, 7, 512) 0 conv5_block3_2_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block3_3_conv (Conv2D) (None, 7, 7, 2048) 1050624 conv5_block3_2_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block3_3_bn (BatchNormali (None, 7, 7, 2048) 8192 conv5_block3_3_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block3_add (Add) (None, 7, 7, 2048) 0 conv5_block2_out[0][0] \n", - " conv5_block3_3_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block3_out (Activation) (None, 7, 7, 2048) 0 conv5_block3_add[0][0] \n", - "__________________________________________________________________________________________________\n", - "avg_pool (GlobalAveragePooling2 (None, 2048) 0 conv5_block3_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "predictions (Dense) (None, 1000) 2049000 avg_pool[0][0] \n", - "==================================================================================================\n", - "Total params: 25,636,712\n", - "Trainable params: 25,583,592\n", - "Non-trainable params: 53,120\n", - "__________________________________________________________________________________________________\n" - ] - } - ], - "source": [ - "resnet = keras.applications.ResNet50()\n", - "resnet.summary()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "നിങ്ങൾക്ക് കാണാമല്ലോ, മോഡലിൽ അതേ പരിചിതമായ ഘടകങ്ങൾ ഉൾക്കൊള്ളുന്നു: കോൺവല്യൂഷണൽ ലെയറുകൾ, പൂലിംഗ് ലെയറുകൾ, ഒടുവിൽ ഡെൻസ് ക്ലാസിഫയർ. VGG-16 ട്രാൻസ്ഫർ ലേണിംഗിനായി ഉപയോഗിച്ച പോലെ തന്നെ ഈ മോഡൽ ഉപയോഗിക്കാം. മുകളിൽ നൽകിയ കോഡിൽ വ്യത്യസ്ത ResNet മോഡലുകൾ അടിസ്ഥാന മോഡലായി ഉപയോഗിച്ച് പരീക്ഷണം നടത്തുകയും കൃത്യത എങ്ങനെ മാറുന്നു എന്ന് കാണുകയും ചെയ്യാം.\n", - "\n", - "## ബാച്ച് നോർമലൈസേഷൻ\n", - "\n", - "ഈ നെറ്റ്‌വർക്കിൽ മറ്റൊരു തരത്തിലുള്ള ലെയർ ഉണ്ട്: **ബാച്ച് നോർമലൈസേഷൻ**. ബാച്ച് നോർമലൈസേഷന്റെ ആശയം ന്യുറൽ നെറ്റ്‌വർക്കിലൂടെ ഒഴുകുന്ന മൂല്യങ്ങളെ ശരിയായ പരിധിയിലേക്ക് കൊണ്ടുവരുകയാണ്. സാധാരണയായി, ന്യുറൽ നെറ്റ്‌വർക്കുകൾ ഏറ്റവും നല്ല രീതിയിൽ പ്രവർത്തിക്കുന്നത് എല്ലാ മൂല്യങ്ങളും [-1,1] അല്ലെങ്കിൽ [0,1] പരിധിയിലായിരിക്കുമ്പോഴാണ്, അതുകൊണ്ടുതന്നെ നാം നമ്മുടെ ഇൻപുട്ട് ഡാറ്റ അനുസരിച്ച് സ്കെയിൽ/നോർമലൈസ് ചെയ്യുന്നു. എന്നാൽ, ഒരു ഡീപ്പ് നെറ്റ്‌വർക്കിന്റെ പരിശീലനത്തിനിടെ, മൂല്യങ്ങൾ ഈ പരിധിയിൽ നിന്ന് വളരെ പുറത്തേക്ക് പോകാൻ സാധ്യതയുണ്ട്, ഇത് പരിശീലനം പ്രയാസമാക്കുന്നു. ബാച്ച് നോർമലൈസേഷൻ ലെയർ നിലവിലെ മിനിബാച്ചിലെ എല്ലാ മൂല്യങ്ങൾക്കും ശരാശരി, സ്റ്റാൻഡേർഡ് ഡിവിയേഷൻ കണക്കാക്കി, അവ ഉപയോഗിച്ച് സിഗ്നൽ നോർമലൈസ് ചെയ്ത് ന്യുറൽ നെറ്റ്‌വർക്കിന്റെ അടുത്ത ലെയറിലേക്ക് അയയ്ക്കുന്നു. ഇത് ഡീപ്പ് നെറ്റ്‌വർക്കുകളുടെ സ്ഥിരത വളരെ മെച്ചപ്പെടുത്തുന്നു.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## പ്രധാന കാര്യങ്ങൾ\n", - "\n", - "ട്രാൻസ്ഫർ ലേണിംഗ് ഉപയോഗിച്ച്, ഞങ്ങൾ നമ്മുടെ കസ്റ്റം ഒബ്ജക്റ്റ് ക്ലാസിഫിക്കേഷൻ ടാസ്കിനായി ഒരു ക്ലാസിഫയർ വേഗത്തിൽ ഒരുക്കാൻ കഴിഞ്ഞു, കൂടാതെ ഉയർന്ന കൃത്യതയും നേടാൻ കഴിഞ്ഞു. എന്നാൽ, ഈ ഉദാഹരണം പൂർണ്ണമായും നീതിയുള്ളതായിരുന്നില്ല, കാരണം ഒറിജിനൽ VGG-16 നെറ്റ്‌വർക്ക് പൂച്ചകളും നായകളും തിരിച്ചറിയാൻ മുൻകൂട്ടി പരിശീലിപ്പിച്ചിരുന്നതാണ്, അതിനാൽ ഞങ്ങൾ നെറ്റ്‌വർക്കിൽ ഇതിനകം ഉണ്ടായിരുന്ന പല പാറ്റേണുകളും വീണ്ടും ഉപയോഗിച്ചുകൊണ്ടായിരുന്നു. പ്ലാന്റിലെ പ്രൊഡക്ഷൻ ലൈൻ വിശദാംശങ്ങൾ പോലുള്ള കൂടുതൽ വിദൂരമായ ഡൊമെയ്ൻ-സ്പെസിഫിക് ഒബ്ജക്റ്റുകളിൽ കുറവായ കൃത്യത പ്രതീക്ഷിക്കാം, അല്ലെങ്കിൽ വ്യത്യസ്ത വൃക്ഷ ഇലകൾ പോലുള്ളവ.\n", - "\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" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "py38_tensorflow", - "language": "python", - "name": "conda-env-py38_tensorflow-py" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.10" - }, - "coopTranslator": { - "original_hash": "c189abc107848f96051085cc30945129", - "translation_date": "2025-11-26T00:59:20+00:00", - "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", - "language_code": "ml" - } - }, - "nbformat": 4, - "nbformat_minor": 4 +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# പ്രീ-ട്രെയിൻ ചെയ്ത മോഡലുകളും ട്രാൻസ്ഫർ ലേണിംഗും\n", + "\n", + "CNN-കൾ ട്രെയിൻ ചെയ്യാൻ വളരെ സമയം വേണ്ടിവരും, കൂടാതെ അതിനായി വളരെ ഡാറ്റയും ആവശ്യമാണ്. എന്നാൽ, ഒരു നെറ്റ്വർക്കിന്റെ ടാസ്ക് ഇമേജുകളിൽ നിന്നുള്ള മാതൃകകൾ കണ്ടെത്താനായി ഉപയോഗിക്കുന്ന മികച്ച ലോ-ലെവൽ ഫിൽറ്ററുകൾ പഠിക്കുന്നതിൽ കൂടുതലായി സമയം ചെലവഴിക്കാറുണ്ട്. ഒരു സ്വാഭാവികമായ ചോദ്യം ഉയരുന്നു - നാം ഒരു ഡാറ്റാസെറ്റിൽ പ്രീ-ട്രെയിൻ ചെയ്ത ഒരു ന്യൂട്രൽ നെറ്റ്വർക്ക് മറ്റൊരു ചിത്രങ്ങളെ ക്ലാസിഫൈ ചെയ്യുന്നതിന് മുഴുവൻ ട്രെയിനിങ് പ്രക്രിയയില്ലാതെ ഉപയോഗിക്കാമോ?\n", + "\n", + "ഈ സമീപനം **ട്രാൻസ്ഫർ ലേണിംഗ്** എന്നാണ് അറിയപ്പെടുന്നത്, കാരണം നാം ഒരു ന്യൂട്രൽ നെറ്റ്വർക്ക് മോഡലിൽ നിന്ന് മറ്റൊരു മോഡലിലേക്ക് ഒരു അറിവ് കൈമാറുകയാണ്. ട്രാൻസ്ഫർ ലേണിംഗിൽ, സാധാരണയായി നാം പ്രീ-ട്രെയിൻ ചെയ്ത ഒരു മോഡലിൽ നിന്ന് തുടക്കം കുറിക്കുന്നു, അത് **ImageNet** പോലുള്ള വലിയ ഒരു ചിത്രം ഡാറ്റാസെറ്റിൽ ട്രെയിൻ ചെയ്തിട്ടുണ്ട്. ആ മോഡലുകൾ സാധാരണ ചിത്രങ്ങളിൽ നിന്നുള്ള വ്യത്യസ്ത ഫീച്ചറുകൾ എടുക്കുന്നതിൽ ইতিমധ്യമുണ്ട്, പലപ്പോഴും ആ ഫീച്ചറുകളുടെ മേൽ ഒരു ക്ലാസിഫയർ നിർമ്മിക്കുന്നത് നല്ല ഫലം നൽകും.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import tensorflow as tf\n", + "from tensorflow import keras\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import os\n", + "from tfcv import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## പൂച്ചകളും നായ്ക്കളും ഡാറ്റാസെറ്റ്\n", + "\n", + "ഈ യൂണിറ്റിൽ, നാം പൗരപ്രവൃത്തി Probleനമാണ് പൂച്ചകളും നായ്ക്കളും ചിത്രങ്ങൾ വർഗ്ഗീകരിക്കുന്നതു. അതുവഴി, നാം [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" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "if not os.path.exists('data/kagglecatsanddogs_5340.zip'):\n", + " !wget -P data https://download.microsoft.com/download/3/E/1/3E1C3F21-ECDB-4869-8368-6DEBA77B919F/kagglecatsanddogs_5340.zip" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import zipfile\n", + "if not os.path.exists('data/PetImages'):\n", + " with zipfile.ZipFile('data/kagglecatsanddogs_5340.zip', 'r') as zip_ref:\n", + " zip_ref.extractall('data')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "ദുഷ്‌പ്രാപ്തമായ ചിത്രഫയലുകൾ ഡാറ്റാസെറ്റിൽ ചിലയുണ്ട്. കേടായ ഫയലുകൾ പരിശോധിക്കാൻ നമുക്കു വേഗത്തിൽ ശുദ്ധീകരണം നടത്തേണ്ടതാണ്. ഈ ട്യൂറോറിയലിനെ നശിപ്പിക്കാതിരിക്കാൻ, ഡാറ്റാസെറ്റ് പരിശോധിക്കുന്ന കോഡിനെ ഒരു മോഡ്യൂളിലേക്ക് മാറ്റി. \n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Corrupt image or wrong format: data/PetImages/Cat/12235.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/2663.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/4929.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/8183.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/11083.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/6435.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/6491.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/7968.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/6768.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/11397.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/8295.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/4874.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/23.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/11864.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/3491.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/11729.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/3197.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/10874.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/6376.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/9361.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/9328.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/910.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/2021.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/666.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/3710.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/9171.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/6906.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/11095.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/660.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/8415.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/3161.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/850.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/7003.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/1267.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/7642.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/8553.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/6900.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/4334.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/10404.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/6980.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/936.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/9619.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/3300.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/7647.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/2742.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/9565.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/1757.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/11874.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/1936.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/5077.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/7845.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/8832.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/11935.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/9208.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/4322.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/7978.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/10820.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/391.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/10073.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/8958.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/8470.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/445.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/4821.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/11565.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/4351.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/4833.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/140.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/3153.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/5370.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/5819.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/3649.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/4293.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/3967.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/1937.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/10125.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/1386.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/4750.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/6029.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/5614.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/2569.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/9778.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/6486.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/11210.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/7502.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/2189.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/1151.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/4629.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/12080.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/10501.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/1914.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/11086.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/4000.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/9100.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/5553.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/12269.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/5243.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/3288.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/11912.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/3320.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/11166.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/8194.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/2353.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/9026.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/8557.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/7969.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/8693.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/4367.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/1900.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/5730.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/9961.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/8126.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/8521.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/11560.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/11233.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/11675.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/8889.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/9414.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/3588.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/10353.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/10733.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/6238.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/5618.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/7743.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/10747.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/6503.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/11410.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/5955.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/2915.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/3136.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/4086.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/2905.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/2494.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/3546.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/5547.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/9851.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/9188.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/4203.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/8715.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/4640.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/1866.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/7718.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/7514.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/1017.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/12102.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/296.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/6718.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/11253.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/10173.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/11849.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/10383.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/10678.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/5790.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/6318.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/1884.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/4654.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/9145.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/2479.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/12289.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/2688.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/4134.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/10637.jpg\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/anaconda/envs/py38_tensorflow/lib/python3.8/site-packages/PIL/TiffImagePlugin.py:793: UserWarning: Truncated File Read\n", + " warnings.warn(str(msg))\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Corrupt image or wrong format: data/PetImages/Dog/543.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/8730.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/12114.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/522.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/10863.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/10401.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/7739.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/561.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/1308.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/9643.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/3155.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/5736.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/4257.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/11853.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/6855.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/1259.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/7652.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/573.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/11702.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/414.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/4301.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/9500.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/10726.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/9367.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/2877.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/10907.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/10972.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/7311.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/10797.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/2317.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/7128.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/6500.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/11285.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/6430.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/6032.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/10969.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/8364.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/11692.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/3038.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/5604.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/565.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/9640.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/7459.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/6305.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/6555.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/11590.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/6059.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/3927.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/10705.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/2384.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/3885.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/663.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/9043.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/8563.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/9556.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/9967.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/10158.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/5263.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/8641.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/7369.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/4924.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/10351.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/6213.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/5104.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/1356.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/7133.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/7112.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/1168.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/719.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/50.jpg\n" + ] + } + ], + "source": [ + "check_image_dir('data/PetImages/Cat/*.jpg')\n", + "check_image_dir('data/PetImages/Dog/*.jpg')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## ഡാറ്റാസെറ്റ് ലോഡിംഗ്\n", + "\n", + "മുൻകൂട്ടി ഉള്ള ഉദാഹരണങ്ങളിൽ, നാം Keras-ൽ ഉൾക്കടക്കപ്പെടുന്ന ഡാറ്റാസെറ്റുകൾ ലോഡ് ചെയ്തുകൊണ്ടിരുന്നുവല്ലോ. ഇനി നമുക്ക് നമ്മുടെ സ്വന്തം ഡാറ്റാസെറ്റ് കൈകാര്യം ചെയ്യാൻ തയാറിടുകയാണ്, ഇത് ചിത്രങ്ങളുടെയും ഡയറക്ടറിയിൽ നിന്ന് ലോഡ് ചെയ്യേണ്ടതാണ്.\n", + "\n", + "യഥാർത്ഥ ജീവിതത്തിൽ, ചിത്ര ഡാറ്റാസെറ്റുകളുടെ വലുപ്പം വളരെ വലുതായിരിക്കും, എല്ലാ ഡാറ്റയും മമ്മറിയിൽ ചേരുമെന്ന് ആശ്രയിക്കാനാകില്ല. അതിനാൽ, ഡാറ്റാസെറ്റുകൾ training-നായി അനുയോജ്യമായ മിനിബാച്ചുകളായി ഡാറ്റ മടക്കാൻ കഴിവുള്ള **ജെനറേറ്ററുകൾ** ആയി പ്രതിനിധീകരിക്കാറുണ്ട്.\n", + "\n", + "ചിത്രം ക്ലാസിഫിക്കേഷനുമായി ബന്ധപ്പെട്ട്, Keras-ൽ പ്രത്യേക ഫംഗ്ഷൻ ആയ `image_dataset_from_directory` ഉണ്ട്, ഇത് വ്യത്യസ്ത ക്ലാസുകളോട് ബന്ധപ്പെട്ട ഉപഡയരക്ടറികളിൽ നിന്നുള്ള ചിത്രങ്ങൾ ലോഡ് ചെയ്യാൻ കഴിവുള്ളതാണ്. ഈ ഫംഗ്ഷൻ ചിത്രങ്ങളുടെ സ്കെയിൽ ചെയ്യലും കൈകാര്യം ചെയ്യുന്നു, കൂടാതെ ഇത് ഡാറ്റാസെറ്റ് ട്രയിൻ, ടെസ്റ്റ് സബ്സെറ്റുകളായി വിഭജിക്കാനും കഴിയും:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Found 24769 files belonging to 2 classes.\n", + "Using 19816 files for training.\n", + "Found 24769 files belonging to 2 classes.\n", + "Using 4953 files for validation.\n" + ] + } + ], + "source": [ + "data_dir = 'data/PetImages'\n", + "batch_size = 64\n", + "ds_train = keras.preprocessing.image_dataset_from_directory(\n", + " data_dir,\n", + " validation_split = 0.2,\n", + " subset = 'training',\n", + " seed = 13,\n", + " image_size = (224,224),\n", + " batch_size = batch_size\n", + ")\n", + "ds_test = keras.preprocessing.image_dataset_from_directory(\n", + " data_dir,\n", + " validation_split = 0.2,\n", + " subset = 'validation',\n", + " seed = 13,\n", + " image_size = (224,224),\n", + " batch_size = batch_size\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "ട്രെയിൻ, ടെസ്റ്റ് ഡാറ്റാസെറ്റുകൾക്ക് ഇടയിലുള്ള ചിത്രങ്ങളുടെ വിഭജനത്തെ ഇത് ബാധിക്കുന്നതിനാൽ, രണ്ടു കോൾസിനും സമാനമായ `seed` വില ക്രമീകരിക്കുക അത്യന്താപേക്ഷിതമാണ്.\n", + "\n", + "ഡാറ്റാസെറ്റ് ഡയറക്ടറികളിൽ നിന്ന് ക്ലാസ് പേരുകൾ സ്വയം തിരഞ്ഞെടുത്തുകൊള്ളുന്നു, ആവശ്യമായ പക്ഷം നിങ്ങള് അത് വിളിച്ചിട്ടുണ്ട് വഴി ആക്സസ് ചെയ്യാമെന്ന്:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['Cat', 'Dog']" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ds_train.class_names" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "നാം ലഭിച്ച ഡാറ്റാസെറ്റുകൾ മോഡൽ പരിശീലിക്കാൻ ശരിയായി `fit` ഫംഗ്ഷനിലേക്ക് നേരിട്ട് കൈമാറാം. അവ ഉചിതമായ ചിത്രങ്ങളും ലേബലുകളും ഉൾക്കൊള്ളുന്നു, ഇവയെ താഴെ കാണിച്ചിട്ടുള്ള ഘടന ഉപയോഗിച്ച് ലൂപ്പ് ചെയ്യാം:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training batch shape: features=(64, 224, 224, 3), labels=(64,)\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "for x,y in ds_train:\n", + " print(f\"Training batch shape: features={x.shape}, labels={y.shape}\")\n", + " x_sample, y_sample = x,y\n", + " break\n", + " \n", + "display_dataset(x_sample.numpy().astype(np.int),np.expand_dims(y_sample,1),classes=ds_train.class_names)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "> **ഗమనിക്കുക**: ഡാറ്റാസെറ്റിലെ എല്ലാ ചിത്രങ്ങളും 0-255 പരിധിയിലുള്ള ഫ്ലോട്ടിംഗ് പോയിന്റ് ടെൻസറുകളായി പ്രതിനിധീകരിച്ചിരിക്കുന്നു. അവയെ ന്യൂറൽ നെറ്റ്‌വർക്കിലേക്ക് പാസ്സാക്കുന്നതിന് മുൻപ്, നമുക്ക് ആ മൂല്യം 0-1 പരിധിയിലേക്ക് സ്‌കേയ്ല് ചെയ്യേണ്ടതുണ്ട്. ചിത്രങ്ങൾ പ്ലോട്ട് ചെയ്യുമ്പോൾ, അതേ പ്രവർത്തി ചെയ്യേണ്ടതായിരിക്കും, അല്ലെങ്കിൽ മൂല്യങ്ങളെ `int` തരം ആയി മാറ്റണം (മുകളിലുള്ള കോഡിൽ ചെയ്തതുപോലെ), അങ്ങനെ `matplotlib` നമുക്ക് അസൽ സ്‌കേയ്ല് ചെയ്തിട്ടില്ലാത്ത ചിത്രമാണ് പ്ലോട്ട് ചെയ്യാൻ ആഗ്രഹിക്കുന്നുവെന്ന് കാണിക്കാൻ കഴിയട്ടെ.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## മുൻപരിചയമുള്ള മോഡലുകൾ\n", + "\n", + "നിരവധി ചിത്ര വർഗ്ഗീകരണ ജോലി‌ക്കായി മുൻപരിചയമുള്ള ന്യൂറൽ നെറ്റ്‌വർക്ക് മോഡലുകൾ കഴിവുള്ളവയാണ്. അവയിൽ പല മോഡലുകളും `keras.applications` നെയിംസ്പെയ്‌സിനുള്ളിൽ ലഭ്യമാണ്, കൂടാതെ ഇന്റർനെറ്റിൽ കൂടി കൂടുതൽ മോഡലുകൾ കണ്ടെത്താനാകും. ഏറ്റവും ലളിതമായ VGG-16 മോഡൽ എങ്ങനെ ലോഡ്‌ ചെയ്ത് ഉപയോഗിക്കാമെന്ന് നോക്കാം:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Downloading data from https://storage.googleapis.com/tensorflow/keras-applications/vgg16/vgg16_weights_tf_dim_ordering_tf_kernels.h5\n", + "553467904/553467096 [==============================] - 6s 0us/step\n", + "Most probable class = [208]\n", + "Downloading data from https://storage.googleapis.com/download.tensorflow.org/data/imagenet_class_index.json\n", + "40960/35363 [==================================] - 0s 0us/step\n" + ] + }, + { + "data": { + "text/plain": [ + "[[('n02099712', 'Labrador_retriever', 0.5340957),\n", + " ('n02100236', 'German_short-haired_pointer', 0.0939442),\n", + " ('n02092339', 'Weimaraner', 0.08160535),\n", + " ('n02099849', 'Chesapeake_Bay_retriever', 0.057179328),\n", + " ('n02109047', 'Great_Dane', 0.03733857)]]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# 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", + "print(f\"Most probable class = {tf.argmax(res,1)}\")\n", + "\n", + "keras.applications.vgg16.decode_predictions(res.numpy())" + ] + }, + { + "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" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "VGG-16 നെറ്റ്‌വർക്കിന്റെ ആർക്കിടെക്ചറും നോക്കാം:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"vgg16\"\n", + "_________________________________________________________________\n", + "Layer (type) Output Shape Param # \n", + "=================================================================\n", + "input_1 (InputLayer) [(None, 224, 224, 3)] 0 \n", + "_________________________________________________________________\n", + "block1_conv1 (Conv2D) (None, 224, 224, 64) 1792 \n", + "_________________________________________________________________\n", + "block1_conv2 (Conv2D) (None, 224, 224, 64) 36928 \n", + "_________________________________________________________________\n", + "block1_pool (MaxPooling2D) (None, 112, 112, 64) 0 \n", + "_________________________________________________________________\n", + "block2_conv1 (Conv2D) (None, 112, 112, 128) 73856 \n", + "_________________________________________________________________\n", + "block2_conv2 (Conv2D) (None, 112, 112, 128) 147584 \n", + "_________________________________________________________________\n", + "block2_pool (MaxPooling2D) (None, 56, 56, 128) 0 \n", + "_________________________________________________________________\n", + "block3_conv1 (Conv2D) (None, 56, 56, 256) 295168 \n", + "_________________________________________________________________\n", + "block3_conv2 (Conv2D) (None, 56, 56, 256) 590080 \n", + "_________________________________________________________________\n", + "block3_conv3 (Conv2D) (None, 56, 56, 256) 590080 \n", + "_________________________________________________________________\n", + "block3_pool (MaxPooling2D) (None, 28, 28, 256) 0 \n", + "_________________________________________________________________\n", + "block4_conv1 (Conv2D) (None, 28, 28, 512) 1180160 \n", + "_________________________________________________________________\n", + "block4_conv2 (Conv2D) (None, 28, 28, 512) 2359808 \n", + "_________________________________________________________________\n", + "block4_conv3 (Conv2D) (None, 28, 28, 512) 2359808 \n", + "_________________________________________________________________\n", + "block4_pool (MaxPooling2D) (None, 14, 14, 512) 0 \n", + "_________________________________________________________________\n", + "block5_conv1 (Conv2D) (None, 14, 14, 512) 2359808 \n", + "_________________________________________________________________\n", + "block5_conv2 (Conv2D) (None, 14, 14, 512) 2359808 \n", + "_________________________________________________________________\n", + "block5_conv3 (Conv2D) (None, 14, 14, 512) 2359808 \n", + "_________________________________________________________________\n", + "block5_pool (MaxPooling2D) (None, 7, 7, 512) 0 \n", + "_________________________________________________________________\n", + "flatten (Flatten) (None, 25088) 0 \n", + "_________________________________________________________________\n", + "fc1 (Dense) (None, 4096) 102764544 \n", + "_________________________________________________________________\n", + "fc2 (Dense) (None, 4096) 16781312 \n", + "_________________________________________________________________\n", + "predictions (Dense) (None, 1000) 4097000 \n", + "=================================================================\n", + "Total params: 138,357,544\n", + "Trainable params: 138,357,544\n", + "Non-trainable params: 0\n", + "_________________________________________________________________\n" + ] + } + ], + "source": [ + "vgg.summary()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## GPU കംപ്യൂട്ടേഷനുകൾ\n", + "\n", + "VGG-16 പോലുള്ള ആഴത്തിലുള്ള ന്യൂറൽ നെറ്റ്‌വർക്കുകളും മറ്റു കൂടുതൽ ആധുനിക വാസ്തവിക സൃഷ്ടികളും പ്രവർത്തിപ്പിക്കാൻ വളരെ അധികം കംപ്യൂട്ടേഷണൽ പവർ ആവശ്യമാണ്. GPU ആക്സിലറേഷൻ ലഭ്യമായാൽ അത് ഉപയോഗിക്കുന്നത് യുക്തിയോടെയാണ്. ഭാഗ്യവശാൽ, Keras GPU ലഭ്യമായാൽ കംപ്യൂട്ടേഷനുകൾ സ്വയം വേഗത്തിലാക്കുന്നു. Tensorflow GPU ഉപയോഗിക്കാൻ കഴിയുന്നുണ്ടോ എന്ന് താഴെ കാണിച്ചിരിക്കുന്ന കോഡ് ഉപയോഗിച്ച് പരിശോധിക്കാം:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tf.config.list_physical_devices('GPU')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## VGG സവിശേഷതകൾ പുറത്തെടുക്കൽ\n", + "\n", + "നമ്മുടെ ചിത്രങ്ങളിൽ നിന്ന് സവിശേഷതകൾ പുറത്തെടുക്കാൻ VGG-16 ഉപയോഗിക്കണമെങ്കിൽ, അവസാനത്തെ വർഗ്ഗീകരണ שכതകളില്ലാത്ത മോഡൽ ആവശ്യമുണ്ട്. മുകളിലുള്ള שכതകൾ ഇല്ലാതെ VGG-16 മോഡൽ സൃഷ്ടിക്കാൻ ഈ കോഡ് ഉപയോഗിക്കാം:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Shape after applying VGG-16: (7, 7, 512)\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "vgg = keras.applications.VGG16(include_top=False)\n", + "\n", + "inp = keras.applications.vgg16.preprocess_input(x_sample[:1])\n", + "res = vgg(inp)\n", + "print(f\"Shape after applying VGG-16: {res[0].shape}\")\n", + "plt.figure(figsize=(15,3))\n", + "plt.imshow(res[0].numpy().reshape(-1,512))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "ഫീച്ചർ ടെൻസറിന്റെ ഡൈമെൻഷൻ 7x7x512 ആണ്, പക്ഷേ അതിനെ ദൃശ്യമാക്കുന്നതിനായി ഞങ്ങൾ അത് 2D രൂപത്തിലേക്ക് പുനഃരൂപപ്പെടുത്തേണ്ടിവന്നു.\n", + "\n", + "ഇപ്പോൾ ആ ഫീച്ചറുകൾ ചിത്രങ്ങളെ ശ്രേണി بند് ചെയ്യാൻ ഉപയോഗിക്കാമോ എന്നു നോക്കാം. ചില ചിത്രങ്ങളുടെ ഒരു ഭാഗം (ഞങ്ങളുടെ കാര്യത്തിൽ 50 മിനി ബാച്ചുകൾ) കൈയോടെ എടുത്ത് അവരുടെ ഫീച്ചർ വെക്ടറുകൾ മുൻകൂർ കണക്കാക്കാം. അത് ചെയ്യാൻ ഞങ്ങൾ Tensorflow **dataset** API ഉപയോഗിക്കാം. `map` ഫങ്ഷൻ ഒരു dataset എടുത്ത് നൽകിയ ലാംബ്ഡ-ഫങ്ഷൻ പ്രയോഗിച്ച് അതിനെ പരിവർത്തനം ചെയ്യുന്നു. ഈ സംവിധാനത്തിൽ VGG-നിർമ്മിത ഫീച്ചറുകൾ അടങ്ങിയ പുതിയ datasetകൾ, `ds_features_train` ഉം `ds_features_test` ഉം നിർമ്മിക്കുന്നു, യഥാർത്ഥ ചിത്രങ്ങളുടെ പകരം. \n" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(64, 7, 7, 512) (64,)\n" + ] + } + ], + "source": [ + "num = batch_size*50\n", + "ds_features_train = ds_train.take(50).map(lambda x,y : (vgg(x),y))\n", + "ds_features_test = ds_test.take(10).map(lambda x,y : (vgg(x),y))\n", + "\n", + "for x,y in ds_features_train:\n", + " print(x.shape,y.shape)\n", + " break" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "ഞങ്ങൾ ഡാറ്റാസെറ്റ് വലുപ്പം പരിധിയിടാൻ ഉപയോഗിച്ചത് `.take(50)` ആണ്, നമ്മുടെ പ്രദർശനം വെഗത്തിലാക്കാൻ. നിശ്ചയമായും നിങ്ങൾക്ക് ഈ പരീക്ഷണം പൂർണ്ണ ഡാറ്റാസെറ്റിൽ നടത്താം. \n", + "\n", + "എക്സ്ട്രാക്ടഡ് ഫീച്ചറുകളുള്ള ഒരു ഡാറ്റാസെറ്റ് ഇപ്പോൾ ഉണ്ടായിരിക്കെ, നാം ഒരു ലളിതമായ ഡെൻസ് ക്ലാസിഫയർ ട്രെയിൻ ചെയ്ത് പൂച്ചകളും നായ്ക്കളും തമ്മിൽ വ്യത്യസ്തമാക്കാം. ഈ നെറ്റ്വർക്ക് (7,7,512) ആകൃതിയിലുള്ള ഫീച്ചർ വെക്ടർ സ്വീകരിച്ച്, നായ്ക്കോ പൂച്ചയോ എങ്കിലോ ഒറ്റൗട്ട്പുട്ട് സൃഷ്ടിക്കും. ഇത് ബൈനറി ക്ലാസിഫിക്കേഷൻ ആയതിനാൽ, നാം `sigmoid` ആക്ടിവേഷൻ ഫങ്ഷനും `binary_crossentropy` ലോസ്സും ഉപയോഗിക്കുന്നു.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "50/50 [==============================] - 1896s 38s/step - loss: 1.4845 - acc: 0.9144 - val_loss: 0.7220 - val_acc: 0.9516\n" + ] + } + ], + "source": [ + "model = keras.models.Sequential([\n", + " keras.layers.Flatten(input_shape=(7,7,512)),\n", + " keras.layers.Dense(1,activation='sigmoid')\n", + "])\n", + "model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc'])\n", + "hist = model.fit(ds_features_train, validation_data=ds_features_test)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "ഫലം ഉത്തമമാണ്, കമ്പിയും നായയും തമ്മിൽ ഏകദേശം 95% സാധ്യതയോടെ വേർതിരിക്കാം! എന്നാൽ, മാനുവൽ ഫീച്ചർ എക്സ്ട്രാക്ഷൻ വളരെ സമയം എടുക്കുമെന്ന് തോന്നുന്നതിനാൽ ഈ സമീപനം എല്ലാ ചിത്രങ്ങളുടെ സബ്‌സെറ്റ് മാത്രം പരീക്ഷിച്ചിട്ടുണ്ട്.\n", + "\n", + "## ഒരു VGG നെറ്റ്‌വർക്ക് ഉപയോഗിച്ചാണ് ട്രാൻസ്ഫർ ലേണിംഗ്\n", + "\n", + "പരിശീലന സമയത്ത് ഓരിജിനൽ VGG-16 നെറ്റ്‌വർക്ക് മുഴുവനായി ഉപയോഗിച്ച് ഫീച്ചർ എക്സ്ട്രാക്ടർ നമ്മുടെ നെറ്റ്‌വർക്കിന് ആദ്യ ലെയറായി ചേർക്കുന്ന വഴി മാനുവൽ ഫീച്ചർ പ്രീ-കമ്പ്യൂട്ട് ചെയ്യുന്നതു ഒഴിവാക്കാം.\n", + "\n", + "Keras ആർക്കിടെക്ചറിന്റെ സുന്ദര്യം അതെ, നാം മുകളിൽ നിർവചിച്ച VGG-16 മോഡൽ മറ്റൊരു ന്യൂറൽ നെറ്റ്‌വർക്കിൽ ഒരു ലെയറായി ഉപയോഗിക്കാം! അതിന് മുകളിൽ ഡെൻസെ ക്ലാസിഫയർ ഉള്ള ഒരു നെറ്റ്‌വർക്ക് നിർമ്മിച്ച്, പിന്നെ ബാക്ക് പ്രൊപ്പഗേഷൻ ഉപയോഗിച്ച് മുഴുവൻ നെറ്റ്‌വർക്കും പരിശീലിപ്പിക്ക മതിയാകും.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"sequential\"\n", + "_________________________________________________________________\n", + "Layer (type) Output Shape Param # \n", + "=================================================================\n", + "vgg16 (Functional) (None, 7, 7, 512) 14714688 \n", + "_________________________________________________________________\n", + "flatten (Flatten) (None, 25088) 0 \n", + "_________________________________________________________________\n", + "dense (Dense) (None, 1) 25089 \n", + "=================================================================\n", + "Total params: 14,739,777\n", + "Trainable params: 25,089\n", + "Non-trainable params: 14,714,688\n", + "_________________________________________________________________\n" + ] + } + ], + "source": [ + "model = keras.models.Sequential()\n", + "model.add(keras.applications.VGG16(include_top=False,input_shape=(224,224,3)))\n", + "model.add(keras.layers.Flatten())\n", + "model.add(keras.layers.Dense(1,activation='sigmoid'))\n", + "\n", + "model.layers[0].trainable = False\n", + "\n", + "model.summary()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "ഈ മോഡൽ ഒരു എന്റ്-ടു-എന്റ് ക്ലാസിഫിക്കേഷൻ നെറ്റ്‌വർക്ക് പോലെ ആണ്, അത് ഒരു ചിത്രം എടുത്ത് ക്ലാസ് തിരികെ നൽകുന്നത്. എങ്കിലും, ട്രിക്കി കാര്യം એതാണ്, നമുക്ക് VGG16 ഒരു ഫീച്ചർ എക്സ്ട്രാക്ടറായി പ്രവർത്തിക്കണമെന്ന് ആഗ്രഹിക്കുന്നതാണ്, റീ-ട്രെയിൻ ചെയ്യരുത്. അതിനാൽ, നമുക്കു **കോൺവല്യൂഷണൽ ഫീച്ചർ എക്സ്ട്രാക്ടറിന്റെ ഭാരങ്ങൾ ഫ്രീസുചെയ്യേണ്ടത്** ആവശ്യമാണ്. നമുക്ക് നെറ്റ്‌വർക്കിന്റെ ആദ്യ ലെയർ ആക്‌സസ് ചെയ്യാൻ `model.layers[0]` വിളിക്കാം, പിന്നീട് `trainable` പ്രോപ്പർട്ടി `False` ആക്കേണ്ടതും മാത്രമാണ്.\n", + "\n", + "> **കുറിപ്പ്**: ഫീച്ചർ എക്സ്ട്രാക്ടർ ഭാരങ്ങൾ ഫ്രീസുചെയ്യുന്നത് ആവശ്യമാണ്, കാരണം അല്ലാതെ ട്രെയിൻ ചെയ്യാത്ത ക്ലാസിഫയർ ലെയർ മുൻ-ട്രെയിൻ ചെയ്ത കോൺവല്യൂഷണൽ എക്സ്ട്രാക്ടറിന്റെ എല്ലാ ഭാരങ്ങൾ നശിപ്പിക്കാം.\n", + "\n", + "നമ്മുടെ നെറ്റ്‌വർക്കിന്റെ മൊത്തം പാരാമീറ്ററുകളുടെ എണ്ണവും ഏകദേശം 15 ദശലക്ഷം ആണെന്ന് നിങ്ങൾ ശ്രദ്ധിച്ചേക്കാം, എന്നാൽ നാം 25k പാരാമീറ്ററുകൾ മാത്രം ട്രെയിൻ ചെയ്യുകയാണ്. മുകളിലത്തെ കോൺവല്യൂഷണൽ ഫിൽറ്ററുകളുടെ മറ്റു എല്ലാ പാരാമീറ്ററുകളും മുമ്പ് പരിശീലിച്ചിട്ടുണ്ട്. അത് നല്ലതാണ്, കാരണം കുറച്ച് ഉദാഹരണങ്ങളുമായി കുറച്ച് പാരാമീറ്ററുകൾ നന്നായി ഫൈൻ-ട്യൂൺ ചെയ്യാൻ സാധിക്കുന്നു.\n", + "\n", + "ഇപ്പോൾ നാം നമ്മുടെ നെറ്റ്‌വർക്ക് ട്രെയിൻ ചെയ്ത് എത്രത്തോളം നല്ലതാകാം എന്ന് കാണാം. വളരെ നീണ്ട സമയം നടത്തിവരാം എന്ന് കൽപ്പിക്കുക, പ്രവർത്തനം ഒരു നേരം നിശ്ചലമായ പോലെ തോന്നിയാലും വിഷമിക്കേണ്ട.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "310/310 [==============================] - 265s 716ms/step - loss: 0.9917 - acc: 0.9512 - val_loss: 0.8156 - val_acc: 0.9671\n" + ] + } + ], + "source": [ + "model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc'])\n", + "hist = model.fit(ds_train, validation_data=ds_test)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "നമുക്ക് മാറ്റഗണിതമായി ശരിയായ പൂച്ചകൾ vs.നായ്ക്കൾ ക്ലാസിഫയർ ലഭിച്ചിരിക്കുന്നു എന്നാണ് തോന്നുന്നത്! \n", + "\n", + "## മോഡൽ സംരക്ഷിക്കുകയും ലോഡ് ചെയ്യുകയും ചെയ്യുക\n", + "\n", + "മോഡൽ പരിശീലിപ്പിച്ചതിനു ശേഷം, നാം ഭാവിയില്‍ ഉപയോഗിക്കാനായി മോഡൽ ആർക്കിടെക്ചർയും പരിശീലിപ്പിച്ച ഭാരങ്ങളും ഒരു ഫയലിൽ സംരക്ഷിക്കാം:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "INFO:tensorflow:Assets written to: data/cats_dogs.tf/assets\n" + ] + } + ], + "source": [ + "model.save('data/cats_dogs.tf')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "പിന്നീട് നാം മോഡൽ fichier ൽ നിന്നും എപ്പോൾ വേണമെങ്കിലും ലോഡ് ചെയ്യാം. അടുത്ത പരീക്ഷണം മോഡൽ തകർത്തേക്കും എന്ന സാഹചര്യത്തിൽ ഇത് ഉപകാരപ്രദമാകാം - വീണ്ടും തുടങ്ങേണ്ട ആവശ്യമില്ല.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "model = keras.models.load_model('data/cats_dogs.tf')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## ഫൈൻ-ട്യൂണിംഗ് ട്രാൻസ്ഫർ ലേണിംഗ്\n", + "\n", + "മുൻവശമുള്ള സെക്ഷനിൽ, ഞങ്ങൾ ഞങ്ങളുടെ സ്വന്തം ഡാറ്റാസെറ്റിലുള്ള ചിത്രങ്ങൾ ക്ലാസിഫൈ ചെയ്യുന്നതിനായി അവസാന ക്ലാസിഫയറിന്റെ ലേയർ പരിശീലിപ്പിച്ചു. എന്നിരുന്നാലും, ഫീച്ചർ എക്സ്ട്രാക്ടർ ഞങ്ങൾ പുനർപഠിപ്പിച്ചിട്ടില്ല, കൂടാതെ നമ്മുടെ മോഡൽ മോഡൽ ImageNet ഡാറ്റയിൽ പഠിച്ച ഫീച്ചറുകളെയാണ് ആശ്രയിക്കുന്നത്. നിങ്ങളുടെ വസ്തുക്കൾ സാധാരണ ImageNet ചിത്രങ്ങളിൽ നിന്ന് ദൃശ്യപരമായി വ്യത്യസ്തമാണെങ്കിൽ, ഈ ഫീച്ചറുകളുടെ സംയോജനം മികച്ചതായി പ്രവര്‍ത്തിക്കാത്തതായിരിക്കും. അതിനാൽ കോൺവൊല്യൂഷണൽ ലേയറുകളെ പരിശീലിപ്പിക്കാനും ആരംഭിക്കുന്നത് അർത്ഥവത്താണ്.\n", + "\n", + "അത് ചെയ്യാൻ, നാം മുമ്പ് ഫ്രീസ് ചെയ്ത കോൺവൊല്യൂഷണൽ ഫിൽട്ടർ പാരാമീറ്ററുകൾ അന്ഫ്രീസ് ചെയ്യാവുന്നതാണ്.\n", + "\n", + "> **കുറിപ്പ്:** നിങ്ങൾ ആദ്യം പാരാമീറ്ററുകൾ ഫ്രീസ് ചെയ്ത് ക്ലാസിഫിക്കേഷൻ ലേയറിൽ ഭാരങ്ങൾ സ്ഥിരത പുതുക്കാൻ കുറച്ച് എപ്പോച്ചുകൾ പരിശീലനം നടത്തുന്നത് അനിവാര്യമാണ്. പാരാമീറ്ററുകൾ അന്ഫ്രീസ് ചെയ്ത ഉടനെ എടുക്കുന്ന എൻഡ്-ടു-എൻഡ് നെറ്റ്‌വർക്ക് പരിശീലനം വലിയ പിശകുകൾ കോൺവൊല്യൂഷണൽ ലേയറുകളിലെ മുൻപരിചയമുള്ള ഭാരങ്ങളെ നശിപ്പിക്കാൻ സാധ്യതയുണ്ട്.\n", + "\n", + "ഞങ്ങളുടെ കോൺവൊല്യൂഷണൽ VGG-16 മോഡൽ ആദ്യ ലേയർക്ക് ഉള്ളിൽ സ്ഥിതിചെയ്യുന്നു, കൂടാതെ അതിനുള്ളിൽ തന്നെ നിരവധി ലേയറുകൾ ഉണ്ട്. നാം അതിന്റെ ഘടന നോക്കാം:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"vgg16\"\n", + "_________________________________________________________________\n", + "Layer (type) Output Shape Param # \n", + "=================================================================\n", + "input_1 (InputLayer) [(None, 224, 224, 3)] 0 \n", + "_________________________________________________________________\n", + "block1_conv1 (Conv2D) (None, 224, 224, 64) 1792 \n", + "_________________________________________________________________\n", + "block1_conv2 (Conv2D) (None, 224, 224, 64) 36928 \n", + "_________________________________________________________________\n", + "block1_pool (MaxPooling2D) (None, 112, 112, 64) 0 \n", + "_________________________________________________________________\n", + "block2_conv1 (Conv2D) (None, 112, 112, 128) 73856 \n", + "_________________________________________________________________\n", + "block2_conv2 (Conv2D) (None, 112, 112, 128) 147584 \n", + "_________________________________________________________________\n", + "block2_pool (MaxPooling2D) (None, 56, 56, 128) 0 \n", + "_________________________________________________________________\n", + "block3_conv1 (Conv2D) (None, 56, 56, 256) 295168 \n", + "_________________________________________________________________\n", + "block3_conv2 (Conv2D) (None, 56, 56, 256) 590080 \n", + "_________________________________________________________________\n", + "block3_conv3 (Conv2D) (None, 56, 56, 256) 590080 \n", + "_________________________________________________________________\n", + "block3_pool (MaxPooling2D) (None, 28, 28, 256) 0 \n", + "_________________________________________________________________\n", + "block4_conv1 (Conv2D) (None, 28, 28, 512) 1180160 \n", + "_________________________________________________________________\n", + "block4_conv2 (Conv2D) (None, 28, 28, 512) 2359808 \n", + "_________________________________________________________________\n", + "block4_conv3 (Conv2D) (None, 28, 28, 512) 2359808 \n", + "_________________________________________________________________\n", + "block4_pool (MaxPooling2D) (None, 14, 14, 512) 0 \n", + "_________________________________________________________________\n", + "block5_conv1 (Conv2D) (None, 14, 14, 512) 2359808 \n", + "_________________________________________________________________\n", + "block5_conv2 (Conv2D) (None, 14, 14, 512) 2359808 \n", + "_________________________________________________________________\n", + "block5_conv3 (Conv2D) (None, 14, 14, 512) 2359808 \n", + "_________________________________________________________________\n", + "block5_pool (MaxPooling2D) (None, 7, 7, 512) 0 \n", + "=================================================================\n", + "Total params: 14,714,688\n", + "Trainable params: 0\n", + "Non-trainable params: 14,714,688\n", + "_________________________________________________________________\n" + ] + } + ], + "source": [ + "model.layers[0].summary()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "നാം കോൺവല്യൂഷണൽ ബേസിന്റെ എല്ലാ ലെയറുകളും അൺഫ്രീസുചെയ്യാൻ കഴിയും:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "model.layers[0].trainable = True" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "എങ്കിലും, അവയെല്ലാം ഒരിക്കലിൽ അൺഫ്രീസ് ചെയ്യുക ഏറ്റവും മികച്ച ആശയം അല്ല. ആദ്യം തിരുചെറിയ കൺവോളൂഷൻ വരികളുടെ കുറച്ചു മാത്രമേ അൺഫ്രീസ് ചെയ്യാൻ കഴിയും, കാരണം അവയിൽ നമ്മുടെ ചിത്രങ്ങൾക്ക് പ്രസക്തമായ ഉയർന്ന നില പാറ്റേണുകൾ അടങ്ങിയിരിക്കുന്നു. ഉദാഹരണത്തിന്, ആരംഭത്തിൽ, അവസാന 4 വരികൾ ഒഴികെ എല്ലാം ഫ്രീസ് ചെയ്യാമെന്ന് തീരുമാനിക്കാം: \n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"sequential\"\n", + "_________________________________________________________________\n", + "Layer (type) Output Shape Param # \n", + "=================================================================\n", + "vgg16 (Functional) (None, 7, 7, 512) 14714688 \n", + "_________________________________________________________________\n", + "flatten (Flatten) (None, 25088) 0 \n", + "_________________________________________________________________\n", + "dense (Dense) (None, 1) 25089 \n", + "=================================================================\n", + "Total params: 14,739,777\n", + "Trainable params: 7,104,513\n", + "Non-trainable params: 7,635,264\n", + "_________________________________________________________________\n" + ] + } + ], + "source": [ + "for i in range(len(model.layers[0].layers)-4):\n", + " model.layers[0].layers[i].trainable = False\n", + "model.summary()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "പരിശീലിപ്പിക്കാൻ കഴിയുന്ന പാരാമീറ്ററുകളുടെ എണ്ണത്തിൽ വലിയ വർധനവുണ്ടായെങ്കിലും, അതെല്ലാ പാരാമീറ്ററുകളുടെയും ഏകദേശം 50% നിലയിലാണ് അതിന്ന് ഇപ്പോഴും കാണുന്നത് എന്ന് ശ്രദ്ധിക്കുക.\n", + "\n", + "അന്ഫ്രീസിംഗ് ചെയ്തശേഷം, നാം കൂടാതെ കുറച്ചിൽ അധികം epoch ട്രെയിനിംഗ് നടത്താവുന്നതാണ് (ഞങ്ങളുടെ ഉദാഹരണത്തിൽ, നാം ഒരെണ്ണം മാത്രം നടത്തും). പ്രീ-ട്രെയിൻ ചെയ്ത വെയിറ്റ്സുകൾക്ക് ഏറെ പ്രഭാവം ഉണ്ടായിരുതലിന് കുറവായ ലേണിംഗ് റേറ്റ് തിരഞ്ഞെടുക്കാവുന്നതാണ്. എന്നാൽ, കുറഞ്ഞ ലേണിംഗ് റേറ്റോടെ പോലും, ട്രെയിനിംഗിന്റെ തുടക്കത്തിൽ കൃത്യത കുറയുമെന്ന് പ്രതീക്ഷിക്കാം, പിന്നീട് ഫിക്സ്ഡ് വെയിറ്റ്സിന്റെ അവസ്ഥയേക്കാൾ അല്പം കൂടുതലായ നിലയിലേക്ക് എത്തും.\n", + "\n", + "> **നോട്ട്:** ഈ ട്രെയിനിംഗ് വളരെ മന്ദഗതിയിലാണ് നടക്കുന്നത്, കാരണം നെറ്റ്വർക്കിലെ നിരവധി ലെയറുകളിലൂടെ ഗ്രേഡിയന്റുകൾ ബാക്ക് പ്രോപ്പഗേറ്റ് ചെയ്യേണ്ടതിനാൽ!\n" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "310/310 [==============================] - 201s 645ms/step - loss: 0.5270 - acc: 0.9776 - val_loss: 1.4132 - val_acc: 0.9653\n" + ] + } + ], + "source": [ + "hist = model.fit(ds_train, validation_data=ds_test)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "കൂടുതൽ പാരാമീറ്ററുകളുള്ള കൂടുതൽ ശക്തമായ നെറ്റ്വർക്ക് ഉപയോഗിക്കുന്നതിനാൽ(training accuracy) ഉയർന്ന ട്രെയിനിംഗ് കൃത്യത നേടാമെന്നാണ് സാധ്യത, എന്നാൽ വാലിഡേഷൻ കൃത്യത അത്രയും വളർച്ച കാണിക്കാത്തതാണ്.\n", + "\n", + "നിങ്ങൾക്ക് ഉയർന്ന കൃത്യത നേടാനാകുമോ എന്ന് കാണാൻ നെറ്റ്വർക്കിന്റെ കുറച്ചുകൂടി ലെയറുകൾ അന്ഫ്രീസ് ചെയ്ത് കുറച്ച് കൂടുതൽ പരിശീലിപ്പിക്കാൻ മടിക്കേണ്ട.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## മറ്റ് കമ്പ്യൂട്ടർ വിസൻ മോഡറുകൾ\n", + "\n", + "VGG-16 ഏറ്റവും ലളിതമായ കമ്പ്യൂട്ടർ വിസൻ ആർക്കിടെക്ചറുകളിൽ ഒന്നാണ്. Keras നിരവധി മുൻപരിചയമുള്ള നെറ്റ്വർക്കുകൾ നൽകുന്നു. അവയിൽ ഏറ്റവും വ്യാപകമായി ഉപയോഗിക്കപ്പെടുന്നത് Microsoft വികസിപ്പിച്ച **ResNet** ആർക്കിടെക്ചറുകളും Google വികസിപ്പിച്ച **Inception** ആണ്. ഉദാഹരണത്തിന്, ഏറ്റവും ലളിതമായ ResNet-50 മോഡലിന്റെ ആർക്കിടെക്ചർ പരിശോധിക്കാം (ResNet വിവിധ ആഴത്തിലുള്ള മോഡലുകളുടെ ഒരു കുടുംബമാണ്, നിങ്ങൾക്ക് വാസ്തവത്തിൽ ഒരു ആഴത്തിലുള്ള മോഡൽ എങ്ങനെ ഉണ്ടെന്നും കാണാൻ ResNet-152 ഉപയോഗിച്ച് പരീക്ഷണം നടത്താം):\n" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"resnet50\"\n", + "__________________________________________________________________________________________________\n", + "Layer (type) Output Shape Param # Connected to \n", + "==================================================================================================\n", + "input_3 (InputLayer) [(None, 224, 224, 3) 0 \n", + "__________________________________________________________________________________________________\n", + "conv1_pad (ZeroPadding2D) (None, 230, 230, 3) 0 input_3[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv1_conv (Conv2D) (None, 112, 112, 64) 9472 conv1_pad[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv1_bn (BatchNormalization) (None, 112, 112, 64) 256 conv1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv1_relu (Activation) (None, 112, 112, 64) 0 conv1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "pool1_pad (ZeroPadding2D) (None, 114, 114, 64) 0 conv1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "pool1_pool (MaxPooling2D) (None, 56, 56, 64) 0 pool1_pad[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block1_1_conv (Conv2D) (None, 56, 56, 64) 4160 pool1_pool[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block1_1_bn (BatchNormali (None, 56, 56, 64) 256 conv2_block1_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block1_1_relu (Activation (None, 56, 56, 64) 0 conv2_block1_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block1_2_conv (Conv2D) (None, 56, 56, 64) 36928 conv2_block1_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block1_2_bn (BatchNormali (None, 56, 56, 64) 256 conv2_block1_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block1_2_relu (Activation (None, 56, 56, 64) 0 conv2_block1_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block1_0_conv (Conv2D) (None, 56, 56, 256) 16640 pool1_pool[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block1_3_conv (Conv2D) (None, 56, 56, 256) 16640 conv2_block1_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block1_0_bn (BatchNormali (None, 56, 56, 256) 1024 conv2_block1_0_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block1_3_bn (BatchNormali (None, 56, 56, 256) 1024 conv2_block1_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block1_add (Add) (None, 56, 56, 256) 0 conv2_block1_0_bn[0][0] \n", + " conv2_block1_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block1_out (Activation) (None, 56, 56, 256) 0 conv2_block1_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block2_1_conv (Conv2D) (None, 56, 56, 64) 16448 conv2_block1_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block2_1_bn (BatchNormali (None, 56, 56, 64) 256 conv2_block2_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block2_1_relu (Activation (None, 56, 56, 64) 0 conv2_block2_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block2_2_conv (Conv2D) (None, 56, 56, 64) 36928 conv2_block2_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block2_2_bn (BatchNormali (None, 56, 56, 64) 256 conv2_block2_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block2_2_relu (Activation (None, 56, 56, 64) 0 conv2_block2_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block2_3_conv (Conv2D) (None, 56, 56, 256) 16640 conv2_block2_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block2_3_bn (BatchNormali (None, 56, 56, 256) 1024 conv2_block2_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block2_add (Add) (None, 56, 56, 256) 0 conv2_block1_out[0][0] \n", + " conv2_block2_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block2_out (Activation) (None, 56, 56, 256) 0 conv2_block2_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block3_1_conv (Conv2D) (None, 56, 56, 64) 16448 conv2_block2_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block3_1_bn (BatchNormali (None, 56, 56, 64) 256 conv2_block3_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block3_1_relu (Activation (None, 56, 56, 64) 0 conv2_block3_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block3_2_conv (Conv2D) (None, 56, 56, 64) 36928 conv2_block3_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block3_2_bn (BatchNormali (None, 56, 56, 64) 256 conv2_block3_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block3_2_relu (Activation (None, 56, 56, 64) 0 conv2_block3_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block3_3_conv (Conv2D) (None, 56, 56, 256) 16640 conv2_block3_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block3_3_bn (BatchNormali (None, 56, 56, 256) 1024 conv2_block3_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block3_add (Add) (None, 56, 56, 256) 0 conv2_block2_out[0][0] \n", + " conv2_block3_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block3_out (Activation) (None, 56, 56, 256) 0 conv2_block3_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block1_1_conv (Conv2D) (None, 28, 28, 128) 32896 conv2_block3_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block1_1_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block1_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block1_1_relu (Activation (None, 28, 28, 128) 0 conv3_block1_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block1_2_conv (Conv2D) (None, 28, 28, 128) 147584 conv3_block1_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block1_2_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block1_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block1_2_relu (Activation (None, 28, 28, 128) 0 conv3_block1_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block1_0_conv (Conv2D) (None, 28, 28, 512) 131584 conv2_block3_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block1_3_conv (Conv2D) (None, 28, 28, 512) 66048 conv3_block1_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block1_0_bn (BatchNormali (None, 28, 28, 512) 2048 conv3_block1_0_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block1_3_bn (BatchNormali (None, 28, 28, 512) 2048 conv3_block1_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block1_add (Add) (None, 28, 28, 512) 0 conv3_block1_0_bn[0][0] \n", + " conv3_block1_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block1_out (Activation) (None, 28, 28, 512) 0 conv3_block1_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block2_1_conv (Conv2D) (None, 28, 28, 128) 65664 conv3_block1_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block2_1_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block2_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block2_1_relu (Activation (None, 28, 28, 128) 0 conv3_block2_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block2_2_conv (Conv2D) (None, 28, 28, 128) 147584 conv3_block2_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block2_2_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block2_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block2_2_relu (Activation (None, 28, 28, 128) 0 conv3_block2_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block2_3_conv (Conv2D) (None, 28, 28, 512) 66048 conv3_block2_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block2_3_bn (BatchNormali (None, 28, 28, 512) 2048 conv3_block2_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block2_add (Add) (None, 28, 28, 512) 0 conv3_block1_out[0][0] \n", + " conv3_block2_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block2_out (Activation) (None, 28, 28, 512) 0 conv3_block2_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block3_1_conv (Conv2D) (None, 28, 28, 128) 65664 conv3_block2_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block3_1_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block3_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block3_1_relu (Activation (None, 28, 28, 128) 0 conv3_block3_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block3_2_conv (Conv2D) (None, 28, 28, 128) 147584 conv3_block3_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block3_2_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block3_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block3_2_relu (Activation (None, 28, 28, 128) 0 conv3_block3_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block3_3_conv (Conv2D) (None, 28, 28, 512) 66048 conv3_block3_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block3_3_bn (BatchNormali (None, 28, 28, 512) 2048 conv3_block3_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block3_add (Add) (None, 28, 28, 512) 0 conv3_block2_out[0][0] \n", + " conv3_block3_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block3_out (Activation) (None, 28, 28, 512) 0 conv3_block3_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block4_1_conv (Conv2D) (None, 28, 28, 128) 65664 conv3_block3_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block4_1_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block4_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block4_1_relu (Activation (None, 28, 28, 128) 0 conv3_block4_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block4_2_conv (Conv2D) (None, 28, 28, 128) 147584 conv3_block4_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block4_2_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block4_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block4_2_relu (Activation (None, 28, 28, 128) 0 conv3_block4_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block4_3_conv (Conv2D) (None, 28, 28, 512) 66048 conv3_block4_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block4_3_bn (BatchNormali (None, 28, 28, 512) 2048 conv3_block4_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block4_add (Add) (None, 28, 28, 512) 0 conv3_block3_out[0][0] \n", + " conv3_block4_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block4_out (Activation) (None, 28, 28, 512) 0 conv3_block4_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block1_1_conv (Conv2D) (None, 14, 14, 256) 131328 conv3_block4_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block1_1_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block1_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block1_1_relu (Activation (None, 14, 14, 256) 0 conv4_block1_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block1_2_conv (Conv2D) (None, 14, 14, 256) 590080 conv4_block1_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block1_2_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block1_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block1_2_relu (Activation (None, 14, 14, 256) 0 conv4_block1_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block1_0_conv (Conv2D) (None, 14, 14, 1024) 525312 conv3_block4_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block1_3_conv (Conv2D) (None, 14, 14, 1024) 263168 conv4_block1_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block1_0_bn (BatchNormali (None, 14, 14, 1024) 4096 conv4_block1_0_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block1_3_bn (BatchNormali (None, 14, 14, 1024) 4096 conv4_block1_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block1_add (Add) (None, 14, 14, 1024) 0 conv4_block1_0_bn[0][0] \n", + " conv4_block1_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block1_out (Activation) (None, 14, 14, 1024) 0 conv4_block1_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block2_1_conv (Conv2D) (None, 14, 14, 256) 262400 conv4_block1_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block2_1_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block2_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block2_1_relu (Activation (None, 14, 14, 256) 0 conv4_block2_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block2_2_conv (Conv2D) (None, 14, 14, 256) 590080 conv4_block2_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block2_2_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block2_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block2_2_relu (Activation (None, 14, 14, 256) 0 conv4_block2_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block2_3_conv (Conv2D) (None, 14, 14, 1024) 263168 conv4_block2_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block2_3_bn (BatchNormali (None, 14, 14, 1024) 4096 conv4_block2_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block2_add (Add) (None, 14, 14, 1024) 0 conv4_block1_out[0][0] \n", + " conv4_block2_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block2_out (Activation) (None, 14, 14, 1024) 0 conv4_block2_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block3_1_conv (Conv2D) (None, 14, 14, 256) 262400 conv4_block2_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block3_1_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block3_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block3_1_relu (Activation (None, 14, 14, 256) 0 conv4_block3_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block3_2_conv (Conv2D) (None, 14, 14, 256) 590080 conv4_block3_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block3_2_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block3_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block3_2_relu (Activation (None, 14, 14, 256) 0 conv4_block3_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block3_3_conv (Conv2D) (None, 14, 14, 1024) 263168 conv4_block3_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block3_3_bn (BatchNormali (None, 14, 14, 1024) 4096 conv4_block3_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block3_add (Add) (None, 14, 14, 1024) 0 conv4_block2_out[0][0] \n", + " conv4_block3_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block3_out (Activation) (None, 14, 14, 1024) 0 conv4_block3_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block4_1_conv (Conv2D) (None, 14, 14, 256) 262400 conv4_block3_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block4_1_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block4_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block4_1_relu (Activation (None, 14, 14, 256) 0 conv4_block4_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block4_2_conv (Conv2D) (None, 14, 14, 256) 590080 conv4_block4_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block4_2_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block4_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block4_2_relu (Activation (None, 14, 14, 256) 0 conv4_block4_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block4_3_conv (Conv2D) (None, 14, 14, 1024) 263168 conv4_block4_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block4_3_bn (BatchNormali (None, 14, 14, 1024) 4096 conv4_block4_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block4_add (Add) (None, 14, 14, 1024) 0 conv4_block3_out[0][0] \n", + " conv4_block4_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block4_out (Activation) (None, 14, 14, 1024) 0 conv4_block4_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block5_1_conv (Conv2D) (None, 14, 14, 256) 262400 conv4_block4_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block5_1_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block5_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block5_1_relu (Activation (None, 14, 14, 256) 0 conv4_block5_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block5_2_conv (Conv2D) (None, 14, 14, 256) 590080 conv4_block5_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block5_2_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block5_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block5_2_relu (Activation (None, 14, 14, 256) 0 conv4_block5_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block5_3_conv (Conv2D) (None, 14, 14, 1024) 263168 conv4_block5_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block5_3_bn (BatchNormali (None, 14, 14, 1024) 4096 conv4_block5_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block5_add (Add) (None, 14, 14, 1024) 0 conv4_block4_out[0][0] \n", + " conv4_block5_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block5_out (Activation) (None, 14, 14, 1024) 0 conv4_block5_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block6_1_conv (Conv2D) (None, 14, 14, 256) 262400 conv4_block5_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block6_1_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block6_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block6_1_relu (Activation (None, 14, 14, 256) 0 conv4_block6_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block6_2_conv (Conv2D) (None, 14, 14, 256) 590080 conv4_block6_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block6_2_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block6_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block6_2_relu (Activation (None, 14, 14, 256) 0 conv4_block6_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block6_3_conv (Conv2D) (None, 14, 14, 1024) 263168 conv4_block6_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block6_3_bn (BatchNormali (None, 14, 14, 1024) 4096 conv4_block6_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block6_add (Add) (None, 14, 14, 1024) 0 conv4_block5_out[0][0] \n", + " conv4_block6_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block6_out (Activation) (None, 14, 14, 1024) 0 conv4_block6_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block1_1_conv (Conv2D) (None, 7, 7, 512) 524800 conv4_block6_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block1_1_bn (BatchNormali (None, 7, 7, 512) 2048 conv5_block1_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block1_1_relu (Activation (None, 7, 7, 512) 0 conv5_block1_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block1_2_conv (Conv2D) (None, 7, 7, 512) 2359808 conv5_block1_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block1_2_bn (BatchNormali (None, 7, 7, 512) 2048 conv5_block1_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block1_2_relu (Activation (None, 7, 7, 512) 0 conv5_block1_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block1_0_conv (Conv2D) (None, 7, 7, 2048) 2099200 conv4_block6_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block1_3_conv (Conv2D) (None, 7, 7, 2048) 1050624 conv5_block1_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block1_0_bn (BatchNormali (None, 7, 7, 2048) 8192 conv5_block1_0_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block1_3_bn (BatchNormali (None, 7, 7, 2048) 8192 conv5_block1_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block1_add (Add) (None, 7, 7, 2048) 0 conv5_block1_0_bn[0][0] \n", + " conv5_block1_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block1_out (Activation) (None, 7, 7, 2048) 0 conv5_block1_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block2_1_conv (Conv2D) (None, 7, 7, 512) 1049088 conv5_block1_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block2_1_bn (BatchNormali (None, 7, 7, 512) 2048 conv5_block2_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block2_1_relu (Activation (None, 7, 7, 512) 0 conv5_block2_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block2_2_conv (Conv2D) (None, 7, 7, 512) 2359808 conv5_block2_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block2_2_bn (BatchNormali (None, 7, 7, 512) 2048 conv5_block2_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block2_2_relu (Activation (None, 7, 7, 512) 0 conv5_block2_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block2_3_conv (Conv2D) (None, 7, 7, 2048) 1050624 conv5_block2_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block2_3_bn (BatchNormali (None, 7, 7, 2048) 8192 conv5_block2_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block2_add (Add) (None, 7, 7, 2048) 0 conv5_block1_out[0][0] \n", + " conv5_block2_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block2_out (Activation) (None, 7, 7, 2048) 0 conv5_block2_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block3_1_conv (Conv2D) (None, 7, 7, 512) 1049088 conv5_block2_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block3_1_bn (BatchNormali (None, 7, 7, 512) 2048 conv5_block3_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block3_1_relu (Activation (None, 7, 7, 512) 0 conv5_block3_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block3_2_conv (Conv2D) (None, 7, 7, 512) 2359808 conv5_block3_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block3_2_bn (BatchNormali (None, 7, 7, 512) 2048 conv5_block3_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block3_2_relu (Activation (None, 7, 7, 512) 0 conv5_block3_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block3_3_conv (Conv2D) (None, 7, 7, 2048) 1050624 conv5_block3_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block3_3_bn (BatchNormali (None, 7, 7, 2048) 8192 conv5_block3_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block3_add (Add) (None, 7, 7, 2048) 0 conv5_block2_out[0][0] \n", + " conv5_block3_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block3_out (Activation) (None, 7, 7, 2048) 0 conv5_block3_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "avg_pool (GlobalAveragePooling2 (None, 2048) 0 conv5_block3_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "predictions (Dense) (None, 1000) 2049000 avg_pool[0][0] \n", + "==================================================================================================\n", + "Total params: 25,636,712\n", + "Trainable params: 25,583,592\n", + "Non-trainable params: 53,120\n", + "__________________________________________________________________________________________________\n" + ] + } + ], + "source": [ + "resnet = keras.applications.ResNet50()\n", + "resnet.summary()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "നിങ്ങൾക്ക് കാണാൻ കഴിയുന്നതുപോലെ, മോഡലിൽ പതിവായി കാണുന്ന കെട്ടിട ഘടകങ്ങൾ ഉണ്ട്: കോൺവുല്യൂഷണൽ ലെയറുകൾ, പൂളിംഗ് ലെയറുകൾ, കൃത്യമായ ഘനപരിച്ഛേദകക്ലാസ്‌ഫയർ. ഈ മോഡൽ റണ്ണിംഗിനായി VGG-16 ഉപയോഗിക്കുന്നതിനുപോലെ തന്നെ ഉപയോഗിക്കാം. വ്യത്യസ്തമായ ResNet മോഡലുകൾ അടിസ്ഥാന മോഡലായി ഉപയോഗിച്ച്യുള്ള കോഡ് മുകളിൽ പരീക്ഷിച്ച്, കൃത്യത എങ്ങനെ മാറുന്നു എന്ന് നോക്കാം.\n", + "\n", + "## ബാച്ച് നോർമലൈസേഷൻ\n", + "\n", + "ഈ നെറ്റ്‌വർക്കിൽ മറ്റൊരു തരത്തിലുള്ള ലെയർ ഉണ്ട്: **ബാച്ച് നോർമലൈസേഷൻ**. ബാച്ച് നോർമലൈസേഷന്റെ ആശയം, ന്യുറൽ നെറ്റ്‌വർക്കിലൂടെ ഒഴുകുന്ന മൂല്യങ്ങളെ ശരിയായ പരിധിയിലേക്ക് കൊണ്ടുവരുന്നതാണ്. സാധാരണയായി, എല്ലാ മൂല്യങ്ങളും [-1,1] അല്ലെങ്കിൽ [0,1] പരിധിയിൽ ഉള്ളപ്പോൾ ന്യുറൽ നെറ്റ്‌വർക്കുകൾ മികച്ച പ്രവർത്തനം നടത്തുന്നു, അതുകൊണ്ട് നാം എൻപുട്ട് ഡാറ്റ അഥവാ ഇൻപുട്ട് ഡാറ്റയെ അനുസരിച്ച് സ്കെയിൽ ചെയ്യുന്നു/സാധാരണവത്കരിക്കുന്നു. എന്നാൽ, ഗഹനമായ ഒരു നെറ്റ്‌വർക്കിന്റെ പരിശീലനത്തിനിടയിൽ, മൂല്യങ്ങൾ ഈ പരിധിക്ക് വളരെ അപ്പുറം പോകാം, ഇത് പരിശീലനം ബുദ്ധിമുട്ടുള്ളതാക്കുന്നു. ബാച്ച് നോർമലൈസേഷൻ ലെയർ നിലവിലെ മിനിമിനി ബാച്ചിലെ എല്ലാ മൂല്യങ്ങൾക്കും ശരാശരി, സ്റ്റാന്റേർഡ് ഡിവിയേഷൻ കണക്കാക്കി, അത് ന്യുറൽ നെറ്റ്‌വർക്ക് ലെയർ വഴി കടത്തുന്നതിന് മുമ്പ് സിഗ്നലിനെ സാധാരണവത്കരിക്കുന്നു. ഇത് ഗഹന നെറ്റ്‌വർക്കുകളുടെ സ്ഥിരതയെ വളരെ മെച്ചപ്പെടുത്തുന്നു.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## പ്രധാന കാര്യങ്ങൾ\n", + "\n", + "ട്രാൻസ്ഫർ ലേണിംഗ് ഉപയോഗിച്ച്, ഞങ്ങൾ ത്വരിതമായി നമ്മുടെ കസ്റ്റം ഒബ്ജക്റ്റ് ക്ലാസിഫിക്കേഷൻ ടാസ്ക്കിനായി ക്ലാസിഫയർ ഒരുക്കാനും ഉയർന്ന കൃത്യത കൈവരിക്കാനുമായത്. എന്നാൽ, ഈ ഉദാഹരണം സമ്പൂർണമായി നീതിപൂർണ്ണമായിരുന്നില്ല, കാരണം ഓറിജിനൽ VGG-16 നെറ്റ്‌വർക്ക് പൂച്ചകളും നായകളും തിരിച്ചറിയാൻ മുൻകൂർ പരിശീലനം നേടിയതും അതിനാൽ മിക്ക പാറ്റേണുകളും നെറ്റ്‌വർക്കിൽ ഇതിനകം ഉണ്ടായിരുന്നവ പുനർഉപയോഗം ചെയ്തതായിരുന്നു. ഒരു പ്ലാന്റിലെ ഉൽപാദന ലൈൻ വിശദാംശങ്ങൾ, അല്ലെങ്കിൽ വ്യത്യസ്ത വൃക്ഷ ഇലകൾ പോലുള്ള കൂടുതൽ അഭൂതപൂർവമായ ഡൊമെയ്ൻ-സ്പെസിഫിക് ഒബ്ജക്റ്റുകളിൽ കുറവ് കൃത്യത പ്രതീക്ഷിക്കാം.\n", + "\n", + "ഇപ്പോഴുള്ള പ്രശ്നങ്ങൾ കൂടുതൽ സങ്കീർണ്ണമാണ്, അതിനാൽ കൂടുതൽ കംപ്യൂട്ടേഷൻ പവർ ആവശ്യമുണ്ട്, സി.പി.യുവിൽ എളുപ്പത്തിൽ പരിഹരിക്കാനാകുകയില്ല. അടുത്ത യൂണിറ്റിൽ, കുറഞ്ഞ കംപ്യൂട്ട് റിസോഴ്സുകൾ ഉപയോഗിച്ച് ഇപ്പോഴുള്ള മോഡൽ പരിശീലിപ്പിക്കാൻ കൂടുതൽ ലഘുവായ നടപ്പിലാക്കൽ പരീക്ഷിക്കും, കൂടാതെ അതിൻറെ ഫലം കുറച്ച് താഴ്ന്ന കൃത്യത മാത്രമേയുള്ളൂ.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**അറിയിപ്പ്**:\nഈ രേഖ AI പരിഭാഷാ സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് പരിഭാഷപ്പെടുത്തിയതാണ്. ഞങ്ങൾ കൃത്യതയ്ക്കായി ശ്രമിക്കുന്നുവെങ്കിലും, ഓട്ടോമേറ്റഡ് പരിഭാഷകളിൽ പിഴവുകൾ അല്ലെങ്കിൽ തെറ്റായ വിവരങ്ങൾ ഉണ്ടാകാൻ സാധ്യതയുണ്ട്. അതിന്റെ സ്വാഭാവിക ഭാഷയിലുള്ള അസൽ രേഖയാണ് പ്രാമാണികമായ ഉറവിടമായി പരിഗണിക്കേണ്ടത്. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ പരിഭാഷ ശുപാർശ ചെയ്യുന്നു. ഈ പരിഭാഷ ഉപയോഗിച്ച് ഉണ്ടാകുന്ന തെറ്റിദ്ധാരണകൾ അല്ലെങ്കിൽ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കായി ഞങ്ങൾ ഉത്തരവാദികളല്ല.\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "py38_tensorflow", + "language": "python", + "name": "conda-env-py38_tensorflow-py" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 4 } \ No newline at end of file diff --git a/translations/ml/lessons/5-NLP/README.md b/translations/ml/lessons/5-NLP/README.md index 7b7adbac8b..5f8b7a9699 100644 --- a/translations/ml/lessons/5-NLP/README.md +++ b/translations/ml/lessons/5-NLP/README.md @@ -1,51 +1,51 @@ -# സ്വാഭാവിക ഭാഷാ പ്രോസസ്സിംഗ് +# സ്വാഭാവിക ഭാഷ പ്രോസസ്സ് (Natural Language Processing) -![NLP ടാസ്കുകളുടെ സംഗ്രഹം ഒരു ഡ്രോയിങ്ങിൽ](../../../../translated_images/ml/ai-nlp.b22dcb8ca4707cea.webp) +![NLP ടാസ്കുകളുടെ ഒരു ചുരുക്കം ഡൂഡിൽ](../../../../translated_images/ml/ai-nlp.b22dcb8ca4707cea.webp) -ഈ ഭാഗത്തിൽ, നാം **സ്വാഭാവിക ഭാഷാ പ്രോസസ്സിംഗ് (NLP)** സംബന്ധിച്ച ടാസ്കുകൾ കൈകാര്യം ചെയ്യാൻ ന്യൂറൽ നെറ്റ്‌വർക്കുകൾ ഉപയോഗിക്കുന്നതിൽ ശ്രദ്ധ കേന്ദ്രീകരിക്കും. കമ്പ്യൂട്ടറുകൾക്ക് പരിഹരിക്കാൻ കഴിയേണ്ട നിരവധി NLP പ്രശ്നങ്ങൾ ഉണ്ട്: +ഈ വിഭാഗത്തിൽ, നാം **സ്വാഭാവിക ഭാഷ പ്രോസസ്സിംഗ് (NLP)** קש്ചങ്ങൾ കൈകാര്യം ചെയ്യുന്നതിന് ന്യൂറൽ നെറ്റ്‌വർക്കുകൾ ഉപയോഗിക്കുന്നത് ശ്രദ്ധിക്കാം. കമ്പ്യൂട്ടറുകളെ നമുക്ക് പല NLP പ്രശ്നങ്ങൾ പരിഹരിക്കാൻ ആഗ്രഹിക്കുന്നു: -* **ടെക്സ്റ്റ് ക്ലാസിഫിക്കേഷൻ** എന്നത് ടെക്സ്റ്റ് സീക്വൻസുകളുമായി ബന്ധപ്പെട്ട ഒരു സാധാരണ ക്ലാസിഫിക്കേഷൻ പ്രശ്നമാണ്. ഉദാഹരണങ്ങൾ: ഇമെയിൽ സന്ദേശങ്ങളെ സ്പാം അല്ലെങ്കിൽ നോൺ-സ്പാം ആയി വേർതിരിക്കുക, അല്ലെങ്കിൽ ലേഖനങ്ങളെ സ്പോർട്, ബിസിനസ്, രാഷ്ട്രീയ തുടങ്ങിയ വിഭാഗങ്ങളായി വർഗ്ഗീകരിക്കുക. ചാറ്റ് ബോട്ടുകൾ വികസിപ്പിക്കുമ്പോൾ, ഉപയോക്താവ് പറയാൻ ഉദ്ദേശിച്ച കാര്യം മനസിലാക്കേണ്ടതുണ്ടാകാം — ഈ സാഹചര്യത്തിൽ നാം **ഇന്റന്റ് ക്ലാസിഫിക്കേഷൻ** കൈകാര്യം ചെയ്യുകയാണ്. പലപ്പോഴും, ഇന്റന്റ് ക്ലാസിഫിക്കേഷനിൽ നിരവധി വിഭാഗങ്ങൾ കൈകാര്യം ചെയ്യേണ്ടി വരും. -* **സെന്റിമെന്റ് അനാലിസിസ്** ഒരു സാധാരണ റെഗ്രഷൻ പ്രശ്നമാണ്, ഇവിടെ ഒരു വാചകത്തിന്റെ അർത്ഥം എത്രത്തോളം പോസിറ്റീവ് അല്ലെങ്കിൽ നെഗറ്റീവ് ആണെന്ന് സൂചിപ്പിക്കുന്ന ഒരു സംഖ്യ (സെന്റിമെന്റ്) നമുക്ക് നൽകേണ്ടതുണ്ട്. സെന്റിമെന്റ് അനാലിസിസിന്റെ കൂടുതൽ പുരോഗമിച്ച രൂപമാണ് **അസ്പെക്ട്-ബേസ്ഡ് സെന്റിമെന്റ് അനാലിസിസ്** (ABSA), ഇവിടെ മുഴുവൻ വാചകത്തിന് പകരം അതിന്റെ വ്യത്യസ്ത ഭാഗങ്ങൾ (അസ്പെക്ടുകൾ) അനുസരിച്ച് സെന്റിമെന്റ് നൽകുന്നു, ഉദാ: *ഈ റസ്റ്റോറന്റിൽ, എനിക്ക് ഭക്ഷണം ഇഷ്ടമായി, പക്ഷേ അന്തരീക്ഷം ഭയങ്കരമായിരുന്നു*. -* **നെയിംഡ് എന്റിറ്റി റെക്കഗ്നിഷൻ** (NER) എന്നത് ടെക്സ്റ്റിൽ നിന്നുള്ള പ്രത്യേക എന്റിറ്റികൾ കണ്ടെത്താനുള്ള പ്രശ്നമാണ്. ഉദാഹരണത്തിന്, *ഞാൻ നാളെ പാരിസിലേക്ക് പറക്കണം* എന്ന വാചകത്തിൽ *നാളെ* എന്നത് DATE (തീയതി) എന്നെ സൂചിപ്പിക്കുന്നു, *പാരിസ്* LOCATION (സ്ഥലം) ആണ്. -* **കീവേഡ് എക്സ്ട്രാക്ഷൻ** NER പോലെയാണ്, പക്ഷേ നമുക്ക് പ്രത്യേക എന്റിറ്റി തരം മുൻപരിചയം ഇല്ലാതെ വാചകത്തിന്റെ അർത്ഥത്തിന് പ്രധാനപ്പെട്ട വാക്കുകൾ സ്വയം കണ്ടെത്തേണ്ടതുണ്ട്. -* **ടെക്സ്റ്റ് ക്ലസ്റ്ററിംഗ്** സമാനമായ വാചകങ്ങൾ കൂട്ടമായി ഗ്രൂപ്പ് ചെയ്യാൻ ഉപകാരപ്പെടും, ഉദാഹരണത്തിന്, ടെക്നിക്കൽ സപ്പോർട്ട് സംഭാഷണങ്ങളിൽ സമാനമായ അഭ്യർത്ഥനകൾ. -* **ക്വഷൻ ആൻസറിംഗ്** ഒരു മോഡലിന് ഒരു പ്രത്യേക ചോദ്യത്തിന് ഉത്തരം നൽകാനുള്ള കഴിവാണ്. മോഡൽ ഒരു ടെക്സ്റ്റ് പാസേജ്, ഒരു ചോദ്യവും ഇൻപുട്ടായി സ്വീകരിച്ച്, ചോദ്യത്തിന് ഉത്തരം ഉള്ള ടെക്സ്റ്റിലെ സ്ഥലം കണ്ടെത്തണം (അല്ലെങ്കിൽ ചിലപ്പോൾ ഉത്തരം സ്വയം സൃഷ്ടിക്കണം). -* **ടെക്സ്റ്റ് ജനറേഷൻ** ഒരു മോഡലിന് പുതിയ ടെക്സ്റ്റ് സൃഷ്ടിക്കാനുള്ള കഴിവാണ്. ഇത് ഒരു ക്ലാസിഫിക്കേഷൻ ടാസ്കായി കണക്കാക്കാം, ഒരു *ടെക്സ്റ്റ് പ്രോംപ്റ്റ്* അടിസ്ഥാനമാക്കി അടുത്ത അക്ഷരം/വാക്ക് പ്രവചിക്കുന്നത്. GPT-3 പോലുള്ള പുരോഗമിച്ച ടെക്സ്റ്റ് ജനറേഷൻ മോഡലുകൾ [prompt programming](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) അല്ലെങ്കിൽ [prompt engineering](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29) എന്ന സാങ്കേതിക വിദ്യ ഉപയോഗിച്ച് മറ്റ് NLP ടാസ്കുകളും പരിഹരിക്കാൻ കഴിയും. -* **ടെക്സ്റ്റ് സംഗ്രഹണം** കമ്പ്യൂട്ടർ ഒരു നീണ്ട ടെക്സ്റ്റ് "വായിച്ച്" അതിന്റെ പ്രധാനപ്പെട്ട ഭാഗങ്ങൾ കുറച്ച് വാചകങ്ങളായി സംഗ്രഹിക്കുന്ന സാങ്കേതിക വിദ്യയാണ്. -* **മെഷീൻ ട്രാൻസ്ലേഷൻ** ഒരു ഭാഷയിൽ ടെക്സ്റ്റ് മനസിലാക്കലും മറ്റൊരു ഭാഷയിൽ ടെക്സ്റ്റ് സൃഷ്ടിക്കലും ചേർന്ന ഒരു പ്രക്രിയയായി കാണാം. +* **ടെക്സ്റ്റ് ക്ലാസിഫിക്കേഷൻ** എന്നത് ടെക്സ്റ്റ് സീകവൻസുകളുമായി ബന്ധപ്പെട്ട ഒരു സാധാരണ ക്ലാസിഫിക്കേഷൻ പ്രശ്നമാണ്. ഉദാഹരണങ്ങൾക്ക് ഇമെയിൽ സന്ദേശങ്ങളെ സ്പാം vs. നോ-സ്പാം ആയി തിരിച്ചറിയുക, അല്ലെങ്കിൽ ലേഖനങ്ങളെ സ്പോർട്ട്, ബിസിനസ്, പോളിറ്റിക്സ് തുടങ്ങിയ വിഭാഗങ്ങളാക്കി സെഗ്മെന്റ് ചെയ്യുക. ചാറ്റ്ബോട്ടുകൾ വികസിപ്പിക്കുമ്പോൾ, ഒരു ഉപയോക്താവ് എന്ത് പറയാൻ ആഗ്രഹിച്ചിട്ടുണ്ടെന്ന് മനസിലാക്കേണ്ടതായി വരും -- ഈ സാഹചര്യത്തിൽ നാം **ഇന്റന്റ് ക്ലാസിഫിക്കേഷൻ** കൈകാര്യം ചെയ്യുന്നു. പലപ്പോഴും, ഇന്റന്റ് ക്ലാസിഫിക്കേഷനിൽ നമുക്ക് നിരവധി വിഭാഗങ്ങൾ കൈകാര്യം ചെയ്യേണ്ടി വരും. +* **സെന്റിമെന്റ് അനാലിസിസ്** എന്നത് ഒരു സാധാരണ റിഗ്രഷൻ പ്രശ്നമാണ്, ഇവിടെ നമുക്ക് ഒരു സംവേദനത്തിന് എന്താണത്രെ പോസിറ്റീവ് / നെഗറ്റീവ് അർത്ഥമുള്ളെന്ന് സൂചിപ്പിക്കുന്ന സംഖ്യ (സെന്റിമെന്റ്) നൽകിയിരിക്കുന്നു. സെന്റിമെന്റ് അനാലിസിസിന്റെ കൂടുതൽ പുരോഗമനമായ പതിപ്പ് **അസ്പെക്റ്റ്-ബേസ്ഡ് സെന്റിമെന്റ് അനാലിസിസ്** (ABSA) ആണ്, ഇവിടെ നമുക്ക് സെന്റിമെന്റ് മുഴുവൻ വാക്യത്തിനല്ല, വാക്യത്തിലെ വ്യത്യസ്ത ഭാഗങ്ങൾക്കു (അസ്പെക്റ്റുകൾ) തന്നെ നൽകേണ്ടിവരുന്നു, ഉദാ. *ഈ റെസ്റ്റോറന്റിൽ എനിക്ക് ഭക്ഷണം ഇഷ്ടപ്പെട്ടെങ്കിലും അന്തരീക്ഷം ഭയങ്കരമായിരുന്നു*. +* **നെയിംഡ് എന്റിറ്റി റികഗ്നിഷൻ** (NER) എന്നത് ടെക്സ്റ്റിൽ നിന്നും ചില പ്രത്യേക എന്റിറ്റികൾ കണ്ടെത്തുക എന്ന പ്രശ്നമാണ്. ഉദാഹരണത്തിന്, *ഞാൻ നാളെ പാരിസിലേക്ക് പറക്കണം* എന്ന വാചകത്തിൽ *നാളെ* DATE-നെയാണ് സൂചിപ്പിക്കുന്നത്, കൂടാതെ *പാരിസ്* ഒരു LOCATION ആണ്. +* **കീവേഡ് എക്സ്ട്രാക്ഷൻ** NER-നെ പോലെയാണ്, എന്നാൽ നമുക്ക് നിർദ്ദിഷ്ട എന്റിറ്റി ടൈപ്പുകൾക്ക് പ്രീരക്ഷലക്ഷ്യമായി പരിശീലനം ലഭ്യമാക്കാതെ തന്നെ വാക്യത്തിന്റെ അർത്ഥത്തിന് പ്രധാനപ്പെട്ട വാക്കുകൾ സ്വയം തിരിച്ചെടുക്കേണ്ടിവരുന്നതാണ്. +* **ടെക്സ്റ്റ് ക്ലസ്റ്ററിംഗ്** സാധാരണയായി സമാനമായ വാക്യങ്ങളെ കൂട്ടത്തിൽ കൂട്ടാനായി ഉപയോഗിക്കുന്നു, ഉദാഹരണത്തിന് സാങ്കേതിക പിന്തുണ സംഭാഷണങ്ങളിൽ സമാനമായ അഭ്യർത്ഥനകൾ. +* **ചോദ്യം-ഉത്തരം** എന്ന് പറയുന്നത് ഒരു മോഡലിനു ഒരു പ്രത്യേക ചോദ്യത്തിന് ഉത്തരം നൽകാനുള്ള കഴിവ് ആണ്. മോഡൽ ഒരു ടെക്സ്റ്റ് ഭാഗവും ഒരു ചോദ്യവും ഇൻപുട്ട് ആയി സ്വീകരിച്ച്, ചോദ്യത്തിനു ഉത്തരം ഉണ്ടാകുന്ന ടെക്സ്റ്റിൽ സ്ഥലം കണ്ടെത്തണം (അല്ലെങ്കിൽ ചിലപ്പോൾ ഉത്തരം തന്നെ സൃഷ്ടിക്കണം). +* **ടെക്സ്റ്റ് ജനറേഷൻ** എന്നത് ഒരു മോഡൽ പുതിയ ടെക്സ്റ്റ് സൃഷ്ടിക്കുന്ന കഴിവാണ്. ഇത് ഒരു ക്ലാസിഫിക്കേഷൻ ടാസ്കായി പരിഗണിക്കാം, എന്തെന്നാൽ ചില *ടെക്സ്റ്റ് പ്രോംപ്* അടിസ്ഥാനമാക്കി അടുത്ത അക്ഷരത്തെ/വാക്കിനെ പ്രവചിക്കുന്നത്. ജിപിടി-3 പോലുള്ള ആധുനിക ടെക്സ്റ്റ് ജനറേഷൻ മോഡലുകൾ [prompt programming](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) അല്ലെങ്കിൽ [prompt engineering](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29) എന്ന സാങ്കേതികവിദ്യകൾ ഉപയോഗിച്ച് ക്ലാസിഫിക്കേഷൻ പോലുള്ള മറ്റു NLP ടാസ്കുകളും പരിഹരിക്കാൻ കഴിവുണ്ട്. +* **ടെക്സ്റ്റ് സംഗ്രഹീകരണം** എന്നത് കമ്പ്യൂട്ടർ ഒരു നീണ്ട് കടുത്ത ടെക്സ്റ്റ് "വായിച്ച്" അത് കുറച്ചുപേരെ വാക്യങ്ങളായി ചുരുക്കിക്കൊടുക്കുന്ന സാങ്കേതികവിദ്യയാണ്. +* **മെഷീൻ വിവർത്തനം** എന്ന് പറയുന്നത് ഒരു ഭാഷയിൽ ടെക്സ്റ്റ് മനസ്സിലാക്കലും മറ്റൊരു ഭാഷയിൽ ടെക്സ്റ്റ് സൃഷ്ടിക്കലും ചേരുന്ന പ്രശ്നമായി കാണാം. -ആദ്യകാലത്ത്, NLP ടാസ്കുകൾ പ്രധാനമായും വ്യാകരണങ്ങൾ പോലുള്ള പരമ്പരാഗത രീതികൾ ഉപയോഗിച്ച് പരിഹരിക്കപ്പെട്ടിരുന്നു. ഉദാഹരണത്തിന്, മെഷീൻ ട്രാൻസ്ലേഷനിൽ പാഴ്സറുകൾ ഉപയോഗിച്ച് പ്രാരംഭ വാചകം സിന്റാക്സ് ട്രീയിലേക്ക് മാറ്റി, പിന്നീട് വാചകത്തിന്റെ അർത്ഥം പ്രതിനിധീകരിക്കുന്ന ഉയർന്ന തലത്തിലുള്ള സെമാന്റിക് ഘടനകൾ കണ്ടെത്തി, ആ അർത്ഥവും ലക്ഷ്യഭാഷയുടെ വ്യാകരണവും അടിസ്ഥാനമാക്കി ഫലം സൃഷ്ടിച്ചിരുന്നു. ഇന്നത്തെ കാലത്ത്, പല NLP ടാസ്കുകളും ന്യൂറൽ നെറ്റ്‌വർക്കുകൾ ഉപയോഗിച്ച് കൂടുതൽ ഫലപ്രദമായി പരിഹരിക്കപ്പെടുന്നു. +ആദ്യം, അധികം NLP ടാസ്കുകൾ പരമ്പരാഗത രീതികളായ വ്യാകരണങ്ങൾ ഉപയോഗിച്ച് പരിഹരിച്ചിരുന്നു. ഉദാഹരണത്തിന്, മെഷീൻ വിവർത്തനത്തിൽ ആരംഭത്തെ വാക്യം സിന്റാക്സ് ട്രീയെ മാറ്റാൻ പാർസറുകൾ ഉപയോഗിച്ചു, തുടർന്ന് വാക്യത്തിന്റെ അർത്ഥം പ്രതിനിധാനം ചെയ്യാൻ ഉയർന്ന തലത്തിലുള്ളസെമാന്റിക് ഘടകങ്ങൾ എടുക്കപ്പെട്ടു, പിന്നീട് ഈ അർത്ഥവും ലക്ഷ്യഭാഷയുടെ വ്യാകരണവും അടിസ്ഥാനമാക്കി ഫലം സൃഷ്ടിച്ചു. ഇക്കാലത്ത്, പല NLP ടാസ്കുകളും ന്യൂറൽ നെറ്റ്‌വർക്കുകൾ ഉപയോഗിച്ച് കൂടുതൽ ഫലപ്രദമായി പരിഹരിക്കപ്പെടുന്നു. -> പല ക്ലാസിക്കൽ NLP രീതികളും [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org) പൈതൺ ലൈബ്രറിയിൽ നടപ്പിലാക്കിയിട്ടുണ്ട്. വിവിധ NLP ടാസ്കുകൾ NLTK ഉപയോഗിച്ച് എങ്ങനെ പരിഹരിക്കാമെന്ന് വിശദീകരിക്കുന്ന മികച്ച [NLTK ബുക്ക്](https://www.nltk.org/book/) ഓൺലൈനിൽ ലഭ്യമാണ്. +> അനേകം ക്ലാസിക്കൽ NLP രീതികൾ [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org) പൈത്തൺ ലൈബ്രറിയിൽ നടപ്പിലാക്കപ്പെട്ടിരിക്കുന്നു. വിവിധ NLP ടാസ്കുകൾ NLTK ഉപയോഗിച്ച് എങ്ങനെ പരിഹരിക്കാമെന്ന് പൂർണ്ണമായും വിശദീകരിക്കുന്ന [NLTK പുസ്തകം](https://www.nltk.org/book/) ഓൺലൈനിൽ ലഭ്യമാണ്. -നമ്മുടെ കോഴ്സിൽ, നാം പ്രധാനമായും NLP-ക്കായി ന്യൂറൽ നെറ്റ്‌വർക്കുകൾ ഉപയോഗിക്കുന്നതിൽ ശ്രദ്ധ കേന്ദ്രീകരിക്കും, ആവശ്യമായിടത്ത് NLTK ഉപയോഗിക്കും. +നമ്മുടെ കോഴ്സിൽ, നാം പ്രധാനമായും NLP-ക്ക് ന്യൂറൽ നെറ്റ്‌വർക്കുകൾ ഉപയോഗിക്കുന്നതിൽ ശ്രദ്ധിക്കും, ആവശ്യമായിടത്ത് NLTK-യും ഉപയോഗിക്കും. -നാം ഇതിനകം ടാബുലാർ ഡാറ്റയും ചിത്രങ്ങളും കൈകാര്യം ചെയ്യാൻ ന്യൂറൽ നെറ്റ്‌വർക്കുകൾ ഉപയോഗിക്കുന്നതിനെക്കുറിച്ച് പഠിച്ചിട്ടുണ്ട്. ആ ഡാറ്റാ തരം들과 ടെക്സ്റ്റ് തമ്മിലുള്ള പ്രധാന വ്യത്യാസം, ടെക്സ്റ്റ് ഒരു വ്യത്യസ്ത നീളമുള്ള സീക്വൻസാണ്, എന്നാൽ ചിത്രങ്ങളുടെ ഇൻപുട്ട് വലുപ്പം മുൻകൂട്ടി അറിയപ്പെടുന്നു. കോൺവല്യൂഷണൽ നെറ്റ്‌വർക്കുകൾ ഇൻപുട്ടിൽ നിന്നുള്ള പാറ്റേണുകൾ കണ്ടെത്താൻ കഴിയും, പക്ഷേ ടെക്സ്റ്റിലെ പാറ്റേണുകൾ കൂടുതൽ സങ്കീർണ്ണമാണ്. ഉദാ: നിഷേധം വിഷയം മുതൽ അകലെ പല വാക്കുകൾക്കായി വേർതിരിക്കപ്പെട്ടാലും (ഉദാ: *I do not like oranges* vs. *I do not like those big colorful tasty oranges*), അത് ഒരേ പാറ്റേണായി വ്യാഖ്യാനിക്കണം. അതിനാൽ, ഭാഷ കൈകാര്യം ചെയ്യാൻ നാം പുതിയ ന്യൂറൽ നെറ്റ്‌വർക്ക് തരംകൾ, ഉദാ: *റികറന്റ് നെറ്റ്‌വർക്കുകൾ* (RNN)യും *ട്രാൻസ്ഫോർമറുകളും* പരിചയപ്പെടുത്തേണ്ടതുണ്ട്. +നാം ഇതിനകം തന്നെ ടാബുലർ ഡാറ്റയും ചിത്രങ്ങളുമായുള്ള പ്രശ്നങ്ങൾ പരിഹരിക്കാൻ ന്യൂറൽ നെറ്റ്‌വർക്കുകൾ ഉപയോഗിക്കുന്നതിനെക്കുറിച്ച് പഠിച്ചിട്ടുണ്ട്. ആ ഡാറ്റാ തരംകാളും ടെക്സ്റ്റിന്റെ പ്രധാന വ്യത്യാസം അത് സൂചിപ്പിക്കുന്നത് ടെക്സ്റ്റ് വ്യത്യസ്ത നീളമുള്ള ശ്രേണി ആയിരിക്കുകയാണ്, ചിത്രങ്ങളിൽ മുൻകൂട്ടി ഇൻ‌പുട്ട് വലിപ്പം അറിയാവുന്നതാണ്. കോൺവല്യൂഷണൽ നെറ്റ്‌വർക്കുകൾ ഇൻപുട്ടിൽ നിന്നുള്ള പാറ്റേണുകൾ കണ്ടെത്താൻ കഴിയുന്നിട്ടും, ടെക്സ്റ്റിന്റെ പാറ്റേണുകൾ കൂടുതൽ സങ്കീർണ്ണമാണ്. ഉദാ., നിങ്ങൾക്ക് നിഷേധം സബ്ജക്റ്റിൽ നിന്ന് വേർതിരിച്ചിട്ടുണ്ടാകാവുന്നതും വിശാലമായി പല വാക്കുകളേക്കൂടി നീണ്ടു പോകുന്നതിനാലും (ഉദാ., *എനിക്ക് ഓറഞ്ചുകൾ ഇഷ്ടമല്ല*, vs. *എനിക്ക് ആ വലിയ, നിറം നിറഞ്ഞ, രുചികരമായ ഓറഞ്ചുകൾ ഇഷ്ടമല്ല*) അത് എങ്കിലും ഒന്നായി വ്യാഖ്യാനിക്കണം. അതിനാൽ, ഭാഷ കൈകാര്യം ചെയ്യാൻ നമുക്ക് പുതിയ ന്യൂറൽ നെറ്റ്‌വർക് തരം, ഉദാഹരണത്തിന് *റികറന്റ് നെറ്റ്‌വർക്കുകൾ* വരുത്തേണ്ടിവരും, കൂടാതെ *ട്രാൻസ്ഫോർമറുകൾ*. ## ലൈബ്രറികൾ ഇൻസ്റ്റാൾ ചെയ്യുക -നിങ്ങൾ ഈ കോഴ്സ് റൺ ചെയ്യാൻ ലോക്കൽ പൈതൺ ഇൻസ്റ്റലേഷൻ ഉപയോഗിക്കുന്നുവെങ്കിൽ, താഴെ കാണുന്ന കമാൻഡുകൾ ഉപയോഗിച്ച് NLP-ക്കായി ആവശ്യമായ എല്ലാ ലൈബ്രറികളും ഇൻസ്റ്റാൾ ചെയ്യേണ്ടതുണ്ടാകും: +നിങ്ങൾ ഈ കോഴ്സ് പ്രവർത്തിപ്പിക്കാൻ നിങ്ങളുടെ ലൊക്കൽ പൈത്തൺ ഇൻസ്റ്റലേഷൻ ഉപയോഗിക്കുന്നുവെങ്കിൽ, താഴെയുള്ള കമാൻഡുകൾ ഉപയോഗിച്ച് NLP-ക്ക് ആവശ്യമായ എല്ലാ ലൈബ്രറികളും ഇൻസ്റ്റാൾ ചെയ്യേണ്ടതാകാം: -**PyTorch-ക്കായി** +**പൈടോർച്ചിനായി** ```bash -pip install -r requirements-torch.txt +pip install -r requirements-pytorch.txt ``` -**TensorFlow-ക്കായി** +**ടെൻസർഫ്ലോയ്ക്ക്** ```bash pip install -r requirements-tf.txt ``` -> TensorFlow ഉപയോഗിച്ച് NLP പരീക്ഷിക്കാൻ [Microsoft Learn](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste) സന്ദർശിക്കാം +> [Microsoft Learn](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste)ൽ ടെൻസർഫ്ലോ ഉപയോഗിച്ച് NLP പരീക്ഷിക്കാം ## 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 ഓർമ്മ അലോക്കേഷൻ വെറും ആവശ്യത്തിനു മാത്രമേ വർദ്ധിപ്പിക്കൂ എന്ന് ക്രമീകരിക്കുന്നതിന്, നിങ്ങളുടെ നോട്ട്ബുക്കുകളിൽ താഴെയുള്ള കോഡ് ഉൾപ്പെടുത്തുക: ```python physical_devices = tf.config.list_physical_devices('GPU') @@ -53,21 +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) സന്ദർശിക്കുക +ക്ലാസിക്കൽ ML വീക്ഷണത്തിൽ നിന്നുള്ള NLP പഠിക്കാൻ ആഗ്രഹിക്കുന്നവർക്ക് [ഇവിടെ ചില പാഠങ്ങൾ](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP) സന്ദർശിക്കുക -## ഈ ഭാഗത്തിൽ -ഈ ഭാഗത്തിൽ നാം പഠിക്കേണ്ടത്: +## ഈ വിഭാഗത്തിൽ +ഈ വിഭാഗത്തിൽ നാം പഠിക്കാനിരിക്കുന്നത്: -* [ടെക്സ്റ്റ് ടെൻസറുകളായി പ്രതിനിധീകരിക്കൽ](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) --- -**അസൂയാ**: -ഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചിട്ടുണ്ടെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖ അധികാരപരമായ ഉറവിടമായി കണക്കാക്കണം. നിർണായക വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനത്തിന്റെ ഉപയോഗത്തിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല. +**അറിയിപ്പ്**: +ഈ രേഖ AI പരിഭാഷാ സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് പരിഭാഷപ്പെടുത്തിയതാണ്. ഞങ്ങൾ കൃത്യതയ്ക്കായി ശ്രമിക്കുന്നുവെങ്കിലും, ഓട്ടോമേറ്റഡ് പരിഭാഷകളിൽ പിഴവുകൾ അല്ലെങ്കിൽ തെറ്റായ വിവരങ്ങൾ ഉണ്ടാകാൻ സാധ്യതയുണ്ട്. അതിന്റെ സ്വാഭാവിക ഭാഷയിലുള്ള അസൽ രേഖയാണ് പ്രാമാണികമായ ഉറവിടമായി പരിഗണിക്കേണ്ടത്. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ പരിഭാഷ ശുപാർശ ചെയ്യുന്നു. ഈ പരിഭാഷ ഉപയോഗിച്ച് ഉണ്ടാകുന്ന തെറ്റിദ്ധാരണകൾ അല്ലെങ്കിൽ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കായി ഞങ്ങൾ ഉത്തരവാദികളല്ല. \ No newline at end of file diff --git a/translations/mr/.co-op-translator.json b/translations/mr/.co-op-translator.json index 9040805c34..04ffdb343e 100644 --- a/translations/mr/.co-op-translator.json +++ b/translations/mr/.co-op-translator.json @@ -5,6 +5,12 @@ "source_file": "AGENTS.md", "language_code": "mr" }, + "CONTRIBUTING.md": { + "original_hash": "c6fd7e781b67111a90abd166d0ce4aa0", + "translation_date": "2026-07-08T22:02:16+00:00", + "source_file": "CONTRIBUTING.md", + "language_code": "mr" + }, "README.md": { "original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b", "translation_date": "2026-04-06T20:39:56+00:00", @@ -17,6 +23,19 @@ "source_file": "SECURITY.md", "language_code": "mr" }, + "__translation_failures__": { + "lessons/sketchnotes/LICENSE.md": { + "original_hash": "45ab63a2cd8f5faef6c9b150618837a4", + "source_file": "lessons/sketchnotes/LICENSE.md", + "language_code": "mr", + "failure_date": "2026-07-08T21:49:35+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:15+00:00", @@ -54,8 +73,8 @@ "language_code": "mr" }, "examples/README.md": { - "original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7", - "translation_date": "2025-10-03T11:29:04+00:00", + "original_hash": "7883d52c2e2a221e0b07a7b112a149b9", + "translation_date": "2026-07-08T21:45:14+00:00", "source_file": "examples/README.md", "language_code": "mr" }, @@ -66,8 +85,8 @@ "language_code": "mr" }, "lessons/0-course-setup/how-to-run.md": { - "original_hash": "a4717bd9103b9f6cd84d534b83534689", - "translation_date": "2026-01-15T13:09:07+00:00", + "original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1", + "translation_date": "2026-07-08T21:45:36+00:00", "source_file": "lessons/0-course-setup/how-to-run.md", "language_code": "mr" }, @@ -191,6 +210,12 @@ "source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md", "language_code": "mr" }, + "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": { + "original_hash": "99b816b6a4957ef4100cee4c4221dff9", + "translation_date": "2026-07-08T21:41:08+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", + "language_code": "mr" + }, "lessons/4-ComputerVision/08-TransferLearning/lab/README.md": { "original_hash": "7765935c35fcee69b9fe2d0cfd6963e2", "translation_date": "2025-08-26T09:53:03+00:00", @@ -330,8 +355,8 @@ "language_code": "mr" }, "lessons/5-NLP/README.md": { - "original_hash": "8ef02a9318257ea140ed3ed74442096d", - "translation_date": "2025-08-26T08:04:03+00:00", + "original_hash": "038df6f1a73e49f6430740da083bfd6d", + "translation_date": "2026-07-08T21:46:01+00:00", "source_file": "lessons/5-NLP/README.md", "language_code": "mr" }, diff --git a/translations/mr/CONTRIBUTING.md b/translations/mr/CONTRIBUTING.md new file mode 100644 index 0000000000..aca9980697 --- /dev/null +++ b/translations/mr/CONTRIBUTING.md @@ -0,0 +1,29 @@ +# AI-For-Beginners मध्ये योगदान देणे + +AI-For-Beginners मध्ये योगदान देण्यास तुमच्या स्वारस्याबद्दल धन्यवाद! आम्ही भाषांतर, धडा दुरुस्ती, आणि फॉरमॅटिंग सुधारणा स्वागत करतो. + +## मायक्रोसॉफ्ट कॉन्ट्रिब्युटर लाइसेंस करार (CLA) + +हा प्रकल्प योगदान आणि सुचना स्वीकारतो. बहुतेक योगदानांसाठी तुम्हाला कॉन्ट्रिब्युटर लाइसेंस करार (CLA) ला सहमती द्यावी लागते ज्यात तुम्ही सांगता की तुम्हाला तुमचे योगदान वापरण्याचा अधिकार आहे आणि तुम्ही प्रत्यक्षात आम्हाला ते अधिकार देत आहात. तपशीलांसाठी भेट द्या [https://cla.microsoft.com](https://cla.microsoft.com). + +जेव्हा तुम्ही पुल रिक्वेस्ट सबमिट करता, तेव्हा CLA-बॉट आपोआप ठरवेल की तुम्हाला CLA प्रदान करणे आवश्यक आहे का आणि योग्यरित्या PR सजवेल (उदा., लेबल, टिप्पणी). फक्त बॉटने दिलेल्या सूचनांचे पालन करा. आपल्याला आमच्या CLA वापरणाऱ्या सर्व रिपॉजिटरीजसाठी फक्त एकदा हे करावे लागेल. + +## योगदान कसे करावे + +### 1. टायपो / कोड त्रुटी दुरुस्त करणे +तुम्हाला कोणत्याही Jupyter नोटबुक किंवा धडा मार्कडाउन फाईलमध्ये टायपो किंवा बग आढळल्यास: +1. रिपॉजिटरी फोर्क करा. +2. टायपो किंवा खराब लिंक दुरुस्त करा. +3. दुरुस्तीचे स्पष्ट वर्णन देऊन पुल रिक्वेस्ट सबमिट करा. + +### 2. भाषांतर सबमिट करणे +आम्ही धडे इतर भाषांमध्ये भाषांतर करण्याचे स्वागत करतो! कृपया भाषांतर `translations/` निर्देशिकेतील विद्यमान फोल्डर नावांचा वापर करून ठेवा (उदाहरणार्थ `translations/es/`, `translations/pt-BR/`, `translations/zh-CN/`). + +अधिक तपशीलांसाठी पहा [etc/CONTRIBUTING.md](etc/CONTRIBUTING.md). + +--- + + +**अस्वीकरण**: +हा दस्तऐवज AI भाषांतर सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) चा वापर करून अनुवादित केला आहे. जरी आम्ही अचूकतेसाठी प्रयत्न करतो, तरी कृपया लक्षात घ्या की स्वयंचलित भाषांतरांमध्ये त्रुटी किंवा अचूकतेची कमतरता असू शकते. मूळ दस्तऐवज त्याच्या मूळ भाषेत अधिकृत स्रोत मानला पाहिजे. महत्त्वाची माहिती असल्यास, व्यावसायिक मानवी भाषांतराची शिफारस केली जाते. या भाषांतराच्या वापरामुळे उद्भवणाऱ्या कोणत्याही गैरसमज किंवा चुकीच्या अर्थलावणीसाठी आम्ही जबाबदार नाही. + \ No newline at end of file diff --git a/translations/mr/examples/README.md b/translations/mr/examples/README.md index 3bd360926a..7a2d503d14 100644 --- a/translations/mr/examples/README.md +++ b/translations/mr/examples/README.md @@ -1,85 +1,87 @@ -# 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 स्थापित आहे (आवश्यकतेनुसार ३.८ किंवा त्याहून अधिक आवृत्ती शिफारसीय). आवश्यक पॅकेजेस स्थापित करा: ```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 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. **इमेज क्लासिफायर वापरून पाहा** - प्रत्यक्ष प्रतिमांसह AI बघा +4. **मजकूर भावना विश्लेषण करा** - नॅचरल लेंग्वेज प्रोसेसिंगचा अभ्यास करा -## 💡 नवशिक्यांसाठी टिप्स +## 💡 नवशिक्यांसाठी टीपा -- **कोड टिप्पण्या काळजीपूर्वक वाचा** - प्रत्येक ओळ काय करते ते समजावून सांगतात -- **प्रयोग करा!** - मूल्ये बदलून पहा आणि काय होते ते पहा -- **सर्वकाही समजून घेण्याची चिंता करू नका** - शिकण्यासाठी वेळ लागतो -- **प्रश्न विचारा** - [Discussion board](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) -- [नैसर्गिक भाषा प्रक्रिया](../lessons/5-NLP/README.md) +- [नॅचरल लेंग्वेज प्रोसेसिंग](../lessons/5-NLP/README.md) -## 🤝 योगदान +## 🤝 योगदान करा -ही उदाहरणे उपयुक्त वाटली? त्यांना सुधारण्यात मदत करा: +या उदाहरणांनी मदत झाली का? आम्हाला त्यांना सुधारण्यात मदत करा: - समस्या नोंदवा किंवा सुधारणा सुचवा -- नवशिक्यांसाठी अधिक उदाहरणे जोडा -- दस्तऐवज आणि टिप्पण्या सुधारित करा +- नवशिक्यासाठी अधिक उदाहरणे जोडा +- दस्तऐवजीकरण आणि टिप्पण्या सुधारित करा --- -*लक्षात ठेवा: प्रत्येक तज्ञ एकदा नवशिक्या होता. आनंदाने शिका! 🎓* +*स्मरण ठेवा: प्रत्येक तज्ञ एकवेळेस नवशिक्या असतो. आनंदाने शिकत राहा! 🎓* --- -**अस्वीकरण**: -हा दस्तऐवज AI भाषांतर सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) चा वापर करून भाषांतरित करण्यात आला आहे. आम्ही अचूकतेसाठी प्रयत्नशील असलो तरी, कृपया लक्षात ठेवा की स्वयंचलित भाषांतरांमध्ये त्रुटी किंवा अचूकतेचा अभाव असू शकतो. मूळ भाषेतील दस्तऐवज हा अधिकृत स्रोत मानला जावा. महत्त्वाच्या माहितीसाठी व्यावसायिक मानवी भाषांतराची शिफारस केली जाते. या भाषांतराचा वापर करून उद्भवलेल्या कोणत्याही गैरसमज किंवा चुकीच्या अर्थासाठी आम्ही जबाबदार राहणार नाही. \ No newline at end of file + +**अस्वीकरण**: +हा दस्तऐवज AI भाषांतर सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) चा वापर करून अनुवादित केला आहे. जरी आम्ही अचूकतेसाठी प्रयत्न करतो, तरी कृपया लक्षात घ्या की स्वयंचलित भाषांतरांमध्ये त्रुटी किंवा अचूकतेची कमतरता असू शकते. मूळ दस्तऐवज त्याच्या मूळ भाषेत अधिकृत स्रोत मानला पाहिजे. महत्त्वाची माहिती असल्यास, व्यावसायिक मानवी भाषांतराची शिफारस केली जाते. या भाषांतराच्या वापरामुळे उद्भवणाऱ्या कोणत्याही गैरसमज किंवा चुकीच्या अर्थलावणीसाठी आम्ही जबाबदार नाही. + \ No newline at end of file diff --git a/translations/mr/lessons/0-course-setup/how-to-run.md b/translations/mr/lessons/0-course-setup/how-to-run.md index 010a1f3b27..da757758dd 100644 --- a/translations/mr/lessons/0-course-setup/how-to-run.md +++ b/translations/mr/lessons/0-course-setup/how-to-run.md @@ -1,12 +1,12 @@ # कोड कसा चालवायचा -या अभ्यासक्रमात चालवायच्या उदाहरणे आणि लॅब्स बऱ्याच आहेत. हे चालवण्यासाठी, तुम्हाला Jupyter Notebooks मध्ये Python कोड एक्सेक्यूट करण्याची क्षमता आवश्यक आहे जी या अभ्यासक्रमाचा भाग म्हणून दिली आहे. कोड चालवण्यासाठी तुम्हाकडे काही पर्याय आहेत: +या अभ्यासक्रमामध्ये अनेक अंमलात आणता येणारे उदाहरणे आणि प्रयोगशाळा आहेत ज्यांना तुम्हाला चालवायचे असेल. हे करण्यासाठी, या अभ्यासक्रमाचा भाग म्हणून दिलेल्या Jupyter Notebooks मध्ये Python कोड चालवण्याची क्षमता असायला हवी. कोड चालवण्यासाठी तुमच्याकडे अनेक पर्याय आहेत: -## तुमच्या संगणकावर स्थानिकरित्या चालवा +## तुमच्या संगणकावर स्थानिकपणे चालवा -कोड तुमच्या संगणकावर स्थानिकरित्या चालवण्यासाठी, Python इन्स्टॉलेशन आवश्यक आहे. एक शिफारस म्हणजे **[miniconda](https://conda.io/en/latest/miniconda.html)** इन्स्टॉल करणे — हे तुलनेने हलके इन्स्टॉलेशन आहे जे `conda` पॅकेज मॅनेजरला विविध Python **वर्च्युअल एन्व्हायर्नमेंट्स** साठी समर्थन देते. +तुमच्या संगणकावर कोड स्थानिकपणे चालवण्यासाठी, Python ची स्थापना आवश्यक आहे. एक शिफारस म्हणजे **[miniconda](https://conda.io/en/latest/miniconda.html)** इंस्टॉल करणे - हे एक तुलनेत हलके इंस्टॉलेशन आहे जे विविध Python **व्हर्चुअल एन्व्हायर्नमेंट्स** साठी `conda` पॅकेज मॅनेजरला समर्थन देते. -miniconda इन्स्टॉल केल्यानंतर, रेपॉजिटरी क्लोन करा आणि या अभ्यासक्रमासाठी वापरण्यासाठी एक वर्च्युअल एन्व्हायर्नमेंट तयार करा: +miniconda इंस्टॉल केल्यानंतर, रिपॉझिटरी क्लोन करा आणि या कोर्ससाठी वापरायच्या व्हर्चुअल एन्व्हायर्नमेंटची निर्मिती करा: ```bash git clone http://github.com/microsoft/ai-for-beginners @@ -17,17 +17,17 @@ 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 Code मध्ये डायरेक्टरी उघडल्यानंतर, तो आपोआप Python एक्स्टेंशन्स इंस्टॉल करण्याचा सल्ला देईल. तुम्हाला वर वर्णन केल्याप्रमाणे miniconda देखील इंस्टॉल करावा लागेल. -> **टीप**: जर VS Code तुम्हाला रेपॉजिटरी कंटेनरमध्ये पुन्हा उघडण्याचा सल्ला देतो, तर स्थानिक Python इन्स्टॉलेशन वापरण्यासाठी हे नाकारावे. +> **टीप**: जर VS Code तुम्हाला कंटेनरमध्ये रिपॉझिटरी पुन्हा उघडण्याचा प्रस्तावित करत असेल, तर स्थानिक Python इंस्टॉलेशन वापरण्यासाठी तुम्ही हे नाकारले पाहिजे. -### ब्राउझरमधील Jupyter वापरणे +### ब्राउझरमध्ये Jupyter वापरणे -तुमच्या संगणकावरील ब्राउझरवरून सुद्धा Jupyter एन्व्हायर्नमेंट वापरू शकता. पारंपरिक Jupyter आणि JupyterHub दोन्ही ऑटो-कंप्लीशन, कोड हायलाइटिंग वगैरे सहज विकासासाठी सुविधा देतात. +तुम्ही तुमच्या संगणकावरील ब्राउझरमधून Jupyter एन्व्हायर्नमेंट देखील वापरू शकता. पारंपरिक Jupyter आणि JupyterHub दोन्ही सोयीस्कर विकास वातावरण पुरवतात ज्यात ऑटो-कंप्लीशन, कोड हायलाइटिंग वगैरे असते. -Jupyter स्थानिकरित्या सुरू करण्यासाठी, कोर्सच्या डिरेक्टरीत जा आणि खालील आदेश चालवा: +Jupyter स्थानिकरीत्या सुरू करण्यासाठी, कोर्सच्या डायरेक्टरीमध्ये जा आणि खालील आदेश चालवा: ```bash jupyter notebook @@ -36,36 +36,36 @@ jupyter notebook ```bash jupyterhub ``` -त्यानंतर तुम्ही कोणत्याही `.ipynb` फाईल्सवर जाऊन त्यांना उघडून काम सुरू करू शकता. +त्यानंतर तुम्ही कोणत्याही `.ipynb` फाइलवर नेव्हिगेट करू शकता, ती उघडू शकता आणि काम सुरू करू शकता. -### कंटेनरमध्ये चालविणे +### कंटेनरमध्ये चालवणे -Python इन्स्टॉलेशनचा एक पर्याय म्हणजे कोड कंटेनरमध्ये चालविणे. आमच्या रेपॉजिटरीमध्ये `.devcontainer` नावाची विशिष्ट फोल्डर आहे, जी कंटेनर कसा तयार करायचा यासाठी सूचना देते. VS Code ही संधी देते की कोड कंटेनरमध्ये पुन्हा उघडावा. यासाठी Docker इन्स्टॉलेशनची गरज असेल आणि प्रक्रिया तुलनेने अधिक क्लिष्ट आहे, त्यामुळे आम्ही हे जास्त अनुभवी वापरकर्त्यांसाठी सुचवतो. +Python इंस्टॉलेशनचा एक पर्याय म्हणजे कंटेनरमध्ये कोड चालवणे. आमच्या रिपॉझिटरीमध्ये एक विशेष `.devcontainer` फोल्डर आहे जो या रिपॉझिटरीसाठी कंटेनर कसा तयार करायचा हे दर्शवितो, त्यामुळे VS Code तुम्हाला कोड कंटेनरमध्ये पुन्हा उघडण्याची संधी देते. यासाठी Docker इंस्टॉलेशन आवश्यक आहे आणि हे थोडे जटिलही आहे, त्यामुळे आम्ही हे अधिक अनुभवी वापरकर्त्यांकरता शिफारस करतो. ## क्लाउडमध्ये चालवणे -जर तुम्हाला Python स्थानिकरित्या इन्स्टॉल करायचे नसेल, आणि तुमच्याकडे काही क्लाउड संसाधने असतील - तर कोड क्लाउडमध्ये चालविणे हा चांगला पर्याय आहे. हे करण्याचे काही मार्ग आहेत: +जर तुम्हाला Python स्थानिकरित्या इंस्टॉल करायचे नसेल आणि तुम्हाला काही क्लाउड संसाधने मिळू शकत असतील तर - कोड क्लाउडमध्ये चालवणे हा एक चांगला पर्याय आहे. तुम्ही यासाठी खालीलपैकी काही मार्ग वापरू शकता: -* **[GitHub Codespaces](https://github.com/features/codespaces)** वापरणे, जे GitHub वर तुमच्यासाठी तयार केलेले एक वर्च्युअल एन्व्हायर्नमेंट आहे, जे VS Code ब्राउझर इंटरफेसद्वारे सहज प्रवेश करता येते. जर तुमच्याकडे Codespaces वापरण्याचा प्रवेश असेल, तर फक्त रेपॉजिटरीतील **Code** बटणावर क्लिक करा, codespace सुरू करा आणि लगेचच काम सुरू करा. -* **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)** वापरणे. [Binder](https://mybinder.org) GitHub वरील कोड चाचणीसाठी लोकांसाठी क्लाउडमध्ये मोफत संगणकीय संसाधने ऑफर करते. मुख्य पृष्ठावर एक बटण आहे जे रेपॉजिटरी Binder मध्ये उघडते — हे जलदपणे तुम्हाला Binder साइटवर घेऊन जाईल, जिथे एक कंटेनर तयार होईल व तुम्हाला Jupyter वेब इंटरफेस सहज आणि तत्काळ सुरू होईल. +* **[GitHub Codespaces](https://github.com/features/codespaces)** वापरणे, जे GitHub वर तुमच्यासाठी तयार केलेले एक व्हर्चुअल एन्व्हायर्नमेंट आहे, जे VS Code ब्राउझर इंटरफेसद्वारे प्रवेशयोग्य आहे. जर Codespaces मध्ये प्रवेश असेल, तर तुम्ही फक्त रिपॉझिटरीतील **Code** बटणावर क्लिक करा, एक कोडस्पेस सुरू करा, आणि लगेच कामाला लागा. +* **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)** वापरणे. [Binder](https://mybinder.org) ही लोकांना GitHub वर कोड तपासण्यासाठी क्लाउडमध्ये मोफत संगणन संसाधने पुरवतो. फ्रंट पेजवर एक बटण आहे ज्याद्वारे रिपॉझिटरी Binder मध्ये उघडू शकतो - यामुळे तुम्हाला विष्णू वेबसाइटवर पटकन नेले जाईल, जी एक कंटेनर तयार करेल आणि तुमच्यासाठी Jupyter वेब इंटरफेस सहजपणे सुरू करेल. -> **टीप**: गैरवापर टाळण्यासाठी, Binder ला काही वेब संसाधनांपर्यंत प्रवेश बंद असू शकतो. त्यामुळे काही कोड जे सार्वजनिक इंटरनेटवरून मॉडेल्स आणि/किंवा डेटासेट डाउनलोड करतात ते काम करू शकणार नाही. यासाठी काही पर्याय शोधावे लागतील. तसेच, Binder कडून पुरवलेली संगणकीय संसाधने खूप प्राथमिक स्तरावर असल्याने, विशेषत: नंतरच्या अधिक क्लिष्ट धड्यांमध्ये प्रशिक्षण हळू होऊ शकते. +> **टीप**: गैरवापर टाळण्यासाठी, Binder ला काही वेब संसाधनांवर प्रवेश बंद केला आहे. यामुळे ज्या कोडमध्ये सार्वजनिक इंटरनेटवरून मॉडेल किंवा डेटासेट्स मिळवले जातात, ते काम न करणे शक्य आहे. तुम्हाला काही पर्याय शोधावे लागू शकतात. तसेच, Binder कडून दिले जाणारे संगणक संसाधने खूप बेसिक आहेत, त्यामुळे नंतरच्या अधिक क्लिष्ट धड्यांमध्ये प्रशिक्षण संथ होऊ शकते. -## GPU सह क्लाउडमध्ये चालविणे +## GPU सह क्लाउडमध्ये चालवणे -या अभ्यासक्रमातील काही पुढील धडे GPU समर्थनामुळे खूप लाभदायक होतील. उदाहरणार्थ, मॉडेल प्रशिक्षण खूप हळू होऊ शकते अन्यथा. काही पर्याय आहेत, विशेषतः जर तुमच्याकडे [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) किंवा तुमच्या संस्थेमार्फत क्लाउड प्रवेश असेल: +या अभ्यासक्रमातील काही नंतरचे धडे GPU समर्थनामुळे खूप फायदेशीर ठरतील. उदाहरणार्थ, मॉडेल प्रशिक्षण अन्यथा खूप संथ होऊ शकते. काही पर्याय तुम्ही अनुसरू शकता, विशेषत: जर तुम्हाला [Azure 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) तयार करा आणि 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) तयार करा आणि नंतर तेथे Notebook वैशिष्ट्य वापरा. [हा व्हिडिओ](https://azure-for-academics.github.io/quickstart/azureml-papers/) दाखवतो की Azure ML नोटबुकमध्ये रिपॉझिटरी कशी क्लोन करायची आणि ती वापरायला कशी सुरुवात करायची. -तुम्ही Google Colab देखील वापरू शकता, ज्यामध्ये काही मोफत GPU समर्थन असते, आणि Jupyter Notebooks स्थानिकरित्या अपलोड करून एक-एक करून अंमलात आणू शकता. +तुम्ही Google Colab देखील वापरू शकता, ज्यात काही मोफत GPU समर्थन येते, आणि Jupyter Notebooks त्या ठिकाणी एक-एक करून अपलोड करुन अंमलात आणू शकता. --- -**सूचना**: -हा दस्ताऐवज AI अनुवाद सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) वापरून अनुवादित करण्यात आला आहे. आम्ही अचूकतेसाठी प्रयत्नशील असलो तरी, कृपया लक्षात ठेवा की स्वयंचलित अनुवादांमध्ये चुका किंवा विसंगती असू शकतात. मूळ दस्ताऐवज त्याच्या स्थानिक भाषेत अधिकृत स्रोत मानला जावा. महत्त्वपूर्ण माहितीसाठी व्यावसायिक मानवी अनुवाद करण्याची शिफारस केली जाते. या अनुवादाचा वापर केल्यामुळे उद्भवलेल्या कोणत्याही गैरसमज किंवा चुकीच्या अर्थांच्या जबाबदारी आमची नाही. +**अस्वीकरण**: +हा दस्तऐवज AI भाषांतर सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) चा वापर करून अनुवादित केला आहे. जरी आम्ही अचूकतेसाठी प्रयत्न करतो, तरी कृपया लक्षात घ्या की स्वयंचलित भाषांतरांमध्ये त्रुटी किंवा अचूकतेची कमतरता असू शकते. मूळ दस्तऐवज त्याच्या मूळ भाषेत अधिकृत स्रोत मानला पाहिजे. महत्त्वाची माहिती असल्यास, व्यावसायिक मानवी भाषांतराची शिफारस केली जाते. या भाषांतराच्या वापरामुळे उद्भवणाऱ्या कोणत्याही गैरसमज किंवा चुकीच्या अर्थलावणीसाठी आम्ही जबाबदार नाही. \ No newline at end of file diff --git a/translations/mr/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/mr/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index a2b6b0708f..4d064a520b 100644 --- a/translations/mr/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/mr/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -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": [ + "\n", "## VGG वैशिष्ट्ये काढणे\n", "\n", - "आपल्या प्रतिमांमधून वैशिष्ट्ये काढण्यासाठी VGG-16 वापरायचे असल्यास, अंतिम वर्गीकरण स्तरांशिवाय मॉडेल आवश्यक आहे. आपण खालील कोड वापरून टॉप स्तरांशिवाय VGG-16 मॉडेल तयार करू शकतो:\n" + "जर आपल्याला आमच्या प्रतिमांमधून वैशिष्ट्ये काढण्यासाठी VGG-16 वापरायचे असेल, तर आपल्याला अंतिम वर्गीकरण थरांशिवाय मॉडेल आवश्यक आहे. आपण हा कोड वापरून टॉप थरांशिवाय VGG-16 मॉडेल तयार करू शकतो:\n" ] }, { @@ -680,9 +691,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "फीचर टेन्सरचे परिमाण 7x7x512 आहे, पण त्याचे दृश्यरूप पाहण्यासाठी आम्हाला ते 2D स्वरूपात बदलावे लागले.\n", + "फीचर टेन्सरचा आकार 7x7x512 आहे, पण त्याचे दर्शन करण्यासाठी आम्हाला ते 2D स्वरूपात बदलावे लागले.\n", "\n", - "आता पाहूया की हे फीचर्स प्रतिमा वर्गीकृत करण्यासाठी वापरता येऊ शकतात का. चला प्रतिमांचा काही भाग (आपल्या प्रकरणात 50 मिनीबॅचेस) हाताने निवडूया आणि त्यांचे फीचर व्हेक्टर्स पूर्व-गणना करूया. यासाठी आपण Tensorflow **dataset** API वापरू शकतो. `map` फंक्शन डेटासेट घेते आणि दिलेल्या lambda-function चा उपयोग करून त्याचे रूपांतर करते. आम्ही या यंत्रणाचा उपयोग नवीन डेटासेट्स तयार करण्यासाठी करतो, `ds_features_train` आणि `ds_features_test`, ज्यामध्ये मूळ प्रतिमांच्या ऐवजी VGG-निघालेले फीचर्स असतात.\n" + "आता आपण पाहूया की ते फीचर्स प्रतिमा वर्गीकरणासाठी वापरता येऊ शकतात का. आपण हाताने काही भाग प्रतिमांचा (आमच्या प्रकरणात 50 मिनीबॅचेस) घेऊ आणि त्यांचे फीचर व्हेक्टर आधीपासूनच मोजून घेऊ. आम्ही Tensorflow **dataset** API वापरू शकतो हे करण्यासाठी. `map` फंक्शन dataset घेते आणि दिलेल्या lambda-function ला लागू करून त्याचे परिवर्तन करते. आम्ही या यंत्रणेद्वारे नवीन datasets, `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" + "केरस आर्किटेक्चरची सुंदरता अशी आहे की वर आपण जो 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 मिलियन पॅरामिटर्स आहेत, पण आपण फक्त 25k पॅरामिटर्स प्रशिक्षण देत आहोत. टॉप-लेवल कन्व्होल्यूशनल फिल्टर्सचे इतर सर्व पॅरामिटर्स प्री-ट्रेंड आहेत. हे चांगले आहे, कारण आपण कमी उदाहरणांसह कमी पॅरामिटर्स फाइन-ट्यून करू शकतो.\n", + "लक्षात घेऊ शकता की आपल्या नेटवर्कमधील एकूण पॅरामिटर्सची संख्या सुमारे 15 दशलक्ष आहे, तरीही आपण केवळ 25k पॅरामिटर्सचे प्रशिक्षण करत आहोत. टॉप-लेव्हल कन्व्होल्यूशनल फिल्टर्सचे सर्व इतर पॅरामिटर्स प्री-ट्रेंड आहेत. हे चांगले आहे कारण आपण कमी संख्या असलेल्या उदाहरणांसह कमी संख्या असलेले पॅरामिटर्स फाइन-ट्यून करू शकतो.\n", "\n", - "आता आपण आपले नेटवर्क प्रशिक्षण देऊ आणि किती चांगले परिणाम मिळवू शकतो ते पाहू. अपेक्षा करा की चालण्याचा वेळ बराच लांब असेल, आणि जर कार्यवाही काही वेळेसाठी थांबलेली वाटली तरी काळजी करू नका.\n" + "आता आपण आपले नेटवर्क प्रशिक्षित करू आणि पाहू की ते किती चांगले होऊ शकते. अपेक्षा करा की ही प्रक्रिया तुलनेत अधिक वेळ घेऊ शकते, आणि काही काळासाठी प्रक्रिया थांबलेली वाटली तरी काळजी करू नका.\n" ] }, { @@ -824,11 +835,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "असे दिसते की आपल्याला मांजरे विरुद्ध कुत्रे वर्गीकरणासाठी एक चांगला अचूक वर्गीकरणकर्ता मिळाला आहे!\n", + "असं दिसतं की आपल्याला कॅट vs. डॉग्स क्लासीफायर योग्य प्रमाणात अचूकता मिळाली आहे!\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 प्रतिमांपेक्षा दृष्टीकोनाने वेगळी असतील, तर वैशिष्ट्यांचा हा संयोजन सर्वोत्तम काम करू शकणार नाही. त्यामुळे convolutional स्तरांचीही प्रशिक्षण सुरू करणे योग्य ठरेल.\n", "\n", - "हे करण्यासाठी, आपण यापूर्वी गोठवलेले कन्व्होल्यूशनल फिल्टर पॅरामीटर्स अनफ्रीज करू शकतो.\n", + "ते करण्यासाठी, आपण पूर्वी थांबवून ठेवलेल्या convolutional फिल्टर पॅरामीटर्स अनफ्रीज करू शकतो.\n", "\n", - "> **टीप:** प्रथम पॅरामीटर्स गोठवणे आणि वर्गीकरण लेयरमधील वेट्स स्थिर करण्यासाठी काही इपॉक्सचे प्रशिक्षण करणे महत्त्वाचे आहे. जर तुम्ही लगेचच अनफ्रीज केलेल्या पॅरामीटर्ससह एंड-टू-एंड नेटवर्कचे प्रशिक्षण सुरू केले, तर मोठ्या चुका कन्व्होल्यूशनल लेयर्समधील पूर्व-प्रशिक्षित वेट्स नष्ट करू शकतात.\n", + "> **टीप:** प्रथम तुम्ही पॅरामीटर्स फ्रीज केले पाहिजेत आणि वर्गीकरण स्तरामध्ये वजन स्थिर करण्यासाठी काही epochs प्रशिक्षित करणे महत्त्वाचे आहे. जर तुम्ही लगेचच अनफ्रीज केलेल्या पॅरामीटर्ससह एंड-टू-एंड नेटवर्कचे प्रशिक्षण सुरू केले, तर मोठ्या त्रुटी convolutional स्तरांमधील पूर्व-प्रशिक्षित वजन नष्ट करू शकतात.\n", "\n", - "आपले कन्व्होल्यूशनल VGG-16 मॉडेल पहिल्या लेयरमध्ये स्थित आहे, आणि ते स्वतः अनेक लेयर्सचे बनलेले आहे. आपण त्याच्या संरचनेवर एक नजर टाकू शकतो:\n" + "आमचे convolutional VGG-16 मॉडेल पहिल्या स्तरात आहे, आणि त्यात स्वतः अनेक स्तरांचा समावेश आहे. आपण त्याच्या संरचनेवर एक नजर टाकू शकतो:\n" ] }, { @@ -944,7 +955,9 @@ { "cell_type": "markdown", "metadata": {}, - "source": [] + "source": [ + "आपण कन्व्हॉल्युशनल बेसच्या सर्व थरांना अनफ्रीज करू शकतो:\n" + ] }, { "cell_type": "code", @@ -959,7 +972,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "तथापि, सर्वांना एकाच वेळी अनफ्रीज करणे ही सर्वोत्तम कल्पना नाही. आपण प्रथम काही अंतिम कॉनव्होल्यूशन लेयर्स अनफ्रीज करू शकतो, कारण त्यामध्ये आमच्या प्रतिमांसाठी संबंधित उच्च स्तराचे नमुने असतात. उदाहरणार्थ, सुरुवातीला, आपण शेवटच्या 4 लेयर्स वगळता सर्व लेयर्स फ्रीज करू शकतो:\n" + "तथापि, त्यांना एकाच वेळी अनफ्रीझ करणे सर्वोत्तम कल्पना नाही. आपण प्रथम फक्त काही शेवटच्या कन्व्होल्यूशन थरांचे अनफ्रीझ करू शकतो, कारण त्यामध्ये आमच्या प्रतिमांसाठी संबंधित उच्च स्तराचे नमुने असतात. उदाहरणार्थ, सुरुवात करण्यासाठी, आपण शेवटचे ४ वगळता सर्व थर फ्रीझ करू शकतो:\n" ] }, { @@ -998,11 +1011,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "प्रशिक्षणयोग्य पॅरामिटर्सची संख्या लक्षणीयरीत्या वाढली आहे, परंतु ती अजूनही एकूण पॅरामिटर्सच्या सुमारे 50% च्या आसपास आहे.\n", + "ट्रेन होण्यायोग्य पॅरामीटर्सची संख्या लक्षणीय वाढलेली आहे, पण ती अजूनही सर्व पॅरामीटर्सच्या सुमारे ५०% च्या आसपास आहे.\n", "\n", - "अनफ्रीज केल्यानंतर, आपण आणखी काही इपॉक्ससाठी प्रशिक्षण करू शकतो (आपल्या उदाहरणात, आपण फक्त एकच करू). आपण कमी लर्निंग रेट निवडू शकता, जेणेकरून पूर्व-प्रशिक्षित वेट्सवर होणारा परिणाम कमी होईल. मात्र, अगदी कमी लर्निंग रेटसहही, प्रशिक्षणाच्या सुरुवातीला अचूकता कमी होण्याची शक्यता असते, जोपर्यंत ती निश्चित वेट्सच्या परिस्थितीपेक्षा किंचित जास्त पातळीवर पोहोचत नाही.\n", + "अनफ्रीझिंगनंतर, आपण आणखी काही एखादे प्रशिक्षणाच्या युग करता येतात (आमच्या उदाहरणात, आपण फक्त एकच करू). तुम्ही कमी शिक्षण दर देखील निवडू शकता, जेणेकरून पूर्व-प्रशिक्षित वजनांवर होणारा परिणाम कमी होईल. तथापि, कमी शिक्षण दर असूनही, तुम्ही प्रारंभिक प्रशिक्षणाच्या काळात अचूकता कमी होण्याची अपेक्षा करू शकता, आणि शेवटी निश्चित वजनांच्या बाबतीत थोड्या जास्त पातळीवर पोहोचेल.\n", "\n", - "> **Note:** हे प्रशिक्षण खूपच हळू होते, कारण आपल्याला नेटवर्कच्या अनेक थरांमधून ग्रेडियंट्स परत पाठवावे लागतात!\n" + "> **टीप:** हे प्रशिक्षण खूप हळू होते, कारण आपल्याला नेटवर्कच्या अनेक थरांतून ग्रेडियंट्स मागे पोहोचवावे लागतात!\n" ] }, { @@ -1026,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 ने विकसित केली आहेत, आणि Google चे **Inception**. उदाहरणार्थ, आपण सर्वात सोप्या ResNet-50 मॉडेलची आर्किटेक्चर पाहूया (ResNet ही वेगवेगळ्या खोलीच्या मॉडेल्सची एक मालिका आहे, तुम्हाला खरोखरच खोल मॉडेल कसे दिसते हे पाहायचे असल्यास ResNet-152 वर प्रयोग करून पाहू शकता):\n" + "VGG-16 ही सर्वात साधी संगणकीय दृष्टी आर्किटेक्चर्सपैकी एक आहे. Keras अनेक अधिक प्री-ट्रेनड नेटवर्क्स प्रदान करते. त्यातील सर्वाधिक वापरली जाणारी म्हणजे मायक्रोसॉफ्टद्वारे विकसित **ResNet** आर्किटेक्चर्स आणि गुगलद्वारे विकसित **Inception**. उदाहरणार्थ, चला सर्वात साध्या ResNet-50 मॉडेलची आर्किटेक्चर पाहूया (ResNet ही भिन्न खोलीच्या मॉडेल्सची कुटुंब आहे, तुम्हाला खरंच खोल मॉडेल कसे दिसते ते पाहायचे असल्यास ResNet-152 सह प्रयोग करू शकता):\n" ] }, { @@ -1439,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" ] }, { @@ -1452,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\n**अस्वीकरण**:\nहा दस्तऐवज AI भाषांतर सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) चा वापर करून अनुवादित केला आहे. जरी आम्ही अचूकतेसाठी प्रयत्न करतो, तरी कृपया लक्षात घ्या की स्वयंचलित भाषांतरांमध्ये त्रुटी किंवा अचूकतेची कमतरता असू शकते. मूळ दस्तऐवज त्याच्या मूळ भाषेत अधिकृत स्रोत मानला पाहिजे. महत्त्वाची माहिती असल्यास, व्यावसायिक मानवी भाषांतराची शिफारस केली जाते. या भाषांतराच्या वापरामुळे उद्भवणाऱ्या कोणत्याही गैरसमज किंवा चुकीच्या अर्थलावणीसाठी आम्ही जबाबदार नाही.\n\n" ] } ], @@ -1482,12 +1495,6 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" - }, - "coopTranslator": { - "original_hash": "c189abc107848f96051085cc30945129", - "translation_date": "2025-08-28T07:53:17+00:00", - "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", - "language_code": "mr" } }, "nbformat": 4, diff --git a/translations/mr/lessons/5-NLP/README.md b/translations/mr/lessons/5-NLP/README.md index 0bf130e6cb..59ddee3c48 100644 --- a/translations/mr/lessons/5-NLP/README.md +++ b/translations/mr/lessons/5-NLP/README.md @@ -1,51 +1,51 @@ # नैसर्गिक भाषा प्रक्रिया -![NLP कार्यांचा संक्षेप एका चित्रात](../../../../translated_images/mr/ai-nlp.b22dcb8ca4707cea.webp) +![NLP कार्यांचे सारांश एक डूडलमध्ये](../../../../translated_images/mr/ai-nlp.b22dcb8ca4707cea.webp) -या विभागात, आपण **नैसर्गिक भाषा प्रक्रिया (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 पद्धती [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org) Python लायब्ररीमध्ये अंमलात आणल्या जातात. [NLTK Book](https://www.nltk.org/book/) ऑनलाइन उपलब्ध आहे, ज्यामध्ये NLTK वापरून वेगवेगळ्या NLP कार्ये कशी सोडवता येतील याचे वर्णन आहे. +> अनेक पारंपरिक NLP पद्धती [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org) या Python लायब्ररीमध्ये लागू केलेल्या आहेत. [NLTK Book](https://www.nltk.org/book/) हा उत्कृष्ट ऑनलाइन पुस्तक उपलब्ध आहे जो वेगवेगळ्या NLP कार्ये कशी सोडवायची ते शिकवतो. -आपल्या अभ्यासक्रमात, आपण मुख्यतः 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 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 मेमरीचा वापर विविध घटकांवर अवलंबून असतो, ज्यामध्ये मिनीबॅच आकार समाविष्ट आहे. -* **मिनीबॅच आकार कमी करा**: जर GPU मेमरी समस्या आल्या, तर आपल्या कोडमध्ये मिनीबॅच आकार कमी करणे हा एक संभाव्य उपाय असू शकतो. -* **TensorFlow GPU मेमरी रिलीज**: TensorFlow च्या जुन्या आवृत्त्या GPU मेमरी योग्य प्रकारे रिलीज करत नाहीत, विशेषतः एका Python कर्नलमध्ये अनेक मॉडेल्सचे प्रशिक्षण घेताना. GPU मेमरी वापर प्रभावीपणे व्यवस्थापित करण्यासाठी, आपण TensorFlow ला GPU मेमरी आवश्यकतेनुसार वाटप करण्यासाठी कॉन्फिगर करू शकता. -* **कोड समावेश**: GPU मेमरी वाटप फक्त आवश्यकतेनुसार वाढवण्यासाठी, आपल्या नोटबुकमध्ये खालील कोड समाविष्ट करा: +या विभागात, काही उदाहरणांमध्ये आपण मोठे मॉडेल्स प्रशिक्षण देणार आहोत. +* **GPU-सक्षम संगणक वापरा**: मोठ्या मॉडेल्सवर काम करताना प्रतीक्षा वेळ कमी करण्यासाठी आपले नोटबुक GPU-सक्षम संगणकावर चालवणे शिफारसीय आहे. +* **GPU स्मृती मर्यादा**: GPU वर चालवताना GPU स्मृती संपण्याची शक्यता असते, विशेषतः मोठे मॉडेल्स प्रशिक्षण देताना. +* **GPU स्मृतीचा वापर**: प्रशिक्षणादरम्यान वापरली जाणारी GPU स्मृती अनेक घटकांवर अवलंबून असते, ज्यात मिनीबॅच आकार देखील आहे. +* **मिनीबॅच आकार कमी करा**: GPU स्मृती समस्या आल्यास, आपल्या कोडमधील मिनीबॅच आकार कमी करणे एक उपाय असू शकतो. +* **TensorFlow GPU स्मृती रिलीज**: जुन्या TensorFlow आवृत्त्या एकाच Python कर्नेलमध्ये अनेक मॉडेल्स प्रशिक्षण देताना 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) भेट द्या. +आपल्याला क्लासिक ML दृष्टिकोनातून NLP शिकण्यात रस असल्यास, [ही शिकवणी संच](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP) पहा ## या विभागात -या विभागात आपण शिकणार आहोत: +या विभागात आपण खालील गोष्टी शिकणार आहोत: -* [मजकूराचे टेन्सर्समध्ये प्रतिनिधित्व](13-TextRep/README.md) -* [शब्द एम्बेडिंग्स](14-Emdeddings/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) -**अस्वीकरण**: -हा दस्तऐवज AI भाषांतर सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) वापरून भाषांतरित करण्यात आला आहे. आम्ही अचूकतेसाठी प्रयत्नशील असलो तरी कृपया लक्षात ठेवा की स्वयंचलित भाषांतरांमध्ये त्रुटी किंवा अचूकतेचा अभाव असू शकतो. मूळ भाषेतील दस्तऐवज हा अधिकृत स्रोत मानला जावा. महत्त्वाच्या माहितीसाठी व्यावसायिक मानवी भाषांतराची शिफारस केली जाते. या भाषांतराचा वापर करून उद्भवलेल्या कोणत्याही गैरसमज किंवा चुकीच्या अर्थासाठी आम्ही जबाबदार राहणार नाही. \ No newline at end of file +--- + + +**अस्वीकरण**: +हा दस्तऐवज AI भाषांतर सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) चा वापर करून अनुवादित केला आहे. जरी आम्ही अचूकतेसाठी प्रयत्न करतो, तरी कृपया लक्षात घ्या की स्वयंचलित भाषांतरांमध्ये त्रुटी किंवा अचूकतेची कमतरता असू शकते. मूळ दस्तऐवज त्याच्या मूळ भाषेत अधिकृत स्रोत मानला पाहिजे. महत्त्वाची माहिती असल्यास, व्यावसायिक मानवी भाषांतराची शिफारस केली जाते. या भाषांतराच्या वापरामुळे उद्भवणाऱ्या कोणत्याही गैरसमज किंवा चुकीच्या अर्थलावणीसाठी आम्ही जबाबदार नाही. + \ No newline at end of file diff --git a/translations/ms/.co-op-translator.json b/translations/ms/.co-op-translator.json index e3d14582d5..b9cab65f84 100644 --- a/translations/ms/.co-op-translator.json +++ b/translations/ms/.co-op-translator.json @@ -5,6 +5,12 @@ "source_file": "AGENTS.md", "language_code": "ms" }, + "CONTRIBUTING.md": { + "original_hash": "c6fd7e781b67111a90abd166d0ce4aa0", + "translation_date": "2026-07-08T16:44:49+00:00", + "source_file": "CONTRIBUTING.md", + "language_code": "ms" + }, "README.md": { "original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b", "translation_date": "2026-04-06T16:12:41+00:00", @@ -17,6 +23,19 @@ "source_file": "SECURITY.md", "language_code": "ms" }, + "__translation_failures__": { + "lessons/sketchnotes/LICENSE.md": { + "original_hash": "45ab63a2cd8f5faef6c9b150618837a4", + "source_file": "lessons/sketchnotes/LICENSE.md", + "language_code": "ms", + "failure_date": "2026-07-08T16:31: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-29T12:02:57+00:00", @@ -54,8 +73,8 @@ "language_code": "ms" }, "examples/README.md": { - "original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7", - "translation_date": "2025-10-03T11:32:48+00:00", + "original_hash": "7883d52c2e2a221e0b07a7b112a149b9", + "translation_date": "2026-07-08T16:25:55+00:00", "source_file": "examples/README.md", "language_code": "ms" }, @@ -66,8 +85,8 @@ "language_code": "ms" }, "lessons/0-course-setup/how-to-run.md": { - "original_hash": "a4717bd9103b9f6cd84d534b83534689", - "translation_date": "2026-01-16T04:12:04+00:00", + "original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1", + "translation_date": "2026-07-08T16:26:18+00:00", "source_file": "lessons/0-course-setup/how-to-run.md", "language_code": "ms" }, @@ -191,6 +210,12 @@ "source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md", "language_code": "ms" }, + "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": { + "original_hash": "99b816b6a4957ef4100cee4c4221dff9", + "translation_date": "2026-07-08T16:22:15+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", + "language_code": "ms" + }, "lessons/4-ComputerVision/08-TransferLearning/lab/README.md": { "original_hash": "7765935c35fcee69b9fe2d0cfd6963e2", "translation_date": "2025-08-29T11:49:04+00:00", @@ -330,8 +355,8 @@ "language_code": "ms" }, "lessons/5-NLP/README.md": { - "original_hash": "8ef02a9318257ea140ed3ed74442096d", - "translation_date": "2025-08-29T11:58:10+00:00", + "original_hash": "038df6f1a73e49f6430740da083bfd6d", + "translation_date": "2026-07-08T16:26:48+00:00", "source_file": "lessons/5-NLP/README.md", "language_code": "ms" }, diff --git a/translations/ms/CONTRIBUTING.md b/translations/ms/CONTRIBUTING.md new file mode 100644 index 0000000000..cb0d325489 --- /dev/null +++ b/translations/ms/CONTRIBUTING.md @@ -0,0 +1,29 @@ +# Menyumbang kepada AI-For-Beginners + +Terima kasih atas minat anda untuk menyumbang kepada AI-For-Beginners! Kami mengalu-alukan terjemahan, pembetulan pelajaran, dan pembetulan format. + +## Perjanjian Lesen Penyumbang Microsoft (CLA) + +Projek ini mengalu-alukan sumbangan dan cadangan. Kebanyakan sumbangan memerlukan anda bersetuju dengan Perjanjian Lesen Penyumbang (CLA) yang menyatakan bahawa anda mempunyai hak untuk, dan benar-benar memberikan kami hak untuk menggunakan sumbangan anda. Untuk maklumat lanjut, lawati [https://cla.microsoft.com](https://cla.microsoft.com). + +Apabila anda menyerahkan permintaan tarik, sebuah bot CLA akan secara automatik menentukan sama ada anda perlu menyediakan CLA dan menghiasi PR dengan sewajarnya (contohnya, label, komen). Ikuti sahaja arahan yang diberikan oleh bot. Anda hanya perlu melakukan ini sekali sahaja merentasi semua repositori yang menggunakan CLA kami. + +## Cara Menyumbang + +### 1. Memperbaiki Salah Ejaan / Kesalahan Kod +Jika anda menjumpai salah ejaan atau pepijat dalam mana-mana buku nota Jupyter atau fail markdown pelajaran: +1. Fork repositori tersebut. +2. Betulkan salah ejaan atau pautan rosak. +3. Hantar Permintaan Tarik dengan penerangan yang jelas tentang pembetulan. + +### 2. Menyerahkan Terjemahan +Kami mengalu-alukan terjemahan pelajaran ke dalam bahasa lain! Sila letakkan terjemahan di bawah direktori `translations/` menggunakan nama folder sedia ada di situ (contohnya `translations/es/`, `translations/pt-BR/`, `translations/zh-CN/`). + +Untuk maklumat lanjut, sila lihat [etc/CONTRIBUTING.md](etc/CONTRIBUTING.md). + +--- + + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan perkhidmatan terjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Walaupun kami berusaha untuk ketepatan, sila ambil maklum bahawa terjemahan automatik mungkin mengandungi kesilapan atau ketidaktepatan. Dokumen asal dalam bahasa asalnya harus dianggap sebagai sumber yang sahih. Untuk maklumat penting, terjemahan oleh manusia profesional adalah disyorkan. Kami tidak bertanggungjawab terhadap sebarang salah faham atau salah tafsir yang timbul daripada penggunaan terjemahan ini. + \ No newline at end of file diff --git a/translations/ms/examples/README.md b/translations/ms/examples/README.md index eacc111e41..36874047e1 100644 --- a/translations/ms/examples/README.md +++ b/translations/ms/examples/README.md @@ -1,31 +1,31 @@ # Contoh AI Mesra Pemula -Selamat datang! Direktori ini mengandungi contoh mudah dan berdiri sendiri untuk membantu anda memulakan dengan AI dan pembelajaran mesin. Setiap contoh direka untuk mesra pemula dengan komen terperinci dan penjelasan langkah demi langkah. +Selamat datang! Direktori ini mengandungi contoh mudah dan berdiri sendiri untuk membantu anda memulakan dengan AI dan pembelajaran mesin. Setiap contoh direka untuk mesra pemula dengan komen terperinci dan penerangan langkah demi langkah. ## 📚 Gambaran Keseluruhan Contoh | Contoh | Penerangan | Kesukaran | Prasyarat | -|--------|------------|-----------|-----------| -| [Hello AI World](../../../examples/01-hello-ai-world.py) | Program AI pertama anda - pengenalan corak yang mudah | ⭐ Pemula | Asas Python | -| [Simple Neural Network](../../../examples/02-simple-neural-network.py) | Bina rangkaian neural dari awal | ⭐⭐ Pemula+ | Python, matematik asas | -| [Image Classifier](./03-image-classifier.ipynb) | Klasifikasi imej dengan model yang telah dilatih | ⭐⭐ Pemula+ | Python, numpy | -| [Text Sentiment](../../../examples/04-text-sentiment.py) | Analisis 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 pertama anda - pengenalan corak mudah | ⭐ Pemula | Asas Python | +| [Simple Neural Network](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/02-simple-neural-network.py) | Membangunkan rangkaian neural dari asas | ⭐⭐ Pemula+ | Python, matematik asas | +| [Image Classifier](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/03-image-classifier.ipynb) | Klasifikasi imej dengan model pra-latih | ⭐⭐ Pemula+ | Python, numpy | +| [Text Sentiment](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/04-text-sentiment.py) | Analisis sentimen teks (positif/negatif) | ⭐⭐ Pemula+ | Python | ## 🚀 Memulakan ### Prasyarat -Pastikan anda telah memasang Python (disarankan versi 3.8 atau lebih tinggi). Pasang pakej yang diperlukan: +Pastikan anda memasang Python (disyorkan 3.8 atau lebih tinggi). Pasang pakej yang diperlukan: ```bash -# For Python scripts +# Untuk skrip Python pip install numpy -# For Jupyter notebooks (image classifier) +# Untuk buku nota Jupyter (pengelasan imej) pip install jupyter numpy pillow tensorflow ``` -Atau gunakan persekitaran conda dari kurikulum utama: +Atau gunakan persekitaran conda daripada kurikulum utama: ```bash conda env create --name ai4beg --file ../environment.yml @@ -34,35 +34,35 @@ 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 nota Jupyter (.ipynb):** ```bash jupyter notebook 03-image-classifier.ipynb ``` ## 📖 Laluan Pembelajaran -Kami mengesyorkan mengikuti contoh-contoh ini mengikut urutan: +Kami mengesyorkan mengikuti contoh mengikut urutan: 1. **Mulakan dengan "Hello AI World"** - Pelajari asas pengenalan corak -2. **Bina Rangkaian Neural Mudah** - Fahami cara rangkaian neural berfungsi -3. **Cuba Pengklasifikasi Imej** - Lihat AI beraksi dengan imej sebenar +2. **Bina Rangkaian Neural Mudah** - Fahami bagaimana rangkaian neural berfungsi +3. **Cuba Pengelas Imej** - Lihat AI beraksi dengan imej sebenar 4. **Analisis Sentimen Teks** - Terokai pemprosesan bahasa semula jadi ## 💡 Petua untuk Pemula -- **Baca komen kod dengan teliti** - Ia menerangkan apa yang dilakukan oleh setiap baris -- **Bereksperimen!** - Cuba ubah nilai dan lihat apa yang berlaku -- **Jangan risau jika tidak memahami semuanya** - Pembelajaran memerlukan masa +- **Baca komen kod dengan teliti** - Ia menerangkan apa yang dilakukan setiap baris +- **Eksperimen!** - Cuba ubah nilai dan lihat apa yang berlaku +- **Jangan risau jika tidak memahami semuanya** - Pembelajaran mengambil masa - **Tanya soalan** - Gunakan [Papan Perbincangan](https://github.com/microsoft/AI-For-Beginners/discussions) ## 🔗 Langkah Seterusnya -Selepas melengkapkan contoh-contoh ini, terokai kurikulum penuh: +Selepas menyiapkan contoh ini, terokai kurikulum penuh: - [Pengenalan kepada AI](../lessons/1-Intro/README.md) - [Rangkaian Neural](../lessons/3-NeuralNetworks/README.md) - [Penglihatan Komputer](../lessons/4-ComputerVision/README.md) @@ -70,7 +70,7 @@ Selepas melengkapkan contoh-contoh ini, terokai kurikulum penuh: ## 🤝 Menyumbang -Mendapati contoh-contoh ini berguna? Bantu kami memperbaikinya: +Mendapati contoh ini berguna? Bantu kami memperbaikinya: - Laporkan isu atau cadangkan penambahbaikan - Tambah lebih banyak contoh untuk pemula - Perbaiki dokumentasi dan komen @@ -81,5 +81,7 @@ Mendapati contoh-contoh ini berguna? Bantu kami memperbaikinya: --- -**Penafian**: -Dokumen ini telah diterjemahkan menggunakan perkhidmatan terjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Walaupun kami berusaha untuk memastikan ketepatan, sila ambil perhatian bahawa terjemahan automatik mungkin mengandungi kesilapan atau ketidaktepatan. Dokumen asal dalam bahasa asalnya harus dianggap sebagai sumber yang berwibawa. Untuk maklumat yang kritikal, terjemahan manusia profesional adalah disyorkan. Kami tidak bertanggungjawab atas sebarang salah faham atau salah tafsir yang timbul daripada penggunaan terjemahan ini. \ No newline at end of file + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan perkhidmatan terjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Walaupun kami berusaha untuk ketepatan, sila ambil maklum bahawa terjemahan automatik mungkin mengandungi kesilapan atau ketidaktepatan. Dokumen asal dalam bahasa asalnya harus dianggap sebagai sumber yang sahih. Untuk maklumat penting, terjemahan oleh manusia profesional adalah disyorkan. Kami tidak bertanggungjawab terhadap sebarang salah faham atau salah tafsir yang timbul daripada penggunaan terjemahan ini. + \ No newline at end of file diff --git a/translations/ms/lessons/0-course-setup/how-to-run.md b/translations/ms/lessons/0-course-setup/how-to-run.md index 96ee57b7f2..5ce00c23bd 100644 --- a/translations/ms/lessons/0-course-setup/how-to-run.md +++ b/translations/ms/lessons/0-course-setup/how-to-run.md @@ -1,12 +1,12 @@ # Cara Menjalankan Kod -Kurikulum ini mengandungi banyak contoh dan makmal yang boleh dilaksanakan yang anda ingin jalankan. Untuk melakukan ini, anda memerlukan keupayaan untuk melaksanakan kod Python dalam Jupyter Notebooks yang disediakan sebagai sebahagian daripada kurikulum ini. Anda mempunyai beberapa pilihan untuk menjalankan kod: +Kurikulum ini mengandungi banyak contoh dan makmal yang boleh dilaksanakan yang anda ingin jalankan. Untuk melakukan ini, anda perlu mempunyai keupayaan untuk melaksanakan kod Python dalam Jupyter Notebooks yang disediakan sebagai sebahagian daripada kurikulum ini. Anda mempunyai beberapa pilihan untuk menjalankan kod: ## Jalankan secara tempatan di komputer anda -Untuk menjalankan kod secara tempatan di komputer anda, pemasangan Python diperlukan. Satu cadangan adalah untuk memasang **[miniconda](https://conda.io/en/latest/miniconda.html)** - ia adalah pemasangan yang agak ringan yang menyokong pengurus pakej `conda` untuk pelbagai **persekitaran maya** Python. +Untuk menjalankan kod secara tempatan di komputer anda, pemasangan Python diperlukan. Satu cadangan adalah memasang **[miniconda](https://conda.io/en/latest/miniconda.html)** - ia adalah pemasangan yang agak ringan yang menyokong pengurus pakej `conda` untuk pelbagai **persekitaran maya** Python. -Selepas anda memasang miniconda, klon repositori dan buat persekitaran maya untuk digunakan dalam kursus ini: +Selepas anda memasang miniconda, klon repositori dan buat persekitaran maya untuk digunakan bagi kursus ini: ```bash git clone http://github.com/microsoft/ai-for-beginners @@ -19,13 +19,13 @@ conda activate ai4beg Kurikulum ini paling baik digunakan apabila dibuka dalam [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) dengan [Sambungan Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste). -> **Nota**: Setelah anda klon dan buka direktori dalam VS Code, ia akan secara automatik mencadangkan anda memasang sambungan Python. Anda juga perlu memasang miniconda seperti yang diterangkan di atas. +> **Nota**: Setelah anda mengklon dan membuka direktori dalam VS Code, ia akan secara automatik mencadangkan anda memasang sambungan Python. Anda juga perlu memasang miniconda seperti yang diterangkan di atas. -> **Nota**: Jika VS Code mencadangkan anda untuk buka semula repositori dalam bekas, anda harus tolak ini untuk menggunakan pemasangan Python tempatan. +> **Nota**: Jika VS Code mencadangkan anda untuk membuka semula repositori dalam kontena, anda harus menolak ini untuk menggunakan pemasangan Python tempatan. ### Menggunakan Jupyter dalam Pelayar -Anda juga boleh menggunakan persekitaran Jupyter dari pelayar pada komputer anda sendiri. Baik Jupyter klasik dan JupyterHub menyediakan persekitaran pembangunan yang mudah dengan auto-selesaian, sorotan kod, dan lain-lain. +Anda juga boleh menggunakan persekitaran Jupyter dari pelayar pada komputer anda sendiri. Kedua-dua Jupyter klasik dan JupyterHub menyediakan persekitaran pembangunan yang mudah dengan auto-selesaian, penyorotan kod, dan sebagainya. Untuk memulakan Jupyter secara tempatan, pergi ke direktori kursus, dan laksanakan: @@ -36,36 +36,36 @@ atau ```bash jupyterhub ``` -Anda kemudian boleh navigasi ke mana-mana fail `.ipynb`, bukanya dan mula bekerja. +Anda kemudian boleh melayari ke mana-mana fail `.ipynb`, membukanya dan mula bekerja. -### Menjalankan dalam bekas +### Menjalankan dalam kontena -Satu alternatif kepada pemasangan Python adalah menjalankan kod dalam bekas. Oleh kerana repositori kami membekalkan folder `.devcontainer` khas yang memberi arahan bagaimana untuk membina bekas untuk repo ini, VS Code menawarkan peluang untuk membuka semula kod dalam bekas. Ini akan memerlukan pemasangan Docker, dan juga lebih kompleks, jadi kami mengesyorkan ini kepada pengguna yang lebih berpengalaman. +Salah satu alternatif kepada pemasangan Python adalah menjalankan kod dalam kontena. Oleh kerana repositori kami menyediakan folder `.devcontainer` khas yang mengarahkan bagaimana untuk membina kontena untuk repo ini, VS Code menawarkan peluang untuk membuka semula kod dalam kontena. Ini akan memerlukan pemasangan Docker, dan juga lebih kompleks, jadi kami mencadangkan ini kepada pengguna yang lebih berpengalaman. ## Menjalankan di Awan -Jika anda tidak mahu memasang Python secara tempatan, dan mempunyai akses kepada beberapa sumber awan - satu alternatif yang baik adalah menjalankan kod di awan. Terdapat beberapa cara anda boleh melakukan ini: +Jika anda tidak mahu memasang Python secara tempatan, dan mempunyai akses kepada beberapa sumber awan - alternatif yang baik adalah menjalankan kod di awan. Terdapat beberapa cara anda boleh melakukan ini: -* Menggunakan **[GitHub Codespaces](https://github.com/features/codespaces)**, iaitu persekitaran maya yang dicipta untuk anda di GitHub, boleh diakses melalui antaramuka pelayar VS Code. Jika anda mempunyai akses ke Codespaces, anda hanya perlu klik butang **Code** dalam repo, mulakan codespace, dan mula menjalankan dengan pantas. -* Menggunakan **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) menawarkan sumber pengkomputeran percuma yang disediakan di awan untuk orang seperti anda menguji kod di GitHub. Terdapat butang di halaman depan untuk membuka repositori dalam Binder - ini akan membawa anda dengan cepat ke laman binder, yang akan membina bekas asas dan memulakan antaramuka web Jupyter untuk anda tanpa gangguan. +* Menggunakan **[GitHub Codespaces](https://github.com/features/codespaces)**, yang merupakan persekitaran maya yang dicipta untuk anda di GitHub, boleh diakses melalui antara muka pelayar VS Code. Jika anda mempunyai akses ke Codespaces, anda hanya perlu klik butang **Code** dalam repo, mulakan codespace, dan mula menjalankan dengan cepat. +* Menggunakan **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) menawarkan sumber pengkomputeran percuma yang disediakan di awan untuk orang seperti anda menguji kod di GitHub. Terdapat butang di halaman utama untuk membuka repositori dalam Binder - ini akan dengan cepat membawa anda ke laman Binder, yang akan membina kontena asas dan memulakan antara muka web Jupyter untuk anda dengan lancar. -> **Nota**: Untuk mengelakkan penyalahgunaan, Binder menghadkan akses kepada beberapa sumber web. Ini mungkin menghalang beberapa kod daripada berfungsi, yang mengambil model dan/atau set data dari Internet awam. Anda mungkin perlu mencari jalan penyelesaian. Juga, sumber pengkomputeran yang disediakan oleh Binder adalah agak asas, jadi latihan akan lambat, terutamanya dalam pelajaran yang lebih kompleks kemudian. +> **Nota**: Untuk mengelakkan penyalahgunaan, Binder mempunyai akses ke beberapa sumber web yang disekat. Ini mungkin menghalang beberapa kod daripada berfungsi, yang mengambil model dan/atau set data dari Internet awam. Anda mungkin perlu mencari jalan penyelesaian. Juga, sumber pengkomputeran yang disediakan oleh Binder agak asas, jadi latihan akan menjadi perlahan, terutamanya dalam pelajaran yang lebih kompleks kemudian. ## Menjalankan di Awan dengan GPU -Beberapa pelajaran kemudian dalam kurikulum ini akan sangat mendapat manfaat daripada sokongan GPU. Latihan model, sebagai contoh, boleh menjadi sangat lambat jika tidak. Terdapat beberapa pilihan yang boleh anda ikuti, terutamanya jika anda mempunyai akses ke awan sama ada melalui [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste), atau melalui institusi anda: +Sesetengah pelajaran kemudian dalam kurikulum ini akan sangat mendapat manfaat daripada sokongan GPU. Latihan model, sebagai contoh, boleh menjadi sangat perlahan jika tidak. Terdapat beberapa pilihan yang anda boleh ikuti, terutamanya jika anda mempunyai akses ke awan sama ada melalui [Azure untuk Pelajar](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste), atau melalui institusi anda: -* Buat [Data Science Virtual Machine](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) dan sambungkan kepadanya melalui Jupyter. Anda boleh klon repo terus ke mesin itu, dan mula belajar. VM siri NC mempunyai sokongan GPU. +* Cipta [Data Science Virtual Machine](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) dan sambung ke sana melalui Jupyter. Anda boleh mengklon repo terus ke mesin tersebut, dan mula belajar. VM siri NC mempunyai sokongan GPU. -> **Nota**: Sesetengah langganan, termasuk Azure for Students, tidak menyediakan sokongan GPU secara automatik. Anda mungkin perlu memohon teras GPU tambahan dengan permintaan sokongan teknikal. +> **Nota**: Sesetengah langganan, termasuk Azure untuk Pelajar, tidak menyediakan sokongan GPU secara langsung. Anda mungkin perlu memohon tambahan teras GPU dengan permintaan sokongan teknikal. -* Buat [Azure Machine Learning Workspace](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) dan kemudian gunakan ciri Notebook di situ. [Video ini](https://azure-for-academics.github.io/quickstart/azureml-papers/) menunjukkan cara untuk klon repositori ke dalam notebook Azure ML dan mula menggunakannya. +* Cipta [Azure Machine Learning Workspace](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) dan kemudian gunakan ciri Notebook di sana. [Video ini](https://azure-for-academics.github.io/quickstart/azureml-papers/) menunjukkan cara mengklon repositori ke dalam notebook Azure ML dan mula menggunakannya. -Anda juga boleh menggunakan Google Colab, yang datang dengan sokongan GPU percuma, dan memuat naik Jupyter Notebooks di sana untuk melaksanakannya satu persatu. +Anda juga boleh menggunakan Google Colab, yang disertakan dengan sokongan GPU percuma, dan memuat naik Jupyter Notebooks ke sana untuk menjalankannya satu persatu. --- -**Penafian**: -Dokumen ini telah diterjemahkan menggunakan perkhidmatan terjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Walaupun kami berusaha untuk memastikan ketepatan, sila ambil perhatian bahawa terjemahan automatik mungkin mengandungi kesilapan atau ketidaktepatan. Dokumen asal dalam bahasa asalnya hendaklah dianggap sebagai sumber yang sahih. Untuk maklumat penting, terjemahan profesional oleh manusia adalah disyorkan. Kami tidak bertanggungjawab terhadap sebarang salah faham atau salah tafsir yang timbul daripada penggunaan terjemahan ini. +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan perkhidmatan terjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Walaupun kami berusaha untuk ketepatan, sila ambil maklum bahawa terjemahan automatik mungkin mengandungi kesilapan atau ketidaktepatan. Dokumen asal dalam bahasa asalnya harus dianggap sebagai sumber yang sahih. Untuk maklumat penting, terjemahan oleh manusia profesional adalah disyorkan. Kami tidak bertanggungjawab terhadap sebarang salah faham atau salah tafsir yang timbul daripada penggunaan terjemahan ini. \ No newline at end of file diff --git a/translations/ms/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/ms/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index 89a7af2163..7cb48b035d 100644 --- a/translations/ms/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/ms/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -6,9 +6,9 @@ "source": [ "# Model pra-latih dan pembelajaran pemindahan\n", "\n", - "Melatih CNN boleh mengambil masa yang lama, dan banyak data diperlukan untuk tugas tersebut. Walau bagaimanapun, sebahagian besar masa dihabiskan untuk mempelajari penapis tahap rendah terbaik yang digunakan oleh rangkaian untuk mengekstrak corak daripada imej. Satu persoalan semula jadi timbul - bolehkah kita menggunakan rangkaian neural yang telah dilatih pada satu set data dan menyesuaikannya untuk mengklasifikasikan imej yang berbeza tanpa proses latihan penuh?\n", + "Latihan CNN boleh mengambil masa yang lama, dan banyak data diperlukan untuk tugas itu. Walau bagaimanapun, sebahagian besar masa digunakan untuk mempelajari penapis tahap rendah terbaik yang digunakan oleh rangkaian untuk mengekstrak corak dari imej. Soalan semula jadi timbul - bolehkah kita menggunakan rangkaian neural yang dilatih pada satu set data dan menyesuaikannya untuk mengklasifikasikan imej yang berbeza tanpa proses latihan penuh?\n", "\n", - "Pendekatan ini dipanggil **pembelajaran pemindahan**, kerana kita memindahkan sebahagian pengetahuan daripada satu model rangkaian neural kepada yang lain. Dalam pembelajaran pemindahan, kita biasanya bermula dengan model pra-latih, yang telah dilatih pada set data imej yang besar, seperti **ImageNet**. Model-model tersebut sudah mampu melakukan tugas yang baik dalam mengekstrak ciri-ciri berbeza daripada imej umum, dan dalam banyak kes, hanya dengan membina pengklasifikasi di atas ciri-ciri yang diekstrak tersebut boleh menghasilkan keputusan yang baik.\n" + "Pendekatan ini dipanggil **pembelajaran pemindahan**, kerana kita memindahkan pengetahuan daripada satu model rangkaian neural ke model yang lain. Dalam pembelajaran pemindahan, kita biasanya bermula dengan model pra-latih, yang telah dilatih pada set data imej yang besar, seperti **ImageNet**. Model-model tersebut sudah boleh melakukan kerja yang baik mengekstrak ciri-ciri yang berbeza daripada imej generik, dan dalam banyak kes hanya membina pengelasan di atas ciri-ciri yang diekstrak itu boleh memberikan hasil yang baik.\n" ] }, { @@ -31,9 +31,9 @@ "source": [ "## Dataset Kucing vs. Anjing\n", "\n", - "Dalam unit ini, kita akan menyelesaikan masalah kehidupan sebenar untuk mengklasifikasikan imej kucing dan anjing. Untuk tujuan ini, kita akan menggunakan [Dataset Kucing vs. Anjing Kaggle](https://www.kaggle.com/c/dogs-vs-cats), yang juga boleh dimuat turun [dari Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n", + "Dalam unit ini, kita akan menyelesaikan masalah sebenar mengklasifikasikan imej kucing dan anjing. Oleh itu, kita akan menggunakan [Dataset Kucing vs. Anjing Kaggle](https://www.kaggle.com/c/dogs-vs-cats), yang juga boleh dimuat turun [dari Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n", "\n", - "Mari kita muat turun dataset ini dan ekstraknya ke dalam direktori `data` (proses ini mungkin mengambil masa!):\n" + "Mari muat turun dataset ini dan ekstrak ke dalam direktori `data` (proses ini mungkin mengambil masa!):\n" ] }, { @@ -64,7 +64,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Malangnya, terdapat beberapa fail imej yang rosak dalam set data. Kita perlu melakukan pembersihan pantas untuk memeriksa fail yang rosak. Supaya tidak mengganggu tutorial ini, kami telah memindahkan kod untuk mengesahkan set data ke dalam modul.\n" + "Malangnya, terdapat beberapa fail imej yang rosak dalam set data. Kita perlu membuat pembersihan cepat untuk memeriksa fail yang rosak. Untuk tidak merosakkan tutorial ini, kami memindahkan kod untuk mengesahkan set data ke dalam modul.\n" ] }, { @@ -333,13 +333,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Memuatkan Dataset\n", + "## Memuatkan Set Data\n", "\n", - "Dalam contoh sebelumnya, kita memuatkan dataset yang telah tersedia dalam Keras. Sekarang kita akan berurusan dengan dataset kita sendiri, yang perlu dimuatkan dari direktori imej.\n", + "Dalam contoh sebelum ini, kami memuatkan set data yang dibina dalam Keras. Kini kami akan mengendalikan set data kami sendiri, yang perlu dimuatkan dari direktori imej.\n", "\n", - "Dalam kehidupan sebenar, saiz dataset imej boleh menjadi sangat besar, dan kita tidak boleh bergantung kepada semua data untuk dimuatkan ke dalam memori. Oleh itu, dataset sering diwakili sebagai **generator** yang boleh mengembalikan data dalam minibatch yang sesuai untuk latihan.\n", + "Dalam kehidupan sebenar, saiz set data imej boleh menjadi agak besar, dan tidak semua data boleh dimuatkan ke dalam memori. Oleh itu, set data sering diwakili sebagai **generator** yang boleh mengembalikan data dalam minibatch yang sesuai untuk latihan.\n", "\n", - "Untuk menangani klasifikasi imej, Keras menyertakan fungsi khas `image_dataset_from_directory`, yang boleh memuatkan imej dari subdirektori yang mewakili kelas yang berbeza. Fungsi ini juga menguruskan penskalaan imej, dan ia juga boleh membahagikan dataset kepada subset latihan dan ujian:\n" + "Untuk mengendalikan klasifikasi imej, Keras menyertakan fungsi khas `image_dataset_from_directory`, yang boleh memuatkan imej dari subdirektori yang sepadan dengan kelas yang berbeza. Fungsi ini juga menguruskan penskalaan imej, dan ia juga boleh membahagikan set data kepada subset latihan dan ujian:\n" ] }, { @@ -383,9 +383,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Adalah penting untuk menetapkan nilai `seed` yang sama untuk kedua-dua panggilan, kerana ia mempengaruhi pembahagian imej antara dataset latihan dan ujian.\n", + "Adalah penting untuk menetapkan nilai `seed` yang sama untuk kedua-dua panggilan, kerana ia mempengaruhi pembahagian imej antara dataset latih dan uji.\n", "\n", - "Dataset secara automatik mengambil nama kelas daripada direktori, dan anda boleh mengaksesnya jika diperlukan dengan memanggil:\n" + "Dataset secara automatik mengambil nama kelas dari direktori, dan anda boleh mengaksesnya jika perlu dengan memanggil:\n" ] }, { @@ -412,7 +412,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Dataset yang telah kami peroleh boleh terus dihantar ke fungsi `fit` untuk melatih model. Ia mengandungi kedua-dua imej dan label yang sepadan, yang boleh diulang menggunakan struktur berikut:\n" + "Set data yang telah kami peroleh boleh terus disalurkan ke fungsi `fit` untuk melatih model. Ia mengandungi kedua-dua imej dan label yang sepadan, yang boleh diproses menggunakan konstruk berikut:\n" ] }, { @@ -453,7 +453,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "> **Nota**: Semua imej dalam set data diwakili sebagai tensor titik terapung dengan julat 0-255. Sebelum menghantarnya ke rangkaian neural, kita perlu menskalakan nilai-nilai tersebut ke dalam julat 0-1. Apabila memplot imej, kita sama ada perlu melakukan perkara yang sama, atau menukar nilai kepada jenis `int` (yang kita lakukan dalam kod di atas), untuk menunjukkan kepada `matplotlib` bahawa kita ingin memplot imej asal yang tidak diskalakan.\n" + "> **Nota**: Semua imej dalam set data diwakili sebagai tensor titik apungan dengan julat 0-255. Sebelum menghantarnya ke rangkaian neural, kita perlu menskala nilai-nilai tersebut ke dalam julat 0-1. Apabila memplot imej, kita sama ada perlu melakukan perkara yang sama, atau menukar nilai kepada jenis `int` (yang kami lakukan dalam kod di atas), supaya `matplotlib` tahu bahawa kita ingin memplot imej asal yang tidak diskalakan.\n" ] }, { @@ -462,7 +462,7 @@ "source": [ "## Model pra-latih\n", "\n", - "Untuk banyak tugas klasifikasi imej, seseorang boleh menemui model rangkaian neural pra-latih. Banyak model tersebut tersedia dalam ruang nama `keras.applications`, dan lebih banyak lagi model boleh didapati di Internet. Mari kita lihat bagaimana model VGG-16 yang paling mudah boleh dimuatkan dan digunakan:\n" + "Untuk banyak tugasan klasifikasi imej, seseorang boleh mencari model rangkaian neural pra-latih. Banyak model tersebut tersedia di dalam ruang nama `keras.applications`, dan lebih banyak model boleh didapati di Internet. Mari kita lihat bagaimana model VGG-16 yang paling mudah boleh dimuat dan digunakan:\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": [ "Terdapat beberapa perkara penting di sini:\n", - "* Sebelum memberikan input kepada mana-mana rangkaian pra-latih, ia perlu diproses terlebih dahulu dengan cara tertentu. Ini dilakukan dengan memanggil fungsi `preprocess_input` yang sepadan, yang menerima sekumpulan imej dan mengembalikan bentuk yang telah diproses. Dalam kes VGG-16, imej-imej dinormalisasi, dan beberapa nilai purata yang telah ditetapkan untuk setiap saluran ditolak. Ini kerana VGG-16 pada asalnya dilatih dengan pra-pemprosesan ini.\n", - "* Rangkaian neural digunakan pada kumpulan input, dan kita menerima sebagai hasilnya sekumpulan tensor 1000-elemen yang menunjukkan kebarangkalian setiap kelas. Kita boleh mencari nombor kelas yang paling mungkin dengan memanggil `argmax` pada tensor ini.\n", - "* Hasil yang diperoleh adalah [nombor kelas `ImageNet`](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Untuk memahami hasil ini, kita juga boleh menggunakan fungsi `decode_predictions`, yang mengembalikan n kelas teratas bersama dengan nama mereka.\n" + "* Sebelum menyerahkan input kepada mana-mana rangkaian yang telah dilatih, ia perlu diproses terlebih dahulu dengan cara tertentu. Ini dilakukan dengan memanggil fungsi `preprocess_input` yang sepadan, yang menerima satu kumpulan imej, dan mengembalikan bentuk yang telah diproses. Dalam kes VGG-16, imej-imej dinormalisasi, dan beberapa nilai purata yang telah ditetapkan untuk setiap saluran ditolak. Ini kerana VGG-16 asalnya dilatih dengan pemprosesan awal ini.\n", + "* Rangkaian neural digunakan pada kumpulan input, dan kita menerima sebagai hasilnya satu kumpulan tensor 1000-elemen yang menunjukkan kebarangkalian setiap kelas. Kita boleh mencari nombor kelas yang paling mungkin dengan memanggil `argmax` pada tensor ini.\n", + "* Hasil yang diperoleh adalah [nombor kelas `ImageNet`](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Untuk memahami hasil ini, kita juga boleh menggunakan fungsi `decode_predictions`, yang mengembalikan n kelas teratas berserta nama mereka.\n" ] }, { @@ -599,7 +609,7 @@ "source": [ "## Pengiraan GPU\n", "\n", - "Rangkaian neural mendalam, seperti VGG-16 dan seni bina moden lain memerlukan kuasa pengiraan yang agak besar untuk dijalankan. Adalah masuk akal untuk menggunakan pecutan GPU, jika ia tersedia. Nasib baik, Keras secara automatik mempercepatkan pengiraan pada GPU jika ia tersedia. Kita boleh memeriksa sama ada Tensorflow boleh menggunakan GPU dengan kod berikut:\n" + "Rangkaian neural dalam, seperti VGG-16 dan seni bina moden lain memerlukan kuasa pengiraan yang banyak untuk dijalankan. Adalah masuk akal untuk menggunakan pecutan GPU, jika ia tersedia. Nasib baik, Keras secara automatik mempercepatkan pengiraan pada GPU jika ia tersedia. Kita boleh periksa jika Tensorflow boleh menggunakan GPU dengan menggunakan kod berikut:\n" ] }, { @@ -626,9 +636,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Mengekstrak Ciri-ciri VGG\n", "\n", - "Jika kita ingin menggunakan VGG-16 untuk mengekstrak ciri-ciri daripada imej kita, kita memerlukan model tanpa lapisan klasifikasi akhir. Kita boleh memulakan model VGG-16 tanpa lapisan atas menggunakan kod ini:\n" + "## Mengekstrak ciri VGG\n", + "\n", + "Jika kita ingin menggunakan VGG-16 untuk mengekstrak ciri dari imej kita, kita memerlukan model tanpa lapisan klasifikasi akhir. Kita boleh membina model VGG-16 tanpa lapisan atas menggunakan kod ini:\n" ] }, { @@ -680,9 +691,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Dimensi tensor ciri adalah 7x7x512, tetapi untuk memvisualisasikannya, kita perlu mengubah bentuknya kepada bentuk 2D.\n", + "Dimensi tensor ciri adalah 7x7x512, tetapi untuk memvisualisasikannya kami perlu mengubah bentuknya kepada 2D.\n", "\n", - "Sekarang mari kita cuba lihat sama ada ciri-ciri tersebut boleh digunakan untuk mengklasifikasikan imej. Kita akan secara manual mengambil sebahagian imej (50 minibatch, dalam kes ini), dan pra-kira vektor ciri mereka. Kita boleh menggunakan API **dataset** Tensorflow untuk melakukannya. Fungsi `map` mengambil dataset dan menggunakan fungsi lambda yang diberikan untuk mengubahnya. Kita menggunakan mekanisme ini untuk membina dataset baru, `ds_features_train` dan `ds_features_test`, yang mengandungi ciri-ciri yang diekstrak oleh VGG sebagai ganti imej asal.\n" + "Sekarang mari cuba lihat jika ciri-ciri tersebut boleh digunakan untuk mengklasifikasi imej. Mari ambil secara manual sebahagian kecil imej (50 minibatch, dalam kes kami), dan kira sebelumnya vektor ciri mereka. Kami boleh menggunakan API **dataset** Tensorflow untuk melakukan itu. Fungsi `map` mengambil dataset dan menggunakan fungsi lambda yang diberikan untuk menukarnya. Kami menggunakan mekanisme ini untuk membina dataset baru, `ds_features_train` dan `ds_features_test`, yang mengandungi ciri yang diekstrak oleh VGG dan bukannya imej asal.\n" ] }, { @@ -712,9 +723,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Kami menggunakan pembinaan `.take(50)` untuk mengehadkan saiz dataset, bagi mempercepatkan demonstrasi kami. Sudah tentu, anda boleh menjalankan eksperimen ini pada dataset penuh.\n", + "Kami menggunakan konstruksi `.take(50)` untuk mengehadkan saiz set data, bagi mempercepatkan demonstrasi kami. Sudah tentu anda boleh melakukan eksperimen ini pada set data penuh.\n", "\n", - "Sekarang kita mempunyai dataset dengan ciri-ciri yang telah diekstrak, kita boleh melatih pengklasifikasi padat yang ringkas untuk membezakan antara kucing dan anjing. Rangkaian ini akan mengambil vektor ciri dengan bentuk (7,7,512), dan menghasilkan satu output yang mewakili sama ada anjing atau kucing. Oleh kerana ini adalah klasifikasi binari, kami menggunakan fungsi pengaktifan `sigmoid` dan kehilangan `binary_crossentropy`.\n" + "Kini selepas kami mempunyai set data dengan ciri yang diekstrak, kami boleh melatih klasifikasi padat yang mudah untuk membezakan antara kucing dan anjing. Rangkaian ini akan mengambil vektor ciri berbentuk (7,7,512), dan menghasilkan satu output yang merupakan sama ada anjing atau kucing. Oleh kerana ini adalah klasifikasi binari, kami menggunakan fungsi pengaktifan `sigmoid` dan kerugian `binary_crossentropy`.\n" ] }, { @@ -743,13 +754,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Hasilnya sangat baik, kita dapat membezakan antara kucing dan anjing dengan kebarangkalian hampir 95%! Namun, kita hanya menguji pendekatan ini pada sebahagian kecil daripada semua imej, kerana pengekstrakan ciri secara manual nampaknya memakan banyak masa.\n", + "Keputusannya hebat, kita boleh membezakan antara kucing dan anjing dengan kebarangkalian hampir 95%! Walau bagaimanapun, kami hanya menguji pendekatan ini pada subset semua imej kerana pengekstrakan ciri secara manual kelihatan mengambil masa yang lama.\n", "\n", "## Pembelajaran pemindahan menggunakan satu rangkaian VGG\n", "\n", - "Kita juga boleh mengelakkan daripada pra-pengiraan ciri secara manual dengan menggunakan rangkaian VGG-16 asal sepenuhnya semasa latihan, dengan menambah pengekstrak ciri ke rangkaian kita sebagai lapisan pertama.\n", + "Kita juga boleh mengelakkan pengiraan ciri secara manual dengan menggunakan rangkaian VGG-16 asal sepenuhnya semasa latihan, dengan menambah pengekstrak ciri ke rangkaian kita sebagai lapisan pertama.\n", "\n", - "Keindahan seni bina Keras adalah model VGG-16 yang telah kita definisikan di atas juga boleh digunakan sebagai lapisan dalam rangkaian neural yang lain! Kita hanya perlu membina rangkaian dengan pengelas padat di atasnya, dan kemudian melatih keseluruhan rangkaian menggunakan propagasi balik.\n" + "Keindahan seni bina Keras adalah model VGG-16 yang telah kami definisikan di atas juga boleh digunakan sebagai lapisan dalam rangkaian neural lain! Kita hanya perlu membina rangkaian dengan pengkelasan padat di atasnya, dan kemudian melatih keseluruhan rangkaian menggunakan penyebaran belakang.\n" ] }, { @@ -793,13 +804,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Model ini kelihatan seperti rangkaian klasifikasi hujung ke hujung, yang mengambil imej dan mengembalikan kelas. Namun, perkara yang mencabar ialah kita mahu VGG16 bertindak sebagai pengekstrak ciri, dan bukan untuk dilatih semula. Oleh itu, kita perlu **membekukan berat pengekstrak ciri konvolusi**. Kita boleh mengakses lapisan pertama rangkaian dengan memanggil `model.layers[0]`, dan kita hanya perlu menetapkan sifat `trainable` kepada `False`.\n", + "Model ini kelihatan seperti rangkaian klasifikasi hujung-ke-hujung, yang mengambil imej dan mengembalikan kelas. Walau bagaimanapun, perkara yang sukar ialah kita mahu VGG16 bertindak sebagai pengekstrak ciri, dan tidak dilatih semula. Oleh itu, kita perlu **membekukan berat pengekstrak ciri konvolusi**. Kita boleh mengakses lapisan pertama rangkaian dengan memanggil `model.layers[0]`, dan kita hanya perlu menetapkan sifat `trainable` kepada `False`.\n", "\n", - "> **Nota**: Pembekuan berat pengekstrak ciri diperlukan, kerana jika tidak, lapisan pengklasifikasi yang tidak terlatih boleh merosakkan berat asal yang telah dilatih sebelumnya bagi pengekstrak konvolusi.\n", + "> **Nota**: Pembekuan berat pengekstrak ciri diperlukan, kerana jika tidak, lapisan pengklasifikasi yang tidak dilatih boleh merosakkan berat asal pralatih pengekstrak konvolusi.\n", "\n", - "Anda boleh perhatikan bahawa walaupun jumlah keseluruhan parameter dalam rangkaian kita adalah sekitar 15 juta, kita hanya melatih 25k parameter. Semua parameter lain bagi penapis konvolusi peringkat atas telah dilatih sebelumnya. Ini adalah baik, kerana kita dapat melaras parameter yang lebih kecil dengan jumlah contoh yang lebih sedikit.\n", + "Anda boleh perhatikan bahawa walaupun jumlah keseluruhan parameter dalam rangkaian kita adalah sekitar 15 juta, kita hanya melatih 25k parameter. Semua parameter lain bagi penapis konvolusi peringkat atas adalah pralatih. Itu bagus, kerana kita dapat melaras semula bilangan parameter yang lebih kecil dengan bilangan contoh yang lebih kecil.\n", "\n", - "Kita akan melatih rangkaian kita sekarang dan melihat sejauh mana prestasi yang boleh dicapai. Jangka masa latihan mungkin agak lama, dan jangan risau jika pelaksanaan kelihatan seperti terhenti untuk beberapa waktu.\n" + "Kita akan melatih rangkaian kita sekarang dan melihat sejauh mana kualitinya. Jangka masa yang agak panjang dijangka, dan jangan risau jika pelaksanaan kelihatan beku untuk seketika.\n" ] }, { @@ -824,11 +835,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Nampaknya kita telah memperoleh pengklasifikasi kucing vs. anjing yang cukup tepat!\n", + "Nampaknya kita telah memperoleh pengklasifikasi kucing vs. anjing yang cukup tepat! \n", "\n", "## Menyimpan dan Memuat Model\n", "\n", - "Setelah kita melatih model, kita boleh menyimpan seni bina model dan berat yang telah dilatih ke dalam fail untuk kegunaan masa depan:\n" + "Setelah kita melatih model, kita boleh menyimpan seni bina model dan berat latihan ke fail untuk kegunaan masa hadapan:\n" ] }, { @@ -852,7 +863,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Kita kemudian boleh memuatkan model dari fail pada bila-bila masa. Anda mungkin mendapati ia berguna sekiranya eksperimen seterusnya merosakkan model - anda tidak perlu memulakan semula dari awal.\n" + "Kita kemudian boleh memuatkan model dari fail pada bila-bila masa. Anda mungkin mendapati ia berguna sekiranya eksperimen seterusnya memusnahkan model itu - anda tidak perlu memulakan semula dari awal.\n" ] }, { @@ -868,15 +879,15 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Penalaan Halus Pemindahan Pembelajaran\n", + "## Pemindahan pembelajaran penalaan halus\n", "\n", - "Dalam bahagian sebelumnya, kita telah melatih lapisan pengklasifikasi terakhir untuk mengklasifikasikan imej dalam dataset kita sendiri. Walau bagaimanapun, kita tidak melatih semula pengekstrak ciri, dan model kita bergantung pada ciri-ciri yang telah dipelajari oleh model daripada data ImageNet. Jika objek anda kelihatan berbeza daripada imej biasa dalam ImageNet, gabungan ciri ini mungkin tidak berfungsi dengan baik. Oleh itu, adalah masuk akal untuk mula melatih lapisan konvolusi juga.\n", + "Dalam bahagian sebelumnya, kami telah melatih lapisan pengelasan akhir untuk mengklasifikasikan imej dalam set data kami sendiri. Walau bagaimanapun, kami tidak melatih semula pengekstrak ciri, dan model kami bergantung pada ciri-ciri yang telah dipelajari model pada data ImageNet. Jika objek anda berbeza secara visual dari imej ImageNet biasa, gabungan ciri ini mungkin tidak berfungsi dengan baik. Oleh itu adalah masuk akal untuk mula melatih lapisan konvolusional juga.\n", "\n", - "Untuk melakukannya, kita boleh membuka kunci parameter penapis konvolusi yang sebelum ini kita bekukan.\n", + "Untuk melakukan itu, kita boleh membuka beku parameter penapis konvolusional yang telah kita bekukan sebelum ini. \n", "\n", - "> **Nota:** Adalah penting untuk anda membekukan parameter terlebih dahulu dan menjalankan beberapa epoch latihan untuk menstabilkan berat dalam lapisan pengklasifikasi. Jika anda terus memulakan latihan rangkaian hujung-ke-hujung dengan parameter yang tidak dibekukan, ralat besar berkemungkinan akan merosakkan berat pra-latih dalam lapisan konvolusi.\n", + "> **Nota:** Adalah penting bahawa anda membekukan parameter terlebih dahulu dan melaksanakan beberapa epoch latihan untuk menstabilkan berat dalam lapisan pengelasan. Jika anda terus mula melatih rangkaian hujung-ke-hujung dengan parameter yang tidak dibekukan, ralat besar mungkin memusnahkan berat yang telah dipra-latih dalam lapisan konvolusional.\n", "\n", - "Model VGG-16 konvolusi kita terletak di dalam lapisan pertama, dan ia sendiri terdiri daripada banyak lapisan. Kita boleh melihat strukturnya:\n" + "Model VGG-16 konvolusional kami terletak di dalam lapisan pertama, dan ia terdiri daripada banyak lapisan itu sendiri. Kita boleh melihat strukturnya: \n" ] }, { @@ -945,7 +956,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Kita boleh nyahbekukan semua lapisan asas konvolusi:\n" + "Kita boleh membuka beku semua lapisan asas konvolusi:\n" ] }, { @@ -961,7 +972,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Walau bagaimanapun, mencairkan kesemuanya sekaligus bukanlah idea yang terbaik. Kita boleh mula dengan mencairkan hanya beberapa lapisan akhir konvolusi, kerana ia mengandungi corak tahap tinggi yang relevan untuk imej kita. Sebagai contoh, untuk memulakan, kita boleh membekukan semua lapisan kecuali 4 yang terakhir:\n" + "Walau bagaimanapun, mencairkan kesemuanya sekaligus bukanlah idea yang terbaik. Kita boleh mula dengan mencairkan hanya beberapa lapisan akhir konvolusi, kerana ia mengandungi corak tahap tinggi yang relevan untuk imej kita. Sebagai contoh, untuk permulaan, kita boleh membekukan semua lapisan kecuali 4 yang terakhir: \n" ] }, { @@ -1000,11 +1011,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Perhatikan bahawa bilangan parameter yang boleh dilatih meningkat dengan ketara, tetapi ia masih sekitar 50% daripada semua parameter.\n", + "Perhatikan bahawa bilangan parameter yang boleh dilatih meningkat dengan ketara, tetapi masih sekitar 50% daripada semua parameter.\n", "\n", - "Selepas proses unfreezing, kita boleh menjalankan beberapa lagi epoch latihan (dalam contoh kita, kita hanya akan lakukan satu sahaja). Anda juga boleh memilih kadar pembelajaran yang lebih rendah untuk meminimumkan kesan terhadap berat yang telah dilatih sebelumnya. Walau bagaimanapun, walaupun dengan kadar pembelajaran yang rendah, anda boleh menjangkakan ketepatan akan menurun pada permulaan latihan, sebelum akhirnya mencapai tahap yang sedikit lebih tinggi berbanding dengan kes berat yang tetap.\n", + "Selepas membuka kunci, kita boleh melakukan beberapa epoch latihan lagi (dalam contoh kami, kami akan melakukan hanya satu). Anda juga boleh memilih kadar pembelajaran yang lebih rendah, untuk meminimumkan kesan ke atas berat yang telah dilatih terlebih dahulu. Walau bagaimanapun, walaupun dengan kadar pembelajaran yang rendah, anda boleh menjangkakan ketepatan akan menurun pada permulaan latihan, sehingga akhirnya mencapai tahap yang sedikit lebih tinggi daripada kes berat yang tetap.\n", "\n", - "> **Nota:** Latihan ini berlaku dengan lebih perlahan, kerana kita perlu menyebarkan kecerunan kembali melalui banyak lapisan dalam rangkaian!\n" + "> **Nota:** Latihan ini berlaku lebih perlahan, kerana kita perlu menyebarkan kecerunan kembali melalui banyak lapisan rangkaian!\n" ] }, { @@ -1028,9 +1039,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Kita berkemungkinan mencapai ketepatan latihan yang lebih tinggi kerana kita menggunakan rangkaian yang lebih berkuasa dengan lebih banyak parameter, tetapi ketepatan pengesahan mungkin tidak meningkat sebanyak itu.\n", + "Kami mungkin akan mencapai ketepatan latihan yang lebih tinggi, kerana kami menggunakan rangkaian yang lebih berkuasa dengan lebih banyak parameter, tetapi ketepatan pengesahan tidak akan meningkat sebanyak itu.\n", "\n", - "Jangan ragu untuk membuka kunci beberapa lapisan tambahan dalam rangkaian dan latih lebih lanjut, untuk melihat sama ada anda boleh mencapai ketepatan yang lebih tinggi!\n" + "Jangan ragu untuk membuka beberapa lapisan rangkaian lagi dan melatih lebih banyak, untuk melihat jika anda dapat mencapai ketepatan yang lebih tinggi!\n" ] }, { @@ -1039,7 +1050,7 @@ "source": [ "## Model penglihatan komputer lain\n", "\n", - "VGG-16 adalah salah satu seni bina penglihatan komputer yang paling mudah. Keras menyediakan banyak lagi rangkaian yang telah dilatih sebelumnya. Antara yang paling kerap digunakan adalah seni bina **ResNet**, yang dibangunkan oleh Microsoft, dan **Inception** oleh Google. Sebagai contoh, mari kita terokai seni bina model ResNet-50 yang paling mudah (ResNet adalah keluarga model dengan kedalaman berbeza, anda boleh cuba bereksperimen dengan ResNet-152 jika anda ingin melihat bagaimana rupa model yang sangat mendalam):\n" + "VGG-16 adalah salah satu seni bina penglihatan komputer yang paling mudah. Keras menyediakan banyak lagi rangkaian pralatih. Yang paling kerap digunakan di antara mereka ialah seni bina **ResNet**, yang dibangunkan oleh Microsoft, dan **Inception** oleh Google. Sebagai contoh, mari kita terokai seni bina model ResNet-50 yang paling mudah (ResNet adalah keluarga model dengan kedalaman berbeza, anda boleh cuba bereksperimen dengan ResNet-152 jika anda ingin melihat bagaimana rupa model yang sangat dalam):\n" ] }, { @@ -1441,29 +1452,29 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Seperti yang anda lihat, model ini mengandungi blok binaan yang sama seperti biasa: lapisan konvolusi, lapisan pengumpulan, dan pengklasifikasi padat di akhir. Kita boleh menggunakan model ini dengan cara yang sama seperti kita menggunakan VGG-16 untuk pembelajaran pemindahan. Anda boleh mencuba bereksperimen dengan kod di atas, menggunakan model ResNet yang berbeza sebagai model asas, dan melihat bagaimana ketepatan berubah.\n", + "Seperti yang anda lihat, model ini mengandungi blok binaan yang sama yang biasa: lapisan konvolusional, lapisan pengumpulan dan pengklasifikasi padat akhir. Kita boleh menggunakan model ini dengan cara yang sama seperti kita menggunakan VGG-16 untuk pembelajaran pemindahan. Anda boleh mencuba bereksperimen dengan kod di atas, menggunakan model ResNet yang berbeza sebagai model asas, dan melihat bagaimana ketepatan berubah.\n", "\n", - "## Penormalan Kumpulan\n", + "## Normalisasi Kumpulan\n", "\n", - "Rangkaian ini mengandungi satu lagi jenis lapisan: **Penormalan Kumpulan**. Idea penormalan kumpulan adalah untuk membawa nilai yang mengalir melalui rangkaian neural ke julat yang betul. Biasanya, rangkaian neural berfungsi dengan baik apabila semua nilai berada dalam julat [-1,1] atau [0,1], dan itulah sebabnya kita menskalakan/menormalkan data input kita dengan sewajarnya. Walau bagaimanapun, semasa latihan rangkaian yang mendalam, ia boleh berlaku bahawa nilai menjadi jauh di luar julat ini, yang menjadikan latihan bermasalah. Lapisan penormalan kumpulan mengira purata dan sisihan piawai untuk semua nilai dalam minibatch semasa, dan menggunakannya untuk menormalkan isyarat sebelum menghantarnya melalui lapisan rangkaian neural. Ini secara signifikan meningkatkan kestabilan rangkaian yang mendalam.\n" + "Rangkaian ini mengandungi satu lagi jenis lapisan: **Normalisasi Kumpulan**. Idea normalisasi kumpulan adalah untuk membawa nilai-nilai yang mengalir melalui rangkaian neural ke dalam julat yang betul. Biasanya rangkaian neural berfungsi dengan baik apabila semua nilai berada dalam julat [-1,1] atau [0,1], dan itulah sebabnya kita menskala/mennormalisasi data input kita dengan sewajarnya. Walau bagaimanapun, semasa latihan rangkaian yang dalam, boleh terjadi nilai-nilai menjadi jauh dari julat ini, yang menjadikan latihan bermasalah. Lapisan normalisasi kumpulan mengira purata dan sisihan piawai untuk semua nilai dalam minibatch semasa, dan menggunakan mereka untuk menormalisasi isyarat sebelum menyalurkannya melalui lapisan rangkaian neural. Ini meningkatkan kestabilan rangkaian dalam dengan ketara.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Pengajaran\n", + "## Kesimpulan\n", "\n", - "Dengan menggunakan pembelajaran pemindahan, kami dapat dengan cepat membangunkan pengklasifikasi untuk tugas pengelasan objek khusus kami dan mencapai ketepatan yang tinggi. Walau bagaimanapun, contoh ini tidak sepenuhnya adil kerana rangkaian asal VGG-16 telah dilatih terlebih dahulu untuk mengenali kucing dan anjing, jadi kami hanya menggunakan semula kebanyakan corak yang sudah ada dalam rangkaian tersebut. Anda boleh menjangkakan ketepatan yang lebih rendah untuk objek yang lebih eksotik dan khusus domain, seperti butiran pada barisan pengeluaran di kilang, atau daun pokok yang berbeza.\n", + "Dengan menggunakan pembelajaran pemindahan, kami dapat dengan cepat menyediakan pengklasifikasi untuk tugas pengelasan objek tersuai kami, dan mencapai ketepatan yang tinggi. Namun, contoh ini tidak sepenuhnya adil, kerana rangkaian VGG-16 asal telah dilatih terlebih dahulu untuk mengenali kucing dan anjing, dan oleh itu kami hanya menggunakan semula kebanyakan corak yang sudah ada dalam rangkaian tersebut. Anda boleh menjangkakan ketepatan yang lebih rendah pada objek khusus domain yang lebih eksotik, seperti butiran pada barisan pengeluaran di kilang, atau daun pokok yang berbeza.\n", "\n", - "Anda dapat melihat bahawa tugas yang lebih kompleks yang sedang kami selesaikan sekarang memerlukan kuasa pengkomputeran yang lebih tinggi, dan tidak dapat diselesaikan dengan mudah menggunakan CPU. Dalam unit seterusnya, kami akan cuba menggunakan pelaksanaan yang lebih ringan untuk melatih model yang sama dengan sumber pengkomputeran yang lebih rendah, yang menghasilkan ketepatan yang hanya sedikit lebih rendah.\n" + "Anda boleh lihat bahawa tugas yang lebih kompleks yang sedang kami selesaikan kini memerlukan kuasa pengkomputeran yang lebih tinggi, dan tidak boleh diselesaikan dengan mudah pada CPU. Dalam unit seterusnya, kami akan cuba menggunakan pelaksanaan yang lebih ringan untuk melatih model yang sama menggunakan sumber pengkomputeran yang lebih rendah, yang menghasilkan ketepatan hanya sedikit lebih rendah.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**Penafian**: \nDokumen ini telah diterjemahkan menggunakan perkhidmatan terjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Walaupun kami berusaha untuk memastikan ketepatan, sila ambil perhatian bahawa terjemahan automatik mungkin mengandungi kesilapan atau ketidaktepatan. Dokumen asal dalam bahasa asalnya harus dianggap sebagai sumber yang berwibawa. Untuk maklumat yang kritikal, terjemahan manusia profesional adalah disyorkan. Kami tidak bertanggungjawab atas sebarang salah faham atau salah tafsir yang timbul daripada penggunaan terjemahan ini.\n" + "---\n\n\n**Penafian**:\nDokumen ini telah diterjemahkan menggunakan perkhidmatan terjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Walaupun kami berusaha untuk ketepatan, sila ambil maklum bahawa terjemahan automatik mungkin mengandungi kesilapan atau ketidaktepatan. Dokumen asal dalam bahasa asalnya harus dianggap sebagai sumber yang sahih. Untuk maklumat penting, terjemahan oleh manusia profesional adalah disyorkan. Kami tidak bertanggungjawab terhadap sebarang salah faham atau salah tafsir yang timbul daripada penggunaan terjemahan ini.\n\n" ] } ], @@ -1484,12 +1495,6 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" - }, - "coopTranslator": { - "original_hash": "c189abc107848f96051085cc30945129", - "translation_date": "2025-08-29T13:37:57+00:00", - "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", - "language_code": "ms" } }, "nbformat": 4, diff --git a/translations/ms/lessons/5-NLP/README.md b/translations/ms/lessons/5-NLP/README.md index a09c1c67be..d94fe575f7 100644 --- a/translations/ms/lessons/5-NLP/README.md +++ b/translations/ms/lessons/5-NLP/README.md @@ -1,26 +1,26 @@ -# Pemprosesan Bahasa Semula Jadi +# Pemprosesan Bahasa Semulajadi -![Ringkasan tugas NLP dalam bentuk doodle](../../../../translated_images/ms/ai-nlp.b22dcb8ca4707cea.webp) +![Ringkasan tugas NLP dalam lakaran](../../../../translated_images/ms/ai-nlp.b22dcb8ca4707cea.webp) -Dalam bahagian ini, kita akan memberi tumpuan kepada penggunaan Rangkaian Neural untuk menangani tugas-tugas berkaitan dengan **Pemprosesan Bahasa Semula Jadi (NLP)**. Terdapat banyak masalah NLP yang kita mahu komputer dapat selesaikan: +Dalam bahagian ini, kita akan menumpukan pada penggunaan Rangkaian Neural untuk mengendalikan tugas berkaitan dengan **Pemprosesan Bahasa Semulajadi (NLP)**. Terdapat banyak masalah NLP yang kita mahu komputer dapat selesaikan: -* **Klasifikasi teks** adalah masalah klasifikasi biasa yang melibatkan urutan teks. Contohnya termasuk mengklasifikasikan e-mel sebagai spam atau bukan spam, atau mengkategorikan artikel kepada sukan, perniagaan, politik, dan sebagainya. Selain itu, semasa membangunkan bot sembang, kita sering perlu memahami apa yang pengguna ingin sampaikan -- dalam kes ini kita berurusan dengan **klasifikasi niat**. Selalunya, dalam klasifikasi niat, kita perlu menangani banyak kategori. -* **Analisis sentimen** adalah masalah regresi biasa, di mana kita perlu memberikan nombor (sentimen) yang menunjukkan sejauh mana positif/negatif makna sesuatu ayat. Versi yang lebih maju daripada analisis sentimen ialah **analisis sentimen berasaskan aspek** (ABSA), di mana kita memberikan sentimen bukan kepada keseluruhan ayat, tetapi kepada bahagian-bahagian tertentu daripadanya (aspek), contohnya *Di restoran ini, saya suka masakannya, tetapi suasananya sangat teruk*. -* **Pengecaman Entiti Bernama** (NER) merujuk kepada masalah mengekstrak entiti tertentu daripada teks. Sebagai contoh, kita mungkin perlu memahami bahawa dalam frasa *Saya perlu terbang ke Paris esok* perkataan *esok* merujuk kepada TARIKH, dan *Paris* adalah LOKASI. -* **Pengekstrakan kata kunci** adalah serupa dengan NER, tetapi kita perlu mengekstrak perkataan yang penting kepada makna ayat secara automatik, tanpa latihan awal untuk jenis entiti tertentu. -* **Pengelompokan teks** boleh berguna apabila kita mahu mengumpulkan ayat-ayat yang serupa, contohnya, permintaan yang serupa dalam perbualan sokongan teknikal. -* **Menjawab soalan** merujuk kepada keupayaan model untuk menjawab soalan tertentu. Model menerima petikan teks dan soalan sebagai input, dan ia perlu memberikan tempat dalam teks di mana jawapan kepada soalan itu terkandung (atau, kadangkala, menjana teks jawapan). -* **Penjanaan teks** adalah keupayaan model untuk menjana teks baharu. Ia boleh dianggap sebagai tugas klasifikasi yang meramalkan huruf/perkataan seterusnya berdasarkan beberapa *teks permulaan*. Model penjanaan teks yang maju, seperti GPT-3, mampu menyelesaikan tugas NLP lain seperti klasifikasi menggunakan teknik yang dipanggil [prompt programming](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) atau [prompt engineering](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29). -* **Peringkasan teks** adalah teknik apabila kita mahu komputer "membaca" teks panjang dan meringkaskannya dalam beberapa ayat. +* **Pengelasan teks** adalah masalah pengelasan tipikal berkaitan urutan teks. Contohnya termasuk mengklasifikasikan mesej e-mel sebagai spam vs. bukan spam, atau mengkategorikan artikel sebagai sukan, perniagaan, politik, dll. Juga, apabila membangunkan bot sembang, kita sering perlu memahami apa yang pengguna ingin sampaikan -- dalam kes ini kita mengendalikan **pengelasan niat**. Sering kali, dalam pengelasan niat kita perlu menangani banyak kategori. +* **Analisis sentimen** adalah masalah regresi tipikal, di mana kita perlu memberikan nombor (sentimen) yang sesuai dengan betapa positif/negatif makna sesuatu ayat. Versi analisis sentimen yang lebih maju ialah **analisis sentimen berasaskan aspek** (ABSA), di mana kita memberikan sentimen bukan kepada keseluruhan ayat, tetapi kepada bahagian-bahagiannya yang berbeza (aspek), contohnya *Di restoran ini, saya suka masakan, tetapi suasananya teruk*. +* **Pengenalan Entiti Bernama** (NER) merujuk kepada masalah mengekstrak entiti tertentu dari teks. Contohnya, kita mungkin perlu memahami bahawa dalam frasa *Saya perlu terbang ke Paris esok* perkataan *esok* merujuk kepada TARIKH, dan *Paris* adalah LOKASI. +* **Pengekstrakan kata kunci** adalah serupa dengan NER, tetapi kita perlu mengekstrak perkataan penting kepada makna ayat secara automatik, tanpa latihan awal untuk jenis entiti tertentu. +* **Pengkelasan teks** boleh berguna apabila kita mahu mengelompokkan ayat-ayat yang serupa, contohnya, permintaan serupa dalam perbualan sokongan teknikal. +* **Menjawab soalan** merujuk kepada keupayaan model untuk menjawab soalan tertentu. Model menerima petikan teks dan soalan sebagai input, dan ia perlu menyediakan tempat dalam teks di mana jawapan kepada soalan itu terkandung (atau, kadang-kadang, menjana teks jawapan). +* **Penjanaan teks** ialah keupayaan model untuk menghasilkan teks baru. Ia boleh dianggap sebagai tugas pengelasan yang meramalkan huruf/kata seterusnya berdasarkan *prompt teks*. Model penjanaan teks canggih, seperti GPT-3, mampu menyelesaikan tugas NLP lain seperti pengelasan menggunakan teknik yang dipanggil [programming prompt](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) atau [kejuruteraan prompt](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29) +* **Rumusan teks** ialah teknik apabila kita mahu komputer "membaca" teks panjang dan merumuskannya dalam beberapa ayat. * **Terjemahan mesin** boleh dilihat sebagai gabungan pemahaman teks dalam satu bahasa, dan penjanaan teks dalam bahasa lain. -Pada mulanya, kebanyakan tugas NLP diselesaikan menggunakan kaedah tradisional seperti tatabahasa. Sebagai contoh, dalam terjemahan mesin, penghurai digunakan untuk mengubah ayat asal kepada pokok sintaks, kemudian struktur semantik tahap tinggi diekstrak untuk mewakili makna ayat, dan berdasarkan makna ini serta tatabahasa bahasa sasaran, hasilnya dijana. Kini, banyak tugas NLP lebih berkesan diselesaikan menggunakan rangkaian neural. +Pada mulanya, kebanyakan tugas NLP diselesaikan menggunakan kaedah tradisional seperti tatabahasa. Contohnya, dalam terjemahan mesin parser digunakan untuk menukar ayat awal menjadi pokok sintaksis, kemudian struktur semantik tahap tinggi diekstrak untuk mewakili makna ayat, dan berdasarkan makna ini dan tatabahasa bahasa sasaran hasil dijana. Kini, banyak tugas NLP diselesaikan dengan lebih berkesan menggunakan rangkaian neural. -> Banyak kaedah NLP klasik dilaksanakan dalam perpustakaan Python [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org). Terdapat [Buku NLTK](https://www.nltk.org/book/) yang hebat tersedia dalam talian yang merangkumi cara pelbagai tugas NLP boleh diselesaikan menggunakan NLTK. +> Banyak kaedah NLP klasik dilaksanakan dalam perpustakaan Python [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org). Terdapat [Buku NLTK](https://www.nltk.org/book/) hebat yang tersedia dalam talian yang merangkumi bagaimana tugas NLP yang berbeza boleh diselesaikan menggunakan NLTK. -Dalam kursus ini, kita akan memberi tumpuan kepada penggunaan Rangkaian Neural untuk NLP, dan kita akan menggunakan NLTK jika diperlukan. +Dalam kursus kami, kami akan lebih menumpukan pada penggunaan Rangkaian Neural untuk NLP, dan kami akan menggunakan NLTK apabila perlu. -Kita telah mempelajari tentang penggunaan rangkaian neural untuk menangani data tabular dan imej. Perbezaan utama antara jenis data tersebut dan teks ialah teks adalah urutan dengan panjang berubah-ubah, manakala saiz input dalam kes imej diketahui terlebih dahulu. Walaupun rangkaian konvolusi boleh mengekstrak corak daripada data input, corak dalam teks lebih kompleks. Contohnya, kita boleh mempunyai penafian yang dipisahkan daripada subjek oleh banyak perkataan (contohnya, *Saya tidak suka oren*, berbanding *Saya tidak suka oren besar yang berwarna-warni dan sedap*), dan itu masih perlu ditafsirkan sebagai satu corak. Oleh itu, untuk menangani bahasa, kita perlu memperkenalkan jenis rangkaian neural baharu, seperti *rangkaian berulang* dan *transformer*. +Kami sudah belajar tentang penggunaan rangkaian neural untuk mengendalikan data tabular dan imej. Perbezaan utama antara jenis data tersebut dan teks ialah teks adalah urutan dengan panjang berubah-ubah, manakala saiz input dalam kes imej diketahui terlebih dahulu. Walaupun rangkaian konvolusi boleh mengekstrak corak daripada data input, corak dalam teks adalah lebih kompleks. Contohnya, kita boleh mempunyai penafian yang dipisahkan dari subjek dengan kata-kata sewenang-wenangnya (contoh *Saya tidak suka oren*, berbanding *Saya tidak suka oren besar berwarna-warni yang sedap itu*), dan itu harus tetap ditafsirkan sebagai satu corak. Oleh itu, untuk mengendalikan bahasa kita perlu memperkenalkan jenis rangkaian neural baru, seperti *rangkaian berulang* dan *transformer*. ## Pasang Perpustakaan @@ -28,7 +28,7 @@ Jika anda menggunakan pemasangan Python tempatan untuk menjalankan kursus ini, a **Untuk PyTorch** ```bash -pip install -r requirements-torch.txt +pip install -r requirements-pytorch.txt ``` **Untuk TensorFlow** ```bash @@ -40,12 +40,12 @@ pip install -r requirements-tf.txt ## Amaran GPU Dalam bahagian ini, dalam beberapa contoh kita akan melatih model yang agak besar. -* **Gunakan Komputer Berkemampuan GPU**: Adalah disarankan untuk menjalankan buku nota anda pada komputer yang dilengkapi GPU untuk mengurangkan masa menunggu semasa bekerja dengan model besar. -* **Kekangan Memori GPU**: Menjalankan pada GPU mungkin menyebabkan situasi di mana anda kehabisan memori GPU, terutamanya semasa melatih model besar. -* **Penggunaan Memori GPU**: Jumlah memori GPU yang digunakan semasa latihan bergantung pada pelbagai faktor, termasuk saiz minibatch. -* **Kurangkan Saiz Minibatch**: Jika anda menghadapi masalah memori GPU, pertimbangkan untuk mengurangkan saiz minibatch dalam kod anda sebagai penyelesaian yang mungkin. -* **Pelepasan Memori GPU TensorFlow**: Versi lama TensorFlow mungkin tidak melepaskan memori GPU dengan betul semasa melatih beberapa model dalam satu kernel Python. Untuk mengurus penggunaan memori GPU dengan berkesan, anda boleh mengkonfigurasi TensorFlow untuk memperuntukkan memori GPU hanya apabila diperlukan. -* **Penyertaan Kod**: Untuk menetapkan TensorFlow supaya memperuntukkan memori GPU hanya apabila diperlukan, sertakan kod berikut dalam buku nota anda: +* **Gunakan Komputer yang Mempunyai GPU**: Adalah disyorkan untuk menjalankan notebook anda pada komputer yang dilengkapi GPU untuk mengurangkan masa menunggu apabila bekerja dengan model besar. +* **Keterbatasan Memori GPU**: Menjalankan pada GPU mungkin membawa kepada situasi di mana anda kehabisan memori GPU, terutamanya apabila melatih model besar. +* **Penggunaan Memori GPU**: Jumlah memori GPU yang digunakan semasa latihan bergantung kepada pelbagai faktor, termasuk saiz minibatch. +* **Minimakan Saiz Minibatch**: Jika anda menghadapi masalah memori GPU, pertimbangkan untuk mengurangkan saiz minibatch dalam kod anda sebagai penyelesaian potensi. +* **Pelepasan Memori GPU oleh TensorFlow**: Versi lama TensorFlow mungkin tidak melepaskan memori GPU dengan betul apabila melatih beberapa model dalam satu kernel Python. Untuk menguruskan penggunaan memori GPU dengan berkesan, anda boleh mengkonfigurasi TensorFlow untuk mengalokasikan memori GPU hanya apabila perlu. +* **Penyertaan Kod**: Untuk menetapkan TensorFlow agar memanjangkan pengalokasian memori GPU hanya apabila diperlukan, sertakan kod berikut dalam notebook anda: ```python physical_devices = tf.config.list_physical_devices('GPU') @@ -53,13 +53,13 @@ if len(physical_devices)>0: tf.config.experimental.set_memory_growth(physical_devices[0], True) ``` -Jika anda berminat untuk mempelajari NLP dari perspektif ML klasik, lawati [siri pelajaran ini](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP) +Jika anda berminat untuk belajar tentang NLP dari perspektif ML klasik, lawati [suite pelajaran ini](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP) ## Dalam Bahagian Ini -Dalam bahagian ini kita akan mempelajari tentang: +Dalam bahagian ini kita akan belajar tentang: * [Mewakili teks sebagai tensor](13-TextRep/README.md) -* [Perwakilan Perkataan](14-Emdeddings/README.md) +* [Penggantungan Perkataan](14-Emdeddings/README.md) * [Pemodelan Bahasa](15-LanguageModeling/README.md) * [Rangkaian Neural Berulang](16-RNN/README.md) * [Rangkaian Generatif](17-GenerativeNetworks/README.md) @@ -67,5 +67,7 @@ Dalam bahagian ini kita akan mempelajari tentang: --- -**Penafian**: -Dokumen ini telah diterjemahkan menggunakan perkhidmatan terjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Walaupun kami berusaha untuk memastikan ketepatan, sila ambil maklum bahawa terjemahan automatik mungkin mengandungi kesilapan atau ketidaktepatan. Dokumen asal dalam bahasa asalnya harus dianggap sebagai sumber yang berwibawa. Untuk maklumat yang kritikal, terjemahan manusia profesional adalah disyorkan. Kami tidak bertanggungjawab atas sebarang salah faham atau salah tafsir yang timbul daripada penggunaan terjemahan ini. \ No newline at end of file + +**Penafian**: +Dokumen ini telah diterjemahkan menggunakan perkhidmatan terjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Walaupun kami berusaha untuk ketepatan, sila ambil maklum bahawa terjemahan automatik mungkin mengandungi kesilapan atau ketidaktepatan. Dokumen asal dalam bahasa asalnya harus dianggap sebagai sumber yang sahih. Untuk maklumat penting, terjemahan oleh manusia profesional adalah disyorkan. Kami tidak bertanggungjawab terhadap sebarang salah faham atau salah tafsir yang timbul daripada penggunaan terjemahan ini. + \ No newline at end of file diff --git a/translations/my/.co-op-translator.json b/translations/my/.co-op-translator.json index b2cf675149..a0760f2d58 100644 --- a/translations/my/.co-op-translator.json +++ b/translations/my/.co-op-translator.json @@ -5,6 +5,12 @@ "source_file": "AGENTS.md", "language_code": "my" }, + "CONTRIBUTING.md": { + "original_hash": "c6fd7e781b67111a90abd166d0ce4aa0", + "translation_date": "2026-07-08T19:56:30+00:00", + "source_file": "CONTRIBUTING.md", + "language_code": "my" + }, "README.md": { "original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b", "translation_date": "2026-04-06T16:33:41+00:00", @@ -17,6 +23,19 @@ "source_file": "SECURITY.md", "language_code": "my" }, + "__translation_failures__": { + "lessons/sketchnotes/LICENSE.md": { + "original_hash": "45ab63a2cd8f5faef6c9b150618837a4", + "source_file": "lessons/sketchnotes/LICENSE.md", + "language_code": "my", + "failure_date": "2026-07-08T19:54:55+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:45:17+00:00", @@ -54,8 +73,8 @@ "language_code": "my" }, "examples/README.md": { - "original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7", - "translation_date": "2025-10-03T11:35:15+00:00", + "original_hash": "7883d52c2e2a221e0b07a7b112a149b9", + "translation_date": "2026-07-08T19:48:45+00:00", "source_file": "examples/README.md", "language_code": "my" }, @@ -66,8 +85,8 @@ "language_code": "my" }, "lessons/0-course-setup/how-to-run.md": { - "original_hash": "a4717bd9103b9f6cd84d534b83534689", - "translation_date": "2026-01-16T06:16:07+00:00", + "original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1", + "translation_date": "2026-07-08T19:50:30+00:00", "source_file": "lessons/0-course-setup/how-to-run.md", "language_code": "my" }, @@ -79,7 +98,7 @@ }, "lessons/1-Intro/README.md": { "original_hash": "f57e8aa46141fd220b16ffed8f11aec7", - "translation_date": "2025-11-18T22:13:19+00:00", + "translation_date": "2026-07-08T19:50:07+00:00", "source_file": "lessons/1-Intro/README.md", "language_code": "my" }, @@ -191,6 +210,12 @@ "source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md", "language_code": "my" }, + "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": { + "original_hash": "99b816b6a4957ef4100cee4c4221dff9", + "translation_date": "2026-07-08T19:38:00+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", + "language_code": "my" + }, "lessons/4-ComputerVision/08-TransferLearning/lab/README.md": { "original_hash": "7765935c35fcee69b9fe2d0cfd6963e2", "translation_date": "2025-08-25T23:17:32+00:00", @@ -330,8 +355,8 @@ "language_code": "my" }, "lessons/5-NLP/README.md": { - "original_hash": "8ef02a9318257ea140ed3ed74442096d", - "translation_date": "2025-08-25T21:31:03+00:00", + "original_hash": "038df6f1a73e49f6430740da083bfd6d", + "translation_date": "2026-07-08T19:51:07+00:00", "source_file": "lessons/5-NLP/README.md", "language_code": "my" }, @@ -355,7 +380,7 @@ }, "lessons/6-Other/23-MultiagentSystems/README.md": { "original_hash": "38a1185ae3d54b180378bbd71ae3ef16", - "translation_date": "2025-09-23T15:12:50+00:00", + "translation_date": "2026-07-08T19:56:00+00:00", "source_file": "lessons/6-Other/23-MultiagentSystems/README.md", "language_code": "my" }, diff --git a/translations/my/CONTRIBUTING.md b/translations/my/CONTRIBUTING.md new file mode 100644 index 0000000000..3cf538de25 --- /dev/null +++ b/translations/my/CONTRIBUTING.md @@ -0,0 +1,29 @@ +# AI-For-Beginners သို့ ဝေစုခြင်း + +AI-For-Beginners သို့ ဝေစုရန် စိတ်ဝင်စားမှုအတွက် ကျေးဇူးတင်ပါသည်! ဘာသာပြန်ခြင်း၊ သင်ခန်းစာပြင်ဆင်ခြင်းနှင့် ဖော်မတ် အမှားပြင်ဆင်ခြင်းများကို ကြိုဆိုပါသည်။ + +## Microsoft Contributor License Agreement (CLA) + +ဤပရောဂျက်သည် ဝေစုမှုများနှင့် အကြံပြုချက်များကို ကြိုဆိုသည်။ ပိုင်းဝေမည့်အများစုသည် သင်၏ ဝေစုခွင့်ကို သင်ပိုင်သည်ဟု ကြေညာသည့် Contributor License Agreement (CLA) သို့ သဘောတူရန် လိုအပ်သည်။ အသေးစိတ်အချက်အလက်များအတွက် [https://cla.microsoft.com](https://cla.microsoft.com) တွင် ကြည့်ပါ။ + +သင်သည် pull request တင်သည့်အခါ CLA-bot အလိုအလျှောက် CLA လိုအပ်မလား အတည်ပြု၍ PR သို့ သင့်တော်သော အမှတ်တံဆိပ်၊ မှတ်ချက်များ ထည့်သွင်းပေးပါလိမ့်မည်။ bot မှ ညွှန်ကြားသောနည်းလမ်းများကို အတိုင်းလိုက်နာရုံပါပဲ။ ဤလုပ်ဆောင်ချက်ကို CLA ကို အသုံးပြုသည့် repository များအားလုံးအတွင်း တစ်ခါတည်းသာ လိုအပ်ပါမည်။ + +## ဝေစုပုံ + +### ၁။ အက္ခရာလွဲ / ကုဒ် အမှားပြင်ခြင်း +Jupyter notebook သို့မဟုတ် သင်ခန်းစာ markdown ဖိုင်တွင် အက္ခရာလွဲ သို့မဟုတ် အမှား တွေ့လျှင်- +၁။ repository ကို fork လုပ်ပါ။ +၂။ အက္ခရာလွဲ သို့မဟုတ် ချို့ယွင်းနေသောလင့်ခ်ကို ပြင်ဆင်ပါ။ +၃။ ပြုပြင်ချက် ရှင်းလင်းသော ဖော်ပြချက်ဖြင့် Pull Request တင်ပါ။ + +### ၂။ ဘာသာပြန်မှုတင်သွင်းခြင်း +ကျွန်ုပ်တို့သည် သင်ခန်းစာများကို အခြားဘာသာစကားများသို့ ဘာသာပြန်ရန် ကြိုဆိုပါသည်။ `translations/` ဖိုလ်ဒါအောက်တွင် ရှိပြီးသားဖိုလ်ဒါနာမည်များကို အသုံးပြု၍ ဘာသာပြန်ခြင်းများကိုထားပါ (ဥပမာ `translations/es/`, `translations/pt-BR/`, `translations/zh-CN/`)။ + +အသေးစိတ်အတွက် [etc/CONTRIBUTING.md](etc/CONTRIBUTING.md) ကို ကြည့်ပါ။ + +--- + + +**ပြောကြားချက်** +ဤစာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးပမ်းနေသော်လည်း၊ စက်ကိရိယာဘာသာပြန်ခြင်းများတွင် အမှားများ သို့မဟုတ် မှားယွင်းချက်များ ပါဝင်နိုင်ကြောင်း သတိပြုပါရန် လိုအပ်ပါသည်။ မူလစာတမ်းကို မူရင်းဘာသာဖြင့်သာ ယုံကြည်စိတ်ချရသော အချက်အလက်အဖြစ် သတ်မှတ်သင့်သည်။ အရေးကြီးသည့် သတင်းအချက်အလက်များအတွက် ပရော်ဖက်ရှင်နယ် လူသားဘာသာပြန်သူဝန်ဆောင်မှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်ချက်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုကွာခြားမှုများ သို့မဟုတ် မမှန်ကန်သော အသုံးပြုမှုများအတွက် ကျွန်ုပ်တို့ တာဝန်မခံပါ။ + \ No newline at end of file diff --git a/translations/my/examples/README.md b/translations/my/examples/README.md index 791423b7eb..7314fc3908 100644 --- a/translations/my/examples/README.md +++ b/translations/my/examples/README.md @@ -1,85 +1,87 @@ -# AI စတင်လေ့လာသူများအတွက် နမူနာများ +# စတင်သုံးရန်အဆင်ပြေသော AI ကိုအသုံးပြုရန် နမူနာများ -ကြိုဆိုပါတယ်! ဒီ directory မှာ AI နဲ့ machine learning ကို စတင်လေ့လာဖို့အတွက် လွယ်ကူပြီး တစ်ခုချင်းစီ standalone နမူနာများ ပါဝင်ပါတယ်။ နမူနာတစ်ခုချင်းစီကို စတင်လေ့လာသူများအတွက် သက်သာစေဖို့ အကြောင်းအရာများကို အသေးစိတ် ရှင်းပြထားပြီး အဆင့်ဆင့် လမ်းညွှန်ချက်များ ပါဝင်ပါတယ်။ +ကြိုဆိုပါသည်! ဤဖိုလ်ဒါတွင် AI နှင့် စက်ရုပ်သင်ယူမှုကို စတင်လေ့လာနိုင်ရန် ရိုးရှင်း၍ သပ်သပ်ရပ်ရပ် နမူနာများ ပါဝင်သည်။ နမူနာတိုင်းကို စတင်သုံးသူများအတွက် အသင့်ပြင်ထားပြီး အသေးစိတ် မှတ်ချက်များနှင့် ခြေလှမ်းလိုက်ရှင်းပြချက်များပါဝင်ပါသည်။ -## 📚 နမူနာများအကြောင်းအကျဉ်း +## 📚 နမူနာများ အနှစ်ချုပ် -| နမူနာ | ဖော်ပြချက် | အခက်အခဲအဆင့် | လိုအပ်ချက်များ | -|-------|------------|----------------|----------------| -| [Hello AI World](../../../examples/01-hello-ai-world.py) | သင့်ရဲ့ ပထမဆုံး AI အစီအစဉ် - လွယ်ကူတဲ့ pattern recognition | ⭐ စတင်လေ့လာသူ | Python အခြေခံ | -| [Simple Neural Network](../../../examples/02-simple-neural-network.py) | Neural network ကို အခြေခံကနေ တည်ဆောက်ခြင်း | ⭐⭐ စတင်လေ့လာသူ+ | Python, အခြေခံဂဏန်းသိပ္ပံ | -| [Image Classifier](./03-image-classifier.ipynb) | Pre-trained model နဲ့ ပုံတွေကို အမျိုးအစားခွဲခြားခြင်း | ⭐⭐ စတင်လေ့လာသူ+ | Python, numpy | -| [Text Sentiment](../../../examples/04-text-sentiment.py) | စာသား sentiment (အပြုသဘော/အဆိုးသဘော) ကို ခွဲခြားခြင်း | ⭐⭐ စတင်လေ့လာသူ+ | 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) | Neural Network ကို အစပြု၍ တည်ဆောက်ခြင်း | ⭐⭐ စတင်+ | 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 သို့မဟုတ် အထက်) ကို install လုပ်ထားပါ။ လိုအပ်တဲ့ packages တွေကို install လုပ်ပါ: +Python ကို တပ်ဆင်ထားသည်ကို သေချာစေပါ (3.8 နှင့်အထက်အကြံပြုသည်)။ လိုအပ်သော package များကို တပ်ဆင်ပါ။ ```bash -# For Python scripts +# Python စက္ရုပ်များအတွက် pip install numpy -# For Jupyter notebooks (image classifier) +# Jupyter စာအုပ်များအတွက် (ပုံများ စစ်ဆေးသူ) pip install jupyter numpy pillow tensorflow ``` -သို့မဟုတ် main curriculum မှ conda environment ကို အသုံးပြုပါ: +ဒါမှမဟုတ် မြောက်မြားသော သင်တန်းအတွင်းပါဝင်သော conda ပတ်ဝန်းကျင်ကို အသုံးပြုနိုင်သည်။ ```bash conda env create --name ai4beg --file ../environment.yml conda activate ai4beg ``` -### နမူနာများကို အလုပ်လုပ်စေခြင်း +### နမူနာများကို လုပ်ဆောင်ခြင်း -**Python scripts (.py files) အတွက်:** +**Python စကရစ်(.py ဖိုင်) များအတွက်:** ```bash python 01-hello-ai-world.py ``` -**Jupyter notebooks (.ipynb files) အတွက်:** +**Jupyter မှတ်စုစာအုပ်(.ipynb ဖိုင်) များအတွက်:** ```bash jupyter notebook 03-image-classifier.ipynb ``` -## 📖 လေ့လာရေးလမ်းကြောင်း +## 📖 သင်ယူရေးလမ်းကြောင်း -နမူနာများကို အစဉ်လိုက် လေ့လာဖို့ အကြံပြုပါတယ်: +နမူနာများကို အဆင့်လိုက် နားလည်ကြည့်ပါ။ -1. **"Hello AI World" နဲ့ စတင်ပါ** - pattern recognition အခြေခံကို လေ့လာပါ -2. **Simple Neural Network တည်ဆောက်ပါ** - neural networks ဘယ်လိုအလုပ်လုပ်သလဲ နားလည်ပါ -3. **Image Classifier ကို စမ်းကြည့်ပါ** - အမှန်တကယ် ပုံတွေနဲ့ AI အလုပ်လုပ်ပုံကို ကြည့်ပါ -4. **Text Sentiment ကို ခွဲခြားပါ** - natural language processing ကို စမ်းကြည့်ပါ +1. **"Hello AI World" နှင့် စတင်ပါ** - ပုံစံသိရှိခြင်း အခြေခံကို သင်ယူပါ +2. **ရိုးရှင်းသော Neural Network တည်ဆောက်ပါ** - Neural Network များသည် မည်သို့ လုပ်ဆောင်ကြသည်ကို နားလည်ပါ +3. **ဓာတ်ပုံခွဲခြားစက်ကို ကြိုးစားပါ** - အမှန်တကယ် AI ကို တင်ပြခြင်း +4. **စာသားခံစားချက် ကို ခွဲခြားပါ** - သဘာဝဘာသာစကားဖြင့် လေ့လာမှုကို စူးစမ်းပါ -## 💡 စတင်လေ့လာသူများအတွက် အကြံပေးချက်များ +## 💡 စတင်သုံးသူများအတွက်အကြံပြုချက်များ -- **Code မှာပါတဲ့ မှတ်ချက်တွေကို သေချာဖတ်ပါ** - တစ်ကြောင်းချင်းစီ ဘာလုပ်သလဲ ရှင်းပြထားပါတယ် -- **စမ်းကြည့်ပါ!** - တန်ဖိုးတွေကို ပြောင်းပြီး ဘာဖြစ်မလဲ ကြည့်ပါ -- **အရာအားလုံးကို နားလည်ဖို့ စိတ်ပူမထားပါနဲ့** - လေ့လာခြင်းက အချိန်ယူရပါတယ် -- **မေးမြန်းပါ** - [Discussion board](https://github.com/microsoft/AI-For-Beginners/discussions) ကို အသုံးပြုပါ +- **ကုဒ် မှတ်ချက်များကို ဂရုစိုက်ဖတ်ပါ** - တစ်ကြောင်းခြင်းစီ ရည်ရွယ်ချက်ကို ရှင်းပြထားသည် +- **စမ်းသပ်ကြည့်ပါ!** - တန်ဖိုးများကို ပြောင်းလဲ၍ ဖြစ်တတ်သည်ကို ကြည့်ရှုပါ +- **အားလုံးကို နားလည်ဖို့ စိုးရိမ် မနေပါနှင့်** - သင်ယူမှုသည် အချိန်ယူသည် +- **မေးခွန်း မေးနိုင်ပါသည်** - [ဆွေးနွေးပွဲအဖွဲ့](https://github.com/microsoft/AI-For-Beginners/discussions) ကို အသုံးပြုပါ ## 🔗 နောက်တစ်ဆင့်များ -ဒီနမူနာတွေကို ပြီးမြောက်ပြီးနောက်မှာ အပြည့်အစုံ curriculum ကို လေ့လာပါ: -- [AI အကျဉ်းချုပ်](../lessons/1-Intro/README.md) +ဤနမူနာများပြီးစီးပြီးနောက် ထပ်မံ လေ့လာလိုပါက: +- [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) +- [ကွန်ပျူတာမြင်ကွင်း](../lessons/4-ComputerVision/README.md) +- [သဘာဝဘာသာစကား နှင့်ဖြေရှင်းမှု](../lessons/5-NLP/README.md) -## 🤝 အထောက်အပံ့ပေးခြင်း +## 🤝 ဝေမျှပါ -ဒီနမူနာတွေကို အသုံးဝင်တယ်လို့ တွေ့ရင် ကျွန်တော်တို့ကို အကောင်းပြောပါ: -- ပြဿနာတွေကို report လုပ်ပါ သို့မဟုတ် တိုးတက်မှုအကြံပေးပါ -- စတင်လေ့လာသူများအတွက် နမူနာတွေ ပိုမိုထည့်ပါ -- Documentation နဲ့ မှတ်ချက်တွေကို တိုးတက်အောင်လုပ်ပါ +ဤနမူနာများကို အသုံးဝင်သည်ဟု တွေ့လျှင် ကျေးဇူးပြု၍ တိုးတတ်မှုတွင် အကူအညီ ပေးပါ။ +- ပြဿနာများတင်ပြခြင်း သို့မဟုတ် တိုးတတ်မှုဆွေးနွေးခြင်း +- စတင်သုံးသူများအတွက် နမူနာများ ထပ်ထည့်ပေးခြင်း +- စာတမ်းနှင့် မှတ်ချက်များ တိုးတတ်စေခြင်း --- -*သတိရပါ: ကျွမ်းကျင်သူတိုင်းဟာ တစ်ချိန်က စတင်လေ့လာသူတစ်ဦးဖြစ်ခဲ့ပါတယ်။ လေ့လာမှုကို ပျော်ရွှင်စွာ ဆက်လက်ပါ! 🎓* +*သတိပြုရန်: စွမ်းကျင်သူတိုင်းသည် အစပိုင်းတွင် စတင်သုံးသူ ဖြစ်ခဲ့သည်။ ပျော်ရွှင်စွာ သင်ယူပါ! 🎓* --- -**အကြောင်းကြားချက်**: -ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက် ဘာသာပြန်ခြင်းတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါရှိနိုင်သည်ကို သတိပြုပါ။ မူရင်းဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတရ အရင်းအမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော အလွဲအလွဲအချော်များ သို့မဟုတ် အနားယူမှုမှားများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file + +**ပြောကြားချက်** +ဤစာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးပမ်းနေသော်လည်း၊ စက်ကိရိယာဘာသာပြန်ခြင်းများတွင် အမှားများ သို့မဟုတ် မှားယွင်းချက်များ ပါဝင်နိုင်ကြောင်း သတိပြုပါရန် လိုအပ်ပါသည်။ မူလစာတမ်းကို မူရင်းဘာသာဖြင့်သာ ယုံကြည်စိတ်ချရသော အချက်အလက်အဖြစ် သတ်မှတ်သင့်သည်။ အရေးကြီးသည့် သတင်းအချက်အလက်များအတွက် ပရော်ဖက်ရှင်နယ် လူသားဘာသာပြန်သူဝန်ဆောင်မှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်ချက်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုကွာခြားမှုများ သို့မဟုတ် မမှန်ကန်သော အသုံးပြုမှုများအတွက် ကျွန်ုပ်တို့ တာဝန်မခံပါ။ + \ No newline at end of file diff --git a/translations/my/lessons/0-course-setup/how-to-run.md b/translations/my/lessons/0-course-setup/how-to-run.md index 76ad6f996e..45990b7bdb 100644 --- a/translations/my/lessons/0-course-setup/how-to-run.md +++ b/translations/my/lessons/0-course-setup/how-to-run.md @@ -1,12 +1,12 @@ -# နည်းလမ်း အတိုင်း ကုတ်ကို လည်ပတ်ရန် +# ကုဒ်ကို run လုပ်နည်း -ဒီ သင်ခန်းစာဟာ အလုပ်လုပ်နိုင်တဲ့ ဥပမာတွေ နဲ့ လက်တွေ့လေ့ကျင့်ခန်းတွေ များစွာ ပါဝင်ပြီး သင် လည်ပတ်ချင်မယ်။ ဒါကို လုပ်ဖို့ သင် လိုအပ်တာက ဒီသင်ခန်းစာ၏ အစိတ်အပိုင်းတစ်ခုအနေဖြင့် ပေးထားတဲ့ Jupyter Notebooks ထဲမှာ Python ကုတ်ကို လည်ပတ်နိုင်စွမ်းရှိဖို့ ဖြစ်ပါတယ်။ ကုတ်ကို လည်ပတ်ဖို့ အနည်းငယ် ရွေးချယ်စရာရှိပါတယ်- +ဒီသင်ရိုးတွင် run လုပ်လိုစိတ်ရှိမယ့် executable ဥပမာနဲ့ စမ်းသပ်မှုတွေ များပြားနေပါတယ်။ ဒါကိုလုပ်ဖို့အတွက်, သင်ရိုးအချက်အချာတွင်ပါဝင်တဲ့ Jupyter Notebooks ဂြိုဟ်တွင် Python ကုဒ်ကို run လုပ်နိုင်စွမ်းလိုအပ်ပါတယ်။ Run လုပ်ရာမှာတော့ ရွေးချယ်စရာစုံရှိပါတယ်။ -## သင့် ကွန်ပျူတာပေါ်မှာ ဒေသခံ လည်ပတ်ရန် +## ကိုယ့်ကွန်ပျူတာပေါ်မှာ locally run လုပ်ခြင်း -သင့် ကွန်ပျူတာပေါ်မှာ ဒေသခံ လည်ပတ်ဖို့ Python တပ်ဆင်ထားဖို့ လိုအပ်ပါတယ်။ တစ်ခုအတွဲအနေနဲ့ အကြံပြုတာက **[miniconda](https://conda.io/en/latest/miniconda.html)** ကို တပ်ဆင်ဖို့ ဖြစ်ပြီး ဒါဟာ `conda` package manager ကို ထောက်ပံ့တဲ့ ပိုလွယ်ကူတဲ့ Python **virtual environment** များအတွက် တပ်ဆင်ဖို့ တစ်ခုလေးပါ။ +ကိုယ့်ကွန်ပျူတာပေါ်မှာ locally run လုပ်ဖို့ Python installation လိုအပ်ပါတယ်။ တစ်ခုအကြံပြုချင်တာက **[miniconda](https://conda.io/en/latest/miniconda.html)** ကို install လုပ်တာပါ - ဒါက လွယ်ကူဘဲ 설치 ဖြစ်ပြီး Python နဲ့အမျိုးမျိုးသော **virtual environments** အတွက် `conda` package manager ကို support လုပ်ပါတယ်။ -miniconda တပ်ဆင်ပြီးပါက repository ကို clone ဆွဲပြီး ဒီသင်တန်းအတွက် အသုံးပြုမဲ့ virtual environment တစ်ခု ဖန်တီးပါ- +miniconda install လုပ်ပြီးတဲ့နောက်, repository ကို clone လုပ်ပြီး သင်တန်းအတွက် အသုံးပြုမယ့် virtual environment တစ်ခုကို တည်ဆောက်ပါ။ ```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 ကို Python Extension နဲ့ အသုံးပြုခြင်း +### 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 ထဲမှာ directory ကို clone ဆွဲပြီးဖွင့်လိုက်တာနဲ့ Python extensions ကို အလိုအလျောက် တပ်ဆင်ဖို့ ပေးရှုံ့ပေးမှာ ဖြစ်ပါတယ်။ အထက်မှာ ဖော်ပြထားတဲ့အတိုင်း miniconda ကိုလည်း တပ်ဆင်ထားဖို့ လိုအပ်မှာ ဖြစ်ပါတယ်။ +> **မှတ်ချက်**: repository ကို clone လုပ်ပြီး VS Code မှာဖွင့်မယ်ဆိုရင် Python extensions ကို install လုပ်ဖို့ အလိုအလျောက် sugesst လုပ်ပါလိမ့်မယ်။ အထက်ဖေါ်ပြခဲ့တဲ့အတိုင်း miniconda ကိုလည်း install လုပ်ထားဖို့လိုပါပဲ။ -> **မှတ်ချက်**: VS Code က container အတွင်းမှာ repo ကို ပြန်ဖွင့်ဖို့ 제안လာရင် ဒေသခံ Python တပ်ဆင်မှုကို အသုံးပြုဖို့ ထို ပြန်ဖွင့်ခြင်းကို ငြင်းဆန်သင့်ပါတယ်။ +> **မှတ်ချက်**: VS Code က repository ကို container တစ်ခုအဖြစ်ပြန်ဖွင့်ဖို့ sugesst လုပ်လာရင် local Python installation သုံးဖို့ အဲ့ဒီတောင်းဆိုမှုကို ပယ်ချသင့်ပါတယ်။ -### Browser တွင် Jupyter အသုံးပြုခြင်း +### Browser မှ Jupyter သုံးခြင်း -သင့် ရှိရာ ကွန်ပျူတာမှာ browser မှတစ်ဆင့် Jupyter ပတ်ဝန်းကျင်ကိုလည်း အသုံးပြုနိုင်ပါတယ်။ classical Jupyter နဲ့ JupyterHub နှစ်ခုလုံးမှာ auto-completion, ကုတ်အလင်းပေးခြင်း စသည်တို့ ပါဝင်တဲ့ သက်တောင့်သက်သာ ဖွံ့ဖြိုးမှုပတ်ဝန်းကျင်ကို ရရှိစေပါတယ်။ +ကိုယ့်ကိုယ်ပိုင်ကွန်ပျူတာပေါ်မှာ browser ကနေ Jupyter environment ကိုသုံးနိုင်ပါတယ်။ classic Jupyter နဲ့ JupyterHub ဖွင့်တဲ့အခါမှာ auto-completion, code highlighting စတာတွေပါဝင်တဲ့ ထောက်ပံ့ရေးကောင်းတဲ့ဖွံ့ဖြိုးရေး အခြေအနေကိုရရှိပါတယ်။ -ဒေသခံ Jupyter ကို စတင်ရန် သင်တန်း folder ကိုသွားပြီး အောက်ပါအတိုင်း လည်ပတ်ပါ- +Jupyter ကို locally စလိုချင်ရင် သင်တန်းဖိုင်ရှိတဲ့ directory ကို သွားပြီး အောက်ပါ command ကို run လုပ်ပါ - ```bash jupyter notebook @@ -36,36 +36,36 @@ or ```bash jupyterhub ``` -ပြီးရင် `.ipynb` ဖိုင် ဘယ်ဟာမဆို သွားရှာဖွေ၊ ဖွင့်ပြီး အလုပ်ဆောင်နိုင်ပါပြီ။ +ပြီးရင် `.ipynb` ဖိုင်တွေကိုရွေးပြီးဖွင့်နိုင်ပါပြီ၊ မိမိလုပ်ဆောင်စတင်နိုင်ပါပြီ။ -### Container မှာ လည်ပတ်ခြင်း +### Container ထဲမှာ run လုပ်ခြင်း -Python တပ်ဆင်မထားဘဲ container ထဲမှာ ကုတ်တွေ လည်ပတ်လိုက်ရင်နည်းလမ်းတစ်ခုရှိပါတယ်။ ကျွန်တော်တို့ရဲ့ repo ထဲမှာ `.devcontainer` ဆိုတဲ့ folder က container ဖန်တီးနည်းကို ဖော်ပြပေးတာကြောင့် VS Code က container မှာ repo ကို ပြန်ဖွင့်ဖို့ အခွင့်အလမ်းပေးပါတယ်။ ဒီအတွက် Docker ကို တပ်ဆင်ထားရမှာဖြစ်ပြီး ပိုကြမ်းတမ်းရှုပ်ထွေးတဲ့ နယ်ပယ်ဖြစ်လို့ နည်းပညာပိုင်းမှာ ကျွမ်းကျင်သူတွေအတွက်သာ အသုံးပြုဖို့ အကြံပြုပါတယ်။ +Python installation အစား container ထဲ run လုပ်နိုင်ပါတယ်။ ကျွန်တော်တို့ repo မှာ `.devcontainer` ဆိုတဲ့ folder တစ်ခု ထည့်ထားပြီး container ပြုပြင်ဖွဲ့စည်းနည်း ဖော်ပြပေးထားတာကြောင့် VS Code မှာ container အဖြစ် အလွယ်တကူဖွင့်စီမံရန် အခွင့်အရေးပေးပါတယ်။ ဒါအတွက် Docker installation လိုအပ်ပြီး အနည်းငယ်ရှုပ်ထွေးတာကြောင့် အတွေ့အကြုံရှိသူတွေကို အကြံပြုပါတယ်။ -## Cloud မှာ လည်ပတ်ခြင်း +## Cloud မှာ run လုပ်ခြင်း -Python ကို ဒေသခံမှာ တပ်ဆင်ချင် မထားဘူး၊ cloud資源အသုံးပြုခွင့်ရှိရင် cloud မှာ ကုတ်ကို လည်ပတ်အသုံးပြုဖို့ ကောင်းတဲ့ နည်းလမ်းများ ရှိပါတယ်- +Python ကို ကိုယ့်ကွန်ပျူတာမှာ install မလုပ်ချင်ဘူးဆိုရင်နဲ့ cloud resource တွေကိုအသုံးချနိုင်တယ်ဆိုရင် cloud မှာ run လုပ်ရတာကောင်းသောရွေးချယ်စရာတခုဖြစ်ပါတယ်။ တွဲချိတ် run လုပ်နည်းအများအပြားရှိတယ် - -* **[GitHub Codespaces](https://github.com/features/codespaces)** ကို အသုံးပြုခြင်း။ GitHub မှာ သင့်အတွက် virtual environment ဖန်တီးပေးပြီး VS Code browser များဖြင့် ရရှိနိုင်ပါတယ်။ Codespaces အသုံးပြုခွင့် ရှိရင် repo မှာ **Code** ခလုတ်ကို နှိပ်ပြီး codespace စတင်ပြီး အခက်အခဲမရှိတတ်နိုင်ပြီ။ -* **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)** ကို အသုံးပြုခြင်း။ [Binder](https://mybinder.org) က GitHub မှာရှိတဲ့ ကုတ်တွေကို စမ်းသပ်ဖို့အတွက် cloud မှကွန်ပျူတာ အရင်းအမြစ်များကို အခမဲ့ ပေးအပ်ပါတယ်။ repo ကို Binder မှာဖွင့်ဖို့ front page မှာ ခလုတ်တစ်ခုရှိပြီး ၎င်းက သင့်အတွက် container တစ်ခုပြုလုပ်ပြီး Jupyter web interface ကို စတင်ပေးပါလိမ့်မယ်။ +* **[GitHub Codespaces](https://github.com/features/codespaces)** ကိုသုံးခြင်း - GitHub ပေါ်မှာ virtual environment တစ်ခု ဖန်တီးပေးပြီး VS Code browser interface ကနေ ဝင်ရောက် အသုံးပြုနိုင်ပါတယ်။ Codespaces ကိုရနိုင်သူဆိုရင် repo မှာ **Code** ခလုတ်ကိုနှိပ်ပြီး codespace ကို စတင်၍ အချိန်မကုန် run လုပ်လို့ရပါတယ်။ +* **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)** ကိုသုံးခြင်း။ [Binder](https://mybinder.org) က GitHub အတွက် cloud ပေါ်က ဝေစုစရင်းလွတ်လပ်သော computing resource ကို ပေးသည်။ Repo ကို Binder နှင့်ဖွင့်ရန် အရင်စာမျက်နှာမှာ ခလုတ်ရှိပြီး အဲ့ဒီနေရာကို ဦးတည်သွားသလို container တည်ဆောက်ပြီး Jupyter web interface ကို မည်သည့်အဆင်ပြေလွယ်ကူစွာ စတင်ပေးပါမယ်။ -> **မှတ်ချက်**: မမှန်ကန်စွာ အသုံးပြုမှု တားမြစ်ဖို့ Binder ကတချို့ web resources များကို ပိတ်ထားပါတယ်။ ထို့ကြောင့် မော်ဒယ်များ သို့မဟုတ် ဒေတာအစုံများကို အွန်လိုင်းမှ ယူလာတဲ့ ကုတ်တချို့ ဘာလုပ်မရဘူး ဖြစ်နိုင်ပါတယ်။ အလုပ်ဖြေရှင်းနည်းခြင်းတွေလည်း လိုအပ်နိုင်ပါတယ်။ ထို့အပြင် Binder ပေးတဲ့ ကွန်ပျူတာ အရင်းအမြစ်တွေ အခြေခံအဆင့်ဖြစ်လို့ သင်ကြားမှု မြန်မရနိုင်ပါ၊ အထူးသဖြင့် နောက်ပိုင်းမှာ ပိုခက်ခဲမယ့် သင်ခန်းစာများမှာပြသနာဖြစ်နိုင်ပါတယ်။ +> **မှတ်ချက်**: မမှန်ကန်သင့်စွဲမှုများကို ကာကွယ်ရန် Binder မှ အချို့ web resource များကို ပိတ်ထားသည်။ ဒါက model များနဲ့ ဒေတာကို ပြင်ပ အင်တာနက်မှ ရယူတဲ့ ကုဒ်များ အလုပ်မလုပ်ပဲရပ်တန့်နိုင်သလို အခြားနည်းလမ်းရှာဖွေရန် လိုအပ်နိုင်ပါတယ်။ ထို့အပြင် Binder ကပေးတဲ့ တိုက္ခိုက်မှု resource များမကြာခဏမလုံလောက်ကြောင်းကြောင့် စိတ်ဝင်စားဖွယ် training တွေ အထူးသဖြင့် နောက်ပိုင်း ရှုပ်ထွေးတဲ့ သင်ခန်းစာတွင် နှေးကွေးတတ်ပါတယ်။ -## GPU ပါ Cloud မှာ လည်ပတ်ခြင်း +## GPU ပါရှိသည့် Cloud မှာ run လုပ်ခြင်း -ဒီသင်ခန်းစာအတွင်း နောက်ပိုင်းသင်ခန်းစာအချို့မှာ GPU ပံ့ပိုးမှုက အလွန် အကျိုးရှိပါလိမ့်မယ်။ မော်ဒယ် သင်ကြားမှုကို ပိုမြန်စေမှာ ဖြစ်ပြီး မရှိမဖြစ်လိုအပ်ပါတယ်။ [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) သို့မဟုတ် သင့်တက္ကသိုလ်မှတဆင့် cloud ရရှိသူတွေ အတွက် အောက်ပါနည်းလမ်းများ ရှိပါတယ်- +ဒီသင်ရိုးအချို့ နောက်ပိုင်းသင်ခန်းစာများအတွက် GPU support ရှိဖို့ အရေးကြီးပါတယ်။ နမူနာအတွက် model training က မဖြစ်မနေမြန်ကာတတ်ပါတယ်။ cloud ကို အသုံးပြုခြင်းအထူးသဖြင့် [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) သို့မဟုတ် သင်တန်းတက်နေလို့ ရနိုင်တဲ့ အဖွဲ့အစည်းမှ cloud ကို မှတ်ပုံတင်ထားပြီးပိုမိုကောင်းမွန်သော အစီအစဉ်များအတွက် အောက်ပါနည်းလမ်းများ ရှိပါတယ်။ -* [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 ကို တိုက်ရိုက် machine မှာ clone ဆွဲပြီး စတင်လေ့လာနိုင်ပါတယ်။ NC-series VMs တွေဟာ 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 ကို တိုက်ရိုက် machine ထဲ clone လုပ်ပြီး သင်ယူစတင်နိုင်ပါတယ်။ NC-series VM များတွင် GPU support ပါဝင်သည်။ -> **မှတ်ချက်**: Azure for Students စသည့် subscription တချို့ဟာ ပုံမှန်အတိုင်း GPU ပံ့ပိုးမှု မပေးပါ၊ technical support ကနေ GPU cores ပိုများအောင် တောင်းဆိုရပါမယ်။ +> **မှတ်ချက်**: Azure for Students အပါအဝင် အချို့ subscription များတွင် GPU support ကို ပူးတွဲပေးခြင်း မရှိနိုင်ပါ။ အပို GPU core များရရန် နည်းပညာဆိုင်ရာ မေးခွန်းတင်ရန် လိုအပ်တတ်ပါသည်။ -* [Azure Machine Learning Workspace](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) တစ်ခု ဖန်တီးပြီး Notebook feature ကို အသုံးပြုနိုင်ပါတယ်။ [ဤဗီဒီယို](https://azure-for-academics.github.io/quickstart/azureml-papers/) သည် Azure ML Notebook တွင် repo တစ်ခုကို clone ဆွဲပြီး အသုံးပြုနည်းကို ပြသထားပါတယ်။ +* [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 တွင် repository ကို clone လုပ်ပြီး သုံးပုံပြပေးထားပါတယ်။ -Google Colab ကိုလည်း အသုံးပြုနိုင်ပြီး အခမဲ့ GPU ပံ့ပိုးမှု နဲ့ Jupyter Notebooks တွေကို တစ်ခုချင်းစီ တင်ပြီး လည်ပတ်နိုင်ပါတယ်။ +Google Colab ကိုလည်း အသုံးပြုနိုင်ပြီး ဒါဟာ အခမဲ့ GPU မှာရှိ၊ Jupyter Notebooks ကို တစ်ခါတိုင်းတင်ပြီး run လုပ်နိုင်ပါတယ်။ --- -**အကြောင်းကြားချက်**: -ဤစာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ မှန်ကန်မှုအတွက် ကြိုးစားပေမယ့် စက်မြန်မာဘာသာပြန်ချက်များတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်ကြောင်း သတိပြုပါရန် အပ်ပါသည်။ မူရင်းစာတမ်းကို မိခင်ဘာသာဖြင့်သာ ထောက်ခံချက်အဖြစ်ယူဆသင့်ပါသည်။ အရေးကြီးသည့် သတင်းအချက်အလက်များအတွက်တော့ တတ်ကျွမ်းသော လူ့ဘာသာပြန်သူများ၏ ဘာသာပြန်ခြင်းကို အကြံပြုပါသည်။ ဤဘာသာပြန်ချက်ကို အသုံးပြုမှုမှဖြစ်ပေါ်လာသော လွဲမှား သို့မဟုတ် နားလည်မှုမှားများအတွက် ကျွန်ုပ်တို့ မည်သည့် တာဝန်မရှိပါ။ +**ပြောကြားချက်** +ဤစာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးပမ်းနေသော်လည်း၊ စက်ကိရိယာဘာသာပြန်ခြင်းများတွင် အမှားများ သို့မဟုတ် မှားယွင်းချက်များ ပါဝင်နိုင်ကြောင်း သတိပြုပါရန် လိုအပ်ပါသည်။ မူလစာတမ်းကို မူရင်းဘာသာဖြင့်သာ ယုံကြည်စိတ်ချရသော အချက်အလက်အဖြစ် သတ်မှတ်သင့်သည်။ အရေးကြီးသည့် သတင်းအချက်အလက်များအတွက် ပရော်ဖက်ရှင်နယ် လူသားဘာသာပြန်သူဝန်ဆောင်မှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်ချက်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုကွာခြားမှုများ သို့မဟုတ် မမှန်ကန်သော အသုံးပြုမှုများအတွက် ကျွန်ုပ်တို့ တာဝန်မခံပါ။ \ No newline at end of file diff --git a/translations/my/lessons/1-Intro/README.md b/translations/my/lessons/1-Intro/README.md index a5a0e6caa0..dd2df864f7 100644 --- a/translations/my/lessons/1-Intro/README.md +++ b/translations/my/lessons/1-Intro/README.md @@ -1,97 +1,162 @@ -# AI အကြောင်းအကျဉ်း +# AI ကိုမိတ်ဆက်ခြင်း -![AI အကြောင်းအကျဉ်းအကြောင်းအရာကို ရေးဆွဲထားသော ပုံ](../../../../translated_images/my/ai-intro.bf28d1ac4235881c.webp) +![AI မိတ်ဆက်မှုအကြောင်းအရာ၏ ဓာတ်ပုံဆွဲချက် အကျဉ်း](../../../../translated_images/my/ai-intro.bf28d1ac4235881c.webp) -> [Tomomi Imura](https://twitter.com/girlie_mac) မှ Sketchnote +> [Tomomi Imura](https://twitter.com/girlie_mac) မှ ဆွဲထားသော စကက်ချ်နိုက် -## [သင်ခန်းစာမတိုင်မီ စမ်းမေးခွန်း](https://ff-quizzes.netlify.app/en/ai/quiz/1) +## [မှန်ကန်မှုစမ်းသပ်မှုမတိုင်ခင် စစ်ဆေးမှု](https://ff-quizzes.netlify.app/en/ai/quiz/1) -**Artificial Intelligence** ဆိုတာ လူသားတွေက လုပ်နိုင်တဲ့ အရာတွေကို ကွန်ပျူတာတွေက လုပ်နိုင်အောင် စမ်းသပ်လေ့လာတဲ့ သိပ္ပံနယ်ပယ်တစ်ခုဖြစ်ပါတယ်။ +**ကွန်ပျူတာ ပြုလုပ်သူ၏ ဉာဏ်ရည်ဖြစ်စေရေးသိပ္ပံအကျင့်သုတေသန** သည် ကွန်ပျူတာများကို လူသားကြားထွက်ရှိသော ဉာဏ်ရည်ပြုမူတူ ဖော်ပြနိုင်သည့် နည်းလမ်းများကို လေ့လာသုံးသပ်သော စိတ်လှုပ်ရှားဖွယ် သိပ္ပံလောကဖြစ်သည်။ -မူလကတော့ ကွန်ပျူတာတွေကို [Charles Babbage](https://en.wikipedia.org/wiki/Charles_Babbage) က အလွန်သေချာတဲ့ နည်းလမ်းတစ်ခုဖြင့် နံပါတ်တွေကို လုပ်ဆောင်နိုင်ဖို့ တီထွင်ခဲ့တာပါ။ ယနေ့ခေတ်ကွန်ပျူတာတွေဟာ ၁၉ ရာစုက မူလပုံစံထက် အလွန်တိုးတက်လာပြီးသားဖြစ်ပေမယ့်လည်း ထိန်းချုပ်ထားတဲ့တွက်ချက်မှုတွေကို အခြေခံထားတဲ့ အယူအဆကိုပဲ ဆက်လက်လိုက်နာနေပါတယ်။ ဒါကြောင့် ရည်မှန်းချက်ကို ရရှိဖို့ လိုအပ်တဲ့ အဆင့်ဆင့်လုပ်ဆောင်မှုတွေကို သိထားရင် ကွန်ပျူတာကို အစီအစဉ်ရေးသားပြီး လုပ်ဆောင်နိုင်ပါတယ်။ +မူလတန်းအနေဖြင့် ကွန်ပျူတာများကို [Charles Babbage](https://en.wikipedia.org/wiki/Charles_Babbage) မှ နံပါတ်များအပေါ် တိတိကျကျလုပ်ဆောင်ရန် ရောဂါအတိုင်း (algorithm) ထည့်သွင်းသုံးစွဲရန် ဖန်တီးခဲ့သည်။ ၁၉ ရာစုတွင် ပင်ခံထားမှုရှိသော်လည်း ယနေ့ခေတ်ကွန်ပျူတာများမှာ ထိုအတွေးအခေါ်ကို ဆက်လက်လိုက်နာသည်။ ထို့ကြောင့် ရည်မှန်းချက်တစ်ခုရရှိရန် လိုအပ်သော တိကျချက်ရှိသည့် အဆင့်လိုက် ခုံမူကြီးကို သိမ်းဆည်းတည်ဆောက်နိုင်ပါက ကွန်ပျူတာတစ်ခုကို အစီအစဉ်ရေးနိုင်သည်။ -![လူတစ်ဦး၏ ဓာတ်ပုံ](../../../../translated_images/my/dsh_age.d212a30d4e54fb5f.webp) +![ပုံတစ်ပုံ](../../../../translated_images/my/dsh_age.d212a30d4e54fb5f.webp) > [Vickie Soshnikova](http://twitter.com/vickievalerie) မှ ဓာတ်ပုံ -> ✅ လူတစ်ဦး၏ ဓာတ်ပုံမှ အသက်ကို သတ်မှတ်ဖို့ဆိုတာ အတိအကျအစီအစဉ်ရေးသားလို့မရတဲ့ အလုပ်တစ်ခုဖြစ်ပါတယ်၊ အကြောင်းကတော့ လူသားတွေဟာ အဲ့ဒီနည်းလမ်းကို သူတို့ရဲ့ ဦးနှောက်ထဲမှာ ဘယ်လိုထွက်လာတယ်ဆိုတာ မသိကြလို့ပါ။ +> ✅ ပုံတစ်ပုံမှ သူတစ်ပါး၏ အသက်သတ်မှတ်ခြင်းသည် တိတိကျကျ အစီအစဉ်ရေး၍ မရနိုင်သော အလုပ်တစ်ခုဖြစ်သည်၊ အကြောင်းမှာ ပြုလုပ်သောအခါ ဦးထုပ်ထဲတွင် အဲဒီနံပါတ်ကို မည်သို့ ရတယ်ဆိုသည်ကို မသိကြောင်းဖြစ်သည်။ --- -သို့သော်လည်း အတိအကျ မသိတဲ့ အလုပ်တစ်ချို့လည်း ရှိပါတယ်။ လူတစ်ဦး၏ ဓာတ်ပုံမှ အသက်ကို သတ်မှတ်ဖို့ကို စဉ်းစားကြည့်ပါ။ လူသားတွေဟာ အသက်အရွယ်အမျိုးမျိုးရှိတဲ့ လူတွေကို အများကြီးတွေ့ဖူးလို့ အဲ့ဒီအလုပ်ကို လုပ်တတ်လာကြပေမယ့် ဘယ်လိုလုပ်တတ်လာတယ်ဆိုတာကို အတိအကျရှင်းပြလို့မရပါဘူး။ ဒါ့အပြင် ကွန်ပျူတာကိုလည်း အဲ့ဒီအလုပ်ကို အတိအကျအစီအစဉ်ရေးသားပေးလို့မရပါဘူး။ ဒီလိုအလုပ်တွေက **Artificial Intelligence** (AI) ရဲ့ စိတ်ဝင်စားစရာအလုပ်တွေဖြစ်ပါတယ်။ +သို့သော် လူတို့ မကြၽမ်းတမ်းသိသည့် တချို့ အလုပ်များလည်း ရှိသည်။ သူတစ်ပါး၏ ဓာတ်ပုံမှ အသက်ကို သတ်မှတ်ခြင်းကို လေ့လာကြည့်ပါ။ လူအသက်အမျိုးမျိုးကို မြင်တွေ့ခဲ့ကြောင်းကြောင့် ကျွန်ုပ်တို့ သင်ယူနိုင်ချိန်ရှိပြီး၊ ဘယ်လိုသတ်မှတ်တာလဲဆိုသည်ကို မတိတိကျကျ ဖော်ပြ/အကြောင်းကြားနိုင်၊ မျှ ကွန်ပျူတာကို မပရိုဂရမ်းနိုင်ပါ။ ဤကဲ့သို့ အလုပ်သည် **ကွန်ပျူတာ ဉာဏ်ရည်** (AI) ၏ စိတ်ဝင်စားဖွယ် အလုပ်ဖြစ်သည်။ -✅ AI က အကျိုးရှိမယ့် အလုပ်တွေကို ကွန်ပျူတာကို အပ်နှံနိုင်မယ့် အလုပ်တစ်ချို့ကို စဉ်းစားကြည့်ပါ။ ဘဏ္ဍာရေး၊ ဆေးဘက်ဆိုင်ရာနဲ့ အနုပညာနယ်ပယ်တွေမှာ AI က ဘယ်လိုအကျိုးရှိနေပြီလဲဆိုတာ တွေးကြည့်ပါ။ +✅ AI ကို အသုံးပြုကူညီစရာ ကွန်ပျူတာသို့ အလိုအလျောက်လုပ်ပေးလိုသော အလုပ်အချို့ကို စဉ်းစားပါ။ ငွေကြေး၊ ဆေးပညာနှင့် အနုပညာ တို့ဆိုင်ရာကဏ္ဍများတွင် AI သည် ယနေ့ဘယ်လိုအကျိုးရှိပါသလဲဆိုသည်ကို စဉ်းစားကြည့်ပါ။ -## အားနည်း AI နဲ့ အားကောင်း AI +## အနိမ့် AI နှင့် အလိုက်ကျ AI -အားနည်း AI | အားကောင်း AI +အနိမ့် AI | အလိုက်ကျ AI ---------------------------------------|------------------------------------- -အားနည်း AI ဆိုတာ သီးသန့်အလုပ်တစ်ခု သို့မဟုတ် အလုပ်အနည်းငယ်အတွက် အထူးပြုပြီး ဒီဇိုင်းရေးဆွဲထားတဲ့ AI စနစ်တွေကို ဆိုလိုပါတယ်။ | အားကောင်း AI (သို့မဟုတ် Artificial General Intelligence - AGI) ဆိုတာ လူသားတွေရဲ့ ဉာဏ်ရည်နဲ့ နားလည်မှုအဆင့်ရှိတဲ့ AI စနစ်တွေကို ဆိုလိုပါတယ်။ -ဒီ AI စနစ်တွေဟာ အထွေထွေဉာဏ်ရည်မရှိပါဘူး၊ သတ်မှတ်ထားတဲ့ အလုပ်တစ်ခုမှာသာ ထူးချွန်ပြီး အမှန်တကယ် နားလည်မှု သို့မဟုတ် သတိရှိမှုမရှိပါဘူး။ | ဒီ AI စနစ်တွေဟာ လူသားတွေလို အလုပ်တွေကို လုပ်ဆောင်နိုင်ပြီး၊ နယ်ပယ်အမျိုးမျိုးကို လိုက်လျောညီထွေဖြစ်နိုင်ပြီး သတိရှိမှု သို့မဟုတ် ကိုယ်ပိုင်သဘောထားရှိပါတယ်။ -အားနည်း AI ရဲ့ ဥပမာတွေမှာ Siri သို့မဟုတ် Alexa လို အကူအညီပေးစနစ်တွေ၊ streaming service တွေမှာ သုံးတဲ့ အကြံပြု algorithm တွေ၊ သတ်မှတ်ထားတဲ့ ဖောက်သည်ဝန်ဆောင်မှုအတွက် chatbots တွေ ပါဝင်ပါတယ်။ | အားကောင်း AI ရရှိဖို့ဆိုတာ AI သုတေသနရဲ့ ရေရှည်ရည်မှန်းချက်ဖြစ်ပြီး၊ ဉာဏ်ရည်၊ သင်ယူမှု၊ နားလည်မှုနဲ့ အလုပ်အမျိုးမျိုးကို လိုက်လျောညီထွေဖြစ်စေဖို့လိုအပ်ပါတယ်။ -အားနည်း AI ဟာ အထူးပြုထားပြီး လူသားတွေရဲ့ ဉာဏ်ရည်ဆိုင်ရာ အရည်အချင်း သို့မဟုတ် အထွေထွေပြဿနာဖြေရှင်းနိုင်စွမ်းမရှိပါဘူး။ | အားကောင်း AI ဟာ လက်ရှိအဆင့်မှာ သီအိုရီအဆင့်သာရှိပြီး၊ အဲ့ဒီအဆင့်ကို ရောက်ရှိထားတဲ့ AI စနစ်မရှိသေးပါဘူး။ +အနိမ့် AI သည် တစ်ခု သို့မဟုတ် ဆင်တူရှိသော အလုပ်အသေးများကို အထူးသီးသန့် ဒီဇိုင်းဆွဲ သင်ကြားပေးထားသည့် AI စနစ်များဖြစ်သည်။ | အလိုက်ကျ AI သို့မဟုတ် Artificial General Intelligence (AGI) သည် လူနည်းကျွမ်းကျင်မှုနှင့် နားလည်မှုတစ်ခုရှိသည့် AI စနစ်များဖြစ်သည်။ +ယင်း AI စနစ်များတွင် တစ်မျိုးတည်းသော ချီးမြှင့်သော ဉာဏ်ရည် မရှိ၊ သတ်မှတ်ထားသည့် အလုပ်အတွက်သာ အထူးပြုသောကြောင့် အမှန်တကယ် နားလည်မှု သို့မဟုတ် အသိရှိမှု မရှိ။ | ဤ AI စနစ်များသည် လူတစ်ဦးက ပြုလုပ်နိုင်သော ဉာဏ်ရည်ဆိုင်ရာ အလုပ်များအားလုံး ပြုလုပ်နိုင်ပြီး၊ ကဏ္ဍများအတည်အကျ ယုံကြည် ကြည့်နိုင်ခြင်း နှင့် ကိုယ်တိုင်အသိစိတ်တစ်ရပ် ကိုင်ဆောင်ထားသည်။ +အနိမ့် AI များဖြစ်သော ဥပမာများမှာ Siri သို့မဟုတ် Alexa ကဲ့သို့ အဓိကအသုံးပြုသူ ဝန်ဆောင်မှုပေးရာတွင် သီးသန့်ပြုလုပ်ထားသော အွန်လိုင်းအကူအညီစက်များ၊ ကစားသမားနည်းလမ်း ကျွမ်းကျင်မှု စနစ်များဖြစ်သည်။ | အလိုက်ကျ AI ရရှိရေးသည် AI သုတေသန တာဝန်ကာလရှည် နောက်ခံ အစီအစဉ်ဖြစ်ပြီး နားလည်မှု၊ စဉ်းစားတတ်မှု၊ သင်ယူနိုင်မှုနှင့် လိုအပ်ချက် အမျိုးမျိုးအတွက် အသုံးပြုနိုင်မှုရှိစေရန် လုပ်ဆောင်ရေးဖြစ်သည်။ +အနိမ့် AI သည် အထူးပြုစုထားပြီး လူ့ ဉာဏ်ရည်တူစွမ်းရည် သို့မဟုတ် စုပေါင်းပြဿနာမှုပြုပြင်နိုင်မှု မူရင်းကနေပေမဲ့ ကျော်လွှားခြင်း မရှိ။ | အလိုက်ကျ AI သည် လက်ရှိတွင် သီအိုရီသာဖြစ်ပြီး၊ ဘယ် AI စနစ်မှ မရောက်ရှိသေးသော နေရာဖြစ်သည်။ -ပိုမိုသိရှိလိုပါက **[Artificial General Intelligence](https://en.wikipedia.org/wiki/Artificial_general_intelligence)** (AGI) ကို ဖတ်ရှုပါ။ +ပိုမိုသိရှိလိုလျှင် **[Artificial General Intelligence](https://en.wikipedia.org/wiki/Artificial_general_intelligence)** (AGI) ကို ရှာဖွေပါ။ +## ဉာဏ်ရည်၏ အဓိပ္ပါယ် နှင့် Turing စမ်းသပ်မှု -## ဉာဏ်ရည်ရဲ့ အဓိပ္ပါယ်နဲ့ Turing Test +**[Intelligence](https://en.wikipedia.org/wiki/Intelligence)** ဆိုသောစကားလုံးကို ဆက်စပ်ရာတွင် ပြဿနာတစ်ခုမှာ သုတေသနတွင် မှတ်သားထားသော ရှင်းလင်းသောရေးရန် မရှိခြင်း ဖြစ်သည်။ ဉာဏ်ရည်ကို **စိတ်ပညာအကြောင်းအရာ abstraction** သို့မဟုတ် **ကိုယ်တိုင်အသိစိတ်** နှင့် ဆက်စပ်သည် ဟု ဆိုနိုင်သော်လည်း မမှန်ကန်စွာ သတ်မှတ်၍ မရနိုင်ပါ။ -**[Intelligence](https://en.wikipedia.org/wiki/Intelligence)** ဆိုတဲ့ စကားလုံးကို သုံးတဲ့အခါမှာ အဓိပ္ပါယ်ရှင်းလင်းမှုမရှိတာက ပြဿနာတစ်ခုဖြစ်ပါတယ်။ ဉာဏ်ရည်ဆိုတာ **အထွေထွေစဉ်းစားနိုင်စွမ်း** သို့မဟုတ် **ကိုယ့်ကိုယ်ကိုသိမြင်မှု** နဲ့ ဆက်စပ်နေတယ်လို့ ဆိုနိုင်ပေမယ့် အတိအကျ သတ်မှတ်လို့မရပါဘူး။ +![ကြောင်ပုံ](../../../../translated_images/my/photo-cat.8c8e8fb760ffe457.webp) -![ကြောင်တစ်ကောင်ရဲ့ ဓာတ်ပုံ](../../../../translated_images/my/photo-cat.8c8e8fb760ffe457.webp) +> [ဓာတ်ပုံ](https://unsplash.com/photos/75715CVEJhI) ကို [Amber Kipp](https://unsplash.com/@sadmax) မှ Unsplash သမားမှ ယူဆောင်ထားခြင်း -> [Amber Kipp](https://unsplash.com/@sadmax) မှ [ဓာတ်ပုံ](https://unsplash.com/photos/75715CVEJhI) (Unsplash မှ) +*intelligence* စကားလုံး၏ မရှင်းလင်းမှုကို မြင်ရန် "ကြောင်သည် ဉာဏ်ရှိပါသလား?" ဟူသောမေးခွန်းကို ဖြေကြည့်ပါ။ လူများတစ်ဦးချင်းစီတွင် မတူညီသော အဖြေများရှိနိုင်သည့် အကြောင်းမှာ အဆိုအမှန်ကို သက်သေပြတဲ့ စမ်းသပ်မှုက အများအပြား ရှိမှုမရှိခြင်း ဖြစ်ပါသည်။ စိတ်ကူးတစ်ခုရှိ၍ သော့ပုံသဏ္ဍာန်စစ်ဆေးစကားရှက်စစ်ဆေးမှု ခွဲမြှောက်မှု ကဲ့သို့ နိုင်ငံတော် IQ စမ်းသပ်မှုမှ တစ်ခုပါ။ -*ဉာဏ်ရည်* ဆိုတဲ့ စကားလုံးရဲ့ မရေရာမှုကို မြင်နိုင်ဖို့ "ကြောင်တစ်ကောင် ဉာဏ်ရည်ရှိလား?" ဆိုတဲ့ မေးခွန်းကို ဖြေကြည့်ပါ။ လူတွေက အမျိုးမျိုးအဖြေပြတတ်ကြပြီး၊ အဲ့ဒီအဆိုကို အမှန်တစ်ကယ် သက်သေပြနိုင်မယ့် စမ်းသပ်မှုတစ်ခုလည်း မရှိပါဘူး။ အဲ့ဒါရှိတယ်လို့ ထင်ရင်တော့ ကြောင်ကို IQ စမ်းသပ်မှုနဲ့ စမ်းကြည့်ပါ... - -✅ ဉာဏ်ရည်ကို သင်ဘယ်လိုသတ်မှတ်တယ်ဆိုတာ တစ်မိနစ်လောက် စဉ်းစားကြည့်ပါ။ အစားအစာရဖို့ maze ဖြေရှင်းနိုင်တဲ့ ကြက်ငှက်တစ်ကောင် ဉာဏ်ရည်ရှိလား? ကလေးတစ်ယောက် ဉာဏ်ရည်ရှိလား? +✅ သင်၏ စိတ်ထဲတွင် ဉာဏ်ရည်ကို တစ်မိနစ် အာရုံစိုက်စဉ်းစားပါ။ လမ်းကြောင်းရှာ ဆောင်ရွက်ပြီး အစားအသောက် ရသော မိုမိုငှက်တစ်ကောင်ကို ဉာဏ်ရှိသလား? ကလေးတစ်ယောက်ကို ဉာဏ်ရှိသလားဟု သတ်မှတ်ပါ။ --- -AGI အကြောင်းပြောတဲ့အခါမှာ တကယ့်ဉာဏ်ရည်ရှိတဲ့ စနစ်တစ်ခုကို ဖန်တီးနိုင်ပြီလားဆိုတာ သတ်မှတ်ဖို့ နည်းလမ်းတစ်ခုလိုအပ်ပါတယ်။ [Alan Turing](https://en.wikipedia.org/wiki/Alan_Turing) က **[Turing Test](https://en.wikipedia.org/wiki/Turing_test)** ဆိုတဲ့ နည်းလမ်းတစ်ခုကို အကြံပြုခဲ့ပြီး၊ ဒါဟာ ဉာဏ်ရည်ရဲ့ သတ်မှတ်ချက်တစ်ခုအဖြစ်လည်း သုံးနိုင်ပါတယ်။ ဒီစမ်းသပ်မှုက တစ်စနစ်ကို လူသားတစ်ဦးနဲ့ နှိုင်းယှဉ်ပြီး၊ အလိုအလျောက်နှိုင်းယှဉ်မှုကို ကွန်ပျူတာအစီအစဉ်တစ်ခုက လွှဲချော်နိုင်တာကြောင့် လူသားစစ်ဆေးသူတစ်ဦးကို သုံးပါတယ်။ ဒါကြောင့် လူသားတစ်ဦးက စာသားအခြေပြု ဆွေးနွေးမှုမှာ တကယ့်လူနဲ့ ကွန်ပျူတာစနစ်ကို ခွဲခြားမရဘူးဆိုရင် - အဲ့ဒီစနစ်ကို ဉာဏ်ရည်ရှိတယ်လို့ သတ်မှတ်ပါတယ်။ +AGI ကို ပြောရပါက တကယ့် ဉာဏ်ရှိသောစနစ်တစ်ခု ဖန်တီးခဲ့သည်ဟု သိရှိရန် နည်းလမ်းတစ်ခုလိုအပ်သည်။ [Alan Turing](https://en.wikipedia.org/wiki/Alan_Turing) မှ တီထွင်ထုတ်ဖော်ခဲ့သည့် **[Turing Test](https://en.wikipedia.org/wiki/Turing_test)** သည် ဉာဏ်ရည်၏ သတ်မှတ်ချက်အဖြစ်လည်း လုပ်ဆောင်သည်။ စမ်းသပ်မှုသည် လူသားတကယ်ရှိသူတစ်ဦးနှင့်စနစ်တစ်ခုကို စာသားအခြေခံပြောဆိုမှုတွင် ခွဲခြားကျွှံနိုင်မှု မရှိပါက စနစ်ကို ဉာဏ်ရှိဟု သတ်မှတ်သည်။ + +> [Eugene Goostman](https://en.wikipedia.org/wiki/Eugene_Goostman) ဟုခေါ်သော စကားပြောစက်တစ်ခုကို ရုရှား St.Petersburg တွင် ဖန်တီးခဲ့ပြီး ၂၀၁၄ ခုနှစ်တွင် Turing စမ်းသပ်မှုပုံစံမှတစ်ဝက်လောက်ခံနိုင်ခဲ့သည်။ ထိုစက်သည် သူကျားမ ၁၃ နှစ်အရွယ် အူကရိန်းကလေးဟု ကြေညာခြင်းအားဖြင့် အချက်အလက်မရှိမှုနှင့် စာသားတွင် မတူညီမှုအချို့ ဖော်ပြနိုင်သည်။ ဤစက်သည် စစ်မှတ်သူများ၏ ၃၀% ကို လူဖြစ်ကြောင်း ယုံကြည်စေပြီး Turing သည် ၂၀၀၀ ခုနှစ်တွင် စက်ပစ္စည်းများသည် ဒီဆင်ခြင်မှုကို ဖြတ်ကျော်နိုင်မည်ဟု ယုံကြည်သည်။ သို့သော် ဤသည်သည် အဖြေမှန်သော ဉာဏ်ရှိစနစ်ဖန်တီးမှုကို ပြသခြင်း မဟုတ်၊ စက်ပစ္စည်းသည် စစ်မှတ်သူကို လိမ်တတ်ခြင်း မဟုတ်၊ စက်ဖန်တီးသူများသာ လိမ်မြှောက်နိုင်ခြင်း ဖြစ်သည်ကို နားလည်သင့်သည်။ + +✅ စကားပြောစက်တစ်ခုကြောင့် သင်သည် လူတစ်ဦးနှင့် စကားပြောနေသည်ဟု ယူဆဖူးပါသလား? ၎င်းသည် ဘယ်လို ယုံကြည်စေခဲ့ပါသလဲ? + +## AI သို့ ယူဆချက် အမျိုးမျိုး + +ကွန်ပျူတာသည် လူတစ်ဦးကဲ့သို့ အပြုအမူပြုရန်လိုလျှင်၊ လူတို့၏ စဉ်းစားပုံကို ကွန်ပျူတာအတွင်း မော်ဒယ်တည်ဆောက်ရမည် ဖြစ်သည်။ အတိုင်းအတာအရ လူ့ဥာဏ်ရည်ကို ဘယ်အရာတွေကြောင့် ရှိနေတာလဲ ဆိုတာ နားလည်ရန် လိုအပ်သည်။ + +> ဉာဏ်ရည်ကို စက်ပစ္စည်းတစ်ခုထဲ ထည့်လိုပါက၊ ကျွန်ုပ်တို့၏ ဆုံးဖြတ်ချက် ပြုလုပ်သည့် ဦးနှောက်စနစ် ဘယ်လို လုပ်ဆောင်သည်ကို နားလည်ရမည်။ မိမိကိုယ်ကို ပြန်လည် သုံးသပ်ကြည့်ပါက၊ သတိမထားဘဲဖြစ်ပွားသည့် လုပ်ငန်းစဉ်များ ရှိကြောင်း သိရှိမည်၊ ဥပမာ ကြောင်နှင့်ခွေးကို မစဉ်းစားပဲ ခွဲခြားနိုင်ခြင်း၊ ဒါမှမဟုတ် အခြား အာရုံဆိုင်ရာ စဉ်းစားမှုများပါဝင်ခြင်း။ + +ဤပြဿနာကို ခေါ်ကြည့်ပုံ နှစ်မျိုး ရှိသည်။ + +အပေါ် မှ အောက်သို့ ပုံစံ (အသိအမှတ်ပြု စဉ်းစားမှု) | အောက်မှ အပေါ်သို့ ပုံစံ (နယူးရွယ် နက်ဝတ်) +---------------------------------------|------------------------------------- +အပေါ်မှ အောက်သို့ နည်းလမ်းသည် လူတစ်ဦး၏ စဥ်းစားနည်းကို မော်ဒယ်တည်ဆောက်သော နည်းဖြစ်သည်။ လူဆရာ၏ **အသိပညာ** ကို ကောက်ယူ၍ ကွန်ပျူတာဖတ်နိုင်သောပုံစံသို့ ပြောင်းလဲပုံကိန်းသည်လိုအပ်သည်။ ထို့နောက် **စဉ်းစားမှု** ကို ကွန်ပျူတာတွင် မော်ဒယ်တည်ဆောက်ရန် လိုအပ်သည်။ | အောက်မှ အပေါ်သို့ နည်းလမ်းသည် လူ့ဦးနှောက်တွင်ပါသော လေးစားထိုက်သော ယူနစ် (neuron) များစုပေါင်းစက်မှုကို မော်ဒယ်တည်ဆောက်ခြင်းဖြစ်သည်။ ယင်း neuron တစ်ခုသည် input များကို အလေးချိန်ပေါင်းဖြင့် ပျမ်းမျှလိုက်စားသည့် အပိုင်းဖြစ်သည်။ အများအပြား neuron များစီစဉ်ထားသော နက်ဝတ်ကို သင်ကြားပေးပြီး အသုံးဝင်သော ပြဿနာများကို ဖြေရှင်းရန်သင်ကြားနိုင်သည်။ + +ဉာဏ်ရည်ဆိုင်ရာ အခြားနည်းလမ်းများလည်း ရှိသည်။ + +* **ပေါ်ပေါက်မှု ရှိသော**, **ပေါင်းစည်းမှု ရှိသော** သို့မဟုတ် **အများ Agent (multi-agent) နည်းလမ်း** များမှာ၊ ရိုးရှင်းသော Agent အများအပြား လုပ်ဆောင်မှု လှုပ်ရှားမှုမှ စုပေါင်းသိပ္ပံပညာရှာဖွေမှုဖြစ်သည်။ [ဉာဏ်ရည်ဗေဒ](https://en.wikipedia.org/wiki/Global_brain#Evolutionary_cybernetics) အရ၊ ဉာဏ်ရည်မှာ ရိုးရှင်းပြီး တုံ့ပြန်မှုရှိသော အပြုအမူမှ metasystem ပြောင်းရွှေ့မှု လုပ်ငန်းစဉ်အတွင်း *ပေါ်ပေါက်* တတ်သည်။ + +* **ဖွံ့ဖြိုးတိုးတက်မှု နည်းလမ်း** သို့မဟုတ် **ဂျီနက်တစ်အယ်လဂေါရီသမ်** သည် ဖွံ့ဖြိုးတိုးတက်မှု အခြေခံ အကောင်းဆုံးဖြေရှင်းနည်းတစ်ခုဖြစ်သည်။ + +မနည်းနည်းပိုပြီး နည်းလမ်းများကို သင်ယူလာမည်၌ အခြေခံထားရမည်မှာ အပေါ်မှ အောက်သို့ နှင့် အောက်မှ အပေါ်သို့ နည်းလမ်းနှစ်မျိုးဖြစ်သည်။ + +### အပေါ်မှ အောက်သို့ နည်းလမ်း + +အပေါ်မှ အောက်သို့ နည်းလမ်းတွင် ကျွန်ုပ်တို့၏စဉ်းစားမှုကို မော်ဒယ်တည်ဆောက်ရန် ကြိုးစားသည်။ ကျွန်ုပ်တို့သည် စဉ်းစားသောအခါ မိမိထင်ထားသည့်အတိုင်း နားလည်သည်ကို တွေ့နိုင်သည်၊ ထို့ကြောင့် ၎င်းလုပ်ငန်းစဉ်ကို ပုံမှန်အဆင့်ဖြင့် အစီအစဉ်ရေးနိုင်သည်။ ဤကို **အသိအမှတ်ပြု စဉ်းစားမှု** ဟုခေါ်သည်။ + +လူများသည် ဆုံးဖြတ်ချက်လုပ်ရာတွင် လမ်းညွှန်သော စည်းကမ်းများရှိသည်။ ဥပမာ၊ ဆရာဝန်တစ်ဦးသည် လူနာကို ရောဂါသတ်မှတ်ရာတွင် ဖျားနွေးမှု ရှိသည်ကို တွေ့ရှိကာ။ တစ်ခုခု ပြင်းထန်သော ရောင်ရမ်းမှုရှိကြောင်း ခန့်မှန်းနိုင်သည်။ စည်းကမ်းစနစ်များစွာကို သတ်မှတ်ထားသောကြောင့် ဆရာဝန်များသည် နောက်ဆုံးဆုံးဖြတ်ချက်ရေးနိုင်မည် ဖြစ်သည်။ + +ဤနည်းလမ်းသည် **အသိပညာကို ကိုယ်စားပြုခြင်း** နှင့် **စဉ်းစားမှု** တွင် အလေးပေးသည်။ လူနားလည်သူ အပေါင်းချုပ်ထံမှ အသိပညာကို ထုတ်ယူခြင်းမှာ အခက်အခဲဆုံးဖြစ်နိုင်သည်၊ ဆရာဝန်တစ်ဦးသည် အချို့အိမ်စာ ရောဂါသတ်မှတ်မှု ကို မတိတိကျကျ သိမှတ်ရောက်မှု မရှိသည့် အခြေအနေများ ရှိသောကြောင့် ဖြစ်သည်။ တချို့အလုပ်များသည် ဥပမာ အသက်သတ်မှတ်မှုကဲ့သို့ ဉာဏ်ပညာကို စီမံခန့်ခွဲခြင်းမှ လုံးဝ မဖြစ်နိုင်ပါ။ + +### အောက်မှ အပေါ်သို့ နည်းလမ်း + +မတူညီစွာ၊ ဦးနှောက်အတွင်းရှိ အလယ်အလတ်ဆုံး အစိတ်အပိုင်း neuron ကို မော်ဒယ်တည်ဆောက်နိုင်သည်။ ကွန်ပျူတာအတွင်း **အတုနယူးရွယ် နက်ဝတ်** တည်ဆောက်ပြီး ဥပမာများ ပေးကာ ပြဿနာများဖြေရှင်းရန် သင်ကြားနိုင်သည်။ ၎င်းလုပ်ငန်းစဉ်သည် ကလေးမွေးဖွားအသစ်တစ်ဦး၏ သဘာဝပတ်ဝန်းကျင်အကြောင်းသင်ယူမှုနှင့် ဆင်တူသည်။ + +✅ ကလေးများ သင်ယူနေကျမှုအကြောင်း သုတေသန တစ်ခု ပြုလုပ်ပါ။ ကလေးများ၏ ဦးနှောက် အခြေခံအပိုင်းအစများ ဘာများလဲ? + +> | ML အကြောင်း? | | +> |--------------|-----------| +> | အတုနယူးရွယ် နက်ဝတ်တွင် အခြေခံပြီး သတင်းအချက်အလက်အရ ပြဿနာ ဖြေရှင်းရန် ကွန်ပျူတာမှ သင်ယူခြင်း ဖြစ်သော AI ၏ အပိုင်းကို **စက်လေ့လာမှု (Machine Learning)** ဟုခေါ်သည်။ ဒီသင်တန်းတွင် ရိုးရိုးစက်လေ့လာမှုအား မဖော်ပြသဖြစ်ဘဲ၊ သေးငယ်သော သင်ကြားမှု **[Machine Learning for Beginners](http://aka.ms/ml-beginners)** ကို ဆက်လက်ကြိုးပမ်းကြည့်ပါ။ | ![မူလ ML သင်ကြားမှု](../../../../translated_images/my/ml-for-beginners.9e4fed176fd5817d.webp) | + +## AI ၏ အနှစ်ချုပ် သမိုင်းကြောင်း + +ကွန်ပျူတာ ဉာဏ်ရည် (AI) သည် ၂၀၄၀ ပြည့်နှစ်အတွင်း စတင်ခဲ့သည်။ ပထမကာလတွင် အသိအမှတ်ပြု စဉ်းစားမှု ပုံစံ ရေပန်းစားပြီး၊ နောက်ဆက်တွဲ ထူးချွန်မှုများဖြစ်ခဲ့သည်၊ ဥပမာ အတတ်ပညာရှင်စနစ်များ – ကန့်သတ်ထားသော ပြဿနာကဏ္ဍများတွင် ထူးချွန်အဆင့် ရရှိသော ကွန်ပျူတာအစီအစဉ်များ ဖြစ်သည်။ သို့သော် ဤနည်းလမ်းသည် ထပ်မံချဲ့ထွင်ရန် မမှန်ကန်ကြောင်း သိသာလာသည်။ အသိပညာ ကောက်ယူခြင်းနှင့် မှန်ကန်မှုကိုထိန်းသိမ်းထားခြင်းသည် အလွန်ခက်ခဲသောကိစ္စ ဖြစ်ပြီး အကျုံးဝင်မှု များပြားသည့် ဧ။်ရာများတွင် ကိုင်တွယ်ရန် စရိတ်မြင့်သည်။ ၎င်းကြောင့် ၁၉၇၀ ခုနှစ်များတွင် [AI Winter](https://en.wikipedia.org/wiki/AI_winter) ဖြစ်စေခဲ့သည်။ + +AI အနှစ်ချုပ် သမိုင်း + +> ပုံကို [Dmitry Soshnikov](http://soshnikov.com) မှ ပေးပို့သည် + +အချိန်ကျလာသည်နှင့်အမျှ များစွာကွန်ပျူတာ စွမ်းအားများ ပိုမိုချိုသာလာ၍၊ ဒေတာများ ပိုမိုရရှိလာပြီးနောက် နယူးရွယ် နက်ဝတ် နည်းလမ်းများသည် ကွန်ပျူတာမြင်ကွင်း၊ အသံနားထောင်မှုစသည်တို့အဘို်တွေ့ရှိမှု ပိုမိုကောင်းမွန်လာခဲ့သည်။ နောက်ဆုံး ၁၁ နှစ်အတွင်း၊ Artificial Intelligence ဟု ခေါ်ဆိုသည်မှာ နယူးရွယ် နက်ဝတ်နည်းပညာ၏ အချည်းနှီးအမည် ဖြစ်လာပြီး AI အောင်မြင်မှုများအစိတ်အပိုင်း အများစုသည် ၎င်းတွင် အခြေခံသည်။ + +နေရာတစ်ခု၏ စတင်အခြေအနေတွင် စာရင်းထားမှုတစ်ခုစားကြည့်ပါ: + +* စတင်အဆင့် ကစားသမားကွန်ပျူတာများသည် ရှာဖွေရေးမှီတင်ိ၍ ဖန်တီးခဲ့ကြသည် – အချိန်ရောက်ပါက လိုက်နာမည့် ရှေ့လှည့်မိခ်လမ်းကြောင်းများ ကြောင်းကိုခန့်မှန်းပြီး အကောင်းဆုံးလှည့်မှန်ကို ရွေးချယ်သည်။ ဤသည်သည် [alpha-beta pruning](https://en.wikipedia.org/wiki/Alpha%E2%80%93beta_pruning) ရှာဖွေရေးနည်းအား ဖြန့်ချိခဲ့သည်။ +* ရှာဖွေရေးနည်းလမ်းများသည် ဂိမ်းနှောင်းပိုင်းတွင် ကောင်းမွန်သည်၊ ရှာဖွေရေးအကွာအဝေး သေးငယ်သောကြောင့်ဖြစ်သည်။ သို့သော် ဂိမ်းအစအစတွင် ရှာဖွေရေးအကွာအဝေး ကြီးမားပြီး သင်ခန်းစာများမှ သင်ယူမှုများဖြင့် အဆင်ပြေကြမ္မာပြုပြင်နိုင်သည်။ နောက်တော်ပြန် ဆန်းစစ်မှုများတွင် [case-based reasoning](https://en.wikipedia.org/wiki/Case-based_reasoning) ကို အသုံးပြုရာ၌ လက်ရှိ ဂိမ်းနေရာနှင့် အလွန်ဆင်တူသော နမူနာအခြေအနေများကို အသိပညာစနစ်မှ ရှာဖွေလိုက်သည်။ +* လူများထက်အောင်မြင်သော ခေတ်မှီအစီအစဉ်များမှာ နယူးရွယ် နက်ဝတ်များ နှင့် [reinforcement learning](https://en.wikipedia.org/wiki/Reinforcement_learning) အား အခြေခံပြီး၊ ကိုယ့်ကိုယ်ပေါ် ဆော့ကစားခြင်းဖြင့် သင်ယူသည်၊ လူများက ခြုံဆော့ကစားရန် သင်ယူချိန်ကဲ့သို့ဖြစ်သည်။ သို့သော် ကွန်ပျူတာသည် လူများထက် လုပ်ဆောင်နိုင်သောကစားနည်း အရေအတွက်များပြီး ပြီးမြောက်ချိန် နည်းသောကြောင့် ပိုမိုမြန်ဆန်စွာ သင်ယူနိုင်သည်။ + +✅ AI နှင့်ကစားသည့် အခြားဂိမ်းများကို ရှာဖွေ့လေ့လာပါ။ + +တူညီစွာ "စကားပြောနိုင်သောအစီအစဉ်များ" ဖန်တီးမှု (Turing စမ်းသပ်မှု ဖြတ်သန်းနိုင်သော) အား ဘယ်လိုပြောင်းလဲခဲ့သည် ဟု ကြည့်ပါ။ + +* ဒါ့အရစကာ တို့ကဲ့သို့ ဇာတ်ကောင်မူရင်း စနစ်များမှာ အလွန်ရိုးရှင်းသော သဒ္ဒါနည်နည်းများနှင့် ဝင်ရောက်သော သဒ္ဒါများကို မေးခွန်းအဖြစ် ပြောင်းလဲခြင်းဖြစ်သည်။ +* Cortana၊ Siri၊ Google Assistant ကဲ့သို့ ခေတ်မှီကူညီစနစ်များသည် စကားများကို စာသားသို့ နှင့် ရည်ရွယ်ချက် သိရှိရန် နယူးရွယ်နက်ဝတ်များအသုံးပြုပြီး ချက်အချင်းကော်ပွဲသင့် စနစ်ကို အသုံးပြုသည်။ +* အနာဂတ်၌ စကားပြောမှုကို ကိုယ်တိုင်ထိန်းချုပ်ပေးနိုင်သော စွမ်းရည်ကြီးမားသော နယူးရွယ်စနစ်အပြည့်အစုံ ရှိနိုင်သည်ဟု ခန့်မှန်းပါသည်။ မကြာသေးမီက GPT နှင့် [Turing-NLG](https://www.microsoft.com/research/blog/turing-nlg-a-17-billion-parameter-language-model-by-microsoft) နည်းလမ်းများမှာ ဆန်းသစ်မှုကြီးများ ပြသထားသည်။ + +Turing စမ်းသပ်မှု၏ ဖွံ့ဖြိုးတိုးတက်မှု -> [Eugene Goostman](https://en.wikipedia.org/wiki/Eugene_Goostman) ဆိုတဲ့ chat-bot တစ်ခုဟာ ၂၀၁၄ ခုနှစ်မှာ Turing Test ကို အနီးကပ်ဖြေရှင်းနိုင်ခဲ့ပါတယ်။ အဲ့ဒီ bot ဟာ သူ့ကိုယ်သူ ၁၃ နှစ်အရွယ် ယူကရိန်းကလေးလို့ ပြောကြားပြီး၊ ဗဟုသုတနည်းနည်းနဲ့ စာသားထဲမှာ မတူညီမှုတွေရှိတာကို ရှင်းပြခဲ့ပါတယ်။ Bot ဟာ ၅ မိနစ်စာဆွေးနွေးမှုအတွင်းမှာ စီရင်သူတွေရဲ့ ၃၀% ကို လူသားဖြစ်တယ်လို့ ယုံကြည်စေခဲ့ပါတယ်။ ဒါပေမယ့် ဒီဟာက ဉာဏ်ရည်ရှိတဲ့စနစ်တစ်ခုကို ဖန်တီးနိုင်ပြီလို့ သက်သေပြတာမဟုတ်ပါဘူး၊ ဒါမှမဟုတ် ကွန်ပျူတာစနစ်က လူသားစစ်ဆေးသူကို လှည့်စားနိုင်တာလည်း မဟုတ်ပါဘူး - Bot ရဲ့ ဖန်တီးသူတွေက လူသားတွေကို လှည့်စားခဲ့တာပါ။ -✅ Chat bot တစ်ခုက လူသားနဲ့ စကားပြောနေတာလို့ သင်ကိုယ်တိုင် ယုံကြည်ခဲ့ဖူးလား? ဘယ်လိုလှည့်စားနိုင်ခဲ့လဲ? -> ဓာတ်ပုံကို Dmitry Soshnikov မှ ရေးဆွဲထားပြီး [ဓာတ်ပုံ](https://unsplash.com/photos/r8LmVbUKgns) ကို [Marina Abrosimova](https://unsplash.com/@abrosimova_marina_foto) မှ ရိုက်ကူးထားသည်၊ Unsplash +> Dmitry Soshnikov မှ ရိုက်ကူးထားသော ပုံ၊ [ဓာတ်ပုံ](https://unsplash.com/photos/r8LmVbUKgns) ကို [Marina Abrosimova](https://unsplash.com/@abrosimova_marina_foto) မှ Unsplash တွင် ပေးသော -## AI သုတေသန၏ နောက်ဆုံးရလေ့လာမှုများ +## နောက်ဆုံး AI သုတေအာရုံစူးစိုက်မှု -နယူးရယ်နက်ဝက်များ (Neural Networks) သုတေသန၏ အလွန်ကြီးမားသော တိုးတက်မှုသည် ၂၀၁၀ ခုနှစ်လောက်တွင် စတင်ခဲ့ပြီး အများပြည်သူအသုံးပြုနိုင်သော ဒေတာများ စတင်ရရှိလာခဲ့သည်။ [ImageNet](https://en.wikipedia.org/wiki/ImageNet) ဟုခေါ်သော ၁၄ သန်းကျော်သော အမှတ်အသားပြုထားသော ပုံများစုစည်းမှုကြီးသည် [ImageNet Large Scale Visual Recognition Challenge](https://image-net.org/challenges/LSVRC/) ကို မွေးဖွားပေးခဲ့သည်။ +နယူးရယ်ကွန်ယက် သုတေသနလုပ်ငန်း၏ ကြီးမားသော တိုးတက်မှုသည် ၂၀၁၀ ခုနှစ်အနီးစပ်တွင် စတင်ခဲ့ပြီး၊ အများပြည်သူအသုံးပြုနိုင်သော ဒေတာစုစည်းမှုကြီးများ ပေါ်လာသည်။ [ImageNet](https://en.wikipedia.org/wiki/ImageNet) ဟု အမည်ပေးထားသော ပုံများစုစည်းမှုတစ်ခုသည် အနီးစပ်စွာ ၁၄ သန်းခန့်သော မှတ်သားထားသော ပုံများပါဝင်ကာ [ImageNet Large Scale Visual Recognition Challenge](https://image-net.org/challenges/LSVRC/) ကို မွေးဖွားစေခဲ့သည်။ ![ILSVRC Accuracy](../../../../lessons/1-Intro/images/ilsvrc.gif) -> ဓာတ်ပုံကို [Dmitry Soshnikov](http://soshnikov.com) မှ ရေးဆွဲထားသည် +> [Dmitry Soshnikov](http://soshnikov.com) မှ ရိုက်ကူးသည် -၂၀၁၂ ခုနှစ်တွင် [Convolutional Neural Networks](../4-ComputerVision/07-ConvNets/README.md) ကို ပုံများအမျိုးအစားခွဲခြင်းတွင် ပထမဆုံးအသုံးပြုခဲ့ပြီး အမှားများကို အလွန်လျော့ချနိုင်ခဲ့သည် (၃၀% ခန့်မှ ၁၆.၄% အထိ လျော့ချနိုင်ခဲ့သည်)။ ၂၀၁၅ ခုနှစ်တွင် Microsoft Research မှ ResNet architecture သည် [လူ့အဆင့်တန်းမှန်ကန်မှု](https://doi.org/10.1109/ICCV.2015.123) ကို ရရှိခဲ့သည်။ +၂၀၁၂ ခုနှစ်တွင်၊ [Convolutional Neural Networks](../4-ComputerVision/07-ConvNets/README.md) ကို ပထမဆုံး ပုံခွဲခြားရေးတွင် အသုံးပြုခဲ့ပြီး၊ အမှားအယွင်းများကို အလွန်ထူးခြားစွာ လျော့နည်းစေခဲ့သည် (၂၉% ခန့်မှ ၁၆.၄% သို့ လျှော့ချ)။ ၂၀၁၅ တွင် Microsoft Research ၏ ResNet ဖွဲ့စည်းပုံသည် လူ့အဆင့် တိကျမှန်ကန်မှုကို [မှီဝဲခဲ့သည်](https://doi.org/10.1109/ICCV.2015.123)။ -ထိုအချိန်မှစ၍ နယူးရယ်နက်ဝက်များသည် အလုပ်များစွာတွင် အလွန်အောင်မြင်သော အပြုအမူများကို ပြသခဲ့သည်- +ထိုကတည်းက နယူးရယ်ကွန်ယက်များသည် အလုပ်များစွာတွင် အောင်မြင်မှု အလွန်ကြီးမားစွာ ပြသခဲ့သည်။ --- -နှစ် | လူ့အဆင့်တန်းမှန်ကန်မှုရရှိမှု +နှစ် | လူမှုရည်မှန်းချက်ရရှိသော -----|-------- -၂၀၁၅ | [ပုံအမျိုးအစားခွဲခြင်း](https://doi.org/10.1109/ICCV.2015.123) -၂၀၁၆ | [စကားပြောအသံမှတ်တမ်းဖော်ခြင်း](https://arxiv.org/abs/1610.05256) -၂၀၁၈ | [အလိုအလျောက်ဘာသာပြန်ခြင်း](https://arxiv.org/abs/1803.05567) (တရုတ်-အင်္ဂလိပ်) -၂၀၂၀ | [ပုံအကြောင်းဖော်ပြခြင်း](https://arxiv.org/abs/2009.13682) +၂၀၁၅ | [ပုံခွဲခြားရေး](https://doi.org/10.1109/ICCV.2015.123) +၂၀၁၆ | [စကားပြောများ ဖတ်တတ်ခြင်း](https://arxiv.org/abs/1610.05256) +၂၀၁၈ | [အလိုအလျောက် စက်ဘာသာပြန်ခြင်း](https://arxiv.org/abs/1803.05567) (တရုတ်မှ အင်္ဂလိပ်) +၂၀၂၀ | [ပုံဖော်ပြချက်ရေးခြင်း](https://arxiv.org/abs/2009.13682) -နောက်ဆုံးနှစ်များအတွင်း BERT နှင့် GPT-3 ကဲ့သို့သော စကားလုံးကြီးမားသော မော်ဒယ်များတွင် အလွန်အောင်မြင်မှုများကို တွေ့မြင်ခဲ့ရသည်။ ၎င်းသည် အများပြည်သူအသုံးပြုနိုင်သော စာသားဒေတာများစွာ ရရှိနိုင်မှုကြောင့် ဖြစ်လာခဲ့သည်။ ၎င်းတို့ကို စာသားများ၏ ဖွဲ့စည်းမှုနှင့် အဓိပ္ပာယ်ကို ဖမ်းဆီးနိုင်ရန် မော်ဒယ်များကို လေ့ကျင့်ပေးပြီး စာသားစုစည်းမှုများတွင် ပုံမှန်လေ့ကျင့်ပေးပြီး ထိုမော်ဒယ်များကို အထူးလုပ်ငန်းများအတွက် အထူးပြုစေသည်။ [Natural Language Processing](../5-NLP/README.md) အကြောင်းကို ဒီသင်ခန်းစာတွင် နောက်ပိုင်းတွင် ပိုမိုလေ့လာပါမည်။ +ယခုနှစ်ပိုင်းအတွင်း BERT နှင့် GPT-3 ကဲ့သို့သော အကြီးစား ဘာသာစကားမော်ဒယ်များအတွက် ကြီးမားသော အောင်မြင်မှုများကို မြင်တွေ့ခဲ့သည်။ ၎င်းသည် အများပြည်သူ အသုံးပြုနိုင်သော စာသားဒေတာ များစွာ ရှိခြင်းကြောင့်ဖြစ်ပြီး၊ မော်ဒယ်များကို စာသားအမှုများ၏ ဖွဲ့စည်းပုံနှင့် အဓိပ္ပါယ်များကို ဖမ်းယူနိုင်ရန် သင်ကြားတတ်ကြပြီး၊ စာသားစုစည်းမှုများတွင် ကြိုတင်သင်ကြားပြီးနောက်၊ ပိုပြီး အသေးစိတ် တာဝန်များအတွက် မော်ဒယ်များကို အထူးပြု သုံးနိုင်ကြသည်။ ဒီသင်တန်းတွင် နောက်ပိုင်းတွင် [ဘာသာစကားလုပ်ထုံးလုပ်နည်းဆိုင်ရာ](../5-NLP/README.md) မျက်နှာသာများကို နည်းမည့်အကြောင်းကို မည်မည်သာ သင်ယူသွားမည်ဖြစ်သည်။ -## 🚀 စိန်ခေါ်မှု +## 🚀 ပြိုင်ပွဲ -အင်တာနက်ပတ်လည်လေ့လာပြီး AI ကို သင့်အမြင်အရ အကျိုးရှိဆုံးအသုံးပြုနေသောနေရာကို သတ်မှတ်ပါ။ ၎င်းသည် မြေပုံဆွဲခြင်း app တစ်ခုမှာလား၊ စကားပြောမှ စာသားပြောင်းခြင်းဝန်ဆောင်မှုတစ်ခုမှာလား၊ သို့မဟုတ် ဗီဒီယိုဂိမ်းတစ်ခုမှာလား။ စနစ်ကို ဘယ်လိုတည်ဆောက်ခဲ့သည်ကို လေ့လာပါ။ +သင့်အမြင်အရ AI ကို အကျိုးရှိဆုံး အသုံးပြုထားသည့်နေရာကို အင်တာနက်တွင် လေ့လာလုပ်ဆောင်ပါ။ အဲသည် Mapping app တစ်ခုတွင် ဖြစ်ပါသလား၊ စကားပြောမှ စာသားသို့ ဝန်ဆောင်မှုတစ်ခုတွင် တွေ့ရပါသလား၊ သို့မဟုတ် ဗီဒီယိုဂိမ်းတစ်ခုတွင်လား? စနစ်ကို မည်သို့ ဖွဲ့စည်းဆောက်လုပ်ထားသည်ကို သုတေသနပါ။ -## [Post-lecture quiz](https://ff-quizzes.netlify.app/en/ai/quiz/2) +## [သင်ခန်းစာပြီးစီးပြီး စစ်တမ်း](https://ff-quizzes.netlify.app/en/ai/quiz/2) ## ပြန်လည်သုံးသပ်ခြင်းနှင့် ကိုယ်တိုင်လေ့လာခြင်း -AI နှင့် ML ၏ သမိုင်းကြောင်းကို [ဒီသင်ခန်းစာ](https://github.com/microsoft/ML-For-Beginners/tree/main/1-Introduction/2-history-of-ML) မှတဆင့် ပြန်လည်သုံးသပ်ပါ။ အထက်ပါသင်ခန်းစာ၏ sketchnote မှတစ်ခု သို့မဟုတ် ဒီသင်ခန်းစာမှတစ်ခုကို ရွေးပြီး ၎င်း၏ တိုးတက်မှုကို သက်ဆိုင်ရာ ယဉ်ကျေးမှုအခြေအနေများကို နားလည်ရန် ပိုမိုနက်နက်ရှိုင်းရှိုင်းလေ့လာပါ။ +AI နှင့် ML ရဲ့ သမိုင်းကြောင်းကို [ဒီသင်ခန်းစာ](https://github.com/microsoft/ML-For-Beginners/tree/main/1-Introduction/2-history-of-ML) အတွင်း ဖတ်ရှု၍ ပြန်လည်သုံးသပ်ပါ။ ထိုသင်ခန်းစာ၏ အထက်ရှိ ဆွဲထုတ်မှတ်စုတစ်ခုမှ အချက်တစ်ချက်ကို ရွေးချယ်ပြီး ၎င်း၏ ယဉ်ကျေးမှုရင်းမြစ်များနှင့် ရေရာမှု အကြောင်းအရာများကို ပိုမိုနက်ရှိုင်းစွာ စုံစမ်းလေ့လာပါ။ -**အလုပ်ပေးစာ**: [Game Jam](assignment.md) +**တာဝန်ကျေမှု**: [ဂိမ်းဂျမ်](assignment.md) --- -**အကြောင်းကြားချက်**: -ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှုအတွက် ကြိုးစားနေသော်လည်း အလိုအလျောက် ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို သတိပြုပါ။ မူရင်းဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတရ အရင်းအမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော အလွဲအမှားများ သို့မဟုတ် အနားလွဲမှုများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ +**ပြောကြားချက်** +ဤစာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးပမ်းနေသော်လည်း၊ စက်ကိရိယာဘာသာပြန်ခြင်းများတွင် အမှားများ သို့မဟုတ် မှားယွင်းချက်များ ပါဝင်နိုင်ကြောင်း သတိပြုပါရန် လိုအပ်ပါသည်။ မူလစာတမ်းကို မူရင်းဘာသာဖြင့်သာ ယုံကြည်စိတ်ချရသော အချက်အလက်အဖြစ် သတ်မှတ်သင့်သည်။ အရေးကြီးသည့် သတင်းအချက်အလက်များအတွက် ပရော်ဖက်ရှင်နယ် လူသားဘာသာပြန်သူဝန်ဆောင်မှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်ချက်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုကွာခြားမှုများ သို့မဟုတ် မမှန်ကန်သော အသုံးပြုမှုများအတွက် ကျွန်ုပ်တို့ တာဝန်မခံပါ။ \ No newline at end of file diff --git a/translations/my/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/my/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index 611a938c10..6622f76175 100644 --- a/translations/my/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/my/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -4,11 +4,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# ကြိုတင်လေ့ကျင့်ထားသော မော်ဒယ်များနှင့် အသုံးပြုနိုင်သော လေ့ကျင့်မှု\n", + "# ကြိုတင်လေ့ကျင့်ထားသော မော်ဒယ်များနှင့် လွှဲပြောင်းသင်ယူမှု\n", "\n", - "CNN များကို လေ့ကျင့်ရန် အချိန်များစွာ လိုအပ်ပြီး၊ အချက်အလက်များစွာလည်း လိုအပ်ပါသည်။ သို့သော်၊ အချိန်အများစုကို ကွန်ယက်တစ်ခုက ပုံများမှ ပုံစံများကို ထုတ်ယူရန် အသုံးပြုသော အနိမ့်အဆင့် ဖီလ်တာများကို သင်ယူရန် အသုံးပြုရသည်။ သဘာဝအတိုင်း မေးခွန်းတစ်ခု ထွက်ပေါ်လာသည် - ကွန်ယက်တစ်ခုကို တစ်ခုသော dataset ပေါ်တွင် လေ့ကျင့်ထားပြီး၊ အခြားပုံများကို အပြည့်အဝ လေ့ကျင့်မှုမလိုအပ်ဘဲ ခွဲခြားနိုင်ရန် ပြောင်းလဲအသုံးပြုနိုင်မလား?\n", + "CNN မော်ဒယ်များကို လေ့ကျင့်ရန် အချိန် များစွာ လိုအပ်ပြီး၊ ထိုလုပ်ငန်းအတွက် ဒေတာ များစွာ လိုအပ်သည်။ သို့သော် အချိန်အများအပြားကို ကွန်ယက်သည် ပုံများမှ ပုံသဏ္ဍာန်များ ထုတ်ယူရန် အကောင်းဆုံး အနိမ့်အဆင့် ဖင်တာများကို သင်ယူရာတွင် ကုန်ကျသည်။ သဘာဝက မေးခွန်းတစ်ခု ထွက်ပေါ်လာသည် - သင်ခန့်ထားပြီးသား ဒေတာဆက်တစ်ခုတွင် လေ့ကျင့်ထားသော နျူးရယ်ကွန်ယက်တစ်ခုကို အသုံးပြုပြီး၊ အပြည့်အစုံလေ့ကျင့်ခြင်း မလိုဘဲ အခြားပုံများကို သတ်မှတ်ရန် ညှိနှိုင်းနိုင်ပါသလား?\n", "\n", - "ဒီနည်းလမ်းကို **လေ့ကျင့်မှု ပြောင်းလဲအသုံးပြုမှု** (transfer learning) ဟု ခေါ်သည်၊ အကြောင်းမှာ တစ်ခုသော နယူးရယ်ကွန်ယက်မော်ဒယ်မှ အခြားမော်ဒယ်သို့ အချို့သော အသိပညာကို ပြောင်းလဲအသုံးပြုခြင်း ဖြစ်သည်။ လေ့ကျင့်မှု ပြောင်းလဲအသုံးပြုမှုတွင်၊ ကျွန်ုပ်တို့သည် ပုံမှန်အားဖြင့် **ImageNet** ကဲ့သို့သော ပုံကြီး dataset တစ်ခုပေါ်တွင် လေ့ကျင့်ထားသော ကြိုတင်မော်ဒယ်တစ်ခုဖြင့် စတင်ပါသည်။ အဲဒီမော်ဒယ်များသည် အများအားဖြင့် ပုံများမှ အမျိုးမျိုးသော အင်္ဂါရပ်များကို ထုတ်ယူနိုင်ပြီး၊ အများသောအားဖြင့် ထိုထုတ်ယူထားသော အင်္ဂါရပ်များပေါ်တွင် classifier တစ်ခုတည်ဆောက်ခြင်းကလည်း ရလဒ်ကောင်းများ ရနိုင်ပါသည်။\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` directory ထဲမှာ ထုတ်ယူပါ (ဒီလုပ်ငန်းစဉ်အချိန်အတော်ကြာနိုင်ပါတယ်!):\n" + "ဒီဒေတာစုစည်းမှုကို ဒေါင်းလုပ်ဆွဲ၍ `data` ဖိုလ်ဒါထဲသို့ ဖော်ထုတ်ကြရအောင် (ဒီလုပ်ဆောင်ချက်မှာ အချိန်အနည်းငယ်ယူနိုင်ပါသည်။)။\n" ] }, { @@ -64,7 +64,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "အကောင်းမဖြစ်ဘဲ၊ ဒေတာစုတွဲထဲမှာ ပျက်စီးနေတဲ့ ပုံဖိုင်တွေ ရှိပါတယ်။ ပျက်စီးနေတဲ့ ဖိုင်တွေကို စစ်ဆေးဖို့ အမြန်လျှင်မြန်လုပ်ဆောင်ဖို့ လိုအပ်ပါတယ်။ ဒီသင်ခန်းစာကို မပျက်စီးစေဖို့အတွက်၊ ဒေတာစုတွဲကို အတည်ပြုဖို့ ကုဒ်ကို module တစ်ခုထဲကို ရွှေ့ထားပါတယ်။\n" + "ဒေတာစနစ်ထဲတွင် ပျက်စီးသွားသော ပုံဖိုင်အချို့ ရှိနေပါသည်။ ပျက်စီးထားသောဖိုင်များကို စစ်ဆေးဖို့ အမြန်သန့်ရှင်းမှု လုပ်ရန် လိုအပ်ပါသည်။ ဒီသင်ခန်းစာကို ပကုန်မဖြစ်စေရန်အတွက်၊ ဒေတာစနစ်စစ်ဆေးရန်ကုဒ်ကို မော်ဂျူးအဖြစ် ရ 옮လိုသည်။\n" ] }, { @@ -333,13 +333,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## ဒေတာစနစ်ကို တင်သွင်းခြင်း\n", + "## ဒေတာစုစည်းမှုကို လုပ်ဆောင်ခြင်း\n", "\n", - "ယခင်ဥပမာများတွင် Keras တွင် built-in အဖြစ်ပါဝင်သော ဒေတာစနစ်များကို တင်သွင်းခဲ့ကြသည်။ ယခုအခါတွင် ကျွန်ုပ်တို့၏ ကိုယ်ပိုင် ဒေတာစနစ်ကို ကိုင်တွယ်ရမည်ဖြစ်ပြီး၊ ၎င်းကို ပုံများပါဝင်သော ဖိုင်တိုက်မှ တင်သွင်းရမည်ဖြစ်သည်။\n", + "ယခင်ဥပမာများတွင် ကျွန်ုပ်တို့သည် Keras တွင် built-in ထားသော ဒေတာစုစည်းမှုများကို လုပ်ဆောင်နေခဲ့ပါသည်။ ယခုတွင် ကျွန်ုပ်တို့သည် ဓာတ်ပုံ ဖိုင်များ အမှုထမ်းဆောင်ရာ ဒါရိုက်တာရီမှ ဒေတာကို လုပ်ဆောင်ရန်ရှိသည်။\n", "\n", - "အမှန်တကယ်တွင် ပုံဒေတာစနစ်များ၏ အရွယ်အစားသည် အတော်လေးကြီးနိုင်ပြီး၊ ဒေတာအားလုံးကို မှတ်ဉာဏ်ထဲသို့ ထည့်နိုင်မည်ဟု မယုံကြည်နိုင်ပါ။ ထို့ကြောင့် ဒေတာစနစ်များကို များသောအားဖြင့် **ဂျင်နရေးတာများ** အဖြစ် ကိုယ်စားပြုကြပြီး၊ ၎င်းတို့သည် လေ့ကျင့်မှုအတွက် သင့်တော်သော minibatch များအဖြစ် ဒေတာကို ပြန်ပေးနိုင်သည်။\n", + "နေ့ရက်တိုင်းတွင် ဓာတ်ပုံ ဒေတာစုစည်းမှုများ၏ အရွယ်အစားသည် အလွန်ကြီးမားနိုင်ပြီး၊ အချက်အလက်အားလုံးကို မemory ထဲထည့်၍ မရနိုင်တာဖြစ်နိုင်သည်။ ထို့ကြောင့် ဒေတာစုစည်းမှုများကို training အတွက် သင့်တော်သော ဒေတာ အစုအဖွဲ့များ (minibatches) ဖြင့် ပြန်တယ်နိုင်သော **generator** များအလားအလာဖြင့်ဖော်ပြသည်။\n", "\n", - "ပုံအမျိုးအစားခွဲခြားမှုကို ကိုင်တွယ်ရန် Keras တွင် `image_dataset_from_directory` ဟုခေါ်သော အထူးလုပ်ဆောင်ချက်တစ်ခု ပါဝင်ပြီး၊ ၎င်းသည် အမျိုးအစားအမျိုးမျိုးကို ကိုယ်စားပြုသော subdirectory များမှ ပုံများကို တင်သွင်းနိုင်သည်။ ဤလုပ်ဆောင်ချက်သည် ပုံများကို အရွယ်အစားချိန်ညှိခြင်းကိုလည်း စီမံဆောင်ရွက်နိုင်ပြီး၊ ဒေတာစနစ်ကို လေ့ကျင့်မှုနှင့် စမ်းသပ်မှုအပိုင်းများအဖြစ် ခွဲခြားနိုင်ပါသည်။\n" + "ပုံသဏ္ဍာန် ခွဲခြားခြင်းအတွက် Keras တွင် `image_dataset_from_directory` ဟူသော ထူးခြားသော function ရှိပြီး၊ သီးခြား class များနှင့် ကိုက်ညီသည့် subdirectory မှ images များကို load ဆွဲသွားနိုင်သည်။ ဤ function သည် ဓာတ်ပုံများကို scale လုပ်ပေးရန်လည်း ရှိပြီး၊ ဒေတာစုစည်းမှုကို train နှင့် test အပိုင်းများအဖြစ်ခွဲထားနိုင်ပါသည်။\n" ] }, { @@ -383,9 +383,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "ပုံများကို သင်ကြားမှုနှင့် စမ်းသပ်မှု ဒေတာစုများအကြား ခွဲခြားမှုကို သက်ရောက်စေသောကြောင့် `seed` အတူတူတန်ဖိုးကို နှစ်ခေါက်လုံးတွင် သတ်မှတ်ထားရန် အရေးကြီးပါသည်။\n", + "နှစ်ခုလုံးခေါ်သောအခါအတွက် `seed` တန်ဖိုးတူညီစွာ သတ်မှတ်ပေးရန် အရေးကြီးသည်၊ ၎င်းသည် ပုံများကို train နှင့် test ဒေတာအစုအတွက် ကွဲပြားခြားနားမှုကို ထိခိုက်စေသည်။\n", "\n", - "Dataset သည် အလိုအလျောက် ဖိုင်တွဲများမှ အတန်းအမည်များကို ရယူပြီး၊ လိုအပ်ပါက အောက်ပါအတိုင်း ခေါ်ယူနိုင်ပါသည် -\n" + "Dataset သည် ဒိုက်ရက်ထရီများမှ အလိုအလျောက် class အမည်များကို ရယူပြီး၊ လိုအပ်ပါက အောက်ပါအတိုင်း ခေါ်နိုင်ပါသည်။\n" ] }, { @@ -412,7 +412,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Datasets များကို `fit` function သို့တိုက်ရိုက်ပို့ပြီး မော်ဒယ်ကိုလေ့ကျင့်နိုင်ပါသည်။ ၎င်းတွင် ပုံများနှင့် label များနှစ်ခုစလုံးပါဝင်ပြီး အောက်ပါဖွဲ့စည်းမှုကို အသုံးပြု၍ loop ပြုလုပ်နိုင်ပါသည်။\n" + "ကျွန်ုပ်တို့ရရှိထားသော ဒေတာစုစည်းမှုများကို မော်ဒယ်ကိုလေ့ကျင့်ရန် `fit` function သို့တိုက်ရိုက်ပေးပို့နိုင်သည်။ ၎င်းတို့တွင် သက်ဆိုင်ရာရုပ်ပုံများနှင့် အမှတ်အသားများပါဝင်ပြီး၊ အောက်ပါဖွဲ့စည်းမှုဖြင့် loop လုပ်နိုင်သည်။\n" ] }, { @@ -453,16 +453,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "> **မှတ်ချက်**: ဒေတာစုပေါင်းအတွင်းရှိ ပုံများအားလုံးကို 0-255 အကွာအဝေးရှိ floatint point tensors အဖြစ် ကိုယ်စားပြုထားသည်။ Neural network သို့ ပေးပို့မည်မီ၌ အဆိုပါတန်ဖိုးများကို 0-1 အကွာအဝေးသို့ အတိုင်းအတာချထားရန် လိုအပ်သည်။ ပုံများကို ရှုထောင့်တွင်ဖော်ပြမည်ဆိုပါကလည်း အတူတူလုပ်ဆောင်ရန် သို့မဟုတ် `int` အမျိုးအစားသို့ ပြောင်းလဲရန် (အထက်ပါကုဒ်တွင် ပြုလုပ်ထားသည်) လိုအပ်ပြီး၊ `matplotlib` ကို မူရင်းအတိုင်းအတာမထားသော ပုံကို ဖော်ပြလိုကြောင်း ပြသရန် လိုအပ်သည်။\n" + "> **မှတ်ချက်**: ဒေတာစုစည်းမှုရှိဓာတ်ပုံများအားလုံးသည် 0-255 အပြောင်းအလဲရှိ floatint point tensors အဖြစ် ကိုယ်စားပြုထားသည်။ ၎င်းတို့အား နယူးရယ်ကွန်ယက်သို့ ပို့မည့်အခါ 0-1 အကွာအဝေးသို့ ကိုအတိုင်းအတာချရန် လိုအပ်သည်။ ဓာတ်ပုံများကို ရုပ်ပုံတင်ချင်ပါကလည်း တူညီစွာလုပ်ရမည့် သို့မဟုတ် မူလမတိုင်းတာထားသော ဓာတ်ပုံကို `matplotlib` သို့ ပြသလိုကြောင်း ပြသရန် `int` အမျိုးအစားသို့ ပြောင်းလဲရပါမည်(အထက်ပါကုဒ်တွင်ပြုလုပ်ထားသည်)။\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,20 +520,17 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "အရေးကြီးသောအချက်အချို့ရှိပါတယ် -\n", - "\n", - "* မည်သည့် pre-trained network ကိုမဆို အသုံးပြုမည့်အခါမှာ အရင်ဆုံး input ကို သတ်မှတ်ထားတဲ့နည်းလမ်းတစ်ရပ်နဲ့ ပြင်ဆင်ပေးရမယ်။ ဒီအလုပ်ကို `preprocess_input` function ကိုခေါ်သုံးပြီး ပြုလုပ်နိုင်ပါတယ်။ ဒီ function က ရုပ်ပုံများကို batch အနေနဲ့ လက်ခံပြီး၊ ပြင်ဆင်ပြီးသားပုံစံကို ပြန်ပေးပါမယ်။ VGG-16 ရဲ့အတွက်ဆိုရင်၊ ရုပ်ပုံတွေကို normalize လုပ်ပြီး၊ channel တစ်ခုချင်းစီအတွက် သတ်မှတ်ထားတဲ့ အလယ်ပျမ်းမျှတန်ဖိုးကို နုတ်ပစ်ပါတယ်။ ဒါဟာ VGG-16 ကို ဒီ pre-processing နဲ့ စတင်လေ့ကျင့်ထားလို့ ဖြစ်ပါတယ်။\n", - "\n", - "* Neural network ကို input batch ပေါ်မှာ အသုံးပြုပြီးနောက်၊ ရလဒ်အနေနဲ့ 1000-element tensors ရဲ့ batch တစ်ခုကို ရရှိပါမယ်။ ဒီ tensors က အတန်းတစ်ခုချင်းစီရဲ့ probability ကို ပြသပါတယ်။ အများဆုံးဖြစ်နိုင်တဲ့ အတန်းနံပါတ်ကို `argmax` function ကို သုံးပြီး ရှာနိုင်ပါတယ်။\n", - "\n", - "* ရရှိလာတဲ့ရလဒ်က [ImageNet အတန်းနံပါတ်](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a) တစ်ခုဖြစ်ပါတယ်။ ဒီရလဒ်ကို ပိုမိုနားလည်နိုင်ဖို့ `decode_predictions` function ကို သုံးနိုင်ပါတယ်။ ဒီ function က အထက်ဆုံး n အတန်းနဲ့ သူတို့ရဲ့ အမည်တွေကို ပြန်ပေးပါမယ်။\n" + "ဒီမှာ အရေးကြီးတဲ့အချက်အချို့ ရှိပါတယ်။\n", + "* မည်သည့် pre-trained နက်ဝပ်စ်ထဲကိုမဆို input တစ်ခု ပေးမည့်အခါ၌ ယင်း input ကို အချို့သောနည်းဖြင့် pre-process လုပ်ရပါမည်။ ၎င်းကို `preprocess_input` function ကို ခေါ်၍ လုပ်ဆောင်သည်၊ ၎င်းသည် ပုံများလက်က်ဇယား (batch) တစ်ခုကို လက်ခံပြီး ၎င်းတို့၏ လုပ်ဆောင်ပြီးသော ပုံစံကို ပြန်လည်ပေးပို့သည်။ VGG-16 ၏အခြေအနေတွင် ပုံများကို ပုံမှန်ပြုလုပ်ပြီး အလိုအလျောက်သတ်မှတ်ထားသော channel တစ်ခုချင်းစီအတွက် တွက်ချက်ထားသော အပျမ်းမျှတန်ဖိုးကို နှုတ်ဆက်ပါသည်။ ၎င်းသည် VGG-16 ကို မူလက ဤ pre-processing ဖြင့် သင်ယူခဲ့ကြောင်းကြောင့်ပါ။\n", + "* နက်ဝပ်စ်ကို input batch တွင်အထိ အကောင်အထည်ဖော်ပြီး ရလဒ်အနေဖြင့် class တစ်ခုစီ၏ဖြစ်နိုင်မည့်မှုကို ပြသသည့် ၁၀၀၀-အချက် အတိုင်းအတာ (tensor) ထုတ်ယူရပါမည်။ ယင်း tensor ပေါ်တွင် `argmax` ကို ခေါ်၍ ဖြစ်နိုင်နိုင်ဆုံး class နံပါတ်ကို ရှာဖွေနိုင်သည်။\n", + "* ရရှိသူ ရလဒ်သည် [ImageNet class နံပါတ်](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a) ဖြစ်သည်။ ယင်းရလဒ်ကို နားလည်ရန်အတွက် top n class များနှင့် ၎င်းတို့၏ အမည်များကို ပြန်ထုတ်ပေးသော `decode_predictions` function ကိုလည်း အသုံးပြုနိုင်ပါသည်။\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 နှင့် အခြားနောက်ဆုံးပေါ် architecture များကဲ့သို့သော deep neural networks များကို run လုပ်ရန်အတွက် အလွန်များသောတွက်ချက်စွမ်းအားလိုအပ်သည်။ GPU acceleration ရရှိနိုင်ပါက အသုံးပြုခြင်းသည် make sense ဖြစ်ပါသည်။ ကံကောင်းစွာ Keras သည် GPU ရှိပါက အလိုအလျောက်တွက်ချက်မှုများကို မြန်ဆန်စေပါသည်။ Tensorflow သည် GPU ကိုအသုံးပြုနိုင်မရှိစစ်ဆေးရန် အောက်ပါ code ကို အသုံးပြုနိုင်ပါသည်။\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 မော်ဒယ်ကို အောက်ပါကုဒ်ဖြင့် instantiate ပြုလုပ်နိုင်ပါသည်- \n" ] }, { @@ -683,9 +691,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Feature tensor ၏ အတိုင်းအတာမှာ 7x7x512 ဖြစ်ပါတယ်၊ ဒါပေမယ့် အဲဒါကို မြင်နိုင်ဖို့အတွက် 2D ပုံစံအဖြစ် ပြောင်းလဲဖို့ လိုအပ်ခဲ့ပါတယ်။\n", + "Feature tensor ၏ အတိုင်းအတာမှာ 7x7x512 ဖြစ်ပါတယ်၊ သို့သော် ဒါကို မြင်သာအောင် ပြသရန်အတွက် 2D ပုံစံသို့ ပြောင်းလဲရန် လိုအပ်ခဲ့ပါတယ်။\n", "\n", - "အခုတော့ အဲဒီ feature တွေကို ပုံရိပ်တွေကို အမျိုးအစားခွဲဖို့ အသုံးပြုလို့ရမလားဆိုတာ ကြိုးစားကြည့်ရအောင်။ ပုံရိပ်တစ်ချို့ကို ကိုယ်တိုင်ရွေးပြီး (ကျွန်တော်တို့အတွက် 50 minibatches) feature vector တွေကို ကြိုတင်တွက်ချက်ကြည့်ရအောင်။ Tensorflow **dataset** API ကို ဒီအတွက် အသုံးပြုနိုင်ပါတယ်။ `map` function က dataset တစ်ခုကို ယူပြီး သတ်မှတ်ထားတဲ့ lambda-function ကို အသုံးပြုကာ ပြောင်းလဲပေးပါတယ်။ ဒီနည်းလမ်းကို အသုံးပြုပြီး VGG ကနေ ရရှိတဲ့ feature တွေကို ပါဝင်ထားတဲ့ dataset အသစ်တွေဖြစ်တဲ့ `ds_features_train` နဲ့ `ds_features_test` ကို တည်ဆောက်ပါတယ်၊ အဲဒါတွေမှာ မူလပုံရိပ်တွေမပါဘဲ feature တွေကိုသာ ပါဝင်စေပါတယ်။\n" + "အခု ထို feature များကို ပုံရိပ်များကို အမျိုးအစားခွဲဖို့ အသုံးပြုနိုင်မလား စမ်းကြည့်ကြရအောင်။ ပုံရိပ်အပိုင်းတစ်ချို့ (ကျွန်တော်တို့က 50 minibatches) ကို ကိုယ်တိုင် ရွေးပြီး၎င်းတို့၏ feature vectors များကို ယခင်မှာတွက်ချက်ထားကြပါစို့။ ဒါကိုလုပ်ဖို့ Tensorflow **dataset** API ကို အသုံးပြုနိုင်ပါတယ်။ `map` function သည် dataset တစ်ခုကို ကျရောက်ပြီး ပေးထားသော lambda-function ဖြင့် ပြောင်းလဲတတ်ပါတယ်။ ဤစနစ်အတွက် အသုံးပြု၍ VGG ဖြင့် ထုတ်ယူထားသော features များပါရှိသည့် နယူး dataset များ `ds_features_train` နှင့် `ds_features_test` ကို တည်ဆောက်ပါမယ်၊ အဲဒါက မူလပုံရိပ်များအစား Feature များကို ပါဝင်စေပါတယ်။\n" ] }, { @@ -715,9 +723,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "ကျွန်တော်တို့ `.take(50)` ကို အသုံးပြုပြီး dataset အရွယ်အစားကို ကန့်သတ်ထားတာက ဒီအတန်းမိတ်ဆက်ကို မြန်ဆန်စေဖို့အတွက်ပါ။ သင် full dataset ပေါ်မှာ ဒီစမ်းသပ်မှုကို လုပ်ဆောင်နိုင်ပါတယ်။\n", + "ကျွန်တော်တို့ဟာ `.take(50)` ဆိုတဲ့ ကွန်စထရပ်ရှင်းကို အသုံးပြုပြီး ဒေတာစုံလင်မှုအရွယ်အစားကို ကန့်သတ်ထားပါတယ်၊ ဒီတော့ အစမ်းအဖြစ် ပိုမြန်စေဖို့ပါ။ သင့်တော်တယ်ဆိုရင် ဘာဆိုဒ်ပြည့်ပြီး ဒေတာပေါ်မှာ ဒီစမ်းသပ်မှုကို ပြုလုပ်နိုင်ပါတယ်။\n", "\n", - "အခု feature တွေကို extract လုပ်ပြီးသား dataset ရှိပြီဆိုတော့ ကျွန်တော်တို့ simple dense classifier တစ်ခုကို သင်ကြားနိုင်ပါပြီ။ ဒီ network က (7,7,512) shape ရှိ feature vector ကို ယူပြီး output တစ်ခုကို ထုတ်ပေးပါမယ်၊ output က ခွေးတစ်ကောင် ဒါမှမဟုတ် ကြောင်တစ်ကောင်ကို ကိုယ်စားပြုပါတယ်။ ဒါက binary classification ဖြစ်တဲ့အတွက် `sigmoid` activation function နဲ့ `binary_crossentropy` loss ကို အသုံးပြုပါတယ်။\n" + "အခု feature တွေ ကောက်ယူပြီး ဒေတာစုံသေြောင်းထောက်ထားပြီဖြစ်လို့၊ ကြောင်နှင့် ခွေးကို ချုပ်ချားခွဲခြားပေးနိုင်မယ့် အရိုးရှင်းဆုံး dense classifier တစ်ခုကို ချိတ်ဆွဲနိုင်ပါပြီ။ ဒီနက်ဝက် network က feature vector အရွယ်အစား (7,7,512) ကို လက်ခံပြီး ခွေးဖြစ်ခြင်း သို့မဟုတ် ကြောင်ဖြစ်ခြင်းကို ကိုယ်စားပြုတဲ့ output တစ်ခု ထုတ်ပေးပါလိမ့်မယ်။ ဒါက binary classification ဖြစ်တဲ့အတွက် `sigmoid` activation function နဲ့ `binary_crossentropy` loss ကို အသုံးပြုပါတယ်။\n" ] }, { @@ -746,13 +754,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "ရလဒ်ကအရမ်းကောင်းပါတယ်၊ ကျွန်တော်တို့က ကြောင်နဲ့ ခွေးကို ၉၅% လောက်အတိအကျ ခွဲခြားနိုင်ပါတယ်! ဒါပေမယ့် ဒီနည်းလမ်းကို ရုပ်ပုံအားလုံးမှာ စမ်းသပ်တာမဟုတ်ဘဲ၊ ရုပ်ပုံတစ်ချို့ကိုသာ စမ်းသပ်ထားတာဖြစ်ပါတယ်၊ အကြောင်းကတော့ လက်ဖြင့် feature extraction လုပ်ရတာ အချိန်အတော်ကြာလို့ပါ။\n", + "ရလဒ်က အံ့သြဖွယ်ကောင်းပြီး၊ ကြောင်နဲ့ခွေးကို ခန့်မှန်းချိန် ၉၅% ခန့်တိကျစွာခွဲခြားနိုင်ပါတယ်! သို့သော်ကျွန်ုပ်တို့ ဒီနည်းလမ်းကို ပုံပြင်အားလုံးထဲမှ တစိတ်တပိုင်းပဲ စမ်းသပ်ထားပါသေးသည်၊ မန်ျူဝယ်ဖြင့် feature များကို ထုတ်ယူသည်မှာ အချိန်များသည့်အတွက်ဖြစ်ပါသည်။\n", "\n", - "## VGG network တစ်ခုကို အသုံးပြုပြီး Transfer Learning\n", + "## VGG တစ်ခု အသုံးပြု၍ Transfer learning ပြုလုပ်ခြင်း\n", "\n", - "လက်ဖြင့် feature တွေကို ကြိုတင်တွက်ချက်ရတာကို ရှောင်ရှားနိုင်ဖို့အတွက် VGG-16 network ကို training အတွင်းမှာ တစ်ခုတည်းအဖြစ် အသုံးပြုနိုင်ပါတယ်၊ feature extractor ကို network ရဲ့ ပထမဆုံးအလွှာအဖြစ် ထည့်သွင်းပေးရုံပါပဲ။\n", + "နည်းလမ်းကို manual feature extraction မလုပ်ဘဲ Training အတွင်းတွင် မူလ VGG-16 network ကိုအပြည့်အစုံအသုံးပြုပြီး feature extractor ကို အဆင့်ပထမအဖြစ် ဝင်ပါသည့် network ထဲထည့်၍ရှေ့ဆက်နိုင်ပါတယ်။\n", "\n", - "Keras architecture ရဲ့ အလှတရားကတော့ ကျွန်တော်တို့ အထက်မှာ သတ်မှတ်ထားတဲ့ VGG-16 model ကို neural network တစ်ခုရဲ့ အလွှာတစ်ခုအဖြစ်ပါ အသုံးပြုနိုင်တာပါ! ကျွန်တော်တို့ လိုအပ်တာကတော့ ဒီ model ရဲ့ အပေါ်မှာ dense classifier နဲ့ network တစ်ခုကို တည်ဆောက်ပြီး၊ ပြီးတော့ network အားလုံးကို back propagation နည်းလမ်းနဲ့ training လုပ်ရုံပါပဲ။\n" + "Keras အင်ဂျင်နီယာနည်းဗျူဟာ၏ အလှတရားမှာ ရှေ့မှဖော်ပြထားသည့် VGG-16 မော်ဒယ်သည် အခြား neural network ၏ layer အဖြစ်လည်း အသုံးပြုနိုင်ခြင်းနှင့် ပတ်သက်ပါသည်! ကျွန်ုပ်တို့ လိုအပ်တာက ရှေ့မှာ dense classifier ပါရှိသည့် network တစ်ခု ဖွဲ့စည်းပြီး အပြီးသတ် network အားလုံးကို back propagation ပုံစံဖြင့် သင်ကြားလိုက်ရုံပဲ ဖြစ်ပါတယ်။\n" ] }, { @@ -796,13 +804,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "ဒီမော်ဒယ်ဟာ အဆုံးမှအဆုံးသို့ အမျိုးအစားခွဲခြားမှုကွန်ယက်လိုပဲ ဖြစ်ပြီး ပုံတစ်ပုံကိုယူပြီး အမျိုးအစားကို ပြန်ပေးပါတယ်။ သို့သော် အခက်အခဲတစ်ခုက VGG16 ကို အင်္ဂါရပ်ထုတ်ယူသူအဖြစ် သုံးချင်တာဖြစ်ပြီး ပြန်လည်လေ့ကျင့်မလုပ်ချင်တာပါ။ ဒါကြောင့် **convolutional feature extractor ရဲ့ အလေးချိန်တွေကို ချုပ်ထားဖို့** လိုအပ်ပါတယ်။ ကွန်ယက်ရဲ့ ပထမဆုံးအလွှာကို `model.layers[0]` ကိုခေါ်ပြီး ဝင်ရောက်နိုင်ပြီး `trainable` property ကို `False` အဖြစ် သတ်မှတ်ရုံပဲ လိုအပ်ပါတယ်။\n", + "ဒီမော်ဒယ်က ဓာတ်ပုံတစ်ပုံကိုယူပြီး အတန်းခွဲမည့် အဆုံးစွန်ခွဲခြားခြင်းကွန်ယက်တစ်ခုလို ပြောင်းလဲပုံဖော်ထားပါတယ်။ သို့သော် ပြဿနာတစ်ခုက VGG16 ကို feature extractor အဖြစ် အသုံးပြုချင်တာဖြစ်ပြီး ထပ်မံလေ့ကျင့်ချင်ခြင်းမရှိပါဘူး။ ထို့ကြောင့် **convolutional feature extractor ၏ အလေးချိန်များကို ဖရိုက် (freeze) လုပ်ရန်** လိုအပ်ပါတယ်။ ကွန်ယက်၏ ပထမဆုံး အလွှာကို `model.layers[0]` ဖြင့် ဆက်သွယ်နိုင်ပြီး `trainable` ပိုင်ဆိုင်မှုကို `False` အဖြစ် သတ်မှတ်ရုံသာ လိုအပ်ပါတယ်။\n", "\n", - "> **Note**: Feature extractor ရဲ့ အလေးချိန်တွေကို ချုပ်ထားဖို့ လိုအပ်တာက မလေ့ကျင့်ထားတဲ့ classifier layer က convolutional extractor ရဲ့ မူရင်းလေ့ကျင့်ထားတဲ့ အလေးချိန်တွေကို ဖျက်ဆီးနိုင်တဲ့အတွက် ဖြစ်ပါတယ်။\n", + "> **သတိပေးချက်**: Feature extractor ၏ အလေးချိန်များကို ဖရိုစ် လုပ်ခြင်းသည် လိုအပ်သည်၊ မဟုတ်လျှင် လေ့ကျင့်မကြောင်းဖြစ်သည့် classifier အလွှာက မူလ ကြိုတင်လေ့ကျင့်ပြီးသား convolutional extractor ၏ အလေးချိန်များကို ပျက်စီးနိုင်ပါတယ်။\n", "\n", - "ကွန်ယက်ရဲ့ parameter အရေအတွက်စုစုပေါင်းဟာ ၁၅ သန်းလောက်ရှိပေမယ့် ကျွန်တော်တို့ လေ့ကျင့်နေတဲ့ parameter တွေက ၂၅,၀၀၀ ပဲရှိတာကို သတိပြုနိုင်ပါတယ်။ အခြေခံ convolutional filter တွေရဲ့ အခြား parameter တွေကတော့ မူရင်းလေ့ကျင့်ထားပြီးသားဖြစ်ပါတယ်။ ဒါက အကောင်းဆုံးဖြစ်ပါတယ်၊ အကြောင်းက parameter အနည်းငယ်ကို နမူနာအနည်းငယ်နဲ့ လေ့ကျင့်ပြီး fine-tune လုပ်နိုင်တာကြောင့်ပါ။\n", + "ကျွန်ုပ်တို့၏ ကွန်ယက်ထဲရှိ စုစုပေါင်း ပရမားတာ(Parameters)ဟာ ၁၅ မီလ်လီယံ နီးပါးရှိပေမယ့် ကျွန်ုပ်တို့ လေ့ကျင့်လိုက်မယ့် ပရမားတာက ၂၅,၀၀၀ ပဲ ဖြစ်ပါတယ်။ အပေါ်ဆုံး convolutional filter များရှိတဲ့ အခြားပရမားတာအားလုံးကို ကြိုတင်လေ့ကျင့်ပြီးသား ဖြစ်ပါတယ်။ ဒါက အကောင်းပါ၊ ရှားပါးတဲ့ နမူနာ နဲ့ ပရမားတာ နည်းငယ်ကိုသာ မိမိ အလိုက်သင့် လေ့ကျင့်နိုင်ပါတယ်။\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": [ - "## Transfer Learning ကို Fine-tuning လုပ်ခြင်း\n", + "## အဆင့်မြှင့်ဖြင့် ထပ်မံသင်ကြားခြင်း\n", "\n", - "အရင်ပိုင်းအခန်းမှာတော့ ကျွန်တော်တို့ရဲ့ dataset ထဲက ပုံတွေကို ခွဲခြားနိုင်ဖို့အတွက် နောက်ဆုံး classifier layer ကို training လုပ်ခဲ့ပါတယ်။ ဒါပေမယ့် feature extractor ကို ပြန်လည် training မလုပ်ခဲ့ပါဘူး၊ ကျွန်တော်တို့ရဲ့ model က ImageNet data မှာ သင်ယူထားတဲ့ features တွေပေါ်မှာ အခြေခံထားပါတယ်။ သင့်ရဲ့ objects တွေဟာ ImageNet ပုံတွေထက် အမြင်အနေနဲ့ ကွဲပြားနေခဲ့ရင်တော့ ဒီ features တွေဟာ အကောင်းဆုံးအလုပ်မလုပ်နိုင်ပါဘူး။ ဒါကြောင့် convolutional layers တွေကိုလည်း training လုပ်ဖို့ စတင်ရင် make sense ဖြစ်ပါတယ်။\n", + "ယခင်ပိုင်းတွင် ကျွန်ုပ်တို့သည် မိမိ dataset ၏ ရုပ်ပုံများကို वर्गीकरण နိုင်ရန် နောက်ဆုံးကလပ်စီဖိုင်ယာ အလွှာကို သင်ကြားခဲ့ပြီးဖြစ်သည်။ သို့သော် feature extractor ကို ပြန်လည်သင်ကြားခြင်း မပြုခဲ့ပါ၊ မော်ဒယ်သည် ImageNet ဒေတာ၌ တင်ထားသော features များကို မူတည်ခဲ့သည်။ သင်၏ ပစ္စည်းများသည် ပုံမှန် ImageNet ရုပ်ပုံများနှင့် ကြည့်ရှုလျှင် ကွဲပြားပါက ဤ features ပေါင်းစပ်မှုသည် အကောင်းဆုံး မဖြစ်နိုင်ပါ။ ထို့ကြောင့် convolutional အလွှာများကိုလည်း သင်ကြားစတင်သင့်သည်ဟု သဘောရသည်။\n", "\n", - "ဒါကိုလုပ်ဖို့အတွက် ကျွန်တော်တို့ရဲ့ အရင်က freeze လုပ်ထားတဲ့ convolutional filter parameters တွေကို unfreeze လုပ်နိုင်ပါတယ်။\n", + "သို့လုပ်ရန်အတွက် ယခင်က ချုပ်ပြီးခဲ့သော convolutional filter ပါရာမီတာများကို ပြန်လည်နွေ့လျှော့နိုင်သည်။\n", "\n", - "> **Note:** Parameters တွေကို အရင်ဆုံး freeze လုပ်ပြီး classification layer ရဲ့ weights တွေကို တည်ငြိမ်အောင်လုပ်ဖို့ အချိန်အနည်းငယ် training လုပ်ဖို့ အရေးကြီးပါတယ်။ Parameters တွေကို unfrozen လုပ်ပြီး အကုန်လုံးကို training လုပ်ဖို့ စတင်လိုက်ရင်တော့ convolutional layers ထဲမှာ pre-trained weights တွေကို error ကြီးတွေ destroy လုပ်နိုင်ပါတယ်။\n", + "> **မှတ်ချက်**၊ classification အလွှာရှိ ဝိတ်များကို တည်ငြိမ်စေရန် ယခင်တွင် ပါရာမီတာချက်များကို ချုပ်၍ သင်ကြားမှုများအတော်များစွာ ပြုလုပ်ရသည်မှာ အရေးကြီးသည်။ ပါရာမီတာ ချုပ်မထားဘဲ ချက်ဆက်ပြီး များစွာ သင်ကြားခြင်းဖြင့် convolutional အလွှာရှိ မိမိ သင်ကြားထားသော ဝိတ်များ ပျက်စီးနိုင်ခြင်းများ ရှိနိုင်သည်။\n", "\n", - "ကျွန်တော်တို့ရဲ့ convolutional VGG-16 model ဟာ ပထမဆုံး layer ထဲမှာရှိပြီး၊ အဲဒီ model ဟာ layer အများကြီးပါဝင်ပါတယ်။ ကျွန်တော်တို့ model ရဲ့ structure ကို ကြည့်နိုင်ပါတယ်။\n" + "ကျွန်ုပ်တို့၏ convolutional VGG-16 မော်ဒယ်သည် ပထမအလွှာအတွင်းရှိပြီး များစွာအလွှာများပါဝင်သည်။ ၎င်း၏ ဖွဲ့စည်းပုံကို ကြည့်နိုင်ပါသည်။\n" ] }, { @@ -947,7 +955,9 @@ { "cell_type": "markdown", "metadata": {}, - "source": [] + "source": [ + "ကျွန်ုပ်တို့သည် convolutional base ၏ ဘာသာအားလုံးကို unfroze လုပ်နိုင်ပါသည်။\n" + ] }, { "cell_type": "code", @@ -962,7 +972,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "သို့သော်၊ အားလုံးကို တစ်ချိန်တည်းမှာ အရေပြားမဖျော်သင့်ပါဘူး။ အရင်ဆုံး convolution အလွှာအနည်းငယ်ကိုသာ အရေပြားဖျော်နိုင်ပါတယ်၊ အကြောင်းကတော့ အဲဒီအလွှာတွေမှာ ကျွန်တော်တို့ရဲ့ ပုံရိပ်တွေအတွက် သက်ဆိုင်တဲ့ အဆင့်မြင့် ပုံစံတွေ ပါဝင်လို့ပါ။ ဥပမာ၊ စတင်ဖို့အတွက် နောက်ဆုံး ၄ ခုကို မပါဘဲ အလွှာအားလုံးကို အရေပြားဖျော်ထားနိုင်ပါတယ်။\n" + "သို့သော်၊ အားလုံးကို တပြိုင်နက် ကျပ်တည်းမှုကင်းလွတ်စေခြင်းသည် အကောင်းဆုံး အကြံမဟုတ်ပါ။ ငါတို့ ပထမဆုံး အနည်းငယ်သော နောက်ဆုံး convolution အလွှာများကိုသာ ကျပ်တည်းမှုကင်းလွတ်စေပါမယ်၊ အကြောင်းမှာ ၎င်းတို့တွင် ကွန်ရက်ပုံရိပ်များနှင့် သက်ဆိုင်သော အဆင့်မြင့် ပုံစံများ ပါဝင်နေပါသည်။ ဥပမာ၊ စတင်ရန်အတွက် နောက်ဆုံး ၄ အလွှာကို ထားပြီး အခြားအားလုံးကို ကျပ်တည်းစေပါ: \n" ] }, { @@ -1001,11 +1011,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "သင်ကြားနိုင်သော parameters အရေအတွက်မှာ အလွန်များပြားလာသော်လည်း၊ အားလုံးသော parameters ရဲ့ ၅၀% ခန့်ပဲရှိနေသေးပါတယ်။\n", + "သင်ကြားနိုင်သော ပါရာမီတာအရေအတွက် ကြီးမားစွာတိုးလာသည်ကို သတိထားကြည့်ပါ၊ သို့သော် ၎င်းမှာ စုစုပေါင်းပါရာမီတာအားလုံး၏ ၅၀% အနီးအနားသာရှိသည်။\n", "\n", - "Unfreezing ပြုလုပ်ပြီးနောက်မှာ၊ သင်တစ်ချို့သော epochs ကို ထပ်မံလေ့ကျင့်နိုင်ပါတယ် (ဤဥပမာတွင်၊ တစ်ခုသာလုပ်မည်ဖြစ်သည်)။ သင်သည် learning rate ကို ပိုနိမ့်သောတန်ဖိုးရွေးချယ်နိုင်ပြီး၊ pre-trained weights အပေါ်သက်ရောက်မှုကို လျှော့ချနိုင်ပါသည်။ သို့သော် learning rate နိမ့်နိမ့်ဖြင့်တောင်၊ လေ့ကျင့်မှုအစပိုင်းတွင် accuracy က ကျဆင်းနိုင်သည်ကို မျှော်လင့်ရမည်ဖြစ်ပြီး၊ fixed weights ရဲ့အခြေအနေထက် အနည်းငယ်ပိုမိုမြင့်မားသောအဆင့်ကို နောက်ဆုံးရောက်ရှိမည်ဖြစ်သည်။\n", + "unfreeze ပြုလုပ်ပြီးနောက်၊ သင်ကြားမှုအပိုင်းများကို ကျွန်ုပ်တို့၏ နမူနာတွင် တစ်ကြိမ်သာလုပ်မည့်အဖြစ် အနည်းငယ်ပိုများစွာလုပ်နိုင်သည်။ ပြီးလျှင် ပထမဆုံး သင်ကြားမှုမှာ pre-trained ကိုယ်လက်များအား အနည်းဆုံး ထိခိုက်မှု ရှိရန်အတွက် အတက်နှုန်းသင်ယူမှုကို လျော့ချနိုင်သည်။ သို့သော် အတက်နှုန်းသင်ယူမှုနိမ့် များပြီးဖြင့်လည်း၊ သင်တန်းအစပိုင်းတွင် တိကျမှန်ကန်မှုကျဆင်းမှုကို မျှော်လင့်နိုင်ပြီး နောက်ဆုံးတွင် fixed weights ဖြစ်စဉ်နှင့်နှိုင်းယှဉ်၍ နည်းနည်းပိုမိုမြင့်မားသည့် အဆင့်ကို ရောက်ရှိမည်ဖြစ်သည်။\n", "\n", - "> **Note:** ဤလေ့ကျင့်မှုသည် အလွန်နှေးကွေးစွာဖြစ်ပေါ်သည်၊ အကြောင်းမှာ gradient များကို network ရဲ့အလွှာများစွာမှ ပြန်လည်ပျံ့နှံ့စေရန်လိုအပ်သောကြောင့်ဖြစ်သည်!\n" + "> **မှတ်ချက်။** ဤသင်ကြားမှုသည် အလွန်နာနှင့်သည့်အတွက် ကျွန်ုပ်တို့ ကြိုးစားကြိုးစားအနက် ယောက်ျားများသည် ဂရေဒီယင့်များကို နက်ရှိုင်းသော အလွှာများမှ ရှေ့သို့ ပြန်လည် သယ်ဆောင်ရသောကြောင့် ဖြစ်သည်။\n" ] }, { @@ -1029,18 +1039,18 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "ကျွန်ုပ်တို့သည် ပိုမိုအစွမ်းထက်သော network ကို အသုံးပြုပြီး parameter များပိုမိုများပြားသောကြောင့် training accuracy ပိုမိုမြင့်မားလာနိုင်ပါသည်။ သို့သော် validation accuracy သည် အလွန်များမတက်နိုင်ပါ။\n", + "ကျွန်ုပ်တို့သည် ပိုမိုစွမ်းအားမြင့်ပြီး ပါရာမီတာများပိုမိုရှိသော နက်ဝက်ခ်ကို အသုံးပြုနေသောကြောင့် ပိုမိုမြင့်မားသော လေ့ကျင့်မှုတိကျမှုကို ရရှိနိုင်ရန် ဆင်ခြင်နိုင်သော်လည်း၊ အတည်ပြုမှုတိကျမှုမှာ အတော်လေးတိုးမလာနိုင်ပါ။\n", "\n", - "Network ၏ layer အချို့ကို ထပ်မံဖွင့်လှစ်ပြီး training ပြုလုပ်ရန် လွတ်လပ်စွာ စမ်းသပ်ကြည့်ပါ၊ accuracy ပိုမိုမြင့်မားစေရန် အောင်မြင်နိုင်မလား စမ်းကြည့်ပါ!\n" + "နက်ဝက်ခ်နှင့် ပိုမိုလွှတ်ချရန်အလွယ်ကူဆုံးအလွှာအနည်းငယ်ကို လွှတ်ချပြီး ပိုမိုလေ့ကျင့်ကြည့်ခြင်းအားဖြင့် ပိုမိုမြင့်မားသော တိကျမှုရရှိနိုင်မလား ရှုမြင်ကြည့်ပါ!\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## အခြားသော ကွန်ပျူတာမြင်ကွင်း မော်ဒယ်များ\n", + "## အခြားကွန်ပျူတာမြင်ကွင်း မော်ဒယ်များ\n", "\n", - "VGG-16 သည် အလွန်ရိုးရှင်းသော ကွန်ပျူတာမြင်ကွင်း အဆောက်အအုံများထဲမှ တစ်ခုဖြစ်သည်။ Keras တွင် ကြိုတင်လေ့ကျင့်ထားသော ကွန်ယက်များ အများအပြား ပါဝင်သည်။ ၎င်းတို့အနက် အများဆုံးအသုံးပြုကြသည်မှာ Microsoft မှ ဖန်တီးထားသော **ResNet** အဆောက်အအုံများနှင့် Google မှ ဖန်တီးထားသော **Inception** ဖြစ်သည်။ ဥပမာအားဖြင့် ရိုးရှင်းဆုံး ResNet-50 မော်ဒယ်၏ အဆောက်အအုံကို စူးစမ်းကြည့်ရအောင် (ResNet သည် အနက်ရှိုင်းမှုအမျိုးမျိုးရှိသော မော်ဒယ်များ၏ မိသားစုဖြစ်ပြီး၊ အလွန်နက်ရှိုင်းသော မော်ဒယ်တစ်ခုကို ကြည့်လိုပါက ResNet-152 ကို စမ်းသပ်ကြည့်နိုင်ပါသည်)။\n" + "VGG-16 သည် ကွန်ပျူတာမြင်ကွင်း ‌ဆောက်လုပ်ပုံများတွင် အလွန်ရိုးရှင်းဆုံးတစ်ခုဖြစ်သည်။ Keras သည် မကြာသေးမှီက သင်ကြားပြီးသားကွန်ယက်များစွာကို ပံ့ပိုးပေးသည်။ ထိုအနက် အများဆုံး အသုံးပြုရသောများမှာ Microsoft မှ ဖန်တီးထားသည့် **ResNet** ဆောက်လုပ်ပုံများနှင့် Google မှ ဖန်တီးထားသည့် **Inception** ဖြစ်သည်။ ဥပမာအားဖြင့် အလွန်ရိုးရှင်းဆုံး ResNet-50 မော်ဒယ် (ResNet သည် အနက်အမျိုးမျိုးရှိပြီး အနက်အနက်အမျိုးမျိုးရှိသည်၊ မျက်နှာအနက်တစ်ခု ဥပမာ- ResNet-152 ကို စမ်းသပ်ကြည့်နိုင်ပါတယ်- တကယ်ကိုနက်ရှိုင်းတဲ့မော်ဒယ်က ဘယ်လိုမျိုးဖြစ်လဲ ဆိုတာကိုကြည့်ရန်) ၏ ဆောက်လုပ်ပုံကို လေ့လာကြမယ်။\n" ] }, { @@ -1442,29 +1452,29 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "မော်ဒယ်တွင် ရိုးရိုးသိပ်မိုက်သော အဆောက်အအုံများဖြစ်သော convolutional layers, pooling layers နှင့် နောက်ဆုံး dense classifier တို့ပါဝင်သည်ကို တွေ့နိုင်ပါသည်။ ဤမော်ဒယ်ကို VGG-16 ကို transfer learning အတွက် အသုံးပြုခဲ့သည့်နည်းလမ်းတူတူပင် အသုံးပြုနိုင်ပါသည်။ အထက်ပါ code ကို အသုံးပြု၍ မူလမော်ဒယ်အဖြစ် အမျိုးမျိုးသော ResNet မော်ဒယ်များကို စမ်းသပ်ကြည့်ပြီး အတိအကျမှု (accuracy) ပြောင်းလဲမှုကို ကြည့်ရှုနိုင်ပါသည်။\n", + "သင့်မြင်နိုင်သလောက် မော်ဒယ်မှာ တူညီသော ရိုးရိုးရှင်းရှင်း စက်ဆင့်ခွဲပုံများပါဝင်ပါတယ်။ convolutional မျက်နှာပြင်များ၊ pooling မျက်နှာပြင်များနဲ့ နောက်ဆုံး dense classifier ပါဝင်ပါတယ်။ ဤမော်ဒယ်ကို VGG-16 ကို transfer learning အတွက် အသုံးပြုနေသလို တိတိကျကျ အသုံးပြုနိုင်ပါတယ်။ အထက်ပါ ကုဒ်ကို အသုံးပြုပြီး အခြေခံမော်ဒယ်အဖြစ် အမျိုးမျိုးသော ResNet မော်ဒယ်များသုံးပြီး စမ်းကြည့်နိုင်ပြီး တိကျမှန်ကန်မှု ဘယ်လို တိုးတက်သွားသည်ကို ကြည့်ရှုနိုင်ပါတယ်။\n", "\n", "## Batch Normalization\n", "\n", - "ဤကွန်ယက်တွင် အခြားသော အလွှာအမျိုးအစားတစ်ခုဖြစ်သော **Batch Normalization** ပါဝင်သည်။ Batch normalization ၏ အကြောင်းအရာမှာ နယူးရယ်ကွန်ယက်မှတဆင့် စီးဆင်းနေသော တန်ဖိုးများကို သင့်တော်သော interval သို့ ရောက်အောင် ပြုလုပ်ရန်ဖြစ်သည်။ သာမန်အားဖြင့် နယူးရယ်ကွန်ယက်များသည် တန်ဖိုးများ [-1,1] သို့မဟုတ် [0,1] interval အတွင်းရှိသည့်အခါ အကောင်းဆုံးအလုပ်လုပ်နိုင်ပြီး ထို့ကြောင့် input data ကို scale/normalize ပြုလုပ်ရသည်။ သို့သော် deep network ကို training ပြုလုပ်နေစဉ်တွင် တန်ဖိုးများသည် အဆိုပါ interval မှ အလွန်အကျွံ ကျော်လွန်သွားနိုင်ပြီး training ကို အခက်အခဲဖြစ်စေသည်။ Batch normalization layer သည် လက်ရှိ minibatch ၏ တန်ဖိုးများအားလုံးအတွက် အလယ်တန်းနှင့် စံချိန်ကွက်ကိုတွက်ချက်ပြီး signal ကို နယူးရယ်ကွန်ယက် layer မှတဆင့် ဖြတ်သန်းမည့်အခါ normalize ပြုလုပ်သည်။ ဤအရာသည် deep networks ၏ တည်ငြိမ်မှုကို အလွန်တိုးတက်စေပါသည်။\n" + "ဤကွန်ရက်တွင် အမျိုးအစားတစ်ခု ဖန်တီးသော မျက်နှာပြင်ရှိပါသည် - **Batch Normalization**။ Batch normalization ၏ အယူအဆမှာ နယူးရယ်ကွန်ရက်မှတဆင့် ဝင်ရောက်သောတန်ဖိုးများကို သင့်တော်သော အတွင်းတန်းသို့ ပြောင်းလဲပေးခြင်းဖြစ်သည်။ ပုံမှန်အားဖြင့် နယူးရယ်ကွန်ရက်များသည် တန်ဖိုးအားလုံးသည် [-1,1] သို့ မဟုတ် [0,1] အတွင်းရှိသောအခါ အကောင်းဆုံး လုပ်ဆောင်ကြသည်။ ဒါကြောင့် မိမိတို့ စတင်ထည့်သွင်းသော ဒေတာကို အဲဒီအတိုင်း စမိတ် / normalize လုပ်သည်။ သို့ရာတွင် နက်ရှိုင်းသော ကွန်ရက်ကို သင်ကြားစဉ် တွက်ချက်မိရင် တန်ဖိုးများမှာ ဤအတွင်းတန်းမှ အလွန်ကျွန်းကျင်၍ ဖြစ်နိုင်ပြီး သင်ကြားမှု အခက်အခဲ ဖြစ်စေသည်။ Batch normalization မျက်နှာပြင်သည် လက်ရှိ မီနီဘတ်ခ်ရှိ တန်ဖိုးအားလုံးအတွက် ပျမ်းမျှနှင့် စံချိန်တော်ကို တွက်ချက်ပြီး ဒါတို့ကို အသုံးပြု၍ စင်တင် signal ကို နယူးရယ်ကွန်ရက်မျက်နှာပြင်သို့ ပို့ခြင်းမပြုမီ normalize လုပ်တယ်။ ဒါက နက်ရှိုင်းသော ကွန်ရက်များ၏ တည်ငြိမ်မှုကို အများအပြား တိုးတက်စေသည်။\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## အဓိကအချက်\n", + "## အချက်ချုပ်\n", "\n", - "Transfer learning ကို အသုံးပြုခြင်းအားဖြင့်၊ ကျွန်ုပ်တို့၏ အထူးပြု object classification အလုပ်ကို အလွယ်တကူ classifier တစ်ခုတည်ဆောက်နိုင်ခဲ့ပြီး၊ မြင့်မားသော တိကျမှုရလဒ်ကို ရရှိခဲ့ပါသည်။ သို့သော်၊ ဤဥပမာသည် လုံးဝတရားမျှတမှုမရှိပါ၊ အကြောင်းမှာ မူရင်း VGG-16 network ကို ကြောင်များနှင့် ခွေးများကို အသိအမှတ်ပြုရန် pre-trained လုပ်ထားပြီး၊ network အတွင်းရှိ pattern များကို အများအားဖြင့် ပြန်လည်အသုံးပြုခြင်းသာ ဖြစ်ခဲ့ပါသည်။ ထို့ကြောင့် စက်ရုံထဲရှိ ထုတ်လုပ်မှုလိုင်း၏ အသေးစိတ်များ၊ သစ်ပင်ရွက်မျိုးစုံကဲ့သို့သော ပိုမိုထူးခြားသော domain-specific object များတွင် accuracy ပိုမိုနိမ့်ကျနိုင်သည်ကို မျှော်လင့်နိုင်ပါသည်။\n", + "transfer learning ကို အသုံးပြု၍ ကျွန်ုပ်တို့အနေနဲ့ မိမိတို့၏ ကိုယ်ပိုင် ပစ္စည်း အမျိုးအစားကောက်ချက် ရေးရာ အတွက် အချိန်တိုအတွင်း အမျိုးအစားခွဲထုတ်စက်ကို ပြုလုပ်နိုင်ခဲ့ပြီး တိကျမှုမြင့်မားစွာ ရရှိနိုင်ခဲ့ပါသည်။ သို့ဖြစ်ပေမဲ့ ဤဥပမာသည် ပြည့်စုံမှုအတွက် မဟုတ်ပါ၊ အရင် VGG-16 ကွန်ယက်သည် ကြောင်နှင့် ခွေးများကို မှတ်သားရန် အရင်က သင်ကြားပြီးသားဖြစ်သောကြောင့် ကျွန်ုပ်တို့သည် အများစုမှာ အဲဒီကွန်ယက်တွင် ရှိပြီးသား ပုံစံများကို ပြန်လည်အသုံးပြုနေခဲ့သည်။ သင်မြင်နိုင်သော ပိုမိုရှုပ်ထွေးပြီး သီးသန့်နယ်ပယ် အရာဝတ္ထုများ၊ ဥပမာ- စက်ရုံထုတ်လုပ်မှုလိုင်းပေါ်ရှိအသေးစိတ်များ သို့မဟုတ် မတူညီသော သစ်ရွက်များအပေါ်တွင် တိကျမှုနည်းပါးမှု ဖြစ်တတ်သည်။\n", "\n", - "ကျွန်ုပ်တို့အနေနှင့် ယခုဖြေရှင်းနေသော ပိုမိုရှုပ်ထွေးသော အလုပ်များသည် မြင့်မားသော ကွန်ပျူတာစွမ်းအားကို လိုအပ်လာပြီး၊ CPU ပေါ်တွင် အလွယ်တကူ ဖြေရှင်းနိုင်မည်မဟုတ်ပါ။ နောက်ထပ် unit တွင်၊ compute resources ပိုနည်းသော implementation ကို အသုံးပြု၍ အတူတူသော model ကို training လုပ်ရန် ကြိုးစားမည်ဖြစ်ပြီး၊ accuracy အနည်းငယ်သာ နိမ့်ကျသည့် ရလဒ်ကို ရရှိမည်ဖြစ်သည်။\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\n**ပြောကြားချက်**\nဤစာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးပမ်းနေသော်လည်း၊ စက်ကိရိယာဘာသာပြန်ခြင်းများတွင် အမှားများ သို့မဟုတ် မှားယွင်းချက်များ ပါဝင်နိုင်ကြောင်း သတိပြုပါရန် လိုအပ်ပါသည်။ မူလစာတမ်းကို မူရင်းဘာသာဖြင့်သာ ယုံကြည်စိတ်ချရသော အချက်အလက်အဖြစ် သတ်မှတ်သင့်သည်။ အရေးကြီးသည့် သတင်းအချက်အလက်များအတွက် ပရော်ဖက်ရှင်နယ် လူသားဘာသာပြန်သူဝန်ဆောင်မှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်ချက်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုကွာခြားမှုများ သို့မဟုတ် မမှန်ကန်သော အသုံးပြုမှုများအတွက် ကျွန်ုပ်တို့ တာဝန်မခံပါ။\n\n" ] } ], @@ -1485,12 +1495,6 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" - }, - "coopTranslator": { - "original_hash": "c189abc107848f96051085cc30945129", - "translation_date": "2025-08-30T09:12:34+00:00", - "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", - "language_code": "my" } }, "nbformat": 4, diff --git a/translations/my/lessons/5-NLP/README.md b/translations/my/lessons/5-NLP/README.md index 0fbf398ab7..ee16d6da68 100644 --- a/translations/my/lessons/5-NLP/README.md +++ b/translations/my/lessons/5-NLP/README.md @@ -1,51 +1,51 @@ -# သဘာဝဘာသာစကားလုပ်ငန်းဆောင်တာ +# သဘာဝဘာသာစကား အလုပ်ဆောင်ချက် -![NLP လုပ်ငန်းဆောင်တာများကို ရေးဆွဲထားသော ပုံ](../../../../translated_images/my/ai-nlp.b22dcb8ca4707cea.webp) +![NLP အလုပ်များအကျဉ်းချုပ် ဒူလာ](../../../../translated_images/my/ai-nlp.b22dcb8ca4707cea.webp) -ဤအပိုင်းတွင် **သဘာဝဘာသာစကားလုပ်ငန်းဆောင်တာ (NLP)** နှင့်ဆက်စပ်သောအလုပ်များကို Neural Networks အသုံးပြု၍ ဖြေရှင်းပုံကို အဓိကထားဆွေးနွေးသွားမည်ဖြစ်သည်။ ကွန်ပျူတာများကို ဖြေရှင်းစေလိုသော NLP ပြဿနာများစွာရှိသည်။ +ဒီအပိုင်းမှာ ကျွန်တော်တို့ Neural Networks ကို သဘာဝဘာသာစကား အလုပ်နဲ့ပါတ်သတ်တဲ့လုပ်ငန်းတွေကို ကိုင်တွယ်ဖို့ အထူးပြုစွမ်းဆောင်သွားမှာ ဖြစ်ပါတယ်။ ကွန်ပြူတာတွေကိုဖြေရှင်းနိုင်ဖို့လိုချင်တဲ့ NLP ပြဿနာများက များပြားပါတယ်။ -* **စာသားအမျိုးအစားခွဲခြားခြင်း** သည် စာသားအတိုင်းအတာများနှင့်ဆက်စပ်သော အမျိုးအစားခွဲခြားမှုပြဿနာတစ်ခုဖြစ်သည်။ ဥပမာအားဖြင့် အီးမေးလ်များကို spam နှင့် non-spam အဖြစ်ခွဲခြားခြင်း၊ သို့မဟုတ် ဆောင်းပါးများကို အားကစား၊ စီးပွားရေး၊ နိုင်ငံရေး စသည်ဖြင့် အမျိုးအစားခွဲခြားခြင်းတို့ ပါဝင်သည်။ ထို့အပြင် chat bots ဖွံ့ဖြိုးရေးတွင် အသုံးပြုသူ၏ ရည်ရွယ်ချက်ကို နားလည်ရန်လိုအပ်သည်။ ဤကိစ္စတွင် **ရည်ရွယ်ချက်ခွဲခြားခြင်း** (intent classification) ကို ဖြေရှင်းရမည်ဖြစ်သည်။ ရည်ရွယ်ချက်ခွဲခြားမှုတွင် အမျိုးအစားများစွာနှင့် ရင်ဆိုင်ရတတ်သည်။ -* **ခံစားချက်ခွဲခြားခြင်း** သည် regression ပြဿနာတစ်ခုဖြစ်ပြီး စာကြောင်း၏ အဓိပ္ပါယ်သည် အပေါင်း/အပြားဘယ်လောက်ရှိသည်ကို သတ်မှတ်ရန် နံပါတ် (ခံစားချက်) တစ်ခုကို သတ်မှတ်ရမည်ဖြစ်သည်။ ခံစားချက်ခွဲခြားမှု၏ အဆင့်မြင့်ဗားရှင်းတစ်ခုမှာ **အပိုင်းအခြေခံခံစားချက်ခွဲခြားခြင်း** (ABSA) ဖြစ်ပြီး စာကြောင်းတစ်ခုလုံးကို မဟုတ်ဘဲ အပိုင်းအခြေများ (aspects) ကို ခံစားချက်သတ်မှတ်ရမည်ဖြစ်သည်။ ဥပမာအားဖြင့် *ဤစားသောက်ဆိုင်တွင် အစားအစာကို ကြိုက်ခဲ့ပေမယ့် ပတ်ဝန်းကျင်က ဆိုးရွားခဲ့သည်*။ -* **နာမည်ရရှိထားသောအရာများကို မှတ်သားခြင်း** (NER) သည် စာသားမှ အချို့သောအရာများကို ထုတ်ယူရန် ပြဿနာဖြစ်သည်။ ဥပမာအားဖြင့် *မနက်ဖြန် ပဲရစ်ကို ပျံသန်းရန်လိုအပ်သည်* ဆိုသော စာကြောင်းတွင် *မနက်ဖြန်* သည် DATE ကို ရည်ညွှန်းပြီး *ပဲရစ်* သည် LOCATION ဖြစ်သည်ကို နားလည်ရန်လိုအပ်သည်။ -* **အဓိကချက်များထုတ်ယူခြင်း** သည် NER နှင့် ဆင်တူပြီး စာကြောင်း၏ အဓိပ္ပါယ်အတွက် အရေးပါသော စကားလုံးများကို အလိုအလျောက်ထုတ်ယူရန်လိုအပ်သည်။ သတ်မှတ်ထားသောအရာအမျိုးအစားများအတွက် ကြိုတင်လေ့ကျင့်မှုမလိုအပ်ပါ။ -* **စာသားစုစည်းခြင်း** သည် နည်းပညာပံ့ပိုးမှုစကားဝိုင်းများတွင် တူညီသောတောင်းဆိုမှုများကို အုပ်စုဖွဲ့လိုသောအခါ အသုံးဝင်သည်။ -* **မေးခွန်းဖြေဆိုခြင်း** သည် မေးခွန်းတစ်ခုကို ဖြေဆိုနိုင်စွမ်းကို ရည်ညွှန်းသည်။ မော်ဒယ်သည် စာသားအပိုင်းနှင့် မေးခွန်းကို input အဖြစ်ရရှိပြီး မေးခွန်း၏ အဖြေပါဝင်သောနေရာကို စာသားတွင် ရှာဖွေရန် (တခါတလေ အဖြေစာသားကို ဖန်တီးရန်) လိုအပ်သည်။ -* **စာသားဖန်တီးခြင်း** သည် စာသားအသစ်ကို ဖန်တီးနိုင်စွမ်းဖြစ်သည်။ ၎င်းကို *text prompt* အပေါ်အခြေခံပြီး နောက်ထပ်အက္ခရာ/စကားလုံးကို ခန့်မှန်းသော အမျိုးအစားခွဲခြားမှုအလုပ်တစ်ခုအဖြစ် သတ်မှတ်နိုင်သည်။ GPT-3 ကဲ့သို့သော အဆင့်မြင့်စာသားဖန်တီးမော်ဒယ်များသည် [prompt programming](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) သို့မဟုတ် [prompt engineering](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29) ဆိုသောနည်းလမ်းများကို အသုံးပြု၍ အခြားသော NLP အလုပ်များကို ဖြေရှင်းနိုင်သည်။ -* **စာသားအကျဉ်းချုပ်ရေးခြင်း** သည် ရှည်လျားသောစာသားကို "ဖတ်"၍ အနည်းငယ်သောစာကြောင်းများဖြင့် အကျဉ်းချုပ်ရေးရန်လိုအပ်သောနည်းလမ်းဖြစ်သည်။ -* **စက်ဖြင့်ဘာသာပြန်ခြင်း** သည် ဘာသာစကားတစ်ခုတွင် စာသားနားလည်ခြင်းနှင့် အခြားဘာသာစကားတွင် စာသားဖန်တီးခြင်းတို့၏ ပေါင်းစပ်အဖြစ်မြင်နိုင်သည်။ +* **စာသားခွဲခြားခြင်း** သည် စာသားလိုက်တာတွေ အပေါ် အထွေထွေခွဲခြားခြင်းပြဿနာ ဖြစ်သည်။ ဥပမာအနေနဲ့ အီးမေးလ်များကို spam နှင့် no-spam အဖြစ်ခွဲခြားခြင်း၊ သို့မဟုတ် ဆောင်းပါးများကို ကစားကွင်း၊ စီးပွားရေး၊ နိုင်ငံရေး စသဖြင့် အမျိုးအစားခွဲခြင်းတို့ ပါဝင်တယ်။ ထို့အပြင်, မေးလ်တုံ့ပြန်သူများ ဖန်တီးရာတွင် အသုံးပြုသူကဘာပြောလိုကြောင်း ဘာယူလိုကြောင်းကို နားမလည်ခဲ့ရင် **ရည်ရွယ်ချက်ခွဲခြားခြင်း** လုပ်ရတယ်။ အများအားဖြင့်, ရည်ရွယ်ချက်ခွဲခြားခြင်းမှာ အမျိုးအစားများစွာကို ကိုင်တွယ်ရတတ်သည်။ +* **ခံစားချက်ခွဲခြားခြင်း** သည် အထွေထွေ ရင်းနှီးထက်မြက်မှု ပြဿနာ ဖြစ်သည်၊ ဒီမှာ စာကြောင်းတစ်ကြောင်း၏ အဓိပ္ပါယ်က ဘယ်လောက် အပေါင်/အချိုးမမှန် ဖြစ်သလဲဆိုတာကို နံပါတ်တစ်ခု (ခံစားချက်) ပေးရတယ်။ ခံစားချက်ခွဲခြားနည်း ရှုပ်ထွေးတဲ့ဗားရှင်းတစ်ခုက **အချက်အလက်အခြေခံခံစားချက်ခွဲခြားခြင်း** (ABSA) ဖြစ်ပြီး စာကြောင်းတစ်ရှည်လုံးကိုမဟုတ်ပဲ အပိုင်းအဆင့်အမျိုးမျိုး (အချက်များ) ကို ခံစားချက်ပေးညွှန်းတယ်။ ဥပမာ- *ဒီစားသောက်ဆိုင်မှာ ဟင်းချက်နည်းကဘာသာကောင်းခဲ့ပေမယ့်ပတ်ဝန်းကျင်ကတော့ဆိုးခဲ့တယ်*။ +* **အမည်ရှိ အရာဝတ္တု အသိအမှတ်ပြုခြင်း** (NER) ဟာ စာသားထဲက အရာဝတ္တုထူးခြားများကို ဖြုတ်ယူဖော်ထုတ်တဲ့ ပြဿနာ ဖြစ်တယ်။ ဥပမာအားဖြင့် *မနက်ဖြန် ပဲရစ်ကို ပျံသွားလို့ လိုတယ်* ဆိုတဲ့စာကြောင်းထဲမှာ *မနက်ဖြန်* ဟာ အချိန် (DATE) ကိုဆိုလိုတာဖြစ်ပြီး *ပဲရစ်* ဆိုတာ တည်နေရာ (LOCATION) ဖြစ်တယ်။ +* **အဓိပ္ပါယ်အဓိပ္ပာယ်ရွိသော စကားလုံး ထုတ်ယူခြင်း** သည် NER နဲ့ ဆင်တူပေမယ့်၊ အထူးအမည်ရှိ အရာဝတ္တုအမျိုးအစားများအတွက် ကြိုတင်လေ့လာခြင်းမရှိဘဲ စာကြောင်း၏ အဓိပ္ပာယ်အတွက် အရေးကြီးသော စကားလုံးများကို အလိုအလျောက် ထုတ်ယူရတယ်။ +* **စာသားအုပ်စုခွဲခြင်း** သည် ဆန့်ကျင်သည့်စာကြောင်းများကို အုပ်စုဖွဲ့လိုတဲ့အခါ အသုံးဝင်တတ်၏၊ ဥပမာ တခြားတခြားနည်းပညာဆိုင်ရာ ကူညီမှုဆွေးနွေးပွဲများထဲက တူညီသော တောင်းဆိုချက်များ။ +* **မေးခွန်းဖြေဆိုခြင်း** ဆိုသည်မှာ မော်ဒယ်တစ်ခု၏ မေးခွန်းတစ်ခုကို ဖြေဆိုနိုင်စွမ်းကို ဆိုလိုသည်။ မော်ဒယ်သည် စာသားပိုဒ်နှင့် မေးခွန်းကို အင်ပွတ်အနေနှင့် ရရှိသည့်အခါ၊ မေးခွန်း၏ ဖြေကြားချက်ပါတဲ့ စာသားအပိုင်းကို ဖော်ပြပေးရပါမည် (သို့မဟုတ် တခါတရံတွင် ဖြေကြားစာသားကို ထုတ်လုပ်ပေးရတတ်သည်)။ +* **စာသားဖန်တီးခြင်း** သည် မော်ဒယ်တစ်ခုက စာသားအသစ်ကို ဖန်တီးနိုင်စွမ်း ဖြစ်သည်။ ဒါကို နောက်အက္ခရာ/စကားလုံးကို ယခင်စာသားအပိုင်းတစ်ခုအပေါ် မူတည်၍ ခန့်မှန်းဆွဲယူသည့် ခွဲခန့်ခြင်းအသုံးအများဖြစ်နိုင်သည်။ GPT-3 ကဲ့သို့ အဆင့်မြင့် စာသားဖန်တီးရေးမော်ဒယ်များသည် [prompt programming](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) သို့မဟုတ် [prompt engineering](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29) ဟူသော နည်းဗျူဟာဖြင့် အခြား NLP လုပ်ငန်းများကိုလည်း ဖြေရှင်းနိုင်သည်။ +* **စာသားအကျဉ်းချုပ်** ဆိုသည်မှာ ကွန်ပျူတာကို စာတစ်ရှည်စီ “အဖတ်” လုပ်ပြီး အနည္းငယ်သော စာကြောင်းများဖြင့် အကျဉ်းချုပ်ထွက်ရှိစေချင်သော အသုံးအနှုန်းဖြစ်သည်။ +* **စက်ဘာသာပြန်ခြင်း** ကို တစ်ဘာသာစကားအတွက် စာသားနားလည်သည့် အလုပ်ကို ပြုလုပ်ပြီး အခြားဘာသာစကားရဲ့ စာသားကို ဖန်တီးခြင်းတို့ ပေါင်းစပ်သည်ဟု ကြည့်နိုင်သည်။ -အစပိုင်းတွင် NLP အလုပ်များအများစုကို ဓလေ့ကျင့်နည်းများဖြင့် ဖြေရှင်းခဲ့သည်။ ဥပမာအားဖြင့် စက်ဖြင့်ဘာသာပြန်ခြင်းတွင် စာကြောင်းကို syntax tree အဖြစ်ပြောင်းလဲရန် parsers ကို အသုံးပြုခဲ့ပြီး sentence ၏ အဓိပ္ပါယ်ကို ကိုယ်စားပြုသော semantic structures များကို ထုတ်ယူခဲ့သည်။ ထို့နောက် target ဘာသာစကား၏ grammar အပေါ်အခြေခံ၍ ရလဒ်ကို ဖန်တီးခဲ့သည်။ ယနေ့တွင် Neural Networks ကို အသုံးပြု၍ NLP အလုပ်များစွာကို ပိုမိုထိရောက်စွာ ဖြေရှင်းနိုင်သည်။ +အစပိုင်းမှာ NLP အလုပ်များအချို့ကို ဂရမ်မာများကဲ့သို့ ရိုးရာနည်းလမ်းများဖြင့် ဖြေရှင်းခဲ့ကြသည်။ ဥပမာ၊ စက်ဘာသာပြန်ခြင်းတွင် စာကြောင်းကို စာလုံးပုံစံသစ်သစ်ဖြင့် ပြောင်းရန် ပတ်ဆင်သက်သာမှုများကို လေ့လာဖော်ထုတ်ပြီး စာကြောင်းအဓိပ္ပါယ်အပြည့်အဝ ကိုယ်စားပြုရန် အဆင့်မြင့် တိုင်းတာမှုများ ကို စုဆောင်းသုံးစွဲခဲ့သည်။ ယနေ့မှာတော့ NLP အလုပ်များစွာကို neural networks ဖြင့် ပိုမိုထိရောက်စွာ ဖြေရှင်းကြသည်။ -> [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org) Python library တွင် classical NLP နည်းလမ်းများစွာကို အကောင်အထည်ဖော်ထားသည်။ [NLTK Book](https://www.nltk.org/book/) သည် NLTK ကို အသုံးပြု၍ NLP အလုပ်များကို ဖြေရှင်းပုံကို ဖော်ပြထားသော အွန်လိုင်းစာအုပ်တစ်ခုဖြစ်သည်။ +> ကျယ်ပြန့်စွာအသုံးပြုသော ရိုးရာ NLP နည်းလမ်းများကို [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org) Python လိုင်ဘ်ရရီတွင် အကောင်အထည်ဖော်ထားသည်။ NLTK ဖြင့် မည်သည့် NLP လုပ်ငန်းများကို ဖြေရှင်းနိုင်သည်ကို ဖော်ပြသော အွန်လိုင်းတွင် ရနိုင်သော [NLTK စာအုပ်](https://www.nltk.org/book/) တစ်အုပ် ရှိသည်။ -ဤသင်ခန်းစာတွင် Neural Networks ကို အသုံးပြု၍ NLP ကို အဓိကထားမည်ဖြစ်ပြီး NLTK ကို လိုအပ်သည့်နေရာတွင် အသုံးပြုမည်ဖြစ်သည်။ +ကျွန်တော်တို့ သင်ခန်းစာ၌ အဓိကအားဖြင့် Neural Networks အသုံးပြုပြီး NLP ကိုဆောင်ရွက်တော့မှာ ဖြစ်ပြီး NLTK ကို လိုအပ်သလို သုံးမှာပါ။ -ကျွန်ုပ်တို့သည် tabular data နှင့် images ကို Neural Networks အသုံးပြု၍ ဖြေရှင်းပုံကို ရှင်းလင်းခဲ့ပြီးဖြစ်သည်။ data အမျိုးအစားများနှင့် စာသားအကြား အဓိကကွာခြားချက်မှာ စာသားသည် အရွယ်အစားမတူညီသော အတိုင်းအတာဖြစ်ပြီး images ၏ input size ကို ကြိုတင်သိနိုင်သည်။ Convolutional networks သည် input data မှ pattern များကို ထုတ်ယူနိုင်သော်လည်း စာသားတွင် pattern များသည် ပိုမိုရှုပ်ထွေးသည်။ ဥပမာအားဖြင့် negation သည် subject နှင့် အကွာအဝေးရှိသော စကားလုံးများဖြင့် ခွဲထားနိုင်သည် (*I do not like oranges* နှင့် *I do not like those big colorful tasty oranges*)၊ ၎င်းကို pattern တစ်ခုအဖြစ် သတ်မှတ်နိုင်ရမည်ဖြစ်သည်။ ထို့ကြောင့် ဘာသာစကားကို ကိုင်တွယ်ရန် *recurrent networks* နှင့် *transformers* ကဲ့သို့သော Neural Network အမျိုးအစားအသစ်များကို မိတ်ဆက်ရန်လိုအပ်သည်။ +ကျွန်တော်တို့ နောက်ဆုံးတွင်တော့ တ(tabular)ဒေတာနဲ့ ပုံရိပ်များအတွက် နယူးရယ်နက်ရွက်အသုံးပြုပြီး အလုပ်လုပ်နည်းများကိုသင်ခဲ့ပြီးသားဖြစ်တယ်။ ဒီထက်ကွာခြားချက်က စာသားမှာ အရွယ်အစား မတူညီသော လိုက်တစ်ခုဖြစ်ပြီး၊ ပုံရိပ်မှာတော့ အရင်ကသိထားတဲ့ input အရွယ်အစားရှိတယ်။ Convolutional network တွေက input data မှတစ်ဆင့် ပုံစံများကို ထုတ်ယူနိုင်ပေမဲ့ စာသားထဲမှာ ပုံစံတွေ ပိုရှုပ်ထွေးတယ်။ ဥပမာ- ငြင်းဆန်မှုအုပ်စုက ဘာသာရပ်ခေါင်းစဉ်ထဲက နေရာကွာခြားမှု ကြီးတဲ့ စကားဝိုင်းတွေဖြစ်နေတာကို ကျွန်တော်တို့တွေ များသောအားဖြင့် တူညီတဲ့ ပုံစံတစ်ခုလို သတ်မှတ်ရတယ် (ဥပမာ- *ကျွန်တော် မုန့်သုတ် oranges မနှစ်သက်ပါ၊* နှင့် *ကျွန်တော် အဲဒီသေးငယ်ရောင်စုံထမင်းသုတ် oranges မနှစ်သက်ပါ*)။ ဒါကြောင့် ဘာသာစကားကို ကိုင်တွယ်ရာမှာ *recurrent networks* နဲ့ *transformers* ကဲ့သို့ နယူးရယ်နက်ရွက်အသစ်များ ထည့်သွင်းရမယ်။ -## Libraries ကို Install လုပ်ခြင်း +## စာကြည့်တိုက်များ ထည့်သွင်းခြင်း -ဤသင်ခန်းစာကို local Python installation တွင် run လုပ်မည်ဆိုပါက NLP အတွက်လိုအပ်သော libraries များကို အောက်ပါ command များဖြင့် install လုပ်ရန်လိုအပ်နိုင်သည်။ +သင်ခန်းစာကို အိမ်ပြင် Python ထည့်သွင်းထားတဲ့ စနစ်တွင် စတင်သုံးမယ် ဆိုရင် NLP အတွက် လိုအပ်သော စာကြည့်တိုက်များအားလုံးကို အောက်ပါ အမိန့်များဖြင့် ထည့်သွင်းရမှာ ဖြစ်တယ်။ **PyTorch အတွက်** ```bash -pip install -r requirements-torch.txt +pip install -r requirements-pytorch.txt ``` **TensorFlow အတွက်** ```bash pip install -r requirements-tf.txt ``` -> TensorFlow ဖြင့် NLP ကို [Microsoft Learn](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste) တွင် စမ်းသပ်နိုင်သည်။ +> [Microsoft Learn](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste) တွင် TensorFlow နှင့် အတူ NLP ကို စမ်းသပ်နိုင်ပါသည်။ -## GPU သတိပေးချက် +## GPU အသိပေးချက် -ဤအပိုင်းတွင် မော်ဒယ်များကို training လုပ်ရန် အချို့သော ဥပမာများတွင် ကြီးမားသော မော်ဒယ်များကို training လုပ်မည်ဖြစ်သည်။ -* **GPU-enabled ကွန်ပျူတာကို အသုံးပြုပါ**: ကြီးမားသောမော်ဒယ်များနှင့်အလုပ်လုပ်သောအခါ စောင့်ဆိုင်းချိန်များကို လျှော့ချရန် GPU-enabled ကွန်ပျူတာတွင် notebooks များကို run လုပ်ရန် အကြံပြုပါသည်။ -* **GPU memory အကန့်အသတ်များ**: GPU တွင် run လုပ်ခြင်းသည် ကြီးမားသောမော်ဒယ်များကို training လုပ်သောအခါ GPU memory ကုန်ဆုံးမှုဖြစ်နိုင်သည်။ -* **GPU memory သုံးစွဲမှု**: Training လုပ်စဉ် GPU memory သုံးစွဲမှုသည် minibatch size အပါအဝင် အမျိုးမျိုးသောအချက်များပေါ်မူတည်သည်။ -* **Minibatch size ကို လျှော့ချပါ**: GPU memory ပြဿနာများနှင့် ရင်ဆိုင်ပါက minibatch size ကို လျှော့ချရန် code တွင် ပြင်ဆင်ပါ။ -* **TensorFlow GPU memory ဖြန့်ချိမှု**: TensorFlow ၏ အဟောင်းဗားရှင်းများသည် Python kernel တစ်ခုတွင် မော်ဒယ်များစွာကို training လုပ်သောအခါ GPU memory ကို မှန်ကန်စွာ ဖြန့်ချိမထားနိုင်ပါ။ GPU memory သုံးစွဲမှုကို ထိန်းချုပ်ရန် TensorFlow ကိုလိုအပ်သည့်အခါ GPU memory ကိုသာ allocate လုပ်ရန် configure လုပ်နိုင်သည်။ -* **Code ထည့်သွင်းခြင်း**: TensorFlow ကိုလိုအပ်သည့်အခါ GPU memory allocation ကိုသာ ကြီးထွားစေရန် notebooks တွင် အောက်ပါ code ကို ထည့်သွင်းပါ: +ဒီအပိုင်း၌ အချို့ ဥပမာများတွင် အလွန်ကြီးမားသော မော်ဒယ်များကို လေ့ကျင့်မယ်။ +* **GPU ပါရှိသော ကွန်ပျူတာ အသုံးပြုပါ** - ကြီးမားသော မော်ဒယ်များကို အသုံးပြုရာ၌ စောင့်ဆိုင်းမှုအချိန် လျှော့ချရန် GPU ပါရှိသော ကွန်ပျူတာမှာ notebook များ ပုံမှန်ထိန်းသိမ်းသွားခြင်း စနစ်ဖြစ်ပါသည်။ +* **GPU မှတ်ဉာဏ် ကန့်သတ်ချက်** - ကြီးမားသော မော်ဒယ်များ လေ့ကျင့်ရာ၌ GPU မှတ်ဉာဏ် ကန့်သတ်မှု ကြုံတွေ့ရနိုင်သည်။ +* **GPU မှတ်ဉာဏ် စားသုံးမှု** - လေ့ကျင့်မှုကာလ GPU မှတ်ဉာဏ် အသုံးပြုမှုသည် မတူညီသော အချက်အလက်ပါဝင်မှုများ၊ အထူးသဖြင့် minibatch အရွယ်အစားပေါ် မူတည်သည်။ +* **minibatch အရွယ်အစား လျှော့ချရန်** - GPU မှတ်ဉာဏ် ပြဿနာများ ကြုံတွေ့ခဲ့ရင် သင့်ဒေတာ အပိုင်းအရွယ်အစားကို လျှော့ချပြီး သုံးသင့်သည်။ +* **TensorFlow GPU မှတ်ဉာဏ် ပြန်လည်လွှတ်ပေးမှု** - TensorFlow ဗားရှင်းဟောင်းများတွင် Python kernel တစ်ခုထဲ အတွင်း မော်ဒယ်များစွာ လေ့ကျင့်လျှင် GPU မှတ်ဉာဏ် မမှန်ကန်စွာ လွှတ်မပေးနိုင်ပါ။ GPU မှတ်ဉာဏ်အသုံးပြုမှု ကို ထိန်းချုပ်ရန် TensorFlow ကို GPU မှတ်ဉာဏ် ယူစရာလိုအပ်ချိန်တွင်သာ ယူမည့် အနေအထား သို့ စီစဉ်နိုင်သည်။ +* **ကုတ် ထည့်သွင်းခြင်း** - TensorFlow ကို GPU မှတ်ဉာဏ် မလိုအပ်သေးသောအချိန်တွင်သာ ယူရန် သင့် notebook များတွင် အောက်ပါ ကုတ်ကို ထည့်သွင်း၍ စီမံခန့်ခွဲနိုင်သည်။ ```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) ``` -Classic 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) သို့ သွားရောက်ကြည့်ရှုနိုင်သည်။ -## ဤအပိုင်းတွင် -ဤအပိုင်းတွင် ကျွန်ုပ်တို့သည် အောက်ပါအကြောင်းအရာများကို လေ့လာမည်ဖြစ်သည်- +## ဒီအပိုင်း၌ +ဒီအပိုင်းမှာ ကျွန်တော်တို့ သင်ကြားသွားမယ့် အကြောင်းများမှာ - -* [စာသားကို tensors အဖြစ် ကိုယ်စားပြုခြင်း](13-TextRep/README.md) -* [Word Embeddings](14-Emdeddings/README.md) -* [ဘာသာစကားမော်ဒယ်ရေးခြင်း](15-LanguageModeling/README.md) -* [Recurrent Neural Networks](16-RNN/README.md) -* [Generative Networks](17-GenerativeNetworks/README.md) -* [Transformers](18-Transformers/README.md) +* [စာသားကို tensor အဖြစ် ကိုယ်စားပြုခြင်း](13-TextRep/README.md) +* [စကားလုံးထည့်သွင်းခြင်း](14-Emdeddings/README.md) +* [ဘာသာစကားပုံစံဖန်တီးခြင်း](15-LanguageModeling/README.md) +* [ကျန်ကြွယ်လာသော နယူးရယ်နက်ရွက်များ](16-RNN/README.md) +* [ဖန်တီးရေးကွန်ယက်များ](17-GenerativeNetworks/README.md) +* [Transformer များ](18-Transformers/README.md) -**အကြောင်းကြားချက်**: -ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှုအတွက် ကြိုးစားနေသော်လည်း၊ အလိုအလျောက် ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို သတိပြုပါ။ မူရင်းစာရွက်စာတမ်းကို ၎င်း၏ မူရင်းဘာသာစကားဖြင့် အာဏာတရားရှိသော အရင်းအမြစ်အဖြစ် ရှုလေ့လာသင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ ပရော်ဖက်ရှင်နယ် ဘာသာပြန်မှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော အလွဲအမှားများ သို့မဟုတ် အနားလွဲမှုများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file +--- + + +**ပြောကြားချက်** +ဤစာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးပမ်းနေသော်လည်း၊ စက်ကိရိယာဘာသာပြန်ခြင်းများတွင် အမှားများ သို့မဟုတ် မှားယွင်းချက်များ ပါဝင်နိုင်ကြောင်း သတိပြုပါရန် လိုအပ်ပါသည်။ မူလစာတမ်းကို မူရင်းဘာသာဖြင့်သာ ယုံကြည်စိတ်ချရသော အချက်အလက်အဖြစ် သတ်မှတ်သင့်သည်။ အရေးကြီးသည့် သတင်းအချက်အလက်များအတွက် ပရော်ဖက်ရှင်နယ် လူသားဘာသာပြန်သူဝန်ဆောင်မှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်ချက်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုကွာခြားမှုများ သို့မဟုတ် မမှန်ကန်သော အသုံးပြုမှုများအတွက် ကျွန်ုပ်တို့ တာဝန်မခံပါ။ + \ No newline at end of file diff --git a/translations/my/lessons/6-Other/23-MultiagentSystems/README.md b/translations/my/lessons/6-Other/23-MultiagentSystems/README.md index 796f251667..4cb7098e35 100644 --- a/translations/my/lessons/6-Other/23-MultiagentSystems/README.md +++ b/translations/my/lessons/6-Other/23-MultiagentSystems/README.md @@ -1,38 +1,38 @@ -# Multi-Agent Systems +# မျိုးစုံဧရာအေဂျင့်စနစ်များ -တစ်ခုတည်းသောနည်းလမ်းဖြင့် ဉာဏ်ရည်ရှိမှုကို ရရှိစေခြင်းသည် **ပေါ်ပေါက်မှု** (သို့မဟုတ် **synergetic**) နည်းလမ်းအပေါ် အခြေခံထားသည်။ ၎င်းသည် အလွန်ရိုးရှင်းသော agent များစွာ၏ ပေါင်းစပ်အပြုအမူသည် စနစ်တစ်ခုလုံး၏ ပိုမိုရှုပ်ထွေးသော (သို့မဟုတ် ဉာဏ်ရည်ရှိသော) အပြုအမူကို ဖြစ်ပေါ်စေသည်ဟု ဆိုသည်။ သီအိုရီအရ၊ ၎င်းသည် [Collective Intelligence](https://en.wikipedia.org/wiki/Collective_intelligence), [Emergentism](https://en.wikipedia.org/wiki/Global_brain) နှင့် [Evolutionary Cybernetics](https://en.wikipedia.org/wiki/Global_brain) ၏ မူဝါဒများအပေါ် အခြေခံထားသည်။ ၎င်းတို့က အဆင့်မြင့်စနစ်များသည် အဆင့်နိမ့်စနစ်များမှ သင့်တော်စွာ ပေါင်းစည်းခြင်းဖြင့် တန်ဖိုးတစ်ခုခုကို ထပ်မံရရှိနိုင်သည်ဟု ဆိုသည် (*principle of metasystem transition* ဟုခေါ်သည်)။ +ဉာဏ်ရည်ရရှိရန်ဖြစ်နိုင်သောနည်းလမ်းတစ်ခုမှာ **မျိုးစုံပေါ်ပေါက်မှု** (သို့) **ပူးပေါင်းဆောင်ရွက်မှု** နည်းလမ်းဖြစ်ပြီး၊ အလယ်အလတ်လွယ်ကူသောအေဂျင့်များစွာ၏ ပေါင်းစပ်လှုပ်ရှားမှုသည် စနစ်တစ်ခုလုံး၏ ပိုမိုရှုပ်ထွေး (သို့) ဉာဏ်ရည်ရှိသော လှုပ်ရှားမှုကို ဖြစ်ပေါ်စေနိုင်ကြောင်းအခြေခံသည်။ ယဉ်ကျေးတန်ဖိုးအနေဖြင့်၊ ၎င်းသည် [စုစုပေါင်း ဉာဏ်ရည်](https://en.wikipedia.org/wiki/Collective_intelligence), [ပေါ်ပေါက်မှု သဘောတရား](https://en.wikipedia.org/wiki/Global_brain) နှင့် [အင်အားသဘောတရား ဖြင့် တိုးတက်တည်ဆောက်မှု](https://en.wikipedia.org/wiki/Global_brain) များ၏အခြေခံအယူအဆများအပေါ်တွင် အခြေခံသည်၊ ၎င်းများမှာ အဆင့်မြင့်စနစ်များသည် အဆင့်နိမ့်စနစ်များမှ သင့်တော်စွာပေါင်းစပ်ကာ တန်ဖိုးတချို့ရရှိကြောင်း ပြောကြားသည် (ကိုးကားအားဖြင့် *အမျိုးမျိုး စနစ်ရဲ့ ပြောင်းလဲမှု သဘောတရား*) ။ -## [Pre-lecture quiz](https://ff-quizzes.netlify.app/en/ai/quiz/45) +## [မကြာခဏ မေးခွန်းမေးစရာ](https://ff-quizzes.netlify.app/en/ai/quiz/45) -**Multi-Agent Systems** ၏ လမ်းကြောင်းသည် 1990 ခုနှစ်များတွင် အင်တာနက်နှင့် ဖြန့်ဖြူးထားသော စနစ်များ၏ တိုးတက်မှုအဖြစ် AI တွင် ပေါ်ပေါက်လာခဲ့သည်။ AI စာအုပ်များထဲမှ တစ်ခုဖြစ်သော [Artificial Intelligence: A Modern Approach](https://en.wikipedia.org/wiki/Artificial_Intelligence:_A_Modern_Approach) သည် Multi-agent systems ၏ ရှုထောင့်မှ classical AI ကို အဓိကထား၍ ရေးသားထားသည်။ +**မျိုးစုံဧရာအေဂျင့်စနစ်များ** ၏ ဦးတည်မှုပုံစံကို 1990s တွင် အင်တာနက်နှင့် ဖြန့်ဝေထားသည့်စနစ်များတိုးတက်မှုဖြစ်လာခြင်းကို တုံ့ပြန်မှုအဖြစ် AI တွင် ဖော်ထုတ်လာကြောင်းသိရသည်။ ရိုးရာ AI သင်ခန်းစာစာအုပ်တစ်အုပ်ဖြစ်သော [Artificial Intelligence: A Modern Approach](https://en.wikipedia.org/wiki/Artificial_Intelligence:_A_Modern_Approach) မှာ ပုံမှန် AI ကို မျိုးစုံအေဂျင့်စနစ်များ၏ မြင်ကွင်းမှ ကြည့်ခိုင်းထားသည်။ -Multi-agent နည်းလမ်း၏ အဓိကမှာ **Agent** ဆိုသော အယူအဆဖြစ်သည်။ Agent သည် **environment** တစ်ခုတွင် နေထိုင်ပြီး ၎င်းကို သိရှိနိုင်ပြီး လုပ်ဆောင်နိုင်သည်။ ၎င်းသည် အလွန်ကျယ်ပြန့်သော အဓိပ္ပာယ်ဖြစ်ပြီး agent များအမျိုးအစားများစွာ ရှိနိုင်သည်- +မျိုးစုံအေဂျင့်နည်းလမ်း၏ အဓိကအယူအဆမှာ **အေဂျင့်** ဟု ခေါ်သည့်အရာဖြစ်ပြီး၊ ၎င်းသည် ၎င်း၏ **ပတ်ဝန်းကျင်** တွင် တည်ရှိကာ ကြည့်ရှုနိုင်ပြီး လှုပ်ရှားဆောင်ရွက်နိုင်သော အရာတစ်ခုဖြစ်သည်။ ၎င်းသည် ကျယ်ပြန့်သော အဓိပ္ပာယ်ဖြစ်သဖြင့် အေဂျင့်အမျိုးအစားများနှင့် အမျိုးအစားအတွဲများ များစွာရှိနိုင်သည်။ -* **Reason** လုပ်နိုင်စွမ်းအပေါ် အခြေခံ၍: - - **Reactive** agents သည် ရိုးရှင်းသော request-response အပြုအမူကိုသာ ရှိသည်။ - - **Deliberative** agents သည် logical reasoning သို့မဟုတ် planning စွမ်းရည်များကို အသုံးပြုသည်။ -* Agent code ကို အကောင်အထည်ဖော်ရာနေရာအပေါ် အခြေခံ၍: - - **Static** agents သည် သီးသန့် network node တွင် လုပ်ဆောင်သည်။ - - **Mobile** agents သည် network node များအကြား code ကို ရွှေ့နိုင်သည်။ -* အပြုအမူအပေါ် အခြေခံ၍: - - **Passive agents** သည် ရည်ရွယ်ချက်မရှိပါ။ ၎င်းတို့သည် အပြင်ပန်းအတုအယောင်များကို တုံ့ပြန်နိုင်သော်လည်း ကိုယ်တိုင် လှုပ်ရှားမှုများကို စတင်မလုပ်ပါ။ - - **Active agents** သည် ရည်ရွယ်ချက်တစ်ခုခုကို လိုက်နာသည်။ - - **Cognitive agents** သည် ရှုပ်ထွေးသော planning နှင့် reasoning ကို ပါဝင်သည်။ +* ၎င်းတို့၏ အတွေးအမြင်စွမ်းရည်ပေါ်မူတည်၍ - + - **ပြန်ကြောင်းအဖြေ ပြုလုပ်သူ (Reactive)** အေဂျင့်များသည် ရိုးရှင်းသော တုံ့ပြန်မှုအမျိုးအစား ဖြစ်တတ်သည် + - **စဉ်းစားရန်တုံ့ပြန်သူ (Deliberative)** အေဂျင့်များသည် တစ်စုံတစ်ဦး အတွေးအမြင် အသုံးပြုခြင်း ( သို့) စီမံချက်များကို အသုံးပြုသည် +* အေဂျင့်၏ ကိုယ်ပိုင် ကုဒ်ကို မည်သည့်နေရာတွင် အကောင်အထည်ဖော်သည်ကို မူတည်၍ - + - **တည်နေရာတစ်နေရာတွင် အလုပ်လုပ်သူ (Static)** အေဂျင့်များသည် အော်ပရိတ်နက်ဝပ်စ်အုပ်စုတစ်ခုတွင်သာ အလုပ်လုပ်သည် + - **မျိုးရိုးရှာမှု ရှိ သော (Mobile)** နေရာများအကြား ကုဒ်ကို ရွေ့နိုင်သော အေဂျင့်များ +* ၎င်းတို့၏ လုပ်ဆောင်မှုအပေါ်မူတည်၍ - + - **ပေးအပ်မှုမရှိသည့် (Passive)** အေဂျင့်များတွင် ရည်မှန်းချက်များမရှိ။ ၎င်းတို့သည် ပြင်ပ လှုပ်ရှားမှုများအပေါ် တုံ့ပြန်နိုင်သော်လည်း ကိုယ့်အလှုပ်အရှားကို မစစ်ဆင်နိုင်။ + - **ပါဝင်ဆောင်ရွက်သူ (Active)** အေဂျင့်များတွင် ရည်မှန်းချက် ရှိပြီး ၎င်းတို့ကို လိုက်လံဆောင်ရွက်သည်။ + - **သဘောတရားအသုံးပြုသူ (Cognitive)** အေဂျင့်များတွင် ထူးခြားပြီး စီမံချက်ရေးဆွဲခြင်းနှင့် အတွေးအမြင် ပါဝင်သည်။ -Multi-agent systems များကို ယနေ့ခေတ်တွင် အပလီကေးရှင်းများစွာတွင် အသုံးပြုနေသည်- +ယနေ့တွင် မျိုးစုံအေဂျင့်စနစ်များကို အများအပြား လုပ်ငန်းများတွင် အသုံးပြုကြသည်။ -* ဂိမ်းများတွင် non-player characters များသည် AI တစ်ခုခုကို အသုံးပြုပြီး ဉာဏ်ရည်ရှိသော agent များအဖြစ် သတ်မှတ်နိုင်သည်။ -* ဗီဒီယိုထုတ်လုပ်မှုတွင် လူအုပ်များပါဝင်သော ရှုပ်ထွေးသော 3D ရှုခင်းများကို multi-agent simulation အသုံးပြု၍ typically rendering လုပ်သည်။ -* စနစ်များကို မော်ဒယ်တူလုပ်ဆောင်ရာတွင် multi-agent နည်းလမ်းကို ရှုပ်ထွေးသော မော်ဒယ်၏ အပြုအမူကို simulation လုပ်ရန် အသုံးပြုသည်။ ဥပမာအားဖြင့် multi-agent နည်းလမ်းကို COVID-19 ရောဂါကူးစက်မှုကို ကမ္ဘာတစ်ဝှမ်းတွင် ခန့်မှန်းရန် အောင်မြင်စွာ အသုံးပြုခဲ့သည်။ ထိုနည်းလမ်းကို မြို့တွင်း traffic ကို မော်ဒယ်တူလုပ်ဆောင်ရန် အသုံးပြုနိုင်ပြီး traffic စည်းကမ်းများပြောင်းလဲမှုအပေါ် ၎င်း၏ တုံ့ပြန်မှုကို ကြည့်နိုင်သည်။ -* ရှုပ်ထွေးသော automation စနစ်များတွင် တစ်ခုချင်းစီသော device သည် independent agent အဖြစ် လုပ်ဆောင်နိုင်ပြီး စနစ်တစ်ခုလုံးကို ပိုမိုခိုင်မာစေသည်။ +* ဂိမ်းများတွင် မဟာစာပါယ်များစွာသုံးသောအနေဖြင့် AI အနည်းငယ်ပါဝင်သည်နှင့် ဉာဏ်ရည်ရှိသော အေဂျင့်အဖြစ် ယူဆနိုင်သည်။ +* ဗီဒီယို ထုတ်လုပ်မှုများတွင် အုပ်စုများပါဝင်သော ရှုပ်ထွေးသော 3D အမြင်များကို ဖန်တီးရန် မျိုးစုံအေဂျင့် မော်ဒယ်လုပ်ငန်းသုံးသည်။ +* စနစ် မော်ဒယ်ရေးရာများတွင် မျိုးစုံအေဂျင့် နည်းလမ်းဖြင့် ရှုပ်ထွေးသော မော်ဒယ်၏ လုပ်ရပ်များကို မော်ကွန်းပြုလုပ်သည်။ ဥပမာ တစ်ခုမှာ COVID-19 ရောဂါဖြန့်ပြားမှုကို ကမ္ဘာတစ်ဝှမ်း၌ ခန့်မှန်းခဲ့သည့်အခါ တွေ့ရှိခဲ့သည်။ ညီမျှသောနည်းလမ်းဖြင့် မြို့တော်ယာဉ်လမ်းကြောင်းများကို မော်ဒယ်ရေးပြီး ယာဉ်အလှုပ်အရှားများအပေါ် တရားဥပဒေပြောင်းလဲမှုတွေ့သော လှိုင်းထွက်မှုကို ကြည့်ရှုနိုင်သည်။ +* ရှုပ်ထွေးသော အလိုအလျောက်စနစ်များတွင် ကိရိယာတစ်ခုချင်းစီသည် လွတ်လပ်သော အေဂျင့်တစ်ခုအဖြစ် လုပ်ဆောင်နိုင်ပြီး စနစ်တစ်ခုလုံးကို တစ်ခုတည်းခြင်းမှ ကင်းလွတ်ပြီး ခိုင်မာစေသည်။ -ကျွန်ုပ်တို့သည် multi-agent systems အကြောင်းကို အလွန်နက်ရှိုင်းစွာ မလေ့လာပါ၊ သို့သော် **Multi-Agent Modeling** ၏ ဥပမာတစ်ခုကို စဉ်းစားပါမည်။ +မျိုးစုံအေဂျင့်စနစ်များအကြောင်း အနက်ကြီးထဲသို့ မဝင်သွားပါဘဲ၊ **မျိုးစုံအေဂျင့် မော်ဒယ်တွက်ချက်ခြင်း** တစ်ခုကို နမူနာပြကြမည်။ ## NetLogo -[NetLogo](https://ccl.northwestern.edu/netlogo/) သည် [Logo](https://en.wikipedia.org/wiki/Logo_(programming_language)) programming language ၏ ပြင်ဆင်ထားသော version အပေါ် အခြေခံထားသော multi-agent modeling environment ဖြစ်သည်။ ၎င်းသည် programming concepts များကို ကလေးများကို သင်ကြားရန် ဖန်တီးထားပြီး **turtle** ဟုခေါ်သော agent ကို ထိန်းချုပ်နိုင်သည်။ turtle သည် trace ကို ကျန်ထားပြီး ရွှေ့နိုင်သည်။ ၎င်းသည် agent ၏ အပြုအမူကို နားလည်ရန် ရှုပ်ထွေးသော geometric figures များကို ဖန်တီးရန် visual နည်းလမ်းတစ်ခုဖြစ်သည်။ +[NetLogo](https://ccl.northwestern.edu/netlogo/) သည် ပြင်ဆင်ထားသော [Logo](https://en.wikipedia.org/wiki/Logo_(programming_language)) ပrogramming ဘာသာစကားအခြေခံ၍ ဆောက်ထားသော မျိုးစုံအေဂျင့် မော်ဒယ်တွက်ချက်ပတ်ဝန်းကျင်ဖြစ်သည်။ ၎င်း ဘာသာစကားကို ကလေးများအတွက် ပရိုဂရမ်းမင်း အယူအဆများသင်ကြားရန် ဖန်တီးထားပြီး၊ **kura** ဟုခေါ်သော အေဂျင့်ကို ထိန်းချုပ်နိုင်သည်၊ kura သည် လှည့်စားပြီး လမ်းလျှောက်နိုင်သည်။ ၎င်းသည် ချိတ်ဆက်ထားသော သံတမန်များဖန်တီးရန် အခြေခံဖောင် အနေဖြင့် အသုံးပြုနိုင်သည်။ -NetLogo တွင် `create-turtles` command ကို အသုံးပြု၍ turtle များစွာကို ဖန်တီးနိုင်သည်။ ထို့နောက် turtle များအားလုံးကို လုပ်ဆောင်မှုတစ်ခုခုကို လုပ်ဆောင်ရန် command ပေးနိုင်သည် (အောက်ပါဥပမာတွင် - 10 point forward ရွှေ့ရန်): +NetLogo တွင် `create-turtles` ကမ်းမလေးကို အသုံးပြု၍ kura များစွာ ဖန်တီးနိုင်သည်။ ထိုနောက် kura များအားလုံးကို လုပ်ဆောင်ရန်အမိန့် ပေးနိုင်သည် (နမူနာတွင် - ၁၀ ချက်အထိ ရှေ့သို့ရွေ့သည်)။ ``` create-turtles 10 @@ -41,39 +41,39 @@ ask turtles [ ] ``` -တစ်ချို့သော turtle များကို `ask` command ဖြင့် အုပ်စုဖွဲ့၍ လုပ်ဆောင်မှုများကို လုပ်ဆောင်နိုင်သည်။ ဥပမာအားဖြင့် တစ်ခုချင်းစီသော point ၏ အနီးအနားရှိ turtle များကို command ပေးနိုင်သည်။ ထို့အပြင် `breed [cats cat]` command ကို အသုံးပြု၍ turtle များကို *breeds* အမျိုးအစားများဖြင့် ဖန်တီးနိုင်သည်။ ဤနေရာတွင် `cat` သည် breed ၏ အမည်ဖြစ်ပြီး singular နှင့် plural စကားလုံးနှစ်ခုစလုံးကို သတ်မှတ်ရန် လိုအပ်သည်။ command များက ပိုမိုရှင်းလင်းစေရန် အမျိုးအစားကွဲပြားမှုကို အသုံးပြုသည်။ +တကယ်တော့ kura အားလုံးတူတူ လုပ်ဆောင်ကြတာ မစိတ်ဝင်စားဖွယ် မဟုတ်ပါလို့ `ask` ဖြင့် kura အုပ်စုတစ်စုကို မေးမြန်းနိုင်သည်၊ ဥပမာ အချို့ kura များသည် အတိအကျ တစ်နေရာလည်းအနီးအစပ်တွင်ရှိသည် ဟု အမှတ်အသားပြုနိုင်သည်။ လဲပြောင်းနိုင်သော kura အမျိုးအစားများကို `breed [cats cat]` ကမ်းမလေးဖြင့်ဖန်တီးနိုင်သည်။ ဒီမှာ `cat` သည် အမျိုးအစား အမည်ဖြစ်ပြီး၊ တစ်ခုချင်းနှင့် များစုဖြစ်စေရန် ဖော်ပြရပါမည်၊ အကြောင်းက ကမ်းမလေး အမျိုးမျိုးသည် ဖော်ပြပုံကွဲပြားမှု ရှိပါသည်။ -> ✅ NetLogo language ကို သင်ယူရန် ကျွန်ုပ်တို့ မသွားပါ။ သို့သော် [Beginner's Interactive NetLogo Dictionary](https://ccl.northwestern.edu/netlogo/bind/) ကို သွားရောက်လေ့လာနိုင်သည်။ +> ✅ NetLogo ဘာသာစကားကို မပေါက်ဖွားရန် ကြိုးစားတော့မည်မဟုတ်ပါ - ပိုမိုသိရှိလိုသူများအတွက် ထူးချွန်သော [အစွမ်းထက် စတင်သင်ကြားရေး NetLogo အဘိဓါန်](https://ccl.northwestern.edu/netlogo/bind/) ကို တွေ့ရှိနိုင်သည်။ -NetLogo ကို [download](https://ccl.northwestern.edu/netlogo/download.shtml) လုပ်ပြီး install လုပ်ကာ စမ်းသပ်နိုင်သည်။ +NetLogo ကို [ဒေါင်းလုဒ်](https://ccl.northwestern.edu/netlogo/download.shtml) လုပ်ပြီး တပ်ဆင်ပြီး စမ်းသပ်နိုင်သည်။ -### Models Library +### မော်ဒယ်များ စုစည်းရာစာရင်း -NetLogo ၏ အထူးကောင်းမွန်မှုမှာ ၎င်းတွင် စမ်းသပ်နိုင်သော working models များ library ပါဝင်သည်။ **File → Models Library** သို့ သွားပါ၊ ၎င်းတွင် models အမျိုးအစားများစွာ ရွေးချယ်နိုင်သည်။ +NetLogo ၏ ပိုမိုကောင်းမွန်သော အချက်တစ်ခုမှာ စမ်းသပ်နိုင်သော အသုံးပြုပုံ မော်ဒယ် စာကြည့်တိုက်ပါရှိခြင်း ဖြစ်သည်။ **File → Models Library** ကို ဝင်ရောက်ပြီး မော်ဒယ် များစွာရှိသည့် အမျိုးအစားများကို ရွေးချယ်နိုင်သည်။ NetLogo Models Library -> Dmitry Soshnikov ၏ models library screenshot +> Dmitry Soshnikov မှ လက်ခံရရှိသော မော်ဒယ် စာကြည့်တိုက်၏ ရုပ်ပုံတစ်ခု -models တစ်ခုကို ဖွင့်နိုင်သည်၊ ဥပမာအားဖြင့် **Biology → Flocking** ကို ဖွင့်ပါ။ +မော်ဒယ်တစ်ခု ဖွင့်ကြည့်နိုင်ပြီး ဥပမာအားဖြင့် **Biology → Flocking** ကို ရွေးချယ်နိုင်သည်။ -### Main Principles +### အဓိက ယဥ်ကျေးမှုပဲြ -model ကို ဖွင့်ပြီးနောက် NetLogo ၏ အဓိက screen သို့ ရောက်ရှိသည်။ ဤနေရာတွင် finite resources (grass) ရှိသော wolves နှင့် sheep ၏ population ကို ဖော်ပြသော sample model တစ်ခုကို တွေ့နိုင်သည်။ +မော်ဒယ်ဖွင့်သည်နှင့် စနစ်တန်းတွင် NetLogo ဖြင့် ပင်မ စခန်းသို့ ရောက်ရှိမည်။ ၎င်းမှာ အငွေ့အမြစ်စနစ်ရှိပြီး သားနားချင့်နှင့် ပြေးရဲတို့၏ လူဦးရေသတ်မှတ်ချက် ပါရှိသော မော်ဒယ်နမူနာဖြစ်သည်။ ![NetLogo Main Screen](../../../../../translated_images/my/NetLogo-Main.32653711ec1a01b3.webp) -> Dmitry Soshnikov ၏ screenshot +> Dmitry Soshnikov မှ ရိုက်ကူးထားသော ရုပ်ပုံ -ဤ screen တွင် တွေ့နိုင်သည်- +ဒီ စခရင်တွင်၊ တွေ့နိုင်သော အရာများမှာ - -* **Interface** အပိုင်းတွင်: - - Agent များနေထိုင်သော main field - - Buttons, sliders စသည်ဖြင့် controls များ - - Simulation ၏ parameters များကို ဖော်ပြရန် graphs -* **Code** tab တွင် NetLogo program ကို ရေးသားရန် editor ပါဝင်သည်။ +* **အင်တာဖေ့စ် (Interface)** ကိုယ်အပိုင်းမှာ - + - အေဂျင့်များရာ မြေပြင်အဓိက ကွင်း + - ခလုတ်များ၊ တဟောင်းလျှော့ခြင်းများ စသည့် ထိန်းချုပ်မှုများ + - စမ်းသပ်မှု ပရမတ်တာများပြပါ Graph များ +* **ကုဒ် (Code)** အစိတ်အပိုင်းမှာ NetLogo ပရိုဂရမ်း ရေးရန်အတွက် အယ်ဒီတာပါရှိသည် -Interface တွင် **Setup** button ပါဝင်ပြီး simulation state ကို initialize လုပ်သည်။ **Go** button သည် execution ကို စတင်သည်။ ၎င်းတို့ကို code တွင် အောက်ပါ handler များဖြင့် ထိန်းချုပ်သည်- +များသောအားဖြင့် အင်တာဖေ့စ်တွင် **Setup** ခလုတ်ရှိပြီး စမ်းသပ်မှုအဆင့် စတင်ရန်တာဝန်ယူပြီး၊ **Go** ခလုတ်က စတင် လည်ပတ်စေသည်။ ၎င်းတို့အတွက်နောက်တွင် အောက်ပါ ကုဒ်အတိုင်း handler အား စီမံထားသည်။ ``` to go [ @@ -81,52 +81,79 @@ to go [ ] ``` -NetLogo ၏ ကမ္ဘာသည် အောက်ပါ objects များဖြင့် ဖွဲ့စည်းထားသည်- +NetLogo ၏ ကမ္ဘာမှာ အောက်ပါ အရာများပါ၀င်သည် - -* **Agents** (turtles) သည် field အတွင်း ရွှေ့နိုင်ပြီး တစ်ခုခုလုပ်ဆောင်နိုင်သည်။ `ask turtles [...]` syntax ကို အသုံးပြု၍ agent များအား command ပေးနိုင်သည်။ brackets အတွင်း code ကို *turtle mode* တွင် agent များအားလုံးက လုပ်ဆောင်သည်။ -* **Patches** သည် field ၏ square areas ဖြစ်ပြီး agent များနေထိုင်သည်။ patch အပေါ်ရှိ agent များအားလုံးကို ရည်ညွှန်းနိုင်သည်၊ patch color များနှင့် properties များကို ပြောင်းနိုင်သည်။ `ask patches` ကို အသုံးပြု၍ patch များကို တစ်ခုခုလုပ်ဆောင်စေနိုင်သည်။ -* **Observer** သည် unique agent ဖြစ်ပြီး ကမ္ဘာကို ထိန်းချုပ်သည်။ Button handler များကို *observer mode* တွင် လုပ်ဆောင်သည်။ +* **အေဂျင့်များ (turtles)** စုစုပေါင်း ကွင်းများပေါ်တွင် လှုပ်ရှားပြီး လုပ်ဆောင်သည်။ `ask turtles [...]` စနစ်ကိုအသုံး ပြု၍ အေဂျင့်များကို အမိန့်ပေးပြီး bracket ဗဟိုတည်နေရာတွင် ရေးထားသည့်ကုဒ်များကို တဖြည်းဖြည်း စီရင်ထားသော *turtle mode*မှာ လုပ်ဆောင်ကြသည်။ +* **Patches** ဟာ ကွင်းတွင် စတုရန်း အကျယ်ရှိသောနယ်မြေများဖြစ်ပြီး အေဂျင့်များ စွန့်ဝင်နေရာဖြစ်သည်။ တူညီသော patch တွင်ရှိသောအေဂျင့်များကို ဆက်သွယ်နိုင်ပြီး၊ patch အရောင်များ ပုံသေနည်းများပြင်နိုင်သည်။ `ask patches` ကိုလည်း အသုံးပြုနိုင်သည်။ +* **Observer** ဆိုသည်မှာ ကမ္ဘာကို ထိန်းချုပ်သော ထူးခြားသော အေဂျင့်ဖြစ်ပြီး။ ခလုတ်များ handler တွေကို *observer mode* တွင် လုပ်ဆောင်သည်။ -> ✅ Multi-agent environment ၏ အလှတရားမှာ turtle mode သို့မဟုတ် patch mode တွင် လုပ်ဆောင်သော code ကို agent များအားလုံးက တစ်ချိန်တည်းတွင် parallel အဖြစ် လုပ်ဆောင်သည်။ ထို့ကြောင့် agent တစ်ခုချင်းစီ၏ အပြုအမူကို programming လုပ်၍ simulation system တစ်ခုလုံး၏ ရှုပ်ထွေးသော အပြုအမူကို ဖန်တီးနိုင်သည်။ +> ✅ မျိုးစုံအေဂျင့် ပတ်ဝန်းကျင်၏ အားသာချက်မှာ turtle mode နှင့် patch mode တွင် ကုဒ်များကို တပြိုင်နက် စုပေါင်းလည်ပတ်နိုင်ခြင်း ဖြစ်သည်။ ထိုကြောင့် ပုဂ္ဂိုလ်အသီးသီး၏ လုပ်ဆောင်မှုကို အနည်းငယ်ပေါင်းပြီး စနစ်တစ်ခုလုံး၏ ရေရှည်လှုပ်ရှားမှုကို ဖန်တီးနိုင်သည်။ -### Flocking +### Flocking (အုပ်စုတက်ခြင်း) -Multi-agent အပြုအမူ၏ ဥပမာအနေနှင့် **[Flocking](https://en.wikipedia.org/wiki/Flocking_(behavior))** ကို စဉ်းစားပါ။ Flocking သည် ဂဏန်းပေါင်းများစွာသော ငှက်များ ပျံသန်းပုံနှင့် ဆင်တူသော ရှုပ်ထွေးသော pattern ဖြစ်သည်။ ၎င်းတို့၏ ပျံသန်းပုံကို ကြည့်ရှုသောအခါ ၎င်းတို့သည် collective algorithm တစ်ခုခုကို လိုက်နာသည်ဟု သို့မဟုတ် *collective intelligence* တစ်ခုခုကို ပိုင်ဆိုင်သည်ဟု ထင်ရသည်။ သို့သော် ဤရှုပ်ထွေးသော အပြုအမူသည် agent တစ်ခုချင်းစီ (ဤကိစ္စတွင် *bird*) သည် အနီးအနားရှိ agent များကိုသာ ကြည့်ရှုပြီး အောက်ပါ ရိုးရှင်းသော စည်းမျဉ်း ၃ ခုကို လိုက်နာသောအခါ ဖြစ်ပေါ်သည်- +မျိုးစုံအေဂျင့် လုပ်ဆောင်မှုနမူနာအနေနဲ့ **[Flocking](https://en.wikipedia.org/wiki/Flocking_(behavior))** ကို ဆိုလိုသည်။ Flocking သည် ငှက်အုပ်များပျံသန်းပုံနှင့် များစွာဆင်တူသော ရှုပ်ထွေးသော ပုံစံဖြစ်သည်။ ၎င်းတို့ကို ကြည့်လျှင် သက်သေပြနိုင်သော သဘာဝပေါင်းစပ်နည်း (collective algorithm) သို့မဟုတ် *စုစုပေါင်း ဉာဏ်ရည်* ရှိကြောင်း ထင်မြင်နိုင်သည်။ သို့သော် ယခု ရှုပ်ထွေးသော လုပ်ဆောင်မှုသည် လျှင်မြန်သော ကျော်သွားကာ ပတ်ဝန်းကျင်မှ နီးစပ်နေသော အေဂျင့် အချို့ကိုသာ ကြည့်ရှုကာ အောက်ပါသုံးချက်ကိုလိုက်နာသည်မှာ ဖြစ်သည် - -* **Alignment** - အနီးအနားရှိ agent များ၏ heading ပျမ်းမျှကို လိုက်နာသည်။ -* **Cohesion** - အနီးအနားရှိ agent များ၏ position ပျမ်းမျှကို လိုက်နာသည် (*long range attraction*) -* **Separation** - အခြား agent များနှင့် အလွန်နီးကပ်လာသောအခါ ရှောင်ရှားရန် ကြိုးစားသည် (*short range repulsion*) +* **ညီလာခံမှု (Alignment)** - နီးစပ်သော အေဂျင့်များ၏ ပျမ်းမျှ ဦးတည်ချက်သို့ ဦးတည်စွာ လှိုင်းထွက်အောင် လှမ်းကိုင်သည်။ +* **ပေါင်းစည်းမှု (Cohesion)** - နီးစပ်သော နေရာရပ်တည်ရာတွင် ဦးတည်ခြင်းကြောင့် (*ရှည်လျားသော ဆွဲဆောင်မှု*) +* **ခွဲခြားမှု (Separation)** - အသားတင်သော ငှက်များနီးကပ်လာလျှင် သက်ဆိုင်ရာ အကွာအဝေးကို ထားခိုင်းသော (*တိုအကွာအဝေး ပြန်ဆုတ်မှု*) -Flocking ဥပမာကို run လုပ်ပြီး အပြုအမူကို ကြည့်ရှုနိုင်သည်။ *degree of separation* သို့မဟုတ် *viewing range* ကဲ့သို့သော parameters များကို ပြောင်းလဲနိုင်သည်။ Viewing range ကို 0 သို့ လျှော့ချပါက ငှက်များအားလုံးက မျက်ကန်းဖြစ်ပြီး flocking ရပ်တန့်သည်။ Separation ကို 0 သို့ လျှော့ချပါက ငှက်များအားလုံးက တန်းတစ်ခုအဖြစ် စုပုံသည်။ +flocking နမူနာကို လည်ပတ်ကြည့်နိုင်ပြီး လုပ်ဆောင်မှုကို ကြည့်ရှုနိုင်သည်။ *ခွဲခြားမှု အတတ်နိုင်ဆုံး မှတ်ချက်* အပါအဝင် *ကြည့်ရှု အကွာအဝေး* စသည်တို့ကို စပ်ဆိုင်ပြင်ဆင်နိုင်သည်။ ကြည့်ရှု အကွာအဝေးကို 0 သို့ လျှော့ချပ်လျှင် ၎င်းတို့အားလုံးမှ မမြင်နိုင်တော့မည်နှင့် flocking လည်ပတ်မှု ရပ်တန့်သွားမည်ဟု ရှင်းပြနိုင်သည်။ ခွဲခြားမှုကို 0 သို့ နည်းအောင်ပြုလုပ်လျှင် ငှက်များသည် ညီတန်းလိုက် တစုတဝေး ရှိလာမည်ဖြစ်သည်။ -> ✅ **Code** tab သို့ ပြောင်းပြီး flocking ၏ စည်းမျဉ်း ၃ ခု (alignment, cohesion နှင့် separation) ကို code တွင် ဘယ်နေရာတွင် အကောင်အထည်ဖော်ထားသည်ကို ကြည့်ပါ။ *sight* အတွင်းရှိ agent များကိုသာ ရည်ညွှန်းပုံကို သတိပြုပါ။ +> ✅ **Code** အပိုင်းသို့ ပြောင်းလဲပြီး flocking ၏ သုံးချက် (alignment, cohesion နှင့် separation) သည် ဘယ်နေရာတွင် ကုဒ်ဖြင့် အကောင်အထည်ဖော်ထားကြောင်း ကြည့်ရှုပါ။ ရှေ့တွင်သာ ၎င်းတို့ သက်ဆိုင်ရာ အသီးသီးသော အေဂျင့်များကို ကိုးကားသည်ကို မှတ်သားပါ။ -### Other Models to see +### အခြား မော်ဒယ်တွေကို ကြည့်ရှုရန် -စမ်းသပ်နိုင်သော model များအနက် အခြား model များကို ကြည့်ရှုနိုင်သည်- +စမ်းသပ်ရန် စိတ်၀င်စားစရာ မော်ဒယ်အချို့မှာ - -* **Art → Fireworks** သည် individual fire streams များ၏ collective behavior ကို ဖော်ပြသည်။ -* **Social Science → Traffic Basic** နှင့် **Social Science → Traffic Grid** သည် traffic lights ရှိ/မရှိ 1D နှင့် 2D Grid တွင် မြို့ traffic မော်ဒယ်ကို ဖော်ပြသည်။ Simulation တွင် တစ်စီးချင်းစီသော ကားသည် အောက်ပါ စည်းမျဉ်းများကို လိုက်နာသည်- - - ရှေ့တွင် အခွင့်အာနရှိပါက အရှိန်မြှင့် (အမြင့်ဆုံးအရှိန်အထိ) - - ရှေ့တွင် အတားအဆီးကို တွေ့ပါက အရှိန်လျှော့ (driver ၏ မြင်နိုင်မှုကို ပြောင်းလဲနိုင်သည်) -* **Social Science → Party** သည် cocktail party အတွင်း လူများအုပ်စုဖွဲ့ပုံကို ဖော်ပြသည်။ အုပ်စု၏ အမြန်ဆုံး happiness တိုးတက်မှုကို ရရှိစေသော parameters များကို ရှာဖွေနိုင်သည်။ +* **အနုပညာ → ပန်းပွင့်ပဲပြည့်ခြင်း** သည် တစ်စည်းတည်းသော အပန်းပေါက် ဖောက်ခြင်းကို စုပေါင်းသော လုပ်ဆောင်မှုအဖြစ် ဖော်ပြသည်။ +* **လူမှုရေးသိပ္ပံ → Traffic Basic** နှင့် **လူမှုရေးသိပ္ပံ → Traffic Grid** သည် ၁D နှင့် ၂D grid ပုံစံဖြင့် မြို့ယာဉ်လမ်းနည်းပုံကို ပြသသည်။ ယာဉ်တစ်စီးစက်ရပ်တစ်နေရာတွင် အောက်ပါ စည်းမျဉ်းများလိုက်နာသည်။ + - ၎င်းရှေ့ရှိ နေရာ သိမ်းဆည်းမရှိလျှင် အရှိန်မြှင့်သည် (အမြင့်ဆုံးအမြန်နှုန်းအထိ) + - ရှေ့ရှိ အတားအဆီးတွေ့လျှင် ဘရိတ်ကြပ်သည် (အမြင်အကွာအဝေးကို ပြင်ဆင်နိုင်) +* **လူမှုရေးသိပ္ပံ → Party** သည် လူများသည် မိတ်ဆက်ပွဲတွင် အုပ်စုဖွဲ့၍ စုပေါင်းသင့်သည်ကို ဖော်ပြသည်။ အုပ်စု၏ ပျော်ရွှင်မှု မြန်ဆန်စေရန် ဖြစ်စဉ်များကို တွေ့ရှိနိုင်သည်။ -ဤဥပမာများမှ တွေ့ရသည့်အတိုင်း multi-agent simulations များသည် logic တူ/ဆင်တူသော individual များပါဝင်သော ရှုပ်ထွေးသော စနစ်၏ အပြုအမူကို နားလည်ရန် အလွန်အသုံးဝင်သည်။ ၎င်းကို computer games တွင် [NPCs](https://en.wikipedia.org/wiki/NPC) သို့မဟုတ် 3D animated worlds တွင် agent များကို ထိန်းချုပ်ရန် အသုံးပြုနိုင်သည်။ +ဤနမူနာများမှ တွေ့နိုင်ရာ၊ မျိုးစုံအေဂျင့် စနစ်များသည် တူညီသော် (သို့) ဆင်တူသော ဒီဇိုင်းများကို လိုက်နာသည့် စနစ်တစ်ခု၏ အလုပ်ဆောင်မှုကို နားလည်ရန် အထောက်အကူဖြစ်စေသည်။ မျိုးဆက်ဆက် လွှမ်းခြုံကာ virtual agent များ (ဥပမာ [NPC](https://en.wikipedia.org/wiki/NPC) များ၊ 3D animation ကမ္ဘာများရှိ အေဂျင့်များ) ကို ထိန်းချုပ်ရာတွင်လည်း အသုံးပြုနိုင်သည်။ -## Deliberative Agents +## စဉ်းစားထားသော အေဂျင့်များ -အထက်ဖော်ပြထားသော agent များသည် environment ၏ ပြောင်းလဲမှုများကို algorithm တစ်ခုခုဖြင့် တုံ့ပြန်သော **reactive agents** ဖြစ်သည်။ သို့သော် agent များသည် sometimes reasoning နှင့် planning လုပ်နိုင်ပြီး **deliberative** ဟုခေါ်သည်။ +အထက် ဖော်ပြသည့် အေဂျင့်များသည် ခက်ခဲမှုမရှိဘဲ ပတ်ဝန်းကျင်ပြောင်းလဲမှုများကို တုံ့ပြန်သည့် ရိုးရှင်းဆုံးအေဂျင့်များ ဖြစ်ကြသည်။ ဤလိုအမျိုးကို **ပြန်ကြောင်းအဖြေ ပြုလုပ်သူ** ဟု ခေါ်သည်။ သို့သော် မကြာခဏ အေဂျင့်များသည် အတွေးခြင်းနှင့် စီမံခြင်းတို့ကို သုံး၍ စီစဉ်လှုပ်ရှားမည်ဆိုလျှင် ၎င်းတို့ကို **စဉ်းစားထားသော** ဟု ခေါ်သည်။ -ဥပမာအားဖြင့် human မှ vacation tour ကို book လုပ်ရန် instruction ရရှိသော personal agent ကို စဉ်းစားပါ။ အင်တာနက်တွင် agent များစွာရှိပြီး ၎င်းကို ကူညီနိုင်သည်။ ၎င်းသည် flight များရရှိနိုင်မှုကို စစ်ဆေးရန်၊ hotel price များကို ရက်စွဲအလိုက် ကြည့်ရန်၊ အကောင်းဆုံးစျေးနှုန်းကို ညှိနှိုင်းရန် အခြား agent များကို ဆက်သွယ်ရမည်။ Vacation plan ကို owner မှ အတည်ပြုပြီးနောက် booking လုပ်နိုင်သည်။ +ဥပမာတစ်ခုမှာ လူ့အမိန့်ခံ၍ ခရီးသွားအစီအစဉ် ကို ရယူရန် ပုဂ္ဂိုလ်ရေး အေဂျင့်ဖြစ်သည်။ အင်တာနက်ပေါ်မှာ အကူအညီပေးနိုင်သော အေဂျင့်များစွာ ရှိသည်။ ထိုအေဂျင့်တွင် ခရီးသွားလေကြောင်းပျံသန်းမှုရှိသည့်နေရာများနှင့် ဟိုတယ်စျေးနှုန်းများကို စုံစမ်းရန် နောက်ထပ် အေဂျင့်များကို ဆက်သွယ်ပြီး အကောင်းဆုံး စျေးနှုန်းရရှိရန် ဆွေးနွေးမည်။ ခရီးစီမံချက် အတည်ပြုပြီးနောက်မှာမှာကြားမှုဆောင်ရွက်မည်။ -ဤလုပ်ဆောင်မှုအတွက် agent များသည် **communicate** လုပ်ရန် လိုအပ်သည်။ အောင်မြင်သော communication အတွက် ၎င်းတို့သည်- +၎င်းတို့သည် ဆက်သွယ်ဆက်ဆံရန်လိုအပ်သည်။ သေချာသော ဆက်သွယ်မှုအတွက် အောက်ပါအချက်များလိုအပ်သည်။ -* [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) ကဲ့သို့သော **knowledge ကို ဖလှယ်ရန် standard languages** တစ်ခုခုလိုအပ်သည်။ ၎င်းတို့ကို [Speech Act theory](https://en.wikipedia.org/wiki/Speech_act) အပေါ် အခြေခံ၍ ဖန်တီးထားသည်။ -* **Negotiations protocols** များနှင့် **auction types** များအပေါ် အခြေခံ၍ protocols ပါဝင်ရမည်။ -* **Common ontology** တစ်ခုလိုအပ်သည်၊ ထို့ကြောင့် semantics ကို သိရှိပြီး concept များကို ရည်ညွှန်းနိုင်သည်။ -* **Discover** လုပ်နိုင်ရန် နည်းလမ်းတစ်ခုလိုအပ်သည်၊ ၎င်းကို ontology အပေါ် အခြေခံထားသည်။ +* [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) အပေါ် မူတည်၍ ဒီဇိုင်းပြီး။ +* နေရာချိန်း ဆွေးနွေးမှုများအတွက် **မူဝါဒ(ပရိုတိုကော)များ** ပါဝင်ရန်လိုအပ်သည်၊ အမျိုးမျိုးသော **အော်ကေးရှင်းပုံစံများ** ပေါ် မူတည်၍။ +* တူညီသည့် အယူအဆကို ရည်ညွှန်းရန်အတွက် **ရင်းမြစ်အကြောင်းအရာ (ontology)** ရှိရန်လိုအပ်သည်။ +* ၎င်းတို့ ရွေးချယ်နိုင်သော အခြားအေဂျင့်များ၏ လုပ်နိုင်မှုများကို လေ့လာ ရှာဖွေရန် ကိရိယာ တစ်ခုလိုအပ်သည်၊ ရင်းမြစ်အကြောင်းအရာအပေါ် မူတည်၍။ -Deliberative agents မ +စဉ်းစားထားသော အေဂျင့်များသည် ပြန်ကြောင်းအဖြေ ပြုလုပ်သူများထက် ပို၍ ရှုပ်ထွေးပြီး ပတ်ဝန်းကျင်ပြောင်းလဲမှုများအားသာ တုံ့ပြန်ခြင်းမက လှုပ်ရှားမှုများကို *စတင် ပြုလုပ်* နိုင်ရမည်ဖြစ်သည်။ စဉ်းစားထားသော အေဂျင့်များအတွက် တင်ပြထားသည့် ပုံတစ်ခုမှာ အမည်ရှိသည့် Belief-Desire-Intention (BDI) အေဂျင့်ဖြစ်သည်။ + +* **Beliefs** သည် အေဂျင့်၏ လုပ်ကိုင်သည့်ပတ်ဝန်းကျင်အကြောင်း သတင်းအချက်အလက် စုစည်းချက်ဖြစ်သည်။ ၎င်းကို knowledge base သို့မဟုတ် ပတ္တမြားချုပ်များ အဖြစ် တည်ဆောက်နိုင်ပြီး သတ်မှတ် ပတ်ဝန်းကျင် အခြေအနေ များတွင် သတ်မှတ်ဆုံးဖြတ်ချက်များ ချမှတ်ရန် အသုံးပြုသည်။ +* **Desires** သည် အေဂျင့်၏ ရွေးချယ်လိုသည့် အမူအရာ (ရည်မှန်းချက်) ကို သတ်မှတ်သည်။ ဥပမာ အထက်ဖော်ပြပါ ပုဂ္ဂိုလ်ရေး အစီအစဉ်အတွက် ရည်ရွယ်ချက်မှာ ခရီးသွား စီစဉ်ခြင်းဖြစ်ပြီး၊ ဟိုတယ် အေဂျင့်မှာ သက်ဆိုင်ရာ အမြတ်များ များပြားစေရန်ရည်ရွယ်သည်။ +* **Intentions** သည် အေဂျင့်၏ ရည်ရွယ်ချက်များအား ပြည့်မီစေရန် စီစဉ်ထားသော လုပ်ဆောင်ချက်များဖြစ်သည်။ ၎င်းတို့သည် လူမှုဆက်ဆံရေးနှင့် ပတ်ဝန်းကျင်ပြောင်းလဲမှုကို ဖြစ်စေသည်။ + +မျိုးစုံအေဂျင့်စနစ် တည်ဆောက်ရာတွင် အသုံးပြုသင့်သော ပလက်ဖောင်းများ များစွာ ရရှိနိုင်ပါသည်၊ ဥပမာ [JADE](https://jade.tilab.com/)။ [ဤစာတမ်း](https://arxiv.org/ftp/arxiv/papers/2007/2007.08961.pdf) တွင် မျိုးစုံအေဂျင့်ပလက်ဖောင်းများ များစွာနှင့် မျိုးစုံအေဂျင့်စနစ်များ၊ အသုံးပြုမှုများအကြောင်း အနှစ်ချုပ်ပါဝင်သည်။ + +## သုံးသပ်ချက် + +မျိုးစုံအေဂျင့်စနစ်များသည် မျိုးစုံပုံစံများရှိပြီး အသုံးပြုနိုင်သည့် နယ်ပယ်များစွာ တွင် အသုံးဝင်သည်။ +၎င်းတို့သည် တစ်ဦးချင်းအေဂျင့်၏ ရိုးရှင်းသော လုပ်ဆောင်မှုကို ဦးတည်ပြီး၊ **ပူးပေါင်းဆောင်ရွက်မှု ထိရောက်မှု** ကြောင့် စနစ်စုစုပေါင်း၏ ရှုပ်ထွေးသော လုပ်ဆောင်မှုထိရောက်စေသည်။ + +## 🚀 စိန်ခေါ်မှု + +ဤသင်ခန်းစာအတိုင်း လက်တွေ့လောကသို့ ယူဆောင်ပြီး ပြဿနာများကို ဖြေရှင်းနိုင်သော မျိုးစုံအေဂျင့်စနစ်ကို စဉ်းစားပါ။ ဥပမာ၊ ကျောင်းယာဉ်လမ်းကြောင်း ကောင်းမွန်စေရန် မျိုးစုံအေဂျင့် စနစ်သည် ဘာလုပ်ရမည်နည်း? မုန့်ဖုတ်ဂိုဒေါင်တွင် ပြင်ဆင်နိုင်မည့်နည်းလမ်းများက ဘာတွေလဲ? + +## [ဘာသာရပ်မှတ်ချက် မေးခွန်းများ](https://ff-quizzes.netlify.app/en/ai/quiz/46) + +## ပြန်လည်သုံးသပ်ခြင်းနှင့် ကိုယ်တိုင်လေ့လာခြင်း + +ထိုစနစ်မျိုးကို စက်မှုလုပ်ငန်း (manufacturing) သို့မဟုတ် ဗီဒီယိုဂိမ်း စက်မှုကဏ္ဍ (game industry) ကဲ့သို့သော နယ်ပယ်များအတွက် သုံးစွဲပုံကို သုံးသပ်ကြည့်ပါ။ မျိုးစုံအေဂျင့်စနစ်များသည် ထူးခြားသော ပြဿနာများကို မည်သို့ ဖြေရှင်းနိုင်ကြောင်း သိရှိပါ။ + +## [NetLogo အတွက် တာဝန်](assignment.md) --- + +**ပြောကြားချက်** +ဤစာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှန်ကန်မှုအတွက် ကြိုးပမ်းနေသော်လည်း၊ စက်ကိရိယာဘာသာပြန်ခြင်းများတွင် အမှားများ သို့မဟုတ် မှားယွင်းချက်များ ပါဝင်နိုင်ကြောင်း သတိပြုပါရန် လိုအပ်ပါသည်။ မူလစာတမ်းကို မူရင်းဘာသာဖြင့်သာ ယုံကြည်စိတ်ချရသော အချက်အလက်အဖြစ် သတ်မှတ်သင့်သည်။ အရေးကြီးသည့် သတင်းအချက်အလက်များအတွက် ပရော်ဖက်ရှင်နယ် လူသားဘာသာပြန်သူဝန်ဆောင်မှုကို အကြံပြုပါသည်။ ဤဘာသာပြန်ချက်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော နားလည်မှုကွာခြားမှုများ သို့မဟုတ် မမှန်ကန်သော အသုံးပြုမှုများအတွက် ကျွန်ုပ်တို့ တာဝန်မခံပါ။ + \ No newline at end of file diff --git a/translations/ne/.co-op-translator.json b/translations/ne/.co-op-translator.json index fab80111e3..fd16b1cdbd 100644 --- a/translations/ne/.co-op-translator.json +++ b/translations/ne/.co-op-translator.json @@ -5,6 +5,12 @@ "source_file": "AGENTS.md", "language_code": "ne" }, + "CONTRIBUTING.md": { + "original_hash": "c6fd7e781b67111a90abd166d0ce4aa0", + "translation_date": "2026-07-08T22:02:24+00:00", + "source_file": "CONTRIBUTING.md", + "language_code": "ne" + }, "README.md": { "original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b", "translation_date": "2026-04-06T20:42:01+00:00", @@ -17,6 +23,19 @@ "source_file": "SECURITY.md", "language_code": "ne" }, + "__translation_failures__": { + "lessons/sketchnotes/LICENSE.md": { + "original_hash": "45ab63a2cd8f5faef6c9b150618837a4", + "source_file": "lessons/sketchnotes/LICENSE.md", + "language_code": "ne", + "failure_date": "2026-07-08T21:53:34+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:22+00:00", @@ -54,8 +73,8 @@ "language_code": "ne" }, "examples/README.md": { - "original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7", - "translation_date": "2025-10-03T11:29:19+00:00", + "original_hash": "7883d52c2e2a221e0b07a7b112a149b9", + "translation_date": "2026-07-08T21:49:52+00:00", "source_file": "examples/README.md", "language_code": "ne" }, @@ -66,8 +85,8 @@ "language_code": "ne" }, "lessons/0-course-setup/how-to-run.md": { - "original_hash": "a4717bd9103b9f6cd84d534b83534689", - "translation_date": "2026-01-15T13:12:45+00:00", + "original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1", + "translation_date": "2026-07-08T21:50:12+00:00", "source_file": "lessons/0-course-setup/how-to-run.md", "language_code": "ne" }, @@ -191,6 +210,12 @@ "source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md", "language_code": "ne" }, + "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": { + "original_hash": "99b816b6a4957ef4100cee4c4221dff9", + "translation_date": "2026-07-08T21:42:44+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", + "language_code": "ne" + }, "lessons/4-ComputerVision/08-TransferLearning/lab/README.md": { "original_hash": "7765935c35fcee69b9fe2d0cfd6963e2", "translation_date": "2025-08-26T09:53:14+00:00", @@ -330,8 +355,8 @@ "language_code": "ne" }, "lessons/5-NLP/README.md": { - "original_hash": "8ef02a9318257ea140ed3ed74442096d", - "translation_date": "2025-08-26T08:05:24+00:00", + "original_hash": "038df6f1a73e49f6430740da083bfd6d", + "translation_date": "2026-07-08T21:50:36+00:00", "source_file": "lessons/5-NLP/README.md", "language_code": "ne" }, @@ -355,7 +380,7 @@ }, "lessons/6-Other/23-MultiagentSystems/README.md": { "original_hash": "38a1185ae3d54b180378bbd71ae3ef16", - "translation_date": "2025-09-23T07:14:43+00:00", + "translation_date": "2026-07-08T21:54:23+00:00", "source_file": "lessons/6-Other/23-MultiagentSystems/README.md", "language_code": "ne" }, diff --git a/translations/ne/CONTRIBUTING.md b/translations/ne/CONTRIBUTING.md new file mode 100644 index 0000000000..3a576c19f1 --- /dev/null +++ b/translations/ne/CONTRIBUTING.md @@ -0,0 +1,29 @@ +# AI-For-Beginners मा योगदान दिनुहोस् + +AI-For-Beginners मा योगदान दिनु भएकोमा धन्यवाद! हामी अनुवाद, पाठ सुधार, र फर्म्याटिङ सुधारहरू स्वागत गर्दछौं। + +## माइक्रोसफ्ट कन्क्रिब्युटर लाइसेन्स एग्रीमेन्ट (CLA) + +यो परियोजनाले योगदान र सुझावहरू स्वागत गर्दछ। अधिकांश योगदानहरूका लागि तपाईंले कन्क्रिब्युटर लाइसेन्स एग्रीमेन्ट (CLA) मा सहमति जनाउनुपर्ने हुन्छ जसले तपाईंलाई तपाईंको योगदान प्रयोग गर्ने अधिकार दिन्छ। विवरणको लागि, [https://cla.microsoft.com](https://cla.microsoft.com) भ्रमण गर्नुहोस्। + +तपाईंले पुल रिक्वेस्ट पठाउँदा, CLA-बोटले स्वतः पत्ता लगाउनेछ कि तपाईंले CLA प्रदान गर्नु आवश्यक छ वा छैन र PR लाई उपयुक्त रूपमा चिन्ह लगाउनेछ (जस्तै, लेबल, टिप्पणी)। केवल बोटले दिएको निर्देशनहरू पालना गर्नुहोस्। हामीले हाम्रो CLA प्रयोग गर्ने सबै रिपोजिटोरीहरूमा तपाईंलाई यो एकपटक मात्र गर्नुपर्नेछ। + +## कसरी योगदान गर्ने + +### 1. टाइपो / कोड त्रुटिहरू सुधार गर्ने +यदि तपाईंले कुनै Jupyter नोटबुक वा पाठ मार्कडाउन फाइलमा टाइपो वा बग भेट्टाउनु भयो भने: +1. रिपोजिटोरी फोर्क गर्नुहोस्। +2. टाइपो वा बिग्रेको लिंक सुधार्नुहोस्। +3. सुधारको स्पष्ट वर्णन सहित पुल रिक्वेस्ट पेश गर्नुहोस्। + +### 2. अनुवाद पेश गर्ने +हामी पाठ्यक्रमहरूलाई अन्य भाषामा अनुवाद गर्न स्वागत गर्दछौं! कृपया `translations/` डिरेक्टोरी भित्र, त्यहाँ भएका फोल्डर नामहरू प्रयोग गरेर अनुवादहरू राख्नुहोस् (जस्तै `translations/es/`, `translations/pt-BR/`, `translations/zh-CN/`)। + +थप विवरणहरूको लागि, [etc/CONTRIBUTING.md](etc/CONTRIBUTING.md) हेर्नुहोस्। + +--- + + +**अस्वीकरण**: +यो दस्तावेज़ AI अनुवाद सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) प्रयोग गरेर अनुवाद गरिएको हो। हामी सही हुन प्रयास गर्छौं, तर कृपया जानकार हुनुस् कि स्वचालित अनुवादमा त्रुटिहरू वा अशुद्धताहरू हुन सक्छन्। मूल दस्तावेज़ यसको मूल भाषामा आधिकारिक स्रोत मानिनुपर्छ। महत्वपूर्ण जानकारीका लागि व्यावसायिक मानव अनुवाद सिफारिस गरिन्छ। यस अनुवादको प्रयोगबाट उत्पन्न कुनै पनि गलत बुझाइ वा त्रुटिको लागि हामी जिम्मेवार छैनौं। + \ No newline at end of file diff --git a/translations/ne/examples/README.md b/translations/ne/examples/README.md index 21d29780c2..0d0c49a32c 100644 --- a/translations/ne/examples/README.md +++ b/translations/ne/examples/README.md @@ -1,31 +1,31 @@ -# सुरु गर्न सजिलो एआई उदाहरणहरू +# सुरूवातीहरूका लागि मैत्रीपूर्ण एआई उदाहरणहरू -स्वागत छ! यो डाइरेक्टरीले एआई र मेसिन लर्निङमा सुरु गर्न मद्दत गर्ने सरल, स्वतन्त्र उदाहरणहरू समावेश गर्दछ। प्रत्येक उदाहरणलाई विस्तृत टिप्पणीहरू र चरणबद्ध व्याख्याका साथ सुरु गर्न सजिलो बनाइएको छ। +स्वागत छ! यो डाइरेक्टरीमा एआई र मेसिन लर्निंग सुरु गर्न सरल, स्वतन्त्र उदाहरणहरू समावेश गरिएको छ। प्रत्येक उदाहरणलाई सुरुवातकर्ताका लागि अनुकूल बनाएर विस्तृत टिप्पणीहरू र चरण-दर-चरण व्याख्याहरू सहित डिजाइन गरिएको छ। ## 📚 उदाहरणहरूको अवलोकन -| उदाहरण | विवरण | कठिनाई | पूर्वशर्तहरू | +| उदाहरण | विवरण | कठिनाई | आवश्यकताहरू | |---------|-------------|------------|---------------| -| [Hello AI World](../../../examples/01-hello-ai-world.py) | तपाईंको पहिलो एआई प्रोग्राम - साधारण ढाँचा पहिचान | ⭐ सुरु गर्ने | 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) | पूर्व-प्रशिक्षित मोडेलले तस्बिर वर्गीकरण गर्नुहोस् | ⭐⭐ शुरुवाती+ | पाइथन, नम्पाइ | +| [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 वातावरण प्रयोग गर्नुहोस्: +वा मुख्य पाठ्यक्रमबाट कन्डा वातावरण प्रयोग गर्नुहोस्: ```bash conda env create --name ai4beg --file ../environment.yml @@ -34,52 +34,54 @@ conda activate ai4beg ### उदाहरणहरू चलाउने तरिका -**Python स्क्रिप्ट (.py फाइलहरू) को लागि:** +**पाइथन स्क्रिप्टहरू (.py फाइलहरू) का लागि:** ```bash python 01-hello-ai-world.py ``` -**Jupyter नोटबुक (.ipynb फाइलहरू) को लागि:** +**जुपिटर नोटबुकहरू (.ipynb फाइलहरू) का लागि:** ```bash jupyter notebook 03-image-classifier.ipynb ``` -## 📖 सिक्ने मार्ग +## 📖 सिकाइ मार्ग -हामी उदाहरणहरू क्रमबद्ध रूपमा पालना गर्न सिफारिस गर्छौं: +हामी सिफारिस गर्दछौं कि निम्न क्रममा उदाहरणहरू पालना गर्नुहोस्: -1. **"Hello AI World" बाट सुरु गर्नुहोस्** - ढाँचा पहिचानको आधारभूत कुरा सिक्नुहोस् -2. **Simple Neural Network बनाउनुहोस्** - न्यूरल नेटवर्क कसरी काम गर्छ बुझ्नुहोस् -3. **Image Classifier प्रयास गर्नुहोस्** - वास्तविक छविहरूसँग एआईलाई काममा देख्नुहोस् -4. **Text Sentiment विश्लेषण गर्नुहोस्** - प्राकृतिक भाषा प्रशोधन अन्वेषण गर्नुहोस् +1. **"Hello AI World" बाट सुरु गर्नुहोस्** - ढाँचा पहिचानका आधारहरू सिक्नुहोस् +2. **एक सरल न्यूरल नेटवर्क बनाउनुहोस्** - न्यूरल नेटवर्क कसरी काम गर्छ बुझ्नुहोस् +3. **तस्बिर वर्गीकरण प्रयास गर्नुहोस्** - वास्तविक तस्बिरहरूसँग एआईको क्रियाकलाप हेर्नुहोस् +4. **पाठ भावना विश्लेषण गर्नुहोस्** - प्राकृतिक भाषा प्रशोधन अन्वेषण गर्नुहोस् -## 💡 सुरु गर्नेहरूको लागि सुझावहरू +## 💡 शुरुवातकर्ताका लागि सुझावहरू -- **कोड टिप्पणीहरू ध्यानपूर्वक पढ्नुहोस्** - तिनीहरूले प्रत्येक लाइन के गर्छ भनेर व्याख्या गर्छन् -- **प्रयोग गर्नुहोस्!** - मानहरू परिवर्तन गरेर के हुन्छ हेर्न प्रयास गर्नुहोस् -- **सबै कुरा बुझ्न चिन्ता नगर्नुहोस्** - सिक्न समय लाग्छ -- **प्रश्न सोध्नुहोस्** - [Discussion board](https://github.com/microsoft/AI-For-Beginners/discussions) प्रयोग गर्नुहोस् +- **कोड टिप्पणीहरू सावधानीपूर्वक पढ्नुहोस्** - तिनीहरूले प्रत्येक लाइनले के गर्छ भन्ने बताउँछन् +- **प्रयोग गर्नुहोस्!** - मानहरू परिवर्तन गरेर के हुन्छ अनुभव गर्नुहोस् +- **सब थाहा नपाए पनि चिन्ता नगर्नुहोस्** - सिक्न समय लाग्छ +- **प्रश्न सोध्न नहिचकिचाउनुहोस्** - [चर्चा बोर्ड](https://github.com/microsoft/AI-For-Beginners/discussions) प्रयोग गर्नुहोस् -## 🔗 अर्को चरणहरू +## 🔗 अर्को कदमहरू -यी उदाहरणहरू पूरा गरेपछि, पूर्ण पाठ्यक्रम अन्वेषण गर्नुहोस्: -- [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 परिचय](../lessons/1-Intro/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) प्रयोग गरेर अनुवाद गरिएको हो। हामी यथासम्भव शुद्धता सुनिश्चित गर्न प्रयास गर्छौं, तर कृपया ध्यान दिनुहोस् कि स्वचालित अनुवादमा त्रुटिहरू वा अशुद्धताहरू हुन सक्छ। मूल दस्तावेज़ यसको मातृभाषामा आधिकारिक स्रोत मानिनुपर्छ। महत्वपूर्ण जानकारीको लागि, व्यावसायिक मानव अनुवाद सिफारिस गरिन्छ। यस अनुवादको प्रयोगबाट उत्पन्न हुने कुनै पनि गलतफहमी वा गलत व्याख्याको लागि हामी जिम्मेवार हुने छैनौं। \ No newline at end of file + +**अस्वीकरण**: +यो दस्तावेज़ AI अनुवाद सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) प्रयोग गरेर अनुवाद गरिएको हो। हामी सही हुन प्रयास गर्छौं, तर कृपया जानकार हुनुस् कि स्वचालित अनुवादमा त्रुटिहरू वा अशुद्धताहरू हुन सक्छन्। मूल दस्तावेज़ यसको मूल भाषामा आधिकारिक स्रोत मानिनुपर्छ। महत्वपूर्ण जानकारीका लागि व्यावसायिक मानव अनुवाद सिफारिस गरिन्छ। यस अनुवादको प्रयोगबाट उत्पन्न कुनै पनि गलत बुझाइ वा त्रुटिको लागि हामी जिम्मेवार छैनौं। + \ No newline at end of file diff --git a/translations/ne/lessons/0-course-setup/how-to-run.md b/translations/ne/lessons/0-course-setup/how-to-run.md index bb96774bfa..d21a1109a1 100644 --- a/translations/ne/lessons/0-course-setup/how-to-run.md +++ b/translations/ne/lessons/0-course-setup/how-to-run.md @@ -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)** स्थापना गर्नु हो - यो हल्का तौलको स्थापना हो जुन `conda` प्याकेज व्यवस्थापकलाई विभिन्न Python **भर्चुअल वातावरणहरू** को लागि समर्थन गर्दछ। -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 प्रयोग गर्दै +### Python एक्सटेन्सन सहित Visual Studio Code को प्रयोग -यो पाठ्यक्रम [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) सहित खोल्दा प्रयोग गरिन्छ। -> **Note**: तपाइँले जब रिपोजिटरी क्लोन गरी VS Code मा खोल्नुहुन्छ, तब यसले तपाईंलाई Python विस्तारहरू स्थापना गर्न स्वचालित सल्लाह दिनेछ। माथि वर्णन गरेअनुसार miniconda पनि स्थापित गर्नुपर्ने हुन्छ। +> **सूचना**: जब तपाईंले रिपोजिटरी क्लोन गरेर VS Code मा फोल्डर खोल्नुहुन्छ, यो तपाईंलाई स्वतः Python एक्सटेन्सनहरू स्थापना गर्न सुझाव दिनेछ। माथि वर्णन गरे अनुसार miniconda पनि स्थापना गर्नु पर्नेछ। -> **Note**: यदि VS Code ले रिपोजिटरीलाई कन्टेनरमा पुन: खोल्न सुझाव दिन्छ भने, स्थानीय Python स्थापना प्रयोग गर्नको लागि तपाईंले यो अस्वीकार गर्नुपर्छ। +> **सूचना**: यदि VS Code ले तपाईंलाई रिपोजिटरीलाई कन्टेनरमा पुनः खोल्न सुझाव दिन्छ भने, तपाईंले स्थानीय Python स्थापना प्रयोग गर्न यसलाई अस्वीकार गर्नुपर्छ। -### ब्राउजरमा Jupyter प्रयोग गर्दै +### ब्राउजरमा 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** बटन क्लिक गरेर codespace सुरु गर्न सक्नुहुन्छ र तुरुन्तै चलाउन थाल्न सक्नुहुन्छ। +* **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)** को प्रयोग गर्दै। [Binder](https://mybinder.org) ले GitHub मा भएका कोडहरूको परीक्षण गर्नका लागि निःशुल्क क्लाउड कम्प्युटिङ स्रोतहरू प्रदान गर्दछ। मुख्य पृष्ठमा एउटा बटन छ जसले रिपो लाई Binder मा खोल्छ - यसले छिट्टै Binder साइटमा लगिन्छ, जुन अन्तर्निहित कन्टेनर बनाउँछ र तपाईंलाई सहज तरिकाले Jupyter वेब इन्टरफेस सुरु गर्दछ। -> **Note**: दुरुपयोग रोक्न 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) वा तपाईंको संस्थान मार्फत क्लाउड पहुँच छ भने: -* [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 मार्फत यसमा जडान गर्नुहोस्। त्यसपछि तपाईंले सिधै मेसिनमा रिपो क्लोन गरेर सिक्न सुरु गर्न सक्नुहुन्छ। NC-श्रृङ्खला VM हरूमा GPU समर्थन छ। -> **Note**: केही सदस्यताहरू, जस्तै 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 नोटबुकहरू अपलोड गरेर एक-एक गरी ती कार्यान्वयन गर्न सक्नुहुन्छ। +तपाईं Google Colab पनि प्रयोग गर्न सक्नुहुन्छ, जसले केही निःशुल्क GPU समर्थन प्रदान गर्दछ, र त्यहाँ Jupyter नोटबुकहरू अपलोड गरेर एउटै एकल रूपमा चलाउन सक्नुहुन्छ। --- **अस्वीकरण**: -यस दस्तावेजलाई AI अनुवाद सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) को प्रयोग गरी अनुवाद गरिएको हो। हामी शुद्धताका लागि प्रयासरत छौं भने पनि, कृपया बुझ्नुस् कि स्वचालित अनुवादमा त्रुटि वा असंगतिले हुन सक्छ। मूल भाषामा रहेको दस्तावेजलाई अधिकारिक स्रोतको रूपमा लिनुहोस्। महत्वपूर्ण जानकारीका लागि व्यावसायिक मानवीय अनुवाद सिफारिस गरिन्छ। यस अनुवादको प्रयोगबाट हुने कुनै पनि गलतफहमी वा गलत व्याख्याका लागि हामी जिम्मेवार छैनौं। +यो दस्तावेज़ AI अनुवाद सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) प्रयोग गरेर अनुवाद गरिएको हो। हामी सही हुन प्रयास गर्छौं, तर कृपया जानकार हुनुस् कि स्वचालित अनुवादमा त्रुटिहरू वा अशुद्धताहरू हुन सक्छन्। मूल दस्तावेज़ यसको मूल भाषामा आधिकारिक स्रोत मानिनुपर्छ। महत्वपूर्ण जानकारीका लागि व्यावसायिक मानव अनुवाद सिफारिस गरिन्छ। यस अनुवादको प्रयोगबाट उत्पन्न कुनै पनि गलत बुझाइ वा त्रुटिको लागि हामी जिम्मेवार छैनौं। \ No newline at end of file diff --git a/translations/ne/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/ne/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index e09ef5dde8..1ac3dff143 100644 --- a/translations/ne/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/ne/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -4,11 +4,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# पूर्व-प्रशिक्षित मोडेलहरू र ट्रान्सफर लर्निङ\n", + "# पूर्व-प्रशिक्षित मोडेलहरू र ट्रान्सफर लर्निंग\n", "\n", - "CNN हरूलाई प्रशिक्षण दिन धेरै समय लाग्न सक्छ, र त्यसका लागि धेरै डाटा आवश्यक पर्छ। तर, धेरैजसो समय नेटवर्कले तस्बिरहरूबाट ढाँचा निकाल्न प्रयोग गर्ने उत्कृष्ट तल्लो-स्तरका फिल्टरहरू सिक्नमै बित्छ। एउटा स्वाभाविक प्रश्न उठ्छ - के हामी एउटा डाटासेटमा प्रशिक्षण गरिएको न्यूरल नेटवर्कलाई पूर्ण प्रशिक्षण प्रक्रिया बिना नै फरक तस्बिरहरू वर्गीकरण गर्न अनुकूलन गर्न सक्छौं?\n", + "CNN प्रशिक्षण गर्न धेरै समय लाग्न सक्छ, र त्यहाँ धेरै डेटा आवश्यक पर्छ। यद्यपि, धेरै समय सबैभन्दा राम्रो कम-स्तरीय फिल्टर सिक्न खर्च हुन्छ जुन नेटवर्कले तस्बिरबाट ढाँचा निकाल्न प्रयोग गर्दछ। एक स्वाभाविक प्रश्न उठ्छ - के हामी एक डेटासेटमा प्रशिक्षित न्यूरल नेटवर्कलाई प्रयोग गरी फरक तस्बिरहरूको वर्गीकरण गर्न पूर्ण प्रशिक्षण प्रक्रिया बिना अनुकूलन गर्न सक्छौं?\n", "\n", - "यस दृष्टिकोणलाई **ट्रान्सफर लर्निङ** भनिन्छ, किनभने हामी एउटा न्यूरल नेटवर्क मोडेलबाट अर्कोमा केही ज्ञान स्थानान्तरण गर्छौं। ट्रान्सफर लर्निङमा, हामी सामान्यतया एउटा पूर्व-प्रशिक्षित मोडेलबाट सुरु गर्छौं, जुन पहिले नै कुनै ठूलो तस्बिर डाटासेट, जस्तै **ImageNet**, मा प्रशिक्षण गरिएको हुन्छ। ती मोडेलहरूले सामान्य तस्बिरहरूबाट विभिन्न विशेषताहरू निकाल्न राम्रो काम गर्न सक्छन्, र धेरैजसो अवस्थामा ती निकालेका विशेषताहरूको आधारमा मात्र एउटा वर्गीकरणकर्ता निर्माण गर्दा पनि राम्रो नतिजा प्राप्त गर्न सकिन्छ।\n" + "यसलाई भनिन्छ **ट्रान्सफर लर्निंग**, किनभने हामी एउटा न्यूरल नेटवर्क मोडेलबाट अर्कोमा केही ज्ञान स्थानान्तरण गर्छौं। ट्रान्सफर लर्निंगमा, हामी सामान्यतया पूर्व-प्रशिक्षित मोडेलबाट सुरु गर्छौं, जुन केही ठूलो तस्बिर डेटासेटमा प्रशिक्षित गरिएको हुन्छ, जस्तै **ImageNet**। ती मोडेलहरूले पहिले नै साधारण तस्बिरहरूबाट विभिन्न विशेषताहरू निकाल्न राम्रो काम गर्न सक्छन्, र धेरै अवस्थामा ती निकालिएका विशेषताहरूमा आधारित क्लासिफायर बनाउँदा राम्रो परिणाम आउन सक्छ।\n" ] }, { @@ -31,9 +31,9 @@ "source": [ "## बिरालो बनाम कुकुर डेटासेट\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": [ - "> **नोट**: डेटासेटमा रहेका सबै छविहरू फ्लोटिङ पोइन्ट टेन्सरको रूपमा ०-२५५ दायरामा प्रतिनिधित्व गरिन्छ। तिनीहरूलाई न्युरल नेटवर्कमा पठाउनु अघि, हामीले ती मानहरूलाई ०-१ दायरामा स्केल गर्न आवश्यक छ। छविहरू प्लट गर्दा, हामीले त्यही गर्नुपर्छ, वा मानहरूलाई `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", @@ -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", + "* न्युरल नेटवर्कलाई इनपुट ब्याचमा लागू गरिन्छ, र परिणामको रूपमा हामीलाई 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" ] }, { @@ -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": [ - "## 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", - "अब हेरौं, के ती फिचरहरू छविहरू वर्गीकृत गर्न प्रयोग गर्न सकिन्छ। आउनुहोस्, केही छविहरूको भाग (हाम्रो अवस्थामा, ५० मिनिब्याचहरू) म्यानुअली लिऔं, र तिनका फिचर भेक्टरहरू पूर्व-गणना गरौं। यसका लागि हामी 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", + "## एउटा 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 लाई एउटा विशेषता निकाल्ने उपकरणको रूपमा काम गर्न, र यसलाई पुन: प्रशिक्षण नगरियोस्। त्यसैले, हामीले **convolutional feature extractor का तौलहरू स्थिर (freeze) गर्नुपर्नेछ**। हामी `model.layers[0]` कल गरेर नेटवर्कको पहिलो तहमा पहुँच गर्न सक्छौं, र हामीले केवल `trainable` गुणलाई `False` मा सेट गर्नुपर्नेछ।\n", + "यो मोडल एउटा इन्ड-टु-इन्ड वर्गीकरण नेटवर्क जस्तो देखिन्छ, जसले एउटा तस्बिर लिएर वर्ग फिर्ता गर्दछ। यद्यपि, जटिल कुरा भनेको हामीले VGG16 लाई फिचर एक्स्ट्र्याक्टरको रूपमा प्रयोग गर्न चाहन्छौं, र पुनः तालिम दिइनुपर्ने छैन। त्यसकारण, हामीले **कन्वोलुसनल फिचर एक्स्ट्र्याक्टरका तौलहरू फ्रीज गर्नु आवश्यक छ**। हामी नेटवर्कको पहिलो तहमा `model.layers[0]` कल गरेर पहुँच गर्न सक्छौं, र हामीले `trainable` सम्पत्ति `False` मा सेट गर्नुपर्नेछ।\n", "\n", - "> **Note**: feature extractor का तौलहरू स्थिर गर्नु आवश्यक छ, किनभने अन्यथा अप्रशिक्षित वर्गीकरण तहले convolutional extractor का मूल पूर्व-प्रशिक्षित तौलहरू नष्ट गर्न सक्छ।\n", + "> **नोट**: फिचर एक्स्ट्र्याक्टरका तौलहरू फ्रीज गर्नु आवश्यक छ, किनभने अन्यथा अप्रशिक्षित क्लासिफायर तहले कन्वोलुसनल एक्स्ट्र्याक्टरका मूल प्री-ट्रेन गरिएको तौलहरू नष्ट गर्न सक्छ।\n", "\n", - "तपाईंले देख्न सक्नुहुन्छ कि हाम्रो नेटवर्कमा कुल तौलहरूको संख्या लगभग १५ मिलियन छ, तर हामी केवल २५ हजार तौलहरू मात्र प्रशिक्षण गर्दैछौं। शीर्ष-स्तरका convolutional फिल्टरका अन्य सबै तौलहरू पूर्व-प्रशिक्षित छन्। यो राम्रो कुरा हो, किनभने हामी सानो संख्याका उदाहरणहरूसँग सानो संख्याका तौलहरूलाई राम्रोसँग fine-tune गर्न सक्षम छौं।\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" ] }, { @@ -944,7 +955,9 @@ { "cell_type": "markdown", "metadata": {}, - "source": [] + "source": [ + "हामी कन्भोलुसनल बेसका सबै तहहरू अनफ्रिज गर्न सक्छौं:\n" + ] }, { "cell_type": "code", @@ -959,7 +972,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "तर, सबैलाई एकैपटक अनफ्रिज गर्नु राम्रो विचार होइन। हामी पहिलो चरणमा केही अन्तिम कन्भोल्युसन तहहरू मात्र अनफ्रिज गर्न सक्छौं, किनभने तिनीहरूले हाम्रो छविहरूसँग सम्बन्धित उच्च स्तरका ढाँचाहरू समावेश गर्छन्। उदाहरणका लागि, सुरुमा, हामी अन्तिम ४ तहहरू बाहेक सबै तहहरू फ्रिज गर्न सक्छौं:\n" + "यद्यपि, सबैलाई एकै पटक अनफ्रिज गर्नु सबैभन्दा राम्रो विचार होइन। हामी पहिले केही अन्तिम डिजाइन तहहरू मात्र अनफ्रिज गर्न सक्छौं, किनकि तिनीहरूमा उच्च स्तरका ढाँचा हुन्छन् जुन हाम्रा छविहरूको लागि सान्दर्भिक हुन्छन्। उदाहरणका लागि, सुरु गर्नका लागि हामी अन्तिम ४ बाहेकका सबै तहहरूलाई फ्रिज गर्न सक्छौं: \n" ] }, { @@ -998,11 +1011,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "प्रशिक्षण गर्न मिल्ने प्यारामिटरहरूको संख्या उल्लेखनीय रूपमा बढेको छ, तर यो अझै पनि सबै प्यारामिटरहरूको करिब ५०% मात्र हो।\n", + "ट्रेन योग्य प्यारामिटरहरूको संख्या उल्लेखनीय रूपमा बढेको छ, तर यो अझै सबै प्यारामिटरहरूको करिब ५०% को आसपास नै छ भनेर हेर्नुहोस्।\n", "\n", - "अनफ्रिज गरेपछि, हामी केही थप इपोक्सहरू प्रशिक्षण गर्न सक्छौं (हाम्रो उदाहरणमा, हामी केवल एक इपोक गर्नेछौं)। तपाईंले कम लर्निङ रेट पनि चयन गर्न सक्नुहुन्छ, ताकि प्रि-ट्रेन गरिएको वेट्समा पर्ने प्रभावलाई न्यून गर्न सकियोस्। तर, कम लर्निङ रेटको साथमा पनि, प्रशिक्षणको सुरुवातमा एक्युरेसी घट्ने अपेक्षा गर्न सकिन्छ, जबसम्म यो स्थिर वेट्सको अवस्थामा भन्दा अलिकति उच्च स्तरमा पुग्दैन।\n", + "अनफ्रिज भएपछि, हामी केहि थप epochs को प्रशिक्षण गर्न सक्छौं (हाम्रो उदाहरणमा, हामी केवल एउटा गर्नेछौं)। तपाईंले प्रि-ट्रेन गरिएका वजनमा असर न्यून गर्न कम सिकाइ दर पनि चयन गर्न सक्नुहुन्छ। यद्यपि, कम सिकाइ दरसँग पनि, तपाईंले प्रारम्भिक प्रशिक्षणमा सटिकता घट्ने अपेक्षा गर्न सक्नुहुन्छ, जबसम्म यो अन्ततः स्थिर वजनको अवस्थामा भन्दा थोरै उच्च स्तरमा पुग्दैन।\n", "\n", - "> **Note:** यो प्रशिक्षण धेरै ढिलो हुन्छ, किनभने हामीले नेटवर्कका धेरै तहहरू हुँदै ग्रेडियन्ट्सलाई फिर्ता प्रवाह गराउनुपर्छ!\n" + "> **Note:** यो प्रशिक्षण धेरै ढिलो हुन्छ, किनकि हामीलाई नेटवर्कका धेरै तहहरू मार्फत ब्याक प्रोपगेट गर्नु पर्छ!\n" ] }, { @@ -1026,9 +1039,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "हामी उच्च प्रशिक्षण शुद्धता प्राप्त गर्न सक्ने सम्भावना छ, किनकि हामी अधिक शक्तिशाली नेटवर्क प्रयोग गर्दैछौं जसमा धेरै पैरामीटरहरू छन्, तर मान्यता शुद्धता त्यति धेरै बढ्ने छैन।\n", + "हामी सम्भवतः उच्च प्रशिक्षण सटीकता हासिल गर्नेछौं, किनकि हामी थप प्यारामिटरहरू सहित थप शक्तिशाली नेटवर्क प्रयोग गर्दैछौं, तर प्रमाणीकरण सटीकता त्यति धेरै बढ्दैन।\n", "\n", - "नेटवर्कका केही थप तहहरू अनफ्रिज गरेर थप प्रशिक्षण गर्न स्वतन्त्र महसुस गर्नुहोस्, ताकि तपाईं उच्च शुद्धता प्राप्त गर्न सक्षम हुनुहुन्छ कि छैन हेर्न सक्नुहुन्छ!\n" + "नेटवर्कका केही थप तहहरू अनफ्रिज गरेर र बढी प्रशिक्षण गरेर जान्न नहिचकिचाउनुहोस् कि के तपाईं उच्च सटीकता प्राप्त गर्न सक्षम हुनुहुन्छ!\n" ] }, { @@ -1037,7 +1050,7 @@ "source": [ "## अन्य कम्प्युटर भिजन मोडेलहरू\n", "\n", - "VGG-16 कम्प्युटर भिजन आर्किटेक्चरहरूमध्ये सबैभन्दा साधारण हो। Keras ले धेरै अन्य प्रि-ट्रेन गरिएको नेटवर्कहरू उपलब्ध गराउँछ। तीमध्ये सबैभन्दा धेरै प्रयोग गरिनेहरूमा Microsoft द्वारा विकसित **ResNet** आर्किटेक्चरहरू र Google को **Inception** पर्दछन्। उदाहरणका लागि, हामी सबैभन्दा साधारण ResNet-50 मोडेलको आर्किटेक्चर अन्वेषण गरौं (ResNet विभिन्न गहिराइ भएका मोडेलहरूको परिवार हो, यदि तपाईं साँच्चै गहिरो मोडेल कस्तो देखिन्छ भनेर हेर्न चाहनुहुन्छ भने ResNet-152 मा प्रयोग गरेर हेर्न सक्नुहुन्छ):\n" + "VGG-16 सबैभन्दा साधारण कम्प्युटर भिजन आर्किटेक्चरहरूमध्ये एक हो। Keras ले धेरै बढी प्रि-ट्रेन्ड नेटवर्कहरू उपलब्ध गराउँछ। ती मध्ये सबैभन्दा प्रायः प्रयोग गरिनेहरू **ResNet** आर्किटेक्चरहरू हुन्, जुन Microsoft द्वारा विकास गरिएको हो, र **Inception** गूगल द्वारा। उदाहरणका लागि, सबैभन्दा सरल ResNet-50 मोडेलको आर्किटेक्चर अन्वेषण गरौं (ResNet विभिन्न गहिराइका मोडेलहरूको परिवार हो, तपाईंले साँच्चिकै गहिरो मोडेल कस्तो देखिन्छ भनेर हेर्न ResNet-152 मा पनि प्रयोग गर्न सक्नुहुन्छ):\n" ] }, { @@ -1439,29 +1452,29 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "जसरी तपाईंले देख्न सक्नुहुन्छ, यो मोडेलमा उही परिचित निर्माण ब्लकहरू छन्: कन्भोल्युसनल लेयरहरू, पूलिङ लेयरहरू, र अन्तिम डेन्स क्लासिफायर। हामीले VGG-16 लाई ट्रान्सफर लर्निङका लागि प्रयोग गरेजस्तै यो मोडेललाई पनि ठीक त्यही तरिकाले प्रयोग गर्न सक्छौं। माथिको कोडमा विभिन्न ResNet मोडेलहरूलाई आधार मोडेलको रूपमा प्रयोग गरेर परीक्षण गर्न सक्नुहुन्छ र कसरी एक्युरेसी परिवर्तन हुन्छ हेर्न सक्नुहुन्छ।\n", + "तपाईंले देख्नुभएको जस्तै, मोडेलमा उस्तै परिचित निर्माण ब्लकहरू छन्: कन्भोलुसनल लेयरहरू, पुलिङ लेयरहरू र अन्तिम घना वर्गीकर्ता। हामी यस मोडेललाई बिल्कुलै उस्तै तरिकाले प्रयोग गर्न सक्छौं जसरी हामीले VGG-16 लाई ट्रान्सफर लर्निङका लागि प्रयोग गरिरहेका छौं। तपाईं माथिको कोडसँग प्रयोग गरेर विभिन्न ResNet मोडेलहरूलाई आधार मोडेलको रूपमा प्रयोग गर्न सक्नुहुन्छ र कसरी सटीकता परिवर्तन हुन्छ भनेर हेर्न सक्नुहुन्छ।\n", "\n", - "## ब्याच नर्मलाइजेसन\n", + "## ब्याच मानकीकरण\n", "\n", - "यो नेटवर्कमा अर्को प्रकारको लेयर पनि समावेश छ: **ब्याच नर्मलाइजेसन**। ब्याच नर्मलाइजेसनको विचार भनेको न्यूरल नेटवर्कभित्र बग्ने मानहरूलाई सही दायरामा ल्याउनु हो। सामान्यतया न्यूरल नेटवर्कहरू सबै मानहरू [-1,1] वा [0,1] को दायरामा हुँदा राम्रोसँग काम गर्छन्, र यही कारणले हामी हाम्रो इनपुट डाटालाई त्यस अनुसार स्केल/नर्मलाइज गर्छौं। तर, गहिरो नेटवर्कको प्रशिक्षणको क्रममा, कहिलेकाहीँ मानहरू यो दायराबाट धेरै बाहिर जान सक्छन्, जसले गर्दा प्रशिक्षणमा समस्या आउन सक्छ। ब्याच नर्मलाइजेसन लेयरले हालको मिनिब्याचका सबै मानहरूको औसत र मानक विचलन गणना गर्छ, र तिनलाई न्यूरल नेटवर्क लेयरमा पठाउनु अघि सिग्नललाई नर्मलाइज गर्न प्रयोग गर्छ। यसले गहिरो नेटवर्कहरूको स्थिरता उल्लेखनीय रूपमा सुधार गर्छ।\n" + "यस नेटवर्कमा अर्को प्रकारको लेयर छ: **ब्याच मानकीकरण**। ब्याच मानकीकरणको विचार neural नेटवर्कमा बगेका मानहरूलाई सही अन्तरालमा ल्याउनु हो। सामान्यतया neural नेटवर्कहरू तब सबैभन्दा राम्रो काम गर्छन् जब सबै मानहरू [-1,1] वा [0,1] दायरामा हुन्छन्, र त्यसैले हामीले हाम्रा इनपुट डेटा अनुसार मापन/मानकीकरण गर्छौं। तथापि, एक गहिरो नेटवर्कको प्रशिक्षणको समयमा, मानहरू यस दायराबाट निकै बाहिर जान सक्छन्, जसले प्रशिक्षणलाई समस्याग्रस्त बनाउँछ। ब्याच मानकीकरण लेयरले हालको मिनिब्याचका सबै मानहरूको औसत र मानक विचलन गणना गर्छ र neural नेटवर्क लेयरमा पुर्‍याउनु अघि सिग्नललाई मानकीकृत गर्न प्रयोग गर्छ। यसले गहिरो नेटवर्कहरूको स्थिरतामा महत्वपूर्ण सुधार ल्याउँछ।\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\n**अस्वीकरण**:\nयो दस्तावेज़ AI अनुवाद सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) प्रयोग गरेर अनुवाद गरिएको हो। हामी सही हुन प्रयास गर्छौं, तर कृपया जानकार हुनुस् कि स्वचालित अनुवादमा त्रुटिहरू वा अशुद्धताहरू हुन सक्छन्। मूल दस्तावेज़ यसको मूल भाषामा आधिकारिक स्रोत मानिनुपर्छ। महत्वपूर्ण जानकारीका लागि व्यावसायिक मानव अनुवाद सिफारिस गरिन्छ। यस अनुवादको प्रयोगबाट उत्पन्न कुनै पनि गलत बुझाइ वा त्रुटिको लागि हामी जिम्मेवार छैनौं।\n\n" ] } ], @@ -1482,12 +1495,6 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" - }, - "coopTranslator": { - "original_hash": "c189abc107848f96051085cc30945129", - "translation_date": "2025-08-28T07:55:17+00:00", - "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", - "language_code": "ne" } }, "nbformat": 4, diff --git a/translations/ne/lessons/5-NLP/README.md b/translations/ne/lessons/5-NLP/README.md index eb8932f4e1..42cab14f1c 100644 --- a/translations/ne/lessons/5-NLP/README.md +++ b/translations/ne/lessons/5-NLP/README.md @@ -1,59 +1,51 @@ -# प्राकृतिक भाषा प्रशोधन +# प्राकृतिक भाषा प्रसंस्करण -![NLP कार्यहरूको सारांश](../../../../translated_images/ne/ai-nlp.b22dcb8ca4707cea.webp) +![एनएलपी कार्यहरूको सारांश एक डुडलमा](../../../../translated_images/ne/ai-nlp.b22dcb8ca4707cea.webp) -यस खण्डमा, हामी **प्राकृतिक भाषा प्रशोधन (NLP)** सम्बन्धित कार्यहरू समाधान गर्न न्युरल नेटवर्कहरू प्रयोग गर्ने कुरामा ध्यान केन्द्रित गर्नेछौं। कम्प्युटरले समाधान गर्नुपर्ने धेरै NLP समस्याहरू छन्: +यस खण्डमा, हामी प्राकृतिक भाषा प्रसंस्करण (NLP) सम्बन्धित कार्यहरू सम्हाल्न न्यूरल नेटवर्कहरू प्रयोग गर्नेमा केन्द्रित हुने छौं। त्यहाँ धेरै 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) भनिन्छ। +* **पाठ सारांशकरण** त्यो प्रविधि हो जब हामी कम्प्युटरलाई लामो पाठ "पढ्न" र केही वाक्यहरूमा सारांश गर्न चाहन्छौं। +* **मेशिन अनुवाद** एक भाषाको पाठ बुझ्ने र अर्को भाषामा पाठ सिर्जना गर्ने संयोजनको रूपमा हेरिन सक्छ। -* **भावना विश्लेषण** एक सामान्य प्रतिगमन समस्या हो, जहाँ वाक्यको अर्थ कति सकारात्मक/नकारात्मक छ भन्ने संख्या (भावना) दिनुपर्छ। भावना विश्लेषणको उन्नत संस्करण **पक्ष-आधारित भावना विश्लेषण** (ABSA) हो, जहाँ भावना सम्पूर्ण वाक्यलाई होइन, यसको विभिन्न भागहरू (पक्षहरू) लाई दिनुपर्छ। जस्तै, *यो रेस्टुरेन्टमा मलाई खाना मन पर्‍यो, तर वातावरण डरलाग्दो थियो*। +आरम्भमा, अधिकांश NLP कार्यहरू परम्परागत विधिहरू जस्तै व्याकरणहरू प्रयोग गरेर समाधान गरिन्थ्यो। उदाहरणका लागि, मेशिन अनुवादमा पार्सरहरूले सुरुको वाक्यलाई व्याकरण ट्रीमा रूपान्तरण गर्थे, त्यसपछि अर्थ प्रतिनिधित्व गर्न उच्च तहको सैमेन्टिक संरचनाहरू निकालिन्थे, र उक्त अर्थ र लक्ष्य भाषाको व्याकरण आधारमा परिणाम सिर्जना गरिन्थ्यो। आजकल, धेरै NLP कार्यहरू न्यूरल नेटवर्कहरू प्रयोग गरेर प्रभावकारी रूपमा समाधान गरिन्छन्। -* **नामित इकाई पहिचान** (NER) पाठबाट निश्चित इकाईहरू निकाल्ने समस्यालाई जनाउँछ। उदाहरणका लागि, वाक्यांश *म भोलि पेरिस जानुपर्छ* मा *भोलि* शब्दले मिति (DATE) जनाउँछ, र *पेरिस* स्थान (LOCATION) हो भन्ने बुझ्न आवश्यक हुन सक्छ। +> धेरै क्लासिक NLP विधिहरू [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org) Python पुस्तकालयमा कार्यान्वयन गरिएको छ। त्यहाँ एक उत्कृष्ट [NLTK पुस्तक](https://www.nltk.org/book/) अनलाइन उपलब्ध छ जसले विभिन्न NLP कार्यहरू कसरी NLTK प्रयोग गरेर समाधान गर्न सकिन्छ देखाउँछ। -* **किवर्ड निकाल्ने** NER जस्तै हो, तर यसमा विशिष्ट इकाई प्रकारहरूको लागि पूर्व-प्रशिक्षण नगरी वाक्यको अर्थका लागि महत्त्वपूर्ण शब्दहरू स्वचालित रूपमा निकाल्नुपर्छ। +हाम्रो कोर्समा, हामी प्रायः NLP का लागि न्यूरल नेटवर्कहरू प्रयोग गर्न केन्द्रित हुने छौं, र आवश्यक परेमा NLTK प्रयोग गर्ने छौं। -* **पाठ क्लस्टरिङ** उपयोगी हुन्छ जब हामी समान वाक्यहरूलाई समूहबद्ध गर्न चाहन्छौं, जस्तै, प्राविधिक समर्थन वार्तालापहरूमा समान अनुरोधहरू। - -* **प्रश्न उत्तर दिने** मोडेलको क्षमता हो जसले विशिष्ट प्रश्नको उत्तर दिन्छ। मोडेलले पाठ खण्ड र प्रश्नलाई इनपुटको रूपमा लिन्छ, र प्रश्नको उत्तर समावेश भएको पाठको स्थान प्रदान गर्नुपर्छ (कहिलेकाहीँ, उत्तर पाठ उत्पन्न गर्नुपर्छ)। - -* **पाठ उत्पन्न गर्ने** मोडेलको क्षमता हो जसले नयाँ पाठ उत्पन्न गर्छ। यसलाई *पाठ संकेत* को आधारमा अर्को अक्षर/शब्दको भविष्यवाणी गर्ने वर्गीकरण कार्यको रूपमा मान्न सकिन्छ। उन्नत पाठ उत्पन्न गर्ने मोडेलहरू, जस्तै 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 कार्यहरू समाधान गर्न सक्षम छन्। - -* **पाठ संक्षेपण** एउटा प्रविधि हो जहाँ हामी कम्प्युटरलाई लामो पाठ "पढ्न" र केही वाक्यहरूमा संक्षेप गर्न चाहन्छौं। - -* **मेसिन अनुवाद** एउटा प्रविधि हो जसले एउटा भाषामा पाठ बुझ्ने र अर्को भाषामा पाठ उत्पन्न गर्ने संयोजनको रूपमा काम गर्छ। - -सुरुमा, धेरै NLP कार्यहरू परम्परागत विधिहरू जस्तै व्याकरण प्रयोग गरेर समाधान गरिन्थ्यो। उदाहरणका लागि, मेसिन अनुवादमा प्रारम्भिक वाक्यलाई वाक्य संरचना (syntax tree) मा रूपान्तरण गर्न पार्सरहरू प्रयोग गरिन्थ्यो, त्यसपछि वाक्यको अर्थ प्रतिनिधित्व गर्न उच्च स्तरका अर्थ संरचनाहरू निकालिन्थ्यो, र यस अर्थ र लक्ष्य भाषाको व्याकरणको आधारमा परिणाम उत्पन्न गरिन्थ्यो। आजकल, धेरै NLP कार्यहरू न्युरल नेटवर्कहरू प्रयोग गरेर बढी प्रभावकारी रूपमा समाधान गरिन्छ। - -> धेरै परम्परागत NLP विधिहरू [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org) नामक Python पुस्तकालयमा कार्यान्वयन गरिएका छन्। [NLTK पुस्तक](https://www.nltk.org/book/) अनलाइन उपलब्ध छ, जसले NLTK प्रयोग गरेर विभिन्न NLP कार्यहरू कसरी समाधान गर्न सकिन्छ भन्ने कभर गर्छ। - -हाम्रो पाठ्यक्रममा, हामी NLP का लागि न्युरल नेटवर्कहरू प्रयोग गर्नमा ध्यान केन्द्रित गर्नेछौं, र आवश्यक परेमा NLTK प्रयोग गर्नेछौं। - -हामीले पहिले नै तालिका डेटा र छविहरूसँग व्यवहार गर्न न्युरल नेटवर्कहरू प्रयोग गर्ने बारे सिकिसकेका छौं। ती प्रकारका डेटा र पाठबीचको मुख्य भिन्नता यो हो कि पाठ एक परिवर्तनशील लम्बाइको अनुक्रम हो, जबकि छविहरूको इनपुट आकार पहिले नै थाहा हुन्छ। यद्यपि, कनभोलुसनल नेटवर्कहरूले इनपुट डेटा बाट ढाँचाहरू निकाल्न सक्छन्, पाठमा ढाँचाहरू अझ जटिल हुन्छन्। जस्तै, नकारात्मकता (negation) विषयबाट धेरै शब्दहरू टाढा हुन सक्छ (जस्तै, *मलाई सुन्तला मन पर्दैन* vs. *मलाई ती ठूला रङ्गीन स्वादिष्ट सुन्तला मन पर्दैन*), र यसलाई अझै पनि एउटै ढाँचाको रूपमा व्याख्या गर्नुपर्छ। त्यसैले, भाषा व्यवस्थापन गर्न हामीले नयाँ न्युरल नेटवर्क प्रकारहरू, जस्तै *पुनरावर्ती नेटवर्कहरू* र *ट्रान्सफर्मरहरू* परिचय गराउन आवश्यक छ। +हामीले पहिले नै न्यूरल नेटवर्कहरू प्रयोग गरी तालिकागत डेटा र छविहरूमा काम गर्ने कुरा सिकिसकेका छौं। ती प्रकारका डेटाहरू र पाठबीच मुख्य फरक भनेको पाठ एक चर लम्बाइको अनुक्रम हो, जबकि छविहरूमा इनपुट आकार पहिले नै थाहा हुन्छ। कन्भोलुसनल नेटवर्कहरूले इनपुट डेटाबाट ढाँचाहरू निकाल्न सक्छन्, तर पाठमा ढाँचाहरू जटिल हुन्छन्। उदाहरणका लागि, नकारात्मकता विषयबाट फरक हुनु धेरै शब्दहरूमा स्वैच्छिक हुन सक्छ (जस्तै *म सुन्तलाहरु मन पर्दैन*, बनाम *म ती ठूला रङीन स्वादिला सुन्तलाहरु मन पर्दैन*), र त्यो अझै पनि एउटै ढाँचाको रूपमा व्याख्या हुनुपर्छ। त्यसैले, भाषा सम्हाल्न हामीले नयाँ न्यूरल नेटवर्क प्रकारहरू जस्तै *पुनरावृत्ति नेटवर्क* र *ट्रान्सफर्मरहरू* परिचय गराउनुपर्छ। ## पुस्तकालयहरू स्थापना गर्नुहोस् -यदि तपाईंले यो पाठ्यक्रम चलाउन स्थानीय 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 ``` -> तपाईं [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 का पुराना संस्करणहरूले एउटै Python कर्नेलमा धेरै मोडेलहरू प्रशिक्षण गर्दा GPU मेमोरी सही रूपमा रिलीज नगर्न सक्छ। GPU मेमोरी प्रयोगलाई प्रभावकारी रूपमा व्यवस्थापन गर्न, तपाईं TensorFlow लाई आवश्यक पर्दा मात्र GPU मेमोरी आवंटन गर्न कन्फिगर गर्न सक्नुहुन्छ। -* **कोड समावेश गर्नुहोस्**: TensorFlow लाई आवश्यक पर्दा मात्र GPU मेमोरी बढ्न दिन निम्न कोड तपाईंको नोटबुकहरूमा समावेश गर्नुहोस्: +यस खण्डमा, केही उदाहरणहरूमा हामी ठूलो मोडेलहरू तालिम गर्नेछौं। +* **GPU-सक्षम कम्प्युटर प्रयोग गर्नुहोस्**: ठूलो मोडेलहरूसँग काम गर्दा पर्खाइ कम गर्न, आफ्नो नोटबुकहरू GPU-सक्षम कम्प्युटरमा चलाउनु बुद्धिमानी हुन्छ। +* **GPU स्मृति सीमाहरू**: GPU मा चलाउँदा GPU स्मृति सकिन सक्ने स्थिति आउन सक्छ, विशेष गरी ठूलो मोडेल तालिम गर्दा। +* **GPU स्मृति खपत**: तालिम अवधिमा GPU स्मृतिको खपत विभिन्न कारकहरूमा निर्भर गर्दछ, जस्तै मिनिब्याच आकार। +* **मिनिब्याच आकार न्यूनतम गर्नुहोस्**: यदि GPU स्मृति समस्या आएमा, आफ्नो कोडमा मिनिब्याच आकार घटाउने विचार गर्न सक्नुहुन्छ। +* **TensorFlow GPU स्मृति रिहाई**: TensorFlow का पुराना संस्करणहरूले एउटै Python कर्नेलमा धेरै मोडेल तालिम गर्दा GPU स्मृति सही रूपमा रिहा नहुन सक्छ। GPU स्मृति उपयोग प्रभावकारी रूपमा व्यवस्थापन गर्न TensorFlow लाई आवश्यक पर्दा मात्र GPU स्मृति बाँड्न कन्फिगर गर्न सकिन्छ। +* **कोड समावेश गर्नुहोस्**: TensorFlow लाई आवश्यक पर्दा मात्र GPU स्मृति विस्तार गर्न सेट गर्न तलको कोड आफ्नो नोटबुकहरूमा राख्नुहोस्: ```python physical_devices = tf.config.list_physical_devices('GPU') @@ -61,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) भ्रमण गर्नुहोस्। +यदि तपाईं क्लासिक ML दृष्टिकोणबाट 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) +* [भाषा मोडेलिङ](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) प्रयोग गरेर अनुवाद गरिएको छ। हामी शुद्धताको लागि प्रयास गर्छौं, तर कृपया ध्यान दिनुहोस् कि स्वचालित अनुवादमा त्रुटिहरू वा अशुद्धताहरू हुन सक्छ। यसको मूल भाषा मा रहेको मूल दस्तावेज़लाई आधिकारिक स्रोत मानिनुपर्छ। महत्वपूर्ण जानकारीको लागि, व्यावसायिक मानव अनुवाद सिफारिस गरिन्छ। यस अनुवादको प्रयोगबाट उत्पन्न हुने कुनै पनि गलतफहमी वा गलत व्याख्याको लागि हामी जिम्मेवार हुने छैनौं। \ No newline at end of file +--- + + +**अस्वीकरण**: +यो दस्तावेज़ AI अनुवाद सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) प्रयोग गरेर अनुवाद गरिएको हो। हामी सही हुन प्रयास गर्छौं, तर कृपया जानकार हुनुस् कि स्वचालित अनुवादमा त्रुटिहरू वा अशुद्धताहरू हुन सक्छन्। मूल दस्तावेज़ यसको मूल भाषामा आधिकारिक स्रोत मानिनुपर्छ। महत्वपूर्ण जानकारीका लागि व्यावसायिक मानव अनुवाद सिफारिस गरिन्छ। यस अनुवादको प्रयोगबाट उत्पन्न कुनै पनि गलत बुझाइ वा त्रुटिको लागि हामी जिम्मेवार छैनौं। + \ No newline at end of file diff --git a/translations/ne/lessons/6-Other/23-MultiagentSystems/README.md b/translations/ne/lessons/6-Other/23-MultiagentSystems/README.md index 1d1467bcb3..18f5a15955 100644 --- a/translations/ne/lessons/6-Other/23-MultiagentSystems/README.md +++ b/translations/ne/lessons/6-Other/23-MultiagentSystems/README.md @@ -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) -**बहु-एजेन्ट प्रणालीहरू** को दिशा १९९० को दशकमा इन्टरनेट र वितरित प्रणालीहरूको वृद्धिको प्रतिक्रियाको रूपमा एआईमा देखा परेको हो। [Artificial Intelligence: A Modern Approach](https://en.wikipedia.org/wiki/Artificial_Intelligence:_A_Modern_Approach) जस्ता क्लासिकल एआई पाठ्यपुस्तकले बहु-एजेन्ट प्रणालीहरूको दृष्टिकोणबाट क्लासिकल एआईलाई हेर्ने दृष्टिकोणमा केन्द्रित छ। +**बहु-एजेण्ट प्रणालीहरू** को दिशा १९९० दशकमा इन्टरनेट र वितरित प्रणालीहरूको वृद्धिलाई प्रतिक्रिया स्वरूप एआईमा उभिएको हो। एक स्वीकृत एआई पुस्तक, [Artificial Intelligence: A Modern Approach](https://en.wikipedia.org/wiki/Artificial_Intelligence:_A_Modern_Approach), बहु-एजेण्ट प्रणालीहरूको दृष्टिकोणबाट परम्परागत एआईलाई हेर्छ। -बहु-एजेन्ट दृष्टिकोणको केन्द्रमा **एजेन्ट** को धारणा छ - एउटा इकाई जसले कुनै **पर्यावरण** मा बस्छ, जसलाई यो बुझ्न र कार्य गर्न सक्छ। यो धेरै व्यापक परिभाषा हो, र एजेन्टहरूको धेरै प्रकार र वर्गीकरणहरू हुन सक्छ: +बहु-एजेण्ट दृष्टिकोणको केन्द्रीय अवधारणा हो **एजेण्ट** — त्यो इकाई जुन कुनै **परिवेशमा** बस्छ, जसलाई यो बुझ्न र कार्य गर्न सक्छ। यो एक धेरै व्यापक परिभाषा हो, र एजेन्टहरूको धेरै प्रकार र वर्गीकरणहरू हुन सक्छन्: -* तर्क गर्ने क्षमताको आधारमा: - - **प्रतिक्रियात्मक** एजेन्टहरूले सामान्यतया सरल अनुरोध-प्रतिक्रिया प्रकारको व्यवहार देखाउँछन्। - - **विचारशील** एजेन्टहरूले केही प्रकारको तार्किक तर्क र/वा योजना क्षमताहरू प्रयोग गर्छन्। -* एजेन्टले आफ्नो कोड कहाँ कार्यान्वयन गर्छ भन्ने आधारमा: - - **स्थिर** एजेन्टहरू समर्पित नेटवर्क नोडमा काम गर्छन्। - - **मोबाइल** एजेन्टहरूले आफ्नो कोड नेटवर्क नोडहरू बीच सार्न सक्छन्। -* व्यवहारको आधारमा: - - **निष्क्रिय एजेन्टहरू** को विशिष्ट लक्ष्यहरू हुँदैन। यस्ता एजेन्टहरूले बाह्य उत्तेजनाहरूमा प्रतिक्रिया दिन सक्छन्, तर आफैंले कुनै कार्यहरू सुरु गर्दैनन्। - - **सक्रिय एजेन्टहरू** केहि लक्ष्यहरू हुन्छन् जसलाई तिनीहरूले पछ्याउँछन्। - - **संज्ञानात्मक एजेन्टहरू** जटिल योजना र तर्क समावेश गर्छन्। +* तिनीहरूको तर्क क्षमताको आधारमा: + - **प्रतिक्रियाशील** एजेन्टहरूले साधारण अनुरोध-प्रतिक्रिया प्रकारको व्यवहार प्रदर्शन गर्छन् + - **परिकलनात्मक** एजेन्टहरूले कुनै न कुनै तर्कसंगत योजना निर्माण र/वा तर्क क्षमताहरू प्रयोग गर्छन् +* एजेन्टले कोड कहाँ कार्यान्वयन गर्छ भन्ने आधारमा: + - **स्थिर** एजेन्टले समर्पित नेटवर्क नोडमा कार्य गर्छ + - **गतिशील** एजेन्टहरूले आफ्नो कोड नेटवर्क नोडहरूको बीच सार्न सक्छन् +* तिनीहरूको व्यवहारको आधारमा: + - **निष्क्रिय एजेन्ट** हरू सटीक लक्ष्य राख्दैनन्। यस्ता एजेन्टहरूले बाह्य उत्तेजनामा प्रतिक्रिया दिन सक्छन्, तर आफ्नै पहलमा कुनै कार्य शुरू गर्दैनन्। + - **सक्रिय एजेन्ट** हरू केहि लक्ष्यहरू पछ्याउँछन् + - **संज्ञानात्मक एजेन्ट** हरू जटिल योजना र तर्कमा संलग्न हुन्छन् -आजकल बहु-एजेन्ट प्रणालीहरू धेरै अनुप्रयोगहरूमा प्रयोग गरिन्छ: +बहु-एजेण्ट प्रणालीहरू आजकाल विभिन्न अनुप्रयोगहरूमा प्रयोग हुन्छन्: -* खेलहरूमा, धेरै गैर-खेलाडी पात्रहरूले केही प्रकारको एआई प्रयोग गर्छन्, र तिनीहरूलाई बुद्धिमान एजेन्ट मान्न सकिन्छ। -* भिडियो उत्पादनमा, भीडहरू समावेश गर्ने जटिल ३डी दृश्यहरू रेंडर गर्न सामान्यतया बहु-एजेन्ट सिमुलेशन प्रयोग गरिन्छ। -* प्रणालीहरूको मोडेलिङमा, बहु-एजेन्ट दृष्टिकोण जटिल मोडेलको व्यवहारलाई सिमुलेट गर्न प्रयोग गरिन्छ। उदाहरणका लागि, बहु-एजेन्ट दृष्टिकोणले 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` कमाण्ड प्रयोग गरेर धेरै टर्टलहरू सिर्जना गर्न सक्छौं। त्यसपछि हामी सबै टर्टलहरूलाई केही कार्यहरू गर्न आदेश दिन सक्छौं (तलको उदाहरणमा - १० बिन्दु अगाडि बढ्नु): +NetLogo मा, हामी `create-turtles` आदेश प्रयोग गरेर धेरै कछुवाहरू बनाउन सक्छौं। त्यसपछि हामी सबै कछुवालाई केही कार्यहरू गर्न आदेश दिन सक्छौं (तलको उदाहरणमा - १० पोइन्ट अघि बढ्ने): ``` 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 भाषा आफैं सिक्नमा गहिराइमा जानेछैनौं - यदि तपाईं थप सिक्न इच्छुक हुनुहुन्छ भने तपाईं उत्कृष्ट [शुरुआती अन्तरक्रियात्मक NetLogo शब्दकोश](https://ccl.northwestern.edu/netlogo/bind/) स्रोतमा जान सक्नुहुन्छ। -तपाईं NetLogo [डाउनलोड](https://ccl.northwestern.edu/netlogo/download.shtml) गरेर स्थापना गर्न सक्नुहुन्छ। +तपाईं NetLogo [डाउनलोड](https://ccl.northwestern.edu/netlogo/download.shtml) गरी स्थापना गरेर प्रयास गर्न सक्नुहुन्छ। ### मोडेल पुस्तकालय -NetLogo को एक उत्कृष्ट पक्ष यो हो कि यसमा काम गर्ने मोडेलहरूको पुस्तकालय छ जुन तपाईं प्रयास गर्न सक्नुहुन्छ। **File → Models Library** मा जानुहोस्, र तपाईंले मोडेलहरूको धेरै श्रेणीहरू छनोट गर्न सक्नुहुन्छ। +NetLogo को एउटा राम्रो कुरा वा मोडेलहरूको पुस्तकालय हुनु हो, जुन तपाईंले प्रयास गर्न सक्नुहुन्छ। जानुहोस् **File → Models Library**, र तपाईंलाई धेरै मोडेलको श्रेणीहरू उपलब्ध हुनेछ। NetLogo Models Library -> Dmitry Soshnikov द्वारा मोडेल पुस्तकालयको स्क्रिनशट +> मोडेल पुस्तकालयको स्क्रीनशट Dmitry Soshnikov द्वारा -तपाईं मोडेलहरू मध्ये एक खोल्न सक्नुहुन्छ, उदाहरणका लागि **Biology → Flocking**। +तपाईं एउटा मोडेल खोल्न सक्नुहुन्छ, उदाहरणका लागि **Biology → Flocking**। ### मुख्य सिद्धान्तहरू -मोडेल खोलिसकेपछि, तपाईंलाई मुख्य NetLogo स्क्रिनमा लगिन्छ। यहाँ सीमित स्रोतहरू (घाँस) दिइएको भेडा र ब्वाँसोको जनसंख्यालाई वर्णन गर्ने नमूना मोडेल छ। +मोडेल खोलिसकेपछि तपाईं मुख्य NetLogo स्क्रिनमा पुग्नुहुन्छ। यहाँ एउटा नमूना मोडेल छ जसले भेडा र ब्वाँसोको जनसंख्या वर्णन गर्छ, सीमित स्रोतहरू (घाँस) सँग। ![NetLogo Main Screen](../../../../../translated_images/ne/NetLogo-Main.32653711ec1a01b3.webp) -> Dmitry Soshnikov द्वारा स्क्रिनशट +> स्क्रीनशट Дмитry Soshnikov द्वारा -यस स्क्रिनमा, तपाईं देख्न सक्नुहुन्छ: +यो स्क्रिनमा, तपाईंले देख्नुहुन्छ: -* **इन्टरफेस** खण्ड जसमा समावेश छ: - - मुख्य क्षेत्र, जहाँ सबै एजेन्टहरू बस्छन् - - विभिन्न नियन्त्रणहरू: बटनहरू, स्लाइडरहरू, आदि। - - ग्राफहरू जसलाई तपाईं सिमुलेशनको प्यारामिटरहरू प्रदर्शन गर्न प्रयोग गर्न सक्नुहुन्छ -* **कोड** ट्याब जसमा सम्पादक समावेश छ, जहाँ तपाईं NetLogo प्रोग्राम टाइप गर्न सक्नुहुन्छ +* **इन्टरफेस** भाग जसमा समावेश छ: + - मुख्य क्षेत्र जहाँ सबै एजेन्टहरू बस्छन् + - विभिन्न नियन्त्रणहरू: बटनहरू, स्लाइडरहरू, आदि + - ग्राफहरू जुन तपाईंले सिमुलेशनका प्यारामिटरहरू प्रदर्शन गर्न प्रयोग गर्न सक्नुहुन्छ +* **कोड** ट्याब जहाँ सम्पादक हुन्छ, जसमा तपाईं NetLogo प्रोग्राम टाइप गर्न सक्नुहुन्छ -अधिकांश अवस्थामा, इन्टरफेसमा **Setup** बटन हुन्छ, जसले सिमुलेशनको अवस्था आरम्भ गर्छ, र **Go** बटन हुन्छ जसले कार्यान्वयन सुरु गर्छ। ती सम्बन्धित ह्यान्डलरहरूद्वारा कोडमा यस प्रकार देखिन्छ: +अधिकांश अवस्थामा, इन्टरफेसमा एउटा **Setup** बटन हुन्छ, जसले सिमुलेशन स्थिति प्रारम्भ गर्दछ, र एउटा **Go** बटन हुन्छ जसले कार्यान्वयन सुरु गर्दछ। ती कोडमा निम्न प्रकारका हैंडलरहरूले ब्यवस्थित हुन्छन्: ``` to go [ @@ -81,17 +81,79 @@ to go [ ] ``` -NetLogo को संसार निम्न वस्तुहरूबाट बनेको छ: +NetLogo को संसारमा निम्न वस्तुहरू छन्: -* **एजेन्टहरू** (टर्टलहरू) जसले क्षेत्रभरि सर्न सक्छन् र केही गर्न सक्छन्। तपाईं `ask turtles [...]` वाक्यविन्यास प्रयोग गरेर एजेन्टहरूलाई आदेश दिन सक्नुहुन्छ, र कोष्ठकभित्रको कोड सबै एजेन्टहरूले *टर्टल मोड* मा कार्यान्वयन गर्छन्। -* **प्याचहरू** क्षेत्रका वर्गाकार क्षेत्रहरू हुन्, जहाँ एजेन्टहरू बस्छन्। तपाईं सबै एजेन्टहरूलाई एउटै प्याचमा सन्दर्भ गर्न सक्नुहुन्छ, वा तपाईं प्याचको रंग र केही अन्य गुणहरू परिवर्तन गर्न सक्नुहुन्छ। तपाईं `ask patches` प्रयोग गरेर प्याचहरूलाई केही गर्न आदेश दिन सक्नुहुन्छ। -* **अवलोकनकर्ता** एक अद्वितीय एजेन्ट हो जसले संसारलाई नियन्त्रण गर्छ। सबै बटन ह्यान्डलरहरू *अवलोकनकर्ता मोड* मा कार्यान्वयन हुन्छन्। +* **एजेन्टहरू** (कछुवाहरू) जो क्षेत्रभरि हिँड्न र केही गर्न सक्छन्। तपाईंले एजेन्टहरूलाई `ask turtles [...]` संरचना प्रयोग गरी आदेश दिनुहुन्छ, र ब्र्याकेटभित्रको कोड सबै एजेन्टहरूले *कछुवा मोड* मा चलाउँछन्। +* **प्याचहरू** क्षेत्रका वर्गाकार भागहरू हुन्, जहाँ एजेन्टहरू बस्छन्। तपाईंले एउटै प्याचमा रहेका सबै एजेन्टहरूलाई संकेत गर्न सक्नुहुन्छ, वा प्याचका रंग र अन्य गुणहरू परिवर्तन गर्न सक्नुहुन्छ। तपाईंले `ask patches` गरेर केहि गर्न पनि सक्नुहुन्छ। +* **अवलोकक** एक अनूठा एजेन्ट हो जसले संसार नियन्त्रण गर्छ। सबै बटन हैंडलरहरू *अवलोकक मोड* मा चलाइन्छ। -> ✅ बहु-एजेन्ट वातावरणको सुन्दरता यो हो कि टर्टल मोड वा प्याच मोडमा चल्ने कोड सबै एजेन्टहरूले समानान्तर रूपमा एकै समयमा कार्यान्वयन गर्छन्। यसरी, थोरै कोड लेखेर र व्यक्तिगत एजेन्टको व्यवहार प्रोग्राम गरेर, तपाईं सिमुलेशन प्रणालीको समग्र जटिल व्यवहार सिर्जना गर्न सक्नुहुन्छ। +> ✅ बहु-एजेण्ट वातावरणको सुन्दरताले के देखाउँछ भने कछुवा मोड वा प्याच मोडमा चल्ने कोड सबै एजेन्टहरूले समानान्तर रूपमा एकै समयमा चलाउँछन्। यसैले, थोरै कोड लेखेर र व्यक्तिगत एजेन्टको व्यवहार प्रोग्राम गरेर, तपाईंले सम्पूर्ण सिमुलेशन प्रणालीको जटिल व्यवहार सिर्जना गर्न सक्नुहुन्छ। -### फ्लकिङ +### झुण्डी (Flocking) -बहु-एजेन्ट व्यवहारको उदाहरणको रूपमा, **[Flocking](https://en.wikipedia.org/wiki/Flocking_(behavior))** विचार गरौं। फ्लकिङ एक जटिल ढाँचा हो जुन चराहरूको झुण्डले उड्ने तरिकासँग धेरै मिल्दोजुल्दो छ। तिनीहरूलाई उडिरहेको हेर्दा तपाईं सोच्न सक्नुहुन्छ कि तिनीहरूले कुनै प्रकारको सामूहिक एल्गोरिदम पछ्याउँछन्, वा तिनीहरूसँग *सामूह +बहु-एजेण्ट व्यवहारको उदाहरणको रूपमा, हामी **[झुण्डी](https://en.wikipedia.org/wiki/Flocking_(behavior))** लाई विचार गरौं। झुण्डी जटिल नमुना हो जुन चराहरूको झुण्ड कसरी उड्छ जस्तै देखिन्छ। तिनीहरूलाई हेर्दा तपाईंले सोच्न सक्नुहुन्छ कि तिनीहरूले कुनै सामूहिक अल्गोरिदम पालन गर्छन्, अथवा तिनीहरूमा कुनै प्रकारको *सामूहिक बुद्धिमत्ता* छ। यद्यपि, यो जटिल व्यवहार तब उत्पन्न हुन्छ जब प्रत्येक व्यक्तिगत एजेन्ट (यस अवस्थामा, एउटा *चरा*) ले आफू वरिपरिका केही एजेन्टहरूलाई छोटो दूरीमा मात्रै नियाल्दछ, र तीन साधारण नियमहरू पालन गर्दछ: + +* **समानता** - यो छिमेकी एजेन्टहरूको औसत दिशातर्फ मोडिन्छ +* **समष्टि** - यो छिमेकीहरूको औसत स्थानतर्फ मोडिन प्रयास गर्छ (*दीर्घ दूरी आकर्षण*) +* **विभाजन** - जब अरू चराहरू निकै नजिक आउँछन्, यो टाढा जान प्रयास गर्छ (*छोटो दूरी प्रतिरोध*) + +तपाईं झुण्डी उदाहरण चलाएर व्यवहार अनुगमन गर्न सक्नुहुन्छ। तपाईंले *विभाजनको डिग्री* वा *हेर्ने दायरा* जस्ता प्यारामिटरहरू पनि समायोजन गर्न सक्नुहुन्छ, जुन परिभाषित गर्छ कि प्रत्येक चराले कति टाढासम्म हेर्न सक्छ। हेर्नुहोस् यदि तपाईं हेर्ने दायरा 0 गराउनु भयो भने सबै चराहरू अन्धा हुन्छन् र झुण्डी रोकिन्छ। यदि विभाजन 0 गरियो भने सबै चराहरू सिधा लाइनमा जम्मा हुन्छन्। + +> ✅ **कोड** ट्याबमा सर्नुहोस् र कसरी झुण्डीका तीन नियमहरू (समानता, समष्टि र विभाजन) कोडमा कार्यान्वयन गरिएको छ हेर्नुहोस्। नोट गर्नुहोस् कि हामी केवल ती एजेन्टहरूलाई मात्र संकेत गर्छौं जुन दृष्टिमा छन्। + +### हेर्न अरू मोडेलहरू + +अझ केही रोचक मोडेलहरू छन् जसमा तपाईं प्रयोग गर्न सक्नुहुन्छ: + +* **कला → आतिशबाजी** कसरी आतिशबाजीलाई व्यक्तिगत आगोका धाराहरूको सामूहिक व्यवहार मान्न सकिन्छ देखाउँछ +* **सामाजिक विज्ञान → ट्राफिक बेसिक** र **सामाजिक विज्ञान → ट्राफिक ग्रिड** सहर ट्राफिकको 1D र 2D ग्रिड मोडेल ट्राफिक बत्ती सहित वा बिना देखाउँछन्। सिमुलेशनमा प्रत्येक कारले तलका नियमहरू पालना गर्छ: + - यदि अगाडि ठाउँ खाली छ भने - छिटो चल (निर्दिष्ट अधिकतम गतिसम्म) + - यदि अगाडि बाधा देख्छ भने - ब्रेक (र तपाईं चालकले कति टाढासम्म देख्न सक्छ समायोजन गर्न सक्नुहुन्छ) +* **सामाजिक विज्ञान → पार्टी** कसरी मानिसहरू ककटेल पार्टीमा समूहबद्ध हुन्छन् देखाउँछ। तपाईंले समूहको खुशी सबैभन्दा छिटो वृद्धि हुने प्यारामिटर संयोजन पत्ता लगाउन सक्नुहुन्छ। + +यी उदाहरणहरूबाट तपाईंले देख्न सक्नुहुन्छ कि बहु-एजेण्ट सिमुलेशनहरू जटिल प्रणालीको व्यवहार बुझ्न धेरै उपयोगी हुन सक्छन्, जहाँ व्यक्तिहरू समान वा समानतर तर्क पालना गर्छन्। यो भर्चुअल एजेन्टहरू, जस्तै कम्प्युटर खेलहरूमा [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) आधारमा डिजाइन गरिएका छन्। +* ती भाषाहरूमा भिन्न **निलामी प्रकारहरू** आधारित केही **सम्झौताका प्रोटोकलहरू** पनि समावेश हुनुपर्छ। +* एउटै अवधारणा उपयोग गर्न **साझा ओन्टोलोजी**, जसले तिनीहरूले समान अर्थ बुझ्न सकोस् +* भिन्न एजेन्टहरूले के गर्न सक्छन् पत्ता लगाउने तरीका, जुन केहि प्रकारको ओन्टोलोजीमा आधारित हुन्छ + +परिकलनात्मक एजेन्टहरू प्रतिक्रियाशीलहरू भन्दा निकै जटिल हुन्छन्, किनभने तिनीहरूले परिवेशका परिवर्तनमा मात्र प्रतिक्रिया गर्दैनन्, तिनीहरूले क्रियाकलाप *सुरु* गर्न पनि सक्षम हुनुपर्छ। परिकलनात्मक एजेन्टहरूको प्रस्तावित वास्तुकलामा यति भनिने विश्वास-इच्छा-उद्देश्य (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) --- + +**अस्वीकरण**: +यो दस्तावेज़ AI अनुवाद सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) प्रयोग गरेर अनुवाद गरिएको हो। हामी सही हुन प्रयास गर्छौं, तर कृपया जानकार हुनुस् कि स्वचालित अनुवादमा त्रुटिहरू वा अशुद्धताहरू हुन सक्छन्। मूल दस्तावेज़ यसको मूल भाषामा आधिकारिक स्रोत मानिनुपर्छ। महत्वपूर्ण जानकारीका लागि व्यावसायिक मानव अनुवाद सिफारिस गरिन्छ। यस अनुवादको प्रयोगबाट उत्पन्न कुनै पनि गलत बुझाइ वा त्रुटिको लागि हामी जिम्मेवार छैनौं। + \ No newline at end of file diff --git a/translations/nl/.co-op-translator.json b/translations/nl/.co-op-translator.json index 8fdb2fc8fd..76d0ceb599 100644 --- a/translations/nl/.co-op-translator.json +++ b/translations/nl/.co-op-translator.json @@ -5,6 +5,12 @@ "source_file": "AGENTS.md", "language_code": "nl" }, + "CONTRIBUTING.md": { + "original_hash": "c6fd7e781b67111a90abd166d0ce4aa0", + "translation_date": "2026-07-08T15:53:13+00:00", + "source_file": "CONTRIBUTING.md", + "language_code": "nl" + }, "README.md": { "original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b", "translation_date": "2026-04-06T21:00:00+00:00", @@ -17,6 +23,19 @@ "source_file": "SECURITY.md", "language_code": "nl" }, + "__translation_failures__": { + "lessons/sketchnotes/LICENSE.md": { + "original_hash": "45ab63a2cd8f5faef6c9b150618837a4", + "source_file": "lessons/sketchnotes/LICENSE.md", + "language_code": "nl", + "failure_date": "2026-07-08T15:52:34+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-28T20:13:26+00:00", @@ -54,8 +73,8 @@ "language_code": "nl" }, "examples/README.md": { - "original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7", - "translation_date": "2025-10-03T11:32:01+00:00", + "original_hash": "7883d52c2e2a221e0b07a7b112a149b9", + "translation_date": "2026-07-08T15:46:20+00:00", "source_file": "examples/README.md", "language_code": "nl" }, @@ -66,8 +85,8 @@ "language_code": "nl" }, "lessons/0-course-setup/how-to-run.md": { - "original_hash": "a4717bd9103b9f6cd84d534b83534689", - "translation_date": "2026-01-16T03:04:55+00:00", + "original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1", + "translation_date": "2026-07-08T15:46:47+00:00", "source_file": "lessons/0-course-setup/how-to-run.md", "language_code": "nl" }, @@ -191,6 +210,12 @@ "source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md", "language_code": "nl" }, + "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": { + "original_hash": "99b816b6a4957ef4100cee4c4221dff9", + "translation_date": "2026-07-08T15:33:09+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", + "language_code": "nl" + }, "lessons/4-ComputerVision/08-TransferLearning/lab/README.md": { "original_hash": "7765935c35fcee69b9fe2d0cfd6963e2", "translation_date": "2025-08-28T19:29:25+00:00", @@ -330,8 +355,8 @@ "language_code": "nl" }, "lessons/5-NLP/README.md": { - "original_hash": "8ef02a9318257ea140ed3ed74442096d", - "translation_date": "2025-08-28T19:57:15+00:00", + "original_hash": "038df6f1a73e49f6430740da083bfd6d", + "translation_date": "2026-07-08T15:47:18+00:00", "source_file": "lessons/5-NLP/README.md", "language_code": "nl" }, diff --git a/translations/nl/CONTRIBUTING.md b/translations/nl/CONTRIBUTING.md new file mode 100644 index 0000000000..029edcbcbd --- /dev/null +++ b/translations/nl/CONTRIBUTING.md @@ -0,0 +1,29 @@ +# Bijdragen aan AI-For-Beginners + +Dank u voor uw interesse om bij te dragen aan AI-For-Beginners! We verwelkomen vertalingen, correcties van lessen en opmaakcorrecties. + +## Microsoft Contributor License Agreement (CLA) + +Dit project verwelkomt bijdragen en suggesties. De meeste bijdragen vereisen dat u akkoord gaat met een Contributor License Agreement (CLA) waarin u verklaart dat u het recht hebt, en daadwerkelijk, ons de rechten verleent om uw bijdrage te gebruiken. Voor details, bezoek [https://cla.microsoft.com](https://cla.microsoft.com). + +Wanneer u een pull request indient, bepaalt een CLA-bot automatisch of u een CLA moet aanleveren en voorziet de PR van de juiste aanduiding (bijvoorbeeld label, opmerking). Volg gewoon de instructies van de bot. U hoeft dit maar één keer te doen voor alle repositories die onze CLA gebruiken. + +## Hoe bij te dragen + +### 1. Het corrigeren van typfouten / codefouten +Als u een typfout of bug vindt in een Jupyter-notebook of les-markdownbestand: +1. Maak een fork van de repository. +2. Corrigeer de typfout of gebroken link. +3. Dien een Pull Request in met een duidelijke beschrijving van de correctie. + +### 2. Vertalingen indienen +We verwelkomen vertalingen van de lessen naar andere talen! Plaats vertalingen in de `translations/` directory met gebruik van de bestaande mapnamen daar (bijvoorbeeld `translations/es/`, `translations/pt-BR/`, `translations/zh-CN/`). + +Voor meer details, zie [etc/CONTRIBUTING.md](etc/CONTRIBUTING.md). + +--- + + +**Disclaimer**: +Dit document is vertaald met behulp van de AI vertaaldienst [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, dient u er rekening mee te houden dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in de oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor kritieke informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor eventuele misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling. + \ No newline at end of file diff --git a/translations/nl/examples/README.md b/translations/nl/examples/README.md index 414dc34b6e..826a3c934b 100644 --- a/translations/nl/examples/README.md +++ b/translations/nl/examples/README.md @@ -1,64 +1,64 @@ # Beginner-Vriendelijke AI Voorbeelden -Welkom! Deze map bevat eenvoudige, zelfstandige voorbeelden om je te helpen beginnen met AI en machine learning. Elk voorbeeld is ontworpen om toegankelijk te zijn voor beginners, met gedetailleerde opmerkingen en stapsgewijze uitleg. +Welkom! Deze map bevat eenvoudige, zelfstandige voorbeelden om je te helpen starten met AI en machine learning. Elk voorbeeld is ontworpen om beginner-vriendelijk te zijn met gedetailleerde opmerkingen en stapsgewijze uitleg. -## 📚 Overzicht van Voorbeelden +## 📚 Overzicht Voorbeelden | Voorbeeld | Beschrijving | Moeilijkheid | Vereisten | -|-----------|--------------|--------------|-----------| -| [Hello AI World](../../../examples/01-hello-ai-world.py) | Je eerste AI-programma - eenvoudige patroonherkenning | ⭐ Beginner | Basiskennis Python | -| [Eenvoudig Neuraal Netwerk](../../../examples/02-simple-neural-network.py) | Bouw een neuraal netwerk vanaf nul | ⭐⭐ Beginner+ | Python, basiswiskunde | -| [Beeldclassifier](./03-image-classifier.ipynb) | Classificeer beelden met een vooraf getraind model | ⭐⭐ Beginner+ | Python, numpy | -| [Tekstsentiment](../../../examples/04-text-sentiment.py) | Analyseer tekstsentiment (positief/negatief) | ⭐⭐ Beginner+ | Python | +|---------|-------------|------------|---------------| +| [Hello AI World](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/01-hello-ai-world.py) | Je eerste AI-programma - eenvoudige patroonherkenning | ⭐ Beginner | Basis Python | +| [Simple Neural Network](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/02-simple-neural-network.py) | Bouw een neuraal netwerk vanaf nul | ⭐⭐ Beginner+ | Python, basis wiskunde | +| [Image Classifier](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/03-image-classifier.ipynb) | Classificeer afbeeldingen met een vooraf getraind model | ⭐⭐ Beginner+ | Python, numpy | +| [Text Sentiment](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/04-text-sentiment.py) | Analyseer tekstsentiment (positief/negatief) | ⭐⭐ Beginner+ | Python | ## 🚀 Aan de Slag ### Vereisten -Zorg ervoor dat je Python hebt geïnstalleerd (3.8 of hoger aanbevolen). Installeer de benodigde pakketten: +Zorg dat je Python geïnstalleerd hebt (3.8 of hoger aanbevolen). Installeer de benodigde pakketten: ```bash -# For Python scripts +# Voor Python-scripts pip install numpy -# For Jupyter notebooks (image classifier) +# Voor Jupyter-notebooks (beeldclassifier) pip install jupyter numpy pillow tensorflow ``` -Of gebruik de conda-omgeving uit het hoofdcurriculum: +Of gebruik de conda-omgeving van het hoofdleertraject: ```bash conda env create --name ai4beg --file ../environment.yml conda activate ai4beg ``` -### Voorbeelden Uitvoeren +### De Voorbeelden Uitvoeren **Voor Python-scripts (.py bestanden):** ```bash python 01-hello-ai-world.py ``` -**Voor Jupyter-notebooks (.ipynb bestanden):** +**Voor Jupyter notebooks (.ipynb bestanden):** ```bash jupyter notebook 03-image-classifier.ipynb ``` ## 📖 Leerpad -We raden aan om de voorbeelden in volgorde te volgen: +We raden aan de voorbeelden in deze volgorde te volgen: 1. **Begin met "Hello AI World"** - Leer de basis van patroonherkenning 2. **Bouw een Eenvoudig Neuraal Netwerk** - Begrijp hoe neurale netwerken werken -3. **Probeer de Beeldclassifier** - Zie AI in actie met echte beelden +3. **Probeer de Image Classifier** - Zie AI in actie met echte afbeeldingen 4. **Analyseer Tekstsentiment** - Verken natuurlijke taalverwerking ## 💡 Tips voor Beginners -- **Lees de opmerkingen in de code zorgvuldig** - Ze leggen uit wat elke regel doet +- **Lees de code-opmerkingen aandachtig** - Ze leggen uit wat elke regel doet - **Experimenteer!** - Probeer waarden te veranderen en kijk wat er gebeurt - **Maak je geen zorgen als je niet alles begrijpt** - Leren kost tijd -- **Stel vragen** - Gebruik het [Discussiebord](https://github.com/microsoft/AI-For-Beginners/discussions) +- **Stel vragen** - Gebruik het [Discussieforum](https://github.com/microsoft/AI-For-Beginners/discussions) ## 🔗 Volgende Stappen @@ -70,7 +70,7 @@ Na het voltooien van deze voorbeelden, verken het volledige curriculum: ## 🤝 Bijdragen -Vond je deze voorbeelden nuttig? Help ons ze te verbeteren: +Vonden je deze voorbeelden nuttig? Help ons ze te verbeteren: - Meld problemen of stel verbeteringen voor - Voeg meer voorbeelden toe voor beginners - Verbeter documentatie en opmerkingen @@ -81,5 +81,7 @@ Vond je deze voorbeelden nuttig? Help ons ze te verbeteren: --- -**Disclaimer**: -Dit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, dient u zich ervan bewust te zijn dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in de oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor cruciale informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling. \ No newline at end of file + +**Disclaimer**: +Dit document is vertaald met behulp van de AI vertaaldienst [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, dient u er rekening mee te houden dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in de oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor kritieke informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor eventuele misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling. + \ No newline at end of file diff --git a/translations/nl/lessons/0-course-setup/how-to-run.md b/translations/nl/lessons/0-course-setup/how-to-run.md index 41da398b2c..6a509e455f 100644 --- a/translations/nl/lessons/0-course-setup/how-to-run.md +++ b/translations/nl/lessons/0-course-setup/how-to-run.md @@ -1,12 +1,12 @@ # Hoe de code uit te voeren -Dit curriculum bevat veel uitvoerbare voorbeelden en labs die je wilt uitvoeren. Om dit te doen, heb je de mogelijkheid nodig om Python-code uit te voeren in Jupyter Notebooks die als onderdeel van dit curriculum worden meegeleverd. Je hebt verschillende opties om de code uit te voeren: +Deze leergang bevat veel uitvoerbare voorbeelden en labs die je wilt uitvoeren. Om dit te kunnen doen, heb je de mogelijkheid nodig om Python-code uit te voeren in Jupyter Notebooks die deel uitmaken van deze leergang. Je hebt verschillende opties om de code uit te voeren: ## Lokaal op je computer uitvoeren -Om de code lokaal op je computer uit te voeren, is een Python-installatie nodig. Een aanbeveling is om **[miniconda](https://conda.io/en/latest/miniconda.html)** te installeren - het is een vrij lichte installatie die de `conda` package manager ondersteunt voor verschillende Python **virtuele omgevingen**. +Om de code lokaal op je computer uit te voeren, is een Python-installatie nodig. Een aanbeveling is om **[miniconda](https://conda.io/en/latest/miniconda.html)** te installeren - dit is een vrij lichte installatie die de `conda` pakketbeheerder ondersteunt voor verschillende Python **virtuele omgevingen**. -Nadat je miniconda hebt geïnstalleerd, clone je de repository en maak je een virtuele omgeving aan die voor deze cursus gebruikt wordt: +Nadat je miniconda hebt geïnstalleerd, kloon je de repository en maak je een virtuele omgeving aan die voor deze cursus gebruikt zal worden: ```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 gebruiken met Python-extensie +### Gebruik van Visual Studio Code met de Python-extensie -Dit curriculum gebruik je het beste wanneer je het opent in [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) met de [Python-extensie](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste). +Deze leergang is het beste te gebruiken door deze te openen in [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) met de [Python-extensie](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste). -> **Opmerking**: Zodra je de directory clonet en opent in VS Code, wordt je automatisch voorgesteld om de Python-extensies te installeren. Je moet ook miniconda installeren zoals hierboven beschreven. +> **Opmerking**: Zodra je de map kloont en opent in VS Code, zal het automatisch voorstellen om de Python-extensies te installeren. Je moet ook miniconda installeren zoals hierboven beschreven. -> **Opmerking**: Als VS Code je voorstelt om de repository opnieuw te openen in een container, moet je dit weigeren om de lokale Python-installatie te gebruiken. +> **Opmerking**: Als VS Code je voorstelt om de repository opnieuw te openen in een container, moet je dit weigeren om de lokale Python-installatie te gebruiken. -### Jupyter in de browser gebruiken +### Gebruik van Jupyter in de browser -Je kunt ook een Jupyter-omgeving gebruiken vanuit de browser op je eigen computer. Zowel klassieke Jupyter als JupyterHub bieden een handige ontwikkelomgeving met automatische aanvulling, syntaxmarkering, etc. +Je kunt ook een Jupyter-omgeving vanuit de browser op je eigen computer gebruiken. Zowel klassieke Jupyter als JupyterHub bieden een handige ontwikkelomgeving met automatische aanvulling, code-kleuring, enzovoort. -Om Jupyter lokaal te starten, ga je naar de directory van de cursus, en voer je uit: +Om Jupyter lokaal te starten, ga je naar de map van de cursus en voer je het volgende uit: ```bash jupyter notebook @@ -36,36 +36,36 @@ of ```bash jupyterhub ``` -Je kunt dan naar een van de `.ipynb`-bestanden navigeren, deze openen en beginnen met werken. +Je kunt dan naar elk `.ipynb`-bestand navigeren, deze openen en beginnen met werken. ### Uitvoeren in een container -Een alternatief voor Python-installatie zou zijn om de code in een container uit te voeren. Omdat onze repository een speciale `.devcontainer` map aanlevert die instructies bevat over hoe een container voor deze repo te bouwen, biedt VS Code de mogelijkheid om de code opnieuw in een container te openen. Dit vereist een Docker-installatie en is ook wat complexer, daarom raden we dit aan voor meer ervaren gebruikers. +Een alternatief voor een Python-installatie is het uitvoeren van de code in een container. Omdat onze repository een speciale `.devcontainer`-map bevat die aangeeft hoe je een container bouwt voor deze repo, biedt VS Code de mogelijkheid om de code opnieuw te openen in een container. Dit vereist een Docker-installatie en is ook wat complexer, dus we raden dit aan voor meer ervaren gebruikers. ## Uitvoeren in de cloud -Als je Python niet lokaal wilt installeren, en toegang hebt tot wat cloudresources, is een goed alternatief om de code in de cloud uit te voeren. Er zijn verschillende manieren om dit te doen: +Als je Python niet lokaal wilt installeren en toegang hebt tot cloudresources, is een goed alternatief om de code in de cloud uit te voeren. Er zijn verschillende manieren om dit te doen: -* Gebruik maken van **[GitHub Codespaces](https://github.com/features/codespaces)**, wat een virtuele omgeving is die voor jou op GitHub wordt aangemaakt, toegankelijk via een VS Code-browserinterface. Als je toegang hebt tot Codespaces, kun je gewoon op de **Code** knop in de repo klikken, een codespace starten en zonder vertraging aan de slag gaan. -* Gebruik maken van **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) biedt gratis computerresources in de cloud voor mensen zoals jij om code op GitHub uit te proberen. Op de startpagina is een knop om de repository in Binder te openen - dit brengt je snel naar de Binder-site, die een onderliggende container bouwt en naadloos een Jupyter-webinterface voor je start. +* Gebruik **[GitHub Codespaces](https://github.com/features/codespaces)**, een virtuele omgeving die voor jou is aangemaakt op GitHub en toegankelijk is via een VS Code-browserinterface. Als je toegang hebt tot Codespaces, kun je gewoon op de **Code**-knop in de repo klikken, een codespace starten en meteen aan de slag gaan. +* Gebruik **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) biedt gratis computerkracht in de cloud voor mensen zoals jij om code van GitHub te testen. Er is een knop op de startpagina om de repository in Binder te openen - dit brengt je snel naar de Binder-site waar een onderliggende container wordt opgebouwd en naadloos een Jupyter-webinterface voor je start. -> **Opmerking**: Om misbruik te voorkomen, heeft Binder toegang tot sommige webresources geblokkeerd. Dit kan voorkomen dat sommige code werkt die modellen en/of datasets van het openbare internet haalt. Mogelijk moet je enkele omwegen vinden. Ook zijn de computerresources van Binder behoorlijk beperkt, dus het trainen zal traag zijn, vooral in latere, meer complexe lessen. +> **Opmerking**: Om misbruik te voorkomen, heeft Binder de toegang tot sommige webresources geblokkeerd. Dit kan voorkomen dat een deel van de code werkt, vooral als deze modellen en/of datasets van het publieke internet ophaalt. Je moet mogelijk een workaround vinden. Ook zijn de computerresources die door Binder worden geleverd vrij basic, dus training zal traag zijn, vooral in latere, meer complexe lessen. ## Uitvoeren in de cloud met GPU -Sommige van de latere lessen in dit curriculum profiteren aanzienlijk van GPU-ondersteuning. Modeltraining kan anders erg traag zijn. Er zijn een paar opties die je kunt volgen, vooral als je toegang hebt tot de cloud, bijvoorbeeld via [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) of via je instelling: +Sommige van de latere lessen in deze leergang profiteren sterk van GPU-ondersteuning. Bijvoorbeeld het trainen van modellen kan anders erg traag zijn. Er zijn een paar opties die je kunt volgen, vooral als je toegang hebt tot cloud via [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste), of via je onderwijsinstelling: -* Maak een [Data Science Virtual Machine](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) aan en verbind ermee via Jupyter. Je kunt de repo dan direct op de machine clonen en beginnen met leren. NC-series VM's hebben GPU-ondersteuning. +* Maak een [Data Science Virtual Machine](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) aan en maak verbinding via Jupyter. Je kunt dan de repo direct op de machine klonen en beginnen met leren. NC-series VM’s hebben GPU-ondersteuning. -> **Opmerking**: Sommige abonnementen, waaronder Azure for Students, bieden standaard geen GPU-ondersteuning. Je moet mogelijk extra GPU-cores aanvragen via een technische supportaanvraag. +> **Opmerking**: Sommige abonnementen, waaronder Azure for Students, bieden niet direct GPU-ondersteuning. Je moet mogelijk extra GPU-kernen aanvragen via een technische supportaanvraag. -* Maak een [Azure Machine Learning Workspace](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) aan en gebruik dan de Notebook-functie daar. [Deze video](https://azure-for-academics.github.io/quickstart/azureml-papers/) laat zien hoe je een repository in een Azure ML-notebook clonet en gebruikt. +* Maak een [Azure Machine Learning Workspace](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) aan en gebruik daar de Notebook-functie. [Deze video](https://azure-for-academics.github.io/quickstart/azureml-papers/) laat zien hoe je een repository naar een Azure ML-notebook kloont en er begint mee te werken. -Je kunt ook Google Colab gebruiken, dat enige gratis GPU-ondersteuning heeft, en Jupyter Notebooks daar uploaden om ze stuk voor stuk uit te voeren. +Je kunt ook Google Colab gebruiken, dat met wat gratis GPU-ondersteuning komt, en daar Jupyter Notebooks uploaden om ze één voor één uit te voeren. --- **Disclaimer**: -Dit document is vertaald met behulp van de AI-vertalingsdienst [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, dient u er rekening mee te houden dat automatische vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in de oorspronkelijke taal dient als de gezaghebbende bron te worden beschouwd. Voor cruciale informatie wordt een professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling. +Dit document is vertaald met behulp van de AI vertaaldienst [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, dient u er rekening mee te houden dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in de oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor kritieke informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor eventuele misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling. \ No newline at end of file diff --git a/translations/nl/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/nl/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index bb002306a7..db7a5188ca 100644 --- a/translations/nl/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/nl/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -4,11 +4,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Voorgetrainde modellen en transfer learning\n", + "# Voorgetrainde modellen en transferleren\n", "\n", - "Het trainen van CNN's kan veel tijd kosten, en er is veel data nodig voor die taak. Echter, een groot deel van de tijd wordt besteed aan het leren van de beste laag-niveau filters die een netwerk gebruikt om patronen uit afbeeldingen te halen. Een logische vraag die dan opkomt is: kunnen we een neuraal netwerk dat op één dataset is getraind gebruiken en aanpassen om andere afbeeldingen te classificeren zonder het volledige trainingsproces te doorlopen?\n", + "Het trainen van CNN's kan veel tijd in beslag nemen, en daarvoor is veel data nodig. Echter, een groot deel van de tijd wordt besteed aan het leren van de beste laag-niveau filters die een netwerk gebruikt om patronen uit afbeeldingen te extraheren. Een natuurlijke vraag rijst - kunnen we een neuraal netwerk dat op een dataset is getraind gebruiken en aanpassen voor het classificeren van andere afbeeldingen zonder het volledige trainingsproces door te lopen?\n", "\n", - "Deze aanpak wordt **transfer learning** genoemd, omdat we kennis overdragen van het ene neurale netwerkmodel naar het andere. Bij transfer learning beginnen we meestal met een voorgetraind model, dat is getraind op een grote afbeeldingsdataset, zoals **ImageNet**. Deze modellen kunnen al goed verschillende kenmerken uit algemene afbeeldingen halen, en in veel gevallen kan het bouwen van een classifier bovenop die geëxtraheerde kenmerken al tot goede resultaten leiden.\n" + "Deze aanpak heet **transferleren**, omdat we wat kennis overdragen van het ene neurale netwerkmodel naar het andere. Bij transferleren beginnen we meestal met een voorgetraind model, dat is getraind op een grote afbeeldingsdataset, zoals **ImageNet**. Die modellen kunnen al goed verschillende kenmerken uit generieke afbeeldingen extraheren, en in veel gevallen kan het bouwen van een classifier bovenop die geëxtraheerde kenmerken al een goed resultaat opleveren.\n" ] }, { @@ -31,9 +31,9 @@ "source": [ "## Cats vs. Dogs Dataset\n", "\n", - "In deze unit gaan we een real-life probleem oplossen: het classificeren van afbeeldingen van katten en honden. Hiervoor gebruiken we [Kaggle Cats vs. Dogs Dataset](https://www.kaggle.com/c/dogs-vs-cats), die ook kan worden gedownload [van Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n", + "In deze eenheid zullen we een praktisch probleem oplossen door afbeeldingen van katten en honden te classificeren. Hiervoor gebruiken we de [Kaggle Cats vs. Dogs Dataset](https://www.kaggle.com/c/dogs-vs-cats), die ook kan worden gedownload [van Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n", "\n", - "Laten we deze dataset downloaden en uitpakken in de `data`-map (dit proces kan enige tijd duren!):\n" + "Laten we deze dataset downloaden en uitpakken in de `data` map (dit proces kan even duren!):\n" ] }, { @@ -64,7 +64,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Helaas zijn er enkele corrupte afbeeldingsbestanden in de dataset. We moeten snel schoonmaken om te controleren op corrupte bestanden. Om deze tutorial niet te verstoren, hebben we de code om de dataset te verifiëren naar een module verplaatst.\n" + "Helaas zijn er enkele beschadigde afbeeldingsbestanden in de dataset. We moeten een snelle schoonmaak uitvoeren om te controleren op beschadigde bestanden. Om deze tutorial niet te verstoren, hebben we de code om de dataset te verifiëren naar een module verplaatst.\n" ] }, { @@ -335,11 +335,11 @@ "source": [ "## Het laden van de dataset\n", "\n", - "In eerdere voorbeelden hebben we datasets geladen die ingebouwd zijn in Keras. Nu gaan we werken met onze eigen dataset, die we moeten laden vanuit een map met afbeeldingen.\n", + "In vorige voorbeelden laadden we datasets die ingebouwd zijn in Keras. Nu gaan we aan de slag met onze eigen dataset, die we moeten laden vanuit een map met afbeeldingen.\n", "\n", - "In de praktijk kunnen de afmetingen van afbeeldingsdatasets behoorlijk groot zijn, en je kunt er niet op vertrouwen dat alle data in het geheugen past. Daarom worden datasets vaak weergegeven als **generatoren** die data kunnen teruggeven in minibatches die geschikt zijn voor training.\n", + "In de praktijk kunnen de omvang van afbeeldingsdatasets behoorlijk groot zijn, en men kan er niet vanuit gaan dat alle data in het geheugen past. Daarom worden datasets vaak voorgesteld als **generators** die data in minibatches kunnen teruggeven die geschikt zijn voor training.\n", "\n", - "Om met beeldclassificatie om te gaan, bevat Keras een speciale functie `image_dataset_from_directory`, die afbeeldingen kan laden uit submappen die overeenkomen met verschillende klassen. Deze functie zorgt ook voor het schalen van afbeeldingen en kan de dataset opsplitsen in trainings- en testsets:\n" + "Om te werken met beeldclassificatie, bevat Keras de speciale functie `image_dataset_from_directory`, die afbeeldingen kan laden vanuit submappen die overeenkomen met verschillende klassen. Deze functie zorgt ook voor het schalen van afbeeldingen, en kan ook de dataset splitsen in train- en testgedeelten:\n" ] }, { @@ -383,9 +383,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Het is belangrijk om dezelfde `seed` waarde in te stellen voor beide oproepen, omdat dit invloed heeft op de verdeling van afbeeldingen tussen de train- en testdataset.\n", + "Het is belangrijk om dezelfde `seed` waarde in te stellen voor beide aanroepen, omdat dit de verdeling van afbeeldingen tussen de train- en testdataset beïnvloedt.\n", "\n", - "De dataset haalt automatisch de klassenamen op uit de mappen, en je kunt ze indien nodig opvragen door:\n" + "Dataset haalt automatisch klasnamen uit mappen op, en je kunt ze indien nodig benaderen door te bellen:\n" ] }, { @@ -412,7 +412,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Datasets die we hebben verkregen kunnen direct worden doorgegeven aan de `fit`-functie om het model te trainen. Ze bevatten zowel bijbehorende afbeeldingen als labels, die kunnen worden doorlopen met behulp van de volgende constructie:\n" + "Datasets die we hebben verkregen kunnen direct aan de `fit` functie worden doorgegeven om het model te trainen. Ze bevatten zowel bijbehorende afbeeldingen als labels, waarover kan worden geloopt met de volgende constructie:\n" ] }, { @@ -453,7 +453,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "> **Opmerking**: Alle afbeeldingen in de dataset worden weergegeven als floating-point tensors met een bereik van 0-255. Voordat we ze aan het neurale netwerk doorgeven, moeten we deze waarden schalen naar een bereik van 0-1. Bij het plotten van afbeeldingen moeten we hetzelfde doen, of de waarden converteren naar het `int`-type (wat we doen in de bovenstaande code), om `matplotlib` te laten zien dat we de originele niet-geschaalde afbeelding willen plotten.\n" + "> **Opmerking**: Alle afbeeldingen in de dataset worden weergegeven als floating point-tensoren met een bereik van 0-255. Voordat we ze aan het neurale netwerk doorgeven, moeten we deze waarden schalen naar een bereik van 0-1. Bij het plotten van afbeeldingen moeten we hetzelfde doen, of waarden converteren naar het `int`-type (wat we hierboven in de code doen), om aan `matplotlib` te laten zien dat we de oorspronkelijke, niet-geschaalde afbeelding willen plotten.\n" ] }, { @@ -462,7 +462,7 @@ "source": [ "## Voorgetrainde modellen\n", "\n", - "Voor veel beeldclassificatietaken zijn er voorgetrainde neurale netwerkmodellen beschikbaar. Veel van deze modellen zijn te vinden binnen de `keras.applications` namespace, en nog meer modellen zijn beschikbaar op het internet. Laten we eens kijken hoe het eenvoudigste VGG-16 model geladen en gebruikt kan worden:\n" + "Voor veel beeldclassificatietaken zijn er voorgetrainde neurale netwerkmodellen beschikbaar. Veel van die modellen zijn beschikbaar binnen de `keras.applications` namespace, en nog meer modellen zijn te vinden op het internet. Laten we eens zien hoe het eenvoudigste VGG-16 model kan worden geladen en gebruikt:\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": [ - "Er zijn een paar belangrijke dingen hier:\n", - "* Voordat een invoer aan een voorgetraind netwerk wordt doorgegeven, moet deze op een bepaalde manier worden voorbewerkt. Dit gebeurt door de bijbehorende functie `preprocess_input` aan te roepen, die een batch afbeeldingen ontvangt en hun bewerkte vorm teruggeeft. In het geval van VGG-16 worden de afbeeldingen genormaliseerd en wordt een vooraf bepaalde gemiddelde waarde voor elke kanaal afgetrokken. Dit komt omdat VGG-16 oorspronkelijk met deze voorbewerking is getraind.\n", - "* Het neurale netwerk wordt toegepast op de invoerbatch, en als resultaat ontvangen we een batch van 1000-element tensors die de waarschijnlijkheid van elke klasse aangeven. We kunnen het meest waarschijnlijke klasnummer vinden door `argmax` op deze tensor aan te roepen.\n", - "* Het verkregen resultaat is een [nummer van een `ImageNet`-klasse](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Om dit resultaat te begrijpen, kunnen we ook de functie `decode_predictions` gebruiken, die de top n klassen samen met hun namen retourneert.\n" + "Er zijn hier een paar belangrijke dingen:\n", + "* Voordat een invoer naar een vooraf getraind netwerk wordt gestuurd, moet deze op een bepaalde manier worden voorbewerkt. Dit gebeurt door het aanroepen van de bijbehorende `preprocess_input` functie, die een batch afbeeldingen ontvangt en hun verwerkte vorm retourneert. In het geval van VGG-16 worden afbeeldingen genormaliseerd en wordt een vooraf gedefinieerde gemiddelde waarde voor elk kanaal afgetrokken. Dat is omdat VGG-16 oorspronkelijk met deze voorbewerking is getraind.\n", + "* Het neurale netwerk wordt toegepast op de invoerbatch, en we ontvangen als resultaat een batch van 1000-elemententensors die de waarschijnlijkheid van elke klasse weergeven. We kunnen het meest waarschijnlijke klasnummer vinden door `argmax` op deze tensor aan te roepen.\n", + "* Het verkregen resultaat is een [nummer van een `ImageNet` klasse](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Om dit resultaat te interpreteren, kunnen we ook de `decode_predictions` functie gebruiken, die de top n klassen retourneert samen met hun namen.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Laten we ook de architectuur van het VGG-16-netwerk bekijken:\n" + "Laten we ook de architectuur van het VGG-16 netwerk bekijken:\n" ] }, { @@ -599,7 +609,7 @@ "source": [ "## GPU-berekeningen\n", "\n", - "Diepe neurale netwerken, zoals VGG-16 en andere modernere architecturen, vereisen behoorlijk wat rekenkracht om te draaien. Het is logisch om GPU-versnelling te gebruiken als deze beschikbaar is. Gelukkig versnelt Keras automatisch de berekeningen op de GPU als deze beschikbaar is. We kunnen controleren of Tensorflow de GPU kan gebruiken met de volgende code:\n" + "Diepe neurale netwerken, zoals VGG-16 en andere meer moderne architecturen, vereisen behoorlijk wat rekenkracht om te draaien. Het is logisch om gebruik te maken van GPU-versnelling, als deze beschikbaar is. Gelukkig versnelt Keras automatisch de berekeningen op de GPU als deze beschikbaar is. We kunnen controleren of Tensorflow de GPU kan gebruiken met de volgende code:\n" ] }, { @@ -626,9 +636,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## VGG-functies extraheren\n", "\n", - "Als we VGG-16 willen gebruiken om functies uit onze afbeeldingen te halen, hebben we het model nodig zonder de laatste classificatielagen. We kunnen het VGG-16 model zonder de bovenste lagen instantiëren met deze code:\n" + "## VGG-kenmerken extraheren\n", + "\n", + "Als we VGG-16 willen gebruiken om kenmerken uit onze afbeeldingen te halen, hebben we het model zonder de laatste classificatielagen nodig. We kunnen het VGG-16-model zonder bovenste lagen instantiëren met deze code:\n" ] }, { @@ -680,9 +691,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "De dimensie van de feature-tensor is 7x7x512, maar om het te kunnen visualiseren moesten we het omvormen naar een 2D-vorm.\n", + "De dimensie van de feature-tensor is 7x7x512, maar om deze te visualiseren moesten we het herschikken naar een 2D-vorm.\n", "\n", - "Laten we nu proberen te zien of deze features gebruikt kunnen worden om afbeeldingen te classificeren. We nemen handmatig een deel van de afbeeldingen (in ons geval 50 minibatches) en berekenen vooraf hun feature-vectoren. We kunnen hiervoor de **dataset** API van Tensorflow gebruiken. De `map`-functie neemt een dataset en past een gegeven lambda-functie toe om deze te transformeren. We gebruiken dit mechanisme om nieuwe datasets te maken, `ds_features_train` en `ds_features_test`, die VGG-geëxtraheerde features bevatten in plaats van de originele afbeeldingen.\n" + "Laten we nu proberen te zien of die features gebruikt kunnen worden om afbeeldingen te classificeren. Laten we handmatig een deel van de afbeeldingen nemen (50 minibatches, in ons geval) en hun featurevectoren vooraf berekenen. We kunnen de Tensorflow **dataset** API gebruiken om dat te doen. De `map` functie neemt een dataset en past er een gegeven lambda-functie op toe om deze te transformeren. We gebruiken dit mechanisme om nieuwe datasets te construeren, `ds_features_train` en `ds_features_test`, die VGG-extractie features bevatten in plaats van originele afbeeldingen.\n" ] }, { @@ -712,9 +723,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We gebruikten de constructie `.take(50)` om de datasetgrootte te beperken, zodat onze demonstratie sneller verloopt. Je kunt dit experiment natuurlijk ook uitvoeren op de volledige dataset.\n", + "We hebben de constructie `.take(50)` gebruikt om de datasetgrootte te beperken, om onze demonstratie te versnellen. Je kunt dit experiment natuurlijk uitvoeren op de volledige dataset.\n", "\n", - "Nu we een dataset hebben met geëxtraheerde kenmerken, kunnen we een eenvoudige dense classifier trainen om onderscheid te maken tussen katten en honden. Dit netwerk neemt een featurevector met de vorm (7,7,512) en produceert één output die overeenkomt met ofwel een hond of een kat. Omdat het een binaire classificatie is, gebruiken we de `sigmoid` activatiefunctie en de `binary_crossentropy` verliesfunctie.\n" + "Nu we een dataset hebben met geëxtraheerde kenmerken, kunnen we een eenvoudige dense classifier trainen om katten en honden van elkaar te onderscheiden. Dit netwerk neemt een featurevector van vorm (7,7,512) en produceert één output die overeenkomt met een hond of een kat. Omdat het een binaire classificatie is, gebruiken we de `sigmoid` activatiefunctie en de `binary_crossentropy` loss.\n" ] }, { @@ -743,13 +754,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Het resultaat is geweldig, we kunnen met bijna 95% zekerheid onderscheid maken tussen een kat en een hond! Echter, we hebben deze aanpak alleen getest op een subset van alle afbeeldingen, omdat handmatige feature-extractie veel tijd lijkt te kosten.\n", + "Het resultaat is geweldig, we kunnen bijna 95% waarschijnlijkheid onderscheid maken tussen een kat en een hond! We hebben deze benadering echter alleen getest op een subset van alle afbeeldingen, omdat handmatige kenmerkextractie veel tijd lijkt te kosten.\n", "\n", "## Transfer learning met één VGG-netwerk\n", "\n", - "We kunnen het handmatig vooraf berekenen van de features ook vermijden door tijdens de training de originele VGG-16 netwerk in zijn geheel te gebruiken, door een feature extractor toe te voegen als eerste laag van ons netwerk.\n", + "We kunnen ook voorkomen dat we de kenmerken handmatig vooraf berekenen door het originele VGG-16 netwerk als geheel te gebruiken tijdens het trainen, door een feature extractor toe te voegen aan ons netwerk als eerste laag.\n", "\n", - "Het mooie van de Keras-architectuur is dat het VGG-16 model dat we hierboven hebben gedefinieerd ook kan worden gebruikt als een laag in een ander neuraal netwerk! We hoeven alleen een netwerk te construeren met een dense classifier erbovenop, en vervolgens het hele netwerk te trainen met behulp van backpropagation.\n" + "Het mooie van de Keras-architectuur is dat het VGG-16 model dat we hierboven hebben gedefinieerd ook kan worden gebruikt als een laag in een ander neuraal netwerk! We hoeven alleen maar een netwerk te bouwen met een dense classifier erbovenop, en vervolgens het hele netwerk te trainen met behulp van backpropagation.\n" ] }, { @@ -793,13 +804,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Dit model lijkt op een end-to-end classificatienetwerk, dat een afbeelding neemt en de klasse retourneert. Het lastige is echter dat we willen dat VGG16 fungeert als een feature extractor en niet opnieuw wordt getraind. Daarom moeten we de **gewichten van de convolutionele feature extractor bevriezen**. We kunnen toegang krijgen tot de eerste laag van het netwerk door `model.layers[0]` aan te roepen, en we hoeven alleen maar de eigenschap `trainable` op `False` te zetten.\n", + "Dit model lijkt op een end-to-end classificatienetwerk, dat een afbeelding neemt en de klasse retourneert. Het lastige is echter dat we willen dat VGG16 fungeert als een feature-extractor, en niet opnieuw getraind wordt. Daarom moeten we de **gewichten van de convolutionele feature-extractor bevriezen**. We kunnen toegang krijgen tot de eerste laag van het netwerk door `model.layers[0]` aan te roepen, en we hoeven alleen de eigenschap `trainable` op `False` te zetten.\n", "\n", - "> **Opmerking**: Het bevriezen van de gewichten van de feature extractor is nodig, omdat anders de ongetrainde classifier-laag de originele voorgetrainde gewichten van de convolutionele extractor kan overschrijven.\n", + "> **Opmerking**: Het bevriezen van de gewichten van de feature-extractor is nodig, omdat anders de niet-getrainde classificatielaag de originele voor-getrainde gewichten van de convolutionele extractor kan vernietigen.\n", "\n", - "Je kunt opmerken dat, hoewel het totale aantal parameters in ons netwerk ongeveer 15 miljoen is, we slechts 25k parameters trainen. Alle andere parameters van de bovenste convolutionele filters zijn voorgetraind. Dat is goed, omdat we een kleiner aantal parameters kunnen fijn afstellen met een kleiner aantal voorbeelden.\n", + "Je kunt zien dat hoewel het totale aantal parameters in ons netwerk ongeveer 15 miljoen is, we slechts 25k parameters trainen. Alle andere parameters van convolutionele filters op hoog niveau zijn voorgetraind. Dat is goed, omdat we in staat zijn een kleiner aantal parameters te verfijnen met een kleiner aantal voorbeelden.\n", "\n", - "We gaan nu ons netwerk trainen en kijken hoe goed we kunnen presteren. Verwacht een vrij lange uitvoeringstijd, en maak je geen zorgen als het lijkt alsof de uitvoering een tijdje vastloopt.\n" + "We gaan nu ons netwerk trainen en kijken hoe goed we kunnen worden. Verwacht een tamelijk lange looptijd, en maak je geen zorgen als de uitvoering enige tijd lijkt te bevriezen.\n" ] }, { @@ -824,9 +835,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Het lijkt erop dat we een redelijk nauwkeurige katten- versus hondenclassifier hebben verkregen!\n", + "Het lijkt erop dat we een redelijk nauwkeurige katten versus honden classifier hebben verkregen!\n", "\n", - "## Het model opslaan en laden\n", + "## Het opslaan en laden van het model\n", "\n", "Zodra we het model hebben getraind, kunnen we de modelarchitectuur en getrainde gewichten opslaan in een bestand voor toekomstig gebruik:\n" ] @@ -852,7 +863,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We kunnen het model op elk moment vanuit een bestand laden. Dit kan handig zijn als het volgende experiment het model vernietigt - je hoeft dan niet helemaal opnieuw te beginnen.\n" + "We kunnen het model dan op elk moment vanuit het bestand laden. Dit kan handig zijn voor het geval het volgende experiment het model vernietigt - dan hoef je niet helemaal opnieuw te beginnen.\n" ] }, { @@ -868,15 +879,15 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Fine-tuning transfer learning\n", + "## Fijn afstemmen van transfer learning\n", "\n", - "In de vorige sectie hebben we de laatste classifier-laag getraind om afbeeldingen in onze eigen dataset te classificeren. Echter, we hebben de feature extractor niet opnieuw getraind, en ons model maakte gebruik van de features die het model heeft geleerd op ImageNet-data. Als jouw objecten visueel verschillen van gewone ImageNet-afbeeldingen, werkt deze combinatie van features mogelijk niet optimaal. Daarom is het logisch om ook de convolutionele lagen te gaan trainen.\n", + "In de vorige sectie hebben we de laatste classificatielaag getraind om afbeeldingen in onze eigen dataset te classificeren. We hebben echter de feature-extractor niet opnieuw getraind en ons model vertrouwde op de kenmerken die het model had geleerd van ImageNet-gegevens. Als uw objecten visueel verschillen van gewone ImageNet-afbeeldingen, werkt deze combinatie van kenmerken mogelijk niet het beste. Het is daarom logisch om ook de convolutionele lagen te trainen.\n", "\n", - "Om dat te doen, kunnen we de parameters van de convolutionele filters die we eerder hebben bevroren, weer vrijgeven.\n", + "Om dat te doen, kunnen we de parameters van de convolutionele filter 'ontdooien' die we eerder hadden bevroren.\n", "\n", - "> **Note:** Het is belangrijk dat je eerst de parameters bevriest en enkele epochs traint om de gewichten in de classificatielaag te stabiliseren. Als je meteen begint met het trainen van een end-to-end netwerk met vrijgegeven parameters, is de kans groot dat grote fouten de voorgetrainde gewichten in de convolutionele lagen vernietigen.\n", + "> **Opmerking:** Het is belangrijk dat u eerst de parameters bevriest en een aantal epochs training uitvoert om de gewichten in de classificatielaag te stabiliseren. Als u onmiddellijk begint met het trainen van het end-to-end netwerk met ontdooide parameters, is de kans groot dat grote fouten de vooraf getrainde gewichten in de convolutionele lagen vernietigen.\n", "\n", - "Ons convolutionele VGG-16 model bevindt zich in de eerste laag en bestaat zelf uit veel lagen. We kunnen de structuur ervan bekijken:\n" + "Ons convolutionele VGG-16 model bevindt zich binnen de eerste laag en bestaat zelf uit veel lagen. We kunnen zijn structuur bekijken:\n" ] }, { @@ -945,7 +956,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We kunnen alle lagen van de convolutionele basis ontgrendelen:\n" + "We kunnen alle lagen van de convolutionele basis deblokkeren:\n" ] }, { @@ -961,7 +972,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Echter, het tegelijkertijd ontgrendelen van allemaal is niet het beste idee. We kunnen eerst slechts een paar laatste lagen van convoluties ontgrendelen, omdat deze hogere niveau patronen bevatten die relevant zijn voor onze afbeeldingen. Bijvoorbeeld, om te beginnen, kunnen we alle lagen bevroren houden behalve de laatste 4:\n" + "Het tegelijk unfreezen van ze allemaal is echter niet het beste idee. We kunnen eerst alleen een paar laatste convolutielagen unfreezen, omdat deze hogere niveau patronen bevatten die relevant zijn voor onze afbeeldingen. Bijvoorbeeld, om te beginnen kunnen we alle lagen bevriezen behalve de laatste 4: \n" ] }, { @@ -1002,7 +1013,7 @@ "source": [ "Merk op dat het aantal trainbare parameters aanzienlijk is toegenomen, maar het is nog steeds ongeveer 50% van alle parameters.\n", "\n", - "Na het ontgrendelen kunnen we nog een paar extra epochs trainen (in ons voorbeeld doen we er slechts één). Je kunt ook een lagere leersnelheid kiezen om de impact op de voorgetrainde gewichten te minimaliseren. Echter, zelfs met een lage leersnelheid kun je verwachten dat de nauwkeurigheid in het begin van de training daalt, totdat uiteindelijk een iets hoger niveau wordt bereikt dan in het geval van vaste gewichten.\n", + "Na het deblokkeren kunnen we nog een paar tijdperken van training doen (in ons voorbeeld doen we er maar één). Je kunt ook een lagere leer snelheid kiezen om de impact op de voorgetrainde gewichten te minimaliseren. Echter, zelfs met een lage leer snelheid kun je verwachten dat de nauwkeurigheid aan het begin van de training daalt, totdat deze uiteindelijk iets hoger wordt dan in het geval van vaste gewichten.\n", "\n", "> **Opmerking:** Deze training verloopt veel langzamer, omdat we de gradiënten terug moeten propageren door veel lagen van het netwerk!\n" ] @@ -1028,18 +1039,18 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We zullen waarschijnlijk een hogere trainingsnauwkeurigheid bereiken, omdat we een krachtiger netwerk met meer parameters gebruiken, maar de validatienauwkeurigheid zal niet evenredig toenemen.\n", + "We zullen waarschijnlijk een hogere trainingsnauwkeurigheid bereiken, omdat we een krachtiger netwerk met meer parameters gebruiken, maar de validatienauwkeurigheid zal niet zoveel toenemen.\n", "\n", - "Voel je vrij om nog een paar extra lagen van het netwerk te ontgrendelen en verder te trainen, om te zien of je een hogere nauwkeurigheid kunt behalen!\n" + "Voel je vrij om nog een paar lagen van het netwerk te ontvriezen en meer te trainen, om te zien of je een hogere nauwkeurigheid kunt bereiken!\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Andere computervisiemodellen\n", + "## Andere computer vision-modellen\n", "\n", - "VGG-16 is een van de eenvoudigste computervisie-architecturen. Keras biedt veel meer vooraf getrainde netwerken. De meest gebruikte hiervan zijn **ResNet**-architecturen, ontwikkeld door Microsoft, en **Inception** van Google. Laten we bijvoorbeeld de architectuur van het eenvoudigste ResNet-50 model verkennen (ResNet is een familie van modellen met verschillende dieptes, je kunt experimenteren met ResNet-152 als je wilt zien hoe een echt diep model eruitziet):\n" + "VGG-16 is een van de eenvoudigste computer vision-architecturen. Keras biedt nog veel meer vooraf getrainde netwerken. De meest gebruikte daarvan zijn de **ResNet**-architecturen, ontwikkeld door Microsoft, en **Inception** van Google. Laten we bijvoorbeeld de architectuur van het eenvoudigste ResNet-50-model verkennen (ResNet is een familie van modellen met verschillende dieptes; je kunt experimenteren met ResNet-152 als je wilt zien hoe een echt diep model eruitziet):\n" ] }, { @@ -1441,29 +1452,29 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Zoals je kunt zien, bevat het model dezelfde vertrouwde bouwstenen: convolutionele lagen, poolinglagen en een uiteindelijke dense classifier. We kunnen dit model op exact dezelfde manier gebruiken als we VGG-16 hebben gebruikt voor transfer learning. Je kunt experimenteren met de bovenstaande code door verschillende ResNet-modellen als basismodel te gebruiken en te kijken hoe de nauwkeurigheid verandert.\n", + "Zoals je kunt zien, bevat het model dezelfde vertrouwde bouwstenen: convolutionele lagen, pooling-lagen en een uiteindelijke dichte classifier. We kunnen dit model op exact dezelfde manier gebruiken als we VGG-16 hebben gebruikt voor transfer learning. Je kunt proberen te experimenteren met de bovenstaande code, door verschillende ResNet-modellen als basismodel te gebruiken, en te zien hoe de nauwkeurigheid verandert.\n", "\n", - "## Batch Normalisatie\n", + "## Batchnormalisatie\n", "\n", - "Dit netwerk bevat nog een ander type laag: **Batch Normalisatie**. Het idee achter batch normalisatie is om de waarden die door het neurale netwerk stromen naar het juiste interval te brengen. Neurale netwerken werken meestal het beste wanneer alle waarden zich in het bereik van [-1,1] of [0,1] bevinden, en daarom schalen/normaliseren we onze invoergegevens dienovereenkomstig. Tijdens het trainen van een diep netwerk kan het echter gebeuren dat waarden aanzienlijk buiten dit bereik vallen, wat het trainen problematisch maakt. De batch normalisatielaag berekent het gemiddelde en de standaardafwijking voor alle waarden van de huidige minibatch en gebruikt deze om het signaal te normaliseren voordat het door een laag van het neurale netwerk wordt gestuurd. Dit verbetert de stabiliteit van diepe netwerken aanzienlijk.\n" + "Dit netwerk bevat nog een ander type laag: **Batchnormalisatie**. Het idee van batchnormalisatie is om waarden die door het neurale netwerk stromen naar het juiste interval te brengen. Gewoonlijk werken neurale netwerken het beste wanneer alle waarden binnen het bereik van [-1,1] of [0,1] liggen, en dat is de reden dat we onze invoergegevens dienovereenkomstig schalen/normaliseren. Tijdens het trainen van een diep netwerk kan het echter gebeuren dat waarden aanzienlijk buiten dit bereik komen, wat het trainen problematisch maakt. De batchnormalisatielaag berekent het gemiddelde en de standaarddeviatie voor alle waarden van de huidige minibatch, en gebruikt deze om het signaal te normaliseren voordat het door een neurale netwerklaag wordt gestuurd. Dit verbetert de stabiliteit van diepe netwerken aanzienlijk.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Belangrijkste punten\n", + "## Conclusie\n", "\n", - "Met behulp van transfer learning konden we snel een classifier samenstellen voor onze aangepaste objectclassificatietaak en een hoge nauwkeurigheid behalen. Dit voorbeeld was echter niet helemaal eerlijk, omdat het originele VGG-16-netwerk vooraf was getraind om katten en honden te herkennen. We maakten dus vooral gebruik van patronen die al in het netwerk aanwezig waren. Je kunt een lagere nauwkeurigheid verwachten bij meer exotische, domeinspecifieke objecten, zoals details op een productielijn in een fabriek of verschillende boombladeren.\n", + "Met transfer learning konden we snel een classifier samenstellen voor onze aangepaste objectclassificatietaak en een hoge nauwkeurigheid bereiken. Deze voorbeeld was echter niet helemaal eerlijk, omdat het originele VGG-16-netwerk vooraf was getraind om katten en honden te herkennen, en we dus grotendeels de patronen hergebruikten die al in het netwerk aanwezig waren. Je kunt een lagere nauwkeurigheid verwachten bij exotischere domeinspecifieke objecten, zoals details op een productielijn in een fabriek, of verschillende boombladeren.\n", "\n", - "Je ziet dat complexere taken die we nu oplossen meer rekenkracht vereisen en niet eenvoudig op de CPU kunnen worden uitgevoerd. In de volgende eenheid proberen we een lichtere implementatie te gebruiken om hetzelfde model te trainen met minder rekenbronnen, wat resulteert in slechts een iets lagere nauwkeurigheid.\n" + "Je kunt zien dat complexere taken die we nu oplossen, hogere rekenkracht vereisen en niet eenvoudig op de CPU kunnen worden opgelost. In de volgende eenheid zullen we proberen een lichtere implementatie te gebruiken om hetzelfde model te trainen met minder rekenbronnen, wat resulteert in slechts een iets lagere nauwkeurigheid.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**Disclaimer**: \nDit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, dient u zich ervan bewust te zijn dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in zijn oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor cruciale informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor eventuele misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.\n" + "---\n\n\n**Disclaimer**:\nDit document is vertaald met behulp van de AI vertaaldienst [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, dient u er rekening mee te houden dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in de oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor kritieke informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor eventuele misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.\n\n" ] } ], @@ -1484,12 +1495,6 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" - }, - "coopTranslator": { - "original_hash": "c189abc107848f96051085cc30945129", - "translation_date": "2025-08-28T20:36:07+00:00", - "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", - "language_code": "nl" } }, "nbformat": 4, diff --git a/translations/nl/lessons/5-NLP/README.md b/translations/nl/lessons/5-NLP/README.md index b2e65aa131..e6350e2981 100644 --- a/translations/nl/lessons/5-NLP/README.md +++ b/translations/nl/lessons/5-NLP/README.md @@ -1,34 +1,34 @@ # Natuurlijke Taalverwerking -![Samenvatting van NLP-taken in een schets](../../../../translated_images/nl/ai-nlp.b22dcb8ca4707cea.webp) +![Overzicht van NLP-taken in een schets](../../../../translated_images/nl/ai-nlp.b22dcb8ca4707cea.webp) -In deze sectie richten we ons op het gebruik van neurale netwerken om taken met betrekking tot **Natuurlijke Taalverwerking (NLP)** uit te voeren. Er zijn veel NLP-problemen die we willen dat computers kunnen oplossen: +In deze sectie richten we ons op het gebruik van neurale netwerken voor het uitvoeren van taken gerelateerd aan **Natuurlijke Taalverwerking (NLP)**. Er zijn veel NLP-problemen die we willen dat computers kunnen oplossen: -* **Tekstclassificatie** is een typisch classificatieprobleem dat betrekking heeft op tekstreeksen. Voorbeelden zijn het classificeren van e-mails als spam versus geen spam, of het categoriseren van artikelen als sport, zakelijk, politiek, enzovoort. Ook bij het ontwikkelen van chatbots moeten we vaak begrijpen wat een gebruiker bedoelt -- in dit geval hebben we te maken met **intentieclassificatie**. Bij intentieclassificatie moeten we vaak omgaan met veel categorieën. -* **Sentimentanalyse** is een typisch regressieprobleem, waarbij we een getal (een sentiment) moeten toekennen dat aangeeft hoe positief/negatief de betekenis van een zin is. Een meer geavanceerde versie van sentimentanalyse is **aspect-gebaseerde sentimentanalyse** (ABSA), waarbij we sentiment niet toekennen aan de hele zin, maar aan verschillende delen ervan (aspecten), bijvoorbeeld: *In dit restaurant vond ik de keuken lekker, maar de sfeer was vreselijk*. +* **Tekstclassificatie** is een typisch classificatieprobleem met betrekking tot tekstreeksen. Voorbeelden zijn het classificeren van e-mailberichten als spam versus geen spam, of het categoriseren van artikelen als sport, zakelijk, politiek, enz. Ook bij het ontwikkelen van chatbots moeten we vaak begrijpen wat een gebruiker wilde zeggen – in dit geval hebben we te maken met **intentieclassificatie**. Vaak moeten we in intentieclassificatie met veel categorieën omgaan. +* **Sentimentanalyse** is een typisch regressieprobleem, waarbij we een getal (een sentiment) moeten toekennen dat aangeeft hoe positief/negatief de betekenis van een zin is. Een geavanceerdere versie van sentimentanalyse is **aspect-gebaseerde sentimentanalyse** (ABSA), waarbij we het sentiment niet aan de hele zin toekennen, maar aan verschillende delen ervan (aspecten), bijvoorbeeld *In dit restaurant vond ik de keuken lekker, maar de sfeer was verschrikkelijk*. * **Named Entity Recognition** (NER) verwijst naar het probleem van het extraheren van bepaalde entiteiten uit tekst. Bijvoorbeeld, we moeten begrijpen dat in de zin *Ik moet morgen naar Parijs vliegen* het woord *morgen* verwijst naar DATUM, en *Parijs* een LOCATIE is. -* **Sleutelwoordextractie** lijkt op NER, maar hierbij moeten we woorden die belangrijk zijn voor de betekenis van de zin automatisch extraheren, zonder vooraf te trainen op specifieke entiteitstypen. +* **Trefwoordanalyse** is vergelijkbaar met NER, maar we moeten automatisch woorden extraheren die belangrijk zijn voor de betekenis van de zin, zonder vooraf te trainen op specifieke entiteitstypen. * **Tekstclustering** kan nuttig zijn wanneer we vergelijkbare zinnen willen groeperen, bijvoorbeeld vergelijkbare verzoeken in technische ondersteuningsgesprekken. -* **Vraagbeantwoording** verwijst naar het vermogen van een model om een specifieke vraag te beantwoorden. Het model ontvangt een tekstpassage en een vraag als invoer, en moet een plaats in de tekst aangeven waar het antwoord op de vraag te vinden is (of soms het antwoord genereren). -* **Tekstgeneratie** is het vermogen van een model om nieuwe tekst te genereren. Het kan worden beschouwd als een classificatietaak die de volgende letter/woord voorspelt op basis van een *tekstprompt*. Geavanceerde tekstgeneratiemodellen, zoals GPT-3, kunnen andere NLP-taken oplossen, zoals classificatie, met behulp van een techniek genaamd [prompt programming](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) of [prompt engineering](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29). -* **Tekstsamenvatting** is een techniek waarbij we willen dat een computer lange tekst "leest" en samenvat in een paar zinnen. -* **Machinevertaling** kan worden gezien als een combinatie van tekstbegrip in één taal en tekstgeneratie in een andere taal. +* **Vraag beantwoorden** verwijst naar het vermogen van een model om een specifieke vraag te beantwoorden. Het model ontvangt een tekstpassage en een vraag als invoer en moet een plek in de tekst aangeven waar het antwoord op de vraag te vinden is (of soms het antwoord genereren). +* **Tekstgeneratie** is het vermogen van een model om nieuwe tekst te genereren. Dit kan worden gezien als een classificatieprobleem waarbij het volgende teken/woord wordt voorspeld op basis van een *tekstprompt*. Geavanceerde tekstgeneratiemodellen, zoals GPT-3, kunnen ook andere NLP-taken oplossen zoals classificatie met een techniek genaamd [prompt programming](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) of [prompt engineering](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29) +* **Tekstsamenvatting** is een techniek waarbij we een computer willen laten "lezen" van lange tekst en deze samenvatten in een paar zinnen. +* **Machinevertaling** kan worden gezien als een combinatie van tekstbegrip in de ene taal en tekstgeneratie in een andere taal. -Aanvankelijk werden de meeste NLP-taken opgelost met traditionele methoden zoals grammatica's. Bijvoorbeeld, bij machinevertaling werden parsers gebruikt om de oorspronkelijke zin om te zetten in een syntaxisboom, waarna hogere semantische structuren werden geëxtraheerd om de betekenis van de zin te vertegenwoordigen. Op basis van deze betekenis en de grammatica van de doeltaal werd het resultaat gegenereerd. Tegenwoordig worden veel NLP-taken effectiever opgelost met neurale netwerken. +Aanvankelijk werden de meeste NLP-taken opgelost met traditionele methoden zoals grammatica’s. Bijvoorbeeld, bij machinevertaling werden parsers gebruikt om de oorspronkelijke zin om te zetten in een syntaxisboom, daarna werden hogere semantische structuren geëxtraheerd om de betekenis van de zin te vertegenwoordigen en op basis van deze betekenis en de grammatica van de doeltaal werd het resultaat gegenereerd. Tegenwoordig worden veel NLP-taken effectiever opgelost met neurale netwerken. -> Veel klassieke NLP-methoden zijn geïmplementeerd in de [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org) Python-bibliotheek. Er is een geweldig [NLTK Boek](https://www.nltk.org/book/) online beschikbaar dat behandelt hoe verschillende NLP-taken kunnen worden opgelost met NLTK. +> Veel klassieke NLP-methoden zijn geïmplementeerd in de Python-bibliotheek [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org). Er is een geweldige [NLTK-boek](https://www.nltk.org/book/) online beschikbaar dat behandelt hoe verschillende NLP-taken met NLTK kunnen worden opgelost. -In onze cursus zullen we ons voornamelijk richten op het gebruik van neurale netwerken voor NLP, en we zullen NLTK gebruiken waar nodig. +In onze cursus zullen we ons vooral richten op het gebruik van neurale netwerken voor NLP en waar nodig NLTK gebruiken. -We hebben al geleerd hoe we neurale netwerken kunnen gebruiken voor het werken met tabelgegevens en afbeeldingen. Het belangrijkste verschil tussen die soorten gegevens en tekst is dat tekst een reeks van variabele lengte is, terwijl de invoergrootte bij afbeeldingen vooraf bekend is. Hoewel convolutionele netwerken patronen uit invoergegevens kunnen extraheren, zijn patronen in tekst complexer. Bijvoorbeeld, ontkenning kan gescheiden zijn van het onderwerp door willekeurig veel woorden (bijvoorbeeld *Ik hou niet van sinaasappels* versus *Ik hou niet van die grote kleurrijke smakelijke sinaasappels*), en dat moet nog steeds worden geïnterpreteerd als één patroon. Daarom moeten we om taal te verwerken nieuwe typen neurale netwerken introduceren, zoals *recurrente netwerken* en *transformers*. +We hebben al geleerd hoe we neurale netwerken gebruiken om om te gaan met tabeldata en met afbeeldingen. Het belangrijkste verschil tussen die typen data en tekst is dat tekst een sequentie van variabele lengte is, terwijl de invoergrootte bij afbeeldingen van tevoren bekend is. Terwijl convolutionele netwerken patronen uit inputdata kunnen extraheren, zijn patronen in tekst complexer. Bijvoorbeeld, we kunnen hebben dat een ontkenning gescheiden is van het onderwerp door een willekeurig aantal woorden (bijv. *Ik hou niet van sinaasappels* versus *Ik hou niet van die grote kleurrijke smakelijke sinaasappels*), en dat moet toch als één patroon worden geïnterpreteerd. Daarom moeten we om taal te verwerken nieuwe typen neurale netwerken introduceren, zoals *recurrerende netwerken* en *transformers*. ## Bibliotheken installeren -Als je een lokale Python-installatie gebruikt om deze cursus uit te voeren, moet je mogelijk alle vereiste bibliotheken voor NLP installeren met de volgende commando's: +Als je een lokale Python-installatie gebruikt om deze cursus te volgen, moet je mogelijk alle vereiste bibliotheken voor NLP installeren met de volgende opdrachten: **Voor PyTorch** ```bash -pip install -r requirements-torch.txt +pip install -r requirements-pytorch.txt ``` **Voor TensorFlow** ```bash @@ -39,13 +39,13 @@ pip install -r requirements-tf.txt ## GPU Waarschuwing -In deze sectie zullen we in sommige voorbeelden vrij grote modellen trainen. -* **Gebruik een computer met GPU-ondersteuning**: Het is aan te raden om je notebooks op een computer met GPU-ondersteuning uit te voeren om wachttijden te verminderen bij het werken met grote modellen. -* **Beperkingen van GPU-geheugen**: Het gebruik van een GPU kan leiden tot situaties waarin je geen GPU-geheugen meer hebt, vooral bij het trainen van grote modellen. -* **GPU-geheugenverbruik**: De hoeveelheid GPU-geheugen die wordt verbruikt tijdens training hangt af van verschillende factoren, waaronder de grootte van de minibatch. -* **Minimaliseer minibatchgrootte**: Als je problemen ondervindt met GPU-geheugen, overweeg dan om de minibatchgrootte in je code te verkleinen als mogelijke oplossing. -* **TensorFlow GPU-geheugen vrijgeven**: Oudere versies van TensorFlow kunnen GPU-geheugen mogelijk niet correct vrijgeven bij het trainen van meerdere modellen binnen één Python-kernel. Om GPU-geheugen effectief te beheren, kun je TensorFlow configureren om GPU-geheugen alleen toe te wijzen wanneer dat nodig is. -* **Code toevoegen**: Om TensorFlow zo in te stellen dat GPU-geheugen alleen groeit wanneer nodig, voeg je de volgende code toe aan je notebooks: +In deze sectie zullen we in sommige voorbeelden behoorlijk grote modellen trainen. +* **Gebruik een computer met GPU-ondersteuning**: Het is aan te raden om je notitieboeken op een computer met GPU-ondersteuning uit te voeren om wachttijden te verkorten bij het werken met grote modellen. +* **Beperkingen van GPU-geheugen**: Bij gebruik van een GPU kan het voorkomen dat je zonder GPU-geheugen komt te zitten, vooral bij het trainen van grote modellen. +* **GPU-geheugenverbruik**: De hoeveelheid GPU-geheugen die tijdens het trainen wordt gebruikt, hangt af van verschillende factoren, waaronder de minibatch-grootte. +* **Minimaliseer de minibatch-grootte**: Als je problemen ervaart met GPU-geheugen, overweeg dan om de minibatch-grootte in je code te verminderen als mogelijke oplossing. +* **TensorFlow GPU geheugen vrijgave**: Oudere versies van TensorFlow maken mogelijk GPU-geheugen niet correct vrij bij het trainen van meerdere modellen binnen één Python-kernel. Om het GPU-geheugenbeheer effectief te maken, kun je TensorFlow configureren zodat het GPU-geheugen alleen wordt toegewezen wanneer dat nodig is. +* **Code opnemen**: Om TensorFlow zo in te stellen dat het GPU-geheugen alleen groeit als dat nodig is, neem je de volgende code op in je notitieboeken: ```python physical_devices = tf.config.list_physical_devices('GPU') @@ -53,13 +53,13 @@ if len(physical_devices)>0: tf.config.experimental.set_memory_growth(physical_devices[0], True) ``` -Als je geïnteresseerd bent in het leren over NLP vanuit een klassiek ML-perspectief, bezoek dan [deze reeks lessen](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP). +Als je geïnteresseerd bent in NLP leren vanuit een klassiek ML-perspectief, bezoek dan [deze reeks lessen](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP) ## In deze sectie In deze sectie leren we over: * [Tekst representeren als tensors](13-TextRep/README.md) -* [Woordembeddings](14-Emdeddings/README.md) +* [Woorden-embedding](14-Emdeddings/README.md) * [Taalmodellering](15-LanguageModeling/README.md) * [Recurrente neurale netwerken](16-RNN/README.md) * [Generatieve netwerken](17-GenerativeNetworks/README.md) @@ -67,5 +67,7 @@ In deze sectie leren we over: --- -**Disclaimer**: -Dit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, dient u zich ervan bewust te zijn dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in de oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor cruciale informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor eventuele misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling. \ No newline at end of file + +**Disclaimer**: +Dit document is vertaald met behulp van de AI vertaaldienst [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, dient u er rekening mee te houden dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in de oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor kritieke informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor eventuele misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling. + \ No newline at end of file diff --git a/translations/no/.co-op-translator.json b/translations/no/.co-op-translator.json index 76f032a97c..165013a68b 100644 --- a/translations/no/.co-op-translator.json +++ b/translations/no/.co-op-translator.json @@ -5,6 +5,12 @@ "source_file": "AGENTS.md", "language_code": "no" }, + "CONTRIBUTING.md": { + "original_hash": "c6fd7e781b67111a90abd166d0ce4aa0", + "translation_date": "2026-07-08T15:52:54+00:00", + "source_file": "CONTRIBUTING.md", + "language_code": "no" + }, "README.md": { "original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b", "translation_date": "2026-04-06T20:56:32+00:00", @@ -17,6 +23,19 @@ "source_file": "SECURITY.md", "language_code": "no" }, + "__translation_failures__": { + "lessons/sketchnotes/LICENSE.md": { + "original_hash": "45ab63a2cd8f5faef6c9b150618837a4", + "source_file": "lessons/sketchnotes/LICENSE.md", + "language_code": "no", + "failure_date": "2026-07-08T15:39:34+00:00", + "status": "failed", + "error_type": "TranslationIncompleteError", + "error_message": "Markdown translation remained incomplete for chunk 1.2.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-28T16:07:01+00:00", @@ -54,8 +73,8 @@ "language_code": "no" }, "examples/README.md": { - "original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7", - "translation_date": "2025-10-03T11:31:39+00:00", + "original_hash": "7883d52c2e2a221e0b07a7b112a149b9", + "translation_date": "2026-07-08T15:33:46+00:00", "source_file": "examples/README.md", "language_code": "no" }, @@ -66,8 +85,8 @@ "language_code": "no" }, "lessons/0-course-setup/how-to-run.md": { - "original_hash": "a4717bd9103b9f6cd84d534b83534689", - "translation_date": "2026-01-16T02:55:55+00:00", + "original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1", + "translation_date": "2026-07-08T15:34:07+00:00", "source_file": "lessons/0-course-setup/how-to-run.md", "language_code": "no" }, @@ -191,6 +210,12 @@ "source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md", "language_code": "no" }, + "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": { + "original_hash": "99b816b6a4957ef4100cee4c4221dff9", + "translation_date": "2026-07-08T15:29:36+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", + "language_code": "no" + }, "lessons/4-ComputerVision/08-TransferLearning/lab/README.md": { "original_hash": "7765935c35fcee69b9fe2d0cfd6963e2", "translation_date": "2025-08-28T15:18:01+00:00", @@ -330,8 +355,8 @@ "language_code": "no" }, "lessons/5-NLP/README.md": { - "original_hash": "8ef02a9318257ea140ed3ed74442096d", - "translation_date": "2025-08-28T15:51:26+00:00", + "original_hash": "038df6f1a73e49f6430740da083bfd6d", + "translation_date": "2026-07-08T15:34:30+00:00", "source_file": "lessons/5-NLP/README.md", "language_code": "no" }, diff --git a/translations/no/CONTRIBUTING.md b/translations/no/CONTRIBUTING.md new file mode 100644 index 0000000000..d0e3a36d83 --- /dev/null +++ b/translations/no/CONTRIBUTING.md @@ -0,0 +1,29 @@ +# Bidra til AI-For-Beginners + +Takk for din interesse for å bidra til AI-For-Beginners! Vi ønsker oversettelser, rettelser av leksjoner og formateringskorrigeringer velkommen. + +## Microsoft Contributor License Agreement (CLA) + +Dette prosjektet ønsker bidrag og forslag velkommen. De fleste bidrag krever at du godtar en Contributor License Agreement (CLA) som erklærer at du har rett til, og faktisk gir oss, rettighetene til å bruke ditt bidrag. For detaljer, besøk [https://cla.microsoft.com](https://cla.microsoft.com). + +Når du sender inn en pull request, vil en CLA-bot automatisk avgjøre om du må sende inn en CLA og dekorere PR-en passende (f.eks. etikett, kommentar). Følg bare instruksjonene som boten gir. Du trenger bare gjøre dette én gang for alle repositorier som bruker vår CLA. + +## Hvordan bidra + +### 1. Rette skrivefeil / kodefeil +Hvis du finner en skrivefeil eller feil i en Jupyter-notatbok eller leksjonens markdown-fil: +1. Fork repositoriet. +2. Rett skrivefeilen eller den ødelagte linken. +3. Send inn en Pull Request med en tydelig beskrivelse av rettelsen. + +### 2. Sende inn oversettelser +Vi ønsker oversettelser av leksjonene til andre språk velkommen! Vennligst legg oversettelsene under `translations/`-mappen ved å bruke de eksisterende mappenavnene der (for eksempel `translations/es/`, `translations/pt-BR/`, `translations/zh-CN/`). + +For mer informasjon, se [etc/CONTRIBUTING.md](etc/CONTRIBUTING.md). + +--- + + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det opprinnelige dokumentet på originalspråket skal betraktes som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. + \ No newline at end of file diff --git a/translations/no/examples/README.md b/translations/no/examples/README.md index 3d2dc7fe2a..a9787a2078 100644 --- a/translations/no/examples/README.md +++ b/translations/no/examples/README.md @@ -1,27 +1,27 @@ # Nybegynnervennlige AI-eksempler -Velkommen! Denne katalogen inneholder enkle, frittstående eksempler som hjelper deg med å komme i gang med AI og maskinlæring. Hvert eksempel er laget for å være nybegynnervennlig med detaljerte kommentarer og trinnvise forklaringer. +Velkommen! Denne katalogen inneholder enkle, frittstående eksempler som hjelper deg i gang med AI og maskinlæring. Hvert eksempel er designet for å være nybegynnervennlig med detaljerte kommentarer og trinnvise forklaringer. -## 📚 Oversikt over eksempler +## 📚 Eksempelsammendrag | Eksempel | Beskrivelse | Vanskelighetsgrad | Forutsetninger | -|----------|-------------|--------------------|----------------| -| [Hello AI World](../../../examples/01-hello-ai-world.py) | Ditt første AI-program – enkel mønstergjenkjenning | ⭐ Nybegynner | Grunnleggende Python | -| [Enkel nevralt nettverk](../../../examples/02-simple-neural-network.py) | Bygg et nevralt nettverk fra bunnen av | ⭐⭐ Nybegynner+ | Python, grunnleggende matematikk | -| [Bildeklassifisering](./03-image-classifier.ipynb) | Klassifiser bilder med en forhåndstrent modell | ⭐⭐ Nybegynner+ | Python, numpy | -| [Tekstsentiment](../../../examples/04-text-sentiment.py) | Analyser tekstsentiment (positiv/negativ) | ⭐⭐ Nybegynner+ | Python | +|---------|-------------|------------|---------------| +| [Hello AI World](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/01-hello-ai-world.py) | Ditt første AI-program - enkel mønstergjenkjenning | ⭐ Nybegynner | Grunnleggende Python | +| [Simple Neural Network](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/02-simple-neural-network.py) | Bygg et nevralt nettverk fra bunnen | ⭐⭐ Nybegynner+ | Python, grunnleggende matte | +| [Image Classifier](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/03-image-classifier.ipynb) | Klassifiser bilder med en forhåndstrent modell | ⭐⭐ Nybegynner+ | Python, numpy | +| [Text Sentiment](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/04-text-sentiment.py) | Analyser tekstfølelse (positiv/negativ) | ⭐⭐ Nybegynner+ | Python | -## 🚀 Kom i gang +## 🚀 Komme i gang ### Forutsetninger -Sørg for at du har Python installert (anbefalt versjon 3.8 eller høyere). Installer nødvendige pakker: +Pass på at du har Python installert (3.8 eller nyere anbefales). Installer nødvendige pakker: ```bash -# For Python scripts +# For Python-skript pip install numpy -# For Jupyter notebooks (image classifier) +# For Jupyter-notatbøker (bildefinner) pip install jupyter numpy pillow tensorflow ``` @@ -34,12 +34,12 @@ conda activate ai4beg ### Kjøre eksemplene -**For Python-skript (.py-filer):** +**For Python-skript (.py filer):** ```bash python 01-hello-ai-world.py ``` -**For Jupyter-notatbøker (.ipynb-filer):** +**For Jupyter-notatbøker (.ipynb filer):** ```bash jupyter notebook 03-image-classifier.ipynb ``` @@ -48,17 +48,17 @@ jupyter notebook 03-image-classifier.ipynb Vi anbefaler å følge eksemplene i rekkefølge: -1. **Start med "Hello AI World"** – Lær det grunnleggende om mønstergjenkjenning -2. **Bygg et enkelt nevralt nettverk** – Forstå hvordan nevrale nettverk fungerer -3. **Prøv bildeklassifisering** – Se AI i aksjon med ekte bilder -4. **Analyser tekstsentiment** – Utforsk naturlig språkbehandling +1. **Start med "Hello AI World"** - Lær det grunnleggende om mønstergjenkjenning +2. **Bygg et enkelt nevralt nettverk** - Forstå hvordan nevrale nettverk fungerer +3. **Prøv bildeklassifikatoren** - Se AI i aksjon med ekte bilder +4. **Analyser tekstfølelse** - Utforsk naturlig språkbehandling ## 💡 Tips for nybegynnere -- **Les kodekommentarene nøye** – De forklarer hva hver linje gjør -- **Eksperimenter!** – Prøv å endre verdier og se hva som skjer -- **Ikke bekymre deg for å forstå alt** – Læring tar tid -- **Still spørsmål** – Bruk [Diskusjonsforumet](https://github.com/microsoft/AI-For-Beginners/discussions) +- **Les kodekommentarene nøye** - De forklarer hva hver linje gjør +- **Eksperimenter!** - Prøv å endre verdier og se hva som skjer +- **Ikke bekymre deg for å forstå alt med en gang** - Læring tar tid +- **Still spørsmål** - Bruk [Diskusjonsforumet](https://github.com/microsoft/AI-For-Beginners/discussions) ## 🔗 Neste steg @@ -70,16 +70,18 @@ Etter å ha fullført disse eksemplene, utforsk hele pensumet: ## 🤝 Bidra -Fant du disse eksemplene nyttige? Hjelp oss med å forbedre dem: -- Rapporter problemer eller foreslå forbedringer +Synes du disse eksemplene var nyttige? Hjelp oss å forbedre dem: +- Rapportér problemer eller foreslå forbedringer - Legg til flere eksempler for nybegynnere - Forbedre dokumentasjon og kommentarer --- -*Husk: Hver ekspert var en gang nybegynner. Lykke til med læringen! 🎓* +*Husk: Hver ekspert har en gang vært nybegynner. Lykke til med læringen! 🎓* --- -**Ansvarsfraskrivelse**: -Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vær oppmerksom på at automatiserte oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det opprinnelige dokumentet på originalspråket skal betraktes som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. + \ No newline at end of file diff --git a/translations/no/lessons/0-course-setup/how-to-run.md b/translations/no/lessons/0-course-setup/how-to-run.md index cb44d5aadf..802abc6f31 100644 --- a/translations/no/lessons/0-course-setup/how-to-run.md +++ b/translations/no/lessons/0-course-setup/how-to-run.md @@ -1,10 +1,10 @@ # Hvordan kjøre koden -Dette pensumet inneholder mange kjørbare eksempler og laboratorier som du vil kjøre. For å gjøre dette trenger du muligheten til å kjøre Python-kode i Jupyter Notebooks som følger med i dette pensumet. Du har flere alternativer for å kjøre koden: +Dette pensumet inneholder mange kjørbare eksempler og laboratorier som du vil kjøre. For å kunne gjøre dette, trenger du muligheten til å kjøre Python-kode i Jupyter Notebooks som følger med som en del av dette pensumet. Du har flere alternativer for å kjøre koden: ## Kjør lokalt på din egen datamaskin -For å kjøre koden lokalt på din datamaskin, trengs en Python-installasjon. En anbefaling er å installere **[miniconda](https://conda.io/en/latest/miniconda.html)** - det er en ganske lett installasjon som støtter `conda` pakkebehandler for forskjellige Python **virtuelle miljøer**. +For å kjøre koden lokalt på din egen datamaskin, trenger du en Python-installasjon. En anbefaling er å installere **[miniconda](https://conda.io/en/latest/miniconda.html)** - det er en relativt lettvekts installasjon som støtter `conda` pakkehåndtereren for forskjellige Python **virtuelle miljøer**. Etter at du har installert miniconda, klon depotet og opprett et virtuelt miljø som skal brukes for dette kurset: @@ -15,57 +15,57 @@ conda env create --name ai4beg --file .devcontainer/environment.yml conda activate ai4beg ``` -### Bruke Visual Studio Code med Python Extension +### Bruke Visual Studio Code med Python-utvidelse -Dette pensumet fungerer best når du åpner 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 pensumet er best å bruke ved å åpne 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). -> **Merk**: Når du har klonet og åpnet mappen i VS Code, vil det automatisk foreslå deg å installere Python-utvidelser. Du må også installere miniconda som beskrevet ovenfor. +> **Merk**: Når du har klonet og åpnet katalogen i VS Code, vil det automatisk foreslå at du installerer Python-utvidelser. Du må også installere miniconda som beskrevet ovenfor. -> **Merk**: Hvis VS Code foreslår deg å åpne depotet på nytt i en container, bør du avslå dette for å bruke den lokale Python-installasjonen. +> **Merk**: Hvis VS Code foreslår at du åpner depotet på nytt i en container, bør du avslå dette for å bruke den lokale Python-installasjonen. ### Bruke Jupyter i nettleseren -Du kan også bruke et Jupyter-miljø fra nettleseren på din egen datamaskin. Både klassisk Jupyter og JupyterHub tilbyr et praktisk utviklingsmiljø med automatisk utfylling, kodeutheving, osv. +Du kan også bruke et Jupyter-miljø fra nettleseren på din egen datamaskin. Både klassisk Jupyter og JupyterHub gir et praktisk utviklingsmiljø med autofullføring, kodeutheving, osv. -For å starte Jupyter lokalt, gå til mappen for kurset, og kjør: +For å starte Jupyter lokalt, gå til katalogen for kurset, og kjør: ```bash jupyter notebook ``` -eller + eller ```bash jupyterhub ``` -Du kan da navigere til hvilke som helst `.ipynb`-filer, åpne dem og begynne å jobbe. +Du kan deretter navigere til alle `.ipynb`-filer, åpne dem og begynne å jobbe. -### Kjøring i container +### Kjøre i container -Et alternativ til Python-installasjon er å kjøre koden i en container. Siden vårt depot inneholder en spesiell `.devcontainer`-mappe som beskriver hvordan man bygger en container for dette depotet, tilbyr VS Code muligheten til å åpne koden i en container. Dette krever Docker-installasjon, og vil også være mer komplekst, så vi anbefaler dette for mer erfarne brukere. +Et alternativ til Python-installasjon vil være å kjøre koden i en container. Siden vårt depot inneholder en spesiell `.devcontainer`-mappe som instruerer hvordan bygge en container for dette repoet, tilbyr VS Code muligheten til å åpne koden i en container på nytt. Dette krever Docker-installasjon, og det kan også være mer komplisert, så vi anbefaler dette til mer erfarne brukere. -## Kjøring i skyen +## Kjøre i skyen -Hvis du ikke ønsker å installere Python lokalt, og har tilgang til noen skyressurser – vil det være et godt alternativ å kjøre koden i skyen. Det finnes flere måter du kan gjøre dette på: +Hvis du ikke ønsker å installere Python lokalt, og har tilgang til noen skyressurser - er et godt alternativ å kjøre koden i skyen. Det finnes flere måter du kan gjøre dette på: -* Bruke **[GitHub Codespaces](https://github.com/features/codespaces)**, som er et virtuelt miljø opprettet for deg på GitHub, tilgjengelig gjennom en VS Code nettlesergrensesnitt. Hvis du har tilgang til Codespaces, kan du bare trykke på **Code**-knappen i depotet, starte et codespace, og komme i gang på kort tid. -* Bruke **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) tilbyr gratis databehandlingsressurser i skyen for folk som deg for å teste ut kode på GitHub. Det finnes en knapp på forsiden for å åpne depotet i Binder – dette vil raskt ta deg til binder-siden, som vil bygge en underliggende container og starte et Jupyter-nettgrensesnitt for deg sømløst. +* Bruke **[GitHub Codespaces](https://github.com/features/codespaces)**, som er et virtuelt miljø opprettet for deg på GitHub, tilgjengelig via en VS Code nettlesergrensesnitt. Hvis du har tilgang til Codespaces, kan du bare klikke på **Code**-knappen i repoet, starte en codespace, og komme i gang på kort tid. +* Bruke **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) tilbyr gratis databehandlingsressurser i skyen for folk som deg til å teste ut litt kode på GitHub. Det finnes en knapp på forsiden for å åpne depotet i Binder - dette skal raskt ta deg til binder-siden som vil bygge en underliggende container og starte et Jupyter-webgrensesnitt for deg sømløst. -> **Merk**: For å forhindre misbruk har Binder blokkert tilgang til noen nettressurser. Dette kan forhindre at noe av koden fungerer, som henter modeller og/eller datasett fra det offentlige Internett. Du må kanskje finne noen alternative løsninger. Også de beregningsressursene som tilbys av Binder er ganske enkle, så trening vil være treg, spesielt i senere, mer komplekse leksjoner. +> **Merk**: For å forhindre misbruk, har Binder tilgang til noen nettressurser blokkert. Dette kan hindre noe av koden i å fungere, spesielt den som henter modeller og/eller datasett fra det offentlige Internett. Du kan trenge noen løsninger. I tillegg er databehandlingsressursene fra Binder ganske grunnleggende, så trening vil være langsom, spesielt i senere, mer komplekse leksjoner. -## Kjøring i skyen med GPU +## Kjøre i skyen med GPU -Noen av de senere leksjonene i dette pensumet vil ha stor nytte av GPU-støtte. Modelltrening kan ellers bli smertefullt langsom. Det finnes noen få alternativer du kan følge, spesielt hvis du har tilgang til skyen enten via [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste), eller gjennom din utdanningsinstitusjon: +Noen av de senere leksjonene i dette pensumet vil i stor grad dra nytte av GPU-støtte. Modelltrening, for eksempel, kan være smertefullt tregt ellers. Det finnes noen alternativer du kan følge, spesielt hvis du har tilgang til skyen enten gjennom [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste), eller gjennom din institusjon: -* Opprett [Data Science Virtual Machine](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) og koble til den via Jupyter. Du kan da klone depotet rett på maskinen, og begynne å lære. NC-serie VM-er har GPU-støtte. +* Opprett [Data Science Virtual Machine](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) og koble til den via Jupyter. Du kan da klone repoet direkte på maskinen, og begynne å lære. NC-serie VM-er har GPU-støtte. -> **Merk**: Noen abonnementer, inkludert Azure for Students, tilbyr ikke GPU-støtte som standard. Du må kanskje be om ekstra GPU-kjerner via en teknisk støtteforespørsel. +> **Merk**: Noen abonnementer, inkludert Azure for Students, tilbyr ikke GPU-støtte som standard. Du må kanskje be om flere GPU-kjerner via en teknisk supportforespørsel. -* Opprett [Azure Machine Learning Workspace](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) og bruk deretter Notebook-funksjonen der. [Denne videoen](https://azure-for-academics.github.io/quickstart/azureml-papers/) viser hvordan du kloner et depot inn i Azure ML-notatbok og begynner å bruke det. +* Opprett [Azure Machine Learning Workspace](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) og bruk deretter Notebook-funksjonen der. [Denne videoen](https://azure-for-academics.github.io/quickstart/azureml-papers/) viser hvordan du kloner et depot inn i Azure ML-notatbok og begynner å bruke den. Du kan også bruke Google Colab, som kommer med noe gratis GPU-støtte, og laste opp Jupyter Notebooks der for å kjøre dem én etter én. --- -**Ansvarsfraskrivelse**: -Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi søker å oppnå nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det opprinnelige dokumentet på originalspråket bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for misforståelser eller feiltolkninger som følge av bruk av denne oversettelsen. +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det opprinnelige dokumentet på originalspråket skal betraktes som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file diff --git a/translations/no/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/no/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index a42e9aec4f..32907c8a18 100644 --- a/translations/no/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/no/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -4,11 +4,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Forhåndstrente modeller og transfer learning\n", + "# Fortrente modeller og overføringslæring\n", "\n", - "Å trene CNN-er kan ta mye tid, og det kreves store mengder data for denne oppgaven. Imidlertid brukes mye av tiden på å lære de beste lavnivåfiltrene som et nettverk bruker for å trekke ut mønstre fra bilder. Et naturlig spørsmål oppstår – kan vi bruke et nevralt nettverk som er trent på ett datasett og tilpasse det til å klassifisere andre bilder uten å gjennomføre hele treningsprosessen?\n", + "Opplæring av CNN-er kan ta mye tid, og det kreves mye data for denne oppgaven. Imidlertid brukes mye av tiden til å lære de beste lavnivåfiltrene som et nettverk bruker for å trekke ut mønstre fra bilder. Et naturlig spørsmål oppstår – kan vi bruke et nevralt nettverk trent på ett datasett og tilpasse det til å klassifisere forskjellige bilder uten full opplæringsprosess?\n", "\n", - "Denne tilnærmingen kalles **transfer learning**, fordi vi overfører noe kunnskap fra én nevralt nettverksmodell til en annen. I transfer learning starter vi vanligvis med en forhåndstrent modell, som er trent på et stort bildedatasett, som for eksempel **ImageNet**. Disse modellene er allerede gode til å trekke ut ulike funksjoner fra generiske bilder, og i mange tilfeller kan det å bygge en klassifiserer på toppen av de uttrukne funksjonene gi gode resultater.\n" + "Denne tilnærmingen kalles **overføringslæring**, fordi vi overfører noe kunnskap fra en nevralt nettverksmodell til en annen. I overføringslæring starter vi vanligvis med en fortrent modell, som er blitt trent på et stort bildedatasett, for eksempel **ImageNet**. Disse modellene kan allerede gjøre en god jobb med å trekke ut forskjellige funksjoner fra generiske bilder, og i mange tilfeller kan det å bare bygge en klassifiserer oppå disse uttrukne funksjonene gi et godt resultat.\n" ] }, { @@ -31,9 +31,9 @@ "source": [ "## Katter vs. Hunder Datasett\n", "\n", - "I denne enheten skal vi løse et reelt problem med å klassifisere bilder av katter og hunder. Av den grunn skal vi bruke [Kaggle Cats vs. Dogs Dataset](https://www.kaggle.com/c/dogs-vs-cats), som også kan lastes ned [fra Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n", + "I denne enheten skal vi løse et reelt problem med å klassifisere bilder av katter og hunder. Av denne grunn skal vi bruke [Kaggle Cats vs. Dogs Dataset](https://www.kaggle.com/c/dogs-vs-cats), som også kan lastes ned [fra Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n", "\n", - "La oss laste ned dette datasettet og pakke det ut i `data`-katalogen (denne prosessen kan ta litt tid!):\n" + "La oss laste ned dette datasettet og pakke det ut i `data`-mappen (denne prosessen kan ta litt tid!):\n" ] }, { @@ -64,7 +64,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Dessverre er det noen korrupte bildefiler i datasettet. Vi må gjøre en rask opprydding for å sjekke etter korrupte filer. For å unngå å overbelaste denne veiledningen, har vi flyttet koden for å verifisere datasettet inn i en modul.\n" + "Dessverre er det noen ødelagte bildefiler i datasettet. Vi må gjøre en rask opprydding for å sjekke etter korrupte filer. For å ikke ødelegge denne veiledningen, har vi flyttet koden for å verifisere datasettet til en modul.\n" ] }, { @@ -335,11 +335,11 @@ "source": [ "## Laste inn datasettet\n", "\n", - "I tidligere eksempler lastet vi inn datasett som er innebygd i Keras. Nå skal vi jobbe med vårt eget datasett, som vi må laste inn fra en katalog med bilder.\n", + "I tidligere eksempler lastet vi inn datasett som er innebygd i Keras. Nå skal vi håndtere vårt eget datasett, som vi må laste inn fra en mappe med bilder.\n", "\n", - "I virkeligheten kan størrelsen på bildedatasett være ganske stor, og man kan ikke stole på at all data får plass i minnet. Derfor blir datasett ofte representert som **generatorer** som kan returnere data i minibatcher som er egnet for trening.\n", + "I virkeligheten kan bildedatasett være ganske store, og man kan ikke stole på at all data får plass i minnet. Derfor blir datasett ofte representert som **generatorer** som kan returnere data i minibatcher som egner seg for opplæring.\n", "\n", - "For å håndtere bildeklassifisering inkluderer Keras en spesiell funksjon `image_dataset_from_directory`, som kan laste inn bilder fra underkataloger som tilsvarer forskjellige klasser. Denne funksjonen tar også hånd om skalering av bilder, og den kan også dele datasettet inn i trenings- og testundergrupper:\n" + "For å jobbe med bildeklassifisering, inkluderer Keras en spesiell funksjon `image_dataset_from_directory`, som kan laste bilder fra undermapper som tilsvarer forskjellige klasser. Denne funksjonen tar også seg av skalering av bilder, og kan også dele datasettet i trenings- og testdeler:\n" ] }, { @@ -383,9 +383,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Det er viktig å sette samme `seed`-verdi for begge kallene, fordi det påvirker fordelingen av bilder mellom trenings- og testdatasettet.\n", + "Det er viktig å sette samme `seed`-verdi for begge kall, fordi det påvirker fordelingen av bilder mellom trenings- og testdatasettet.\n", "\n", - "Datasettet henter automatisk klassenavn fra katalogene, og du kan få tilgang til dem ved behov ved å kalle:\n" + "Dataset henter automatisk klassenavn fra kataloger, og du kan få tilgang til dem om nødvendig ved å kalle:\n" ] }, { @@ -412,7 +412,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Datasett som vi har fått tak i kan direkte sendes til `fit`-funksjonen for å trene modellen. De inneholder både tilsvarende bilder og etiketter, som kan itereres over ved hjelp av følgende konstruksjon:\n" + "Datasett som vi har skaffet kan sendes direkte til `fit`-funksjonen for å trene modellen. De inneholder både tilsvarende bilder og etiketter, som kan loopes over ved hjelp av følgende konstruksjon:\n" ] }, { @@ -453,7 +453,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "> **Merk**: Alle bilder i datasettet er representert som flyttalls-tensorer med rekkevidde 0-255. Før vi sender dem til nevrale nettverk, må vi skalere disse verdiene til rekkevidde 0-1. Når vi plotter bilder, må vi enten gjøre det samme, eller konvertere verdiene til `int`-typen (som vi gjør i koden ovenfor), for å vise `matplotlib` at vi ønsker å plotte det originale uskalede bildet.\n" + "> **Merk**: Alle bildene i datasettet er representert som flyttallspunktstensorer med område 0-255. Før de sendes til det nevrale nettverket, må vi skalere disse verdiene til området 0-1. Når vi plotter bilder, må vi enten gjøre det samme, eller konvertere verdiene til typen `int` (slik vi gjør i koden over), for å vise `matplotlib` at vi ønsker å plotte det originale uskalte bildet.\n" ] }, { @@ -462,7 +462,7 @@ "source": [ "## Forhåndstrente modeller\n", "\n", - "For mange oppgaver innen bildeklassifisering kan man finne forhåndstrente nevrale nettverksmodeller. Mange av disse modellene er tilgjengelige innenfor `keras.applications`-navnet, og enda flere modeller kan finnes på Internett. La oss se hvordan den enkleste VGG-16-modellen kan lastes inn og brukes:\n" + "For mange bildeklassifiseringsoppgaver kan man finne forhåndstrente nevrale nettverksmodeller. Mange av disse modellene er tilgjengelige inne i `keras.applications` navnerommet, og enda flere modeller kan finnes på Internett. La oss se hvordan den enkleste VGG-16 modellen kan lastes inn og brukes:\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": [ - "Det er et par viktige ting å merke seg her:\n", - "\n", - "* Før du sender en input til et forhåndstrent nettverk, må den forhåndsbehandles på en bestemt måte. Dette gjøres ved å kalle den tilsvarende `preprocess_input`-funksjonen, som mottar en batch med bilder og returnerer deres bearbeidede form. I tilfellet med VGG-16 blir bildene normalisert, og en forhåndsdefinert gjennomsnittsverdi for hver kanal blir trukket fra. Dette er fordi VGG-16 opprinnelig ble trent med denne forhåndsbehandlingen.\n", - "* Det nevrale nettverket brukes på input-batchen, og som resultat får vi en batch med 1000-elementers tensorer som viser sannsynligheten for hver klasse. Vi kan finne nummeret på den mest sannsynlige klassen ved å kalle `argmax` på denne tensoren.\n", - "* Resultatet vi får er et [nummer for en `ImageNet`-klasse](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). For å forstå dette resultatet kan vi også bruke `decode_predictions`-funksjonen, som returnerer de n øverste klassene sammen med navnene deres.\n" + "Det er et par viktige ting her:\n", + "* Før man sender et input til et hvilken som helst forhåndstrent nettverk, må det pre-prosesseres på en bestemt måte. Dette gjøres ved å kalle den tilsvarende `preprocess_input`-funksjonen, som mottar en batch med bilder, og returnerer deres bearbeidede form. I tilfelle av VGG-16 blir bildene normalisert, og en forhåndsdefinert gjennomsnittsverdi for hver kanal blir trukket fra. Dette er fordi VGG-16 opprinnelig ble trent med denne pre-prosesseringsmetoden.\n", + "* Nevralt nettverk blir anvendt på input-batchen, og vi mottar som resultat en batch med 1000-element tensorer som viser sannsynligheten for hver klasse. Vi kan finne det mest sannsynlige klassenummeret ved å kalle `argmax` på denne tensoren.\n", + "* Det oppnådde resultatet er et [nummer for en `ImageNet`-klasse](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). For å gi mening til dette resultatet kan vi også bruke `decode_predictions`-funksjonen, som returnerer de topp n klassene sammen med deres navn.\n" ] }, { @@ -600,7 +609,7 @@ "source": [ "## GPU-beregninger\n", "\n", - "Dype nevrale nettverk, som VGG-16 og andre mer moderne arkitekturer, krever betydelig beregningskraft for å kjøre. Det er fornuftig å bruke GPU-akselerasjon hvis det er tilgjengelig. Heldigvis akselererer Keras automatisk beregningene på GPU hvis den er tilgjengelig. Vi kan sjekke om Tensorflow kan bruke GPU ved å bruke følgende kode:\n" + "Dype nevrale nettverk, slik som VGG-16 og andre mer moderne arkitekturer, krever ganske mye beregningskraft for å kjøre. Det gir mening å bruke GPU-akselerasjon hvis det er tilgjengelig. Heldigvis akselererer Keras automatisk beregningene på GPU-en hvis det er tilgjengelig. Vi kan sjekke om Tensorflow er i stand til å bruke GPU med følgende kode:\n" ] }, { @@ -627,9 +636,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ + "\n", "## Ekstrahere VGG-funksjoner\n", "\n", - "Hvis vi ønsker å bruke VGG-16 for å ekstrahere funksjoner fra bildene våre, trenger vi modellen uten de siste klassifiseringslagene. Vi kan opprette VGG-16-modellen uten topplagene ved å bruke denne koden:\n" + "Hvis vi ønsker å bruke VGG-16 for å ekstrahere funksjoner fra bildene våre, trenger vi modellen uten de siste klassifiseringslagene. Vi kan opprette en VGG-16-modell uten topp-lag ved å bruke denne koden:\n" ] }, { @@ -681,9 +691,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Dimensjonen til funksjonstensoren er 7x7x512, men for å visualisere den måtte vi omforme den til en 2D-form.\n", + "Dimensjonen til feature-tensoren er 7x7x512, men for å kunne visualisere den måtte vi omforme den til 2D-form.\n", "\n", - "La oss nå prøve å se om disse funksjonene kan brukes til å klassifisere bilder. Vi tar manuelt en del av bildene (50 minibatcher, i vårt tilfelle) og forhåndsberegner deres funksjonsvektorer. Vi kan bruke Tensorflow **dataset** API for å gjøre dette. `map`-funksjonen tar et datasett og anvender en gitt lambda-funksjon for å transformere det. Vi bruker denne mekanismen til å konstruere nye datasett, `ds_features_train` og `ds_features_test`, som inneholder VGG-ekstraherte funksjoner i stedet for de originale bildene.\n" + "Nå skal vi prøve å se om disse features kan brukes til å klassifisere bilder. La oss manuelt ta en delvis andel av bilder (50 minibatcher, i vårt tilfelle), og forhåndsberegne deres feature-vektorer. Vi kan bruke Tensorflow **dataset** API for å gjøre det. `map`-funksjonen tar et datasett og anvender en gitt lambda-funksjon for å transformere det. Vi bruker denne mekanismen for å konstruere nye datasett, `ds_features_train` og `ds_features_test`, som inneholder VGG-ekstraherte features i stedet for originale bilder.\n" ] }, { @@ -713,9 +723,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Vi brukte konstruksjonen `.take(50)` for å begrense datasettstørrelsen, for å gjøre demonstrasjonen raskere. Du kan selvfølgelig utføre dette eksperimentet på hele datasettet.\n", + "Vi brukte konstruksjonen `.take(50)` for å begrense datasettstørrelsen, for å akselerere demonstrasjonen vår. Du kan selvfølgelig utføre dette eksperimentet på hele datasettet.\n", "\n", - "Nå som vi har et datasett med uttrukne egenskaper, kan vi trene en enkel tett klassifiserer for å skille mellom katter og hunder. Dette nettverket vil ta en egenskapsvektor med formen (7,7,512) og produsere én output som tilsvarer enten en hund eller en katt. Siden det er en binær klassifisering, bruker vi `sigmoid` aktiveringsfunksjon og `binary_crossentropy` tap.\n" + "Nå som vi har et datasett med uttrukne egenskaper, kan vi trene en enkel tett klassifiserer for å skille mellom katter og hunder. Dette nettverket vil ta en egenskapsvektor med formen (7,7,512), og produsere én utgang som tilsvarer enten en hund eller en katt. Fordi det er en binær klassifisering, bruker vi `sigmoid` aktiveringsfunksjon og `binary_crossentropy` tap.\n" ] }, { @@ -744,13 +754,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Resultatet er fantastisk, vi kan skille mellom en katt og en hund med nesten 95% sannsynlighet! Men vi har kun testet denne tilnærmingen på et utvalg av alle bildene, fordi manuell funksjonsuttrekking ser ut til å ta mye tid.\n", + "Resultatet er flott, vi kan skille mellom en katt og en hund med nesten 95 % sannsynlighet! Imidlertid har vi kun testet denne tilnærmingen på et utvalg av alle bildene, fordi manuell funksjonsutvinning ser ut til å ta mye tid.\n", "\n", - "## Overføringslæring ved bruk av én VGG-nettverk\n", + "## Transfer learning ved bruk av ett VGG-nettverk\n", "\n", - "Vi kan også unngå å manuelt forhåndsberegne funksjonene ved å bruke det originale VGG-16-nettverket som en helhet under trening, ved å legge til en funksjonsuttrekker som første lag i nettverket vårt.\n", + "Vi kan også unngå manuell forhåndsberegning av funksjonene ved å bruke det originale VGG-16-nettverket som helhet under trening, ved å legge til funksjonsutvinner som det første laget i nettverket vårt. \n", "\n", - "Det fine med Keras-arkitekturen er at VGG-16-modellen vi har definert ovenfor også kan brukes som et lag i et annet nevralt nettverk! Vi trenger bare å konstruere et nettverk med en tett klassifiserer på toppen av det, og deretter trene hele nettverket ved hjelp av tilbakepropagering.\n" + "Det fine med Keras-arkitekturen er at VGG-16-modellen som vi har definert ovenfor også kan brukes som et lag i et annet nevralt nettverk! Vi trenger bare å bygge et nettverk med en tett klassifiserer oppå dette, og deretter trene hele nettverket ved bruk av backpropagation.\n" ] }, { @@ -794,13 +804,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Denne modellen ser ut som et ende-til-ende klassifiseringsnettverk, som tar et bilde og returnerer klassen. Det vanskelige her er imidlertid at vi ønsker at VGG16 skal fungere som en funksjonsekstraktor, og ikke bli trent på nytt. Derfor må vi **fryse vektene til den konvolusjonelle funksjonsekstraktoren**. Vi kan få tilgang til det første laget i nettverket ved å kalle `model.layers[0]`, og vi trenger bare å sette egenskapen `trainable` til `False`.\n", + "Denne modellen ser ut som et ende-til-ende klassifiseringsnettverk, som tar et bilde og returnerer klassen. Den vanskelige tingen er imidlertid at vi ønsker at VGG16 skal fungere som en funksjonsuttrekker, og ikke trenes på nytt. Derfor må vi **fryse vektene til den konvolusjonelle funksjonsuttrekkeren**. Vi kan få tilgang til det første laget i nettverket ved å kalle `model.layers[0]`, og vi trenger bare å sette `trainable`-egenskapen til `False`.\n", "\n", - "> **Note**: Frysing av vektene til funksjonsekstraktoren er nødvendig, fordi ellers kan det utrente klassifiseringslaget ødelegge de opprinnelige forhåndstrente vektene til den konvolusjonelle ekstraktoren.\n", + "> **Merk**: Frysning av vektene til funksjonsuttrekkeren er nødvendig, fordi ellers kan det utrente klassifiseringslaget ødelegge de opprinnelige forhåndstrente vektene til konvolusjonsuttrekkeren.\n", "\n", - "Du kan legge merke til at selv om det totale antallet parametere i nettverket vårt er rundt 15 millioner, trener vi bare 25 000 parametere. Alle andre parametere i de øverste konvolusjonsfiltrene er forhåndstrente. Det er bra, fordi vi kan finjustere et mindre antall parametere med et mindre antall eksempler.\n", + "Du kan legge merke til at selv om det totale antallet parametere i nettverket vårt er rundt 15 millioner, trener vi bare 25k parametere. Alle andre parametere i toppnivåets konvolusjonsfiltre er forhåndstrent. Det er bra, fordi vi kan finjustere et mindre antall parametere med et mindre antall eksempler.\n", "\n", - "Vi skal nå trene nettverket vårt og se hvor bra vi kan få det til. Forvent ganske lang kjøretid, og ikke bekymre deg hvis det ser ut som om utførelsen har fryst en stund.\n" + "Vi skal nå trene nettverket vårt og se hvor godt vi kan få det til. Forvent en ganske lang kjøretid, og ikke bekymre deg hvis utføringen ser ut til å fryse en stund.\n" ] }, { @@ -825,11 +835,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Det ser ut som vi har fått en ganske nøyaktig klassifiserer for katter vs. hunder!\n", + "Det ser ut som vi har fått en rimelig nøyaktig katter mot hunder-klassifiserer! \n", "\n", - "## Lagre og laste inn modellen\n", + "## Lagre og laste modellen\n", "\n", - "Når vi har trent modellen, kan vi lagre modellarkitekturen og de trente vektene til en fil for fremtidig bruk:\n" + "Når vi har trent modellen, kan vi lagre modellarkitektur og trente vekter til en fil for fremtidig bruk:\n" ] }, { @@ -853,7 +863,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Vi kan deretter laste modellen fra fil når som helst. Du kan finne det nyttig i tilfelle det neste eksperimentet ødelegger modellen - du slipper å starte helt fra begynnelsen.\n" + "Vi kan da laste inn modellen fra fil når som helst. Det kan være nyttig hvis neste eksperiment ødelegger modellen - da slipper du å starte helt på nytt.\n" ] }, { @@ -869,15 +879,15 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Finjustering av overføringslæring\n", + "## Finjustering av transfer learning\n", "\n", - "I forrige seksjon har vi trent det siste klassifiseringslaget til å klassifisere bilder i vårt eget datasett. Imidlertid har vi ikke trent opp funksjonsekstraktoren på nytt, og modellen vår har basert seg på funksjonene som modellen har lært fra ImageNet-data. Hvis objektene dine visuelt skiller seg fra vanlige ImageNet-bilder, kan denne kombinasjonen av funksjoner kanskje ikke fungere optimalt. Derfor gir det mening å begynne å trene de konvolusjonelle lagene også.\n", + "I forrige seksjon trente vi det siste klassifiseringslaget for å klassifisere bilder i vårt eget datasett. Vi trente derimot ikke om funksjonsuttrekkeren, og modellen vår baserte seg på funksjonene som modellen hadde lært fra ImageNet-data. Hvis objektene dine visuelt skiller seg fra vanlige ImageNet-bilder, kan denne kombinasjonen av funksjoner kanskje ikke fungere best. Derfor gir det mening å starte treningen av konvolusjonslag også.\n", "\n", - "For å gjøre dette kan vi oppheve frysing av parameterne til de konvolusjonelle filtrene som vi tidligere har fryst.\n", + "For å gjøre det kan vi frigjøre konvolusjonsfilterparameterne som vi tidligere har frosset.\n", "\n", - "> **Merk:** Det er viktig at du først fryser parameterne og utfører flere epoker med trening for å stabilisere vektene i klassifiseringslaget. Hvis du umiddelbart starter trening av hele nettverket med ufryste parametere, er det stor sannsynlighet for at store feil ødelegger de forhåndstrente vektene i de konvolusjonelle lagene.\n", + "> **Merk:** Det er viktig at du fryser parameterne først og utfører flere trenings-epoker for å stabilisere vektene i klassifiseringslaget. Hvis du umiddelbart begynner å trene hele nettverket med ufryste parametere, er det stor sannsynlighet for at store feil vil ødelegge de forhåndstrente vektene i konvolusjonslagene.\n", "\n", - "Vår konvolusjonelle VGG-16-modell er plassert i det første laget, og den består av mange lag i seg selv. Vi kan ta en titt på strukturen:\n" + "Vår konvolusjonelle VGG-16-modell er plassert inni det første laget, og den består selv av mange lag. Vi kan ta en titt på strukturen dens:\n" ] }, { @@ -945,7 +955,9 @@ { "cell_type": "markdown", "metadata": {}, - "source": [] + "source": [ + "Vi kan frigjøre alle lag av konvolusjonsbasen:\n" + ] }, { "cell_type": "code", @@ -960,7 +972,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Men å tine opp alle samtidig er ikke den beste ideen. Vi kan først tine opp bare noen få siste lag med konvolusjoner, fordi de inneholder høyere nivå mønstre som er relevante for bildene våre. For eksempel, til å begynne med, kan vi fryse alle lag unntatt de siste 4:\n" + "Det er imidlertid ikke den beste ideen å tine opp alle på en gang. Vi kan først tine opp bare et par av de siste konvolusjonslagene, fordi de inneholder mer komplekse mønstre som er relevante for bildene våre. For eksempel kan vi begynne med å fryse alle lag bortsett fra de siste 4: \n" ] }, { @@ -999,11 +1011,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Observer at antallet trenbare parametere økte betydelig, men det er fortsatt rundt 50 % av alle parametere.\n", + "Legg merke til at antallet trenbare parametere økte betydelig, men det er fortsatt rundt 50 % av alle parametere.\n", "\n", - "Etter at vi har låst opp, kan vi kjøre noen få flere epoker med trening (i vårt eksempel vil vi bare kjøre én). Du kan også velge en lavere læringsrate for å minimere påvirkningen på de forhåndstrente vektene. Likevel, selv med lav læringsrate, kan du forvente at nøyaktigheten synker i starten av treningen, før den til slutt når et litt høyere nivå enn i tilfellet med faste vekter.\n", + "Etter å ha frigjort, kan vi kjøre noen flere epoker med trening (i vårt eksempel gjør vi bare én). Du kan også velge lavere læringsrate for å minimere påvirkningen på de forhåndstrente vektene. Selv med lav læringsrate kan du imidlertid forvente at nøyaktigheten faller i begynnelsen av treningen, før den til slutt når et litt høyere nivå enn i tilfellet med faste vekter.\n", "\n", - "> **Merk:** Denne treningen går mye tregere, fordi vi må propagere gradienter tilbake gjennom mange lag i nettverket!\n" + "> **Merk:** Denne treningen skjer mye tregere, fordi vi må propagere gradienter tilbake gjennom mange lag i nettverket!\n" ] }, { @@ -1027,18 +1039,18 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Vi vil sannsynligvis oppnå høyere treningsnøyaktighet, fordi vi bruker et mer kraftfullt nettverk med flere parametere, men valideringsnøyaktigheten vil ikke øke like mye.\n", + "Vi vil sannsynligvis oppnå høyere treningsnøyaktighet, fordi vi bruker et kraftigere nettverk med flere parametere, men valideringsnøyaktigheten vil ikke øke like mye.\n", "\n", - "Du kan gjerne låse opp noen flere lag i nettverket og trene mer, for å se om du klarer å oppnå høyere nøyaktighet!\n" + "Føl deg fri til å låse opp noen flere lag i nettverket og trene mer, for å se om du kan oppnå høyere nøyaktighet!\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Andre modeller for datamaskinsyn\n", + "## Andre datavisjonsmodeller\n", "\n", - "VGG-16 er en av de enkleste arkitekturene for datamaskinsyn. Keras tilbyr mange flere forhåndstrente nettverk. De mest brukte blant disse er **ResNet**-arkitekturer, utviklet av Microsoft, og **Inception** fra Google. For eksempel, la oss utforske arkitekturen til den enkleste ResNet-50-modellen (ResNet er en familie av modeller med ulik dybde, du kan prøve å eksperimentere med ResNet-152 hvis du vil se hvordan en virkelig dyp modell ser ut):\n" + "VGG-16 er en av de enkleste datavisjonsarkitekturene. Keras tilbyr mange flere forhåndstrente nettverk. De mest brukte blant disse er **ResNet**-arkitekturene, utviklet av Microsoft, og **Inception** av Google. For eksempel, la oss utforske arkitekturen til den enkleste ResNet-50-modellen (ResNet er en familie av modeller med ulik dybde, du kan prøve å eksperimentere med ResNet-152 hvis du vil se hvordan en virkelig dyp modell ser ut):\n" ] }, { @@ -1440,29 +1452,29 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Som du kan se, inneholder modellen de samme kjente byggeklossene: konvolusjonslag, pooling-lag og en endelig tett klassifiserer. Vi kan bruke denne modellen på nøyaktig samme måte som vi har brukt VGG-16 for transfer learning. Du kan prøve å eksperimentere med koden ovenfor, ved å bruke forskjellige ResNet-modeller som basismodell, og se hvordan nøyaktigheten endrer seg.\n", + "Som du kan se, inneholder modellen de samme kjente byggeklossene: konvolusjonslag, poolinglag og endelig tett klassifiserer. Vi kan bruke denne modellen på nøyaktig samme måte som vi har brukt VGG-16 for overføringslæring. Du kan prøve å eksperimentere med koden ovenfor, bruke forskjellige ResNet-modeller som basismodell, og se hvordan nøyaktigheten endres.\n", "\n", - "## Batch Normalisering\n", + "## Batch Normalization\n", "\n", - "Dette nettverket inneholder enda en type lag: **Batch Normalisering**. Ideen bak batch normalisering er å bringe verdiene som flyter gjennom det nevrale nettverket til riktig intervall. Vanligvis fungerer nevrale nettverk best når alle verdier er i området [-1,1] eller [0,1], og det er grunnen til at vi skalerer/normaliserer våre inngangsdata deretter. Under trening av et dypt nettverk kan det imidlertid skje at verdiene kommer betydelig utenfor dette området, noe som gjør treningen problematisk. Batch normaliseringslaget beregner gjennomsnitt og standardavvik for alle verdiene i den nåværende minibatchen, og bruker dem til å normalisere signalet før det sendes gjennom et nevralt nettverkslag. Dette forbedrer stabiliteten til dype nettverk betydelig.\n" + "Dette nettverket inneholder enda en type lag: **Batch Normalization**. Ideen med batch normalisering er å bringe verdier som flyter gjennom det nevrale nettverket til riktig intervall. Vanligvis fungerer nevrale nettverk best når alle verdier er i området [-1,1] eller [0,1], og det er grunnen til at vi skalerer/normaliserer inngangsdataene våre deretter. Men under trening av et dypt nettverk kan det skje at verdier beveger seg betydelig utenfor dette området, noe som gjør treningen problematisk. Batch normaliseringslaget beregner gjennomsnitt og standardavvik for alle verdiene i det nåværende minibatchen, og bruker dem til å normalisere signalet før det sendes gjennom et nevralt netverkslag. Dette forbedrer stabiliteten til dype nettverk betydelig.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Hovedpoeng\n", + "## Oppsummering\n", "\n", - "Ved å bruke transfer learning kunne vi raskt sette sammen en klassifiserer for vår tilpassede objektklassifiseringsoppgave og oppnå høy nøyaktighet. Dette eksempelet var imidlertid ikke helt rettferdig, fordi det originale VGG-16-nettverket var forhåndstrent til å gjenkjenne katter og hunder, og vi gjenbrukte derfor de fleste mønstrene som allerede var til stede i nettverket. Du kan forvente lavere nøyaktighet på mer eksotiske, domenespesifikke objekter, som detaljer på produksjonslinjen i en fabrikk eller ulike treblader.\n", + "Ved å bruke transfer learning kunne vi raskt sette sammen en klassifiserer for vår egendefinerte objektklassifiseringsoppgave og oppnå høy nøyaktighet. Dette eksempelet var imidlertid ikke helt rettferdig, fordi det opprinnelige VGG-16-nettverket var forhåndstrent til å gjenkjenne katter og hunder, og dermed gjenbrukte vi bare mesteparten av mønstrene som allerede var til stede i nettverket. Du kan forvente lavere nøyaktighet på mer eksotiske domene-spesifikke objekter, som detaljer på produksjonslinjen i en fabrikk, eller forskjellige tresorter.\n", "\n", - "Du kan se at mer komplekse oppgaver som vi løser nå krever høyere datakraft og ikke enkelt kan løses på CPU. I neste enhet vil vi prøve å bruke en mer lettvektsimplementasjon for å trene den samme modellen med lavere datakraft, noe som resulterer i bare litt lavere nøyaktighet.\n" + "Du kan se at mer komplekse oppgaver som vi løser nå krever høyere beregningskraft, og ikke enkelt kan løses på CPU. I neste enhet vil vi prøve å bruke en mer lettvekts implementasjon for å trene den samme modellen med lavere beregningsressurser, noe som resulterer i bare litt lavere nøyaktighet.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**Ansvarsfraskrivelse**: \nDette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiserte oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen.\n" + "---\n\n\n**Ansvarsfraskrivelse**:\nDette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det opprinnelige dokumentet på originalspråket skal betraktes som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen.\n\n" ] } ], @@ -1483,12 +1495,6 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" - }, - "coopTranslator": { - "original_hash": "c189abc107848f96051085cc30945129", - "translation_date": "2025-08-28T16:30:57+00:00", - "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", - "language_code": "no" } }, "nbformat": 4, diff --git a/translations/no/lessons/5-NLP/README.md b/translations/no/lessons/5-NLP/README.md index e63e20d713..4c1ce0f1aa 100644 --- a/translations/no/lessons/5-NLP/README.md +++ b/translations/no/lessons/5-NLP/README.md @@ -1,51 +1,51 @@ # Naturlig Språkbehandling -![Oppsummering av NLP-oppgaver i en skisse](../../../../translated_images/no/ai-nlp.b22dcb8ca4707cea.webp) +![Oppsummering av NLP-oppgaver i en tegning](../../../../translated_images/no/ai-nlp.b22dcb8ca4707cea.webp) -I denne delen vil vi fokusere på å bruke nevrale nettverk for å håndtere oppgaver relatert til **Naturlig Språkbehandling (NLP)**. Det finnes mange NLP-problemer vi ønsker at datamaskiner skal kunne løse: +I denne seksjonen vil vi fokusere på å bruke nevrale nettverk for å håndtere oppgaver relatert til **Naturlig Språkbehandling (NLP)**. Det finnes mange NLP-problemer vi ønsker at datamaskiner skal kunne løse: -* **Tekstklassifisering** er et typisk klassifiseringsproblem som gjelder tekstsekvenser. Eksempler inkluderer å klassifisere e-postmeldinger som spam eller ikke-spam, eller å kategorisere artikler som sport, økonomi, politikk osv. Når vi utvikler chatboter, må vi ofte forstå hva en bruker ønsker å si – i dette tilfellet håndterer vi **intensjonsklassifisering**. Ofte må vi i intensjonsklassifisering håndtere mange kategorier. -* **Sentimentanalyse** er et typisk regresjonsproblem, der vi må tilordne et tall (et sentiment) som tilsvarer hvor positivt/negativt meningen med en setning er. En mer avansert versjon av sentimentanalyse er **aspektbasert sentimentanalyse** (ABSA), der vi tilordner sentiment ikke til hele setningen, men til ulike deler av den (aspekter), f.eks. *På denne restauranten likte jeg maten, men atmosfæren var forferdelig*. -* **Navngitt enhetsgjenkjenning** (NER) refererer til problemet med å trekke ut visse enheter fra tekst. For eksempel kan vi trenge å forstå at i setningen *Jeg må fly til Paris i morgen* refererer ordet *i morgen* til DATO, og *Paris* er en LOKASJON. -* **Nøkkelorduttrekking** ligner på NER, men vi må automatisk trekke ut ord som er viktige for meningen med setningen, uten forhåndstrening for spesifikke enhetstyper. -* **Tekstklustering** kan være nyttig når vi ønsker å gruppere sammen lignende setninger, for eksempel lignende forespørsler i tekniske support-samtaler. -* **Spørsmål og svar** refererer til en modells evne til å svare på et spesifikt spørsmål. Modellen mottar en tekstpassasje og et spørsmål som input, og den må angi et sted i teksten der svaret på spørsmålet finnes (eller, noen ganger, generere selve svaret). -* **Tekstgenerering** er en modells evne til å generere ny tekst. Det kan betraktes som en klassifiseringsoppgave som forutsier neste bokstav/ord basert på en *tekstprompt*. Avanserte tekstgenereringsmodeller, som GPT-3, kan løse andre NLP-oppgaver som klassifisering ved hjelp av en teknikk kalt [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). -* **Tekstoppsummering** er en teknikk der vi ønsker at en datamaskin skal "lese" lang tekst og oppsummere den i noen få setninger. -* **Maskinoversettelse** kan sees på som en kombinasjon av tekstforståelse på ett språk og tekstgenerering på et annet. +* **Tekstklassifisering** er et typisk klassifiseringsproblem knyttet til tekstsekvenser. Eksempler inkluderer å klassifisere e-postmeldinger som spam vs. ikke-spam, eller kategorisere artikler som sport, næringsliv, politikk, osv. Også når man utvikler chatteboter, trenger man ofte å forstå hva en bruker ønsket å si – i dette tilfellet håndterer vi **intensjonsklassifisering**. Ofte i intensjonsklassifisering må man håndtere mange kategorier. +* **Sentimentanalyse** er et typisk regresjonsproblem, hvor vi må tilordne et tall (et sentiment) som tilsvarer hvor positivt/negativt meningen i en setning er. En mer avansert versjon av sentimentanalyse er **aspektbasert sentimentanalyse** (ABSA), hvor vi tilordner sentiment ikke til hele setningen, men til forskjellige deler av den (aspekter), f.eks. *I denne restauranten likte jeg maten, men atmosfæren var forferdelig*. +* **Navngitt enhetsgjenkjenning** (NER) refererer til problemet med å trekke ut bestemte enheter fra tekst. For eksempel kan vi trenge å forstå at i uttrykket *Jeg må fly til Paris i morgen* refererer ordet *i morgen* til DATO, og *Paris* er et STED. +* **Nøkkelorduttrekk** er likt NER, men vi må automatisk trekke ut ord som er viktige for meningen i setningen, uten forhåndstrening for spesifikke enhetstyper. +* **Tekstgruppering** kan være nyttig når vi ønsker å gruppere sammen lignende setninger, for eksempel lignende forespørsler i teknisk support-konversasjoner. +* **Spørsmål og svar** refererer til en modells evne til å svare på et spesifikt spørsmål. Modellen mottar en tekstpassasje og et spørsmål som input, og må finne et sted i teksten hvor svaret på spørsmålet finnes (eller noen ganger generere svaret som tekst). +* **Tekstgenerering** er evnen til at en modell kan generere ny tekst. Det kan betraktes som en klassifiseringsoppgave som predikerer neste bokstav/ord basert på et *tekstprompt*. Avanserte modeller for tekstgenerering, som GPT-3, kan løse andre NLP-oppgaver som klassifisering ved hjelp av en teknikk kalt [promptprogrammering](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) +* **Tekstoppsummering** er en teknikk hvor vi ønsker at en datamaskin skal "lese" lang tekst og oppsummere den i noen få setninger. +* **Maskinoversettelse** kan sees på som en kombinasjon av tekstforståelse på ett språk og tekstgenerering på et annet språk. -Opprinnelig ble de fleste NLP-oppgaver løst ved hjelp av tradisjonelle metoder som grammatikk. For eksempel ble det i maskinoversettelse brukt parsere for å transformere en opprinnelig setning til et syntakstre, deretter ble høyere nivå semantiske strukturer hentet ut for å representere meningen med setningen, og basert på denne meningen og grammatikken til målspråket ble resultatet generert. I dag løses mange NLP-oppgaver mer effektivt ved hjelp av nevrale nettverk. +I begynnelsen ble de fleste NLP-oppgaver løst ved hjelp av tradisjonelle metoder som grammatikk. For eksempel, i maskinoversettelse ble parser brukt for å omdanne setninger til et syntakstre, deretter ble høyere semantiske strukturer uttrukket for å representere setningens mening, og basert på denne betydningen og målrettsspråkets grammatikk ble resultatet generert. I dag løses mange NLP-oppgaver mer effektivt ved hjelp av nevrale nettverk. -> Mange klassiske NLP-metoder er implementert i Python-biblioteket [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org). Det finnes en flott [NLTK-bok](https://www.nltk.org/book/) tilgjengelig online som dekker hvordan ulike NLP-oppgaver kan løses ved hjelp av NLTK. +> Mange klassiske NLP-metoder er implementert i [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org) Python-biblioteket. Det finnes en flott [NLTK-bok](https://www.nltk.org/book/) tilgjengelig online som dekker hvordan forskjellige NLP-oppgaver kan løses ved hjelp av NLTK. -I dette kurset vil vi hovedsakelig fokusere på å bruke nevrale nettverk for NLP, og vi vil bruke NLTK der det er nødvendig. +I vårt kurs vil vi hovedsakelig fokusere på å bruke nevrale nettverk for NLP, og vi vil bruke NLTK der det er nødvendig. -Vi har allerede lært om å bruke nevrale nettverk for å håndtere tabulardata og bilder. Den største forskjellen mellom disse datatypene og tekst er at tekst er en sekvens med variabel lengde, mens inputstørrelsen i tilfelle bilder er kjent på forhånd. Selv om konvolusjonsnettverk kan trekke ut mønstre fra inputdata, er mønstre i tekst mer komplekse. For eksempel kan negasjon være adskilt fra subjektet med et vilkårlig antall ord (f.eks. *Jeg liker ikke appelsiner* vs. *Jeg liker ikke de store fargerike smakfulle appelsinene*), og det bør fortsatt tolkes som ett mønster. Derfor trenger vi nye typer nevrale nettverk for å håndtere språk, som *rekurrente nettverk* og *transformatorer*. +Vi har allerede lært om bruk av nevrale nettverk for behandling av tabulære data og bilder. Hovedforskjellen mellom disse datatypene og tekst er at tekst er en sekvens med variabel lengde, mens inngangsstørrelsen i tilfelle bilder er kjent på forhånd. Mens konvolusjonsnettverk kan trekke ut mønstre fra inngangsdata, er mønstrene i tekst mer komplekse. For eksempel kan negasjon være atskilt fra subjektet av et vilkårlig antall ord (f.eks. *Jeg liker ikke appelsiner* vs. *Jeg liker ikke de store fargerike smakfulle appelsinene*), og det skal fortsatt tolkes som ett mønster. Derfor trenger vi nye typer nevrale nettverk for å håndtere språk, slik som *rekurrente nettverk* og *transformere*. -## Installere Biblioteker +## Installer biblioteker -Hvis du bruker en lokal Python-installasjon for å kjøre dette kurset, kan det hende du må installere alle nødvendige biblioteker for NLP ved hjelp av følgende kommandoer: +Hvis du bruker lokal Python-installasjon for å kjøre dette kurset, kan det hende du må installere alle nødvendige biblioteker for NLP ved å bruke 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 +## GPU-advarsel -I denne delen vil vi i noen av eksemplene trene ganske store modeller. -* **Bruk en datamaskin med GPU**: Det anbefales å kjøre notatbøkene dine på en datamaskin med GPU for å redusere ventetiden når du arbeider med store modeller. -* **Begrensninger i GPU-minne**: Å kjøre på en GPU kan føre til situasjoner der du går tom for GPU-minne, spesielt når du trener store modeller. -* **GPU-minneforbruk**: Mengden GPU-minne som forbrukes under trening avhenger av ulike faktorer, inkludert minibatch-størrelsen. -* **Minimer minibatch-størrelse**: Hvis du opplever problemer med GPU-minne, vurder å redusere minibatch-størrelsen i koden din som en mulig løsning. -* **TensorFlow GPU-minnefrigjøring**: Eldre versjoner av TensorFlow kan ha problemer med å frigjøre GPU-minne riktig når du trener flere modeller i én Python-kjerne. For å håndtere GPU-minnebruk effektivt kan du konfigurere TensorFlow til å allokere GPU-minne kun etter behov. -* **Kodeinkludering**: For å sette opp TensorFlow til å vokse GPU-minneallokering kun når det er nødvendig, inkluder følgende kode i notatbøkene dine: +I denne seksjonen vil vi i noen av eksemplene trene ganske store modeller. +* **Bruk en datamaskin med GPU**: Det anbefales å kjøre notatbøkene dine på en datamaskin med GPU for å redusere ventetider når du jobber med store modeller. +* **GPU-minnebegrensninger**: Kjøring på GPU kan føre til situasjoner hvor du går tom for GPU-minne, spesielt når du trener store modeller. +* **Forbruk av GPU-minne**: Mengden GPU-minne som brukes under trening avhenger av forskjellige faktorer, inkludert minibatch-størrelse. +* **Minimer minibatch-størrelse**: Hvis du opplever problemer med GPU-minne, vurder å redusere minibatch-størrelsen i koden din som en potensiell løsning. +* **Frigjøring av GPU-minne i TensorFlow**: Eldre versjoner av TensorFlow frigjør kanskje ikke GPU-minne korrekt når flere modeller trenes i én Python-kjerne. For å håndtere GPU-minnebruk effektivt kan du konfigurere TensorFlow til å tildele GPU-minne bare etter behov. +* **Inkludering av kode**: For å sette TensorFlow til å gradvis øke GPU-minnetildeling kun etter behov, inkluder følgende kode i notatbøkene dine: ```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 interessert i å lære om NLP fra et klassisk maskinlæringsperspektiv, besøk [denne samlingen av leksjoner](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP). +Hvis du er interessert i å lære om NLP fra et klassisk ML-perspektiv, besøk [dette settet med leksjoner](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP) -## I denne delen -I denne delen skal vi lære om: +## I denne seksjonen +I denne seksjonen skal vi lære om: -* [Representere tekst som tensorer](13-TextRep/README.md) -* [Ord-embedding](14-Emdeddings/README.md) +* [Representasjon av tekst som tensorer](13-TextRep/README.md) +* [Ordinnstikk](14-Emdeddings/README.md) * [Språkmodellering](15-LanguageModeling/README.md) * [Rekurrente nevrale nettverk](16-RNN/README.md) * [Generative nettverk](17-GenerativeNetworks/README.md) -* [Transformatorer](18-Transformers/README.md) +* [Transformere](18-Transformers/README.md) --- -**Ansvarsfraskrivelse**: -Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file + +**Ansvarsfraskrivelse**: +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det opprinnelige dokumentet på originalspråket skal betraktes som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. + \ No newline at end of file diff --git a/translations/pa/.co-op-translator.json b/translations/pa/.co-op-translator.json index 117154f220..50284e459a 100644 --- a/translations/pa/.co-op-translator.json +++ b/translations/pa/.co-op-translator.json @@ -5,6 +5,12 @@ "source_file": "AGENTS.md", "language_code": "pa" }, + "CONTRIBUTING.md": { + "original_hash": "c6fd7e781b67111a90abd166d0ce4aa0", + "translation_date": "2026-07-08T22:02:33+00:00", + "source_file": "CONTRIBUTING.md", + "language_code": "pa" + }, "README.md": { "original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b", "translation_date": "2026-04-06T20:44:27+00:00", @@ -17,6 +23,19 @@ "source_file": "SECURITY.md", "language_code": "pa" }, + "__translation_failures__": { + "lessons/sketchnotes/LICENSE.md": { + "original_hash": "45ab63a2cd8f5faef6c9b150618837a4", + "source_file": "lessons/sketchnotes/LICENSE.md", + "language_code": "pa", + "failure_date": "2026-07-08T22:00:57+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:31+00:00", @@ -54,8 +73,8 @@ "language_code": "pa" }, "examples/README.md": { - "original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7", - "translation_date": "2025-10-03T11:29:33+00:00", + "original_hash": "7883d52c2e2a221e0b07a7b112a149b9", + "translation_date": "2026-07-08T21:54:42+00:00", "source_file": "examples/README.md", "language_code": "pa" }, @@ -66,8 +85,8 @@ "language_code": "pa" }, "lessons/0-course-setup/how-to-run.md": { - "original_hash": "a4717bd9103b9f6cd84d534b83534689", - "translation_date": "2026-01-15T13:19:33+00:00", + "original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1", + "translation_date": "2026-07-08T21:56:35+00:00", "source_file": "lessons/0-course-setup/how-to-run.md", "language_code": "pa" }, @@ -79,7 +98,7 @@ }, "lessons/1-Intro/README.md": { "original_hash": "f57e8aa46141fd220b16ffed8f11aec7", - "translation_date": "2025-11-18T21:13:56+00:00", + "translation_date": "2026-07-08T21:56:09+00:00", "source_file": "lessons/1-Intro/README.md", "language_code": "pa" }, @@ -191,6 +210,12 @@ "source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md", "language_code": "pa" }, + "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": { + "original_hash": "99b816b6a4957ef4100cee4c4221dff9", + "translation_date": "2026-07-08T21:44:58+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", + "language_code": "pa" + }, "lessons/4-ComputerVision/08-TransferLearning/lab/README.md": { "original_hash": "7765935c35fcee69b9fe2d0cfd6963e2", "translation_date": "2025-08-26T09:53:25+00:00", @@ -330,8 +355,8 @@ "language_code": "pa" }, "lessons/5-NLP/README.md": { - "original_hash": "8ef02a9318257ea140ed3ed74442096d", - "translation_date": "2025-08-26T08:05:51+00:00", + "original_hash": "038df6f1a73e49f6430740da083bfd6d", + "translation_date": "2026-07-08T21:57:08+00:00", "source_file": "lessons/5-NLP/README.md", "language_code": "pa" }, @@ -355,7 +380,7 @@ }, "lessons/6-Other/23-MultiagentSystems/README.md": { "original_hash": "38a1185ae3d54b180378bbd71ae3ef16", - "translation_date": "2025-09-23T07:26:26+00:00", + "translation_date": "2026-07-08T22:02:04+00:00", "source_file": "lessons/6-Other/23-MultiagentSystems/README.md", "language_code": "pa" }, diff --git a/translations/pa/CONTRIBUTING.md b/translations/pa/CONTRIBUTING.md new file mode 100644 index 0000000000..c7e969f2d5 --- /dev/null +++ b/translations/pa/CONTRIBUTING.md @@ -0,0 +1,29 @@ +# AI-For-Beginners ਵਿਚ ਯੋਗਦਾਨ ਦੇਣਾ + +AI-For-Beginners ਵਿੱਚ ਯੋਗਦਾਨ ਦੇਣ ਵਿਚ ਰੁਚੀ ਲਈ ਤੁਹਾਡਾ ਧੰਨਵਾਦ! ਅਸੀਂ ਅਨੁਵਾਦ, ਪਾਠ ਦੇ ਸਮਾਧਾਨ ਅਤੇ ਫਾਰਮੈਟਿੰਗ ਸਹੀ ਕਰਨ ਨੂੰ ਸਵਾਗਤ ਕਰਦੇ ਹਾਂ। + +## ਮਾਈਕ੍ਰੋਸਾਫਟ ਯੋਗਦਾਨ ਕਾਨੂੰਨੀ ਸਮਝੌਤਾ (CLA) + +ਇਹ ਪਰਿਯੋਜਨਾ ਯੋਗਦਾਨ ਅਤੇ ਸੁਝਾਅ ਸਵਾਗਤ ਕਰਦੀ ਹੈ। ਜ਼ਿਆਦਾਤਰ ਯੋਗਦਾਨਾਂ ਲਈ ਤੁਹਾਨੂੰ ਇੱਕ ਯੋਗਦਾਨ ਕਾਨੂੰਨੀ ਸਮਝੌਤਾ (CLA) ਨੂੰ ਸਵੀਕਾਰ ਕਰਨਾ ਪੈਂਦਾ ਹੈ ਜਿਸ ਵਿੱਚ ਤੁਸੀ ਇਹ ਐਲਾਨ ਕਰਦੇ ਹੋ ਕਿ ਤੁਹਾਡੇ ਕੋਲ ਤੁਹਾਡੇ ਯੋਗਦਾਨ ਨੂੰ ਵਰਤਣ ਦੇ ਹੱਕ ਹਨ ਅਤੇ ਤੁਸੀਂ ਸਾਨੂੰ ਇਹ ਹੱਕ ਦਿੱਤੇ ਹੋ। ਵਿਸਥਾਰ ਲਈ, [https://cla.microsoft.com](https://cla.microsoft.com) ਵੇਖੋ। + +ਜਦੋਂ ਤੁਸੀਂ ਇੱਕ ਪੂਲ ਰਿਕਵੇਸਟ ਸਬਮਿੱਟ ਕਰਦੇ ਹੋ, ਤਾਂ ਇੱਕ CLA-ਬੋਟ ਆਪਮੈਟਿਕ ਤੌਰ 'ਤੇ ਇਹ ਤੈਅ ਕਰੇਗਾ ਕਿ ਕੀ ਤੁਹਾਨੂੰ CLA ਪ੍ਰਦਾਨ ਕਰਨ ਦੀ ਲੋੜ ਹੈ ਅਤੇ ਪ੍ਰੋਪਰ ਤਰੀਕੇ ਨਾਲ PR ਨੂੰ ਲੇਬਲ ਜਾਂ ਟਿੱਪਣੀ ਨਾਲ ਸੁਸ਼ੋਭਿਤ ਕਰੇਗਾ। ਸਿਰਫ ਬੋਟ ਵੱਲੋਂ ਦਿੱਤੀਆਂ ਹਦਾਇਤਾਂ ਦੀ ਪਾਲਣਾ ਕਰੋ। ਸਾਰੇ ਰਿਪੋਜ਼ੀਟਰੀਆਂ ਵਿੱਚ ਇਹ ਕੰਮ ਤੁਹਾਨੂੰ ਸਿਰਫ ਇੱਕ ਵਾਰੀ ਕਰਨਾ ਪਵੇਗਾ ਜੇ ਅਸੀਂ CLA ਵਰਤਦੇ ਹਾਂ। + +## ਯੋਗਦਾਨ ਕਿਵੇਂ ਦੇਣਾ ਹੈ + +### 1. ਟਾਈਪੋ / ਕੋਡ ਐਰਰ ਸੁਰੁਚਿਤ ਕਰਨਾ +ਜੇਕਰ ਤੁਹਾਨੂੰ ਕਿਸੇ ਵੀ ਜੂਪੀਟਰ ਨੋਟਬੁੱਕ ਜਾਂ ਪਾਠ ਮਾਰਕਡਾਊਨ ਫਾਈਲ ਵਿੱਚ ਕੋਈ ਟਾਈਪੋ ਜਾਂ ਬੱਗ ਮਿਲਦਾ ਹੈ: +1. ਰਿਪੋਜ਼ੀਟਰੀ ਨੂੰ ਫੋਰਕ ਕਰੋ। +2. ਟਾਈਪੋ ਜਾਂ ਟੁੱਟਿਆ ਲਿੰਕ ਸਹੀ ਕਰੋ। +3. ਸੁਧਾਰ ਦੇ ਸਪੱਸ਼ਟ ਵੇਰਵੇ ਨਾਲ ਇੱਕ ਪੂਲ ਰਿਕਵੇਸਟ ਸਬਮਿੱਟ ਕਰੋ। + +### 2. ਅਨੁਵਾਦ ਸਬਮਿੱਟ ਕਰਨਾ +ਅਸੀਂ ਪਾਠਾਂ ਦੇ ਹੋਰ ਭਾਸ਼ਾਵਾਂ ਵਿੱਚ ਅਨੁਵਾਦਾਂ ਦਾ ਸਵਾਗਤ ਕਰਦੇ ਹਾਂ! ਕਿਰਪਾ ਕਰਕੇ `translations/` ਡਾਇਰੈਕਟਰੀ ਦੇ ਥੱਲੇ ਮੌਜੂਦਾ ਫੋਲਡਰ ਨਾਮਾਂ ਦਾ ਉਪਯੋਗ ਕਰਕੇ ਅਨੁਵਾਦ ਰੱਖੋ (ਜਿਵੇਂ ਕਿ `translations/es/`, `translations/pt-BR/`, `translations/zh-CN/`)। + +ਹੋਰ ਵੇਰਵਿਆਂ ਲਈ, [etc/CONTRIBUTING.md](etc/CONTRIBUTING.md) ਵੇਖੋ। + +--- + + +**ਅਸਵੀਕਾਰੋਪਣ**: +ਇਸ ਦਸਤਾਵੇਜ਼ ਦਾ ਅਨੁਵਾਦ ਏਆਈ ਅਨੁਵਾਦ ਸੇਵਾ [Co-op Translator](https://github.com/Azure/co-op-translator) ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਕੀਤਾ ਗਿਆ ਹੈ। ਜਦੋਂ ਕਿ ਅਸੀਂ ਸਹੀਤਾਵਾਂ ਲਈ ਯਤਨਸ਼ੀਲ ਹਾਂ, ਕਿਰਪਾ ਕਰਕੇ ਧਿਆਨ ਰੱਖੋ ਕਿ ਸਵੈਚਾਲਿਤ ਅਨੁਵਾਦਾਂ ਵਿੱਚ ਗਲਤੀਆਂ ਜਾਂ ਅਸਮੱਤਿਆਵਾਂ ਹੋ ਸਕਦੀਆਂ ਹਨ। ਮੂਲ ਦਸਤਾਵੇਜ਼ ਆਪਣੀ ਮੂਲ ਭਾਸ਼ਾ ਵਿੱਚ ਅਧਿਕਾਰਕ ਸਰੋਤ ਮੰਨਿਆ ਜਾਣਾ ਚਾਹੀਦਾ ਹੈ। ਜਰੂਰੀ ਜਾਣਕਾਰੀ ਲਈ, ਪੇਸ਼ੇਵਰ ਮਨੁੱਖੀ ਅਨੁਵਾਦ ਦੀ ਸਿਫ਼ਾਰਸ਼ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਅਸੀਂ ਇਸ ਅਨੁਵਾਦ ਦੇ ਉਪਯੋਗ ਤੋਂ ਪੈਦਾ ਹੋਣ ਵਾਲੀਆਂ ਕਿਸੇ ਵੀ ਗਲਤਫਹਿਮੀਆਂ ਜਾਂ ਗਲਤ ਵਿਆਖਿਆਵਾਂ ਲਈ ਜਵਾਬਦੇਹ ਨਹੀਂ ਹਾਂ। + \ No newline at end of file diff --git a/translations/pa/examples/README.md b/translations/pa/examples/README.md index fb5ba52cd7..1e54aa9ce6 100644 --- a/translations/pa/examples/README.md +++ b/translations/pa/examples/README.md @@ -1,85 +1,87 @@ -# ਸ਼ੁਰੂਆਤੀ ਪੱਧਰ ਦੇ AI ਉਦਾਹਰਨ +# ਨਵੇਂ ਸਿਖਣ ਵਾਲਿਆਂ ਲਈ ਏਆਈ ਉਦਾਹਰਣਾਂ -ਸਵਾਗਤ ਹੈ! ਇਹ ਡਾਇਰੈਕਟਰੀ ਸਧਾਰਨ, ਖੁਦ-ਨਿਰਭਰਤ ਉਦਾਹਰਨਾਂ ਨੂੰ ਸ਼ਾਮਲ ਕਰਦੀ ਹੈ ਜੋ ਤੁਹਾਨੂੰ AI ਅਤੇ ਮਸ਼ੀਨ ਲਰਨਿੰਗ ਨਾਲ ਸ਼ੁਰੂਆਤ ਕਰਨ ਵਿੱਚ ਮਦਦ ਕਰੇਗੀ। ਹਰ ਉਦਾਹਰਨ ਨੂੰ ਸ਼ੁਰੂਆਤੀ ਪੱਧਰ ਦੇ ਲਈ ਤਿਆਰ ਕੀਤਾ ਗਿਆ ਹੈ, ਜਿਸ ਵਿੱਚ ਵਿਸਥਾਰਿਤ ਟਿੱਪਣੀਆਂ ਅਤੇ ਕਦਮ-ਦਰ-ਕਦਮ ਵਿਆਖਿਆਵਾਂ ਹਨ। +ਸਵਾਗਤ ਹੈ! ਇਸ ਫੋਲਡਰ ਵਿੱਚ ਸਾਦੇ, ਖੁਦਮੁਖਤਾਰ ਉਦਾਹਰਣ ਹਨ ਜੋ ਤੁਹਾਨੂੰ ਏਆਈ ਅਤੇ ਮਸ਼ੀਨ ਲਰਨਿੰਗ ਨਾਲ ਸ਼ੁਰੂਆਤ ਕਰਨ ਵਿੱਚ ਮਦਦ ਕਰਨਗੇ। ਹਰ ਉਦਾਹਰਣ ਨਵੇਂ ਸਿਖਣ ਵਾਲਿਆਂ ਲਈ موزੂਨ ਹੈ ਜੋ ਵਿਸਥਾਰ ਨਾਲ ਟਿੱਪਣੀਆਂ ਅਤੇ ਕਦਮ-ਦਰ-ਕਦਮ ਵਿਆਖਿਆਵਾਂ ਨਾਲ banaayi gayi hai. -## 📚 ਉਦਾਹਰਨਾਂ ਦਾ ਜਾਇਜ਼ਾ +## 📚 ਉਦਾਹਰਣਾਂ ਦਾ ਜਾਇਜ਼ਾ -| ਉਦਾਹਰਨ | ਵੇਰਵਾ | ਮੁਸ਼ਕਲਤਾ | ਪੂਰਵ-ਸ਼ਰਤਾਂ | +| Example | Description | Difficulty | Prerequisites | |---------|-------------|------------|---------------| -| [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) | ਤੁਹਾਡਾ ਪਹਿਲਾ ਏਆਈ ਪ੍ਰੋਗਰਾਮ - ਸਾਦਾ ਪੈਟਰਨ ਪਹਿਚਾਣ | ⭐ Beginner | Python ਬੁਨਿਆਦੀ ਜਾਣਕਾਰੀ | +| [Simple Neural Network](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/02-simple-neural-network.py) | ਸ਼ੁਰੂ ਤੋਂ ਨਿਰਮਾਣ ਕਰੋ ਇਕ ਨਿਊਰਲ ਨੈੱਟਵਰਕ | ⭐⭐ Beginner+ | Python, ਬੁਨਿਆਦੀ ਗਣਿਤ | +| [Image Classifier](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/03-image-classifier.ipynb) | ਪ੍ਰੀ-ਟ੍ਰੇਨਡ ਮਾਡਲ ਨਾਲ ਚਿੱਤਰਾਂ ਦੀ ਵਰਗੀਕਰਨ ਕਰੋ | ⭐⭐ Beginner+ | Python, numpy | +| [Text Sentiment](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/04-text-sentiment.py) | ਲਿਖਤ ਦਾ ਭਾਵਨਾ ਵਿਸ਼ਲੇਸ਼ਣ (ਸਕਾਰਾਤਮਕ/ਨਕਾਰਾਤਮਕ) | ⭐⭐ Beginner+ | 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 ਵਾਤਾਵਰਣ ਦੀ ਵਰਤੋਂ ਕਰੋ: +ਜਾਂ ਮੁੱਖ ਕਰੀਕੁਲਮ ਦੇ ਕੋੰਡਾ ਇੰਵਾਇਰਨਮੈਂਟ ਦੀ ਵਰਤੋਂ ਕਰੋ: ```bash conda env create --name ai4beg --file ../environment.yml 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. **ਚਿੱਤਰ ਵਰਗੀਕਰਨ ਕੋਸ਼ਿਸ਼ ਕਰੋ** - ਅਸਲੀ ਚਿੱਤਰਾਂ ਨਾਲ ਏਆਈ ਦੇਖੋ +4. **ਲਿਖਤ ਭਾਵਨਾ ਵਿਸ਼ਲੇਸ਼ਣ ਕਰੋ** - ਕੁਦਰਤੀ ਭਾਸ਼ਾ ਪ੍ਰੋਸੈਸਿੰਗ ਦੀ ਸੈਰ ਕਰੋ -## 💡 ਸ਼ੁਰੂਆਤ ਕਰਨ ਵਾਲਿਆਂ ਲਈ ਸੁਝਾਅ +## 💡 ਨਵੇਂ ਸਿਖਣ ਵਾਲਿਆਂ ਲਈ ਸੁਝਾਅ -- **ਕੋਡ ਟਿੱਪਣੀਆਂ ਨੂੰ ਧਿਆਨ ਨਾਲ ਪੜ੍ਹੋ** - ਇਹ ਹਰ ਲਾਈਨ ਦਾ ਅਰਥ ਸਮਝਾਉਂਦੀਆਂ ਹਨ -- **ਪ੍ਰਯੋਗ ਕਰੋ!** - ਮੁੱਲਾਂ ਨੂੰ ਬਦਲਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ ਅਤੇ ਦੇਖੋ ਕੀ ਹੁੰਦਾ ਹੈ -- **ਹਰ ਚੀਜ਼ ਨੂੰ ਸਮਝਣ ਦੀ ਚਿੰਤਾ ਨਾ ਕਰੋ** - ਸਿੱਖਣਾ ਸਮਾਂ ਲੈਂਦਾ ਹੈ +- **ਕੋਡ ਟਿੱਪਣੀਆਂ ਧਿਆਨ ਨਾਲ ਪੜ੍ਹੋ** - ਉਹ ਹਰ ਲਾਈਨ ਦਾ ਕਾਰਜ ਸਮਝਾਉਂਦੀਆਂ ਹਨ +- **ਪ੍ਰਯੋਗ ਕਰੋ!** - ਮੁੱਲਾਂ ਨੂੰ ਬਦਲ ਕੇ ਦੇਖੋ ਕੀ ਹੁੰਦਾ ਹੈ +- **ਸਭ ਕੁਝ ਸਮਝਣ ਦੀ ਚਿੰਤਾ ਨਾ ਕਰੋ** - ਸਿੱਖਿਆ ਵਿੱਚ ਸਮਾਂ ਲੱਗਦਾ ਹੈ - **ਸਵਾਲ ਪੁੱਛੋ** - [ਚਰਚਾ ਬੋਰਡ](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) ## 🤝 ਯੋਗਦਾਨ -ਕੀ ਇਹ ਉਦਾਹਰਨਾਂ ਮਦਦਗਾਰ ਲੱਗੀਆਂ? ਸਾਨੂੰ ਇਹਨਾਂ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਵਿੱਚ ਮਦਦ ਕਰੋ: -- ਸਮੱਸਿਆਵਾਂ ਦੀ ਰਿਪੋਰਟ ਕਰੋ ਜਾਂ ਸੁਧਾਰਾਂ ਦਾ ਸੁਝਾਅ ਦਿਓ -- ਸ਼ੁਰੂਆਤ ਕਰਨ ਵਾਲਿਆਂ ਲਈ ਹੋਰ ਉਦਾਹਰਨਾਂ ਸ਼ਾਮਲ ਕਰੋ -- ਦਸਤਾਵੇਜ਼ ਅਤੇ ਟਿੱਪਣੀਆਂ ਵਿੱਚ ਸੁਧਾਰ ਕਰੋ +ਕੀ ਇਹ ਉਦਾਹਰਣ ਤੁਹਾਨੂੰ ਮਦਦਗਾਰ ਲੱਗੇ? ਉਹਨਾਂ ਨੂੰ ਬਹਿਤਰ ਬਣਾਉਣ ਵਿੱਚ ਸਾਡੀ ਮਦਦ ਕਰੋ: +- ਸਮੱਸਿਆਵਾਂ ਦੀ ਰਿਪੋਰਟ ਕਰੋ ਜਾਂ ਸੁਝਾਅ ਦਿਓ +- ਨਵੇਂ ਸਿਖਣ ਵਾਲਿਆਂ ਲਈ ਹੋਰ ਉਦਾਹਰਣ ਸ਼ਾਮਲ ਕਰੋ +- ਦਸਤਾਵੇਜ਼ ਅਤੇ ਟਿੱਪਣੀਆਂ ਸੁਧਾਰੋ --- -*ਯਾਦ ਰੱਖੋ: ਹਰ ਮਾਹਰ ਇੱਕ ਵਾਰ ਸ਼ੁਰੂਆਤੀ ਸੀ। ਖੁਸ਼ ਸਿੱਖਣਾ! 🎓* +*ਯਾਦ ਰੱਖੋ: ਹਰ ਮਹਿਰਤ ਇੱਕ ਵਾਰ ਨਵੇਂ ਸਿਖਣ ਵਾਲੇ ਹੁੰਦੇ ਹਨ। ਖੁਸ਼ ਰਹੋ ਸਿੱਖਣ ਵਿੱਚ! 🎓* --- -**ਅਸਵੀਕਰਤਾ**: -ਇਹ ਦਸਤਾਵੇਜ਼ AI ਅਨੁਵਾਦ ਸੇਵਾ [Co-op Translator](https://github.com/Azure/co-op-translator) ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਅਨੁਵਾਦ ਕੀਤਾ ਗਿਆ ਹੈ। ਜਦੋਂ ਕਿ ਅਸੀਂ ਸਹੀਤਾ ਲਈ ਯਤਨਸ਼ੀਲ ਹਾਂ, ਕਿਰਪਾ ਕਰਕੇ ਧਿਆਨ ਦਿਓ ਕਿ ਸਵੈਚਾਲਿਤ ਅਨੁਵਾਦਾਂ ਵਿੱਚ ਗਲਤੀਆਂ ਜਾਂ ਅਸੁਚੀਤਤਾਵਾਂ ਹੋ ਸਕਦੀਆਂ ਹਨ। ਇਸ ਦੀ ਮੂਲ ਭਾਸ਼ਾ ਵਿੱਚ ਮੌਜੂਦ ਅਸਲ ਦਸਤਾਵੇਜ਼ ਨੂੰ ਅਧਿਕਾਰਤ ਸਰੋਤ ਮੰਨਿਆ ਜਾਣਾ ਚਾਹੀਦਾ ਹੈ। ਮਹੱਤਵਪੂਰਨ ਜਾਣਕਾਰੀ ਲਈ, ਪੇਸ਼ੇਵਰ ਮਨੁੱਖੀ ਅਨੁਵਾਦ ਦੀ ਸਿਫਾਰਸ਼ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਇਸ ਅਨੁਵਾਦ ਦੀ ਵਰਤੋਂ ਤੋਂ ਪੈਦਾ ਹੋਣ ਵਾਲੇ ਕਿਸੇ ਵੀ ਗਲਤਫਹਿਮੀ ਜਾਂ ਗਲਤ ਵਿਆਖਿਆ ਲਈ ਅਸੀਂ ਜ਼ਿੰਮੇਵਾਰ ਨਹੀਂ ਹਾਂ। \ No newline at end of file + +**ਅਸਵੀਕਾਰੋਪਣ**: +ਇਸ ਦਸਤਾਵੇਜ਼ ਦਾ ਅਨੁਵਾਦ ਏਆਈ ਅਨੁਵਾਦ ਸੇਵਾ [Co-op Translator](https://github.com/Azure/co-op-translator) ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਕੀਤਾ ਗਿਆ ਹੈ। ਜਦੋਂ ਕਿ ਅਸੀਂ ਸਹੀਤਾਵਾਂ ਲਈ ਯਤਨਸ਼ੀਲ ਹਾਂ, ਕਿਰਪਾ ਕਰਕੇ ਧਿਆਨ ਰੱਖੋ ਕਿ ਸਵੈਚਾਲਿਤ ਅਨੁਵਾਦਾਂ ਵਿੱਚ ਗਲਤੀਆਂ ਜਾਂ ਅਸਮੱਤਿਆਵਾਂ ਹੋ ਸਕਦੀਆਂ ਹਨ। ਮੂਲ ਦਸਤਾਵੇਜ਼ ਆਪਣੀ ਮੂਲ ਭਾਸ਼ਾ ਵਿੱਚ ਅਧਿਕਾਰਕ ਸਰੋਤ ਮੰਨਿਆ ਜਾਣਾ ਚਾਹੀਦਾ ਹੈ। ਜਰੂਰੀ ਜਾਣਕਾਰੀ ਲਈ, ਪੇਸ਼ੇਵਰ ਮਨੁੱਖੀ ਅਨੁਵਾਦ ਦੀ ਸਿਫ਼ਾਰਸ਼ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਅਸੀਂ ਇਸ ਅਨੁਵਾਦ ਦੇ ਉਪਯੋਗ ਤੋਂ ਪੈਦਾ ਹੋਣ ਵਾਲੀਆਂ ਕਿਸੇ ਵੀ ਗਲਤਫਹਿਮੀਆਂ ਜਾਂ ਗਲਤ ਵਿਆਖਿਆਵਾਂ ਲਈ ਜਵਾਬਦੇਹ ਨਹੀਂ ਹਾਂ। + \ No newline at end of file diff --git a/translations/pa/lessons/0-course-setup/how-to-run.md b/translations/pa/lessons/0-course-setup/how-to-run.md index 84f95f464a..7bd12d700d 100644 --- a/translations/pa/lessons/0-course-setup/how-to-run.md +++ b/translations/pa/lessons/0-course-setup/how-to-run.md @@ -1,12 +1,12 @@ -# ਕੋਡ ਨੂੰ ਕਿਵੇਂ ਚਲਾਉਣਾ ਹੈ +# ਕੋਡ ਕਿਵੇਂ ਚਲਾਉਣਾ ਹੈ -ਇਸ ਸਿੱਕਲ ਵਿੱਚ ਬਹੁਤ ਸਾਰੇ ਚਲਾਏ ਜਾ ਸਕਣ ਵਾਲੇ ਉਦਾਹਰਨਾਂ ਅਤੇ ਲੈਬ ਹਨ ਜੋ ਤੁਸੀਂ ਚਲਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ। ਇਹ ਕਰਨ ਲਈ, ਤੁਹਾਨੂੰ ਇਸ ਸਿੱਕਲ ਦੇ ਹਿੱਸੇ ਵਜੋਂ ਦਿੱਤੇ ਗਏ Jupyter Notebooks ਵਿੱਚ Python ਕੋਡ ਚਲਾਉਣ ਦੀ ਸਮਰੱਥਾ ਦੀ ਲੋੜ ਹੈ। ਕੋਡ ਚਲਾਉਣ ਲਈ ਤੁਹਾਡੇ ਕੋਲ ਕਈ ਵਿਕਲਪ ਹਨ: +ਇਸ ਕੈਰੀਕੁਲਮ ਵਿੱਚ ਬਹੁਤ ਸਾਰੇ ਐਗਜ਼ੈ큐ਟੇਬਲ ਉਦਾਹਰਣਾਂ ਅਤੇ ਲੈਬ ਹਨ ਜਿਨ੍ਹਾਂ ਨੂੰ ਤੁਸੀਂ ਚਲਾਉਣਾ ਚਾਹੋਗੇ। ਇਹ ਕਮ ਕਰਨ ਲਈ, ਤੁਹਾਨੂੰ ਇਸ ਕੈਰੀਕੁਲਮ ਦੇ ਹਿੱਸੇ ਵਜੋਂ ਦਿੱਤੇ ਗਏ Jupyter Notebooks ਵਿੱਚ 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 @@ -17,55 +17,55 @@ conda activate ai4beg ### Visual Studio Code ਨੂੰ Python ਐਕਸਟੈਂਸ਼ਨ ਨਾਲ ਵਰਤਣਾ -ਇਹ ਸਿੱਕਲ ਸਭ ਤੋਂ ਵਧੀਆ [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) ਵਿੱਚ [Python Extension](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste) ਨਾਲ ਖੋਲ੍ਹ ਕੇ ਵਰਤੀ ਜਾਂਦੀ ਹੈ। +ਇਸ ਕੈਰੀਕੁਲਮ ਨੂੰ ਸਭ ਤੋਂ ਵਧੀਆ ਤਰੀਕੇ ਨਾਲ [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) ਵਿੱਚ [Python ਐਕਸਟੈਂਸ਼ਨ](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 'ਤੇ ਕੁਝ ਕੋਡ ਚੈੱਕ ਕਰਨ ਲਈ ਕਲਾਉਡ ਵਿੱਚ ਸੁਵਿਧਾ ਦਿੰਦਾ ਹੈ। ਅੱਗੇ ਵਾਲੇ ਪੰਨੇ 'ਤੇ ਇੱਕ ਬਟਨ ਹੈ ਜੋ ਰਿਪੋਜ਼ਿਟਰੀ ਨੂੰ ਬਾਈਂਡਰ ਵਿੱਚ ਖੋਲ੍ਹਦਾ ਹੈ - ਇਹ ਤੁਹਾਨੂੰ ਜਲਦੀ ਨਾਲ ਬਾਈਂਡਰ ਸਾਈਟ ਤੇ ਲਿਜਾਵੇਗਾ, ਜੋ ਅੰਦਰਲੀ ਕੰਟੇਨਰ ਬਣਾ ਕੇ ਤੁਹਾਡੇ ਲਈ ਬਿਨਾਂ ਰੁਕਾਵਟ 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 ਦੁਆਰਾ ਦਿੱਤੇ ਗਏ ਕੰਪਿਊਟਿੰਗ ਸਰੋਤ ਕਾਫੀ ਆਧਾਰਭੂਤ ਹਨ, ਇਸ ਲਈ ਟ੍ਰੇਨਿੰਗ ਧੀਮੀ ਹੋਵੇਗੀ, ਖਾਸ ਤੌਰ 'ਤੇ ਅੱਗੇ ਦੇ, ਜਿਆਦਾ ਜਟਿਲ ਪਾਠਾਂ ਵਿੱਚ। -## ਕਲਾਉਡ ਵਿੱਚ GPU ਨਾਲ ਚਲਾਉਣਾ +## GPU ਦੇ ਨਾਲ ਕਲਾਊਡ ਵਿੱਚ ਚਲਾਉਣਾ -ਇਸ ਸਿੱਕਲ ਦੇ ਬਾਅਦਲੇ ਕੁਝ ਪਾਠਾਂ ਨੂੰ GPU ਸਹਾਇਤਾ ਨਾਲ ਵੱਡਾ ਫ਼ਾਇਦਾ ਹੋਵੇਗਾ। ਮਾਡਲ ਟ੍ਰੇਨਿੰਗ, ਉਦਾਹਰਨ ਵਜੋਂ, ਨਹੀਂ ਤਾਂ ਬਹੁਤ ਧੀਮੀ ਹੋ ਸਕਦੀ ਹੈ। ਕੁਝ ਵਿਕਲਪ ਹਨ, ਖ਼ਾਸ ਕਰਕੇ ਜੇ ਤੁਹਾਡੇ ਕੋਲ ਕਲਾਉਡ ਪਹੁੰਚ ਹੈ ਜਾਂ ਤਾਂ [Azure for Students](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-ਸਿਰੀਜ਼ 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-ਸਿਰੀਜ਼ VM ਵਿੱਚ GPU ਸਹਿਯੋਗ ਹੁੰਦਾ ਹੈ। -> **ਨੋਟ**: ਕੁਝ ਸਬਸਕ੍ਰਿਪਸ਼ਨ, ਜਿਵੇਂ ਕਿ Azure for Students, ਬਾਹਰਲੇ ਬਾਕਸ ਤੋੜ ਤੇ GPU ਸਹਾਇਤਾ ਨਹੀਂ ਦਿੰਦੇ। ਤੁਹਾਨੂੰ ਤਕਨੀਕੀ ਸਹਾਇਤਾ ਅਨੁਰੋਧ ਨਾਲ ਵਾਧੂ GPU ਕੋਰਾਂ ਦੀ ਮੰਗ ਕਰਨੀ ਪੈ ਸਕਦੀ ਹੈ। +> **ਨੋਟ**: ਕੁਝ ਸਬਸਕ੍ਰਿਪਸ਼ਨ, ਜਿਵੇਂ ਕਿ Azure for Students, ਬਾਕਸ ਤੋਂ ਬਾਹਰ GPU ਸਹਿਯੋਗ ਨਹੀਂ ਦਿੰਦੇ। ਤੁਹਾਨੂੰ ਹੋਰ GPU ਕੋਰਾਂ ਲਈ ਤਕਨੀਕੀ ਸਹਾਇਤਾ ਅਪੇਖਾ ਕਰਨੀ ਪੈ ਸਕਦੀ ਹੈ। -* [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 ਨੋਟਬੁੱਕ ਵਿੱਚ ਕਲੋਨ ਕਰਕੇ ਇਸ ਦੀ ਵਰਤੋਂ ਸ਼ੁਰੂ ਕਰਨੀ ਹੈ। +* [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 ਵਿੱਚ ਕਲੋਨ ਕਰਕੇ ਇਸਦਾ ਉਪਯੋਗ ਸ਼ੁਰੂ ਕਰਨਾ ਹੈ। -ਤੁਸੀਂ ਗੂਗਲ ਕੋਲੈਬ ਵੀ ਵਰਤ ਸਕਦੇ ਹੋ, ਜਿਸ ਵਿੱਚ ਕੁਝ ਮੁਫਤ GPU ਸਹਾਇਤਾ ਹੁੰਦੀ ਹੈ, ਅਤੇ ਉਥੇ Jupyter Notebooks ਇਕ ਇਕ ਕਰਕੇ ਅਪਲੋਡ ਕਰ ਕੇ ਚਲਾ ਸਕਦੇ ਹੋ। +ਤੁਸੀਂ Google Colab ਦਾ ਵੀ ਇਸਤੇਮਾਲ ਕਰ ਸਕਦੇ ਹੋ, ਜਿਸ ਵਿੱਚ ਕੁਝ ਮੁਫ਼ਤ GPU ਸਹਿਯੋਗ ਹੈ, ਅਤੇ Jupyter Notebooks ਉੱਥੇ ਅਪਲੋਡ ਕਰਕੇ ਇੱਕ-ਇੱਕ ਕਰਕੇ ਚਲਾ ਸਕਦੇ ਹੋ। --- -**ਤਰਜਮਾ ਸੂਚਨਾ**: -ਇਸ ਦਸਤਾਵੇਜ਼ ਨੂੰ AI ਅਨੁਵਾਦ ਸੇਵਾ [Co-op Translator](https://github.com/Azure/co-op-translator) ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਅਨੁਵਾਦ ਕੀਤਾ ਗਿਆ ਹੈ। ਹਾਲਾਂਕਿ ਅਸੀਂ ਸਹੀਤਾ ਲਈ ਕੋਸ਼ਿਸ਼ ਕਰਦੇ ਹਾਂ, ਕਿਰਪਾ ਕਰਕੇ ਜਾਣਦੇ ਰਹੋ ਕਿ ਆਟੋਮੇਟਿਡ ਅਨੁਵਾਦਾਂ ਵਿੱਚ ਗਲਤੀਆਂ ਜਾਂ ਅਸਮਰਥਤਾਵਾਂ ਹੋ ਸਕਦੀਆਂ ਹਨ। ਇਸ ਦਾ ਮੂਲ ਦਸਤਾਵੇਜ਼ ਉਸ ਦੀ ਮੂਲ ਭਾਸ਼ਾ ਵਿੱਚ ਹੀ ਪ੍ਰਮਾਣਿਕ ਸਰੋਤ ਮੰਨਿਆ ਜਾਣਾ ਚਾਹੀਦਾ ਹੈ। ਅਹਿਮ ਜਾਣਕਾਰੀ ਲਈ, ਪ੍ਰੋਫੈਸ਼ਨਲ ਮਨੁੱਖੀ ਅਨੁਵਾਦ ਦੀ ਸਿਫਾਰਿਸ਼ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਇਸ ਅਨੁਵਾਦ ਦੀ ਵਰਤੋਂ ਤੋਂ ਹੋਣ ਵਾਲੀਆਂ ਕਿਸੇ ਵੀ ਗਲਤਫ਼ਹਿਮੀਆਂ ਜਾਂ ਗਲਤ ਵਿਆਖਿਆਵਾਂ ਲਈ ਅਸੀਂ ਜ਼ਿੰਮੇਵਾਰ ਨਹੀਂ ਹਾਂ। +**ਅਸਵੀਕਾਰੋਪਣ**: +ਇਸ ਦਸਤਾਵੇਜ਼ ਦਾ ਅਨੁਵਾਦ ਏਆਈ ਅਨੁਵਾਦ ਸੇਵਾ [Co-op Translator](https://github.com/Azure/co-op-translator) ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਕੀਤਾ ਗਿਆ ਹੈ। ਜਦੋਂ ਕਿ ਅਸੀਂ ਸਹੀਤਾਵਾਂ ਲਈ ਯਤਨਸ਼ੀਲ ਹਾਂ, ਕਿਰਪਾ ਕਰਕੇ ਧਿਆਨ ਰੱਖੋ ਕਿ ਸਵੈਚਾਲਿਤ ਅਨੁਵਾਦਾਂ ਵਿੱਚ ਗਲਤੀਆਂ ਜਾਂ ਅਸਮੱਤਿਆਵਾਂ ਹੋ ਸਕਦੀਆਂ ਹਨ। ਮੂਲ ਦਸਤਾਵੇਜ਼ ਆਪਣੀ ਮੂਲ ਭਾਸ਼ਾ ਵਿੱਚ ਅਧਿਕਾਰਕ ਸਰੋਤ ਮੰਨਿਆ ਜਾਣਾ ਚਾਹੀਦਾ ਹੈ। ਜਰੂਰੀ ਜਾਣਕਾਰੀ ਲਈ, ਪੇਸ਼ੇਵਰ ਮਨੁੱਖੀ ਅਨੁਵਾਦ ਦੀ ਸਿਫ਼ਾਰਸ਼ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਅਸੀਂ ਇਸ ਅਨੁਵਾਦ ਦੇ ਉਪਯੋਗ ਤੋਂ ਪੈਦਾ ਹੋਣ ਵਾਲੀਆਂ ਕਿਸੇ ਵੀ ਗਲਤਫਹਿਮੀਆਂ ਜਾਂ ਗਲਤ ਵਿਆਖਿਆਵਾਂ ਲਈ ਜਵਾਬਦੇਹ ਨਹੀਂ ਹਾਂ। \ No newline at end of file diff --git a/translations/pa/lessons/1-Intro/README.md b/translations/pa/lessons/1-Intro/README.md index ed5c852dbd..2d3ac93d64 100644 --- a/translations/pa/lessons/1-Intro/README.md +++ b/translations/pa/lessons/1-Intro/README.md @@ -1,125 +1,162 @@ -# AI ਦਾ ਪਰਿਚਯ +# ਏਆਈ ਦਾ ਪਰਿਚਯ -![AI ਸਮੱਗਰੀ ਦੇ ਪਰਿਚਯ ਦਾ ਡੂਡਲ ਵਿੱਚ ਸਾਰ](../../../../translated_images/pa/ai-intro.bf28d1ac4235881c.webp) +![ਠਲਕੇ ਵਿੱਚ ਏਆਈ ਸਮੱਗਰੀ ਦਾ ਪਰਿਚਯ](../../../../translated_images/pa/ai-intro.bf28d1ac4235881c.webp) -> ਸਕੈਚਨੋਟ [ਟੋਮੋਮੀ ਇਮੁਰਾ](https://twitter.com/girlie_mac) ਦੁਆਰਾ +> ਸਕੈਚਨੋਟ [ਟੋਮੋਮੀ ਇਮੁਰਾ](https://twitter.com/girlie_mac) ਵੱਲੋਂ -## [ਪ੍ਰੀ-ਲੈਕਚਰ ਕਵਿਜ਼](https://ff-quizzes.netlify.app/en/ai/quiz/1) +## [ਪ੍ਰੀ-ਲੇਕਚਰ ਕਵਿਜ਼](https://ff-quizzes.netlify.app/en/ai/quiz/1) -**ਕ੍ਰਿਤ੍ਰਿਮ ਬੁੱਧੀ** ਇੱਕ ਰੋਮਾਂਚਕ ਵਿਗਿਆਨਕ ਵਿਸ਼ਾ ਹੈ ਜੋ ਇਸ ਗੱਲ ਦਾ ਅਧਿਐਨ ਕਰਦਾ ਹੈ ਕਿ ਅਸੀਂ ਕੰਪਿਊਟਰਾਂ ਨੂੰ ਬੁੱਧੀਮਾਨ ਵਿਹਾਰ ਕਰਨ ਲਈ ਕਿਵੇਂ ਬਣਾਉਣਗੇ, ਜਿਵੇਂ ਕਿ ਉਹ ਕੰਮ ਕਰਨਾ ਜੋ ਮਨੁੱਖੀ ਜੀਵਨ ਵਿੱਚ ਚੰਗੇ ਹਨ। +**ਕਿਰਤਰਿਮ ਬੁੱਧੀਮੱਤਾ** ਇੱਕ ਰੋਚਕ ਵਿਗਿਆਨਕ ਵਿਸ਼ਾ ਹੈ ਜੋ ਅਧਿਐਨ ਕਰਦਾ ਹੈ ਕਿ ਅਸੀਂ ਕੰਪਿਊਟਰਾਂ ਨੂੰ ਬੁੱਧੀਮਾਨ ਵਰਤੋਂਗੇ ਕਿਵੇਂ ਸਿਖਾ ਸਕਦੇ ਹਾਂ, ਜਿਵੇਂ ਮਨੁੱਖ ਕੁਝ ਕੰਮਾਂ ਵਿੱਚ ਮਹਿਰ ਹਨ। -ਮੂਲ ਰੂਪ ਵਿੱਚ, ਕੰਪਿਊਟਰਾਂ ਨੂੰ [ਚਾਰਲਸ ਬੈਬੇਜ](https://en.wikipedia.org/wiki/Charles_Babbage) ਦੁਆਰਾ ਸੰਖਿਆਵਾਂ 'ਤੇ ਕੰਮ ਕਰਨ ਲਈ ਬਣਾਇਆ ਗਿਆ ਸੀ, ਇੱਕ ਸਪਸ਼ਟ ਤਰੀਕੇ - ਇੱਕ ਐਲਗੋਰਿਦਮ ਦੀ ਪਾਲਣਾ ਕਰਦੇ ਹੋਏ। ਆਧੁਨਿਕ ਕੰਪਿਊਟਰ, ਹਾਲਾਂਕਿ 19ਵੀਂ ਸਦੀ ਵਿੱਚ ਪ੍ਰਸਤਾਵਿਤ ਮੂਲ ਮਾਡਲ ਨਾਲੋਂ ਕਾਫ਼ੀ ਅਗਰਗਾਮੀ ਹਨ, ਫਿਰ ਵੀ ਨਿਯੰਤਰਿਤ ਗਣਨਾਵਾਂ ਦੇ ਇੱਕੋ ਹੀ ਵਿਚਾਰ ਦੀ ਪਾਲਣਾ ਕਰਦੇ ਹਨ। ਇਸ ਲਈ, ਇਹ ਸੰਭਵ ਹੈ ਕਿ ਕੰਪਿਊਟਰ ਨੂੰ ਕੁਝ ਕਰਨ ਲਈ ਪ੍ਰੋਗਰਾਮ ਕੀਤਾ ਜਾ ਸਕੇ ਜੇਕਰ ਅਸੀਂ ਉਹ ਸਪਸ਼ਟ ਕਦਮਾਂ ਦੀ ਲੜੀ ਜਾਣਦੇ ਹਾਂ ਜੋ ਲਕਸ਼ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ ਕਰਨੇ ਹਨ। +ਮੂਲ ਤੌਰ ਤੇ, ਕੰਪਿਊਟਰਾਂ ਦਾ ਅਵਿਸਕਾਰ [ਚਾਰਲਜ਼ ਬੈਬੇਜ](https://en.wikipedia.org/wiki/Charles_Babbage) ਵੱਲੋਂ ਨੰਬਰਾਂ 'ਤੇ ਕੰਮ ਕਰਨ ਲਈ ਕੀਤਾ ਗਿਆ ਸੀ ਜੋ ਇੱਕ ਸੂਚਿਤ ਕਾਰਵਾਈ - ਐਲਗੋਰਿਦਮ - ਦੀ ਪਾਲਣਾ ਕਰਦੇ ਹਨ। ਅਧੁਨਿਕ ਕੰਪਿਊਟਰ, ਹਾਲਾਂਕਿ ਮੂਲ ਮਾਡਲ ਨਾਲੋਂ ਕਾਫੀ ਉੱਨਤ ਹਨ ਜੋ 19ਵੀਂ ਸਦੀ ਵਿੱਚ ਦਿੱਤਾ ਗਿਆ ਸੀ, ਫਿਰ ਵੀ ਸਮਰੱਥ ਕੰਟਰੋਲ ਕੀਤੀ ਗਈ ਗਣਨਾਵਾਂ ਦੀ ਪਾਲਣਾ ਕਰਦੇ ਹਨ। ਇਸ ਲਈ ਜੇ ਅਸੀਂ ਪਰਿਵਾਰਤਨ ਦੀ ਸਹੀ ਕ੍ਰਮਬੱਧ ਕਦਮਾਂ ਬਾਰੇ ਜਾਣਦੇ ਹਾਂ, ਤਾਂ ਕੰਪਿਊਟਰ ਨੂੰ ਕੁਝ ਕਰਨ ਲਈ ਪ੍ਰੋਗ੍ਰਾਮ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ। ![ਇੱਕ ਵਿਅਕਤੀ ਦੀ ਤਸਵੀਰ](../../../../translated_images/pa/dsh_age.d212a30d4e54fb5f.webp) -> ਤਸਵੀਰ [ਵਿਕੀ ਸੋਸ਼ਨਿਕੋਵਾ](http://twitter.com/vickievalerie) ਦੁਆਰਾ +> ਤਸਵੀਰ [ਵਿੱਕੀ ਸੋਸ਼ਨਿਕੋਵਾ](http://twitter.com/vickievalerie) ਵੱਲੋਂ -> ✅ ਇੱਕ ਵਿਅਕਤੀ ਦੀ ਉਸ ਦੀ ਤਸਵੀਰ ਤੋਂ ਉਮਰ ਨਿਰਧਾਰਤ ਕਰਨਾ ਇੱਕ ਕੰਮ ਹੈ ਜਿਸ ਨੂੰ ਸਪਸ਼ਟ ਤੌਰ 'ਤੇ ਪ੍ਰੋਗਰਾਮ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ, ਕਿਉਂਕਿ ਅਸੀਂ ਨਹੀਂ ਜਾਣਦੇ ਕਿ ਅਸੀਂ ਆਪਣੇ ਮਨ ਵਿੱਚ ਇੱਕ ਗਿਣਤੀ ਕਿਵੇਂ ਬਣਾਉਂਦੇ ਹਾਂ ਜਦੋਂ ਅਸੀਂ ਇਹ ਕਰਦੇ ਹਾਂ। +> ✅ ਕਿਸੇ ਵਿਅਕਤੀ ਦੀ ਉਮਰ ਉਸ ਦੀ ਤਸਵੀਰ ਤੋਂ ਪਰਿਭਾਸ਼ਿਤ ਕਰਨ ਦਾ ਕੰਮ ਸਿੱਧਾ ਪ੍ਰੋਗ੍ਰਾਮ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ, ਕਿਉਂਕਿ ਅਸੀਂ ਨਹੀਂ ਜਾਣਦੇ ਕਿ ਅਸੀਂ ਇਹ ਕੰਮ ਮਨ ਵਿੱਚ ਸੰਖਿਆ ਕਿਵੇਂ ਨਿਰਧਾਰਤ ਕਰਦੇ ਹਾਂ। --- -ਕੁਝ ਕੰਮ ਹਨ, ਹਾਲਾਂਕਿ, ਜਿਨ੍ਹਾਂ ਨੂੰ ਹੱਲ ਕਰਨ ਦਾ ਸਪਸ਼ਟ ਤਰੀਕਾ ਸਾਨੂੰ ਨਹੀਂ ਪਤਾ। ਇੱਕ ਵਿਅਕਤੀ ਦੀ ਉਸ ਦੀ ਤਸਵੀਰ ਤੋਂ ਉਮਰ ਨਿਰਧਾਰਤ ਕਰਨ ਦੇ ਬਾਰੇ ਸੋਚੋ। ਅਸੀਂ ਇਸ ਨੂੰ ਕਿਵੇਂ ਕਰਨਾ ਸਿੱਖਦੇ ਹਾਂ, ਕਿਉਂਕਿ ਅਸੀਂ ਵੱਖ-ਵੱਖ ਉਮਰ ਦੇ ਲੋਕਾਂ ਦੇ ਬਹੁਤ ਸਾਰੇ ਉਦਾਹਰਨ ਵੇਖੇ ਹਨ, ਪਰ ਅਸੀਂ ਸਪਸ਼ਟ ਤੌਰ 'ਤੇ ਸਮਝਾ ਨਹੀਂ ਸਕਦੇ ਕਿ ਅਸੀਂ ਇਹ ਕਿਵੇਂ ਕਰਦੇ ਹਾਂ, ਨਾ ਹੀ ਅਸੀਂ ਕੰਪਿਊਟਰ ਨੂੰ ਇਹ ਕਰਨ ਲਈ ਪ੍ਰੋਗਰਾਮ ਕਰ ਸਕਦੇ ਹਾਂ। ਇਹ ਸਹੀ ਤੌਰ 'ਤੇ ਉਹ ਕੰਮ ਹਨ ਜੋ **ਕ੍ਰਿਤ੍ਰਿਮ ਬੁੱਧੀ** (ਸੰਖੇਪ ਵਿੱਚ AI) ਲਈ ਦਿਲਚਸਪੀ ਦੇ ਹਨ। +ਕੁਝ ਕੰਮ ਹਨ ਜਿਨ੍ਹਾਂ ਨੂੰ ਅਸੀਂ ਸਿਧਾ ਹੱਲ ਕਰਨ ਦਾ ਤਰੀਕਾ ਨਹੀਂ ਜਾਣਦੇ। ਉਦਾਹਰਨ ਵੱਜੋਂ, ਕਿਸੇ ਵਿਅਕਤੀ ਦੀ ਤਸਵੀਰ ਤੋਂ ਉਸ ਦੀ ਉਮਰ ਨਿਰਧਾਰਤ ਕਰਨਾ। ਅਸੀਂ ਇਸ ਨੂੰ ਕੁਝਖ ਕੁਝ ਸਿੱਖ ਜਾਂਦੇ ਹਾਂ, ਕਿਉਂਕਿ ਅਸੀਂ ਵੱਖ-ਵੱਖ ਉਮਰ ਦੇ ਬਹੁਤ ਸਾਰੇ ਉਦਾਹਰਨ ਵੇਖੇ ਹਨ, ਪਰ ਅਸੀਂ ਇਸ ਤਰੀਕੇ ਨੂੰ ਵਿਸਥਾਰ ਨਾਲ ਸਮਝਾ ਨਹੀਂ ਸਕਦੇ, ਨਾਹ ਹੀ ਇਸ ਲਈ ਕੰਪਿਊਟਰ ਨੂੰ ਪ੍ਰੋਗ੍ਰਾਮ ਕਰ ਸਕਦੇ ਹਾਂ। ਇਹ ਉਹੋ ਜਿਹਾ ਕੰਮ ਹੈ ਜਿਸ ਵਿੱਚ **ਕਿਰਤਰਿਮ ਬੁੱਧੀਮੱਤਾ** (ਸੰਖੇਪ ਵਿੱਚ ਏਆਈ) ਦਾ ਰੁਝਾਨ ਹੁੰਦਾ ਹੈ। -✅ ਕੁਝ ਕੰਮਾਂ ਬਾਰੇ ਸੋਚੋ ਜੋ ਤੁਸੀਂ ਕੰਪਿਊਟਰ ਨੂੰ ਸੌਂਪ ਸਕਦੇ ਹੋ ਜੋ AI ਤੋਂ ਲਾਭ ਪ੍ਰਾਪਤ ਕਰ ਸਕਦੇ ਹਨ। ਵਿੱਤ, ਦਵਾਈ ਅਤੇ ਕਲਾ ਦੇ ਖੇਤਰਾਂ ਬਾਰੇ ਵਿਚਾਰ ਕਰੋ - ਇਹ ਖੇਤਰ ਅੱਜ AI ਤੋਂ ਕਿਵੇਂ ਲਾਭ ਪ੍ਰਾਪਤ ਕਰ ਰਹੇ ਹਨ? +✅ ਕੁਝ ਅਜਿਹੇ ਕੰਮ ਸੋਚੋ ਜੋ ਤੁਸੀਂ ਕੰਪਿਊਟਰ ਨੂੰ ਦੇ ਸਕਦੇ ਹੋ ਜਿਹੜੇ ਏਆਈ ਤੋਂ ਲਾਭ ਪ੍ਰਾਪਤ ਕਰਨਗੇ। ਵਿੱਤ, ਚਿਕਿਤ्सा, ਅਤੇ ਕਲਾ ਦੇ ਖੇਤਰ ਵਿੱਚ ਏਆਈ ਕਿਵੇਂ ਲਾਭਕਾਰੀ ਹੈ? -## ਕਮਜ਼ੋਰ AI ਅਤੇ ਮਜ਼ਬੂਤ AI +## ਕਮਜ਼ੋਰ ਏਆਈ vs. ਮਜ਼ਬੂਤ ਏਆਈ -ਕਮਜ਼ੋਰ AI | ਮਜ਼ਬੂਤ AI +ਕਮਜ਼ੋਰ ਏਆਈ | ਮਜ਼ਬੂਤ ਏਆਈ ---------------------------------------|------------------------------------- -ਕਮਜ਼ੋਰ AI ਉਹ AI ਸਿਸਟਮਾਂ ਨੂੰ ਦਰਸਾਉਂਦਾ ਹੈ ਜੋ ਕਿਸੇ ਵਿਸ਼ੇਸ਼ ਕੰਮ ਜਾਂ ਕੰਮਾਂ ਦੇ ਸ محدود ਸੈੱਟ ਲਈ ਡਿਜ਼ਾਈਨ ਅਤੇ ਪ੍ਰਸ਼ਿਕਸ਼ਿਤ ਕੀਤੇ ਗਏ ਹਨ।|ਮਜ਼ਬੂਤ AI, ਜਾਂ ਕ੍ਰਿਤ੍ਰਿਮ ਜਨਰਲ ਇੰਟੈਲੀਜੈਂਸ (AGI), ਉਹ AI ਸਿਸਟਮਾਂ ਨੂੰ ਦਰਸਾਉਂਦਾ ਹੈ ਜੋ ਮਨੁੱਖੀ-ਸਤਰ ਦੀ ਬੁੱਧੀ ਅਤੇ ਸਮਝ ਰੱਖਦੇ ਹਨ। -ਇਹ AI ਸਿਸਟਮ ਆਮ ਤੌਰ 'ਤੇ ਬੁੱਧੀਮਾਨ ਨਹੀਂ ਹੁੰਦੇ; ਇਹ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਕੰਮ ਵਿੱਚ ਸ਼ਾਨਦਾਰ ਹਨ ਪਰ ਸੱਚੀ ਸਮਝ ਜਾਂ ਚੇਤਨਾ ਦੀ ਘਾਟ ਹੁੰਦੀ ਹੈ।|ਇਹ AI ਸਿਸਟਮ ਉਹਨਾਂ ਬੁੱਧੀਮਾਨ ਕੰਮਾਂ ਨੂੰ ਕਰਨ ਦੀ ਯੋਗਤਾ ਰੱਖਦੇ ਹਨ ਜੋ ਕੋਈ ਮਨੁੱਖ ਕਰ ਸਕਦਾ ਹੈ, ਵੱਖ-ਵੱਖ ਖੇਤਰਾਂ ਵਿੱਚ ਅਨੁਕੂਲ ਹੋ ਸਕਦੇ ਹਨ, ਅਤੇ ਚੇਤਨਾ ਜਾਂ ਸਵੈ-ਜਾਗਰੂਕਤਾ ਦਾ ਰੂਪ ਰੱਖਦੇ ਹਨ। -ਕਮਜ਼ੋਰ AI ਦੇ ਉਦਾਹਰਨਾਂ ਵਿੱਚ Siri ਜਾਂ Alexa ਵਰਗੇ ਵਰਚੁਅਲ ਸਹਾਇਕ, ਸਟ੍ਰੀਮਿੰਗ ਸੇਵਾਵਾਂ ਦੁਆਰਾ ਵਰਤੇ ਜਾਣ ਵਾਲੇ ਸਿਫਾਰਸ਼ੀ ਐਲਗੋਰਿਦਮ, ਅਤੇ ਵਿਸ਼ੇਸ਼ ਗਾਹਕ ਸੇਵਾ ਕੰਮਾਂ ਲਈ ਡਿਜ਼ਾਈਨ ਕੀਤੇ ਗਏ ਚੈਟਬੋਟ ਸ਼ਾਮਲ ਹਨ।|ਮਜ਼ਬੂਤ AI ਪ੍ਰਾਪਤ ਕਰਨਾ AI ਖੋਜ ਦਾ ਲੰਬੇ ਸਮੇਂ ਦਾ ਲਕਸ਼ ਹੈ ਅਤੇ ਇਸ ਲਈ AI ਸਿਸਟਮਾਂ ਦੇ ਵਿਕਾਸ ਦੀ ਲੋੜ ਹੋਵੇਗੀ ਜੋ ਵੱਖ-ਵੱਖ ਕੰਮਾਂ ਅਤੇ ਸੰਦਰਭਾਂ ਵਿੱਚ ਤਰਕ, ਸਿੱਖਣ, ਸਮਝਣ ਅਤੇ ਅਨੁਕੂਲ ਕਰਨ ਦੇ ਯੋਗ ਹੋਣ। -ਕਮਜ਼ੋਰ AI ਬਹੁਤ ਹੀ ਵਿਸ਼ੇਸ਼ ਹੈ ਅਤੇ ਇਸਦੇ ਸੰਕੁਚਿਤ ਖੇਤਰ ਤੋਂ ਬਾਹਰ ਮਨੁੱਖੀ-ਜਿਵੇਂ ਸੰਕਲਪਕ ਯੋਗਤਾਵਾਂ ਜਾਂ ਆਮ ਸਮੱਸਿਆ-ਸੁਝਾਅ ਯੋਗਤਾਵਾਂ ਨਹੀਂ ਰੱਖਦਾ।|ਮਜ਼ਬੂਤ AI ਵਰਤਮਾਨ ਵਿੱਚ ਇੱਕ ਸਿਧਾਂਤਕ ਧਾਰਨਾ ਹੈ, ਅਤੇ ਕੋਈ ਵੀ AI ਸਿਸਟਮ ਇਸ ਜਨਰਲ ਇੰਟੈਲੀਜੈਂਸ ਦੇ ਪੱਧਰ ਤੱਕ ਨਹੀਂ ਪਹੁੰਚਿਆ ਹੈ। +ਕਮਜ਼ੋਰ ਏਆਈ ਉਹ ਪ੍ਰਣਾਲੀ ਹੈ ਜੋ ਕਿਸੇ ਖਾਸ ਕੰਮ ਜਾਂ ਤੰਗ ਕੰਮਾਂ ਲਈ ਬਣਾਈ ਅਤੇ ਸਿਖਾਈ ਗਈ ਹੈ।|ਮਜ਼ਬੂਤ ਏਆਈ ਜਾਂ ਕਿਰਤਰਿਮ ਸਾਰਵਜਨਿਕ ਬੁੱਧੀਮੱਤਾ (AGI), ਉਹ ਪ੍ਰਣਾਲੀ ਹੈ ਜਿਸਦਾ ਬੁੱਧੀਮਾਨਾ ਦਰਜਾ ਅਤੇ ਸਮਝ ਮਨੁੱਖੀ ਸਮਾਨ ਹੈ। +ਇਹ ਪ੍ਰਣਾਲੀਆਂ ਆਮ ਤੌਰ ਤੇ ਬੁੱਧੀਮਾਨ ਨਹੀਂ ਹੁੰਦੀਆਂ; ਇਹ ਇੱਕ ਨਿਰਧਾਰਿਤ ਕੰਮ ਵਿੱਚ ਮਾਹਿਰ ਹੁੰਦੀਆਂ ਹਨ ਪਰ ਅਸਲ ਸਮਝ ਜਾਂ ਚੇਤਨਾ ਨਹੀਂ ਹੁੰਦੀ।|ਇਹ ਪ੍ਰਣਾਲੀ ਕਿਸੇ ਵੀ ਬੁੱਧੀਮਾਨ ਕੰਮ ਨੂੰ ਕਰ ਸਕਦੀਆਂ ਹਨ ਜੋ ਮਨੁੱਖ ਦੇ ਵੱਲੋਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ, ਵੱਖ-ਵੱਖ ਖੇਤਰਾਂ ਵਿੱਚ ਅਨੁਕੂਲਿਤ ਹੋ ਸਕਦੀਆਂ ਹਨ ਅਤੇ ਚੇਤਨਾ ਜਾਂ ਸਵੈ-ਜਾਗਰੂਕਤਾ ਰੱਖਦੀਆਂ ਹਨ। +ਕਮਜ਼ੋਰ ਏਆਈ ਦੇ ਉਦਾਹਰਨ ਹਨ ਵਰਚੁਅਲ ਸਹਾਇਕ ਜਿਵੇਂ ਸਿਰੀ ਜਾਂ ਅਲੇਕਸਾ, ਸਟ੍ਰੀਮਿੰਗ ਸਹੂਲਤਾਂ ਵਾਲੇ ਅਲਗੋਰਿਧਮ ਅਤੇ ਖਾਸ ਗਾਹਕ ਸੇਵਾ ਲਈ ਬਣੇ ਚੈਟਬੋਟ।|ਮਜ਼ਬੂਤ ਏਆਈ ਇੱਕ ਲੰਬੇ ਸਮੇਂ ਦੀ ਲਕੜੀ ਵਿੱਚ ਲਕੜੀ ਖੋਜ ਦਾ ਲਕੜੀ ਲਕੜੀ ਦਾ ਲਕੜੀ ਹੈ ਅਤੇ ਇਹ ਪ੍ਰਣਾਲੀ ਨੂੰ ਵਿਵਿਧ ਕੰਮਾਂ ਅਤੇ ਪ੍ਰਸੰਗਾਂ ਵਿੱਚ ਤਰਕਸ਼ੀਲ, ਸਿੱਖਣ, ਸਮਝਣ ਅਤੇ ਅਨੁਕੂਲਿਤ ਕਰਨ ਦੀ ਸਮਰੱਥਾ ਨਾਲ ਵਿਕਸਤ ਕਰਨਾ ਪੈਂਦਾ ਹੈ। +ਕਮਜ਼ੋਰ ਏਆਈ ਖਾਸ ਖੇਤਰ ਲਈ ਬਹੁਤ ਵਿਸ਼ੇਸ਼ਤ ਹੈ ਅਤੇ ਮਨੁੱਖੀ ਤਰ੍ਹਾਂ ਦਿਮਾਗੀ ਸਮਰੱਥਾਵਾਂ ਜਾਂ ਆਮ ਸਮੱਸਿਆ-ਸੁਲਝਾਉਣ ਦੀ ਖੂਬੀ ਨਹੀਂ ਰੱਖਦੀ।|ਮਜ਼ਬੂਤ ਏਆਈ ਹਾਲੇ ਤਕ ਸਿਧਾਂਤਕ ਧਾਰਣਾ ਹੈ ਅਤੇ ਕੋਈ ਵੀ ਏਆਈ ਪ੍ਰਣਾਲੀ ਇਨ੍ਹਾਂ ਪੱਧਰਾਂ ਤੱਕ ਨਹੀਂ ਪਹੁੰਚੀ। -ਹੋਰ ਜਾਣਕਾਰੀ ਲਈ **[Artificial General Intelligence](https://en.wikipedia.org/wiki/Artificial_general_intelligence)** (AGI) ਨੂੰ ਵੇਖੋ। +ਹੋਰ ਜਾਣਕਾਰੀ ਲਈ **[ਕਿਰਤਰਿਮ ਸਾਰਵਜਨਿਕ ਬੁੱਧੀਮੱਤਾ](https://en.wikipedia.org/wiki/Artificial_general_intelligence)** (AGI) ਨੂੰ ਵੇਖੋ। +## ਬੁੱਧੀਮੱਤਾ ਦੀ ਪਰਿਭਾਸ਼ਾ ਅਤੇ ਟਿਊਰਿੰਗ ਟੈਸਟ -## ਬੁੱਧੀ ਦੀ ਪਰਿਭਾਸ਼ਾ ਅਤੇ ਟਿਊਰਿੰਗ ਟੈਸਟ - -**[Intelligence](https://en.wikipedia.org/wiki/Intelligence)** ਸ਼ਬਦ ਨਾਲ ਨਜਿੱਠਣ ਵੇਲੇ ਇੱਕ ਸਮੱਸਿਆ ਇਹ ਹੈ ਕਿ ਇਸ ਸ਼ਬਦ ਦੀ ਕੋਈ ਸਪਸ਼ਟ ਪਰਿਭਾਸ਼ਾ ਨਹੀਂ ਹੈ। ਕੋਈ ਦਲੀਲ ਕਰ ਸਕਦਾ ਹੈ ਕਿ ਬੁੱਧੀ **ਅਮੂਰ ਚਿੰਤਨ** ਜਾਂ **ਸਵੈ-ਜਾਗਰੂਕਤਾ** ਨਾਲ ਜੁੜੀ ਹੋਈ ਹੈ, ਪਰ ਅਸੀਂ ਇਸਨੂੰ ਢੰਗ ਨਾਲ ਪਰਿਭਾਸ਼ਿਤ ਨਹੀਂ ਕਰ ਸਕਦੇ। +ਬੁੱਧੀਮੱਤਾ ਸ਼ਬਦ ਨਾਲ ਜੁੜੇ ਸਮੱਸਿਆਵਾਂ ਵਿੱਚੋਂ ਇੱਕ ਇਹ ਹੈ ਕਿ ਇਸਦਾ ਕੋਈ ਸਾਫ੍ਹ ਪਰਿਭਾਸ਼ਾ ਨਹੀਂ ਹੈ। ਕਈ ਕਹਿੰਦੇ ਹਨ ਕਿ ਬੁੱਧੀਮੱਤਾ ਕਿਛੁ **ਸਾਰਗਰਭਿਤ ਸੋਚ** ਜਾਂ **ਸਵੈ-ਜਾਗਰੂਕਤਾ** ਨਾਲ ਜੁੜੀ ਹੈ, ਪਰ ਅਸੀਂ ਇਸ ਨੂੰ ਠੀਕ ਤਰ੍ਹਾਂ ਪਰਿਭਾਸ਼ਿਤ ਨਹੀਂ ਕਰ ਸਕਦੇ। ![ਬਿੱਲੀ ਦੀ ਤਸਵੀਰ](../../../../translated_images/pa/photo-cat.8c8e8fb760ffe457.webp) -> [ਤਸਵੀਰ](https://unsplash.com/photos/75715CVEJhI) [ਐਂਬਰ ਕਿਪ](https://unsplash.com/@sadmax) ਦੁਆਰਾ Unsplash ਤੋਂ +> ਤਸਵੀਰ [ਐਂਬਰ ਕਿੱਪ](https://unsplash.com/@sadmax) ਵੱਲੋਂ [ਅਨਸਪਲੈਸ਼](https://unsplash.com/photos/75715CVEJhI) ਤੋਂ -*ਬੁੱਧੀ* ਸ਼ਬਦ ਦੀ ਅਸਪਸ਼ਟਤਾ ਨੂੰ ਵੇਖਣ ਲਈ, ਇੱਕ ਸਵਾਲ ਦਾ ਜਵਾਬ ਦੇਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ: "ਕੀ ਇੱਕ ਬਿੱਲੀ ਬੁੱਧੀਮਾਨ ਹੈ?" ਵੱਖ-ਵੱਖ ਲੋਕ ਇਸ ਸਵਾਲ ਨੂੰ ਵੱਖ-ਵੱਖ ਜਵਾਬ ਦੇਣ ਦੀ ਆਦਤ ਰੱਖਦੇ ਹਨ, ਕਿਉਂਕਿ ਇਸ ਦਾਅਵੇ ਨੂੰ ਸੱਚ ਜਾਂ ਗਲਤ ਸਾਬਤ ਕਰਨ ਲਈ ਕੋਈ ਵਿਸ਼ਵ-ਪ੍ਰਸਿੱਧ ਟੈਸਟ ਨਹੀਂ ਹੈ। ਅਤੇ ਜੇ ਤੁਸੀਂ ਸੋਚਦੇ ਹੋ ਕਿ ਹੈ - ਆਪਣੀ ਬਿੱਲੀ ਨੂੰ IQ ਟੈਸਟ ਦੇ ਰਾਹੀਂ ਚਲਾਉਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ... +ਬੁੱਧੀਮੱਤਾ ਹਨੇਰੇ ਨੂੰ ਦੇਖਣ ਲਈ ਸਵਾਲ ਦੇ ਜਵਾਬ ਦੇਖੋ: "ਕੀ ਬਿੱਲੀ ਬੁੱਧੀਮਾਨ ਹੈ?" ਵੱਖ-ਵੱਖ ਲੋਕ ਵੱਖ-ਵੱਖ ਜਵਾਬ ਦਿੰਦੇ ਹਨ ਕਿਉਂਕਿ ਕੋਈ ਸਰਵਸੰਮਤ ਟੈਸਟ ਇਸ ਗੱਲ ਨੂੰ ਸਾਬਤ ਕਰਦਾ ਨਹੀਂ। ਜੇ ਤੁਸੀਂ ਸੋਚਦੇ ਹੋ ਕਿ ਹੈ ਤਾਂ ਆਪਣੀ ਬਿੱਲੀ ਨੂੰ IQ ਟੈਸਟ ਦਿਓ... -✅ ਇੱਕ ਮਿੰਟ ਲਈ ਸੋਚੋ ਕਿ ਤੁਸੀਂ ਬੁੱਧੀ ਨੂੰ ਕਿਵੇਂ ਪਰਿਭਾਸ਼ਿਤ ਕਰਦੇ ਹੋ। ਕੀ ਇੱਕ ਕਾਂ ਜੋ ਇੱਕ ਭੁੱਲਭੁੱਲਿਆ ਹੱਲ ਕਰ ਸਕਦਾ ਹੈ ਅਤੇ ਕੁਝ ਖਾਣਾ ਪ੍ਰਾਪਤ ਕਰ ਸਕਦਾ ਹੈ ਬੁੱਧੀਮਾਨ ਹੈ? ਕੀ ਇੱਕ ਬੱਚਾ ਬੁੱਧੀਮਾਨ ਹੈ? +✅ ਸੋਚੋ ਕਿ ਤੁਸੀਂ ਬੁੱਧੀਮੱਤਾ ਨੂੰ ਕਿਵੇਂ ਪਰਿਭਾਸ਼ਿਤ ਕਰਦੇ ਹੋ। ਕੀ ਕਾਂ ਜੋ ਭੁਲੇਖਾ ਹੱਲ ਕਰ ਸਕਦਾ ਹੈ ਅਤੇ ਕੁਝ ਖਾਣ ਪਾ ਸਕਦਾ ਹੈ ਬੁੱਧੀਮਾਨ ਹੈ? ਕੀ ਬੱਚਾ ਬੁੱਧੀਮਾਨ ਹੈ? --- -AGI ਬਾਰੇ ਗੱਲ ਕਰਦੇ ਹੋਏ ਸਾਨੂੰ ਕੁਝ ਤਰੀਕਾ ਚਾਹੀਦਾ ਹੈ ਕਿ ਅਸੀਂ ਕਿਵੇਂ ਦੱਸ ਸਕਦੇ ਹਾਂ ਕਿ ਅਸੀਂ ਸੱਚਮੁੱਚ ਇੱਕ ਬੁੱਧੀਮਾਨ ਸਿਸਟਮ ਬਣਾਇਆ ਹੈ। [ਐਲਨ ਟਿਊਰਿੰਗ](https://en.wikipedia.org/wiki/Alan_Turing) ਨੇ ਇੱਕ ਤਰੀਕਾ ਪ੍ਰਸਤਾਵਿਤ ਕੀਤਾ ਜਿਸਨੂੰ **[Turing Test](https://en.wikipedia.org/wiki/Turing_test)** ਕਿਹਾ ਜਾਂਦਾ ਹੈ, ਜੋ ਬੁੱਧੀ ਦੀ ਪਰਿਭਾਸ਼ਾ ਵਜੋਂ ਵੀ ਕੰਮ ਕਰਦਾ ਹੈ। ਟੈਸਟ ਇੱਕ ਦਿੱਤੇ ਸਿਸਟਮ ਦੀ ਤੁਲਨਾ ਕੁਝ ਅੰਤਹਿਨ ਬੁੱਧੀਮਾਨ - ਇੱਕ ਅਸਲੀ ਮਨੁੱਖੀ ਜੀਵਨ ਨਾਲ ਕਰਦਾ ਹੈ, ਅਤੇ ਕਿਉਂਕਿ ਕੋਈ ਵੀ ਸਵੈ-ਚਾਲੂ ਤੁਲਨਾ ਇੱਕ ਕੰਪਿਊਟਰ ਪ੍ਰੋਗਰਾਮ ਦੁਆਰਾ ਬਾਈਪਾਸ ਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ, ਅਸੀਂ ਇੱਕ ਮਨੁੱਖੀ ਪੁੱਛਗਿੱਛ ਕਰਨ ਵਾਲੇ ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਹਾਂ। ਇਸ ਲਈ, ਜੇਕਰ ਇੱਕ ਮਨੁੱਖੀ ਜੀਵਨ ਇੱਕ ਅਸਲੀ ਵਿਅਕਤੀ ਅਤੇ ਇੱਕ ਕੰਪਿਊਟਰ ਸਿਸਟਮ ਵਿੱਚ ਟੈਕਸਟ-ਅਧਾਰਿਤ ਸੰਵਾਦ ਵਿੱਚ ਅੰਤਰ ਕਰਨ ਵਿੱਚ ਅਸਮਰਥ ਹੈ - ਸਿਸਟਮ ਨੂੰ ਬੁੱਧੀਮਾਨ ਮੰਨਿਆ ਜਾਂਦਾ ਹੈ। +AGI ਬਾਰੇ ਗੱਲ ਕਰਦੇ ਸਮੇਂ ਸਾਨੂੰ ਇਹ ਦੇਖਣਾ ਚਾਹੀਦਾ ਹੈ ਕਿ ਅਸੀਂ ਕਿਸੇ ਸੰਚਾਲਿਤ ਬੁੱਧੀਮਾਨ ਪ੍ਰਣਾਲੀ ਨੂੰ ਬਣਾ ਲਿਆ ਹੈ। [ਅਲਨ ਟਿਊਰਿੰਗ](https://en.wikipedia.org/wiki/Alan_Turing) ਨੇ ਇੱਕ ਤਰੀਕਾ ਦਿੱਤਾ, ਜਿਸਨੂੰ **[ਟਿਊਰਿੰਗ ਟੈਸਟ](https://en.wikipedia.org/wiki/Turing_test)** ਕਹਿੰਦੇ ਹਨ। ਇਹ ਟੈਸਟ ਕਿਸੇ ਸੰਚਾਲਿਤ ਪ੍ਰਣਾਲੀ ਨੂੰ ਇੱਕ ਮਨੁੱਖੀ ਨਾਲ ਤੁਲਨਾ ਕਰਦਾ ਹੈ ਤੇ ਮਨੁੱਖੀ ਪੁੱਛਗਿੱਛ ਕਰਨ ਵਾਲਾ ਇਸ ਗੱਲ ਨੂੰ ਪਰਖਦਾ ਹੈ ਕਿ ਕੀ ਉਹ ਕੰਪਿਊਟਰ ਅਤੇ ਮਨੁੱਖ ਦੇ ਵਿਚਕਾਰ ਅੰਤਰ ਕਰ ਸਕਦਾ ਹੈ ਜਾਂ ਨਹੀਂ। ਜੇ ਨਹੀਂ, ਤਾਂ ਪ੍ਰਣਾਲੀ ਨੂੰ ਬੁੱਧੀਮਾਨ ਸਮਝਿਆ ਜਾਂਦਾ ਹੈ। -> ਸੇਂਟ ਪੀਟਰਸਬਰਗ ਵਿੱਚ ਵਿਕਸਿਤ ਇੱਕ ਚੈਟ-ਬੋਟ [ਯੂਜੀਨ ਗੂਸਟਮੈਨ](https://en.wikipedia.org/wiki/Eugene_Goostman) ਨੇ 2014 ਵਿੱਚ ਟਿਊਰਿੰਗ ਟੈਸਟ ਪਾਸ ਕਰਨ ਦੇ ਨੇੜੇ ਆਉਣ ਲਈ ਇੱਕ ਚਤੁਰਤਾ ਭਰੀ ਸ਼ਖਸੀਅਤ ਦੀ ਚਾਲ ਚਲ ਕੇ। ਇਸਨੇ ਪਹਿਲਾਂ ਹੀ ਐਲਾਨ ਕੀਤਾ ਕਿ ਇਹ ਇੱਕ 13 ਸਾਲ ਦਾ ਯੂਕਰੇਨੀ ਲੜਕਾ ਹੈ, ਜੋ ਗਿਆਨ ਦੀ ਘਾਟ ਅਤੇ ਟੈਕਸਟ ਵਿੱਚ ਕੁਝ ਗਲਤੀਆਂ ਨੂੰ ਸਮਝਾਉਂਦਾ ਹੈ। ਬੋਟ ਨੇ 30% ਜੱਜਾਂ ਨੂੰ ਯਕੀਨ ਦਿਲਾਇਆ ਕਿ ਇਹ 5 ਮਿੰਟ ਦੇ ਸੰਵਾਦ ਤੋਂ ਬਾਅਦ ਮਨੁੱਖ ਹੈ, ਇੱਕ ਮਾਪਦੰਡ ਜੋ ਟਿਊਰਿੰਗ ਨੇ ਵਿਸ਼ਵਾਸ ਕੀਤਾ ਕਿ 2000 ਤੱਕ ਇੱਕ ਮਸ਼ੀਨ ਪਾਸ ਕਰਨ ਦੇ ਯੋਗ ਹੋਵੇਗੀ। ਹਾਲਾਂਕਿ, ਇਹ ਸਮਝਣਾ ਚਾਹੀਦਾ ਹੈ ਕਿ ਇਸਦਾ ਮਤਲਬ ਇਹ ਨਹੀਂ ਹੈ ਕਿ ਅਸੀਂ ਇੱਕ ਬੁੱਧੀਮਾਨ ਸਿਸਟਮ ਬਣਾਇਆ ਹੈ, ਜਾਂ ਕਿ ਇੱਕ ਕੰਪਿਊਟਰ ਸਿਸਟਮ ਨੇ ਮਨੁੱਖੀ ਪੁੱਛਗਿੱਛ ਕਰਨ ਵਾਲੇ ਨੂੰ ਬੇਵਕੂਫ਼ ਬਣਾਇਆ ਹੈ - ਸਿਸਟਮ ਨੇ ਮਨੁੱਖਾਂ ਨੂੰ ਬੇਵਕੂਫ਼ ਨਹੀਂ ਬਣਾਇਆ, ਬਲਕਿ ਬੋਟ ਬਣਾਉਣ ਵਾਲਿਆਂ ਨੇ ਕੀਤਾ! +> ਚੈਟਬੋਟ [ਯੂਜੀਨ ਗੂਸਟਮੈਨ](https://en.wikipedia.org/wiki/Eugene_Goostman) ਜੋ ਸੇਂਟ ਪੀਟਰਜ਼ਬਰਗ ਵਿੱਚ ਵਿਕਸਿਤ ਕੀਤਾ ਗਿਆ, 2014 ਵਿੱਚ ਟਿਊਰਿੰਗ ਟੈਸਟ ਨੂੰ ਪਾਸ ਕਰਨ ਦੇ ਨੇੜੇ ਪਹੁੰਚਿਆ ਇਕ ਚਤੁਰ ਵਿਅਕਤੀਗਤ ਗੁਣ ਦਾ ਲਾਭ ਉਠਾ ਕੇ। ਇਹ ਪਹਿਲਾਂ ਹੀ ਕਹਿ ਦਿੰਦਾ ਸੀ ਕਿ ਉਹ ਇੱਕ 13 ਸਾਲਾਂ ਉਸਕਰੇਨ ਦਾ ਮੁੰਡਾ ਹੈ, ਜਿਸ ਦਾ ਮਤਲਬ ਸੀ ਕਿ ਉਸਨੂੰ ਕੁਝ ਜਾਣਕਾਰੀ ਨਹੀਂ ਹੈ ਜਾਂ ਕੁਝ ਟੈਕਸਟ ਵਿੱਚ ਵਿਤਕਰੇ ਹੋ ਸਕਦੇ ਹਨ। ਇਹ ਬੋਟ 5 ਮਿੰਟ ਦੀ ਗੱਲਬਾਤ ਦੌਰਾਨ 30% ਜੱਜਾਂ ਨੂੰ ਮਨੁੱਖ ਸਮਝਣ ਵਿੱਚ ਕਾਮਯਾਬ ਹੋਇਆ, ਜਿਸਦੀਆਂ ਟਿਊਰਿੰਗ ਦੀ ਭਵਿੱਖਵਾਣੀ ਦੇ ਅਨੁਸਾਰ ਸਾਲ 2000 ਤੱਕ ਮਸ਼ੀਨ ਪਾਰ ਕਰ ਸੱਕਦੀ। ਹਾਲਾਂਕਿ, ਇਹ ਨਹੀਂ ਦਰਸਾਉਂਦਾ ਕਿ ਅਸੀਂ ਸੱਚਮੁੱਚ ਇੱਕ ਬੁੱਧੀਮਾਨ ਪ੍ਰਣਾਲੀ ਬਣਾ ਲਈ ਹੈ ਜਾਂ ਇਸ ਮਸ਼ੀਨ ਨੇ ਮਨੁੱਖੀ ਪੁੱਛਤਾਛ ਕਰਨ ਵਾਲੇ ਨੂੰ ਧੋਖਾ ਦਿੱਤਾ - ਸੱਚ ਇਹ ਹੈ ਕਿ ਮਨੁੱਖਾਂ ਨੂੰ ਧੋਖਾ ਬੋਟ ਦੇ ਸਿਰਜਣਹਾਰਾਂ ਨੇ ਦਿੱਤਾ! -✅ ਕੀ ਤੁਸੀਂ ਕਦੇ ਕਿਸੇ ਚੈਟ ਬੋਟ ਦੁਆਰਾ ਬੇਵਕੂਫ਼ ਬਣਾਏ ਗਏ ਹੋ ਕਿ ਤੁਸੀਂ ਇੱਕ ਮਨੁੱਖ ਨਾਲ ਗੱਲ ਕਰ ਰਹੇ ਹੋ? ਇਸਨੇ ਤੁਹਾਨੂੰ ਕਿਵੇਂ ਯਕੀਨ ਦਿਲਾਇਆ? +✅ ਕੀ ਤੁਸੀਂ ਕਦੇ ਕਿਸੇ ਚੈਟ ਬੋਟ ਦੁਆਰਾ ਧੋਖੇਬਾਜ਼ੀ ਨਾਲ ਸੋਚਿਆ ਕਿ ਤੁਸੀਂ ਕਿਸੇ ਮਨੁੱਖ ਨਾਲ ਗੱਲ ਕਰ ਰਹੇ ਹੋ? ਇਸਨੇ ਤੁਹਾਨੂੰ ਕਿਵੇਂ ਮਨਾਇਆ? -## AI ਦੇ ਵੱਖ-ਵੱਖ ਪਹੁੰਚ +## ਏਆਈ ਦੇ ਵੱਖ-ਵੱਖ ਤਰੀਕੇ -ਜੇਕਰ ਅਸੀਂ ਚਾਹੁੰਦੇ ਹਾਂ ਕਿ ਇੱਕ ਕੰਪਿਊਟਰ ਮਨੁੱਖ ਵਾਂਗ ਵਿਹਾਰ ਕਰੇ, ਤਾਂ ਸਾਨੂੰ ਕਿਸੇ ਤਰੀਕੇ ਨਾਲ ਕੰਪਿਊਟਰ ਦੇ ਅੰਦਰ ਆਪਣੇ ਸੋਚਣ ਦੇ ਤਰੀਕੇ ਨੂੰ ਮਾਡਲ ਕਰਨ ਦੀ ਲੋੜ ਹੈ। ਇਸਦੇ ਨਤੀਜੇ ਵਜੋਂ, ਸਾਨੂੰ ਇਹ ਸਮਝਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਨ ਦੀ ਲੋੜ ਹੈ ਕਿ ਇੱਕ ਮਨੁੱਖੀ ਜੀਵਨ ਨੂੰ ਬੁੱਧੀਮਾਨ ਬਣਾਉਣ ਵਾਲਾ ਕੀ ਹੈ। +ਜੇ ਅਸੀਂ ਚਾਹੁੰਦੇ ਹਾਂ ਕਿ ਕੰਪਿਊਟਰ ਮਨੁੱਖ ਵਾਂਗ ਵਰਤੋਂ ਕਰੇ, ਤਾਂ ਸਾਨੂੰ ਆਪਣੀ ਸੋਚ ਪ੍ਰਕਿਰਿਆ ਨੂੰ ਕੰਪਿਊਟਰ ਵਿੱਚ ਮਾਡਲ ਕਰਨਾ ਪਵੇਗਾ। ਇਸ ਲਈ ਸਾਨੂੰ ਸਮਝਣਾ ਪਵੇਗਾ ਕਿ ਮਨੁੱਖ ਨੂੰ ਬੁੱਧੀਮਾਨ ਕਿਵੇਂ ਬਣਾਉਂਦਾ ਹੈ। -> ਮਸ਼ੀਨ ਵਿੱਚ ਬੁੱਧੀ ਪ੍ਰੋਗਰਾਮ ਕਰਨ ਦੇ ਯੋਗ ਹੋਣ ਲਈ, ਸਾਨੂੰ ਇਹ ਸਮਝਣ ਦੀ ਲੋੜ ਹੈ ਕਿ ਸਾਡੇ ਆਪਣੇ ਫੈਸਲੇ ਕਰਨ ਦੇ ਤਰੀਕੇ ਕਿਵੇਂ ਕੰਮ ਕਰਦੇ ਹਨ। ਜੇਕਰ ਤੁਸੀਂ ਕੁਝ ਸਵੈ-ਵਿਚਾਰ ਕਰਦੇ ਹੋ, ਤਾਂ ਤੁਸੀਂ ਅਹਿਸਾਸ ਕਰੋਗੇ ਕਿ ਕੁਝ ਪ੍ਰਕਿਰਿਆਵਾਂ ਅਚੇਤਨ ਤੌਰ 'ਤੇ ਹੁੰਦੀਆਂ ਹਨ - ਜਿਵੇਂ ਕਿ ਅਸੀਂ ਬਿੱਲੀ ਨੂੰ ਕੁੱਤੇ ਤੋਂ ਬਿਨਾਂ ਸੋਚੇ ਅੰਤਰ ਕਰ ਸਕਦੇ ਹਾਂ - ਜਦੋਂ ਕਿ ਕੁਝ ਹੋਰ ਤਰਕ ਸ਼ਾਮਲ ਕਰਦੇ ਹਨ। +> ਮਸ਼ੀਨ ਵਿੱਚ ਬੁੱਧੀਮੱਤਾ ਪ੍ਰੋਗ੍ਰਾਮ ਕਰਨ ਲਈ, ਸਾਨੂੰ ਪਤਾ ਲੱਗਣਾ ਚਾਹੀਦਾ ਹੈ ਕਿ ਆਪਣੀਆਂ ਫੈਸਲੇ ਕਰਨ ਵਾਲੀਆਂ ਪ੍ਰਕਿਰਿਆਵਾਂ ਕਿਵੇਂ ਕੰਮ ਕਰਦੀਆਂ ਹਨ। ਜੇ ਤੁਸੀਂ ਕੁਝ ਅੰਦਰੂਨੀ ਸੋਚ ਕਰੋਗੇ ਤਾਂ ਇਹ ਪਤਾ ਲੱਗੇਗਾ ਕਿ ਕੁਝ ਪ੍ਰਕਿਰਿਆਵਾਂ ਅਵਗਿਆਨਕ ਹੁੰਦੀਆਂ ਹਨ – ਉਦਾਹਰਨ ਵੱਜੋਂ, ਅਸੀ ਬਿਨਾ ਸੋਚੇ ਬਿੱਲੀ ਅਤੇ ਕੁੱਤੇ ਵਿੱਚ ਫ਼ਰਕ ਕਰ ਸਕਦੇ ਹਾਂ - ਜਦਕਿ ਹੋਰ ਇੱਕ ਤਰਕੇ ਵਿੱਚ ਤਰਕ ਜ਼ਰੂਰੀ ਹੁੰਦਾ ਹੈ। -ਇਸ ਸਮੱਸਿਆ ਲਈ ਦੋ ਸੰਭਾਵਿਤ ਪਹੁੰਚ ਹਨ: +ਇਸ ਸਮੱਸਿਆ ਲਈ ਦੋ ਸੰਭਾਵਿਤ ਤਰੀਕੇ ਹਨ: -ਟਾਪ-ਡਾਊਨ ਪਹੁੰਚ (ਸੰਕੇਤਕ ਤਰਕ) | ਬਾਟਮ-ਅੱਪ ਪਹੁੰਚ (ਨਿਊਰਲ ਨੈੱਟਵਰਕ) +ਸਿਖਰ-ਥੱਲੇ ਤਰੀਕਾ (ਪ੍ਰਤੀਕਾਤਮਕ ਤਰਕ) | ਥੱਲੇ-ਉਪਰ ਤਰੀਕਾ (ਨਿਊਰਲ ਨੈੱਟਵਰਕ) ---------------------------------------|------------------------------------- -ਟਾਪ-ਡਾਊਨ ਪਹੁੰਚ ਇੱਕ ਸਮੱਸਿਆ ਨੂੰ ਹੱਲ ਕਰਨ ਲਈ ਇੱਕ ਵਿਅਕਤੀ ਦੇ ਤਰਕ ਕਰਨ ਦੇ ਤਰੀਕੇ ਨੂੰ ਮਾਡਲ ਕਰਦੀ ਹੈ। ਇਸ ਵਿੱਚ ਇੱਕ ਮਨੁੱਖੀ ਜੀਵਨ ਤੋਂ **ਗਿਆਨ** ਕੱਢਣਾ, ਅਤੇ ਇਸਨੂੰ ਕੰਪਿਊਟਰ-ਪੜ੍ਹਨਯੋਗ ਰੂਪ ਵਿੱਚ ਦਰਸਾਉਣਾ ਸ਼ਾਮਲ ਹੈ। ਸਾਨੂੰ ਕੰਪਿਊਟਰ ਦੇ ਅੰਦਰ **ਤਰਕ** ਨੂੰ ਮਾਡਲ ਕਰਨ ਦਾ ਤਰੀਕਾ ਵੀ ਵਿਕਸਿਤ ਕਰਨ ਦੀ ਲੋੜ ਹੈ। | ਬਾਟਮ-ਅੱਪ ਪਹੁੰਚ ਇੱਕ ਮਨੁੱਖੀ ਦਿਮਾਗ ਦੀ ਬਣਤਰ ਨੂੰ ਮਾਡਲ ਕਰਦੀ ਹੈ, ਜੋ ਸਧਾਰਨ ਇਕਾਈਆਂ ਦੀ ਇੱਕ ਵੱਡੀ ਗਿਣਤੀ **ਨਿਊਰੋਨ** ਤੋਂ ਬਣੀ ਹੁੰਦੀ ਹੈ। ਹਰ ਨਿਊਰੋਨ ਆਪਣੇ ਇਨਪੁੱਟਸ ਦਾ ਵਜ਼ਨੀ ਔਸਤ ਵਾਂਗ ਕੰਮ ਕਰਦਾ ਹੈ, ਅਤੇ ਅਸੀਂ **ਤਰਬੀਤੀ ਡਾਟਾ** ਪ੍ਰਦਾਨ ਕਰਕੇ ਨਿਊਰੋਨ ਦੇ ਇੱਕ ਨੈੱਟਵਰਕ ਨੂੰ ਉਪਯੋਗੀ ਸਮੱਸਿਆਵਾਂ ਹੱਲ ਕਰਨ ਲਈ ਪ੍ਰਸ਼ਿਕਸ਼ਿਤ ਕਰ ਸਕਦੇ ਹਾਂ। +ਸਿਖਰ-ਥੱਲੇ ਤਰੀਕਾ ਇੱਕ ਵਿਅਕਤੀ ਦੇ ਤਰਕ ਕਰਨ ਦੇ ਤਰੀਕੇ ਨੂੰ ਮਾਡਲ ਕਰਦਾ ਹੈ। ਇਸ ਵਿੱਚ ਮਨੁੱਖ ਤੋਂ **ਜਾਣਕਾਰੀ** ਇਕੱਠੀ ਕਰਕੇ ਕੰਪਿਊਟਰ-ਪੜ੍ਹਨਯੋਗ ਰੂਪ ਵਿੱਚ ਦਰਸਾਉਂਦਾ ਹੈ। ਸਾਨੂੰ ਕੰਪਿਊਟਰ ਵਿੱਚ **ਤਰਕਬੱਧਤਾ** ਮਾਡਲ ਕਰਨ ਦਾ ਤਰੀਕਾ ਵੀ ਵਿਕਸਿਤ ਕਰਨ ਦੀ ਲੋੜ ਹੈ।|ਥੱਲੇ-ਉਪਰ ਤਰੀਕਾ ਮਨੁੱਖੀ ਦਿਮਾਗ ਦਾ ਢਾਂਚਾ ਮਾਡਲ ਕਰਦਾ ਹੈ, ਜੋ ਸਾਦੇ ਤੱਤਾਂ **ਨਿਊਰੋਨ** ਦਾ ਇਕ ਵੱਡਾ ਜਥਾ ਹੁੰਦੇ ਹਨ। ਹਰ ਨਿਊਰੋਨ ਆਪਣੇ ਇੰਪੁੱਟ ਦਾ ਵਰ ਤੁਲਨਾਤਮਕ ਸਰਾਸਰੀ ਕਾਰਜ ਕਰਦਾ ਹੈ, ਅਤੇ ਅਸੀਂ ਨਿਊਰੋਨ ਦਾ ਜਾਲ ਤਿਆਰ ਕਰਕੇ **ਸਿਖਲਾਈ ਡੇਟਾ** ਦੇ ਕੇ ਸਮੱਸਿਆਵਾਂ ਹੱਲ ਕਰਨਾ ਸਿਖਾ ਸਕਦੇ ਹਾਂ। + +ਹੋਰ ਵੀ ਕੁਝ ਸੰਭਾਵਿਤ ਤਰੀਕੇ ਹਨ: + +* **ਐਮਰਜੈਂਟ**, **ਸਿਨੈਰਜੈਟਿਕ** ਜਾਂ **ਮਲਟੀ-ਏਜੰਟ ਤਰੀਕੇ** ਇਸ ਸੱਚਾਈ 'ਤੇ ਆਧਾਰਿਤ ਹਨ ਕਿ ਬਹੁਤ ਸਾਰੇ ਸਾਦਾ ਏਜੰਟਾਂ ਦੇ ਇੰਟਰੈਕਸ਼ਨ ਨਾਲ ਜਟਿਲ ਬੁੱਧੀਮਾਨ ਵਰਤੋਂ ਮਿਲ ਸਕਦੀ ਹੈ। [ਕਰਮਿਕ ਸਾਈਬਰਨੈਟਿਕਸ](https://en.wikipedia.org/wiki/Global_brain#Evolutionary_cybernetics) ਦੇ ਅਨੁਸਾਰ, ਬੁੱਧੀਮੱਤਾ ਸਧਾਰਣ, ਪ੍ਰਤੀਕਿਰਿਆਕਾਰੀ ਵਰਤੋਂ ਤੋਂ *ਉਤਪੰਨ* ਹੋ ਸਕਦੀ ਹੈ *ਮੈਟਾਸਿਸਟਮ ਟ੍ਰਾਂਜ਼ੀਸ਼ਨ* ਦੀ ਪ੍ਰਕਿਰਿਆ ਵਿੱਚ। + +* **ਵਿਕਾਸੀ ਤਰੀਕਾ**, ਜਾਂ **ਜੀਨੇਟਿਕ ਐਲਗੋਰਿਦਮ**, ਵਿਕਾਸ ਦੇ ਸਿਧਾਂਤਾਂ 'ਤੇ ਆਧਾਰਤ ਇੱਕ ਸੁਧਾਰ ਪ੍ਰਕਿਰਿਆ ਹੈ। + +ਅਸੀਂ ਇਨ੍ਹਾਂ ਤਰੀਕਿਆਂ ਨੂੰ ਕੋਰਸ ਵਿੱਚ ਬਾਅਦ ਵਿੱਚ ਛੇੜਾਂਗੇ, ਪਰ ਹੁਣ ਲਈ ਸਾਡੇ ਧਿਆਨ ਦੋ ਮੁੱਖ ਦਿਸ਼ਾਵਾਂ ਤੇ ਹੈ: ਸਿਖਰ-ਥੱਲੇ ਅਤੇ ਥੱਲੇ-ਉਪਰ। + +### ਸਿਖਰ-ਥੱਲੇ ਤਰੀਕਾ + +ਇੱਕ **ਸਿਖਰ-ਥੱਲੇ ਤਰੀਕੇ** ਵਿੱਚ, ਅਸੀਂ ਆਪਣੀ ਤਰਕਬੱਧਤਾ ਨੂੰ ਮਾਡਲ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਦੇ ਹਾਂ। ਕਿਉਂਕਿ ਅਸੀਂ ਆਪਣੀਆਂ ਸੋਚਾਂ ਦੀ ਪਾਲਣਾ ਕਰ ਸਕਦੇ ਹਾਂ, ਅਸੀਂ ਇਸ ਪ੍ਰਕਿਰਿਆ ਨੂੰ ਰੂਪ ਵਿੱਚ ਲਿਆਉਣ ਅਤੇ ਕੰਪਿਊਟਰ ਵਿੱਚ ਪ੍ਰੋਗ੍ਰਾਮ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਦੇ ਹਾਂ। ਇਸ ਨੂੰ **ਪ੍ਰਤੀਕਾਤਮਕ ਤਰਕ** ਕਹਿੰਦੇ ਹਨ। + +ਲੋਕਾਂ ਦੇ ਮਨ ਵਿੱਚ ਕੁਝ ਅਜੇਹੇ ਨਿਯਮ ਹੁੰਦੇ ਹਨ ਜੋ ਉਹਨਾਂ ਦੇ ਫੈਸਲੇ ਕਰਨ ਦੀ ਪ੍ਰਕਿਰਿਆ ਨੂੰ ਮਾਰਗਦਰਸ਼ਨ ਕਰਦੇ ਹਨ। ਉਦਾਹਰਨ ਵੱਜੋਂ, ਜਦ ਇੱਕ ਡਾਕਟਰ ਕਿਸੇ ਮਰੀਜ਼ ਦੀ ਜਾਂਚ ਕਰਦਾ ਹੈ, ਉਹ ਪਤਾ ਲਗਾ ਸਕਦਾ ਹੈ ਕਿ ਮਰੀਜ਼ ਨੂੰ ਬੁਖਾਰ ਹੈ, ਇਸ ਲਈ ਸਰੀਰ ਵਿੱਚ ਸੂਜੀ ਹੋ ਸਕਦੀ ਹੈ। ਕਈ ਨਿਯਮਾਂ ਨੂੰ ਲਾਗੂ ਕਰਕੇ ਡਾਕਟਰ ਅੰਤਿਮ ਨਿਰਣਾ ਕਰ ਸਕਦਾ ਹੈ। + +ਇਹ ਤਰੀਕਾ ਬਹੁਤ ਜ਼ਿਆਦਾ **ਜਾਣਕਾਰੀ ਦਰਸਾਅ** ਅਤੇ **ਤਰਕ** 'ਤੇ ਨਿਰਭਰ ਕਰਦਾ ਹੈ। ਮਨੁੱਖੀ ਮਾਹਿਰ ਤੋਂ ਜਾਣਕਾਰੀ ਕੱਢਣਾ ਸਬ ਤੋਂ ਮੁਸ਼ਕਲ ਹਿੱਸਾ ਹੈ, ਕਿਉਂਕਿ ਕਈ ਵਾਰ ਡਾਕਟਰ ਇਸ ਗੱਲ ਨੂੰ ਨਹੀਂ ਜਾਣਦਾ ਕਿ ਉਹ ਕਿਸ ਤਰੀਕੇ ਨਾਲ ਨਿਰਣਾ ਤੱਕ ਪਹੁੰਚਦਾ ਹੈ। ਕਈ ਵਾਰ ਹੱਲ ਬਿਨਾ ਜ਼ਾਹਰ ਸੋਚੇ ਮਨ ਵਿੱਚ ਆ ਜਾਂਦਾ ਹੈ। ਕੁਝ ਕੰਮ ਜਿਵੇਂ ਕਿਸੇ ਵਿਅਕਤੀ ਦੀ ਤਸਵੀਰ ਤੋਂ ਉਮਰ ਪਤਾ ਕਰਨ ਜਿਵੇਂ ਕੰਮ ਜਾਣਕਾਰੀ ਸੰਚਾਲਨ ਨਾਲ ਸੰਪੂਰਨ ਤੌਰ 'ਤੇ ਹੱਲ ਨਹੀਂ ਕੀਤੇ ਜਾ ਸਕਦੇ। + +### ਥੱਲੇ-ਉਪਰ ਤਰੀਕਾ + +ਵੱਖਰੇ ਤਰੀਕੇ ਨਾਲ, ਅਸੀਂ ਆਪਣੇ ਦਿਮਾਗ ਦੇ ਸਭ ਤੋਂ ਸਧਾਰਣ ਤੱਤ ਨੂੰ ਮਾਡਲ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰ ਸਕਦੇ ਹਾਂ - ਨਿਊਰੋਨ। ਅਸੀਂ ਕੰਪਿਊਟਰ ਵਿੱਚ ਇੱਕ ਕਿਰਤ੍ਰਿਮ ਨਿਊਰਲ ਨੈੱਟਵਰਕ ਬਣਾ ਸਕਦੇ ਹਾਂ ਅਤੇ ਇਸਨੂੰ ਉਦਾਹਰਨਾਂ ਦੇ ਕੇ ਸਮੱਸਿਆਵਾਂ ਹੱਲ ਕਰਨਾ ਸਿਖਾ ਸਕਦੇ ਹਾਂ। ਇਹ ਪ੍ਰਕਿਰਿਆ ਉਸ ਤਰੀਕੇ ਨਾਲ ਮਿਲਦੀ ਹੈ ਜਿਸ ਤਰ੍ਹਾਂ ਨਵਜੰਮੇ ਬੱਚੇ ਆਪਣੇ ਆਸ ਪਾਸ ਦੇ ਮਾਹੌਲ ਬਾਰੇ ਜਾਣਨ ਲਈ ਅਵਹਾਵਾਂ ਕਰਦੇ ਹਨ। + +✅ ਤੱਕੜੀ ਖੋਜ ਕਰੋ ਕਿ ਬੱਚੇ ਕਿਵੇਂ ਸਿੱਖਦੇ ਹਨ। ਬੱਚੇ ਦੇ ਦਿਮਾਗ ਦੇ ਮੁੱਖ ਤੱਤ ਕੀ ਹਨ? + +> | ਮਸ਼ੀਨ ਲਰਨਿੰਗ ਬਾਰੇ ਕੀ? | | +> |--------------|-----------| +> | ਕਿਰਤ੍ਰਿਮ ਬੁੱਧੀਮੱਤਾ ਦਾ ਉਹ ਹਿੱਸਾ ਜੋ ਡੇਟਾ ਦੇ ਆਧਾਰ 'ਤੇ ਸਮੱਸਿਆ ਹੱਲ ਕਰਨ ਲਈ ਕੰਪਿਊਟਰ ਸਿੱਖਣ 'ਤੇ ਆਧਾਰਤ ਹੈ, ਉਸਨੂੰ **ਮਸ਼ੀਨ ਲਰਨਿੰਗ** ਕਹਿੰਦੇ ਹਨ। ਅਸੀਂ ਇਸ ਕੋਰਸ ਵਿੱਚ ਕਲਾਸਿਕ ਮਸ਼ੀਨ ਲਰਨਿੰਗ ਕਵਰ ਨਹੀਂ ਕਰਾਂਗੇ – ਤੁਹਾਨੂੰ ਵੱਖਰੇ [ਮਸ਼ੀਨ ਲਰਨਿੰਗ ਬਿਗਨਰਜ਼](http://aka.ms/ml-beginners) ਕੋਰਸ ਵੱਲ ਰੁਝਾਨ ਕਰਦੇ ਹਾਂ।| ![ਨਵੇਂ ਸਿੱਖਣ ਵਾਲਿਆਂ ਲਈ ML](../../../../translated_images/pa/ml-for-beginners.9e4fed176fd5817d.webp) | + +## ਏਆਈ ਦਾ ਸੰਖੇਪ ਇਤਿਹਾਸ + +ਕਿਰਤਰਿਮ ਬੁੱਧੀਮੱਤਾ ਨੂੰ 20ਵੀਂ ਸਦੀ ਦੇ ਮੱਧ ਵਿੱਚ ਖੇਤਰ ਵਜੋਂ ਸ਼ੁਰੂ ਕੀਤਾ ਗਿਆ। ਸ਼ੁਰੂ ਵਿੱਚ ਪ੍ਰਤੀਕਾਤਮਕ ਤਰਕ ਪ੍ਰਮੁੱਖ ਤਰੀਕਾ ਸੀ, ਜਿਸ ਨਾਲ ਕੁਝ ਮਹੱਤਵਪੂਰਨ ਸਫਲਤਾਵਾਂ ਜਿਵੇਂ ਮਾਹਿਰ ਪ੍ਰਣਾਲੀਆਂ ਬਣੀਆਂ - ਕੰਪਿਊਟਰ ਪ੍ਰੋਗਰਾਮ ਜੋ ਕਈ ਖੇਤਰਾਂ ਵਿੱਚ ਮਾਹਿਰ ਵਰਤੋਂ ਕਰ ਸਕਦੇ ਸਨ। ਪਰ ਜਲਦ ਹੀ ਇਹ ਪਤਾ ਲੱਗਾ ਕਿ ਇਹ ਤਰੀਕਾ ਸਹੀ ਤਰ੍ਹਾਂ ਵੱਡੇ ਪੱਧਰ ਉੱਤੇ ਨਹੀਂ ਚੱਲਦਾ। ਮਾਹਿਰ ਤੋਂ ਜਾਣਕਾਰੀ ਕੱਢਣਾ, ਕੰਪਿਊਟਰ ਵਿੱਚ ਦਰਸਾਉਣਾ ਅਤੇ ਇਹ ਜਾਣਕਾਰੀ ਨਿਰੰਤਰ ਅਪਡੇਟ ਰੱਖਣਾ ਬਹੁਤ ਮੁਸ਼ਕਲ ਅਤੇ ਮਹਿੰਗਾ ਸੀ। ਇਸ ਕਾਰਨ 1970 ਦੇ ਦਹਾਕੇ ਵਿੱਚ ਆਉਣ ਵਾਲਾ [ਏਆਈ ਸਰਦੀ](https://en.wikipedia.org/wiki/AI_winter) ਆਇਆ। + +ਏਆਈ ਦਾ ਸੰਖੇਪ ਇਤਿਹਾਸ + +> ਤਸਵੀਰ [ਦਿਮਿਤਰੀ ਸੋਸ਼ਨਿਕੋਵ](http://soshnikov.com) ਵੱਲੋਂ + +ਸਮਾਂ ਬੀਤਣ ਦੇ ਨਾਲ ਕਿਰਤ੍ਰਿਮ ਬੁੱਧੀਮੱਤਾ ਲਈ ਕੰਪਿਊਟਿੰਗ ਸਾਧਨ ਸਸਤੇ ਹੋਏ ਅਤੇ ਵੱਧ ਡੇਟਾ ਉਪਲੱਬਧ ਹੋਇਆ, ਜਿਸ ਕਰਕੇ ਨਿਊਰਲ ਨੈੱਟਵਰਕ ਤਰੀਕਿਆਂ ਨੇ ਮਨੁੱਖਾਂ ਨਾਲ ਮੁਕਾਬਲੇ ਵਿੱਚ ਕਈ ਖੇਤਰਾਂ ਵਿੱਚ ਜਰੂਰੀ ਕਾਰਗੁਜ਼ਾਰੀ ਦਿਖਾਈ, ਜਿਵੇਂ ਕਿ ਕੰਪਿਊਟਰ ਵਿਜ਼ਨ ਜਾਂ ਬੋਲਚਾਲ ਸਮਝਣਾ। ਪਿਛਲੇ ਦਹਾਕੇ ਵਿੱਚ, ਟਰਮ “ਕਿਰਤ੍ਰਿਮ ਬੁੱਧੀਮੱਤਾ” ਜ਼ਿਆਦਾਤਰ ਨਿਊਰਲ ਨੈੱਟਵਰਕ ਦਾ ਪਰਯਾਯ ਬਣ ਗਿਆ ਹੈ, ਕਿਉਂਕਿ ਅਕਸਰ ਸਫਲਤਾਵਾਂ ਉਸ ਉੱਤੇ ਆਧਾਰਤ ਹਨ। -ਬੁੱਧੀ ਲਈ ਕੁਝ ਹੋਰ ਸੰਭਾਵਿਤ ਪਹੁੰਚਾਂ ਵੀ ਹਨ: +ਅਸੀਂ ਵੇਖ ਸਕਦੇ ਹਾਂ ਕਿ ਕਿਵੇਂ ਤਰੀਕੇ ਬਦਲੇ, ਉਦਾਹਰਨ ਵਜੋਂ ਸ਼ਤਰੰਜ ਖੇਡਣ ਵਾਲਾ ਕੰਪਿਊਟਰ ਪ੍ਰੋਗਰਾਮ ਬਣਾਉਣ ਵਿੱਚ: -* ਇੱਕ **ਉਭਰਤੀ**, **ਸਿਨਰਜੈਟਿਕ** ਜਾਂ **ਮਲਟੀ-ਏਜੰਟ ਪਹੁੰਚ** ਇਸ ਤੱਥ 'ਤੇ ਅਧਾਰਿਤ ਹੈ ਕਿ ਬਹੁਤ ਸਾਰੇ ਸਧਾਰਨ ਏਜੰਟਾਂ ਦੇ ਪਰਸਪਰ ਸੰਚਾਰ ਦੁਆਰਾ ਜਟਿਲ ਬੁੱਧੀਮਾਨ ਵਿਹਾਰ ਪ੍ਰਾਪਤ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ। [ਇਵੋਲੂਸ਼ਨਰੀ ਸਾਇਬਰਨੈਟਿਕਸ](https://en.wikipedia.org/wiki/Global_brain#Evolutionary_cybernetics) ਦੇ ਅਨੁਸਾਰ, ਬੁੱਧੀ ਹੋਰ ਸਧਾਰਨ, ਪ੍ਰਤੀਕ੍ਰਿਆਸ਼ੀਲ ਵਿਹਾਰ ਤੋਂ *ਮੈਟਾਸਿਸਟਮ ਟ੍ਰਾਂਜ਼ੀਸ਼ਨ* ਦੀ ਪ੍ਰਕਿਰਿਆ ਵਿੱਚ *ਉਭਰ* ਸਕਦੀ ਹੈ। +* ਸ਼ਤਰੰਜ ਦੇ ਸ਼ੁਰੂਆਤੀ ਪ੍ਰੋਗਰਾਮ ਖੋਜ 'ਤੇ ਆਧਾਰਤ ਸਨ – ਪ੍ਰੋਗਰਾਮ ਵਿਰੋਧੀ ਦੇ ਸੰਭਾਵਿਤ ਚਾਲਾਂ ਦਾ ਅੰਦਾਜ਼ਾ ਲਗਾਂਦਾ ਅਤੇ ਕਈ ਅਗਲੀ ਚਾਲਾਂ ਵਿੱਚ ਸਭ ਤੋਂ ਵਧੀਆ ਚਾਲ ਚੁਣਦਾ। ਇਸ ਤਰੀਕੇ ਨਾਲ [ਅਲਫਾ-ਬੀਟਾ ਪ੍ਰੂਨਿੰਗ](https://en.wikipedia.org/wiki/Alpha%E2%80%93beta_pruning) ਖੋਜ ਐਲਗੋਰਿਦਮ ਵਿਕਸਤ ਹੋਇਆ। +* ਖੋਜ ਰਣਨੀਤੀਆਂ ਖੇਡ ਦੇ ਅੰਤ ਵਿੱਚ ਚੰਗੇ funcionamento ਕਰਦੀਆਂ ਹਨ ਜਿੱਥੇ ਸੰਭਾਵਿਤ ਚਾਲਾਂ ਦੀ ਗਿਣਤੀ ਘੱਟ ਹੁੰਦੀ ਹੈ। ਪਰ ਖੇਡ ਦੀ ਸ਼ੁਰੂਆਤ ਵਿੱਚ ਖੋਜ ਖੇਤਰ ਵੱਡਾ ਹੁੰਦਾ ਹੈ ਅਤੇ ਪ੍ਰੋਗਰਾਮ ਖੇਡਾਂ ਦੇ ਮੌਜੂਦਾ ਮੈਚਾਂ ਤੋਂ ਸਿੱਖ ਕੇ ਇਸਨੂੰ ਬਿਹਤਰ ਕਰ ਸਕਦਾ ਹੈ। ਅਗਲੇ ਪ੍ਰਯੋਗਾਂ ਵਿੱਚ [ਕੇਸ-ਅਧਾਰਿਤ ਤਰਕ](https://en.wikipedia.org/wiki/Case-based_reasoning) ਵਰਤੀ ਗਈ, ਜਿੱਥੇ ਪ੍ਰੋਗਰਾਮ ਮੌਜੂਦਾ ਪੋਜ਼ੀਸ਼ਨ ਨਾਲ ਮਿਲਦੇ-ਜੁਲਦੇ ਕੇਸ ਖੋਜਦਾ ਹੈ। +* ਆਧੁਨਿਕ ਪ੍ਰੋਗਰਾਮ ਜੋ ਮਨੁੱਖਾਂ ਨੂੰ ਹਰਾਉਂਦੇ ਹਨ ਨਿਊਰਲ ਨੈੱਟਵਰਕ ਅਤੇ [ਮਜ਼ਬੂਤੀ ਸਿੱਖਿਆ](https://en.wikipedia.org/wiki/Reinforcement_learning) 'ਤੇ ਧਿਆਨ ਦੇਂਦੇ ਹਨ, ਜਿੱਥੇ ਪ੍ਰੋਗਰਾਮ ਖੁਦ ਨਾਲ ਲੰਮਾ ਸਮਾਂ ਖੇਲਦੇ ਹਨ ਅਤੇ ਆਪਣੀਆਂ ਭੁੱਲਾਂ ਤੋਂ ਸਿੱਖਦੇ ਹਨ – ਜਿਸ ਤਰ੍ਹਾਂ ਮਨੁੱਖ ਸ਼ਤਰੰਜ ਸਿੱਖਦਾ ਹੈ। ਪਰ ਕੰਪਿਊਟਰ ਜ਼ਿਆਦਾ ਖੇਡਾਂ ਛੇਤੀ ਖੇਡ ਸਕਦਾ ਹੈ ਅਤੇ ਤੇਜ਼ ਸਿੱਖ ਸਕਦਾ ਹੈ। -* ਇੱਕ **ਇਵੋਲੂਸ਼ਨਰੀ ਪਹੁੰਚ**, ਜਾਂ **ਜਨੈਟਿਕ ਐਲਗੋਰਿਦਮ** ਇੱਕ ਵਿਕਾਸ ਦੇ ਸਿਧਾਂਤਾਂ 'ਤੇ ਅਧਾਰਿਤ ਇੱਕ ਅਪਟਿਮਾਈਜ਼ੇਸ਼ਨ ਪ੍ਰਕਿਰਿਆ ਹੈ। +✅ ਹੋਰ ਖੇਡਾਂ 'ਤੇ ਥੋੜਾ ਖੋਜ ਕਰੋ ਜੋ ਏਆਈ ਨੇ ਖੇਡੀਆਂ ਹਨ। -ਅਸੀਂ ਇਹ ਪਹੁੰਚਾਂ ਕੋਰਸ ਵਿੱਚ ਬਾਅਦ ਵਿੱਚ ਵਿਚਾਰਾਂਗੇ, ਪਰ ਇਸ ਸਮੇਂ ਅਸੀਂ ਦੋ ਮੁੱਖ ਦਿਸ਼ਾਵਾਂ 'ਤੇ ਧਿਆਨ ਦੇਵਾਂਗੇ: ਟਾਪ-ਡਾਊਨ ਅਤੇ ਬਾਟਮ-ਅੱਪ। +ਇਸੇ ਤਰ੍ਹਾਂ, ਅਸੀਂ ਵੇਖ ਸਕਦੇ ਹਾਂ ਕਿ “ਗੱਲ ਕਰਨ ਵਾਲੇ ਪ੍ਰੋਗਰਾਮ” ਬਣਾਉਣ ਦਾ ਤਰੀਕਾ ਜਿਹੜਾ ਟਿਊਰਿੰਗ ਟੈਸਟ ਪਾਸ ਕਰ ਸਕੇ, ਕਿਵੇਂ ਬਦਲਿਆ: -### ਟਾਪ-ਡਾਊਨ ਪਹੁੰਚ +* ਸ਼ੁਰੂਆਤੀ ਇੰਨ੍ਹਾਂ ਵਿੱਚ [ਐਲਿਜ਼ਾ](https://en.wikipedia.org/wiki/ELIZA) ਵਰਗੇ ਪ੍ਰੋਗਰਾਮ ਵਧੇਰੇ ਸਾਦੇ ਵਿਆਕਰਣ ਨਿਯਮਾਂ ਅਤੇ ਇੰਪੁੱਟ ਵਾਕ ਨੂੰ ਸਵਾਲ ਵਿੱਚ ਬਦਲਨ 'ਤੇ ਆਧਾਰਿਤ ਸਨ। +* ਆਧੁਨਿਕ ਸਹਾਇਕ, ਜਿਵੇਂ ਕੋਰਟਾਨਾ, ਸਿਰੀ ਜਾਂ ਗੂਗਲ ਸਹਾਇਕ, ਸਾਰੇ ਹਾਈਬ੍ਰਿਡ ਪ੍ਰਣਾਲੀਆਂ ਹਨ ਜੋ ਸਪੀਚ ਨੂੰ ਟੈਕਸਟ ਵਿੱਚ ਬਦਲਣ ਅਤੇ ਸਾਡੇ ਮਕਸਦ ਨੂੰ ਸਮਝਣ ਲਈ ਨਿਊਰਲ ਨੈੱਟਵਰਕ ਵਰਤਦੀਆਂ ਹਨ, ਅਤੇ ਫਿਰ ਕੁਝ ਤਰਕਯੁਕਤ ਜਾਂ ਸਪਸ਼ਟ ਐਲਗੋਰਿਦਮ ਲਾਗੂ ਕਰਦੀਆਂ ਹਨ। +* ਭਵਿੱਖ ਵਿੱਚ, ਅਸੀਂ ਇੱਕ ਪੂਰਨ ਨਿਊਰਲ-ਆਧਾਰਿਤ ਮਾਡਲ ਦੀ ਉਮੀਦ ਕਰ ਸਕਦੇ ਹਾਂ ਜੋ ਗੱਲਬਾਤ ਨੂੰ ਖੁਦ ਸੰਭਾਲੇ। ਹਾਲੀਆ GPT ਅਤੇ [ਟਿਊਰਿੰਗ-NLG](https://www.microsoft.com/research/blog/turing-nlg-a-17-billion-parameter-language-model-by-microsoft) ਪ੍ਰਬੰਧਕ ਨਿਊਰਲ ਨੈੱਟਵਰਕਾਂ ਨੇ ਇਸ ਵਿੱਚ ਵੱਡੀ ਸਫਲਤਾ ਦਿਖਾਈ ਹੈ। -**ਟਾਪ-ਡਾਊਨ ਪਹੁੰਚ** ਵਿੱਚ, ਅਸੀਂ ਆਪਣੇ ਤਰਕ ਨੂੰ ਮਾਡਲ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਦੇ ਹਾਂ। ਕਿਉਂਕਿ ਜਦੋਂ ਅਸੀਂ ਤਰਕ ਕਰਦੇ ਹਾਂ ਤਾਂ ਅਸੀਂ ਆਪਣੇ ਵਿਚਾਰਾਂ ਦੀ ਪਾਲਣਾ ਕਰ ਸਕਦੇ ਹਾਂ, ਅਸੀਂ ਇਸ ਪ੍ਰਕਿਰਿਆ ਨੂੰ ਰਸਮੀ ਬਣਾਉਣ ਅਤੇ ਇਸਨੂੰ ਕੰਪਿਊਟਰ ਦੇ ਅੰਦਰ ਪ੍ਰੋਗਰਾਮ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰ ਸਕਦੇ ਹਾਂ। ਇਸਨੂੰ **ਸੰਕੇਤਕ ਤਰਕ** ਕਿਹਾ ਜਾਂਦਾ ਹੈ। +ਟਿਊਰਿੰਗ ਟੈਸਟ ਦੀ ਵਿਕਾਸ ਯਾਤਰਾ -ਲੋਕਾਂ ਦੇ ਸਿਰ ਵਿੱਚ ਕੁਝ ਨਿਯਮ ਹੁੰਦੇ ਹਨ ਜੋ ਉਨ੍ਹਾਂ ਦੇ ਫੈਸਲੇ ਕਰਨ ਦੇ ਤਰੀਕਿਆਂ ਨੂੰ ਮਾਰਗਦਰਸ਼ਨ ਕਰਦੇ ਹਨ। ਉਦਾਹਰਨ ਵਜੋਂ, ਜਦੋਂ ਇੱਕ ਡਾਕਟਰ ਮਰੀਜ਼ ਦੀ ਰੋਗ-ਨਿਰਧਾਰਨ ਕਰ ਰਿਹਾ ਹੁੰਦਾ ਹੈ, ਤਾਂ ਉਹ ਅਹਿਸਾਸ ਕਰ ਸਕਦਾ ਹੈ ਕਿ ਵਿਅਕਤੀ ਨੂੰ ਬੁਖਾਰ ਹੈ, ਅਤੇ ਇਸ ਲਈ ਸਰੀਰ ਦੇ ਅੰਦਰ ਕੁਝ ਸੂਜਨ ਹੋ ਸਕਦੀ ਹੈ। ਨਿਯਮਾਂ ਦੇ ਇੱਕ ਵੱਡੇ ਸੈੱਟ ਨੂੰ ਇੱਕ ਵਿਸ਼ੇਸ਼ ਸਮੱਸਿਆ 'ਤੇ ਲਾਗੂ ਕਰਕੇ ਡਾਕਟਰ ਅੰਤਿਮ ਰੋਗ-ਨਿਰਧਾਰਨ ਦੇ ਨਾਲ ਆ ਸਕਦਾ ਹੈ। -ਇਹ ਪਹੁੰਚ **ਗਿਆਨ ਪ੍ਰਸਤੁਤੀ** ਅਤੇ **ਤਰਕ** 'ਤੇ ਬਹੁਤ ਜ਼ਿਆਦਾ ਨਿਰਭਰ ਕਰਦੀ ਹੈ। ਇੱਕ ਮਨੁੱਖੀ ਵਿਸ਼ੇਸ਼ਜਨ ਤੋਂ ਗਿਆਨ ਕੱਢਣਾ ਸਭ ਤੋਂ ਮੁਸ਼ਕਲ ਹਿੱਸਾ ਹੋ ਸਕਦਾ ਹੈ, ਕਿਉਂਕਿ ਬਹੁਤ ਸਾਰੇ ਮਾਮਲਿਆਂ ਵਿੱਚ ਡਾਕਟਰ ਨੂੰ ਪਤਾ ਨਹੀਂ ਹੁੰਦਾ ਕਿ ਉਹ ਕਿਸੇ ਵਿਸ਼ੇਸ਼ ਰੋਗ-ਨਿਰਧਾਰਨ ਦੇ ਨਾਲ ਕਿਉਂ ਆ ਰਿਹਾ ਹੈ। ਕਈ ਵਾਰ ਹੱਲ ਸਿਰਫ਼ ਉਸ ਦੇ ਸਿਰ ਵਿੱਚ ਆ ਜਾਂ -> ਚਿੱਤਰ ਦਿਮਿਤਰੀ ਸੋਸ਼ਨਿਕੋਵ ਦੁਆਰਾ, [ਫੋਟੋ](https://unsplash.com/photos/r8LmVbUKgns) ਮਰੀਨਾ ਅਬਰੋਸਿਮੋਵਾ ਦੁਆਰਾ [Marina Abrosimova](https://unsplash.com/@abrosimova_marina_foto), Unsplash +> Dimitry Soshnikov ਵੱਲੋਂ ਚਿੱਤਰ, [ਫੋਟੋ](https://unsplash.com/photos/r8LmVbUKgns) [Marina Abrosimova](https://unsplash.com/@abrosimova_marina_foto) ਵਲੋਂ, Unsplash -## ਹਾਲੀਆ AI ਖੋਜ +## ਹਾਲੀਆ ਏਆਈ ਖੋਜ -ਨਿਊਰਲ ਨੈਟਵਰਕ ਖੋਜ ਵਿੱਚ ਹਾਲੀਆ ਵੱਡੀ ਵਾਧਾ 2010 ਦੇ ਆਸਪਾਸ ਸ਼ੁਰੂ ਹੋਇਆ, ਜਦੋਂ ਵੱਡੇ ਜਨਤਕ ਡੇਟਾਸੈਟ ਉਪਲਬਧ ਹੋਣ ਲੱਗੇ। ਚਿੱਤਰਾਂ ਦਾ ਇੱਕ ਵੱਡਾ ਸੰਗ੍ਰਹਿ [ImageNet](https://en.wikipedia.org/wiki/ImageNet), ਜਿਸ ਵਿੱਚ ਲਗਭਗ 14 ਮਿਲੀਅਨ ਐਨੋਟੇਟ ਚਿੱਤਰ ਹਨ, ਨੇ [ImageNet Large Scale Visual Recognition Challenge](https://image-net.org/challenges/LSVRC/) ਨੂੰ ਜਨਮ ਦਿੱਤਾ। +ਨਿਊਰਲ ਨੈੱਟਵਰਕ ਖੋਜ ਵਿੱਚ ਵੱਡਾ ਵਿਕਾਸ ਲਗਭਗ 2010 ਵਿੱਚ ਸ਼ੁਰੂ ਹੋਇਆ, ਜਦ ਵੱਡੇ ਪਬਲਿਕ ਡੇਟਾ ਸੈੱਟ ਉਪਲੱਬਧ ਹੋਣ ਲੱਗੇ। ਇੱਕ ਵੱਡਾ ਚਿੱਤਰਾਂ ਦਾ ਸੰਗ੍ਰਹਿ ਜਿਸਨੂੰ [ImageNet](https://en.wikipedia.org/wiki/ImageNet) ਕਿਹਾ ਜਾਂਦਾ ਹੈ, ਜੋ ਲਗਭਗ 14 ਮਿਲੀਅਨ ਐਨੋਟੇਟ ਕੀਤੇ ਚਿੱਤਰਾਂ ਦਾ ਸਮੂਹ ਹੈ, [ImageNet Large Scale Visual Recognition Challenge](https://image-net.org/challenges/LSVRC/) ਨੂੰ ਜਨਮ ਦਿੱਤਾ। ![ILSVRC Accuracy](../../../../lessons/1-Intro/images/ilsvrc.gif) -> ਚਿੱਤਰ [ਦਿਮਿਤਰੀ ਸੋਸ਼ਨਿਕੋਵ](http://soshnikov.com) ਦੁਆਰਾ +> [Dmitry Soshnikov](http://soshnikov.com) ਵੱਲੋਂ ਚਿੱਤਰ -2012 ਵਿੱਚ, [Convolutional Neural Networks](../4-ComputerVision/07-ConvNets/README.md) ਨੂੰ ਪਹਿਲੀ ਵਾਰ ਚਿੱਤਰ ਵਰਗੀਕਰਨ ਵਿੱਚ ਵਰਤਿਆ ਗਿਆ, ਜਿਸ ਨਾਲ ਵਰਗੀਕਰਨ ਗਲਤੀਆਂ ਵਿੱਚ ਮਹੱਤਵਪੂਰਨ ਕਮੀ ਆਈ (ਲਗਭਗ 30% ਤੋਂ 16.4% ਤੱਕ)। 2015 ਵਿੱਚ, ਮਾਈਕਰੋਸਾਫਟ ਰਿਸਰਚ ਦੀ ResNet ਆਰਕੀਟੈਕਚਰ ਨੇ [ਮਨੁੱਖੀ-ਸਤਰ ਦੀ ਸ਼ੁੱਧਤਾ ਹਾਸਲ ਕੀਤੀ](https://doi.org/10.1109/ICCV.2015.123)। +2012 ਵਿੱਚ, [Convolutional Neural Networks](../4-ComputerVision/07-ConvNets/README.md) ਪਹਿਲੀ ਵਾਰ ਚਿੱਤਰ ਵਰਗੀਕਰਨ ਵਿੱਚ ਵਰਤੇ ਗਏ, ਜਿਸ ਨਾਲ ਵਰਗੀਕਰਨ ਦੀਆਂ ਗਲਤੀਆਂ ਵਿੱਚ ਕਾਫੀ ਘਟੋਤਰੀ ਆਈ (ਲਗਭਗ 30% ਤੋਂ 16.4% ਤੱਕ)। 2015 ਵਿੱਚ, Microsoft ਖੋਜ ਦੀ ResNet ਆਰਕੀਟੈਕਚਰ ਨੇ [ਮਾਨਵ-ਸਤਰ ਦੀ ਸ਼ੁੱਧਤਾ] (https://doi.org/10.1109/ICCV.2015.123) ਹਾਸਲ ਕੀਤੀ। -ਤਦ ਤੋਂ, ਨਿਊਰਲ ਨੈਟਵਰਕ ਨੇ ਕਈ ਕੰਮਾਂ ਵਿੱਚ ਬਹੁਤ ਸਫਲ ਵਿਹਾਰ ਦਿਖਾਇਆ ਹੈ: +ਉਸ ਤੋਂ ਬਾਅਦ, ਨਿਊਰਲ ਨੈੱਟਵਰਕਾਂ ਨੇ ਕਈ ਕੰਮਾਂ ਵਿੱਚ ਬਹੁਤ ਸਫਲਤਾ ਦਰਸਾਈ: --- -ਸਾਲ | ਮਨੁੱਖੀ ਸਮਰੱਥਾ ਹਾਸਲ ਕੀਤੀ +ਸਾਲ | ਮਾਨਵ ਸਮਾਨਤਾ ਪ੍ਰਾਪਤ -----|-------- 2015 | [ਚਿੱਤਰ ਵਰਗੀਕਰਨ](https://doi.org/10.1109/ICCV.2015.123) -2016 | [ਵਾਤਚੀਤ ਵਾਲੀ ਬੋਲਚਾਲ ਦੀ ਪਛਾਣ](https://arxiv.org/abs/1610.05256) +2016 | [ਗੱਲਬਾਤੀ ਸਪੀਚ ਰਿਕੱਗਨਿਸ਼ਨ](https://arxiv.org/abs/1610.05256) 2018 | [ਆਟੋਮੈਟਿਕ ਮਸ਼ੀਨ ਅਨੁਵਾਦ](https://arxiv.org/abs/1803.05567) (ਚੀਨੀ ਤੋਂ ਅੰਗਰੇਜ਼ੀ) -2020 | [ਚਿੱਤਰ ਕੈਪਸ਼ਨਿੰਗ](https://arxiv.org/abs/2009.13682) +2020 | [ਚਿੱਤਰ ਸਿਰਲੇਖੀਕਰਨ](https://arxiv.org/abs/2009.13682) -ਪਿਛਲੇ ਕੁਝ ਸਾਲਾਂ ਵਿੱਚ, BERT ਅਤੇ GPT-3 ਵਰਗੇ ਵੱਡੇ ਭਾਸ਼ਾ ਮਾਡਲਾਂ ਨਾਲ ਬਹੁਤ ਸਫਲਤਾਵਾਂ ਦੇਖੀਆਂ ਗਈਆਂ ਹਨ। ਇਹ ਜ਼ਿਆਦਾਤਰ ਇਸ ਕਰਕੇ ਹੋਇਆ ਕਿ ਬਹੁਤ ਸਾਰਾ ਆਮ ਟੈਕਸਟ ਡੇਟਾ ਉਪਲਬਧ ਹੈ ਜੋ ਸਾਨੂੰ ਮਾਡਲਾਂ ਨੂੰ ਟੈਕਸਟ ਦੀ ਬਣਤਰ ਅਤੇ ਅਰਥ ਨੂੰ ਕੈਪਚਰ ਕਰਨ ਲਈ ਸਿਖਾਉਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ, ਉਨ੍ਹਾਂ ਨੂੰ ਆਮ ਟੈਕਸਟ ਸੰਗ੍ਰਹਿ 'ਤੇ ਪ੍ਰੀ-ਟ੍ਰੇਨ ਕਰਦਾ ਹੈ, ਅਤੇ ਫਿਰ ਉਨ੍ਹਾਂ ਮਾਡਲਾਂ ਨੂੰ ਹੋਰ ਵਿਸ਼ੇਸ਼ ਕੰਮਾਂ ਲਈ ਮਾਹਰ ਬਣਾਉਂਦਾ ਹੈ। ਅਸੀਂ ਇਸ ਕੋਰਸ ਵਿੱਚ ਬਾਅਦ ਵਿੱਚ [Natural Language Processing](../5-NLP/README.md) ਬਾਰੇ ਹੋਰ ਸਿੱਖਾਂਗੇ। +ਪਿਛਲੇ ਕੁਝ ਸਾਲਾਂ ਵਿੱਚ ਅਸੀਂ ਵੱਡੇ ਭਾਸ਼ਾ ਮਾਡਲਾਂ ਜਿਵੇਂ ਕਿ BERT ਅਤੇ GPT-3 ਦੀਆਂ ਵੱਡੀਆਂ ਕਾਮਯਾਬੀਆਂ ਦੇਖੀਆਂ ਹਨ। ਇਹ ਮੁੱਖ ਤੌਰ ਤੇ ਇਸ ਲਈ ਹੋਇਆ ਕਿਉਂਕਿ ਬਹੁਤ ਸਾਰਾ ਆਮ ਲਿਖਤੀ ਡੇਟਾ ਉਪਲਬਧ ਹੈ ਜੋ ਸਾਨੂੰ ਮਾਡਲਾਂ ਨੂੰ ਟੈਕਸਟਾਂ ਦੀ ਸਰਚਨਾ ਅਤੇ ਅਰਥ ਸਮਝਣ ਲਈ ਪ੍ਰਸ਼ਿਖਿਅਤ ਕਰਨ ਵਿੱਚ ਮਦਦ ਕਰਦਾ ਹੈ, ਜਨਰਲ ਟੈਕਸਟ ਸੰਗ੍ਰਹਿ 'ਤੇ ਪ੍ਰੀ-ਟ੍ਰੇਨ ਕਰਨ ਅਤੇ ਫਿਰ ਉਨ੍ਹਾਂ ਮਾਡਲਾਂ ਨੂੰ ਜ਼ਿਆਦਾ ਵਿਸ਼ੇਸ਼ ਕੰਮਾਂ ਲਈ ਖਾਸ ਬਨਾਉਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਅਸੀਂ ਇਸ ਕੋਰਸ ਦੇ ਅੱਗੇ ਹਿਸਸੇ ਵਿੱਚ [ਨੈਚੁਰਲ ਲੈਂਗਵੇਜ ਪ੍ਰੋਸੈਸਿੰਗ](../5-NLP/README.md) ਬਾਰੇ ਹੋਰ ਸਿੱਖਾਂਗੇ। ## 🚀 ਚੁਣੌਤੀ -ਇੰਟਰਨੈਟ ਦਾ ਦੌਰਾ ਕਰੋ ਅਤੇ ਇਹ ਨਿਰਧਾਰਤ ਕਰੋ ਕਿ ਤੁਹਾਡੇ ਵਿਚਾਰ ਵਿੱਚ, AI ਸਭ ਤੋਂ ਪ੍ਰਭਾਵਸ਼ਾਲੀ ਤਰੀਕੇ ਨਾਲ ਕਿੱਥੇ ਵਰਤਿਆ ਜਾ ਰਿਹਾ ਹੈ। ਕੀ ਇਹ ਕਿਸੇ ਮੈਪਿੰਗ ਐਪ ਵਿੱਚ ਹੈ, ਜਾਂ ਕੋਈ ਬੋਲ-ਤੋਂ-ਟੈਕਸਟ ਸੇਵਾ ਜਾਂ ਕੋਈ ਵੀਡੀਓ ਗੇਮ? ਖੋਜ ਕਰੋ ਕਿ ਇਹ ਸਿਸਟਮ ਕਿਵੇਂ ਬਣਾਇਆ ਗਿਆ ਸੀ। +ਇੰਟਰਨੈਟ 'ਤੇ ਟੂਰ ਕਰੋ ਅਤੇ ਫੈਸਲਾ ਕਰੋ ਕਿ ਤੁਹਾਡੇ ਵਿਚਾਰ ਵਿੱਚ ਏਆਈ ਸਭ ਤੋਂ ਪ੍ਰਭਾਵਸ਼ਾਲੀ ਤੌਰ 'ਤੇ ਕਿੱਥੇ ਵਰਤੀ ਜਾ ਰਹੀ ਹੈ। ਕੀ ਇਹ ਮੈਪਿੰਗ ਐਪ ਵਿੱਚ ਹੈ, ਜਾਂ ਕਿਸੇ ਸਪੀਚ-ਟੂ-ਟੈਕਸਟ ਸੇਵਾ ਵਿੱਚ ਜਾਂ ਕਿਸੇ ਵੀਡੀਓ ਗੇਮ ਵਿੱਚ? ਸੋਧ ਕਰੋ ਕਿ ਸਿਸਟਮ ਕਿਵੇਂ ਬਣਾਇਆ ਗਿਆ ਸੀ। ## [ਪੋਸਟ-ਲੈਕਚਰ ਕਵਿਜ਼](https://ff-quizzes.netlify.app/en/ai/quiz/2) -## ਸਮੀਖਾ ਅਤੇ ਸਵੈ ਅਧਿਐਨ +## ਸਮੀਖਿਆ ਅਤੇ ਸਵੈ ਅਧਿਐਨ -AI ਅਤੇ ML ਦੇ ਇਤਿਹਾਸ ਦੀ ਸਮੀਖਾ ਕਰੋ [ਇਸ ਪਾਠ](https://github.com/microsoft/ML-For-Beginners/tree/main/1-Introduction/2-history-of-ML) ਨੂੰ ਪੜ੍ਹ ਕੇ। ਉਸ ਪਾਠ ਜਾਂ ਇਸ ਪਾਠ ਦੇ ਸਿਖੇਚਿੱਤਰ ਦੇ ਸਿਖਰ ਤੋਂ ਇੱਕ ਤੱਤ ਲਓ ਅਤੇ ਇਸ ਦੇ ਵਿਕਾਸ ਨੂੰ ਜਾਣਨ ਲਈ ਇਸ ਨੂੰ ਹੋਰ ਗਹਿਰਾਈ ਵਿੱਚ ਖੋਜੋ। +[ਇਸ ਪਾਠ](https://github.com/microsoft/ML-For-Beginners/tree/main/1-Introduction/2-history-of-ML) ਨੂੰ ਪੜ੍ਹ ਕੇ ਏਆਈ ਅਤੇ ਐਮਐਲ ਦਾ ਇਤਿਹਾਸ ਸਮਝੋ। ਉਸ ਪਾਠ ਜਾਂ ਇਸ ਪਾਠ ਦੇ sketchnote ਵਿੱਚੋਂ ਕੋਈ ਇੱਕ ਤੱਤ ਚੁਣੋ ਅਤੇ ਉਸ ਦੀ ਗਹਿਰਾਈ ਵਿੱਚ ਖੋਜ ਕਰੋ ਤਾਂ ਜੋ ਇਸ ਦੇ ਵਿਕਾਸ ਦੇ ਸੱਭਿਆਚਾਰਕ ਸੰਦਰਭ ਨੂੰ ਸਮਝਿਆ ਜਾ ਸਕੇ। -**ਅਸਾਈਨਮੈਂਟ**: [Game Jam](assignment.md) +**ਅਸਾਈਨਮਿੰਟ**: [ਗੇਮ ਜੈਮ](assignment.md) --- -**ਅਸਵੀਕਰਤੀ**: -ਇਹ ਦਸਤਾਵੇਜ਼ AI ਅਨੁਵਾਦ ਸੇਵਾ [Co-op Translator](https://github.com/Azure/co-op-translator) ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਅਨੁਵਾਦ ਕੀਤਾ ਗਿਆ ਹੈ। ਜਦੋਂ ਕਿ ਅਸੀਂ ਸਹੀ ਹੋਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਦੇ ਹਾਂ, ਕਿਰਪਾ ਕਰਕੇ ਧਿਆਨ ਦਿਓ ਕਿ ਸਵੈਚਾਲਿਤ ਅਨੁਵਾਦਾਂ ਵਿੱਚ ਗਲਤੀਆਂ ਜਾਂ ਅਸੁੱਤੀਆਂ ਹੋ ਸਕਦੀਆਂ ਹਨ। ਮੂਲ ਦਸਤਾਵੇਜ਼ ਨੂੰ ਇਸਦੀ ਮੂਲ ਭਾਸ਼ਾ ਵਿੱਚ ਅਧਿਕਾਰਤ ਸਰੋਤ ਮੰਨਿਆ ਜਾਣਾ ਚਾਹੀਦਾ ਹੈ। ਮਹੱਤਵਪੂਰਨ ਜਾਣਕਾਰੀ ਲਈ, ਪੇਸ਼ੇਵਰ ਮਨੁੱਖੀ ਅਨੁਵਾਦ ਦੀ ਸਿਫਾਰਸ਼ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਇਸ ਅਨੁਵਾਦ ਦੀ ਵਰਤੋਂ ਤੋਂ ਪੈਦਾ ਹੋਣ ਵਾਲੇ ਕਿਸੇ ਵੀ ਗਲਤਫਹਿਮੀ ਜਾਂ ਗਲਤ ਵਿਆਖਿਆ ਲਈ ਅਸੀਂ ਜ਼ਿੰਮੇਵਾਰ ਨਹੀਂ ਹਾਂ। +**ਅਸਵੀਕਾਰੋਪਣ**: +ਇਸ ਦਸਤਾਵੇਜ਼ ਦਾ ਅਨੁਵਾਦ ਏਆਈ ਅਨੁਵਾਦ ਸੇਵਾ [Co-op Translator](https://github.com/Azure/co-op-translator) ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਕੀਤਾ ਗਿਆ ਹੈ। ਜਦੋਂ ਕਿ ਅਸੀਂ ਸਹੀਤਾਵਾਂ ਲਈ ਯਤਨਸ਼ੀਲ ਹਾਂ, ਕਿਰਪਾ ਕਰਕੇ ਧਿਆਨ ਰੱਖੋ ਕਿ ਸਵੈਚਾਲਿਤ ਅਨੁਵਾਦਾਂ ਵਿੱਚ ਗਲਤੀਆਂ ਜਾਂ ਅਸਮੱਤਿਆਵਾਂ ਹੋ ਸਕਦੀਆਂ ਹਨ। ਮੂਲ ਦਸਤਾਵੇਜ਼ ਆਪਣੀ ਮੂਲ ਭਾਸ਼ਾ ਵਿੱਚ ਅਧਿਕਾਰਕ ਸਰੋਤ ਮੰਨਿਆ ਜਾਣਾ ਚਾਹੀਦਾ ਹੈ। ਜਰੂਰੀ ਜਾਣਕਾਰੀ ਲਈ, ਪੇਸ਼ੇਵਰ ਮਨੁੱਖੀ ਅਨੁਵਾਦ ਦੀ ਸਿਫ਼ਾਰਸ਼ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਅਸੀਂ ਇਸ ਅਨੁਵਾਦ ਦੇ ਉਪਯੋਗ ਤੋਂ ਪੈਦਾ ਹੋਣ ਵਾਲੀਆਂ ਕਿਸੇ ਵੀ ਗਲਤਫਹਿਮੀਆਂ ਜਾਂ ਗਲਤ ਵਿਆਖਿਆਵਾਂ ਲਈ ਜਵਾਬਦੇਹ ਨਹੀਂ ਹਾਂ। \ No newline at end of file diff --git a/translations/pa/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/pa/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index 98de07c86e..19f3a3b13c 100644 --- a/translations/pa/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/pa/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -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" ] }, { @@ -333,13 +333,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## ਡਾਟਾਸੇਟ ਲੋਡ ਕਰਨਾ\n", + "## ਡੇਟਾਸੈੱਟ ਲੋਡ ਕਰਨਾ\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` namespace ਵਿੱਚ ਉਪਲਬਧ ਹਨ, ਅਤੇ ਇੰਟਰਨੈੱਟ 'ਤੇ ਹੋਰ ਵੀ ਬਹੁਤ ਸਾਰੇ ਮਾਡਲ ਮਿਲ ਸਕਦੇ ਹਨ। ਚੱਲੋ ਵੇਖੀਏ ਕਿ ਸਭ ਤੋਂ ਸਧਾਰਣ 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,20 +520,17 @@ "cell_type": "markdown", "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" + "ਇੱਥੇ ਕੁਝ ਮੁੱਖ ਗੱਲਾਂ ਹਨ:\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", + "## ਜੀਪਿਯੂ ਕਮਪਿਊਟੇਸ਼ਨ\n", "\n", - "ਡੀਪ ਨਿਊਰਲ ਨੈਟਵਰਕ, ਜਿਵੇਂ ਕਿ VGG-16 ਅਤੇ ਹੋਰ ਆਧੁਨਿਕ ਆਰਕੀਟੈਕਚਰ, ਚਲਾਉਣ ਲਈ ਕਾਫੀ ਜ਼ਿਆਦਾ ਗਣਨਾਤਮਕ ਤਾਕਤ ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ। ਜੇ GPU ਐਕਸਲੇਰੇਸ਼ਨ ਉਪਲਬਧ ਹੈ, ਤਾਂ ਇਸਦਾ ਉਪਯੋਗ ਕਰਨਾ ਸਮਝਦਾਰ ਹੈ। ਖੁਸ਼ਕਿਸਮਤੀ ਨਾਲ, ਜੇ GPU ਉਪਲਬਧ ਹੈ, ਤਾਂ Keras ਆਪਣੇ ਆਪ GPU 'ਤੇ ਗਣਨਾਵਾਂ ਨੂੰ ਤੇਜ਼ ਕਰ ਦਿੰਦਾ ਹੈ। ਅਸੀਂ ਹੇਠਾਂ ਦਿੱਤੇ ਕੋਡ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਜਾਂਚ ਸਕਦੇ ਹਾਂ ਕਿ Tensorflow GPU ਦੀ ਵਰਤੋਂ ਕਰਨ ਦੇ ਯੋਗ ਹੈ ਜਾਂ ਨਹੀਂ:\n" + "ਡੀਪ ਨਿਊਰਲ ਨੈੱਟਵਰਕ, ਜਿਵੇਂ ਕਿ VGG-16 ਅਤੇ ਹੋਰ ਆਧੁਨਿਕ ਆਰਕੀਟੈਕਚਰਜ਼ ਨੂੰ ਚਲਾਉਣ ਲਈ ਕਾਫੀ ਗਣਨਾਤਮਕ ਤਾਕਤ ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ। ਜੇਕਰ ਮੌਜੂਦ ਹੋਵੇ ਤਾਂ GPU ਤੀਵਰਤਾ ਦੀ ਵਰਤੋਂ ਕਰਨੀ ਸਮਝਦਾਰੀ ਹੈ। ਖੁਸ਼ਕਿਸਮਤੀ ਨਾਲ, Keras ਜੀਪਿਯੂ ਉੱਤੇ ਸਵੈਚਾਲਿਤ ਤਰੀਕੇ ਨਾਲ ਗਣਨਾਵਾਂ ਨੂੰ ਤੇਜ਼ ਕਰ ਦਿੰਦਾ ਹੈ ਜੇਕਰ ਇਹ ਉਪਲਬਧ ਹੋਵੇ। ਅਸੀਂ ਹੇਠਾਂ ਦਿੱਤੇ ਕੋਡ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਵੇਖ ਸਕਦੇ ਹਾਂ ਕਿ Tensorflow ਜੀਪਿਯੂ ਦੀ ਵਰਤੋਂ ਕਰਨ ਯੋਗ ਹੈ ਜਾਂ ਨਹੀਂ:\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 ਹੈ, ਪਰ ਇਸਨੂੰ ਦ੍ਰਿਸ਼ਟੀਗੋਚਰ ਬਣਾਉਣ ਲਈ ਸਾਨੂੰ ਇਸਨੂੰ 2D ਰੂਪ ਵਿੱਚ ਰੀਸ਼ੇਪ ਕਰਨਾ ਪਿਆ।\n", + "ਫੀਚਰ ਟੈਂਸਰ ਦਾ ਮਾਪ 7x7x512 ਹੈ, ਪਰ ਇਸਨੂੰ ਵਿਜ਼ੁਆਲਾਈਜ਼ ਕਰਨ ਲਈ ਸਾਨੂੰ ਇਸਨੂੰ 2D ਰੂਪ ਵਿੱਚ ਦੁਬਾਰਾ ਧਾਂਚਾਬੱਧ ਕਰਨਾ ਪਿਆ।\n", "\n", - "ਹੁਣ ਆਓ ਦੇਖੀਏ ਕਿ ਕੀ ਇਹ ਫੀਚਰ ਤਸਵੀਰਾਂ ਨੂੰ ਵਰਗੀਕ੍ਰਿਤ ਕਰਨ ਲਈ ਵਰਤੇ ਜਾ ਸਕਦੇ ਹਨ। ਆਓ ਹੱਥੋਂ ਹੱਥ ਕੁਝ ਤਸਵੀਰਾਂ ਦਾ ਹਿੱਸਾ ਲਵਾਂ (ਸਾਡੇ ਕੇਸ ਵਿੱਚ 50 ਮਿਨੀਬੈਚ), ਅਤੇ ਉਨ੍ਹਾਂ ਦੇ ਫੀਚਰ ਵੇਕਟਰ ਪਹਿਲਾਂ ਹੀ ਗਣਨਾ ਕਰ ਲਈਏ। ਅਸੀਂ ਇਸ ਲਈ Tensorflow ਦੀ **ਡਾਟਾਸੈਟ** API ਵਰਤ ਸਕਦੇ ਹਾਂ। `map` ਫੰਕਸ਼ਨ ਇੱਕ ਡਾਟਾਸੈਟ ਲੈਂਦਾ ਹੈ ਅਤੇ ਦਿੱਤੀ ਗਈ ਲੈਂਬਡਾ-ਫੰਕਸ਼ਨ ਨੂੰ ਲਾਗੂ ਕਰਕੇ ਇਸਨੂੰ ਬਦਲਦਾ ਹੈ। ਅਸੀਂ ਇਸ ਮਕੈਨਿਜ਼ਮ ਨੂੰ ਨਵੇਂ ਡਾਟਾਸੈਟ ਬਣਾਉਣ ਲਈ ਵਰਤਦੇ ਹਾਂ, `ds_features_train` ਅਤੇ `ds_features_test`, ਜੋ ਮੂਲ ਤਸਵੀਰਾਂ ਦੀ ਥਾਂ VGG ਤੋਂ ਨਿਕਲੇ ਫੀਚਰ ਸ਼ਾਮਲ ਕਰਦੇ ਹਨ।\n" + "ਹੁਣ ਆਓ ਦੇਖੀਏ ਕਿ ਕੀ ਇਹ ਫੀਚਰ ਤਸਵੀਰਾਂ ਦੀ ਵਰਗੀਕਰਨ ਲਈ ਵਰਤੇ ਜਾ ਸਕਦੇ ਹਨ। ਚਲੋ ਹੱਥੋਂ ਕੁਝ ਹਿੱਸਾ ਤਸਵੀਰਾਂ ਦਾ ਲਈਏ (ਸਾਡੀ ਹਾਲਤ ਵਿੱਚ 50 ਮਿਨੀਬੈਚ), ਅਤੇ ਉਹਨਾਂ ਦੇ ਫੀਚਰ ਵੇਕਟਰ ਪਹਿਲਾਂ ਹੀ ਗਣਨਾ ਕਰ ਲਈਏ। ਅਸੀਂ ਇਹ ਕੰਮ ਟੈਂਸਰਫ਼ਲੋ **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", + "## ਇੱਕ 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": [ - "ਇਹ ਮਾਡਲ ਇੱਕ end-to-end ਕਲਾਸੀਫਿਕੇਸ਼ਨ ਨੈਟਵਰਕ ਵਾਂਗ ਦਿਖਾਈ ਦਿੰਦਾ ਹੈ, ਜੋ ਇੱਕ ਚਿੱਤਰ ਲੈਂਦਾ ਹੈ ਅਤੇ ਕਲਾਸ ਵਾਪਸ ਕਰਦਾ ਹੈ। ਹਾਲਾਂਕਿ, ਮੁਸ਼ਕਲ ਗੱਲ ਇਹ ਹੈ ਕਿ ਅਸੀਂ VGG16 ਨੂੰ ਇੱਕ ਫੀਚਰ ਐਕਸਟ੍ਰੈਕਟਰ ਵਜੋਂ ਕੰਮ ਕਰਨ ਲਈ ਚਾਹੁੰਦੇ ਹਾਂ, ਅਤੇ ਇਸਨੂੰ ਮੁੜ-ਟ੍ਰੇਨ ਨਹੀਂ ਕਰਨਾ। ਇਸ ਲਈ, ਸਾਨੂੰ **ਕਨਵੋਲੂਸ਼ਨਲ ਫੀਚਰ ਐਕਸਟ੍ਰੈਕਟਰ ਦੇ ਵਜ਼ਨ ਨੂੰ ਫ੍ਰੀਜ਼ ਕਰਨਾ** ਪਵੇਗਾ। ਅਸੀਂ ਨੈਟਵਰਕ ਦੀ ਪਹਿਲੀ ਲੇਅਰ ਤੱਕ `model.layers[0]` ਕਾਲ ਕਰਕੇ ਪਹੁੰਚ ਸਕਦੇ ਹਾਂ, ਅਤੇ ਸਾਨੂੰ ਸਿਰਫ `trainable` ਪ੍ਰਾਪਰਟੀ ਨੂੰ `False` ਸੈਟ ਕਰਨ ਦੀ ਲੋੜ ਹੈ।\n", + "ਇਹ ਮਾਡਲ ਇੱਕ ਐਂਡ-ਟੂ-ਐਂਡ ਵਰਗੀਕਰਨ ਨੈੱਟਵਰਕ ਵਰਗਾ ਦਿਖਦਾ ਹੈ, ਜੋ ਇੱਕ ਚਿੱਤਰ ਲੈਂਦਾ ਹੈ ਅਤੇ ਵਰਗੀ ਵਾਪਸ ਕਰਦਾ ਹੈ। ਹਾਲਾਂਕਿ, ਮੁਸ਼ਕਲ ਗੱਲ ਇਹ ਹੈ ਕਿ ਅਸੀਂ ਚਾਹੁੰਦੇ ਹਾਂ ਕਿ VGG16 ਇੱਕ ਫੀਚਰ ਐਕਸਟ੍ਰੈਕਟਰ ਵਜੋਂ ਕੰਮ ਕਰੇ, ਅਤੇ ਮੁੜ-ਟ੍ਰੇਨ ਨਾ ਕੀਤਾ ਜਾਵੇ। ਇਸ ਲਈ, ਸਾਨੂੰ **ਕਨਵੋਲੂਸ਼ਨਲ ਫੀਚਰ ਐਕਸਟ੍ਰੈਕਟਰ ਦੇ ਭਾਰਆਂ ਨੂੰ ਫ੍ਰੀਜ਼ ਕਰਨ** ਦੀ ਲੋੜ ਹੈ। ਅਸੀਂ ਨੈੱਟਵਰਕ ਦੀ ਪਹਿਲੀ ਪਰਤ ਨੂੰ `model.layers[0]` ਕਾਲ ਕਰਕੇ ਪ੍ਰਾਪਤ ਕਰ ਸਕਦੇ ਹਾਂ, ਅਤੇ ਸਾਨੂੰ ਸਿਰਫ `trainable` ਗੁਣ ਨੂੰ `False` ਤੇ ਸੈੱਟ ਕਰਨਾ ਹੈ।\n", "\n", - "> **Note**: ਫੀਚਰ ਐਕਸਟ੍ਰੈਕਟਰ ਦੇ ਵਜ਼ਨ ਨੂੰ ਫ੍ਰੀਜ਼ ਕਰਨਾ ਜ਼ਰੂਰੀ ਹੈ, ਕਿਉਂਕਿ ਨਹੀਂ ਤਾਂ ਅਣ-ਟ੍ਰੇਨ ਕੀਤੀ ਕਲਾਸੀਫਾਇਰ ਲੇਅਰ ਕਨਵੋਲੂਸ਼ਨਲ ਐਕਸਟ੍ਰੈਕਟਰ ਦੇ ਅਸਲ ਪ੍ਰੀ-ਟ੍ਰੇਨ ਕੀਤੇ ਵਜ਼ਨ ਨੂੰ ਖਰਾਬ ਕਰ ਸਕਦੀ ਹੈ।\n", + "> **ਨੋਟ**: ਫੀਚਰ ਐਕਸਟ੍ਰੈਕਟਰ ਦੇ ਭਾਰਾਂ ਨੂੰ ਫ੍ਰੀਜ਼ ਕਰਨਾ ਜ਼ਰੂਰੀ ਹੈ, ਕਿਉਂਕਿ ਨਹੀਂ ਤਾਂ ਅਣ-ਟ੍ਰੇਨ ਕੀਤੀ ਕਲਾਸੀਫਾਇਰ ਪਰਤ ਮੂਲ ਪੂਰਵ-ਟ੍ਰੇਨ ਕੀਤੇ ਕਨਵੋਲੂਸ਼ਨਲ ਐਕਸਟ੍ਰੈਕਟਰ ਦੇ ਭਾਰਾਂ ਨੂੰ ਨਾਸ਼ ਕਰ ਸਕਦੀ ਹੈ।\n", "\n", - "ਤੁਹਾਨੂੰ ਧਿਆਨ ਦੇਣਾ ਚਾਹੀਦਾ ਹੈ ਕਿ ਜਦੋਂ ਕਿ ਸਾਡੇ ਨੈਟਵਰਕ ਵਿੱਚ ਕੁੱਲ ਪੈਰਾਮੀਟਰਾਂ ਦੀ ਗਿਣਤੀ ਲਗਭਗ 15 ਮਿਲੀਅਨ ਹੈ, ਅਸੀਂ ਸਿਰਫ 25k ਪੈਰਾਮੀਟਰਾਂ ਨੂੰ ਟ੍ਰੇਨ ਕਰ ਰਹੇ ਹਾਂ। ਸਾਰੇ ਹੋਰ ਪੈਰਾਮੀਟਰਾਂ ਉੱਚ-ਸਤਰੀ ਕਨਵੋਲੂਸ਼ਨਲ ਫਿਲਟਰਾਂ ਦੇ ਪ੍ਰੀ-ਟ੍ਰੇਨ ਕੀਤੇ ਗਏ ਹਨ। ਇਹ ਚੰਗਾ ਹੈ, ਕਿਉਂਕਿ ਅਸੀਂ ਘੱਟ ਗਿਣਤੀ ਉਦਾਹਰਣਾਂ ਨਾਲ ਘੱਟ ਗਿਣਤੀ ਪੈਰਾਮੀਟਰਾਂ ਨੂੰ ਫਾਈਨ-ਟਿਊਨ ਕਰਨ ਦੇ ਯੋਗ ਹਾਂ।\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" ] }, { @@ -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", - "ਅਨਫ੍ਰੀਜ਼ ਕਰਨ ਤੋਂ ਬਾਅਦ, ਅਸੀਂ ਕੁਝ ਹੋਰ ਈਪੌਕਸ ਲਈ ਟ੍ਰੇਨਿੰਗ ਕਰ ਸਕਦੇ ਹਾਂ (ਸਾਡੇ ਉਦਾਹਰਨ ਵਿੱਚ, ਅਸੀਂ ਸਿਰਫ ਇੱਕ ਹੀ ਕਰਾਂਗੇ)। ਤੁਸੀਂ ਘੱਟ ਲਰਨਿੰਗ ਰੇਟ ਵੀ ਚੁਣ ਸਕਦੇ ਹੋ, ਤਾਂ ਜੋ ਪ੍ਰੀ-ਟ੍ਰੇਨਡ ਵਜ਼ਨਾਂ 'ਤੇ ਪ੍ਰਭਾਵ ਨੂੰ ਘਟਾਇਆ ਜਾ ਸਕੇ। ਹਾਲਾਂਕਿ, ਘੱਟ ਲਰਨਿੰਗ ਰੇਟ ਦੇ ਨਾਲ ਵੀ, ਤੁਸੀਂ ਟ੍ਰੇਨਿੰਗ ਦੇ ਸ਼ੁਰੂ ਵਿੱਚ ਐਕ੍ਯੂਰੇਸੀ ਵਿੱਚ ਕਮੀ ਦੀ ਉਮੀਦ ਕਰ ਸਕਦੇ ਹੋ, ਜਦੋਂ ਤੱਕ ਕਿ ਇਹ ਆਖ਼ਰਕਾਰ ਫਿਕਸਡ ਵਜ਼ਨਾਂ ਦੇ ਮਾਮਲੇ ਨਾਲੋਂ ਥੋੜ੍ਹਾ ਉੱਚੇ ਪੱਧਰ 'ਤੇ ਨਹੀਂ ਪਹੁੰਚ ਜਾਂਦੀ।\n", + "ਅਨਫ੍ਰੀਜ਼ ਕਰਨ ਤੋਂ ਬਾਅਦ, ਅਸੀਂ ਕੁਝ ਹੋਰ ਇਪੋਚਾਂ ਦੀ ਟ੍ਰੇਨਿੰਗ ਕਰ ਸਕਦੇ ਹਾਂ (ਸਾਡੇ ਉਦਾਹਰਨ ਵਿੱਚ, ਅਸੀਂ ਕੇਵਲ ਇੱਕ ਕਰਾਂਗੇ)। ਤੁਸੀਂ ਘੱਟ ਲਰਨਿੰਗ ਰੇਟ ਵੀ ਚੁਣ ਸਕਦੇ ਹੋ, ਤਾਂ ਜੋ ਪ੍ਰੀ-ਟ੍ਰੇਨ ਕੀਤਿਆਂ ਵਿਟਾਂ 'ਤੇ ਪ੍ਰਭਾਵ ਘੱਟ ਹੋਵੇ। ਫਿਰ ਵੀ, ਘੱਟ ਲਰਨਿੰਗ ਰੇਟ ਨਾਲ ਵੀ, ਤੁਸੀਂ ਟ੍ਰੇਨਿੰਗ ਦੇ ਆਰੰਭ ਵਿੱਚ ਸਹੀਤਾ ਵਿੱਚ ਕਮੀ ਦੀ ਉਮੀਦ ਕਰ ਸਕਦੇ ਹੋ, ਜਦ ਤੱਕ ਕਿ ਅੰਤ ਵਿੱਚ ਫਿਕਸ ਕੀਤਿਆਂ ਵਿਟਾਂ ਵਾਲੇ ਮੁਕਾਬਲੇ ਥੋੜ੍ਹਾ ਜਿਹਾ ਵੱਧ ਪੱਧਰ ਤੇ ਨਾ ਪਹੁੰਚ ਜਾਵੇ।\n", "\n", - "> **Note:** ਇਹ ਟ੍ਰੇਨਿੰਗ ਕਾਫ਼ੀ ਹੌਲੀ ਹੁੰਦੀ ਹੈ, ਕਿਉਂਕਿ ਸਾਨੂੰ ਨੈੱਟਵਰਕ ਦੇ ਕਈ ਲੇਅਰਾਂ ਰਾਹੀਂ ਗ੍ਰੇਡੀਐਂਟਸ ਵਾਪਸ ਪ੍ਰੋਪਾਗੇਟ ਕਰਨ ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ!\n" + "> **ਟਿੱਪਣੀ:** ਇਹ ਟ੍ਰੇਨਿੰਗ ਕਾਫੀ ਹੌਲੀ ਹੁੰਦੀ ਹੈ, ਕਿਉਂਕਿ ਸਾਨੂੰ ਨੈੱਟਵਰਕ ਦੀਆਂ ਕਈ ਪਰਤਾਂ ਵਿੱਚੋਂ ਗ੍ਰੇਡੀਐਂਟ ਵਾਪਸ ਪਸਾਰਨੀਆਂ ਪੈਂਦੀਆਂ ਹਨ!\n" ] }, { @@ -1029,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 ਦੁਆਰਾ ਵਿਕਸਿਤ ਕੀਤੀਆਂ ਗਈਆਂ ਹਨ, ਅਤੇ Google ਦਾ **Inception**। ਉਦਾਹਰਣ ਵਜੋਂ, ਆਓ ਸਭ ਤੋਂ ਸਧਾਰਣ ResNet-50 ਮਾਡਲ ਦੀ ਆਰਕੀਟੈਕਚਰ ਦੀ ਪੜਚੋਲ ਕਰੀਏ (ResNet ਮਾਡਲਾਂ ਦਾ ਇੱਕ ਪਰਿਵਾਰ ਹੈ ਜਿਸ ਵਿੱਚ ਵੱਖ-ਵੱਖ ਡਿਪਥ ਹਨ, ਤੁਸੀਂ ResNet-152 ਨਾਲ ਪ੍ਰਯੋਗ ਕਰ ਸਕਦੇ ਹੋ ਜੇ ਤੁਸੀਂ ਦੇਖਣਾ ਚਾਹੁੰਦੇ ਹੋ ਕਿ ਇੱਕ ਸੱਚਮੁੱਚ ਡੂੰਘਾ ਮਾਡਲ ਕਿਵੇਂ ਲੱਗਦਾ ਹੈ):\n" + "VGG-16 ਸਭ ਤੋਂ ਸਧਾਰਣ ਕੰਪਿютਰ ਵਿਜ਼ਨ ਆਰਕੀਟੈਕਚਰਾਂ ਵਿੱਚੋਂ ਇੱਕ ਹੈ। Keras ਹੋਰ ਬਹੁਤ ਸਾਰੇ ਪਹਿਲਾਂ ਤੋਂ ਸਿੱਖੇ ਹੋਏ ਨੈੱਟਵਰਕ ਪ੍ਰਦਾਨ ਕਰਦਾ ਹੈ। ਉਹਨਾਂ ਵਿੱਚ ਸਭ ਤੋਂ ਜ਼ਿਆਦਾ ਵਰਤੇ ਜਾਣ ਵਾਲੇ **ResNet** ਆਰਕੀਟੈਕਚਰ, ਜੋ Microsoft ਵੱਲੋਂ ਵਿਕਸਤ ਕੀਤੇ ਗਏ ਹਨ, ਅਤੇ **Inception** ਜੋ Google ਵੱਲੋਂ ਬਣਾਇਆ ਗਿਆ ਹੈ, ਹਨ। ਉਦਾਹਰਨ ਵਜੋਂ, ਆਓ ਸਭ ਤੋਂ ਸਧਾਰਣ ResNet-50 ਮਾਡਲ ਦੀ ਆਰਕੀਟੈਕਚਰ ਨੂੰ ਵੇਖੀਏ (ResNet ਮਾਡਲਾਂ ਦਾ ਇੱਕ ਪਰਿਵਾਰ ਹੈ ਜੋ ਵੱਖ-ਵੱਖ ਗਹਿਰਾਈ ਵਾਲੇ ਹਨ, ਜੇ ਤੁਸੀਂ ਇੱਕ ਬਹੁਤ ਹੀ ਡਿੱਗ ਮਾਡਲ ਦੇਖਣਾ ਚਾਹੁੰਦੇ ਹੋ ਤਾਂ ResNet-152 ਨਾਲ ਪ੍ਰਯੋਗ ਕਰ ਸਕਦੇ ਹੋ):\n" ] }, { @@ -1442,29 +1452,29 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "ਜਿਵੇਂ ਤੁਸੀਂ ਦੇਖ ਸਕਦੇ ਹੋ, ਮਾਡਲ ਵਿੱਚ ਉਹੀ ਜਾਣ-ਪਛਾਣ ਵਾਲੇ ਬਿਲਡਿੰਗ ਬਲਾਕ ਹਨ: ਕਨਵੋਲੂਸ਼ਨਲ ਲੇਅਰ, ਪੂਲਿੰਗ ਲੇਅਰ ਅਤੇ ਅੰਤ ਵਿੱਚ ਡੈਂਸ ਕਲਾਸੀਫਾਇਰ। ਅਸੀਂ ਇਸ ਮਾਡਲ ਨੂੰ ਬਿਲਕੁਲ ਉਸੇ ਤਰੀਕੇ ਨਾਲ ਵਰਤ ਸਕਦੇ ਹਾਂ ਜਿਵੇਂ ਅਸੀਂ VGG-16 ਨੂੰ ਟ੍ਰਾਂਸਫਰ ਲਰਨਿੰਗ ਲਈ ਵਰਤ ਰਹੇ ਹਾਂ। ਤੁਸੀਂ ਉਪਰ ਦਿੱਤੇ ਕੋਡ ਨਾਲ ਅਲੱਗ-ਅਲੱਗ ResNet ਮਾਡਲ ਨੂੰ ਬੇਸ ਮਾਡਲ ਵਜੋਂ ਵਰਤ ਕੇ ਅਜ਼ਮਾਉਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰ ਸਕਦੇ ਹੋ ਅਤੇ ਦੇਖ ਸਕਦੇ ਹੋ ਕਿ ਸਹੀਤਾ (accuracy) ਕਿਵੇਂ ਬਦਲਦੀ ਹੈ।\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\n**ਅਸਵੀਕਾਰੋਪਣ**:\nਇਸ ਦਸਤਾਵੇਜ਼ ਦਾ ਅਨੁਵਾਦ ਏਆਈ ਅਨੁਵਾਦ ਸੇਵਾ [Co-op Translator](https://github.com/Azure/co-op-translator) ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਕੀਤਾ ਗਿਆ ਹੈ। ਜਦੋਂ ਕਿ ਅਸੀਂ ਸਹੀਤਾਵਾਂ ਲਈ ਯਤਨਸ਼ੀਲ ਹਾਂ, ਕਿਰਪਾ ਕਰਕੇ ਧਿਆਨ ਰੱਖੋ ਕਿ ਸਵੈਚਾਲਿਤ ਅਨੁਵਾਦਾਂ ਵਿੱਚ ਗਲਤੀਆਂ ਜਾਂ ਅਸਮੱਤਿਆਵਾਂ ਹੋ ਸਕਦੀਆਂ ਹਨ। ਮੂਲ ਦਸਤਾਵੇਜ਼ ਆਪਣੀ ਮੂਲ ਭਾਸ਼ਾ ਵਿੱਚ ਅਧਿਕਾਰਕ ਸਰੋਤ ਮੰਨਿਆ ਜਾਣਾ ਚਾਹੀਦਾ ਹੈ। ਜਰੂਰੀ ਜਾਣਕਾਰੀ ਲਈ, ਪੇਸ਼ੇਵਰ ਮਨੁੱਖੀ ਅਨੁਵਾਦ ਦੀ ਸਿਫ਼ਾਰਸ਼ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਅਸੀਂ ਇਸ ਅਨੁਵਾਦ ਦੇ ਉਪਯੋਗ ਤੋਂ ਪੈਦਾ ਹੋਣ ਵਾਲੀਆਂ ਕਿਸੇ ਵੀ ਗਲਤਫਹਿਮੀਆਂ ਜਾਂ ਗਲਤ ਵਿਆਖਿਆਵਾਂ ਲਈ ਜਵਾਬਦੇਹ ਨਹੀਂ ਹਾਂ।\n\n" ] } ], @@ -1485,12 +1495,6 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" - }, - "coopTranslator": { - "original_hash": "c189abc107848f96051085cc30945129", - "translation_date": "2025-08-28T07:57:52+00:00", - "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", - "language_code": "pa" } }, "nbformat": 4, diff --git a/translations/pa/lessons/5-NLP/README.md b/translations/pa/lessons/5-NLP/README.md index 1f8cc0e510..f2fce7ebb3 100644 --- a/translations/pa/lessons/5-NLP/README.md +++ b/translations/pa/lessons/5-NLP/README.md @@ -1,51 +1,51 @@ -# ਨੈਚਰਲ ਲੈਂਗਵੇਜ ਪ੍ਰੋਸੈਸਿੰਗ +# ਪ੍ਰਾਕ੍ਰਿਤਿਕ ਭਾਸ਼ਾ ਪ੍ਰਕਿਰਿਆ -![NLP ਟਾਸਕਾਂ ਦਾ ਸਾਰ](../../../../translated_images/pa/ai-nlp.b22dcb8ca4707cea.webp) +![NLP ਕਾਰਜਾਂ ਦਾ ਸੰਖੇਪ ਇੱਕ ਡੂਡਲ ਵਿੱਚ](../../../../translated_images/pa/ai-nlp.b22dcb8ca4707cea.webp) -ਇਸ ਸੈਕਸ਼ਨ ਵਿੱਚ, ਅਸੀਂ **ਨੈਚਰਲ ਲੈਂਗਵੇਜ ਪ੍ਰੋਸੈਸਿੰਗ (NLP)** ਨਾਲ ਸੰਬੰਧਿਤ ਟਾਸਕਾਂ ਨੂੰ ਹੱਲ ਕਰਨ ਲਈ ਨਿਊਰਲ ਨੈਟਵਰਕਸ ਦੀ ਵਰਤੋਂ 'ਤੇ ਧਿਆਨ ਦੇਵਾਂਗੇ। ਬਹੁਤ ਸਾਰੇ NLP ਸਮੱਸਿਆਵਾਂ ਹਨ ਜਿਨ੍ਹਾਂ ਨੂੰ ਅਸੀਂ ਚਾਹੁੰਦੇ ਹਾਂ ਕਿ ਕੰਪਿਊਟਰ ਹੱਲ ਕਰ ਸਕਣ: +ਇਸ ਭਾਗ ਵਿੱਚ, ਅਸੀਂ **ਪ੍ਰਾਕ੍ਰਿਤਿਕ ਭਾਸ਼ਾ ਪ੍ਰਕਿਰਿਆ (NLP)** ਨਾਲ ਸੰਬੰਧਤ ਕਾਰਜਾਂ ਨੂੰ ਸੰਭਾਲਣ ਲਈ ਨਿਊਰਲ ਨੈੱਟਵਰਕਾਂ ਦੀ ਵਰਤੋਂ 'ਤੇ ਧਿਆਨ ਕੇਂਦਰਿਤ ਕਰਾਂਗੇ। ਐਸੇ ਬਹੁਤ ਸਾਰੇ NLP ਸਮੱਸਿਆਵਾਂ ਹਨ ਜੋ ਅਸੀਂ ਕਮਪਿਊਟਰਾਂ ਨੂੰ ਹੱਲ ਕਰਨ ਯੋਗ ਬਣਾਉਣਾ ਚਾਹੁੰਦੇ ਹਾਂ: -* **ਟੈਕਸਟ ਕਲਾਸੀਫਿਕੇਸ਼ਨ** ਇੱਕ ਆਮ ਕਲਾਸੀਫਿਕੇਸ਼ਨ ਸਮੱਸਿਆ ਹੈ ਜੋ ਟੈਕਸਟ ਸੀਕਵੈਂਸ ਨਾਲ ਸੰਬੰਧਿਤ ਹੈ। ਉਦਾਹਰਣਾਂ ਵਿੱਚ ਈਮੇਲ ਸੁਨੇਹਿਆਂ ਨੂੰ ਸਪੈਮ ਅਤੇ ਨੋ-ਸਪੈਮ ਵਜੋਂ ਕਲਾਸੀਫਾਈ ਕਰਨਾ, ਜਾਂ ਲੇਖਾਂ ਨੂੰ ਖੇਡ, ਕਾਰੋਬਾਰ, ਰਾਜਨੀਤੀ ਆਦਿ ਵਜੋਂ ਸ਼੍ਰੇਣੀਬੱਧ ਕਰਨਾ ਸ਼ਾਮਲ ਹੈ। ਇਸ ਤੋਂ ਇਲਾਵਾ, ਜਦੋਂ ਅਸੀਂ ਚੈਟ ਬੋਟਸ ਵਿਕਸਿਤ ਕਰਦੇ ਹਾਂ, ਤਾਂ ਅਕਸਰ ਸਾਨੂੰ ਸਮਝਣ ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ ਕਿ ਉਪਭੋਗਤਾ ਕੀ ਕਹਿਣਾ ਚਾਹੁੰਦਾ ਹੈ—ਇਸ ਮਾਮਲੇ ਵਿੱਚ ਅਸੀਂ **ਇੰਟੈਂਟ ਕਲਾਸੀਫਿਕੇਸ਼ਨ** ਨਾਲ ਨਜਿੱਠ ਰਹੇ ਹਾਂ। ਅਕਸਰ, ਇੰਟੈਂਟ ਕਲਾਸੀਫਿਕੇਸ਼ਨ ਵਿੱਚ ਸਾਨੂੰ ਕਈ ਸ਼੍ਰੇਣੀਆਂ ਨਾਲ ਨਜਿੱਠਣਾ ਪੈਂਦਾ ਹੈ। -* **ਸੈਂਟੀਮੈਂਟ ਵਿਸ਼ਲੇਸ਼ਣ** ਇੱਕ ਆਮ ਰਿਗ੍ਰੈਸ਼ਨ ਸਮੱਸਿਆ ਹੈ, ਜਿੱਥੇ ਸਾਨੂੰ ਇੱਕ ਗਿਣਤੀ (ਸੈਂਟੀਮੈਂਟ) ਨੂੰ ਜੁੜਨਾ ਪੈਂਦਾ ਹੈ ਜੋ ਵਾਕ ਦੇ ਅਰਥ ਦੇ ਕਿੰਨੇ ਸਕਾਰਾਤਮਕ/ਨਕਾਰਾਤਮਕ ਹੋਣ ਨੂੰ ਦਰਸਾਉਂਦਾ ਹੈ। ਸੈਂਟੀਮੈਂਟ ਵਿਸ਼ਲੇਸ਼ਣ ਦਾ ਇੱਕ ਹੋਰ ਉੱਚਤਮ ਸੰਸਕਰਣ **ਐਸਪੈਕਟ-ਅਧਾਰਿਤ ਸੈਂਟੀਮੈਂਟ ਵਿਸ਼ਲੇਸ਼ਣ** (ABSA) ਹੈ, ਜਿੱਥੇ ਸਾਨੂੰ ਸੈਂਟੀਮੈਂਟ ਨੂੰ ਪੂਰੇ ਵਾਕ ਨਾਲ ਨਹੀਂ, ਸਗੋਂ ਇਸਦੇ ਵੱਖ-ਵੱਖ ਹਿੱਸਿਆਂ (ਐਸਪੈਕਟਸ) ਨਾਲ ਜੋੜਨਾ ਹੁੰਦਾ ਹੈ, ਜਿਵੇਂ ਕਿ *ਇਸ ਰੈਸਟੋਰੈਂਟ ਵਿੱਚ, ਮੈਨੂੰ ਖਾਣਾ ਪਸੰਦ ਆਇਆ, ਪਰ ਮਾਹੌਲ ਬਹੁਤ ਖਰਾਬ ਸੀ*। -* **ਨਾਮਤ ਐਨਟੀਟੀ ਪਛਾਣ** (NER) ਟੈਕਸਟ ਵਿੱਚ ਕੁਝ ਐਨਟੀਟੀਆਂ ਨੂੰ ਕੱਢਣ ਦੀ ਸਮੱਸਿਆ ਨੂੰ ਦਰਸਾਉਂਦਾ ਹੈ। ਉਦਾਹਰਣ ਲਈ, ਸਾਨੂੰ ਇਹ ਸਮਝਣ ਦੀ ਲੋੜ ਹੋ ਸਕਦੀ ਹੈ ਕਿ *ਮੈਨੂੰ ਕੱਲ੍ਹ ਪੈਰਿਸ ਜਾਣਾ ਹੈ* ਵਾਕ ਵਿੱਚ *ਕੱਲ੍ਹ* DATE ਨੂੰ ਦਰਸਾਉਂਦਾ ਹੈ, ਅਤੇ *ਪੈਰਿਸ* LOCATION ਹੈ। -* **ਕੀਵਰਡ ਕੱਢਣਾ** NER ਦੇ ਸਮਾਨ ਹੈ, ਪਰ ਸਾਨੂੰ ਵਾਕ ਦੇ ਅਰਥ ਲਈ ਮਹੱਤਵਪੂਰਨ ਸ਼ਬਦਾਂ ਨੂੰ ਆਪਣੇ ਆਪ ਕੱਢਣਾ ਹੁੰਦਾ ਹੈ, ਬਿਨਾਂ ਕਿਸੇ ਖਾਸ ਐਨਟੀਟੀ ਕਿਸਮਾਂ ਲਈ ਪ੍ਰੀ-ਟ੍ਰੇਨਿੰਗ ਕੀਤੇ। -* **ਟੈਕਸਟ ਕਲੱਸਟਰਿੰਗ** ਤਦ ਉਪਯੋਗੀ ਹੋ ਸਕਦੀ ਹੈ ਜਦੋਂ ਅਸੀਂ ਸਮਾਨ ਵਾਕਾਂ ਨੂੰ ਇਕੱਠਾ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹਾਂ, ਉਦਾਹਰਣ ਲਈ, ਤਕਨੀਕੀ ਸਹਾਇਤਾ ਗੱਲਬਾਤਾਂ ਵਿੱਚ ਸਮਾਨ ਬੇਨਤੀਆਂ। -* **ਸਵਾਲ ਜਵਾਬ** ਇੱਕ ਮਾਡਲ ਦੀ ਸਮਰੱਥਾ ਨੂੰ ਦਰਸਾਉਂਦਾ ਹੈ ਕਿ ਉਹ ਖਾਸ ਸਵਾਲ ਦਾ ਜਵਾਬ ਦੇ ਸਕੇ। ਮਾਡਲ ਨੂੰ ਇੱਕ ਟੈਕਸਟ ਪੈਸੇਜ ਅਤੇ ਸਵਾਲ ਇਨਪੁਟ ਵਜੋਂ ਮਿਲਦੇ ਹਨ, ਅਤੇ ਇਸਨੂੰ ਟੈਕਸਟ ਵਿੱਚ ਉਹ ਜਗ੍ਹਾ ਪ੍ਰਦਾਨ ਕਰਨੀ ਹੁੰਦੀ ਹੈ ਜਿੱਥੇ ਸਵਾਲ ਦਾ ਜਵਾਬ ਮੌਜੂਦ ਹੈ (ਜਾਂ, ਕਈ ਵਾਰ, ਜਵਾਬ ਟੈਕਸਟ ਜਨਰੇਟ ਕਰਨਾ ਹੁੰਦਾ ਹੈ)। -* **ਟੈਕਸਟ ਜਨਰੇਸ਼ਨ** ਮਾਡਲ ਦੀ ਸਮਰੱਥਾ ਹੈ ਕਿ ਉਹ ਨਵਾਂ ਟੈਕਸਟ ਜਨਰੇਟ ਕਰ ਸਕੇ। ਇਸਨੂੰ ਇੱਕ ਕਲਾਸੀਫਿਕੇਸ਼ਨ ਟਾਸਕ ਵਜੋਂ ਮੰਨਿਆ ਜਾ ਸਕਦਾ ਹੈ ਜੋ ਕੁਝ *ਟੈਕਸਟ ਪ੍ਰੋਮਪਟ* ਦੇ ਆਧਾਰ 'ਤੇ ਅਗਲਾ ਅੱਖਰ/ਸ਼ਬਦ ਅਨੁਮਾਨ ਲਗਾਉਂਦਾ ਹੈ। ਉੱਚਤਮ ਟੈਕਸਟ ਜਨਰੇਸ਼ਨ ਮਾਡਲ, ਜਿਵੇਂ GPT-3, **ਪ੍ਰੋਮਪਟ ਪ੍ਰੋਗਰਾਮਿੰਗ** ਜਾਂ **ਪ੍ਰੋਮਪਟ ਇੰਜੀਨੀਅਰਿੰਗ** ਵਰਗੇ ਤਕਨੀਕਾਂ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਹੋਰ NLP ਟਾਸਕ ਹੱਲ ਕਰ ਸਕਦੇ ਹਨ। -* **ਟੈਕਸਟ ਸੰਖੇਪਣ** ਇੱਕ ਤਕਨੀਕ ਹੈ ਜਦੋਂ ਅਸੀਂ ਚਾਹੁੰਦੇ ਹਾਂ ਕਿ ਕੰਪਿਊਟਰ ਲੰਬੇ ਟੈਕਸਟ ਨੂੰ "ਪੜ੍ਹੇ" ਅਤੇ ਇਸਨੂੰ ਕੁਝ ਵਾਕਾਂ ਵਿੱਚ ਸੰਖੇਪ ਕਰੇ। -* **ਮਸ਼ੀਨ ਅਨੁਵਾਦ** ਨੂੰ ਇੱਕ ਭਾਸ਼ਾ ਵਿੱਚ ਟੈਕਸਟ ਸਮਝਣ ਅਤੇ ਦੂਜੀ ਭਾਸ਼ਾ ਵਿੱਚ ਟੈਕਸਟ ਜਨਰੇਸ਼ਨ ਦੇ ਸੰਯੋਗ ਵਜੋਂ ਦੇਖਿਆ ਜਾ ਸਕਦਾ ਹੈ। +* **ਟੈਕਸਟ ਵਰਗੀਕਰਨ** ਟੈਕਸਟ ਕ੍ਰਮਾਂਕਾਂ ਨਾਲ ਸੰਬੰਧਿਤ ਇੱਕ ਆਮ ਵਰਗੀਕਰਨ ਸਮੱਸਿਆ ਹੈ। ਉਦਾਹਰਨਾਂ ਵਿੱਚ ਈਮੇਲ ਸੁਨੇਹਿਆਂ ਨੂੰ ਸਪੈਮ ਵਾਂਗ ਵੱਖ ਕਰਨਾ ਜਾਂ ਲੇਖਾਂ ਨੂੰ ਖੇਡ, ਕਾਰੋਬਾਰ, ਰਾਜਨੀਤੀ ਆਦਿ ਕਿਸਮਾਂ 'ਚ ਵਰਗੀਕਰਨ ਕਰਨਾ ਸ਼ਾਮਲ ਹੈ। ਪਰਲੇ, ਜਦੋਂ ਚੈਟ ਬੋਟ ਵਿਕਸਤ ਕਰਦੇ ਹਾਂ, ਅਸੀਂ ਅਕਸਰ ਸਮਝਣਾ ਚਾਹੁੰਦੇ ਹਾਂ ਕਿ ਉਪਭੋਗਤਾ ਕੀ ਕਹਿਣਾ ਚਾਹੁੰਦਾ ਸੀ — ਇਸ ਸੰਦਰਭ ਵਿੱਚ ਅਸੀਂ **ਮਕਸਦ ਵਰਗੀਕਰਨ** ਨਾਲ ਨਜਿੱਠ ਰਹੇ ਹਾਂ। ਅਕਸਰ, ਮਕਸਦ ਵਰਗੀਕਰਨ ਵਿੱਚ ਸਾਨੂੰ ਕਈ ਸ਼੍ਰੇਣੀਆਂ ਨਾਲ ਨਜਿੱਠਣਾ ਪੈਂਦਾ ਹੈ। +* **ਭਾਵਨਾ ਵਿਸ਼ਲੇਸ਼ਣ** ਇੱਕ ਆਮ ਰੈਗ੍ਰੈਸ਼ਨ ਸਮੱਸਿਆ ਹੈ, ਜਿੱਥੇ ਸਾਨੂੰ ਇੱਕ ਨੰਬਰ (ਭਾਵਨਾ) ਨਿਰਧਾਰਿਤ ਕਰਨੀ ਹੁੰਦੀ ਹੈ ਜੋ ਕਿ ਇੱਕ ਵਾਕ ਦੇ ਅਰਥ ਦੀ ਕਿੰਨੀ ਸਕਾਰਾਤਮਕ/ਨਕਾਰਾਤਮਕ ਹੈ, ਨੂੰ ਦਰਸਾਉਂਦਾ ਹੈ। ਭਾਵਨਾ ਵਿਸ਼ਲੇਸ਼ਣ ਦਾ ਇੱਕ ਉੱਚ-ਪੱਧਰੀ ਸੰਸਕਰਨ ਹੈ **ਪੱਖ-ਆਧਾਰਿਤ ਭਾਵਨਾ ਵਿਸ਼ਲੇਸ਼ਣ** (ABSA), ਜਿੱਥੇ ਅਸੀਂ ਭਾਵਨਾ ਨੂੰ ਪੂਰੇ ਵਾਕ ਨੂੰ ਨਹੀਂ, ਬਲਕਿ ਉਸ ਦੇ ਵੱਖ-ਵੱਖ ਹਿੱਸਿਆਂ (ਪੱਖਾਂ) ਨੂੰ ਅੰਕਿਤ ਕਰਦੇ ਹਾਂ, ਉਦਾਹਰਨ ਲਈ *ਇਸ ਰੈਸਟੋਰੈਂਟ ਵਿੱਚ, ਮੈਨੂੰ ਖਾਣ-ਪੀਣ ਪਸੰਦ ਆਇਆ, ਪਰ ਵਾਤਾਵਰਣ ਬਦਤਰ ਸੀ*। +* **ਨਾਮਿਤ ਇਕਾਈ ਪਛਾਣ** (NER) ਐਸਾ ਸਮੱਸਿਆ ਹੈ ਜਿਸ ਵਿਚੋਂ ਟੈਕਸਟ ਵਿੱਚੋਂ ਕੁਝ ਵਿਸ਼ੇਸ਼ ਇਕਾਈਆਂ ਨੂੰ ਨਿਕਾਲਿਆ ਜਾਂਦਾ ਹੈ। ਉਦਾਹਰਨ ਵਜੋਂ, ਸਾਨੂੰ ਸਮਝਣਾ ਪੈਂਦਾ ਹੈ ਕਿ ਫਰਜ਼ ਕਰੋ ਸਤਰ *ਮੈਨੂੰ ਕੱਲ੍ਹ ਪੈਰਿਸ ਜਾਣਾ ਹੈ* ਵਿੱਚ ਸ਼ਬਦ *ਕੱਲ੍ਹ* ਦਿਨਾਂਕ (DATE) ਨੂੰ ਦਰਸਾਉਂਦਾ ਹੈ, ਅਤੇ *ਪੈਰਿਸ* ਸਥਿਤੀ (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 ਤਰੀਕੇ [ਨੈਚਰਲ ਲੈਂਗਵੇਜ ਪ੍ਰੋਸੈਸਿੰਗ ਟੂਲਕਿਟ (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 ਲਈ ਸਾਰੀਆਂ ਜ਼ਰੂਰੀ ਲਾਇਬ੍ਰੇਰੀਜ਼ ਹੇਠ ਲਿਖੀਆਂ ਕਮਾਂਡਾਂ ਨਾਲ ਇੰਸਟਾਲ ਕਰਨੀ ਪੈ ਸਕਦੀਆਂ ਹਨ: -**ਪਾਈਟਾਰਚ ਲਈ** +**ਪਾਇਟਾਰਚ ਲਈ** ```bash -pip install -r requirements-torch.txt +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) 'ਤੇ ਟੈਂਸਰਫਲੋ ਨਾਲ NLP ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰ ਸਕਦੇ ਹੋ। +> ਤੁਸੀਂ [Microsoft Learn](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste) 'ਤੇ ਟੈਂਸਰਫਲੋ ਨਾਲ NLP ਨੂੰ ਆਜ਼ਮਾ ਸਕਦੇ ਹੋ ## GPU ਚੇਤਾਵਨੀ -ਇਸ ਸੈਕਸ਼ਨ ਵਿੱਚ, ਕੁਝ ਉਦਾਹਰਣਾਂ ਵਿੱਚ ਅਸੀਂ ਕਾਫ਼ੀ ਵੱਡੇ ਮਾਡਲਾਂ ਨੂੰ ਟ੍ਰੇਨ ਕਰਾਂਗੇ। -* **GPU-ਸਮਰੱਥ ਕੰਪਿਊਟਰ ਦੀ ਵਰਤੋਂ ਕਰੋ**: ਵੱਡੇ ਮਾਡਲਾਂ ਨਾਲ ਕੰਮ ਕਰਦੇ ਸਮੇਂ ਉਡੀਕ ਦੇ ਸਮੇਂ ਨੂੰ ਘਟਾਉਣ ਲਈ ਆਪਣੇ ਨੋਟਬੁੱਕਸ ਨੂੰ GPU-ਸਮਰੱਥ ਕੰਪਿਊਟਰ 'ਤੇ ਚਲਾਉਣਾ ਸਲਾਹਯੋਗ ਹੈ। -* **GPU ਮੈਮਰੀ ਸੀਮਾਵਾਂ**: GPU 'ਤੇ ਚਲਾਉਣ ਨਾਲ ਉਹ ਸਥਿਤੀਆਂ ਬਣ ਸਕਦੀਆਂ ਹਨ ਜਿੱਥੇ ਤੁਸੀਂ GPU ਮੈਮਰੀ ਖਤਮ ਕਰ ਲੈਂਦੇ ਹੋ, ਖਾਸ ਕਰਕੇ ਵੱਡੇ ਮਾਡਲਾਂ ਨੂੰ ਟ੍ਰੇਨ ਕਰਦੇ ਸਮੇਂ। -* **GPU ਮੈਮਰੀ ਖਪਤ**: ਟ੍ਰੇਨਿੰਗ ਦੌਰਾਨ GPU ਮੈਮਰੀ ਦੀ ਖਪਤ ਕਈ ਕਾਰਕਾਂ 'ਤੇ ਨਿਰਭਰ ਕਰਦੀ ਹੈ, ਜਿਵੇਂ ਕਿ ਮਿਨੀਬੈਚ ਸਾਈਜ਼। -* **ਮਿਨੀਬੈਚ ਸਾਈਜ਼ ਘਟਾਓ**: ਜੇਕਰ ਤੁਹਾਨੂੰ GPU ਮੈਮਰੀ ਸਮੱਸਿਆਵਾਂ ਦਾ ਸਾਹਮਣਾ ਕਰਨਾ ਪੈਂਦਾ ਹੈ, ਤਾਂ ਆਪਣੇ ਕੋਡ ਵਿੱਚ ਮਿਨੀਬੈਚ ਸਾਈਜ਼ ਨੂੰ ਘਟਾਉਣ ਨੂੰ ਇੱਕ ਸੰਭਾਵਿਤ ਹੱਲ ਵਜੋਂ ਵਿਚਾਰ ਕਰੋ। -* **ਟੈਂਸਰਫਲੋ GPU ਮੈਮਰੀ ਰਿਲੀਜ਼**: ਟੈਂਸਰਫਲੋ ਦੇ ਪੁਰਾਣੇ ਸੰਸਕਰਣ ਇੱਕ ਹੀ ਪਾਇਥਨ ਕਰਨਲ ਵਿੱਚ ਕਈ ਮਾਡਲਾਂ ਨੂੰ ਟ੍ਰੇਨ ਕਰਦੇ ਸਮੇਂ GPU ਮੈਮਰੀ ਨੂੰ ਸਹੀ ਤਰੀਕੇ ਨਾਲ ਰਿਲੀਜ਼ ਨਹੀਂ ਕਰ ਸਕਦੇ। GPU ਮੈਮਰੀ ਦੀ ਵਰਤੋਂ ਨੂੰ ਪ੍ਰਭਾਵਸ਼ਾਲੀ ਢੰਗ ਨਾਲ ਪ੍ਰਬੰਧਿਤ ਕਰਨ ਲਈ, ਤੁਸੀਂ ਟੈਂਸਰਫਲੋ ਨੂੰ GPU ਮੈਮਰੀ ਨੂੰ ਸਿਰਫ ਜਦੋਂ ਲੋੜ ਹੋਵੇ ਤਦ ਹੀ ਅਲੋਕੇਟ ਕਰਨ ਲਈ ਸੰਰਚਿਤ ਕਰ ਸਕਦੇ ਹੋ। -* **ਕੋਡ ਸ਼ਾਮਲ ਕਰੋ**: ਟੈਂਸਰਫਲੋ ਨੂੰ GPU ਮੈਮਰੀ ਅਲੋਕੇਸ਼ਨ ਨੂੰ ਸਿਰਫ ਜਦੋਂ ਲੋੜ ਹੋਵੇ ਤਦ ਵਧਾਉਣ ਲਈ, ਹੇਠਾਂ ਦਿੱਤਾ ਕੋਡ ਆਪਣੇ ਨੋਟਬੁੱਕਸ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ: +ਇਸ ਭਾਗ ਵਿੱਚ, ਕੁਝ ਉਦਾਹਰਨਾਂ ਵਿੱਚ ਅਸੀਂ ਕਾਫ਼ੀ ਵੱਡੇ ਮਾਡਲਾਂ ਨੂੰ ਟ੍ਰੇਨ ਕਰਾਂਗੇ। +* **GPU-ਯੋਗ ਕੰਪਿਊਟਰ ਦੀ ਵਰਤੋਂ ਕਰੋ**: ਆਪਣੇ ਨੋਟਬੁੱਕ ਨੂੰ GPU-ਯੋਗ ਕੰਪਿਊਟਰ 'ਤੇ ਚਲਾਉਣਾ ਸਲਾਹਯੋਗ ਹੈ ਤਾਂ ਜੋ ਵੱਡੇ ਮਾਡਲਾਂ ਨਾਲ ਕੰਮ ਕਰਨ ਸਮੇਂ ਇੰਤਜ਼ਾਰ ਘਟ ਸਕੇ। +* **GPU ਮੈਮੋਰੀ ਸੀਮਾਵਾਂ**: GPU 'ਤੇ ਦੌੜਾਉਣ ਨਾਲ ਤੁਸੀਂ ਐਸੀਆਂ ਸਥਿਤੀਆਂ ਦਾ ਸਾਹਮਣਾ ਕਰ ਸਕਦੇ ਹੋ ਜਿਥੇ GPU ਮੈਮੋਰੀ ਖਤਮ ਹੋ ਜਾਵੇ, ਖ਼ਾਸ ਕਰਕੇ ਵੱਡੇ ਮਾਡਲਾਂ ਨੂੰ ਟ੍ਰੇਨ ਕਰਨ ਵੇਲੇ। +* **GPU ਮੈਮੋਰੀ ਦੀ ਖਪਤ**: ਟ੍ਰੇਨਿੰਗ ਦੇ ਦੌਰਾਨ ਖਪਤ ਕੀਤੀ ਜਾਂਦੀ GPU ਮੈਮੋਰੀ ਦੀ ਮਾਤਰਾ ਵੱਖ-ਵੱਖ ਤੱਤਾਂ ਤੇ ਨਿਰਭਰ ਕਰਦੀ ਹੈ, ਜਿਵੇਂ ਕਿ ਮਿਨੀਬੈਚ ਆਕਾਰ। +* **ਮਿਨੀਬੈਚ ਆਕਾਰ ਘਟਾਓ**: ਜੇ ਤੁਸੀਂ GPU ਮੈਮੋਰੀ ਸੰਬੰਧੀ ਸਮੱਸਿਆਵਾਂ ਦਾ ਸਾਹਮਣਾ ਕਰਦੇ ਹੋ, ਤਾਂ ਆਪਣੇ ਕੋਡ ਵਿੱਚ ਮਿਨੀਬੈਚ ਆਕਾਰ ਘਟਾਉਣ ਦੀ ਸੋਚੋ। +* **ਟੈਂਸਰਫਲੋ GPU ਮੈਮੋਰੀ ਰਿਹਾਈ**: ਟੈਂਸਰਫਲੋ ਦੇ ਕੁਝ ਪੁਰਾਣੇ ਸੰਸਕਰਣ ਇਕ Python ਕਰਨਲ ਵਿੱਚ ਕਈ ਮਾਡਲ ਟ੍ਰੇਨ ਕਰਨ ਤੇ GPU ਮੈਮੋਰੀ ਸਹੀ ਤਰੀਕੇ ਨਾਲ ਮੁਕਤ ਨਹੀਂ ਕਰਦੇ। GPU ਮੈਮੋਰੀ ਦੀ ਵਰਤੋਂ ਨੂੰ ਪ੍ਰਭਾਵਸ਼ਾਲੀ ਤਰੀਕੇ ਨਾਲ ਸੰਭਾਲਣ ਲਈ, ਤੁਸੀਂ ਟੈਂਸਰਫਲੋ ਨੂੰ ਸਿਰਫ ਜਰੂਰਤ ਪੈਣ 'ਤੇ GPU ਮੈਮੋਰੀ ਵੰਡਣ ਲਈ ਕਾਂਫਿਗਰ ਕਰ ਸਕਦੇ ਹੋ। +* **ਕੋਡ ਸ਼ਾਮਲ ਕਰੋ**: ਟੈਂਸਰਫਲੋ ਨੂੰ ਕੇਵਲ ਜਰੂਰਤ ਪੈਣ 'ਤੇ 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) +* [ਟੈਕਸਟ ਨੂੰ ਟੈਂਸਰ ਵਜੋਂ ਪ੍ਰਤੀਨਿਧਿਤ ਕਰਨਾ](13-TextRep/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) ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਅਨੁਵਾਦ ਕੀਤਾ ਗਿਆ ਹੈ। ਹਾਲਾਂਕਿ ਅਸੀਂ ਸਹੀ ਹੋਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਦੇ ਹਾਂ, ਕਿਰਪਾ ਕਰਕੇ ਧਿਆਨ ਦਿਓ ਕਿ ਸਵੈਚਾਲਿਤ ਅਨੁਵਾਦਾਂ ਵਿੱਚ ਗਲਤੀਆਂ ਜਾਂ ਅਸੁਚੱਜੇਪਣ ਹੋ ਸਕਦੇ ਹਨ। ਮੂਲ ਦਸਤਾਵੇਜ਼ ਨੂੰ ਇਸਦੀ ਮੂਲ ਭਾਸ਼ਾ ਵਿੱਚ ਅਧਿਕਾਰਤ ਸਰੋਤ ਮੰਨਿਆ ਜਾਣਾ ਚਾਹੀਦਾ ਹੈ। ਮਹੱਤਵਪੂਰਨ ਜਾਣਕਾਰੀ ਲਈ, ਪੇਸ਼ੇਵਰ ਮਨੁੱਖੀ ਅਨੁਵਾਦ ਦੀ ਸਿਫਾਰਸ਼ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਇਸ ਅਨੁਵਾਦ ਦੀ ਵਰਤੋਂ ਤੋਂ ਪੈਦਾ ਹੋਣ ਵਾਲੇ ਕਿਸੇ ਵੀ ਗਲਤਫਹਿਮੀ ਜਾਂ ਗਲਤ ਵਿਆਖਿਆ ਲਈ ਅਸੀਂ ਜ਼ਿੰਮੇਵਾਰ ਨਹੀਂ ਹਾਂ। \ No newline at end of file +--- + + +**ਅਸਵੀਕਾਰੋਪਣ**: +ਇਸ ਦਸਤਾਵੇਜ਼ ਦਾ ਅਨੁਵਾਦ ਏਆਈ ਅਨੁਵਾਦ ਸੇਵਾ [Co-op Translator](https://github.com/Azure/co-op-translator) ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਕੀਤਾ ਗਿਆ ਹੈ। ਜਦੋਂ ਕਿ ਅਸੀਂ ਸਹੀਤਾਵਾਂ ਲਈ ਯਤਨਸ਼ੀਲ ਹਾਂ, ਕਿਰਪਾ ਕਰਕੇ ਧਿਆਨ ਰੱਖੋ ਕਿ ਸਵੈਚਾਲਿਤ ਅਨੁਵਾਦਾਂ ਵਿੱਚ ਗਲਤੀਆਂ ਜਾਂ ਅਸਮੱਤਿਆਵਾਂ ਹੋ ਸਕਦੀਆਂ ਹਨ। ਮੂਲ ਦਸਤਾਵੇਜ਼ ਆਪਣੀ ਮੂਲ ਭਾਸ਼ਾ ਵਿੱਚ ਅਧਿਕਾਰਕ ਸਰੋਤ ਮੰਨਿਆ ਜਾਣਾ ਚਾਹੀਦਾ ਹੈ। ਜਰੂਰੀ ਜਾਣਕਾਰੀ ਲਈ, ਪੇਸ਼ੇਵਰ ਮਨੁੱਖੀ ਅਨੁਵਾਦ ਦੀ ਸਿਫ਼ਾਰਸ਼ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਅਸੀਂ ਇਸ ਅਨੁਵਾਦ ਦੇ ਉਪਯੋਗ ਤੋਂ ਪੈਦਾ ਹੋਣ ਵਾਲੀਆਂ ਕਿਸੇ ਵੀ ਗਲਤਫਹਿਮੀਆਂ ਜਾਂ ਗਲਤ ਵਿਆਖਿਆਵਾਂ ਲਈ ਜਵਾਬਦੇਹ ਨਹੀਂ ਹਾਂ। + \ No newline at end of file diff --git a/translations/pa/lessons/6-Other/23-MultiagentSystems/README.md b/translations/pa/lessons/6-Other/23-MultiagentSystems/README.md index 9f663ec30f..7572551af5 100644 --- a/translations/pa/lessons/6-Other/23-MultiagentSystems/README.md +++ b/translations/pa/lessons/6-Other/23-MultiagentSystems/README.md @@ -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 ਕਿਤਾਬ, [Artificial Intelligence: A Modern Approach](https://en.wikipedia.org/wiki/Artificial_Intelligence:_A_Modern_Approach), ਮਲਟੀ-ਏਜੰਟ ਸਿਸਟਮਾਂ ਦੇ ਨਜ਼ਰੀਏ ਤੋਂ ਕਲਾਸਿਕ AI ਦੇ ਨਜ਼ਰੀਏ 'ਤੇ ਧਿਆਨ ਕੇਂਦਰਿਤ ਕਰਦੀ ਹੈ। -ਮਲਟੀ-ਏਜੰਟ ਪਹੁੰਚ ਦਾ ਕੇਂਦਰ **ਏਜੰਟ** ਦੀ ਧਾਰਣਾ ਹੈ - ਇੱਕ ਐਕਾਈ ਜੋ ਕਿਸੇ **ਵਾਤਾਵਰਣ** ਵਿੱਚ ਰਹਿੰਦੀ ਹੈ, ਜਿਸਨੂੰ ਇਹ ਸਮਝ ਸਕਦੀ ਹੈ ਅਤੇ ਇਸ 'ਤੇ ਕਾਰਵਾਈ ਕਰ ਸਕਦੀ ਹੈ। ਇਹ ਇੱਕ ਬਹੁਤ ਹੀ ਵਿਸਤ੍ਰਿਤ ਪਰਿਭਾਸ਼ਾ ਹੈ, ਅਤੇ ਇਸ ਵਿੱਚ ਕਈ ਵੱਖ-ਵੱਖ ਕਿਸਮਾਂ ਅਤੇ ਵਰਗਬੰਧੀਆਂ ਦੇ ਏਜੰਟ ਹੋ ਸਕਦੇ ਹਨ: +ਮਲਟੀ-ਏਜੰਟ ਪਹੁੰਚ ਦਾ ਕੇਂਦਰ ਹੈ **ਏਜੰਟ** ਦਾ ਸੰਕਲਪ - ਇੱਕ ਐਸੀ ਇਕਾਈ ਜੋ ਕਿਸੇ **ਮਾਹੌਲ** ਵਿੱਚ ਰਹਿੰਦੀ ਹੈ, ਜਿਸਨੂੰ ਇਹ ਸਮਝ ਸਕਦੀ ਹੈ ਅਤੇ ਜਿਸ ਉੱਤੇ ਕਾਰਵਾਈ ਕਰ ਸਕਦੀ ਹੈ। ਇਹ ਇਕ ਬਹੁਤ ਵਿਆਪਕ ਪਰਿਭਾਸ਼ਾ ਹੈ, ਅਤੇ ਏਜੰਟਾਂ ਦੀ ਕਈ ਕਿਸਮਾਂ ਅਤੇ ਵਰਗੀਕਰਨ ਹੋ ਸਕਦੇ ਹਨ: -* ਉਨ੍ਹਾਂ ਦੀ ਤਰਕ ਕਰਨ ਦੀ ਯੋਗਤਾ ਦੇ ਅਧਾਰ 'ਤੇ: - - **ਪ੍ਰਤੀਕ੍ਰਿਆਸ਼ੀਲ** ਏਜੰਟ ਆਮ ਤੌਰ 'ਤੇ ਸਧਾਰਣ ਬੇਨਤੀ-ਜਵਾਬ ਕਿਸਮ ਦੇ ਵਿਵਹਾਰ ਵਾਲੇ ਹੁੰਦੇ ਹਨ - - **ਵਿਚਾਰਸ਼ੀਲ** ਏਜੰਟ ਕਿਸੇ ਤਰ੍ਹਾਂ ਦੇ ਤਰਕਸ਼ੀਲ ਤਰਕ ਅਤੇ/ਜਾਂ ਯੋਜਨਾ ਬਣਾਉਣ ਦੀ ਯੋਗਤਾ ਵਰਤਦੇ ਹਨ -* ਜਿੱਥੇ ਏਜੰਟ ਆਪਣਾ ਕੋਡ ਚਲਾਉਂਦੇ ਹਨ: - - **ਸਥਿਰ** ਏਜੰਟ ਇੱਕ ਸਮਰਪਿਤ ਨੈੱਟਵਰਕ ਨੋਡ 'ਤੇ ਕੰਮ ਕਰਦੇ ਹਨ - - **ਮੋਬਾਈਲ** ਏਜੰਟ ਆਪਣੇ ਕੋਡ ਨੂੰ ਨੈੱਟਵਰਕ ਨੋਡਾਂ ਵਿੱਚ ਹਿਲਾ ਸਕਦੇ ਹਨ -* ਉਨ੍ਹਾਂ ਦੇ ਵਿਵਹਾਰ ਦੇ ਅਧਾਰ 'ਤੇ: - - **ਨਿਰਜੀਵ ਏਜੰਟ** ਵਿਸ਼ੇਸ਼ ਲਕਸ਼ ਨਹੀਂ ਰੱਖਦੇ। ਇਸ ਤਰ੍ਹਾਂ ਦੇ ਏਜੰਟ ਬਾਹਰੀ ਉਤਪ੍ਰੇਰਕਾਂ 'ਤੇ ਪ੍ਰਤੀਕ੍ਰਿਆ ਕਰ ਸਕਦੇ ਹਨ, ਪਰ ਖੁਦ ਕੋਈ ਕਾਰਵਾਈ ਸ਼ੁਰੂ ਨਹੀਂ ਕਰਨਗੇ। - - **ਸਕ੍ਰਿਆ ਏਜੰਟ** ਕੁਝ ਲਕਸ਼ ਰੱਖਦੇ ਹਨ ਜਿਨ੍ਹਾਂ ਨੂੰ ਉਹ ਪੂਰਾ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਦੇ ਹਨ - - **ਸੰਜੋਗੀ ਏਜੰਟ** ਜਟਿਲ ਯੋਜਨਾ ਬਣਾਉਣ ਅਤੇ ਤਰਕਸ਼ੀਲਤਾ ਸ਼ਾਮਲ ਕਰਦੇ ਹਨ +* ਉਹਨਾਂ ਦੀ ਤਰੱਕੀ ਕਰਨ ਦੀ ਸਮਰੱਥਾ ਅਨੁਸਾਰ: + - **ਪ੍ਰਤੀਕਿਰਿਆਤਮਕ** ਏਜੰਟ ਆਮ ਤੌਰ 'ਤੇ ਸਾਦਾ ਬੇਨਤੀ-ਜਵਾਬ਼ ਵਰਗਾ ਵਰਤਾਰਾ ਰੱਖਦੇ ਹਨ + - **ਵਿਚਾਰਸ਼ੀਲ** ਏਜੰਟ ਕਿਸੇ ਤਰ੍ਹਾਂ ਦੀ ਤਰਕਸ਼ਕਤੀ ਅਤੇ / ਜਾਂ ਯੋਜਨਾ ਬਣਾਉਣ ਦੀ ਸਮਰੱਥਾ ਰੱਖਦੇ ਹਨ +* ਉਹਨਾਂ ਦੀ ਕੋਡ ਕਿੱਥੇ ਚਲਾਈ ਜਾਂਦੀ ਹੈ: + - **ਸਥਿਰ** ਏਜੰਟ ਇਕ ਨਿਰਧਾਰਤ ਨੈੱਟਵਰਕ ਨੋਡ 'ਤੇ ਕੰਮ ਕਰਦੇ ਹਨ + - **ਮੋਬਾਈਲ** ਏਜੰਟ ਆਪਣਾ ਕੋਡ ਨੈੱਟਵਰਕ ਨੋਡਾਂ ਵਿਚਕਾਰ ਹਿਲਾ ਸਕਦੇ ਹਨ +* ਉਹਨਾਂ ਦੀ ਵਰਤਾਰਾ ਅਨੁਸਾਰ: + - **ਨਿਸ਼ਕ੍ਰਿਯ ਏਜੰਟ** ਵਧੀਕ ਮਕਸਦ ਨਹੀਂ ਰੱਖਦੇ। ਇਸ ਤਰ੍ਹਾਂ ਦੇ ਏਜੰਟ ਬਾਹਰੀ ਉਤੇਜਨਾਵਾਂ ਨੂੰ ਜਵਾਬ ਦੇ ਸਕਦੇ ਹਨ, ਪਰ ਖੁਦ ਦਿਓ ਕਾਰਵਾਈਆਂ ਸ਼ੁਰੂ ਨਹੀਂ ਕਰਦੇ। + - **ਸਰਗਰਮ ਏਜੰਟ** ਦੇ ਕੁਝ ਲਕੜੇ ਹਨ ਜਿਨ੍ਹਾਂ ਦਾ ਉਹ ਪਿੱਛਾ ਕਰਦੇ ਹਨ + - **ਸੰਜਾਣੂਕ ਏਜੰਟ** ਵਿੱਚ ਜਟਿਲ ਯੋਜਨਾ ਅਤੇ ਤਰਕ ਸ਼ਾਮਿਲ ਹੁੰਦੀ ਹੈ -ਅੱਜਕੱਲ੍ਹ ਮਲਟੀ-ਏਜੰਟ ਸਿਸਟਮ ਕਈ ਐਪਲੀਕੇਸ਼ਨਾਂ ਵਿੱਚ ਵਰਤੇ ਜਾਂਦੇ ਹਨ: +ਮਲਟੀ-ਏਜੰਟ ਸਿਸਟਮ ਅੱਜਕੱਲ੍ਹ ਕਈ ਐਪਲੀਕੇਸ਼ਨਾਂ ਵਿੱਚ ਵਰਤੇ ਜਾਂਦੇ ਹਨ: -* ਖੇਡਾਂ ਵਿੱਚ, ਕਈ ਗੈਰ-ਖਿਡਾਰੀ ਪਾਤਰ ਕਿਸੇ ਤਰ੍ਹਾਂ ਦੀ AI ਵਰਤਦੇ ਹਨ, ਅਤੇ ਉਨ੍ਹਾਂ ਨੂੰ ਬੁੱਧੀਮਾਨ ਏਜੰਟ ਮੰਨਿਆ ਜਾ ਸਕਦਾ ਹੈ -* ਵੀਡੀਓ ਉਤਪਾਦਨ ਵਿੱਚ, ਭੀੜਾਂ ਵਾਲੇ ਜਟਿਲ 3D ਦ੍ਰਿਸ਼ਾਂ ਨੂੰ ਰੇਂਡਰ ਕਰਨ ਲਈ ਆਮ ਤੌਰ 'ਤੇ ਮਲਟੀ-ਏਜੰਟ ਸਿਮੂਲੇਸ਼ਨ ਵਰਤੀ ਜਾਂਦੀ ਹੈ -* ਸਿਸਟਮ ਮਾਡਲਿੰਗ ਵਿੱਚ, ਮਲਟੀ-ਏਜੰਟ ਪਹੁੰਚ ਨੂੰ ਕਿਸੇ ਜਟਿਲ ਮਾਡਲ ਦੇ ਵਿਵਹਾਰ ਨੂੰ ਸਿਮੂਲੇਟ ਕਰਨ ਲਈ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ। ਉਦਾਹਰਣ ਲਈ, ਮਲਟੀ-ਏਜੰਟ ਪਹੁੰਚ ਨੂੰ ਦੁਨੀਆ ਭਰ ਵਿੱਚ COVID-19 ਬਿਮਾਰੀ ਦੇ ਫੈਲਾਅ ਦੀ ਪੇਸ਼ਗੋਈ ਕਰਨ ਲਈ ਸਫਲਤਾਪੂਰਵਕ ਵਰਤਿਆ ਗਿਆ ਹੈ। ਇਸੇ ਤਰ੍ਹਾਂ ਦੀ ਪਹੁੰਚ ਨੂੰ ਸ਼ਹਿਰ ਵਿੱਚ ਟ੍ਰੈਫਿਕ ਨੂੰ ਮਾਡਲ ਕਰਨ ਲਈ ਵਰਤਿਆ ਜਾ ਸਕਦਾ ਹੈ, ਅਤੇ ਦੇਖਿਆ ਜਾ ਸਕਦਾ ਹੈ ਕਿ ਟ੍ਰੈਫਿਕ ਨਿਯਮਾਂ ਵਿੱਚ ਬਦਲਾਅ 'ਤੇ ਇਹ ਕਿਵੇਂ ਪ੍ਰਤੀਕ੍ਰਿਆ ਕਰਦਾ ਹੈ। -* ਜਟਿਲ ਆਟੋਮੇਸ਼ਨ ਸਿਸਟਮਾਂ ਵਿੱਚ, ਹਰ ਡਿਵਾਈਸ ਇੱਕ ਸੁਤੰਤਰ ਏਜੰਟ ਵਜੋਂ ਕੰਮ ਕਰ ਸਕਦਾ ਹੈ, ਜੋ ਪੂਰੇ ਸਿਸਟਮ ਨੂੰ ਘੱਟ ਮੋਨੋਲਿਥਿਕ ਅਤੇ ਜ਼ਿਆਦਾ ਮਜ਼ਬੂਤ ਬਣਾਉਂਦਾ ਹੈ। +* ਖੇਡਾਂ ਵਿੱਚ, ਕਈ ਗੈਰ-ਖਿਡਾਰੀ ਪਾਤਰ (NPCs) ਕਿਸੇ ਕਿਸਮ ਦੀ AI ਵਰਤਦੇ ਹਨ ਅਤੇ ਉਨ੍ਹਾਂ ਨੂੰ ਬੁੱਧੀਮਾਨ ਏਜੰਟ ਮੰਨਿਆ ਜਾ ਸਕਦਾ ਹੈ +* ਵੀਡੀਓ ਉਤਪਾਦਨ ਵਿੱਚ, ਜਟਿਲ 3D ਸੈਨ ਦੇ ਰੈਂਡਰਿੰਗ ਜਿੱਥੇ ਭੀੜ ਹੁੰਦੀ ਹੈ, ਆਮ ਤੌਰ 'ਤੇ ਮਲਟੀ-ਏਜੰਟ ਸੰਮੇਲਨ ਵਰਤ ਕੇ ਕੀਤਾ ਜਾਂਦਾ ਹੈ +* ਸਿਸਟਮ ਮਾਡਲਿੰਗ ਵਿੱਚ, ਮਲਟੀ-ਏਜੰਟ ਪਹੁੰਚ ਜਟਿਲ ਮਾਡਲ ਦੇ ਵਰਤਾਰਾ ਦੀ ਸਿਮੂਲੇਸ਼ਨ ਕਰਨ ਲਈ ਵਰਤੀ ਜਾਂਦੀ ਹੈ। ਉਦਾਹਰਣ ਵਜੋਂ, ਮਲਟੀ-ਏਜੰਟ ਪਹੁੰਚ ਨੂੰ ਸੰਸਾਰ ਭਰ ਵਿੱਚ ਕੋਵਿਡ-19 ਰੋਗ ਦੇ ਫੈਲਾਅ ਦੀ ਪੇਸ਼ਗੋਈ ਕਰਨ ਲਈ ਸਫਲਤਾਪੂਰਵਕ ਵਰਤਿਆ ਗਿਆ ਹੈ। ਇਸੇ ਤਰ੍ਹਾਂ ਦੀ ਪਹੁੰਚ ਸ਼ਹਿਰ ਵਿੱਚ ਟ੍ਰੈਫਿਕ ਮਾਡਲ ਕਰਨ ਅਤੇ ਵਿਭਿੰਨ ਟ੍ਰੈਫਿਕ ਨਿਯਮਾਂ ਦੇ ਬਦਲਾਅ ਨੂੰ ਦੇਖਣ ਲਈ ਵਰਤੀ ਜਾ ਸਕਦੀ ਹੈ। +* ਜਟਿਲ ਆਟੋਮੇਸ਼ਨ ਸਿਸਟਮਾਂ ਵਿੱਚ, ਹਰ ਜੰਤਰ ਇੱਕ ਸਵਤੰਤ੍ਰ ਏਜੰਟ ਵਾਂਗ ਵਰਤ ਸਕਦਾ ਹੈ, ਜਿਸ ਨਾਲ ਸਭ ਸਿਸਟਮ ਘੱਟ ਮੋਨੋਲੀਥਿਕ ਅਤੇ ਵੱਧ ਮਜ਼ਬੂਤ ਬਣ ਜਾਂਦਾ ਹੈ। -ਅਸੀਂ ਮਲਟੀ-ਏਜੰਟ ਸਿਸਟਮਾਂ ਵਿੱਚ ਗਹਿਰਾਈ ਨਾਲ ਜਾਣ ਲਈ ਬਹੁਤ ਜ਼ਿਆਦਾ ਸਮਾਂ ਨਹੀਂ ਲਗਾਵਾਂਗੇ, ਪਰ **ਮਲਟੀ-ਏਜੰਟ ਮਾਡਲਿੰਗ** ਦੇ ਇੱਕ ਉਦਾਹਰਣ 'ਤੇ ਵਿਚਾਰ ਕਰਾਂਗੇ। +ਅਸੀਂ ਮਲਟੀ-ਏਜੰਟ ਸਿਸਟਮਾਂ ਵਿੱਚ ਬਹੁਤ ਡੂੰਘਾਈ ਨਾਲ ਨਹੀਂ ਜਾਣ ਵਾਲੇ, ਪਰ ਇੱਕ ਉਦਾਹਰਣ ਦੇਣਗੇ **ਮਲਟੀ-ਏਜੰਟ ਮਾਡਲਿੰਗ** ਦੀ। -## ਨੈਟਲੋਗੋ +## NetLogo -[ਨੈਟਲੋਗੋ](https://ccl.northwestern.edu/netlogo/) ਇੱਕ ਮਲਟੀ-ਏਜੰਟ ਮਾਡਲਿੰਗ ਵਾਤਾਵਰਣ ਹੈ ਜੋ [ਲੋਗੋ](https://en.wikipedia.org/wiki/Logo_(programming_language)) ਪ੍ਰੋਗਰਾਮਿੰਗ ਭਾਸ਼ਾ ਦੇ ਸੰਸ਼ੋਧਿਤ ਸੰਸਕਰਣ 'ਤੇ ਆਧਾਰਿਤ ਹੈ। ਇਹ ਭਾਸ਼ਾ ਬੱਚਿਆਂ ਨੂੰ ਪ੍ਰੋਗਰਾਮਿੰਗ ਸੰਕਲਪ ਸਿਖਾਉਣ ਲਈ ਵਿਕਸਿਤ ਕੀਤੀ ਗਈ ਸੀ, ਅਤੇ ਇਹ ਤੁਹਾਨੂੰ **ਟਰਟਲ** ਨਾਮਕ ਇੱਕ ਏਜੰਟ ਨੂੰ ਨਿਯੰਤਰਿਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦੀ ਹੈ, ਜੋ ਹਿਲ ਸਕਦੀ ਹੈ ਅਤੇ ਪਿੱਛੇ ਇੱਕ ਨਿਸ਼ਾਨ ਛੱਡ ਸਕਦੀ ਹੈ। ਇਹ ਜਟਿਲ ਜਾਮਿਤੀ ਆਕਰਤੀਆਂ ਬਣਾਉਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ, ਜੋ ਕਿ ਇੱਕ ਏਜੰਟ ਦੇ ਵਿਵਹਾਰ ਨੂੰ ਸਮਝਣ ਦਾ ਬਹੁਤ ਹੀ ਦ੍ਰਿਸ਼ਮਾਨ ਤਰੀਕਾ ਹੈ। +[NetLogo](https://ccl.northwestern.edu/netlogo/) ਇੱਕ ਮਲਟੀ-ਏਜੰਟ ਮਾਡਲਿੰਗ ਵਾਤਾਵਰਣ ਹੈ ਜੋ [ਲੋਗੋ](https://en.wikipedia.org/wiki/Logo_(programming_language)) ਪ੍ਰੋਗ੍ਰਾਮਿੰਗ ਭਾਸ਼ਾ ਦੇ ਸੋਧੇ ਹੋਏ ਸੰਸਕਰਣ 'ਤੇ ਆਧਾਰਤ ਹੈ। ਇਹ ਭਾਸ਼ਾ ਬੱਚਿਆਂ ਨੂੰ ਪ੍ਰੋਗ੍ਰਾਮਿੰਗ ਸੰਕਲਪ ਸਿਖਾਉਣ ਲਈ ਵਿਕਸਿਤ ਕੀਤੀ ਗਈ ਸੀ ਅਤੇ ਇਹ ਤੁਹਾਡੇ ਲਈ ਇੱਕ ਏਜੰਟ ਨੂੰ ਨਿਯੰਤਰਿਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦੀ ਹੈ ਜਿਸਨੂੰ '**turtle**' ਕਿਹਾ ਜਾਂਦਾ ਹੈ, ਜੋ ਹਿਲ ਸਕਦਾ ਹੈ ਅਤੇ ਪਿੱਛੇ ਨਿਸ਼ਾਨ ਛੱਡਦਾ ਹੈ। ਇਸ ਨਾਲ ਜਟਿਲ ਜਿਹਾਜਾਤਮਕ ਰੂਪ ਬਣਾਉਣਾ ਮੁਮਕਿਨ ਹੁੰਦਾ ਹੈ, ਜੋ ਕਿ ਏਜੰਟ ਦੀ ਵਰਤਾਰਾ ਨੂੰ ਸਮਝਣ ਦਾ ਬਹੁਤ দৃਸ਼ਮੀ ਤਰੀਕਾ ਹੈ। -ਨੈਟਲੋਗੋ ਵਿੱਚ, ਅਸੀਂ `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` ਕਿਸਮ ਦਾ ਨਾਮ ਹੈ, ਅਤੇ ਅਸੀਂ ਇਕਵਚਨ ਅਤੇ ਬਹੁਵਚਨ ਦੋਹਾਂ ਸ਼ਬਦ ਦੱਸਣੇ ਪੈਂਦੇ ਹਨ, ਕਿਉਂਕਿ ਵੱਖ-ਵੱਖ ਕਮਾਂਡਸ ਸਪਸ਼ਟਤਾ ਲਈ ਵੱਖਰੇ ਰੂਪ ਵਰਤਦੀਆਂ ਹਨ। -> ✅ ਅਸੀਂ ਨੈਟਲੋਗੋ ਭਾਸ਼ਾ ਨੂੰ ਸਿੱਖਣ ਵਿੱਚ ਨਹੀਂ ਜਾਵਾਂਗੇ - ਜੇ ਤੁਸੀਂ ਹੋਰ ਸਿੱਖਣ ਵਿੱਚ ਰੁਚੀ ਰੱਖਦੇ ਹੋ ਤਾਂ ਤੁਸੀਂ ਸ਼ਾਨਦਾਰ [ਬਿਗਿਨਰਜ਼ ਇੰਟਰਐਕਟਿਵ ਨੈਟਲੋਗੋ ਡਿਕਸ਼ਨਰੀ](https://ccl.northwestern.edu/netlogo/bind/) ਸਰੋਤ 'ਤੇ ਜਾ ਸਕਦੇ ਹੋ। +> ✅ ਅਸੀਂ NetLogo ਭਾਸ਼ਾ ਨੂੰ ਸਿੱਖਣ ਵਿੱਚ ਘੁੰਮਣ ਵਾਲ਼ੇ ਨਹੀਂ ਹਾਂ - ਜੇ ਤੁਹਾਨੂੰ ਹੋਰ ਸਿੱਖਣ ਵਿੱਚ ਦਿਲਚਸਪੀ ਹੈ ਤਾਂ [ਬਿਗਿਨਰਜ਼ ਇੰਟਰਐਕਟਿਵ NetLogo ਡਿਕਸ਼ਨਰੀ](https://ccl.northwestern.edu/netlogo/bind/) ਸ਼ਾਨਦਾਰ ਸਰੋਤ ਵੇਖ ਸਕਦੇ ਹੋ। -ਤੁਸੀਂ ਨੈਟਲੋਗੋ ਨੂੰ [ਡਾਊਨਲੋਡ](https://ccl.northwestern.edu/netlogo/download.shtml) ਅਤੇ ਇੰਸਟਾਲ ਕਰਕੇ ਇਸਨੂੰ ਅਜ਼ਮਾ ਸਕਦੇ ਹੋ। +ਤੁਸੀਂ NetLogo ਨੂੰ [ਡਾਊਨਲੋਡ](https://ccl.northwestern.edu/netlogo/download.shtml) ਕਰਕੇ ਇੰਸਟਾਲ ਕਰਕੇ ਇਹਨਾਂ ਨੂੰ ਅਜ਼ਮਾ ਸਕਦੇ ਹੋ। -### ਮਾਡਲਾਂ ਦੀ ਲਾਇਬ੍ਰੇਰੀ +### ਮਾਡਲਾਂ ਦੀ ਲਾਇਬਰੇਰੀ -ਨੈਟਲੋਗੋ ਦੀ ਇੱਕ ਵਧੀਆ ਗੱਲ ਇਹ ਹੈ ਕਿ ਇਸ ਵਿੱਚ ਕੰਮ ਕਰਦੇ ਮਾਡਲਾਂ ਦੀ ਇੱਕ ਲਾਇਬ੍ਰੇਰੀ ਸ਼ਾਮਲ ਹੈ, ਜਿਸਨੂੰ ਤੁਸੀਂ ਅਜ਼ਮਾ ਸਕਦੇ ਹੋ। **File → Models Library** 'ਤੇ ਜਾਓ, ਅਤੇ ਤੁਹਾਡੇ ਕੋਲ ਮਾਡਲਾਂ ਦੀਆਂ ਕਈ ਸ਼੍ਰੇਣੀਆਂ ਵਿੱਚੋਂ ਚੁਣਨ ਲਈ ਹੈ। +NetLogo ਦੀ ਇੱਕ ਵੱਡੀ ਖੂਬੀ ਇਹ ਹੈ ਕਿ ਇਸ ਵਿੱਚ ਕੰਮ ਕਰਨ ਵਾਲੇ ਮਾਡਲਾਂ ਦੀ ਲਾਇਬਰੇਰੀ ਹੈ, ਜਿਨ੍ਹਾਂ ਨੂੰ ਤੁਸੀਂ ਅਜ਼ਮਾ ਸਕਦੇ ਹੋ। ਜਾਵੋ **File → Models Library** ਤੇ, ਅਤੇ ਤੁਹਾਡੇ ਕੋਲ ਮਾਡਲਾਂ ਦੇ ਕਈ ਸ਼੍ਰੇਣੀਆਂ ਹੁੰਦੀਆਂ ਹਨ। -ਨੈਟਲੋਗੋ ਮਾਡਲਾਂ ਦੀ ਲਾਇਬ੍ਰੇਰੀ +NetLogo Models Library -> ਦਿਮਿਤਰੀ ਸੋਸ਼ਨਿਕੋਵ ਦੁਆਰਾ ਮਾਡਲ ਲਾਇਬ੍ਰੇਰੀ ਦਾ ਸਕ੍ਰੀਨਸ਼ਾਟ +> ਡਿਮਿਤਰੀ ਸੋਸ਼ਨਿਕੋਵ ਦੁਆਰਾ ਮਾਡਲ ਲਾਇਬਰੇਰੀ ਦੀ ਸਕ੍ਰੀਨਸ਼ਾਟ -ਤੁਸੀਂ ਮਾਡਲਾਂ ਵਿੱਚੋਂ ਇੱਕ ਖੋਲ੍ਹ ਸਕਦੇ ਹੋ, ਉਦਾਹਰਣ ਲਈ **Biology → Flocking**। +ਤੁਸੀਂ ਕਿਸੇ ਇੱਕ ਮਾਡਲ ਨੂੰ ਖੋਲ੍ਹ ਸਕਦੇ ਹੋ, ਉਦਾਹਰਣ ਵਜੋਂ **Biology → Flocking**। ### ਮੁੱਖ ਸਿਧਾਂਤ -ਮਾਡਲ ਖੋਲ੍ਹਣ ਤੋਂ ਬਾਅਦ, ਤੁਹਾਨੂੰ ਨੈਟਲੋਗੋ ਦੇ ਮੁੱਖ ਸਕ੍ਰੀਨ 'ਤੇ ਲਿਆਂਦਾ ਜਾਂਦਾ ਹੈ। ਇੱਥੇ ਇੱਕ ਨਮੂਨਾ ਮਾਡਲ ਹੈ ਜੋ ਵੁਲਫ਼ ਅਤੇ ਭੇਡਾਂ ਦੀ ਆਬਾਦੀ ਦਾ ਵਰਣਨ ਕਰਦਾ ਹੈ, ਜਦੋਂ ਕਿ ਸੰਸਾਧਨ ਸੀਮਤ ਹਨ (ਘਾਹ)। +ਮਾਡਲ ਖੋਲ੍ਹਣ ਤੋਂ ਬਾਅਦ, ਤੁਹਾਨੂੰ ਮੁੱਖ NetLogo ਸਕ੍ਰੀਨ 'ਤੇ ਲਿਜਾਇਆ ਜਾਂਦਾ ਹੈ। ਇੱਥੇ ਇੱਕ ਨਮੂਨਾ ਮਾਡਲ ਹੈ ਜੋ ਬੱਦੀਆਂ ਅਤੇ ਭੇਂਡਿਆਂ ਦੀ ਆਬਾਦੀ ਨੂੰ ਵਿਆਖਿਆ ਕਰਦਾ ਹੈ, ਸੀਮਿਤ ਸਾਧਨਾਂ (ਘਾਹ) ਦੇ ਢੰਗ ਨਾਲ। -![ਨੈਟਲੋਗੋ ਮੁੱਖ ਸਕ੍ਰੀਨ](../../../../../translated_images/pa/NetLogo-Main.32653711ec1a01b3.webp) +![NetLogo Main Screen](../../../../../translated_images/pa/NetLogo-Main.32653711ec1a01b3.webp) -> ਦਿਮਿਤਰੀ ਸੋਸ਼ਨਿਕੋਵ ਦੁਆਰਾ ਸਕ੍ਰੀਨਸ਼ਾਟ +> ਡਿਮਿਤਰੀ ਸੋਸ਼ਨਿਕੋਵ ਦੁਆਰਾ ਸਕ੍ਰੀਨਸ਼ਾਟ ਇਸ ਸਕ੍ਰੀਨ 'ਤੇ, ਤੁਸੀਂ ਦੇਖ ਸਕਦੇ ਹੋ: -* **ਇੰਟਰਫੇਸ** ਭਾਗ ਜਿਸ ਵਿੱਚ ਸ਼ਾਮਲ ਹੈ: +* **ਇੰਟਰਫੇਸ** ਸੈਕਸ਼ਨ ਜਿਸ ਵਿੱਚ ਸ਼ਾਮਿਲ ਹੈ: - ਮੁੱਖ ਖੇਤਰ, ਜਿੱਥੇ ਸਾਰੇ ਏਜੰਟ ਰਹਿੰਦੇ ਹਨ - - ਵੱਖ-ਵੱਖ ਨਿਯੰਤਰਣ: ਬਟਨ, ਸਲਾਈਡਰ, ਆਦਿ - - ਗ੍ਰਾਫ, ਜਿਨ੍ਹਾਂ ਨੂੰ ਤੁਸੀਂ ਸਿਮੂਲੇਸ਼ਨ ਦੇ ਪੈਰਾਮੀਟਰਾਂ ਨੂੰ ਪ੍ਰਦਰਸ਼ਿਤ ਕਰਨ ਲਈ ਵਰਤ ਸਕਦੇ ਹੋ -* **ਕੋਡ** ਟੈਬ ਜਿਸ ਵਿੱਚ ਸੰਪਾਦਕ ਸ਼ਾਮਲ ਹੈ, ਜਿੱਥੇ ਤੁਸੀਂ ਨੈਟਲוגੋ ਪ੍ਰੋਗਰਾਮ ਲਿਖ ਸਕਦੇ ਹੋ + - ਵੱਖਰੇ ਕੰਟਰੋਲ: ਬਟਨ, ਸਲਾਈਡਰ ਆਦਿ + - ਗ੍ਰਾਫ ਜੋ ਤੁਸੀਂ ਸਿਮੂਲੇਸ਼ਨ ਦੇ ਪੈਰਾਮੀਟਰਾਂ ਨੂੰ ਦਰਸਾਉਣ ਲਈ ਵਰਤ ਸਕਦੇ ਹੋ +* **ਕੋਡ** ਟੈਬ ਜਿਸ ਵਿੱਚ ਸੰਪਾਦਕ ਹੁੰਦਾ ਹੈ, ਜਿੱਥੇ ਤੁਸੀਂ NetLogo ਪ੍ਰੋਗ੍ਰਾਮ ਲਿਖ ਸਕਦੇ ਹੋ -ਜਿਆਦਾਤਰ ਮਾਮਲਿਆਂ ਵਿੱਚ, ਇੰਟਰਫੇਸ ਵਿੱਚ ਇੱਕ **ਸੈਟਅੱਪ** ਬਟਨ ਹੁੰਦਾ ਹੈ, ਜੋ ਸਿਮੂਲੇਸ਼ਨ ਦੀ ਸਥਿਤੀ ਨੂੰ ਸ਼ੁਰੂ ਕਰਦਾ ਹੈ, ਅਤੇ ਇੱਕ **ਗੋ** ਬਟਨ ਹੁੰਦਾ ਹੈ ਜੋ ਕਾਰਵਾਈ ਸ਼ੁਰੂ ਕਰਦਾ ਹੈ। ਇਹ ਸਬੰਧਤ ਹੈਂਡਲਰਾਂ ਦੁਆਰਾ ਸੰਭਾਲੇ ਜਾਂਦੇ ਹਨ ਜੋ ਇਸ ਤਰ੍ਹਾਂ ਦੇਖਦੇ ਹਨ: +ਜ਼ਿਆਦਾਤਰ ਮਾਮਲਿਆਂ ਵਿੱਚ, ਇੰਟਰਫੇਸ ਵਿੱਚ ਇੱਕ **Setup** ਬਟਨ ਹੁੰਦਾ ਹੈ, ਜੋ ਸਿਮੂਲੇਸ਼ਨ ਦੀ ਸਥਿਤੀ ਸ਼ੁਰੂ ਕਰਦਾ ਹੈ, ਅਤੇ ਇੱਕ **Go** ਬਟਨ ਜੋ ਕਾਰਗੁਜ਼ਾਰੀ ਸ਼ੁਰੂ ਕਰਦਾ ਹੈ। ਇਹਨਾਂ ਨੂੰ ਕੋਡ ਵਿੱਚ ਸੰਬੰਧਿਤ ਹੈਂਡਲਰਾਂ ਦੁਆਰਾ ਸੰਭਾਲਿਆ ਜਾਂਦਾ ਹੈ ਜੋ ਇਸ ਤਰ੍ਹਾਂ ਲੱਗਦੇ ਹਨ: ``` to go [ @@ -81,17 +81,79 @@ to go [ ] ``` -ਨੈਟਲੋਗੋ ਦੀ ਦੁਨੀਆ ਹੇਠਾਂ ਦਿੱਤੇ ਵਸਤੂਆਂ 'ਤੇ ਆਧਾਰਿਤ ਹੈ: +NetLogo ਦੀ ਦੁਨੀਆ ਹੇਠਾਂ ਦਿੱਤੇ ਚੀਜ਼ਾਂ 'ਤੇ ਬਣੀ ਹੈ: -* **ਏਜੰਟ** (ਟਰਟਲ) ਜੋ ਖੇਤਰ ਵਿੱਚ ਹਿਲ ਸਕਦੇ ਹਨ ਅਤੇ ਕੁਝ ਕਰ ਸਕਦੇ ਹਨ। ਤੁਸੀਂ `ask turtles [...]` ਸਿੰਟੈਕਸ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਏਜੰਟਾਂ ਨੂੰ ਹੁਕਮ ਦੇ ਸਕਦੇ ਹੋ, ਅਤੇ ਬ੍ਰੈਕਟਾਂ ਵਿੱਚ ਕੋਡ ਸਾਰੇ ਏਜੰਟਾਂ ਦੁਆਰਾ *ਟਰਟਲ ਮੋਡ* ਵਿੱਚ ਚਲਾਇਆ ਜਾਂਦਾ ਹੈ। -* **ਪੈਚ** ਖੇਤਰ ਦੇ ਵਰਗ ਆਕਾਰ ਦੇ ਖੇਤਰ ਹਨ, ਜਿਨ੍ਹਾਂ 'ਤੇ ਏਜੰਟ ਰਹਿੰਦੇ ਹਨ। ਤੁਸੀਂ ਇੱਕੋ ਪੈਚ 'ਤੇ ਸਾਰੇ ਏਜੰਟਾਂ ਨੂੰ ਸੰਦਰਭਿਤ ਕਰ ਸਕਦੇ ਹੋ, ਜਾਂ ਤੁਸੀਂ ਪੈਚ ਦੇ ਰੰਗ ਅਤੇ ਕੁਝ ਹੋਰ ਗੁਣਾਂ ਨੂੰ ਬਦਲ ਸਕਦੇ ਹੋ। ਤੁਸੀਂ ਪੈਚਾਂ ਨੂੰ ਕੁਝ ਕਰਨ ਲਈ `ask patches` ਵੀ ਕਰ ਸਕਦੇ ਹੋ। -* **ਨਿਗਰਾਨੀ ਕਰਨ ਵਾਲਾ** ਇੱਕ ਵਿਲੱਖਣ ਏਜੰਟ ਹੈ ਜੋ ਦੁਨੀਆ ਨੂੰ ਨਿਯੰਤਰਿਤ ਕਰਦਾ ਹੈ। ਸਾਰੇ ਬਟਨ ਹੈਂਡਲਰ *ਨਿਗਰਾਨੀ ਮੋਡ* ਵਿੱਚ ਚਲਾਏ ਜਾਂਦੇ ਹਨ। +* **ਏਜੰਟ** (ਕੱਛੂਏ) ਜੋ ਖੇਤਰ ਵਿੱਚ ਹਿਲ ਸਕਦੇ ਹਨ ਅਤੇ ਕੁਝ ਕਰ ਸਕਦੇ ਹਨ। ਤੁਸੀਂ ਏਜੰਟਾਂ ਨੂੰ `ask turtles [...]` ਸਿੰਟੈਕਸ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਹੁਕਮ ਦਿੰਦੇ ਹੋ, ਅਤੇ ਕੋਡ ਬ੍ਰੈਕਟਸ ਵਿੱਚ ਸਭ ਏਜੰਟਾਂ ਦੁਆਰਾ *ਕੱਛੂਏ ਮੋਡ* ਵਿੱਚ ਚਲਾਇਆ ਜਾਂਦਾ ਹੈ। +* **ਪੈਚ** ਖੇਤਰ ਦੇ ਵਰਗਾਕਾਰ ਇਲਾਕੇ ਹਨ, ਜਿੱਥੇ ਏਜੰਟ ਰਹਿੰਦੇ ਹਨ। ਤੁਸੀਂ ਇੱਕੋ ਪੈਚ 'ਤੇ ਸਾਰੇ ਏਜੰਟਾਂ ਨੂੰ ਸੰਬੋਧਿਤ ਕਰ ਸਕਦੇ ਹੋ, ਜਾਂ ਪੈਚ ਦੇ ਰੰਗਾਂ ਅਤੇ ਹੋਰ ਕੁਝ ਗੁਣਾਂ ਨੂੰ ਬਦਲ ਸਕਦੇ ਹੋ। ਤੁਸੀਂ `ask patches` ਵੀ ਕਰਕੇ ਕੁਝ ਕਰਵਾ ਸਕਦੇ ਹੋ। +* **ਦਰਸ਼ਕ** ਇੱਕ ਵਿਲੱਖਣ ਏਜੰਟ ਹੈ ਜੋ ਦੁਨੀਆ ਨੂੰ ਕੰਟਰੋਲ ਕਰਦਾ ਹੈ। ਸਾਰੇ ਬਟਨ ਹੈਂਡਲਰ *ਦਰਸ਼ਕ ਮੋਡ* ਵਿੱਚ ਚਲਦੇ ਹਨ। -> ✅ ਮਲਟੀ-ਏਜੰਟ ਵਾਤਾਵਰਣ ਦੀ ਖੂਬਸੂਰਤੀ ਇਹ ਹੈ ਕਿ ਟਰਟਲ ਮੋਡ ਜਾਂ ਪੈਚ ਮੋਡ ਵਿੱਚ ਚਲ ਰਹੀ ਕੋਡ ਸਾਰੇ ਏਜੰਟਾਂ ਦੁਆਰਾ ਇੱਕੋ ਸਮੇਂ ਵਿੱਚ ਸਮਾਂਤਰ ਤੌਰ 'ਤੇ ਚਲਾਈ ਜਾਂਦੀ ਹੈ। ਇਸ ਤਰ੍ਹਾਂ, ਥੋੜ੍ਹਾ ਜਿਹਾ ਕੋਡ ਲਿਖ ਕੇ ਅਤੇ ਵਿਅਕਤੀਗਤ ਏਜੰਟ ਦੇ ਵਿਵਹਾਰ ਨੂੰ ਪ੍ਰੋਗਰਾਮ ਕਰਕੇ, ਤੁਸੀਂ ਸਿਮੂਲੇਸ਼ਨ ਸਿਸਟਮ ਦੇ ਕੁੱਲ ਵਿਵਹਾਰ ਨੂੰ ਜਟਿਲ ਬਣਾ ਸਕਦੇ ਹੋ। +> ✅ ਮਲਟੀ-ਏਜੰਟ ਵਾਤਾਵਰਣ ਦੀ ਸੁੰਦਰਤਾ ਇਹ ਹੈ ਕਿ ਜੋ ਕੋਡ ਕੱਛੂਏ ਮੋਡ ਜਾਂ ਪੈਚ ਮੋਡ ਵਿੱਚ ਚਲਦਾ ਹੈ ਉਹ ਸਭ ਏਜੰਟਾਂ ਦੁਆਰਾ ਸਿੰਕ੍ਰੋਨਾਸ਼ਨ ਵਿੱਚ ਚਲੂ ਹੁੰਦਾ ਹੈ। ਇਸ ਲਈ, ਥੋੜ੍ਹਾ ਜਿਹਾ ਕੋਡ ਲਿਖ ਕੇ ਅਤੇ ਵੱਖਰੇ ਏਜੰਟ ਦੀ ਵਰਤਾਰਾ ਨੂੰ ਪ੍ਰੋਗ੍ਰਾਮ ਕਰਕੇ, ਤੁਸੀਂ ਪੂਰੇ ਸਿਮੂਲੇਸ਼ਨ ਸਿਸਟਮ ਦਾ ਜਟਿਲ ਵਰਤਾਰਾ ਪੈਦਾ ਕਰ ਸਕਦੇ ਹੋ। ### ਫਲਾਕਿੰਗ -ਮਲਟੀ-ਏਜੰਟ ਵਿਵਹਾਰ ਦੇ ਇੱਕ ਉਦਾਹਰਣ ਵਜੋਂ, ਆਓ **[ਫਲਾਕਿੰਗ](https://en.wikipedia.org/wiki/Flocking_(behavior))** 'ਤੇ ਵਿਚਾਰ ਕਰੀਏ। +ਮਲਟੀ-ਏਜੰਟ ਵਰਤਾਰਾ ਦੇ ਉਦਾਹਰਣ ਵਜੋਂ, ਆਓ **[ਫਲਾਕਿੰਗ](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](https://github.com/Azure/co-op-translator) ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਕੀਤਾ ਗਿਆ ਹੈ। ਜਦੋਂ ਕਿ ਅਸੀਂ ਸਹੀਤਾਵਾਂ ਲਈ ਯਤਨਸ਼ੀਲ ਹਾਂ, ਕਿਰਪਾ ਕਰਕੇ ਧਿਆਨ ਰੱਖੋ ਕਿ ਸਵੈਚਾਲਿਤ ਅਨੁਵਾਦਾਂ ਵਿੱਚ ਗਲਤੀਆਂ ਜਾਂ ਅਸਮੱਤਿਆਵਾਂ ਹੋ ਸਕਦੀਆਂ ਹਨ। ਮੂਲ ਦਸਤਾਵੇਜ਼ ਆਪਣੀ ਮੂਲ ਭਾਸ਼ਾ ਵਿੱਚ ਅਧਿਕਾਰਕ ਸਰੋਤ ਮੰਨਿਆ ਜਾਣਾ ਚਾਹੀਦਾ ਹੈ। ਜਰੂਰੀ ਜਾਣਕਾਰੀ ਲਈ, ਪੇਸ਼ੇਵਰ ਮਨੁੱਖੀ ਅਨੁਵਾਦ ਦੀ ਸਿਫ਼ਾਰਸ਼ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਅਸੀਂ ਇਸ ਅਨੁਵਾਦ ਦੇ ਉਪਯੋਗ ਤੋਂ ਪੈਦਾ ਹੋਣ ਵਾਲੀਆਂ ਕਿਸੇ ਵੀ ਗਲਤਫਹਿਮੀਆਂ ਜਾਂ ਗਲਤ ਵਿਆਖਿਆਵਾਂ ਲਈ ਜਵਾਬਦੇਹ ਨਹੀਂ ਹਾਂ। + \ No newline at end of file diff --git a/translations/pcm/.co-op-translator.json b/translations/pcm/.co-op-translator.json index 2555dda1e1..da812d526b 100644 --- a/translations/pcm/.co-op-translator.json +++ b/translations/pcm/.co-op-translator.json @@ -5,6 +5,12 @@ "source_file": "AGENTS.md", "language_code": "pcm" }, + "CONTRIBUTING.md": { + "original_hash": "c6fd7e781b67111a90abd166d0ce4aa0", + "translation_date": "2026-07-08T18:24:34+00:00", + "source_file": "CONTRIBUTING.md", + "language_code": "pcm" + }, "README.md": { "original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b", "translation_date": "2026-04-06T16:05:28+00:00", @@ -17,6 +23,19 @@ "source_file": "SECURITY.md", "language_code": "pcm" }, + "__translation_failures__": { + "lessons/sketchnotes/LICENSE.md": { + "original_hash": "45ab63a2cd8f5faef6c9b150618837a4", + "source_file": "lessons/sketchnotes/LICENSE.md", + "language_code": "pcm", + "failure_date": "2026-07-08T18:20:25+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-11-18T18:53:53+00:00", @@ -54,8 +73,8 @@ "language_code": "pcm" }, "examples/README.md": { - "original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7", - "translation_date": "2025-11-18T18:12:59+00:00", + "original_hash": "7883d52c2e2a221e0b07a7b112a149b9", + "translation_date": "2026-07-08T18:16:15+00:00", "source_file": "examples/README.md", "language_code": "pcm" }, @@ -66,8 +85,8 @@ "language_code": "pcm" }, "lessons/0-course-setup/how-to-run.md": { - "original_hash": "a4717bd9103b9f6cd84d534b83534689", - "translation_date": "2026-01-16T07:31:13+00:00", + "original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1", + "translation_date": "2026-07-08T18:16:33+00:00", "source_file": "lessons/0-course-setup/how-to-run.md", "language_code": "pcm" }, @@ -191,6 +210,12 @@ "source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md", "language_code": "pcm" }, + "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": { + "original_hash": "99b816b6a4957ef4100cee4c4221dff9", + "translation_date": "2026-07-08T18:08:54+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", + "language_code": "pcm" + }, "lessons/4-ComputerVision/08-TransferLearning/lab/README.md": { "original_hash": "7765935c35fcee69b9fe2d0cfd6963e2", "translation_date": "2025-11-18T18:18:24+00:00", @@ -330,8 +355,8 @@ "language_code": "pcm" }, "lessons/5-NLP/README.md": { - "original_hash": "8ef02a9318257ea140ed3ed74442096d", - "translation_date": "2025-11-18T18:35:10+00:00", + "original_hash": "038df6f1a73e49f6430740da083bfd6d", + "translation_date": "2026-07-08T18:17:01+00:00", "source_file": "lessons/5-NLP/README.md", "language_code": "pcm" }, diff --git a/translations/pcm/CONTRIBUTING.md b/translations/pcm/CONTRIBUTING.md new file mode 100644 index 0000000000..dbb229a8cd --- /dev/null +++ b/translations/pcm/CONTRIBUTING.md @@ -0,0 +1,29 @@ +# How to Put Hand for AI-For-Beginners + +Thank you as you show interest to put hand for AI-For-Beginners! We dey welcome translations, lesson corrections, and correct how e dey form. + +## Microsoft Contributor License Agreement (CLA) + +Dis project dey open for contributions and suggestions. Most contributions go need make you agree for Contributor License Agreement (CLA) wey talk say you get right and you really fit gimme us rights to use your contribution. For more info, visit [https://cla.microsoft.com](https://cla.microsoft.com). + +When you submit pull request, CLA-bot go check automatically if you need give CLA and go put correct label or comment for the PR. Just follow the instructions wey the bot go give you. You go need do this only one time for all repos wey dey use our CLA. + +## How to Put Hand + +### 1. Correct Typos / Code Wahala +If you see typo or bug for any Jupyter notebook or lesson markdown file: +1. Fork the repo. +2. Correct the typo or broken link. +3. Submit Pull Request wey clear explain the correction. + +### 2. Submit Translations +We dey welcome translations of lessons for other languages! Abeg put translations for `translations/` folder using the correct folder names wey dey there (like `translations/es/`, `translations/pt-BR/`, `translations/zh-CN/`). + +For more info, see [etc/CONTRIBUTING.md](etc/CONTRIBUTING.md). + +--- + + +**Disclaimer**: +Dis document don translate wit AI translation service [Co-op Translator](https://github.com/Azure/co-op-translator). Even tho we dey try make am correct, abeg make you know say automated translation fit get errors or mistakes. Di original document for dia own language na im be di correct source. For important info, make person wey sabi human translation do am. We no go responsible for any misunderstanding or wrong understanding wey fit happen because of dis translation. + \ No newline at end of file diff --git a/translations/pcm/examples/README.md b/translations/pcm/examples/README.md index e0916aba96..0910dbeb7e 100644 --- a/translations/pcm/examples/README.md +++ b/translations/pcm/examples/README.md @@ -1,38 +1,38 @@ # Beginner-Friendly AI Examples -Welcome! Dis directory get simple, standalone examples wey go help you start wit AI and machine learning. Each example dey designed make e easy for beginners wit detailed comments and step-by-step explanation. +Welcome! Dis directory get simple, standalone examples to help you start wit AI and machine learning. Each example na beginner-friendly wit detailed comments and step-by-step explanations. ## 📚 Examples Overview | Example | Description | Difficulty | Prerequisites | |---------|-------------|------------|---------------| -| [Hello AI World](../../../examples/01-hello-ai-world.py) | Your first AI program - simple pattern recognition | ⭐ Beginner | Python basics | -| [Simple Neural Network](../../../examples/02-simple-neural-network.py) | Build a neural network from scratch | ⭐⭐ Beginner+ | Python, basic math | -| [Image Classifier](./03-image-classifier.ipynb) | Classify images wit pre-trained model | ⭐⭐ Beginner+ | Python, numpy | -| [Text Sentiment](../../../examples/04-text-sentiment.py) | Analyze text sentiment (positive/negative) | ⭐⭐ Beginner+ | Python | +| [Hello AI World](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/01-hello-ai-world.py) | Your first AI program - simple pattern recognition | ⭐ Beginner | Python basics | +| [Simple Neural Network](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/02-simple-neural-network.py) | Build a neural network from scratch | ⭐⭐ Beginner+ | Python, basic math | +| [Image Classifier](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/03-image-classifier.ipynb) | Classify images with a pre-trained model | ⭐⭐ Beginner+ | Python, numpy | +| [Text Sentiment](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/04-text-sentiment.py) | Analyze text sentiment (positive/negative) | ⭐⭐ Beginner+ | Python | ## 🚀 Getting Started ### Prerequisites -Make sure say you don install Python (3.8 or higher dey recommended). Install di required packages: +Make sure say you get Python installed (3.8 or higher dey recommended). Install di necessary packages: ```bash -# For Python scripts +# For Python skrip dem pip install numpy # For Jupyter notebooks (image classifier) pip install jupyter numpy pillow tensorflow ``` -Or use di conda environment wey dey di main curriculum: +Or use di conda environment from di main curriculum: ```bash conda env create --name ai4beg --file ../environment.yml conda activate ai4beg ``` -### Running di Examples +### Running the Examples **For Python scripts (.py files):** ```bash @@ -46,23 +46,23 @@ jupyter notebook 03-image-classifier.ipynb ## 📖 Learning Path -We recommend say you follow di examples one by one: +We recommend sey make you follow di examples in order: 1. **Start wit "Hello AI World"** - Learn di basics of pattern recognition 2. **Build a Simple Neural Network** - Understand how neural networks dey work -3. **Try di Image Classifier** - See AI in action wit real images +3. **Try di Image Classifier** - See AI for action wit real images 4. **Analyze Text Sentiment** - Explore natural language processing ## 💡 Tips for Beginners -- **Read di code comments well well** - Dem dey explain wetin each line dey do +- **Read di code comments well-well** - Dem dey explain wetin each line dey do - **Experiment!** - Try change values and see wetin go happen -- **No worry if you no understand everything** - Learning dey take time +- **No worry if you no understand everything** - Learning go take time - **Ask questions** - Use di [Discussion board](https://github.com/microsoft/AI-For-Beginners/discussions) ## 🔗 Next Steps -After you don complete dis examples, explore di full curriculum: +After you finish dem examples, explore di full curriculum: - [Introduction to AI](../lessons/1-Intro/README.md) - [Neural Networks](../lessons/3-NeuralNetworks/README.md) - [Computer Vision](../lessons/4-ComputerVision/README.md) @@ -70,18 +70,18 @@ After you don complete dis examples, explore di full curriculum: ## 🤝 Contributing -You find dis examples helpful? Help us make dem better: -- Report issues or suggest improvements +You find dem examples helpful? Help us make dem beta: +- Report any wahala or suggest how to improve am - Add more examples for beginners -- Improve documentation and comments +- Improve di documentation and comments --- -*Remember: Every expert na once beginner. Enjoy your learning! 🎓* +*Remember: Every expert bin once na beginner. Happy learning! 🎓* --- -**Disclaimer**: -Dis dokyument don use AI transle-shon service [Co-op Translator](https://github.com/Azure/co-op-translator) do di transle-shon. Even as we dey try make am correct, abeg sabi say transle-shon wey machine do fit get mistake or no dey accurate well. Di original dokyument for im native language na di one wey correct pass. For important mata, e good make una use professional human transle-shon. We no go fit take blame for any misunderstanding or wrong interpretation wey fit happen because una use dis transle-shon. +**Disclaimer**: +Dis document don translate wit AI translation service [Co-op Translator](https://github.com/Azure/co-op-translator). Even tho we dey try make am correct, abeg make you know say automated translation fit get errors or mistakes. Di original document for dia own language na im be di correct source. For important info, make person wey sabi human translation do am. We no go responsible for any misunderstanding or wrong understanding wey fit happen because of dis translation. \ No newline at end of file diff --git a/translations/pcm/lessons/0-course-setup/how-to-run.md b/translations/pcm/lessons/0-course-setup/how-to-run.md index f2e602e89b..d3610456dd 100644 --- a/translations/pcm/lessons/0-course-setup/how-to-run.md +++ b/translations/pcm/lessons/0-course-setup/how-to-run.md @@ -1,12 +1,12 @@ -# How to Run the Code +# How to Run di Code -Dis curriculum get plenti executable examples and labs wey you go like run. To fit do dis, you need beta skill to execute Python code for Jupyter Notebooks wey dem provide as part of dis curriculum. You get plenty ways to run the code: +Dis curriculum get plenti executable example dem and lab dem wey you go like run. To fit do dis, you need di ability to run Python code for Jupyter Notebooks wey dem provide as part of dis curriculum. You get plenty options to run di code: -## Run locally on your computer +## Run am for your computer -To run the code for your computer, you need to get Python installation. One wey we fit recommend na to install **[miniconda](https://conda.io/en/latest/miniconda.html)** - e light well well and e support `conda` package manager for different Python **virtual environments**. +To run di code for your own computer, you need to install Python first. One wey we recommend na to install **[miniconda](https://conda.io/en/latest/miniconda.html)** - e light well well and e get support for `conda` package manager for different Python **virtual environments**. -After you don install miniconda, clone the repository and create one virtual environment to use for dis course: +After you don install miniconda, clone di repository and create virtual environment wey you go use for dis course: ```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 ``` -### Using Visual Studio Code with Python Extension +### How to Take Use Visual Studio Code with Python Extension -Dis curriculum better pass if you use am inside [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) with [Python Extension](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste). +Dis curriculum beta pass if you open am for [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) with [Python Extension](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste). -> **Note**: Once you clone and open the directory for VS Code, e go automatically remind you to install Python extensions. You go still need to install miniconda as we describe for top. +> **Note**: Once you clone am and open di folder for VS Code, e go automatically want make you install Python extensions. You still go need install miniconda as we talk for up. -> **Note**: If VS Code tell you make you re-open the repository for inside container, you suppose no do am, make you fit use local Python installation. +> **Note**: If VS Code tell you make you open repository again for container, no accept am if you wan use local Python installation. -### Using Jupyter in the Browser +### How to Use Jupyter for Browser -You fit still use Jupyter environment from your browser for your own computer. Both classical Jupyter and JupyterHub dey provide correct development environment with auto-completion, code highlighting, etc. +You fit also run Jupyter environment from your browser for your computer. Both classical Jupyter and JupyterHub dey give you beta development environment with auto-completion, code highlighting, and others. -To start Jupyter locally, waka go the directory wey hold the course, then run: +To start Jupyter for your computer, waka go the course directory, and run: ```bash jupyter notebook @@ -36,36 +36,36 @@ or ```bash jupyterhub ``` -You fit then waka go anybody `.ipynb` files, open dem and start to work. +After dat you fit open any `.ipynb` files, open dem and start to work. -### Running in container +### How to Run Inside Container -One other way to still run the code no be to install Python, na to run the code inside container. Because our repository get special `.devcontainer` folder wey talk how to build container for dis repo, VS Code go fit help you re-open the code inside container. Dis one require say you get Docker installed, and e still dey complex pass, so we recommend am only to people wey sabi well well. +One other way to run Python na to run am inside container. Because our repo get special `.devcontainer` folder wey dey show how to build container for this repo, VS Code dey give chance to open code for container. You go need Docker install, and e go get some yawa, so we recommend am for people wey sabi small. -## Running in the Cloud +## How to Run am for Cloud -If you no want install Python for your own computer, and you get access to cloud resources - one better way na to run the code for cloud. You get plenty ways to do am: +If you no wan install Python for your machine, and you get access to cloud resources - one beta option na to run code for cloud. You get different ways to do am: -* Use **[GitHub Codespaces](https://github.com/features/codespaces)**, wey be virtual environment wey dem create for you on top GitHub, and you fit use VS Code browser interface take access am. If you fit use Codespaces, you fit just click **Code** button for the repo, start codespace, and run am sharp sharp. -* Use **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) dey offer free computer resources for cloud so people like you fit try run code from GitHub. For the front page, dem get button wey make you fit open the repo for Binder - dis one go take you go the binder site quick, wey go build container and start Jupyter web interface for you without wahala. +* Use **[GitHub Codespaces](https://github.com/features/codespaces)**, na virtual environment wey dem create for you for GitHub, wey fit enter through VS Code browser interface. If you get Codespaces access, you fit just click **Code** button for repo, start codespace and run quick quick. +* Use **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) dey give free computing resources for cloud make people like you fit test some code wey dey GitHub. For front page, you go see button to open repo for Binder - e go carry you go binder site quick, wey go build container under and start Jupyter web interface for you without palava. -> **Note**: To stop misuse, Binder block some web resources. Dis one fit make some code no work, especially if the code dey fetch models and/or datasets from public Internet. You fit need find way workaround. Also, the compute resources wey Binder get, simple, so training go slow, especially for the later, more complex lessons. +> **Note**: To make sure say people no misuse am, Binder block some web resources. This fit make some code no work if dem dey fetch models or datasets from public Internet. You fit need find workaround. Compute resources wey Binder provide na basic level, so training go slow, especially for later, more complex lessons dem. -## Running in the Cloud with GPU +## How to Run am for Cloud with GPU -Some of the later lessons for dis curriculum go beta if dem get GPU support. Model training fit slow no GPU. You fit follow some options if you get cloud access through [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste), or from your school: +Some of di later lessons for dis curriculum go beta well if dem get GPU support. Model training fit be very slow if no get am. You fit follow some options, especially if you get cloud access from [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste), or from your school: -* Create [Data Science Virtual Machine](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) and connect to am through Jupyter. You fit then clone the repo enter inside the machine, and start to learn. NC-series VMs get GPU support. +* Create [Data Science Virtual Machine](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) and connect am through Jupyter. You fit clone di repo directly for the machine, and start to learn. NC-series VMs get GPU support. -> **Note**: Some subscriptions, including Azure for Students, no dey come with GPU support straight. You go need check to add GPU cores with technical support request. +> **Note**: Some subscriptions, including Azure for Students, no dey provide GPU support straight. You fit need request extra GPU cores with technical support. -* Create [Azure Machine Learning Workspace](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste), then use Notebook feature for there. [Dis video](https://azure-for-academics.github.io/quickstart/azureml-papers/) show how to clone repository enter Azure ML notebook and start to use am. +* Create [Azure Machine Learning Workspace](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) and use Notebook feature for there. [Dis video](https://azure-for-academics.github.io/quickstart/azureml-papers/) show how to clone repo into Azure ML notebook and start to use am. -You fit still use Google Colab, wey get some free GPU support, and upload Jupyter Notebooks there take run dem one by one. +You fit also use Google Colab wey get some free GPU support, and upload Jupyter Notebooks make you run dem one by one. --- -**Warning**: -Dis document na translation wey AI translation service [Co-op Translator](https://github.com/Azure/co-op-translator) do. Even though we try make am correct, make you sabi say automated translation fit get some mistakes or wahala. Di original document wey dey dia own language na di correct one. For important matter, e better make professional human person translate am. We no go responsible for any wrong understand or mix-up wey fit happen because of dis translation. +**Disclaimer**: +Dis document don translate wit AI translation service [Co-op Translator](https://github.com/Azure/co-op-translator). Even tho we dey try make am correct, abeg make you know say automated translation fit get errors or mistakes. Di original document for dia own language na im be di correct source. For important info, make person wey sabi human translation do am. We no go responsible for any misunderstanding or wrong understanding wey fit happen because of dis translation. \ No newline at end of file diff --git a/translations/pcm/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/pcm/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index 8d10589e44..028203ef98 100644 --- a/translations/pcm/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/pcm/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -6,9 +6,9 @@ "source": [ "# Pre-trained models and transfer learning\n", "\n", - "To train CNN fit take plenty time, and e go need plenty data for di work. But, most of di time na to learn di best low-level filters wey di network dey use to find patterns for images. One question wey fit come be - we fit use one neural network wey dem don train for one dataset and change am to dey classify different images without to train am from scratch?\n", + "Training CNNs fit kɔt plenti taim, an e need plenti data for dat work. Bot plenti taim, di taim na for learn di best low-level filters wey network dey use for find patterns for pictures. One natural question be dis - we fit use one neural network wey dem train on one dataset, then change am to classify different pictures without train am full time?\n", "\n", - "Dis method na **transfer learning**, because we dey carry some knowledge from one neural network model go another one. For transfer learning, we dey usually start with one pre-trained model, wey dem don train for one big image dataset, like **ImageNet**. Dis kind models fit already sabi well well how to find different features from normal images, and many times, just to build one classifier on top di features wey dem don find fit give better result.\n" + "Dis approach na **transfer learning**, because we go transfer some knowledge from one neural network model go another. For transfer learning, we normally start with pre-trained model, wey dem don train on one big picture dataset, like **ImageNet**. Dis kind models fit already do beta job to find different features from generic pictures, and for plenty cases, e be only to build classifier on top of di features wey dem find fit give good result.\n" ] }, { @@ -31,9 +31,9 @@ "source": [ "## Cats vs. Dogs Dataset\n", "\n", - "For dis unit, we go solve one real-life problem wey involve how to classify pictures of cats and dogs. Na why we go use [Kaggle Cats vs. Dogs Dataset](https://www.kaggle.com/c/dogs-vs-cats), wey you fit also download [from Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n", + "For dis unit, we go solve real-life wahala of classifying pictures of cats and dogs. Because of dis, we go use [Kaggle Cats vs. Dogs Dataset](https://www.kaggle.com/c/dogs-vs-cats), we fit also download am [from Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n", "\n", - "Make we download dis dataset and put am inside `data` folder (e fit take small time!):\n" + "Make we download dis dataset and commot am for `data` directory (dis one fit take some time!):\n" ] }, { @@ -64,7 +64,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Sadly, some image file for the dataset don spoil. We need quick cleaning to check for the spoil file dem. To make sure say this tutorial no scatter, we don move the code to check dataset go one module.\n" + "Shakara, some corrupted image files dey for inside the dataset. We gats do quick cleaning to check for corrupted files. So e no go spoil dis tutorial, we move di code wey dey verify dataset go inside one module.\n" ] }, { @@ -333,13 +333,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## How to Load Dataset\n", + "## Di Load Di Dataset\n", "\n", - "For di examples wey we don do before, we dey load datasets wey dey inside Keras already. But now, we go work with our own dataset, wey we go load from one folder wey get images.\n", + "For before example dem, we dey load datasets wey dey inside Keras. Now, we wan handle our own dataset, wey we need to load from one folder wey get image dem.\n", "\n", - "For real life, image datasets fit big well well, and e no go make sense to expect say all di data go fit enter memory. Na why datasets dey usually dey as **generators** wey fit return data small small for training.\n", + "For real life, size of image datasets fit big well-well, and e no possible say all di data go fit for memory. So, datasets dey often represent as **generators** wey fit give data small-small minibatches wey go good for training.\n", "\n", - "To handle image classification, Keras get one special function `image_dataset_from_directory`, wey fit load images from subfolders wey represent different classes. Dis function go also help scale di images, and e fit even divide di dataset into train and test parts:\n" + "For handle image classification, Keras get special function `image_dataset_from_directory`, wey fit load images from subdirectory dem wey represent different class. This function dey also help scale images, plus e fit split dataset into train and test parts:\n" ] }, { @@ -383,9 +383,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "E dey important make you set di same `seed` value for both calls, because e go affect how di images go divide between train and test dataset.\n", + "E important make you set di same `seed` value for both calls, becos e dey affect how e go split images between train and test dataset.\n", "\n", - "Dataset dey automatically pick class names from di directories, and you fit access dem if you need am by calling:\n" + "Dataset dey automatically carry class names from directories, and you fit access dem if you need am by calling:\n" ] }, { @@ -412,7 +412,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Datasets wey we don get fit pass go `fit` function to train di model. Dem get both di images and labels wey match, wey fit loop over using di construction wey dey below:\n" + "Datasets we don get fit well to pass direct to `fit` function to train di model. Dem get both di correct images and labels, we fit loop through dem using dis kain construction:\n" ] }, { @@ -453,7 +453,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "> **Note**: All di images wey dey di dataset na floatint point tensors wey get range 0-255. Before we go fit pass dem give di neural network, we need to scale di values go di 0-1 range. When we dey plot images, we go need do di same thing, or convert di values to di `int` type (wey we dey do for di code wey dey up), so dat `matplotlib` go sabi say we wan plot di original unscaled image.\n" + "> **Note**: Olodi pixta dem for di dataset na floatint point tensors wey get range 0-255. Before we fit pass dem go di neural network, we need scale di values dem enter 0-1 range. Wen we dey plot pixta dem, we go either do di same tins, or convert di values go `int` kain (wey we do for di code weh pass), so dat we fit show `matplotlib` say we wan plot di original unscaled pixta.\n" ] }, { @@ -462,7 +462,7 @@ "source": [ "## Pre-trained models\n", "\n", - "For plenty image classification work, person fit find pre-trained neural network models. Plenty of dis models dey inside `keras.applications` namespace, and even more models dey Internet. Make we see how we fit load and use di simplest VGG-16 model:\n" + "For plenty image classification work, person fit find pre-trained neural network models. Plenti of dem models dey for inside `keras.applications` namespace, plus more models fit still dey for Internet. Make we see how simplest VGG-16 model fit dey loaded and used:\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,20 +520,17 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "E get some important things wey dey here:\n", - "\n", - "* Before you go fit pass input give any pre-trained network, you go need pre-process am in one kain way. You fit do dis one by calling the `preprocess_input` function wey dey, wey go collect batch of images, and return their processed form. For VGG-16 case, dem dey normalize images, and dem dey minus some pre-defined average value for each channel. Na because VGG-16 originally train with dis kain pre-processing.\n", - "\n", - "* Neural network go dey apply to the input batch, and the result wey we go get na batch of 1000-element tensors wey dey show probability of each class. To find the class wey get the highest probability, you fit call `argmax` for this tensor.\n", - "\n", - "* The result wey we get na [number of an `ImageNet` class](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). To understand wetin dis result mean, you fit use `decode_predictions` function, wey go return the top n classes plus their names.\n" + "E get some important tins wey dey here:\n", + "* Before you give any pre-trained network input, e need to get pre-processed for one kain way. Dis one dey do by calling di right `preprocess_input` function, wey dey carry batch of pictures come, then e return di way dem process am. For VGG-16 case, dem dey normalize pictures, den dem dey subtract some pre-set avarage value for each channel. Na because VGG-16 na im dem use dis kain pre-processing train am for beginning.\n", + "* Neural network go apply for di input batch, we go come get result as batch of 1000-element tensors wey dey show probability for each class. We fit find di class wey get highest chance by calling `argmax` for dis tensor.\n", + "* Di result we get na [number of `ImageNet` class](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). To understand dis result, we fit also use `decode_predictions` function, wey dey return di top n classes along with dia names.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Make we see di architecture of di VGG-16 network too:\n" + "Make we also check di architecture of di VGG-16 network:\n" ] }, { @@ -602,7 +609,7 @@ "source": [ "## GPU computations\n", "\n", - "Deep neural networks, like VGG-16 and other modern architectures need plenty power to run. E good make we use GPU acceleration if e dey available. Luckily, Keras go automatically make the computation fast for GPU if e dey available. We fit check if Tensorflow fit use GPU with this code:\n" + "Deep neural networks, like VGG-16 and oda more modern architectures need plenti computational power to run. E make sense to use GPU acceleration, if e dey available. Luckily, Keras go automatically speed up di computations on top di GPU if e dey available. We fit check if Tensorflow fit use GPU by using dis code weh dey below:\n" ] }, { @@ -629,9 +636,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## How to comot VGG features\n", "\n", - "If we wan use VGG-16 take comot features from our images, we go need the model wey no get the final classification layers. We fit create VGG-16 model wey no get top layers wit dis code:\n" + "## Extracting VGG features\n", + "\n", + "If we want to use VGG-16 to extract features from our images, we need the model without final classification layers. We fit for use VGG-16 model without di top layers by dis code:\n" ] }, { @@ -683,9 +691,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Di size of di feature tensor na 7x7x512, but to fit see am well, we gatz change am to 2D form.\n", + "Di size of feature tensor na 7x7x512, but to fit see am we gats change am go 2D shape.\n", "\n", - "Make we try see if di features fit help us classify images. We go manually carry some part of di images (50 minibatches for dis case), and pre-compute dia feature vectors. We fit use Tensorflow **dataset** API do am. Di `map` function dey carry dataset and apply di lambda-function wey dem give am to change am. We go use dis method take build new datasets, `ds_features_train` and `ds_features_test`, wey go get VGG-extracted features instead of di original images.\n" + "Now make we try see if dem features fit help classify images. Make we manually take some part of images (50 minibatches, for our case), and pre-calculate dia feature vectors. We fit use Tensorflow **dataset** API do dat. `map` function dey carry dataset come apply one lambda-function transform am. We dey use dis way take build new datasets, `ds_features_train` and `ds_features_test`, wey carry VGG-extracted features no be original images.\n" ] }, { @@ -715,9 +723,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We use `.take(50)` to make the dataset small, so say the demo go quick. But you fit still run this experiment for the full dataset if you wan.\n", + "We use construction `.take(50)` to limit di dataset size, to make our demonstration fast. You fit do dis experiment for di full dataset if you want.\n", "\n", - "Now we don get dataset wey get the features wey we extract, we fit train one simple dense classifier wey go sabi tell the difference between cat and dog. This network go use feature vector wey get shape (7,7,512), and e go give one output wey go show whether na dog or cat. Since na binary classification, we go use `sigmoid` activation function and `binary_crossentropy` loss.\n" + "Now we don get dataset wey get extracted features, we fit train simple dense classifier to sabi diference between cat dem and dog dem. Dis network go take feature vector wey get shape (7,7,512), and e go produce one output wey fit be dog or cat. Because na binary classification na so, we dey use `sigmoid` activation function and `binary_crossentropy` loss.\n" ] }, { @@ -746,13 +754,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Di result dey very good, we fit sabi di difference between cat and dog wit almost 95% chance! But, we don test dis method only for small part of di images, because di manual way wey we dey use take find di features dey take plenty time.\n", + "Di result beta well well, we fit sabi difference between cat and dog with like 95% chance! But, we just use dis method on small part of all di images, becos to do manual feature extraction dey take plenty time.\n", "\n", - "## Transfer learning wit one VGG network\n", + "## Transfer learning wey use one VGG network\n", "\n", - "We fit also dodge di wahala of manually dey calculate di features by using di original VGG-16 network complete during training, by adding feature extractor as di first layer for our network.\n", + "We fit still avoid to dey manually pre-compute di features by to use di original VGG-16 network as one whole during di training, by to add feature extractor to our network as di first layer. \n", "\n", - "Di sweet part of Keras architecture be say di VGG-16 model wey we don define before fit still work as one layer inside another neural network! Wetin we go do na to build one network wey get dense classifier on top am, then train di whole network using back propagation.\n" + "Di sweet point for Keras architecture na say VGG-16 model wey we don define before fit still dey use as layer inside another neural network! We just need build one network wey get dense classifier for top, then train di whole network by back propagation.\n" ] }, { @@ -796,13 +804,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Dis model be like end-to-end classification network wey go take one image and return di class. But di wahala be say we wan make VGG16 work as feature extractor, and we no wan re-train am. So, we gatz **freeze di weights of di convolutional feature extractor**. We fit access di first layer of di network by calling `model.layers[0]`, and we just need to set di `trainable` property to `False`.\n", + "Dis model look like one end-to-end classification network, wey dey take image come return di class. But di tricky tin na say we want make VGG16 act as feature extractor, and no make e dey re-trained. So, we need make we **freeze weights of convolutional feature extractor**. We fit access di first layer of di network by calling `model.layers[0]`, and we just need set `trainable` property to `False`.\n", "\n", - "> **Note**: To freeze di weights of di feature extractor dey important, because if we no do am, di untrained classifier layer fit scatter di original pre-trained weights of di convolutional extractor.\n", + "> **Note**: Freezing of feature extractor weights dey important, because if no be so, di untrained classifier layer fit spoil di original pre-trained weights of di convolutional extractor.\n", "\n", - "You go notice say even though di total number of parameters for our network na about 15 million, na only 25k parameters we dey train. All di other parameters for di top-level convolutional filters don already dey pre-trained. Dis one good, because e mean say we fit fine-tune smaller number of parameters with smaller number of examples.\n", + "You fit notice say even though di total number of parameters for our network na about 15 million, we dey train only 25k parameters. All di other parameters for top-level convolutional filters na pre-trained. Dat one good, because e mean say we fit fine-tune smaller number of parameters with smaller number of examples.\n", "\n", - "We go now train our network and see how good e go be. Expect say e go take long time to run, and no worry if e be like say e don hang for some time.\n" + "Now, we go train our network and see how better e fit be. Expect say e go take time, and no worry if e look like say e stuck for small time.\n" ] }, { @@ -827,11 +835,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "E be like say we don get classifier wey dey sabi well well for cats vs. dogs!\n", + "E dey look like sey we don get beta cats vs. dogs classifier wey correct well! \n", "\n", - "## How to Save and Load Di Model\n", + "## How to Save and Load Model\n", "\n", - "Once we don train di model finish, we fit save di model architecture and di trained weights for one file so we fit use am later:\n" + "Once we don train di model, we fit save di model design and di trained weights for one file to use later:\n" ] }, { @@ -855,7 +863,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We fit load di model from file anytime. E go fit help if di next experiment spoil di model - you no go need start from di beginning again.\n" + "Afeter dat, we fit load di model from inside file any time. E fit help you if di next experiment spoil di model - you no go need start di whole thing from beginning again.\n" ] }, { @@ -873,13 +881,13 @@ "source": [ "## Fine-tuning transfer learning\n", "\n", - "For di previous section, we don train di final classifier layer to fit classify images for our own dataset. But, we no re-train di feature extractor, and our model dey depend on di features wey di model don learn from ImageNet data. If di objects for your dataset no resemble di normal ImageNet images, dis kind features fit no work well. So, e make sense to start to train di convolutional layers too.\n", + "For di last section, we don train di final classifier layer to sabi classify pictures inside our own dataset. But, we no bin re-train di feature extractor, and our model dey depend on di features wey di model don learn from ImageNet data. If your somtin dem look different from di normal ImageNet pictures, dis kain feature combination fit no work well. So e go make sense to start train di convolutional layers too.\n", "\n", - "To do dis one, we fit unfreeze di convolutional filter parameters wey we don freeze before.\n", + "To do that one, we fit unfreeze di convolutional filter parameters wey we bin freeze before.\n", "\n", - "> **Note:** E dey important say you freeze di parameters first and do some epochs of training to make di weights for di classification layer stable. If you just start to train di whole network with unfrozen parameters, big errors fit scatter di pre-trained weights for di convolutional layers.\n", + "> **Note:** E important say you first freeze di parameters and do several epochs of training to make sure say di weights for di classification layer dey stable. If you start train di whole network with unfrozen parameters immediately, big errors fit spoil di pre-trained weights for di convolutional layers dem.\n", "\n", - "Our convolutional VGG-16 model dey inside di first layer, and e get plenty layers inside am. We fit check how e structure be:\n" + "Our convolutional VGG-16 model dey inside di first layer, and e get many layers on top of itself. We fit first look how e be: \n" ] }, { @@ -948,7 +956,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We fit unfreeze all di layers for convolutional base:\n" + "We fit unfreeze all layers wey dey for convolutional base:\n" ] }, { @@ -964,7 +972,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "But to unfreeze all of dem at once no be di best idea. We fit first unfreeze just small final layers of di convolutions, because dem get higher level patterns wey dey relevant for our images. For example, to start, we fit freeze all di layers except di last 4:\n" + "But, unfreeze all of dem at once no be da best plan. We fit first unfreeze small final layers of convolution, because dem get better level patterns wey dey important for our images. For example, to start, we fit freeze all layers except the last 4: \n" ] }, { @@ -1003,11 +1011,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Make you notice say di number of trainable parameters don increase well well, but e still dey around 50% of all di parameters.\n", + "Observe seh di number of trainable parameters don increase well well, but e still dey around 50% of all parameters.\n", "\n", - "After we don unfreeze am, we fit run small more epochs for training (for our example, we go just do one). You fit also choose lower learning rate, so dat e go reduce di wahala wey e go cause for di pre-trained weights. But even if you use low learning rate, you fit still see say accuracy go first drop for di beginning of di training, before e go finally reach small higher level pass di one wey fixed weights get.\n", + "After we unfreeze am, we fit do few more epochs of training (for our example, we go do just one). You fit still choose lower learning rate, so dat e go reduce di effect for di pre-trained weights. But, even wit low learning rate, you fit expect say di accuracy go drop for di beginning of di training, until e finally reach small higher level pass wetin dey for fixed weights.\n", "\n", - "> **Note:** Dis training dey slow well well, because we need to send gradients go back through plenty layers for di network!\n" + "> **Note:** Dis training dey happen slow well well, because we need to carry gradients back through many layers of di network!\n" ] }, { @@ -1031,18 +1039,18 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We fit get beta training accuracy, because we dey use stronger network wey get more parameters, but validation accuracy no go increase reach like dat.\n", + "We fit get beta training accuracy, becos we dey use more powerful network wey get more parameters, but validation accuracy no go increase reach dat level.\n", "\n", - "No wahala to unfreeze some more layers for the network and train am more, make you see if you fit get higher accuracy!\n" + "No shy to unfreeze few more layers for di network come train more, make you see if you fit get higher accuracy!\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Other computer vision models\n", + "## Ada oda komputer vision models\n", "\n", - "VGG-16 na one of di simplest computer vision architectures. Keras get plenty more pre-trained networks. Di ones wey people dey use pass na **ResNet** architectures, wey Microsoft develop, and **Inception** wey Google make. For example, make we check di architecture of di simplest ResNet-50 model (ResNet na family of models wey get different depth, you fit try experiment with ResNet-152 if you wan see how really deep model go be):\n" + "VGG-16 na one of di simplest computer vision architectures. Keras get plenti pre-trained networks dem. Di ones wey dem dey use pass among dem na **ResNet** architectures, wey Microsoft develop, and **Inception** by Google. For example, make we check di architecture of di simplest ResNet-50 model (ResNet na family of models wey get different depth, you fit try play with ResNet-152 if you want see how deep model be):\n" ] }, { @@ -1444,29 +1452,29 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "As you fit see, di model get di same kind building blocks wey we sabi: convolutional layers, pooling layers, and di final dense classifier. We fit use dis model di same way we dey use VGG-16 for transfer learning. You fit try play around wit di code wey dey up, use different ResNet models as di base model, and check how di accuracy go change.\n", + "As you fit see am, di model get di same normal building blocks: convolutional layers, pooling layers and final dense classifier. We fit use dis model di same way we dey use VGG-16 for transfer learning. You fit try play wit di code wey dey up, use different ResNet models as base model, come see as e go change accuracy.\n", "\n", "## Batch Normalization\n", "\n", - "Dis network get one kain new layer wey dem dey call: **Batch Normalization**. Di idea of batch normalization na to make sure say di values wey dey pass through di neural network dey for di correct range. Normally, neural networks dey work well when all di values dey for di range of [-1,1] or [0,1], and na why we dey scale/normalize our input data well well. But, as we dey train deep network, e fit happen say di values go waka comot from dis range, and e go make training hard. Batch normalization layer dey calculate di average and standard deviation for all di values wey dey di current minibatch, and e go use dem take normalize di signal before e pass am through di neural network layer. Dis thing dey help make deep networks stable well well.\n" + "Dis network get another kain layer: **Batch Normalization**. Di idea of batch normalization be say e dey bring di values wey dey flow inside di neural network enter correct level. Usually, neural networks dey work best wen all di values dey inside range of [-1,1] or [0,1], and na im be di reason why we dey scale/normalize our input data like dat. But, wen you dey train deep network, e fit happen say di values go comot well well for dis range, and dat one fit make training hard. Batch normalization layer dey calculate average and standard deviation for all di values for di current minibatch, and e go use dem normalize di signal before e carry am pass into neural network layer. Dis one dey help improve how deep networks dey steady well well.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Wetin we learn\n", + "## Takeaway\n", "\n", - "Wit transfer learning, we fit quick quick put classifier together for our custom object classification work, and we get beta accuracy. But dis example no too fair, because di original VGG-16 network wey we use don already train to sabi cats and dogs, so we just dey reuse most of di patterns wey dey di network already. If na objects wey dey more rare or special, like details for production line for factory, or different tree leaves, di accuracy fit no high like dis one.\n", + "Wit transfer learning, we fit quickly put together classifier for our custom object classification work, and get high accuracy. But, dis example no too fair because original VGG-16 network don pre-train to sabi cats and dogs, so na so we just dey reuse most of di patterns wey already dey inside the network. You fit expect say accuracy go low if na more exotic domain-specific objects, like details for production line for plant, or different tree leaves.\n", "\n", - "You fit see say di harder tasks wey we dey solve now need more beta computer power, and e no go easy to solve am for CPU. For di next unit, we go try use lighter implementation to train di same model wit less computer resources, wey go still give almost di same accuracy.\n" + "You go see say di more complex tasks we dey try solve now need better computational power, and e no fit easy to solve for CPU. For di next unit, we go try use lightweight implementation train di same model wit less compute resources, wey go just make accuracy small small lower. \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "---\n\n\n**Disclaimer**: \nDis dokyument don translate wit AI translation service [Co-op Translator](https://github.com/Azure/co-op-translator). Even though we dey try make am accurate, abeg make you sabi say machine translation fit get mistake or no dey correct well. Di original dokyument for di language wey dem write am first na di main source wey you go trust. For important information, e better make professional human translator check am. We no go fit take blame for any misunderstanding or wrong interpretation wey fit happen because you use dis translation.\n\n" + "---\n\n\n**Disclaimer**:\nDis document don translate wit AI translation service [Co-op Translator](https://github.com/Azure/co-op-translator). Even tho we dey try make am correct, abeg make you know say automated translation fit get errors or mistakes. Di original document for dia own language na im be di correct source. For important info, make person wey sabi human translation do am. We no go responsible for any misunderstanding or wrong understanding wey fit happen because of dis translation.\n\n" ] } ], @@ -1487,12 +1495,6 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" - }, - "coopTranslator": { - "original_hash": "c189abc107848f96051085cc30945129", - "translation_date": "2025-11-18T19:01:33+00:00", - "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", - "language_code": "pcm" } }, "nbformat": 4, diff --git a/translations/pcm/lessons/5-NLP/README.md b/translations/pcm/lessons/5-NLP/README.md index 7309609571..cf24b88931 100644 --- a/translations/pcm/lessons/5-NLP/README.md +++ b/translations/pcm/lessons/5-NLP/README.md @@ -2,33 +2,33 @@ ![Summary of NLP tasks in a doodle](../../../../translated_images/pcm/ai-nlp.b22dcb8ca4707cea.webp) -For dis section, we go focus on how Neural Networks fit handle tasks wey relate to **Natural Language Processing (NLP)**. Plenty NLP problems dey wey we wan make computer sabi solve: +For dis section, we go focus on how to take use Neural Networks do tasks wey get to do with **Natural Language Processing (NLP)**. Plenty NLP problems dey we want make computer fit solve dem: -* **Text classification** na one kind classification problem wey concern text sequences. Example na to classify e-mail messages as spam or no-spam, or to categorize articles as sport, business, politics, etc. Plus, when we dey develop chat bots, we go need understand wetin user wan talk -- for dis case, we dey deal with **intent classification**. Many times, for intent classification, we go need handle plenty categories. -* **Sentiment analysis** na one kind regression problem, wey we go need give number (sentiment) wey show how positive/negative the meaning of one sentence be. One advanced version of sentiment analysis na **aspect-based sentiment analysis** (ABSA), wey sentiment no dey for the whole sentence, but for different parts of am (aspects), e.g. *For dis restaurant, I like the food, but the atmosphere bad well well*. -* **Named Entity Recognition** (NER) na the problem of extracting certain entities from text. For example, we fit need understand say for the phrase *I need to fly to Paris tomorrow* the word *tomorrow* mean DATE, and *Paris* na LOCATION. -* **Keyword extraction** dey similar to NER, but we go need extract words wey dey important to the meaning of the sentence automatically, without pre-training for specific entity types. -* **Text clustering** fit help when we wan group similar sentences together, e.g., similar requests for technical support conversations. -* **Question answering** na the ability of one model to answer specific question. The model go receive one text passage and one question as inputs, and e go need provide the place for the text wey the answer to the question dey (or, sometimes, generate the answer text). -* **Text Generation** na the ability of one model to generate new text. E fit be classification task wey dey predict next letter/word based on some *text prompt*. Advanced text generation models, like GPT-3, fit solve other NLP tasks like classification using one technique wey dem dey call [prompt programming](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) or [prompt engineering](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29) -* **Text summarization** na technique wey we wan make computer "read" long text and summarize am for few sentences. -* **Machine translation** fit be like combination of text understanding for one language, and text generation for another one. +* **Text classification** na typical classification wahala wey concern text sequence. Examples na to classify e-mail messages as spam or no-spam, or to categorize articles as sport, business, politics, etc. Also, for making chat bots, we dey need to understand wetin person dey try talk -- for this case, na **intent classification** we dey do. Plenty times, for intent classification, we get plenty categories wey we need handle. +* **Sentiment analysis** na typical regression wahala, where we need put number (sentiment) wey match how positive/negative meaning of sentence be. One advanced kind sentiment analysis na **aspect-based sentiment analysis** (ABSA), where we no dey put sentiment for whole sentence but for different parts (aspects), e.g. *For this restaurant, I like the cuisine, but the atmosphere no too good*. +* **Named Entity Recognition** (NER) mean say you go find some entities for text. For example, we go need understand say for the phrase *I need to fly to Paris tomorrow* the word *tomorrow* na DATE, and *Paris* be LOCATION. +* **Keyword extraction** similar to NER, but na words wey important to sentence meaning we dey find automatically, without pre-training for particular entity types. +* **Text clustering** fit help when we want group similar sentences together, like similar requests for technical support talk. +* **Question answering** mean say model fit answer specific question. The model go receive text passage plus question, and e need show place for text wey answer dey (or sometimes, generate answer text). +* **Text Generation** mean say model fit generate new text. E fit be classification task wey dey predict next letter/word based on some *text prompt*. Advanced text generation models, like GPT-3, fit solve other NLP tasks like classification using technique wey dem dey call [prompt programming](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) or [prompt engineering](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29) +* **Text summarization** na technique wey we want make computer "read" long text and summarize am inside few sentences. +* **Machine translation** fit be combination of understanding text for one language and generating text for another language. -Before before, most NLP tasks dey solved using traditional methods like grammars. For example, for machine translation, parsers dey transform initial sentence into syntax tree, then higher level semantic structures go dey extracted to represent the meaning of the sentence, and based on dis meaning and grammar of the target language, dem go generate the result. Nowadays, many NLP tasks dey solved better with neural networks. +Before before, most NLP tasks dem dey solve am with traditional methods like grammar. For example, for machine translation, dem dey use parsers to turn sentence into syntax tree, then dem dey find better semantic structures to represent meaning of sentence, and based on this meaning and grammar of language, the result dey generated. Nowadays, plenty NLP tasks better to solve with neural networks. -> Many classical NLP methods dey implemented for [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org) Python library. One better [NLTK Book](https://www.nltk.org/book/) dey online wey dey cover how different NLP tasks fit dey solved using NLTK. +> Plenty classical NLP methods dey inside [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org) Python library. Good [NLTK Book](https://www.nltk.org/book/) dey online wey talk how to solve different NLP tasks with NLTK. -For dis course, we go mostly focus on how to use Neural Networks for NLP, and we go use NLTK where e dey necessary. +For our course, we go mainly use Neural Networks for NLP, and we go use NLTK where e need. -We don already learn how to use neural networks to handle tabular data and images. The main difference between those types of data and text be say text na sequence wey get variable length, while the input size for images dey known before. While convolutional networks fit extract patterns from input data, patterns for text dey more complex. E.g., we fit get negation wey dey separate from the subject by plenty words (e.g. *I no like oranges*, vs. *I no like those big colorful tasty oranges*), and we still suppose interpret am as one pattern. So, to handle language, we need introduce new neural network types, like *recurrent networks* and *transformers*. +We don already learn about how to use neural networks to handle tabular data and images. Main difference between those data and text na say text na variable length sequence, but input size for images dey known before. Convolutional networks fit find patterns for input data, but patterns for text more complex. Eg., negation fit dey far from subject for many words (eg. *I do not like oranges*, vs. *I do not like those big colorful tasty oranges*), but we still suppose consider am as one pattern. So, to handle language, we need new neural network types like *recurrent networks* and *transformers*. ## Install Libraries -If you dey use local Python installation to run dis course, you fit need install all the libraries wey you need for NLP using dis commands: +If you dey use local Python install to run dis course, you fit need install all NLP libraries with these commands: **For PyTorch** ```bash -pip install -r requirements-torch.txt +pip install -r requirements-pytorch.txt ``` **For TensorFlow** ```bash @@ -39,13 +39,13 @@ pip install -r requirements-tf.txt ## GPU Warning -For dis section, for some of the examples, we go dey train big models. -* **Use GPU-Enabled Computer**: E good make you run your notebooks for GPU-enabled computer to reduce waiting time when you dey work with big models. -* **GPU Memory Constraints**: If you dey use GPU, e fit lead to situations wey GPU memory go finish, especially when you dey train big models. -* **GPU Memory Consumption**: The amount of GPU memory wey training dey use depend on different factors, including the minibatch size. -* **Minimize Minibatch Size**: If GPU memory dey give wahala, try reduce the minibatch size for your code as one possible solution. -* **TensorFlow GPU Memory Release**: Old versions of TensorFlow fit no dey release GPU memory well when you dey train multiple models for one Python kernel. To manage GPU memory usage well, you fit configure TensorFlow to allocate GPU memory only when e dey needed. -* **Code Inclusion**: To make TensorFlow grow GPU memory allocation only when e dey needed, add dis code for your notebooks: +For this section, for some examples we go train big models. +* **Use GPU Enabled Computer**: E good make you run notebook for GPU enabled computer to reduce waiting time when you dey work with big models. +* **GPU Memory Constraints**: If you run am for GPU, e fit happen say GPU memory go finish, especially if model big. +* **GPU Memory Consumption**: How much GPU memory you go use during training depend on many factors, including minibatch size. +* **Minimize Minibatch Size**: If GPU memory wahala show, try reduce minibatch size for your code. +* **TensorFlow GPU Memory Release**: Some old TensorFlow versions no dey release GPU memory well when you dey train many models inside one Python kernel. To manage GPU memory well, you fit set TensorFlow make e allocate GPU memory only as e need am. +* **Code Inclusion**: If you want TensorFlow to grow GPU memory allocation only as e need am, put this code inside your notebooks: ```python physical_devices = tf.config.list_physical_devices('GPU') @@ -53,10 +53,10 @@ if len(physical_devices)>0: tf.config.experimental.set_memory_growth(physical_devices[0], True) ``` -If you wan learn about NLP from classic ML perspective, visit [dis suite of lessons](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP) +If you want learn NLP from classic ML side, check [this suite of lessons](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP) -## For dis Section -For dis section, we go learn about: +## For this Section +For this section, we go learn about: * [How to represent text as tensors](13-TextRep/README.md) * [Word Embeddings](14-Emdeddings/README.md) @@ -68,6 +68,6 @@ For dis section, we go learn about: --- -**Disclaimer**: -Dis dokyument don translate wit AI translation service [Co-op Translator](https://github.com/Azure/co-op-translator). Even as we dey try make am accurate, abeg sabi say machine translation fit get mistake or no dey correct well. Di original dokyument for im native language na di main source wey you go fit trust. For important information, e better make professional human translator check am. We no go fit take blame for any misunderstanding or wrong interpretation wey fit happen because you use dis translation. +**Disclaimer**: +Dis document don translate wit AI translation service [Co-op Translator](https://github.com/Azure/co-op-translator). Even tho we dey try make am correct, abeg make you know say automated translation fit get errors or mistakes. Di original document for dia own language na im be di correct source. For important info, make person wey sabi human translation do am. We no go responsible for any misunderstanding or wrong understanding wey fit happen because of dis translation. \ No newline at end of file diff --git a/translations/pl/.co-op-translator.json b/translations/pl/.co-op-translator.json index f1ffbce7ea..b635f6f5a2 100644 --- a/translations/pl/.co-op-translator.json +++ b/translations/pl/.co-op-translator.json @@ -5,6 +5,12 @@ "source_file": "AGENTS.md", "language_code": "pl" }, + "CONTRIBUTING.md": { + "original_hash": "c6fd7e781b67111a90abd166d0ce4aa0", + "translation_date": "2026-07-08T15:26:01+00:00", + "source_file": "CONTRIBUTING.md", + "language_code": "pl" + }, "README.md": { "original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b", "translation_date": "2026-04-06T15:39:09+00:00", @@ -17,6 +23,19 @@ "source_file": "SECURITY.md", "language_code": "pl" }, + "__translation_failures__": { + "lessons/sketchnotes/LICENSE.md": { + "original_hash": "45ab63a2cd8f5faef6c9b150618837a4", + "source_file": "lessons/sketchnotes/LICENSE.md", + "language_code": "pl", + "failure_date": "2026-07-08T15:14: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-24T10:50:22+00:00", @@ -54,8 +73,8 @@ "language_code": "pl" }, "examples/README.md": { - "original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7", - "translation_date": "2025-10-03T11:30:24+00:00", + "original_hash": "7883d52c2e2a221e0b07a7b112a149b9", + "translation_date": "2026-07-08T15:08:50+00:00", "source_file": "examples/README.md", "language_code": "pl" }, @@ -66,8 +85,8 @@ "language_code": "pl" }, "lessons/0-course-setup/how-to-run.md": { - "original_hash": "a4717bd9103b9f6cd84d534b83534689", - "translation_date": "2026-01-15T14:27:45+00:00", + "original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1", + "translation_date": "2026-07-08T15:09:19+00:00", "source_file": "lessons/0-course-setup/how-to-run.md", "language_code": "pl" }, @@ -191,6 +210,12 @@ "source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md", "language_code": "pl" }, + "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": { + "original_hash": "99b816b6a4957ef4100cee4c4221dff9", + "translation_date": "2026-07-08T15:04:58+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", + "language_code": "pl" + }, "lessons/4-ComputerVision/08-TransferLearning/lab/README.md": { "original_hash": "7765935c35fcee69b9fe2d0cfd6963e2", "translation_date": "2025-08-24T10:35:06+00:00", @@ -330,8 +355,8 @@ "language_code": "pl" }, "lessons/5-NLP/README.md": { - "original_hash": "8ef02a9318257ea140ed3ed74442096d", - "translation_date": "2025-08-24T10:11:53+00:00", + "original_hash": "038df6f1a73e49f6430740da083bfd6d", + "translation_date": "2026-07-08T15:09:47+00:00", "source_file": "lessons/5-NLP/README.md", "language_code": "pl" }, diff --git a/translations/pl/CONTRIBUTING.md b/translations/pl/CONTRIBUTING.md new file mode 100644 index 0000000000..fc705040df --- /dev/null +++ b/translations/pl/CONTRIBUTING.md @@ -0,0 +1,29 @@ +# Wkład w AI-For-Beginners + +Dziękujemy za zainteresowanie wniesieniem wkładu do AI-For-Beginners! Chętnie przyjmujemy tłumaczenia, poprawki lekcji oraz korekty formatowania. + +## Umowa licencyjna współtwórcy Microsoft (CLA) + +Ten projekt przyjmuje wkłady i sugestie. Większość wkładów wymaga zgody na Umowę licencyjną współtwórcy (CLA), w której oświadczasz, że masz prawo i faktycznie udzielasz nam praw do korzystania z Twojego wkładu. Szczegóły znajdziesz na [https://cla.microsoft.com](https://cla.microsoft.com). + +Gdy zgłosisz pull request, bot CLA automatycznie określi, czy potrzebujesz dostarczyć CLA, i odpowiednio oznaczy PR (np. etykieta, komentarz). Wystarczy, że wykonasz instrukcje podane przez bota. Będziesz musiał to zrobić tylko raz dla wszystkich repozytoriów korzystających z naszego CLA. + +## Jak wnieść wkład + +### 1. Poprawianie literówek / błędów w kodzie +Jeśli znajdziesz literówkę lub błąd w którymkolwiek notatniku Jupyter albo pliku markdown lekcji: +1. Rozgałęź repozytorium (fork). +2. Popraw literówkę lub uszkodzony link. +3. Złóż Pull Request z jasnym opisem poprawki. + +### 2. Przesyłanie tłumaczeń +Chcemy, aby lekcje były dostępne w innych językach! Prosimy umieszczać tłumaczenia w katalogu `translations/`, korzystając z istniejących tam nazw folderów (na przykład `translations/es/`, `translations/pt-BR/`, `translations/zh-CN/`). + +Więcej szczegółów znajdziesz w [etc/CONTRIBUTING.md](etc/CONTRIBUTING.md). + +--- + + +**Zastrzeżenie**: +Niniejszy dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Choć dążymy do dokładności, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub niedokładności. Oryginalny dokument w jego języku źródłowym należy uznawać za autorytatywne źródło. W przypadku informacji krytycznych zalecane jest skorzystanie z profesjonalnego tłumaczenia wykonanego przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. + \ No newline at end of file diff --git a/translations/pl/examples/README.md b/translations/pl/examples/README.md index 3b14d3f28e..a17f9a6de3 100644 --- a/translations/pl/examples/README.md +++ b/translations/pl/examples/README.md @@ -1,31 +1,31 @@ -# Przykłady AI dla Początkujących +# Przykłady AI Przyjazne dla Początkujących -Witaj! Ten katalog zawiera proste, samodzielne przykłady, które pomogą Ci rozpocząć przygodę z AI i uczeniem maszynowym. Każdy przykład został zaprojektowany z myślą o początkujących, z dokładnymi komentarzami i wyjaśnieniami krok po kroku. +Witamy! Ten katalog zawiera proste, samodzielne przykłady, które pomogą Ci zacząć z AI i uczeniem maszynowym. Każdy przykład jest zaprojektowany tak, aby był przyjazny dla początkujących, z szczegółowymi komentarzami i wyjaśnieniami krok po kroku. ## 📚 Przegląd Przykładów -| Przykład | Opis | Poziom trudności | Wymagania wstępne | -|----------|------|------------------|-------------------| -| [Hello AI World](../../../examples/01-hello-ai-world.py) | Twój pierwszy program AI - proste rozpoznawanie wzorców | ⭐ Początkujący | Podstawy Pythona | -| [Prosta Sieć Neuronowa](../../../examples/02-simple-neural-network.py) | Zbuduj sieć neuronową od podstaw | ⭐⭐ Początkujący+ | Python, podstawowa matematyka | -| [Klasyfikator Obrazów](./03-image-classifier.ipynb) | Klasyfikuj obrazy za pomocą wstępnie wytrenowanego modelu | ⭐⭐ Początkujący+ | Python, numpy | -| [Analiza Sentimentów Tekstu](../../../examples/04-text-sentiment.py) | Analizuj sentyment tekstu (pozytywny/negatywny) | ⭐⭐ Początkujący+ | Python | +| Przykład | Opis | Trudność | Wymagania wstępne | +|---------|-------------|------------|---------------| +| [Hello AI World](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/01-hello-ai-world.py) | Twój pierwszy program AI - proste rozpoznawanie wzorców | ⭐ Początkujący | Podstawy Pythona | +| [Simple Neural Network](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/02-simple-neural-network.py) | Zbuduj sieć neuronową od zera | ⭐⭐ Początkujący+ | Python, podstawowa matematyka | +| [Image Classifier](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/03-image-classifier.ipynb) | Klasyfikuj obrazy za pomocą wstępnie wytrenowanego modelu | ⭐⭐ Początkujący+ | Python, numpy | +| [Text Sentiment](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/04-text-sentiment.py) | Analiza sentymentu tekstu (pozytywny/negatywny) | ⭐⭐ Początkujący+ | Python | -## 🚀 Rozpoczęcie Pracy +## 🚀 Jak Zacząć ### Wymagania wstępne -Upewnij się, że masz zainstalowany Python (zalecana wersja 3.8 lub wyższa). Zainstaluj wymagane pakiety: +Upewnij się, że masz zainstalowanego Pythona (zalecana wersja 3.8 lub wyższa). Zainstaluj wymagane pakiety: ```bash -# For Python scripts +# Dla skryptów Pythona pip install numpy -# For Jupyter notebooks (image classifier) +# Dla notatników Jupyter (klasyfikator obrazów) pip install jupyter numpy pillow tensorflow ``` -Lub skorzystaj z środowiska conda z głównego programu nauczania: +Lub użyj środowiska conda z głównego programu nauczania: ```bash conda env create --name ai4beg --file ../environment.yml @@ -34,52 +34,54 @@ conda activate ai4beg ### Uruchamianie Przykładów -**Dla skryptów Python (.py):** +**Dla skryptów Pythona (.py):** ```bash python 01-hello-ai-world.py ``` -**Dla notebooków Jupyter (.ipynb):** +**Dla notatników Jupyter (.ipynb):** ```bash jupyter notebook 03-image-classifier.ipynb ``` ## 📖 Ścieżka Nauki -Zalecamy realizowanie przykładów w następującej kolejności: +Zalecamy wykonywanie przykładów w kolejności: -1. **Rozpocznij od "Hello AI World"** - Poznaj podstawy rozpoznawania wzorców -2. **Zbuduj Prostą Sieć Neuronową** - Zrozum, jak działają sieci neuronowe -3. **Wypróbuj Klasyfikator Obrazów** - Zobacz AI w akcji na prawdziwych obrazach -4. **Analizuj Sentiment Tekstu** - Odkryj przetwarzanie języka naturalnego +1. **Zacznij od "Hello AI World"** - Poznaj podstawy rozpoznawania wzorców +2. **Zbuduj prostą sieć neuronową** - Zrozum, jak działają sieci neuronowe +3. **Wypróbuj klasyfikator obrazów** - Zobacz działanie AI na prawdziwych obrazach +4. **Analizuj sentyment tekstu** - Poznaj przetwarzanie języka naturalnego ## 💡 Wskazówki dla Początkujących - **Dokładnie czytaj komentarze w kodzie** - Wyjaśniają, co robi każda linia -- **Eksperymentuj!** - Spróbuj zmieniać wartości i zobacz, co się stanie -- **Nie martw się, jeśli nie zrozumiesz wszystkiego od razu** - Nauka wymaga czasu -- **Zadawaj pytania** - Skorzystaj z [Forum dyskusyjnego](https://github.com/microsoft/AI-For-Beginners/discussions) +- **Eksperymentuj!** - Próbuj zmieniać wartości i zobacz, co się stanie +- **Nie martw się, jeśli nie rozumiesz wszystkiego od razu** - Nauka wymaga czasu +- **Zadawaj pytania** - Skorzystaj z [tablicy dyskusyjnej](https://github.com/microsoft/AI-For-Beginners/discussions) ## 🔗 Kolejne Kroki -Po ukończeniu tych przykładów, zapoznaj się z pełnym programem nauczania: +Po ukończeniu tych przykładów zapoznaj się z pełnym programem nauczania: - [Wprowadzenie do AI](../lessons/1-Intro/README.md) -- [Sieci Neuronowe](../lessons/3-NeuralNetworks/README.md) -- [Wizja Komputerowa](../lessons/4-ComputerVision/README.md) -- [Przetwarzanie Języka Naturalnego](../lessons/5-NLP/README.md) +- [Sieci neuronowe](../lessons/3-NeuralNetworks/README.md) +- [Wizja komputerowa](../lessons/4-ComputerVision/README.md) +- [Przetwarzanie języka naturalnego](../lessons/5-NLP/README.md) -## 🤝 Współtworzenie +## 🤝 Wkład w Projekt -Uważasz, że te przykłady są pomocne? Pomóż nam je ulepszyć: -- Zgłaszaj problemy lub proponuj ulepszenia -- Dodawaj więcej przykładów dla początkujących +Te przykłady okazały się pomocne? Pomóż nam je ulepszyć: +- Zgłaszaj problemy lub sugeruj ulepszenia +- Dodaj więcej przykładów dla początkujących - Poprawiaj dokumentację i komentarze --- -*Pamiętaj: Każdy ekspert kiedyś był początkującym. Miłej nauki! 🎓* +*Pamiętaj: Każdy ekspert był kiedyś początkującym. Powodzenia w nauce! 🎓* --- -**Zastrzeżenie**: -Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby tłumaczenie było precyzyjne, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego języku źródłowym powinien być uznawany za autorytatywne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. \ No newline at end of file + +**Zastrzeżenie**: +Niniejszy dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Choć dążymy do dokładności, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub niedokładności. Oryginalny dokument w jego języku źródłowym należy uznawać za autorytatywne źródło. W przypadku informacji krytycznych zalecane jest skorzystanie z profesjonalnego tłumaczenia wykonanego przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. + \ No newline at end of file diff --git a/translations/pl/lessons/0-course-setup/how-to-run.md b/translations/pl/lessons/0-course-setup/how-to-run.md index 90b49689a6..15b4862767 100644 --- a/translations/pl/lessons/0-course-setup/how-to-run.md +++ b/translations/pl/lessons/0-course-setup/how-to-run.md @@ -1,12 +1,12 @@ -# Jak Uruchomić Kod +# Jak uruchomić kod -Ten program nauczania zawiera wiele wykonalnych przykładów i laboratoriów, które będziesz chciał uruchomić. Aby to zrobić, musisz mieć możliwość wykonywania kodu Python w Jupyter Notebooks dostarczonych w ramach tego programu nauczania. Masz kilka opcji uruchamiania kodu: +Ten program nauczania zawiera wiele wykonalnych przykładów i laboratoriów, które zechcesz uruchomić. Aby to zrobić, potrzebujesz możliwości wykonywania kodu Python w Jupyter Notebooks udostępnionych w ramach tego kursu. Masz kilka opcji uruchamiania kodu: -## Uruchamianie lokalnie na Twoim komputerze +## Uruchamianie lokalnie na komputerze -Aby uruchomić kod lokalnie na Twoim komputerze, potrzebna jest instalacja Pythona. Jednym z rekomendowanych rozwiązań jest instalacja **[miniconda](https://conda.io/en/latest/miniconda.html)** - jest to raczej lekka instalacja, która wspiera menedżera pakietów `conda` do zarządzania różnymi **wirtualnymi środowiskami** Pythona. +Aby uruchomić kod lokalnie na komputerze, potrzebna jest instalacja Pythona. Jedną z rekomendacji jest zainstalowanie **[miniconda](https://conda.io/en/latest/miniconda.html)** – to dość lekka instalacja, która obsługuje menedżera pakietów `conda` dla różnych **wirtualnych środowisk** Pythona. -Po zainstalowaniu minicondy, sklonuj repozytorium i utwórz wirtualne środowisko, które będzie używane na potrzeby tego kursu: +Po zainstalowaniu miniconda, sklonuj repozytorium i utwórz wirtualne środowisko do wykorzystania w tym kursie: ```bash git clone http://github.com/microsoft/ai-for-beginners @@ -17,15 +17,15 @@ conda activate ai4beg ### Korzystanie z Visual Studio Code z rozszerzeniem Python -Ten program nauczania najlepiej jest używać, otwierając go w [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) z [rozszerzeniem Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste). +Ten kurs najlepiej używać, otwierając go w [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) z [rozszerzeniem Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste). -> **Uwaga**: Po sklonowaniu i otwarciu katalogu w VS Code, automatycznie zasugeruje Ci instalację rozszerzeń Pythona. Będziesz również musiał zainstalować minicondę, jak opisano powyżej. +> **Uwaga**: Po sklonowaniu i otwarciu katalogu w VS Code, program automatycznie zasugeruje instalację rozszerzeń Pythona. Musisz też zainstalować miniconda według wyżej opisanych kroków. -> **Uwaga**: Jeśli VS Code zasugeruje ponowne otwarcie repozytorium w kontenerze, powinieneś odmówić tego, aby korzystać z lokalnej instalacji Pythona. +> **Uwaga**: Jeśli VS Code zasugeruje ponowne otwarcie repozytorium w kontenerze, powinieneś odmówić, by korzystać z lokalnej instalacji Pythona. ### Korzystanie z Jupyter w przeglądarce -Możesz również skorzystać ze środowiska Jupyter w przeglądarce na własnym komputerze. Zarówno klasyczny Jupyter, jak i JupyterHub oferują wygodne środowisko deweloperskie z autouzupełnianiem, podświetlaniem kodu itp. +Możesz też używać środowiska Jupyter w przeglądarce na własnym komputerze. Zarówno klasyczny Jupyter, jak i JupyterHub oferują wygodne środowisko programistyczne z autouzupełnianiem, podświetlaniem kodu itp. Aby uruchomić Jupyter lokalnie, przejdź do katalogu kursu i wykonaj: @@ -36,36 +36,36 @@ lub ```bash jupyterhub ``` -Następnie możesz przejść do dowolnego pliku `.ipynb`, otworzyć go i rozpocząć pracę. +Następnie możesz przejść do dowolnego pliku `.ipynb`, otworzyć go i zacząć pracę. ### Uruchamianie w kontenerze -Alternatywą dla instalacji Pythona jest uruchomienie kodu w kontenerze. Nasze repozytorium dostarcza specjalny folder `.devcontainer`, który pokazuje, jak zbudować kontener dla tego repozytorium, a VS Code oferuje możliwość ponownego otwarcia kodu w kontenerze. Wymaga to instalacji Dockera i jest bardziej złożone, dlatego zalecamy to bardziej doświadczonym użytkownikom. +Alternatywą dla instalacji Pythona może być uruchomienie kodu w kontenerze. Ponieważ nasze repozytorium zawiera specjalny folder `.devcontainer`, który instruuje, jak zbudować kontener dla tego repozytorium, VS Code oferuje możliwość ponownego otwarcia kodu w kontenerze. Wymaga to zainstalowania Dockera i jest to bardziej skomplikowane, więc zalecamy tę opcję bardziej doświadczonym użytkownikom. -## Uruchamianie w Chmurze +## Uruchamianie w chmurze -Jeśli nie chcesz instalować Pythona lokalnie i masz dostęp do zasobów w chmurze, dobrą alternatywą jest uruchamianie kodu w chmurze. Istnieje kilka sposobów, aby to zrobić: +Jeśli nie chcesz instalować Pythona lokalnie i masz dostęp do zasobów chmurowych – dobrą alternatywą jest uruchamianie kodu w chmurze. Możesz to zrobić na kilka sposobów: -* Korzystanie z **[GitHub Codespaces](https://github.com/features/codespaces)** – jest to wirtualne środowisko utworzone dla Ciebie na GitHub, dostępne przez przeglądarkę VS Code. Jeśli masz dostęp do Codespaces, możesz po prostu kliknąć przycisk **Code** w repozytorium, uruchomić codespace i szybko zacząć pracę. -* Korzystanie z **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) oferuje darmowe zasoby obliczeniowe w chmurze, dla osób takich jak Ty, aby testować kod z GitHuba. Na stronie głównej jest przycisk umożliwiający otwarcie repozytorium w Binder – przeniesie Cię on szybko na stronę binder, która zbuduje pod spodem kontener i uruchomi interfejs Jupyter w przeglądarce bezproblemowo. +* Korzystając z **[GitHub Codespaces](https://github.com/features/codespaces)**, czyli wirtualnego środowiska utworzonego dla Ciebie na GitHub i dostępnego przez interfejs VS Code w przeglądarce. Jeśli masz dostęp do Codespaces, wystarczy kliknąć przycisk **Code** w repozytorium, uruchomić codespace i szybko zacząć pracę. +* Korzystając z **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) oferuje bezpłatne zasoby obliczeniowe w chmurze dla osób takich jak Ty do testowania kodu z GitHub. Na stronie głównej jest przycisk do otwarcia repozytorium w Binder – szybko przeniesie Cię on do serwisu binder, który zbuduje kontener i bezproblemowo uruchomi interfejs Jupyter w przeglądarce. -> **Uwaga**: Aby zapobiec nadużyciom, Binder ma zablokowany dostęp do niektórych zasobów sieciowych. Może to uniemożliwić działanie niektórych fragmentów kodu, które pobierają modele i/lub zbiory danych z publicznego internetu. Może być konieczne znalezienie obejść. Dodatkowo, zasoby obliczeniowe oferowane przez Binder są dość podstawowe, więc trening będzie powolny, szczególnie w późniejszych, bardziej złożonych lekcjach. +> **Uwaga**: Aby zapobiec nadużyciom, Binder ma zablokowany dostęp do niektórych zasobów internetowych. Może to uniemożliwić działanie niektórych fragmentów kodu, które pobierają modele i/lub zestawy danych z internetu. Możesz potrzebować obejść te ograniczenia. Poza tym zasoby obliczeniowe udostępniane przez Binder są dość podstawowe, więc trenowanie będzie powolne, zwłaszcza w późniejszych, bardziej skomplikowanych lekcjach. -## Uruchamianie w Chmurze z GPU +## Uruchamianie w chmurze z GPU -Niektóre z późniejszych lekcji w tym programie nauczania bardzo skorzystałyby na wsparciu GPU. Trening modelu, na przykład, może być w przeciwnym razie bardzo powolny. Masz kilka opcji, szczególnie jeśli masz dostęp do chmury poprzez [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) lub poprzez Twoją instytucję: +Niektóre z późniejszych lekcji w tym kursie bardzo skorzystałyby na wsparciu GPU. Trenowanie modeli może być w przeciwnym razie bardzo powolne. Masz kilka opcji, zwłaszcza jeśli masz dostęp do chmury przez [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) lub przez swoją instytucję: -* Utwórz [Data Science Virtual Machine](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) i połącz się z nią przez Jupyter. Możesz wtedy sklonować repozytorium bezpośrednio na tę maszynę i zacząć naukę. Maszyny wirtualne serii NC mają wsparcie GPU. +* Utwórz [Data Science Virtual Machine](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) i połącz się z nią przez Jupyter. Możesz wtedy sklonować repozytorium bezpośrednio na maszynę i zacząć naukę. Maszyny NC-series mają wsparcie GPU. -> **Uwaga**: Niektóre subskrypcje, w tym Azure for Students, nie zapewniają wsparcia GPU „od ręki”. Może być konieczne zgłoszenie zapytania o dodatkowe rdzenie GPU do pomocy technicznej. +> **Uwaga**: Niektóre subskrypcje, w tym Azure for Students, nie oferują domyślnie wsparcia GPU. Może być konieczne zgłoszenie prośby o dodatkowe rdzenie GPU do pomocy technicznej. -* Utwórz [Azure Machine Learning Workspace](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) i użyj tam funkcji Notebook. [Ten film](https://azure-for-academics.github.io/quickstart/azureml-papers/) pokazuje, jak sklonować repozytorium do notatnika Azure ML i zacząć go używać. +* Utwórz [Azure Machine Learning Workspace](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste), a następnie używaj tam funkcji Notatnika. [Ten film](https://azure-for-academics.github.io/quickstart/azureml-papers/) pokazuje, jak sklonować repozytorium do notatnika Azure ML i zacząć je wykorzystywać. -Możesz również użyć Google Colab, który oferuje darmowe wsparcie GPU, i przesłać tam notatniki Jupyter, aby wykonywać je pojedynczo. +Możesz także użyć Google Colab, który oferuje bezpłatną obsługę GPU i przesłać tam Jupyter Notebooks, aby wykonywać je pojedynczo. --- -**Zastrzeżenie**: -Niniejszy dokument został przetłumaczony za pomocą automatycznej usługi tłumaczeniowej AI [Co-op Translator](https://github.com/Azure/co-op-translator). Mimo że staramy się zapewnić dokładność, prosimy mieć na uwadze, że tłumaczenia automatyczne mogą zawierać błędy lub niedokładności. Oryginalny dokument w języku źródłowym powinien być uznany za źródło autorytatywne. W przypadku informacji krytycznych zalecane jest skorzystanie z profesjonalnego tłumaczenia wykonanego przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z korzystania z tego tłumaczenia. +**Zastrzeżenie**: +Niniejszy dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Choć dążymy do dokładności, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub niedokładności. Oryginalny dokument w jego języku źródłowym należy uznawać za autorytatywne źródło. W przypadku informacji krytycznych zalecane jest skorzystanie z profesjonalnego tłumaczenia wykonanego przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. \ No newline at end of file diff --git a/translations/pl/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/pl/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index 2f0a68b65f..aba09d73b0 100644 --- a/translations/pl/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/pl/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -4,11 +4,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Wstępnie wytrenowane modele i transfer uczenia\n", + "# Modele wstępnie wytrenowane i transfer uczenia\n", "\n", - "Trenowanie CNN-ów może zająć dużo czasu i wymaga dużej ilości danych. Jednak większość czasu poświęca się na naukę najlepszych niskopoziomowych filtrów, które sieć wykorzystuje do wyodrębniania wzorców z obrazów. Pojawia się więc naturalne pytanie – czy możemy użyć sieci neuronowej wytrenowanej na jednym zbiorze danych i dostosować ją do klasyfikacji innych obrazów bez pełnego procesu trenowania?\n", + "Trenowanie CNN może zająć dużo czasu, a do tego zadania potrzebne jest wiele danych. Jednakże, większość czasu poświęcona jest na naukę najlepszych filtrów niskiego poziomu, których sieć używa do wyodrębniania wzorców z obrazów. Pojawia się naturalne pytanie – czy można użyć sieci neuronowej wytrenowanej na jednym zbiorze danych i dostosować ją do klasyfikacji innych obrazów bez pełnego procesu trenowania?\n", "\n", - "To podejście nazywa się **transferem uczenia** (ang. transfer learning), ponieważ przenosimy pewną wiedzę z jednego modelu sieci neuronowej do innego. W transferze uczenia zazwyczaj zaczynamy od wstępnie wytrenowanego modelu, który został wytrenowany na dużym zbiorze obrazów, takim jak **ImageNet**. Te modele potrafią już skutecznie wyodrębniać różne cechy z ogólnych obrazów, a w wielu przypadkach zbudowanie klasyfikatora na podstawie tych wyodrębnionych cech może dać dobre rezultaty.\n" + "Takie podejście nazywa się **transferem uczenia**, ponieważ przenosimy część wiedzy z jednego modelu sieci neuronowej do innego. W transferze uczenia zazwyczaj zaczynamy od modelu wstępnie wytrenowanego, który był uczony na dużym zbiorze obrazów, takim jak **ImageNet**. Te modele potrafią już dobrze wydobywać różne cechy z ogólnych obrazów, i w wielu przypadkach samo zbudowanie klasyfikatora na podstawie tych wyodrębnionych cech może przynieść dobry rezultat.\n" ] }, { @@ -29,11 +29,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Zbiór danych Cats vs. Dogs\n", + "## Zbiór danych Koty kontra Psy\n", "\n", - "W tej jednostce zajmiemy się rozwiązaniem rzeczywistego problemu klasyfikacji obrazów kotów i psów. W tym celu skorzystamy ze [zbioru danych Cats vs. Dogs z Kaggle](https://www.kaggle.com/c/dogs-vs-cats), który można również pobrać [ze strony Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n", + "W tej jednostce rozwiążemy problem klasyfikacji obrazów kotów i psów w rzeczywistym świecie. W tym celu użyjemy [zbioru danych Koty kontra Psy z Kaggle](https://www.kaggle.com/c/dogs-vs-cats), który można również pobrać [z Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n", "\n", - "Pobierzmy ten zbiór danych i rozpakujmy go do katalogu `data` (ten proces może zająć trochę czasu!):\n" + "Pobierzmy ten zbiór danych i wypakujmy go do katalogu `data` (ten proces może trochę potrwać!):\n" ] }, { @@ -64,7 +64,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Niestety, w zestawie danych znajdują się uszkodzone pliki obrazów. Musimy szybko przeprowadzić czyszczenie, aby sprawdzić uszkodzone pliki. Aby nie zaśmiecać tego samouczka, przenieśliśmy kod weryfikujący zestaw danych do modułu.\n" + "Niestety w zbiorze danych znajdują się uszkodzone pliki obrazów. Musimy szybko przeprowadzić czyszczenie, aby sprawdzić uszkodzone pliki. Aby nie zniszczyć tego samouczka, przenieśliśmy kod weryfikujący zbiór danych do modułu.\n" ] }, { @@ -335,11 +335,11 @@ "source": [ "## Ładowanie zbioru danych\n", "\n", - "W poprzednich przykładach ładowaliśmy zbiory danych wbudowane w Keras. Teraz zajmiemy się własnym zbiorem danych, który musimy załadować z katalogu zawierającego obrazy.\n", + "W poprzednich przykładach ładowaliśmy zbiory danych wbudowane w Keras. Teraz zajmiemy się naszym własnym zbiorem danych, który musimy załadować z katalogu z obrazami.\n", "\n", - "W rzeczywistości rozmiar zbiorów danych obrazów może być dość duży, dlatego nie można polegać na tym, że wszystkie dane zmieszczą się w pamięci. Z tego powodu zbiory danych często są reprezentowane jako **generatory**, które mogą zwracać dane w małych partiach odpowiednich do treningu.\n", + "W rzeczywistości rozmiar zbiorów danych obrazów może być dość duży i nie można polegać na tym, że wszystkie dane zmieszczą się w pamięci. Dlatego zbiory danych często reprezentowane są jako **generatory**, które mogą zwracać dane w minibatchach odpowiednich do trenowania.\n", "\n", - "Aby poradzić sobie z klasyfikacją obrazów, Keras zawiera specjalną funkcję `image_dataset_from_directory`, która może ładować obrazy z podkatalogów odpowiadających różnym klasom. Funkcja ta automatycznie skaluje obrazy i może również podzielić zbiór danych na podzbiory treningowe i testowe:\n" + "Aby poradzić sobie z klasyfikacją obrazów, Keras zawiera specjalną funkcję `image_dataset_from_directory`, która potrafi ładować obrazy z podkatalogów odpowiadających różnym klasom. Funkcja ta zajmuje się również skalowaniem obrazów i może także podzielić zbiór danych na podzbiory treningowe i testowe:\n" ] }, { @@ -383,9 +383,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Ważne jest, aby ustawić tę samą wartość `seed` dla obu wywołań, ponieważ wpływa ona na podział obrazów między zestaw treningowy a testowy.\n", + "Ważne jest, aby ustawić tę samą wartość `seed` dla obu wywołań, ponieważ wpływa ona na podział obrazów między zbiór treningowy a testowy.\n", "\n", - "Zbiór danych automatycznie pobiera nazwy klas z katalogów, a jeśli zajdzie taka potrzeba, możesz uzyskać do nich dostęp, wywołując:\n" + "Dataset automatycznie pobiera nazwy klas z katalogów, a w razie potrzeby można się do nich odwołać, wywołując:\n" ] }, { @@ -412,7 +412,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Zbiory danych, które uzyskaliśmy, mogą być bezpośrednio przekazane do funkcji `fit`, aby wytrenować model. Zawierają one zarówno odpowiadające im obrazy, jak i etykiety, które można iterować za pomocą następującej konstrukcji:\n" + "Zbiory danych, które uzyskaliśmy, można bezpośrednio przekazać do funkcji `fit`, aby wytrenować model. Zawierają one zarówno odpowiadające obrazy, jak i etykiety, po których można iterować za pomocą następującej konstrukcji:\n" ] }, { @@ -453,16 +453,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "> **Uwaga**: Wszystkie obrazy w zestawie danych są reprezentowane jako tensory zmiennoprzecinkowe w zakresie 0-255. Przed przekazaniem ich do sieci neuronowej musimy skalować te wartości do zakresu 0-1. Podczas wyświetlania obrazów musimy zrobić to samo lub przekonwertować wartości na typ `int` (co robimy w kodzie powyżej), aby pokazać `matplotlib`, że chcemy wyświetlić oryginalny nieskalowany obraz.\n" + "> **Uwaga**: Wszystkie obrazy w zbiorze danych są reprezentowane jako tensory zmiennoprzecinkowe w zakresie 0-255. Przed przekazaniem ich do sieci neuronowej, musimy przeskalować te wartości do zakresu 0-1. Podczas wyświetlania obrazów, musimy zrobić to samo lub przekonwertować wartości na typ `int` (co wykonujemy w powyższym kodzie), aby pokazać `matplotlib`, że chcemy wyświetlić oryginalny, nieprzeskalowany obraz.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Wstępnie wytrenowane modele\n", + "## Modele wstępnie wytrenowane\n", "\n", - "Dla wielu zadań klasyfikacji obrazów można znaleźć wstępnie wytrenowane modele sieci neuronowych. Wiele z tych modeli jest dostępnych w przestrzeni nazw `keras.applications`, a jeszcze więcej modeli można znaleźć w Internecie. Zobaczmy, jak można załadować i użyć najprostszego modelu VGG-16:\n" + "Dla wielu zadań klasyfikacji obrazów można znaleźć wstępnie wytrenowane modele sieci neuronowych. Wiele z tych modeli jest dostępnych w przestrzeni nazw `keras.applications`, a jeszcze więcej modeli można znaleźć w Internecie. Zobaczmy, jak można załadować i użyć najprostszy model 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": [ - "Jest kilka ważnych rzeczy, o których należy pamiętać:\n", - "* Przed przekazaniem danych wejściowych do jakiejkolwiek wstępnie wytrenowanej sieci, muszą one zostać odpowiednio przetworzone. Odbywa się to poprzez wywołanie odpowiedniej funkcji `preprocess_input`, która przyjmuje partię obrazów i zwraca ich przetworzoną formę. W przypadku VGG-16 obrazy są normalizowane, a od wartości każdego kanału odejmowana jest z góry zdefiniowana średnia. Jest to konieczne, ponieważ VGG-16 była pierwotnie trenowana z takim właśnie przetwarzaniem wstępnym.\n", - "* Sieć neuronowa jest stosowana do partii danych wejściowych, a w wyniku otrzymujemy partię 1000-elementowych tensorów, które pokazują prawdopodobieństwo każdej klasy. Najbardziej prawdopodobny numer klasy można znaleźć, wywołując `argmax` na tym tensorze.\n", - "* Uzyskany wynik to [numer klasy `ImageNet`](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Aby zrozumieć ten wynik, można również użyć funkcji `decode_predictions`, która zwraca n najwyższych klas wraz z ich nazwami.\n" + "Tutaj jest kilka ważnych rzeczy:\n", + "* Przed przekazaniem danych wejściowych do dowolnej sieci uprzednio wytrenowanej, muszą one zostać uprzednio przetworzone w określony sposób. Odbywa się to przez wywołanie odpowiedniej funkcji `preprocess_input`, która przyjmuje partię obrazów i zwraca ich przetworzoną formę. W przypadku VGG-16 obrazy są normalizowane, a od każdego kanału odejmuje się zdefiniowaną wcześniej średnią wartość. Wynika to z faktu, że VGG-16 był oryginalnie trenowany z takim przetwarzaniem wstępnym.\n", + "* Sieć neuronowa jest stosowana do partii danych wejściowych, a w wyniku otrzymujemy partię tensorów o wymiarze 1000, które pokazują prawdopodobieństwo dla każdej klasy. Możemy znaleźć najbardziej prawdopodobny numer klasy, wywołując `argmax` na tym tensorze.\n", + "* Uzyskany wynik to [numer klasy z `ImageNet`](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Aby nadać sens temu wynikowi, możemy także użyć funkcji `decode_predictions`, która zwraca n najlepszych klas wraz z ich nazwami.\n" ] }, { @@ -599,7 +609,7 @@ "source": [ "## Obliczenia na GPU\n", "\n", - "Głębokie sieci neuronowe, takie jak VGG-16 i inne nowoczesne architektury, wymagają sporej mocy obliczeniowej do działania. Warto więc skorzystać z przyspieszenia za pomocą GPU, jeśli jest dostępne. Na szczęście Keras automatycznie przyspiesza obliczenia na GPU, jeśli jest ono dostępne. Możemy sprawdzić, czy Tensorflow jest w stanie korzystać z GPU, używając poniższego kodu:\n" + "Głębokie sieci neuronowe, takie jak VGG-16 i inne nowocześniejsze architektury, wymagają sporej mocy obliczeniowej do działania. Ma sens używanie przyspieszenia GPU, jeśli jest dostępne. Na szczęście Keras automatycznie przyspiesza obliczenia na GPU, jeśli jest on dostępny. Możemy sprawdzić, czy Tensorflow jest w stanie korzystać z GPU, używając następującego kodu:\n" ] }, { @@ -626,9 +636,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Ekstrakcja cech za pomocą VGG\n", "\n", - "Jeśli chcemy użyć VGG-16 do ekstrakcji cech z naszych obrazów, potrzebujemy modelu bez końcowych warstw klasyfikacyjnych. Możemy utworzyć model VGG-16 bez górnych warstw za pomocą tego kodu:\n" + "## Ekstrakcja cech VGG\n", + "\n", + "Jeśli chcemy użyć VGG-16 do ekstrakcji cech z naszych obrazów, potrzebujemy modelu bez końcowych warstw klasyfikacyjnych. Możemy utworzyć model VGG-16 bez warstw górnych, używając tego kodu:\n" ] }, { @@ -680,9 +691,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Wymiar tensora cech wynosi 7x7x512, ale aby go zwizualizować, musieliśmy przekształcić go do formy 2D.\n", + "Wymiar tensora cech to 7x7x512, ale w celu wizualizacji musieliśmy go przekształcić do formy 2D.\n", "\n", - "Teraz spróbujmy sprawdzić, czy te cechy mogą być użyte do klasyfikacji obrazów. Ręcznie wybierzmy pewną część obrazów (w naszym przypadku 50 minibatchy) i wstępnie obliczmy ich wektory cech. Możemy do tego użyć API **dataset** w Tensorflow. Funkcja `map` przyjmuje zbiór danych i stosuje podaną funkcję lambda, aby go przekształcić. Wykorzystujemy ten mechanizm do stworzenia nowych zbiorów danych, `ds_features_train` i `ds_features_test`, które zawierają cechy wyodrębnione przez VGG zamiast oryginalnych obrazów.\n" + "Teraz spróbujmy zobaczyć, czy te cechy mogą być użyte do klasyfikacji obrazów. Ręcznie weźmy część obrazów (50 minibatchy, w naszym przypadku) i wstępnie obliczmy ich wektory cech. Możemy do tego użyć API **dataset** Tensorflow. Funkcja `map` pobiera zbiór danych i stosuje podaną funkcję lambda do jego transformacji. Używamy tego mechanizmu, aby stworzyć nowe zbiory danych, `ds_features_train` oraz `ds_features_test`, które zawierają cechy wyekstrahowane przez VGG zamiast oryginalnych obrazów.\n" ] }, { @@ -712,9 +723,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Użyliśmy konstrukcji `.take(50)`, aby ograniczyć rozmiar zbioru danych i przyspieszyć naszą demonstrację. Oczywiście możesz przeprowadzić ten eksperyment na pełnym zbiorze danych.\n", + "Użyliśmy konstrukcji `.take(50)`, aby ograniczyć rozmiar zbioru danych i przyspieszyć naszą demonstrację. Oczywiście możesz wykonać ten eksperyment na pełnym zbiorze danych.\n", "\n", - "Teraz, gdy mamy zbiór danych z wyodrębnionymi cechami, możemy wytrenować prosty gęsty klasyfikator, który będzie rozróżniał koty od psów. Ta sieć przyjmie wektor cech o kształcie (7,7,512) i wygeneruje jeden wynik odpowiadający albo psu, albo kotu. Ponieważ jest to klasyfikacja binarna, używamy funkcji aktywacji `sigmoid` oraz straty `binary_crossentropy`.\n" + "Teraz, gdy mamy zbiór danych z wyodrębnionymi cechami, możemy wytrenować prosty gęsty klasyfikator do rozróżniania kotów i psów. Ta sieć przyjmie wektor cech o kształcie (7,7,512) i wygeneruje jedno wyjście, które odpowiada albo psu, albo kotu. Ponieważ jest to klasyfikacja binarna, używamy funkcji aktywacji `sigmoid` oraz straty `binary_crossentropy`.\n" ] }, { @@ -743,13 +754,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Wynik jest świetny, możemy odróżnić kota od psa z prawdopodobieństwem prawie 95%! Jednakże, przetestowaliśmy to podejście tylko na podzbiorze wszystkich obrazów, ponieważ ręczne wyodrębnianie cech wydaje się zajmować dużo czasu.\n", + "Wynik jest świetny, potrafimy rozróżnić kota od psa z prawie 95% prawdopodobieństwem! Jednak przetestowaliśmy to podejście tylko na podzbiorze wszystkich obrazów, ponieważ ręczne wydobywanie cech wydaje się zajmować dużo czasu.\n", "\n", - "## Transfer learning z użyciem jednej sieci VGG\n", + "## Transfer learning z wykorzystaniem jednej sieci VGG\n", "\n", - "Możemy również uniknąć ręcznego wstępnego obliczania cech, korzystając z oryginalnej sieci VGG-16 w całości podczas treningu, dodając ekstraktor cech jako pierwszą warstwę naszej sieci.\n", + "Możemy również uniknąć ręcznego wstępnego obliczania cech, używając oryginalnej sieci VGG-16 jako całości podczas trenowania, dodając ekstraktor cech do naszej sieci jako pierwszą warstwę.\n", "\n", - "Piękno architektury Keras polega na tym, że model VGG-16, który zdefiniowaliśmy powyżej, może być również użyty jako warstwa w innej sieci neuronowej! Wystarczy skonstruować sieć z gęstym klasyfikatorem na jej szczycie, a następnie wytrenować całą sieć za pomocą propagacji wstecznej.\n" + "Piękno architektury Keras polega na tym, że model VGG-16, który zdefiniowaliśmy powyżej, może być również użyty jako warstwa w innej sieci neuronowej! Wystarczy skonstruować sieć z gęstym klasyfikatorem na jej wierzchołku, a następnie trenować całą sieć za pomocą propagacji wstecznej.\n" ] }, { @@ -793,13 +804,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Ten model wygląda jak sieć klasyfikacyjna typu end-to-end, która przyjmuje obraz i zwraca klasę. Jednak trudność polega na tym, że chcemy, aby VGG16 działał jako ekstraktor cech, a nie był ponownie trenowany. Dlatego musimy **zamrozić wagi ekstraktora cech konwolucyjnych**. Możemy uzyskać dostęp do pierwszej warstwy sieci, wywołując `model.layers[0]`, i wystarczy ustawić właściwość `trainable` na `False`.\n", + "Ten model wygląda jak sieć klasyfikacyjna od początku do końca, która przyjmuje obraz i zwraca klasę. Jednak trudność polega na tym, że chcemy, aby VGG16 działał jako ekstraktor cech, a nie był ponownie trenowany. Dlatego musimy **zamrozić wagi ekstraktora cech konwolucyjnych**. Możemy uzyskać dostęp do pierwszej warstwy sieci, wywołując `model.layers[0]`, i wystarczy ustawić właściwość `trainable` na `False`.\n", "\n", - "> **Note**: Zamrożenie wag ekstraktora cech jest konieczne, ponieważ w przeciwnym razie nietrenowana warstwa klasyfikatora może zniszczyć oryginalne, wstępnie wytrenowane wagi ekstraktora konwolucyjnego.\n", + "> **Uwaga**: Zamrożenie wag ekstraktora cech jest konieczne, ponieważ w przeciwnym razie nietrenowana warstwa klasyfikatora może zniszczyć oryginalne wagi ekstraktora konwolucyjnego wytrenowanego wcześniej.\n", "\n", - "Możesz zauważyć, że chociaż całkowita liczba parametrów w naszej sieci wynosi około 15 milionów, trenujemy jedynie 25 tysięcy parametrów. Wszystkie pozostałe parametry najwyższych warstw filtrów konwolucyjnych są wstępnie wytrenowane. To dobrze, ponieważ możemy dostroić mniejszą liczbę parametrów przy użyciu mniejszej liczby przykładów.\n", + "Możesz zauważyć, że chociaż całkowita liczba parametrów w naszej sieci wynosi około 15 milionów, trenujemy tylko 25 tysięcy parametrów. Wszystkie pozostałe parametry najwyższej warstwy filtrów konwolucyjnych są wytrenowane wcześniej. To dobrze, ponieważ możemy dopasować mniejszą liczbę parametrów z mniejszą liczbą przykładów.\n", "\n", - "Teraz przeszkolimy naszą sieć i zobaczymy, jak dobre wyniki możemy osiągnąć. Oczekuj dość długiego czasu działania i nie martw się, jeśli wykonanie wydaje się przez jakiś czas zamrożone.\n" + "Teraz wytrenujemy naszą sieć i zobaczymy, jak dobrze możemy to zrobić. Spodziewaj się raczej długiego czasu uruchomienia i nie martw się, jeśli wykonanie przez chwilę będzie wyglądać na zamrożone.\n" ] }, { @@ -824,11 +835,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Wygląda na to, że udało nam się stworzyć całkiem dokładny klasyfikator kotów i psów!\n", + "Wygląda na to, że uzyskaliśmy dość dokładny klasyfikator kotów i psów! \n", "\n", - "## Zapisywanie i wczytywanie modelu\n", + "## Zapisywanie i ładowanie modelu\n", "\n", - "Po zakończeniu treningu modelu możemy zapisać jego architekturę oraz wytrenowane wagi do pliku, aby móc je później wykorzystać:\n" + "Gdy wytrenujemy model, możemy zapisać jego architekturę oraz wytrenowane wagi do pliku, aby użyć ich w przyszłości:\n" ] }, { @@ -852,7 +863,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Możemy wtedy wczytać model z pliku w dowolnym momencie. Może to być przydatne w przypadku, gdy następny eksperyment zniszczy model - nie musiałbyś zaczynać od zera.\n" + "Model można następnie wczytać z pliku w dowolnym momencie. Może to być przydatne na wypadek, gdyby następny eksperyment zniszczył model – nie będzie trzeba zaczynać od zera.\n" ] }, { @@ -868,15 +879,15 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Dostosowywanie transfer learningu\n", + "## Dopasowywanie transferu uczenia\n", "\n", - "W poprzedniej sekcji przeszkoliliśmy ostatnią warstwę klasyfikatora, aby klasyfikowała obrazy w naszym własnym zbiorze danych. Nie przeprowadziliśmy jednak ponownego treningu ekstraktora cech, a nasz model opierał się na cechach, które nauczył się na danych ImageNet. Jeśli Twoje obiekty wizualnie różnią się od typowych obrazów ImageNet, taka kombinacja cech może nie działać najlepiej. Dlatego warto rozpocząć trening również warstw konwolucyjnych.\n", + "W poprzedniej sekcji trenowaliśmy końcową warstwę klasyfikatora, aby klasyfikować obrazy w naszym własnym zbiorze danych. Nie przeprowadziliśmy jednak ponownego trenowania ekstraktora cech i nasz model opierał się na cechach, które model nauczył się na danych ImageNet. Jeśli twoje obiekty wizualnie różnią się od zwykłych obrazów ImageNet, to połączenie cech może nie działać najlepiej. Dlatego sensowne jest również rozpoczęcie trenowania warstw konwolucyjnych.\n", "\n", "Aby to zrobić, możemy odblokować parametry filtrów konwolucyjnych, które wcześniej zamroziliśmy.\n", "\n", - "> **Note:** Ważne jest, aby najpierw zamrozić parametry i przeprowadzić kilka epok treningu, aby ustabilizować wagi w warstwie klasyfikacyjnej. Jeśli od razu rozpoczniesz trening sieci end-to-end z odblokowanymi parametrami, duże błędy mogą zniszczyć wstępnie wytrenowane wagi w warstwach konwolucyjnych.\n", + "> **Uwaga:** Ważne jest, aby najpierw zamrozić parametry i przeprowadzić kilka epok treningu w celu ustabilizowania wag w warstwie klasyfikacji. Jeśli od razu zaczniesz trenować sieć end-to-end z odblokowanymi parametrami, duże błędy prawdopodobnie zniszczą wcześniej wyuczone wagi w warstwach konwolucyjnych.\n", "\n", - "Nasz konwolucyjny model VGG-16 znajduje się w pierwszej warstwie i sam składa się z wielu warstw. Możemy przyjrzeć się jego strukturze:\n" + "Nasz konwolucyjny model VGG-16 znajduje się wewnątrz pierwszej warstwy, a sam składa się z wielu warstw. Możemy przyjrzeć się jego strukturze:\n" ] }, { @@ -945,7 +956,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Możemy odmrozić wszystkie warstwy podstawy konwolucyjnej:\n" + "Możemy odmrozić wszystkie warstwy bazy konwolucyjnej:\n" ] }, { @@ -961,7 +972,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Jednak rozmrożenie wszystkich naraz nie jest najlepszym pomysłem. Możemy najpierw rozmrozić tylko kilka ostatnich warstw konwolucji, ponieważ zawierają one wzorce wyższego poziomu, które są istotne dla naszych obrazów. Na przykład, na początek możemy zamrozić wszystkie warstwy z wyjątkiem ostatnich 4:\n" + "Jednak odtajenie ich wszystkich naraz nie jest najlepszym pomysłem. Możemy najpierw odtajnić tylko kilka ostatnich warstw konwolucyjnych, ponieważ zawierają one wzorce na wyższym poziomie, które są istotne dla naszych obrazów. Na przykład, na początek możemy zamrozić wszystkie warstwy z wyjątkiem ostatnich 4: \n" ] }, { @@ -1000,11 +1011,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Zauważ, że liczba trenowalnych parametrów znacząco wzrosła, ale wciąż stanowi około 50% wszystkich parametrów.\n", + "Zauważ, że liczba trenowalnych parametrów znacznie wzrosła, ale nadal stanowi około 50% wszystkich parametrów.\n", "\n", - "Po odblokowaniu warstw możemy przeprowadzić jeszcze kilka epok treningu (w naszym przykładzie wykonamy tylko jedną). Możesz również wybrać niższą wartość współczynnika uczenia, aby zminimalizować wpływ na wagi wstępnie wytrenowane. Jednak nawet przy niskim współczynniku uczenia możesz spodziewać się spadku dokładności na początku treningu, zanim ostatecznie osiągnie ona nieco wyższy poziom niż w przypadku zamrożonych wag.\n", + "Po odblokowaniu można przeprowadzić kilka dodatkowych epok treningu (w naszym przykładzie zrobimy tylko jedną). Można również wybrać niższą szybkość uczenia, aby zminimalizować wpływ na wagi wstępnie wytrenowane. Jednak nawet przy niskiej szybkości uczenia można się spodziewać spadku dokładności na początku treningu, aż ostatecznie osiągnie ona nieco wyższy poziom niż w przypadku stałych wag.\n", "\n", - "> **Note:** Ten trening przebiega znacznie wolniej, ponieważ musimy propagować gradienty wstecz przez wiele warstw sieci!\n" + "> **Uwaga:** Ten trening przebiega znacznie wolniej, ponieważ musimy propagować gradienty wstecz przez wiele warstw sieci!\n" ] }, { @@ -1028,9 +1039,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Prawdopodobnie osiągniemy wyższą dokładność treningową, ponieważ używamy bardziej zaawansowanej sieci z większą liczbą parametrów, ale dokładność walidacyjna nie wzrośnie aż tak bardzo.\n", + "Prawdopodobnie osiągniemy wyższą dokładność podczas treningu, ponieważ używamy potężniejszej sieci z większą liczbą parametrów, ale dokładność walidacji nie wzrośnie aż tak bardzo.\n", "\n", - "Śmiało odblokuj kilka dodatkowych warstw sieci i trenuj dalej, aby sprawdzić, czy uda Ci się osiągnąć wyższą dokładność!\n" + "Śmiało odblokuj kilka kolejnych warstw sieci i trenuj dalej, aby sprawdzić, czy uda Ci się osiągnąć wyższą dokładność!\n" ] }, { @@ -1039,7 +1050,7 @@ "source": [ "## Inne modele wizji komputerowej\n", "\n", - "VGG-16 to jedna z najprostszych architektur wizji komputerowej. Keras oferuje wiele innych wstępnie wytrenowanych sieci. Najczęściej używane z nich to architektury **ResNet**, opracowane przez Microsoft, oraz **Inception** stworzone przez Google. Na przykład, przyjrzyjmy się architekturze najprostszego modelu ResNet-50 (ResNet to rodzina modeli o różnej głębokości, możesz spróbować eksperymentować z ResNet-152, jeśli chcesz zobaczyć, jak wygląda naprawdę głęboki model):\n" + "VGG-16 to jedna z najprostszych architektur wizji komputerowej. Keras udostępnia wiele innych wcześniej wytrenowanych sieci. Do najczęściej używanych należą architektury **ResNet**, opracowane przez Microsoft, oraz **Inception** od Google. Na przykład, przyjrzyjmy się architekturze najprostszego modelu ResNet-50 (ResNet to rodzina modeli o różnej głębokości, możesz spróbować eksperymentować z ResNet-152, jeśli chcesz zobaczyć, jak wygląda naprawdę głęboki model):\n" ] }, { @@ -1441,29 +1452,29 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Jak widać, model zawiera te same dobrze znane elementy: warstwy konwolucyjne, warstwy poolingowe oraz końcowy gęsty klasyfikator. Możemy używać tego modelu dokładnie w taki sam sposób, jak używaliśmy VGG-16 do transferu uczenia. Możesz spróbować eksperymentować z powyższym kodem, używając różnych modeli ResNet jako modelu bazowego i zobaczyć, jak zmienia się dokładność.\n", + "Jak widać, model zawiera te same znajome elementy budulcowe: warstwy splotowe, warstwy poolingowe oraz końcowy gęsty klasyfikator. Możemy używać tego modelu dokładnie w taki sam sposób, jak używaliśmy VGG-16 do transfer learningu. Możesz spróbować eksperymentować z powyższym kodem, używając różnych modeli ResNet jako modelu bazowego i zobaczyć, jak zmienia się dokładność.\n", "\n", - "## Normalizacja Batchowa\n", + "## Normalizacja paczki (Batch Normalization)\n", "\n", - "Ta sieć zawiera jeszcze jeden typ warstwy: **Normalizacja Batchowa**. Idea normalizacji batchowej polega na doprowadzeniu wartości przepływających przez sieć neuronową do odpowiedniego zakresu. Zazwyczaj sieci neuronowe działają najlepiej, gdy wszystkie wartości mieszczą się w zakresie [-1,1] lub [0,1], dlatego skalujemy/normalizujemy nasze dane wejściowe odpowiednio. Jednak podczas trenowania głębokiej sieci może się zdarzyć, że wartości znacznie wyjdą poza ten zakres, co utrudnia proces uczenia. Warstwa normalizacji batchowej oblicza średnią i odchylenie standardowe dla wszystkich wartości w bieżącej mini-partii i używa ich do normalizacji sygnału przed przekazaniem go przez warstwę sieci neuronowej. To znacząco poprawia stabilność głębokich sieci.\n" + "Ta sieć zawiera kolejny rodzaj warstwy: **Normalizację paczki (Batch Normalization)**. Pomysł normalizacji paczki polega na sprowadzeniu wartości przepływających przez sieć neuronową do odpowiedniego zakresu. Zazwyczaj sieci neuronowe działają najlepiej, gdy wszystkie wartości mieszczą się w zakresie [-1,1] lub [0,1], i z tego powodu skalujemy/normalizujemy nasze dane wejściowe odpowiednio. Jednak podczas trenowania głębokiej sieci może się zdarzyć, że wartości znacznie wyjdą poza ten zakres, co utrudnia trening. Warstwa normalizacji paczki oblicza średnią i odchylenie standardowe dla wszystkich wartości bieżącej mini-paczki i używa ich do normalizacji sygnału przed przekazaniem go do warstwy sieci neuronowej. To znacznie poprawia stabilność głębokich sieci.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Podsumowanie\n", + "## Wnioski\n", "\n", - "Dzięki transferowi uczenia udało nam się szybko stworzyć klasyfikator do naszego zadania klasyfikacji niestandardowych obiektów i osiągnąć wysoką dokładność. Jednak ten przykład nie był całkowicie sprawiedliwy, ponieważ oryginalna sieć VGG-16 była wcześniej wytrenowana do rozpoznawania kotów i psów, więc w zasadzie korzystaliśmy z wzorców, które już były obecne w sieci. Można spodziewać się niższej dokładności w przypadku bardziej egzotycznych, specyficznych dla danej dziedziny obiektów, takich jak detale na linii produkcyjnej w fabryce czy różne liście drzew.\n", + "Korzystając z transfer learningu, byliśmy w stanie szybko stworzyć klasyfikator do naszego niestandardowego zadania klasyfikacji obiektów i osiągnąć wysoką dokładność. Jednak ten przykład nie był całkowicie uczciwy, ponieważ oryginalna sieć VGG-16 była wstępnie wytrenowana do rozpoznawania kotów i psów, a zatem ponownie wykorzystaliśmy większość wzorców, które już występowały w sieci. Możesz spodziewać się niższej dokładności w przypadku bardziej egzotycznych, specyficznych dla domeny obiektów, takich jak detale na linii produkcyjnej w zakładzie lub różne liście drzew.\n", "\n", - "Widać, że bardziej złożone zadania, które obecnie rozwiązujemy, wymagają większej mocy obliczeniowej i nie mogą być łatwo realizowane na CPU. W następnej części spróbujemy użyć bardziej lekkiej implementacji, aby wytrenować ten sam model przy użyciu mniejszych zasobów obliczeniowych, co przyniesie tylko nieznacznie niższą dokładność.\n" + "Widać, że bardziej złożone zadania, które obecnie rozwiązujemy, wymagają większej mocy obliczeniowej i nie mogą być łatwo rozwiązane na CPU. W następnej jednostce postaramy się użyć lżejszej implementacji do trenowania tego samego modelu, wykorzystując mniej zasobów obliczeniowych, co skutkuje jedynie nieznacznie niższą dokładnością.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**Zastrzeżenie**: \nTen dokument został przetłumaczony za pomocą usługi tłumaczeniowej AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby tłumaczenie było precyzyjne, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za wiarygodne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia.\n" + "---\n\n\n**Zastrzeżenie**:\nNiniejszy dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Choć dążymy do dokładności, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub niedokładności. Oryginalny dokument w jego języku źródłowym należy uznawać za autorytatywne źródło. W przypadku informacji krytycznych zalecane jest skorzystanie z profesjonalnego tłumaczenia wykonanego przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia.\n\n" ] } ], @@ -1484,12 +1495,6 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" - }, - "coopTranslator": { - "original_hash": "c189abc107848f96051085cc30945129", - "translation_date": "2025-08-31T12:48:11+00:00", - "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", - "language_code": "pl" } }, "nbformat": 4, diff --git a/translations/pl/lessons/5-NLP/README.md b/translations/pl/lessons/5-NLP/README.md index 518c0fc429..5ada1beec3 100644 --- a/translations/pl/lessons/5-NLP/README.md +++ b/translations/pl/lessons/5-NLP/README.md @@ -1,34 +1,34 @@ # Przetwarzanie Języka Naturalnego -![Podsumowanie zadań NLP w formie rysunku](../../../../lessons/sketchnotes/ai-nlp.png) - -W tej sekcji skupimy się na wykorzystaniu sieci neuronowych do rozwiązywania zadań związanych z **Przetwarzaniem Języka Naturalnego (NLP)**. Istnieje wiele problemów NLP, które chcielibyśmy, aby komputery potrafiły rozwiązywać: - -* **Klasyfikacja tekstu** to typowy problem klasyfikacyjny dotyczący sekwencji tekstowych. Przykłady obejmują klasyfikowanie wiadomości e-mail jako spam lub nie-spam, albo kategoryzowanie artykułów jako sport, biznes, polityka itp. Ponadto, podczas tworzenia chatbotów często musimy zrozumieć, co użytkownik chciał powiedzieć — w takim przypadku mamy do czynienia z **klasyfikacją intencji**. W klasyfikacji intencji często musimy radzić sobie z wieloma kategoriami. -* **Analiza sentymentu** to typowy problem regresji, w którym musimy przypisać liczbę (sentyment) odpowiadającą temu, jak pozytywne/negatywne jest znaczenie zdania. Bardziej zaawansowaną wersją analizy sentymentu jest **analiza sentymentu oparta na aspektach** (ABSA), gdzie przypisujemy sentyment nie do całego zdania, ale do jego różnych części (aspektów), np. *W tej restauracji podobała mi się kuchnia, ale atmosfera była okropna*. -* **Rozpoznawanie nazwanych jednostek** (NER) odnosi się do problemu wyodrębniania określonych jednostek z tekstu. Na przykład, musimy zrozumieć, że w zdaniu *Muszę polecieć do Paryża jutro* słowo *jutro* odnosi się do DATY, a *Paryż* to LOKALIZACJA. -* **Ekstrakcja słów kluczowych** jest podobna do NER, ale musimy automatycznie wyodrębnić słowa istotne dla znaczenia zdania, bez wcześniejszego trenowania na określonych typach jednostek. -* **Grupowanie tekstu** może być przydatne, gdy chcemy pogrupować podobne zdania, na przykład podobne zgłoszenia w rozmowach z pomocą techniczną. -* **Odpowiadanie na pytania** odnosi się do zdolności modelu do udzielania odpowiedzi na konkretne pytanie. Model otrzymuje fragment tekstu i pytanie jako dane wejściowe, a jego zadaniem jest wskazanie miejsca w tekście, gdzie znajduje się odpowiedź (lub czasami wygenerowanie tekstu odpowiedzi). -* **Generowanie tekstu** to zdolność modelu do tworzenia nowego tekstu. Można to traktować jako zadanie klasyfikacyjne, które przewiduje kolejną literę/słowo na podstawie pewnej *podpowiedzi tekstowej*. Zaawansowane modele generowania tekstu, takie jak GPT-3, potrafią rozwiązywać inne zadania NLP, takie jak klasyfikacja, wykorzystując techniki zwane [programowaniem podpowiedzi](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) lub [inżynierią podpowiedzi](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29). -* **Podsumowywanie tekstu** to technika, w której chcemy, aby komputer "przeczytał" długi tekst i streścił go w kilku zdaniach. +![Podsumowanie zadań NLP w szkicu](../../../../translated_images/pl/ai-nlp.b22dcb8ca4707cea.webp) + +W tej sekcji skupimy się na wykorzystaniu sieci neuronowych do obsługi zadań związanych z **Przetwarzaniem Języka Naturalnego (NLP)**. Istnieje wiele problemów NLP, które chcemy, aby komputery potrafiły rozwiązywać: + +* **Klasyfikacja tekstu** to typowy problem klasyfikacji dotyczący sekwencji tekstowych. Przykłady to klasyfikowanie wiadomości e-mail jako spam vs. nie-spam lub kategoryzowanie artykułów jako sport, biznes, polityka itd. Również podczas tworzenia chatbotów często musimy zrozumieć, co użytkownik chciał powiedzieć – w tym przypadku mamy do czynienia z **klasyfikacją intencji**. Często w klasyfikacji intencji musimy radzić sobie z wieloma kategoriami. +* **Analiza sentymentu** to typowy problem regresji, gdzie musimy przypisać liczbę (sentyment) odpowiadającą temu, jak pozytywne/negatywne jest znaczenie zdania. Bardziej zaawansowaną wersją analizy sentymentu jest **analiza sentymentu oparta na aspektach** (ABSA), gdzie sentyment przypisujemy nie całemu zdaniu, a różnym jego częściom (aspektom), np. *W tej restauracji podobała mi się kuchnia, ale atmosfera była okropna*. +* **Rozpoznawanie nazwanych jednostek** (NER) odnosi się do problemu wydobywania określonych jednostek z tekstu. Na przykład, musimy zrozumieć, że w zdaniu *Muszę jutro lecieć do Paryża* słowo *jutro* odnosi się do DATY, a *Paryż* to LOKALIZACJA. +* **Ekstrakcja słów kluczowych** jest podobna do NER, ale musimy automatycznie wydobyć słowa ważne dla znaczenia zdania, bez wcześniejszego trenowania dla konkretnych typów jednostek. +* **Grupowanie tekstu** może być użyteczne, gdy chcemy pogrupować podobne zdania, na przykład podobne zapytania w rozmowach wsparcia technicznego. +* **Odpowiadanie na pytania** odnosi się do zdolności modelu do udzielenia odpowiedzi na konkretne pytanie. Model otrzymuje na wejściu fragment tekstu i pytanie, a następnie powinien wskazać miejsce w tekście, gdzie zawarta jest odpowiedź (lub czasem wygenerować tekst odpowiedzi). +* **Generowanie tekstu** to zdolność modelu do generowania nowego tekstu. Można to traktować jako zadanie klasyfikacji, które przewiduje kolejną literę/słowo na podstawie *podpowiedzi tekstowej*. Zaawansowane modele generowania tekstu, takie jak GPT-3, potrafią rozwiązywać inne zadania NLP, takie jak klasyfikacja, wykorzystując technikę zwaną [programowaniem podpowiedzi](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) lub [inżynierią podpowiedzi](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29) +* **Streszczanie tekstu** to technika, gdy chcemy, aby komputer "przeczytał" długi tekst i podsumował go w kilku zdaniach. * **Tłumaczenie maszynowe** można postrzegać jako połączenie rozumienia tekstu w jednym języku i generowania tekstu w innym. -Początkowo większość zadań NLP była rozwiązywana za pomocą tradycyjnych metod, takich jak gramatyki. Na przykład w tłumaczeniu maszynowym używano parserów do przekształcenia początkowego zdania w drzewo składniowe, następnie wyodrębniano wyższe struktury semantyczne, aby reprezentować znaczenie zdania, a na podstawie tego znaczenia i gramatyki języka docelowego generowano wynik. Obecnie wiele zadań NLP jest skuteczniej rozwiązywanych za pomocą sieci neuronowych. +Początkowo większość zadań NLP rozwiązywano za pomocą tradycyjnych metod, takich jak gramatyki. Na przykład w tłumaczeniu maszynowym parsery były używane do przekształcenia zdania początkowego w drzewo składniowe, następnie wydobywane były wyższe poziomy struktur semantycznych reprezentujących znaczenie zdania, a na podstawie tego znaczenia i gramatyki języka docelowego generowano wynik. Obecnie wiele zadań NLP jest skuteczniej rozwiązywanych za pomocą sieci neuronowych. -> Wiele klasycznych metod NLP jest zaimplementowanych w bibliotece Python [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org). Dostępna jest świetna [Książka o NLTK](https://www.nltk.org/book/), która omawia, jak różne zadania NLP można rozwiązać za pomocą NLTK. +> Wiele klasycznych metod NLP jest zaimplementowanych w bibliotece Pythona [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org). Dostępna jest świetna [książka NLTK](https://www.nltk.org/book/), która opisuje, jak różne zadania NLP można rozwiązać przy użyciu NLTK. -W naszym kursie skupimy się głównie na wykorzystaniu sieci neuronowych w NLP, a NLTK będziemy używać w razie potrzeby. +W naszym kursie skupimy się głównie na wykorzystaniu sieci neuronowych w NLP i będziemy korzystać z NLTK tam, gdzie to będzie potrzebne. -Nauczyliśmy się już, jak używać sieci neuronowych do pracy z danymi tabelarycznymi i obrazami. Główna różnica między tymi typami danych a tekstem polega na tym, że tekst jest sekwencją o zmiennej długości, podczas gdy rozmiar wejścia w przypadku obrazów jest znany z góry. Podczas gdy sieci konwolucyjne mogą wyodrębniać wzorce z danych wejściowych, wzorce w tekście są bardziej złożone. Na przykład negacja może być oddzielona od podmiotu przez dowolną liczbę słów (np. *Nie lubię pomarańczy* vs. *Nie lubię tych dużych kolorowych smacznych pomarańczy*), a mimo to powinna być interpretowana jako jeden wzorzec. Dlatego, aby przetwarzać język, musimy wprowadzić nowe typy sieci neuronowych, takie jak *sieci rekurencyjne* i *transformery*. +Już nauczyliśmy się wykorzystywać sieci neuronowe do pracy z danymi tabelarycznymi oraz z obrazami. Główna różnica między tymi typami danych a tekstem polega na tym, że tekst jest sekwencją o zmiennej długości, podczas gdy rozmiar wejścia w przypadku obrazów jest znany z góry. Sieci splotowe mogą wydobywać wzorce z danych wejściowych, jednak wzorce w tekście są bardziej złożone. Na przykład negacja może być oddzielona od podmiotu przez dowolną liczbę wyrazów (np. *Nie lubię pomarańczy* vs. *Nie lubię tych dużych, kolorowych, smacznych pomarańczy*), a mimo to powinno to być interpretowane jako jeden wzorzec. Aby poradzić sobie z językiem, musimy wprowadzić nowe typy sieci neuronowych, takie jak *sieci rekurencyjne* i *transformery*. ## Instalacja bibliotek -Jeśli korzystasz z lokalnej instalacji Pythona do uruchamiania tego kursu, możesz potrzebować zainstalować wszystkie wymagane biblioteki dla NLP za pomocą następujących poleceń: +Jeśli korzystasz z lokalnej instalacji Pythona do realizacji tego kursu, może być konieczne zainstalowanie wszystkich wymaganych bibliotek do NLP za pomocą następujących poleceń: **Dla PyTorch** ```bash -pip install -r requirements-torch.txt +pip install -r requirements-pytorch.txt ``` **Dla TensorFlow** ```bash @@ -39,13 +39,13 @@ pip install -r requirements-tf.txt ## Ostrzeżenie dotyczące GPU -W tej sekcji, w niektórych przykładach będziemy trenować dość duże modele. -* **Używaj komputera z obsługą GPU**: Zaleca się uruchamianie notebooków na komputerze z obsługą GPU, aby skrócić czas oczekiwania podczas pracy z dużymi modelami. -* **Ograniczenia pamięci GPU**: Uruchamianie na GPU może prowadzić do sytuacji, w których zabraknie pamięci GPU, zwłaszcza podczas trenowania dużych modeli. -* **Zużycie pamięci GPU**: Ilość pamięci GPU zużywanej podczas trenowania zależy od różnych czynników, w tym rozmiaru minibatcha. +W tej sekcji w niektórych przykładach będziemy trenować całkiem duże modele. +* **Używaj komputera z GPU**: Zaleca się uruchamiać notatniki na komputerach z GPU, aby skrócić czas oczekiwania podczas pracy z dużymi modelami. +* **Ograniczenia pamięci GPU**: Praca na GPU może prowadzić do sytuacji, w których zabraknie pamięci GPU, zwłaszcza podczas trenowania dużych modeli. +* **Zużycie pamięci GPU**: Ilość pamięci GPU zużywanej podczas treningu zależy od różnych czynników, w tym od rozmiaru minibatcha. * **Minimalizuj rozmiar minibatcha**: Jeśli napotkasz problemy z pamięcią GPU, rozważ zmniejszenie rozmiaru minibatcha w swoim kodzie jako potencjalne rozwiązanie. -* **Zwolnienie pamięci GPU w TensorFlow**: Starsze wersje TensorFlow mogą nie zwalniać pamięci GPU poprawnie podczas trenowania wielu modeli w jednym jądrze Pythona. Aby skutecznie zarządzać użyciem pamięci GPU, możesz skonfigurować TensorFlow tak, aby alokował pamięć GPU tylko w razie potrzeby. -* **Dodanie kodu**: Aby ustawić TensorFlow na dynamiczne przydzielanie pamięci GPU, dodaj poniższy kod do swoich notebooków: +* **Zwalnianie pamięci GPU w TensorFlow**: Starsze wersje TensorFlow mogą nie zwalniać poprawnie pamięci GPU podczas trenowania wielu modeli w jednym kernelu Pythona. Aby efektywnie zarządzać użyciem pamięci GPU, możesz skonfigurować TensorFlow tak, aby alokował pamięć GPU tylko wtedy, gdy jest to potrzebne. +* **Włączenie kodu**: Aby ustawić TensorFlow tak, by dynamicznie zwiększał przydział pamięci GPU, dodaj następujący kod do swoich notatników: ```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) ``` -Jeśli interesuje Cię nauka NLP z perspektywy klasycznego ML, odwiedź [ten zestaw lekcji](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP) +Jeśli chcesz nauczyć się NLP z klasycznej perspektywy ML, odwiedź [tę serię lekcji](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP) ## W tej sekcji -W tej sekcji nauczymy się: +W tej sekcji nauczymy się o: -* [Reprezentowania tekstu jako tensory](13-TextRep/README.md) -* [Osadzeń słów](14-Emdeddings/README.md) -* [Modelowania języka](15-LanguageModeling/README.md) -* [Rekurencyjnych sieci neuronowych](16-RNN/README.md) -* [Sieci generatywnych](17-GenerativeNetworks/README.md) -* [Transformerów](18-Transformers/README.md) +* [Reprezentowaniu tekstu jako tensory](13-TextRep/README.md) +* [Osadzaniu słów (Word Embeddings)](14-Emdeddings/README.md) +* [Modelowaniu języka](15-LanguageModeling/README.md) +* [Rekurencyjnych sieciach neuronowych](16-RNN/README.md) +* [Sieciach generatywnych](17-GenerativeNetworks/README.md) +* [Transformerach](18-Transformers/README.md) -**Zastrzeżenie**: -Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż staramy się zapewnić dokładność, prosimy mieć na uwadze, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za wiarygodne źródło. W przypadku informacji krytycznych zaleca się skorzystanie z profesjonalnego tłumaczenia wykonanego przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. \ No newline at end of file +--- + + +**Zastrzeżenie**: +Niniejszy dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Choć dążymy do dokładności, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub niedokładności. Oryginalny dokument w jego języku źródłowym należy uznawać za autorytatywne źródło. W przypadku informacji krytycznych zalecane jest skorzystanie z profesjonalnego tłumaczenia wykonanego przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. + \ No newline at end of file diff --git a/translations/pt-BR/.co-op-translator.json b/translations/pt-BR/.co-op-translator.json index c40e619932..e618494f71 100644 --- a/translations/pt-BR/.co-op-translator.json +++ b/translations/pt-BR/.co-op-translator.json @@ -5,6 +5,12 @@ "source_file": "AGENTS.md", "language_code": "pt-BR" }, + "CONTRIBUTING.md": { + "original_hash": "c6fd7e781b67111a90abd166d0ce4aa0", + "translation_date": "2026-07-08T21:15:24+00:00", + "source_file": "CONTRIBUTING.md", + "language_code": "pt-BR" + }, "README.md": { "original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b", "translation_date": "2026-04-06T21:05:36+00:00", @@ -17,6 +23,19 @@ "source_file": "SECURITY.md", "language_code": "pt-BR" }, + "__translation_failures__": { + "lessons/sketchnotes/LICENSE.md": { + "original_hash": "45ab63a2cd8f5faef6c9b150618837a4", + "source_file": "lessons/sketchnotes/LICENSE.md", + "language_code": "pt-BR", + "failure_date": "2026-07-08T21:09:34+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:41+00:00", @@ -54,8 +73,8 @@ "language_code": "pt-BR" }, "examples/README.md": { - "original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7", - "translation_date": "2025-10-03T11:29:59+00:00", + "original_hash": "7883d52c2e2a221e0b07a7b112a149b9", + "translation_date": "2026-07-08T21:04:26+00:00", "source_file": "examples/README.md", "language_code": "pt-BR" }, @@ -66,8 +85,8 @@ "language_code": "pt-BR" }, "lessons/0-course-setup/how-to-run.md": { - "original_hash": "a4717bd9103b9f6cd84d534b83534689", - "translation_date": "2026-01-15T14:16:59+00:00", + "original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1", + "translation_date": "2026-07-08T21:04:52+00:00", "source_file": "lessons/0-course-setup/how-to-run.md", "language_code": "pt-BR" }, @@ -191,6 +210,12 @@ "source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md", "language_code": "pt-BR" }, + "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": { + "original_hash": "99b816b6a4957ef4100cee4c4221dff9", + "translation_date": "2026-07-08T20:56:31+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", + "language_code": "pt-BR" + }, "lessons/4-ComputerVision/08-TransferLearning/lab/README.md": { "original_hash": "7765935c35fcee69b9fe2d0cfd6963e2", "translation_date": "2025-08-26T09:53:39+00:00", @@ -330,8 +355,8 @@ "language_code": "pt-BR" }, "lessons/5-NLP/README.md": { - "original_hash": "8ef02a9318257ea140ed3ed74442096d", - "translation_date": "2025-08-26T08:06:50+00:00", + "original_hash": "038df6f1a73e49f6430740da083bfd6d", + "translation_date": "2026-07-08T21:05:22+00:00", "source_file": "lessons/5-NLP/README.md", "language_code": "pt-BR" }, diff --git a/translations/pt-BR/CONTRIBUTING.md b/translations/pt-BR/CONTRIBUTING.md new file mode 100644 index 0000000000..0ece534db5 --- /dev/null +++ b/translations/pt-BR/CONTRIBUTING.md @@ -0,0 +1,29 @@ +# Contribuindo para AI-For-Beginners + +Obrigado pelo seu interesse em contribuir para o AI-For-Beginners! Agradecemos traduções, correções de lições e ajustes de formatação. + +## Acordo de Licença de Contribuidor (CLA) da Microsoft + +Este projeto aceita contribuições e sugestões. A maioria das contribuições requer que você concorde com um Acordo de Licença de Contribuidor (CLA) declarando que você tem o direito e de fato concede a nós os direitos de usar sua contribuição. Para mais detalhes, visite [https://cla.microsoft.com](https://cla.microsoft.com). + +Quando você enviar um pull request, um bot CLA determinará automaticamente se você precisa fornecer um CLA e marcará o PR apropriadamente (por exemplo, etiqueta, comentário). Basta seguir as instruções fornecidas pelo bot. Você precisará fazer isso apenas uma vez em todos os repositórios que usam nosso CLA. + +## Como Contribuir + +### 1. Corrigindo Erros de Digitação / Código +Se você encontrar um erro de digitação ou bug em qualquer notebook Jupyter ou arquivo markdown de lição: +1. Faça um fork do repositório. +2. Corrija o erro de digitação ou link quebrado. +3. Envie um Pull Request com uma descrição clara da correção. + +### 2. Enviando Traduções +Agradecemos traduções das lições para outros idiomas! Por favor, coloque as traduções sob o diretório `translations/` usando os nomes de pasta existentes lá (por exemplo `translations/es/`, `translations/pt-BR/`, `translations/zh-CN/`). + +Para mais detalhes, veja [etc/CONTRIBUTING.md](etc/CONTRIBUTING.md). + +--- + + +**Aviso Legal**: +Este documento foi traduzido usando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos pela precisão, por favor, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autorizada. Para informações críticas, recomenda-se tradução profissional humana. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações incorretas decorrentes do uso desta tradução. + \ No newline at end of file diff --git a/translations/pt-BR/examples/README.md b/translations/pt-BR/examples/README.md index dffaa735cb..947b42c145 100644 --- a/translations/pt-BR/examples/README.md +++ b/translations/pt-BR/examples/README.md @@ -1,27 +1,27 @@ # Exemplos de IA para Iniciantes -Bem-vindo! Este diretório contém exemplos simples e independentes para ajudá-lo a começar com IA e aprendizado de máquina. Cada exemplo foi projetado para ser acessível a iniciantes, com comentários detalhados e explicações passo a passo. +Bem-vindo! Este diretório contém exemplos simples e independentes para ajudá-lo a começar com IA e aprendizado de máquina. Cada exemplo é projetado para ser amigável para iniciantes, com comentários detalhados e explicações passo a passo. ## 📚 Visão Geral dos Exemplos | Exemplo | Descrição | Dificuldade | Pré-requisitos | |---------|-------------|------------|---------------| -| [Hello AI World](../../../examples/01-hello-ai-world.py) | Seu primeiro programa de IA - reconhecimento de padrões simples | ⭐ Iniciante | Noções básicas de Python | -| [Rede Neural Simples](../../../examples/02-simple-neural-network.py) | Construa uma rede neural do zero | ⭐⭐ Iniciante+ | Python, matemática básica | -| [Classificador de Imagens](./03-image-classifier.ipynb) | Classifique imagens com um modelo pré-treinado | ⭐⭐ Iniciante+ | Python, numpy | -| [Sentimento de Texto](../../../examples/04-text-sentiment.py) | Analise o sentimento de textos (positivo/negativo) | ⭐⭐ Iniciante+ | Python | +| [Hello AI World](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/01-hello-ai-world.py) | Seu primeiro programa de IA - reconhecimento simples de padrões | ⭐ Iniciante | Noções básicas de Python | +| [Simple Neural Network](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/02-simple-neural-network.py) | Construa uma rede neural do zero | ⭐⭐ Iniciante+ | Python, matemática básica | +| [Image Classifier](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/03-image-classifier.ipynb) | Classifique imagens com um modelo pré-treinado | ⭐⭐ Iniciante+ | Python, numpy | +| [Text Sentiment](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/04-text-sentiment.py) | Analise o sentimento do texto (positivo/negativo) | ⭐⭐ Iniciante+ | Python | ## 🚀 Começando ### Pré-requisitos -Certifique-se de ter o Python instalado (recomenda-se a versão 3.8 ou superior). Instale os pacotes necessários: +Certifique-se de ter o Python instalado (recomendado 3.8 ou superior). Instale os pacotes necessários: ```bash -# For Python scripts +# Para scripts Python pip install numpy -# For Jupyter notebooks (image classifier) +# Para notebooks Jupyter (classificador de imagens) pip install jupyter numpy pillow tensorflow ``` @@ -44,25 +44,25 @@ python 01-hello-ai-world.py jupyter notebook 03-image-classifier.ipynb ``` -## 📖 Caminho de Aprendizado +## 📖 Caminho de Aprendizagem Recomendamos seguir os exemplos na ordem: -1. **Comece com "Hello AI World"** - Aprenda o básico sobre reconhecimento de padrões -2. **Construa uma Rede Neural Simples** - Entenda como funcionam as redes neurais -3. **Experimente o Classificador de Imagens** - Veja a IA em ação com imagens reais -4. **Analise o Sentimento de Texto** - Explore o processamento de linguagem natural +1. **Comece com "Hello AI World"** - Aprenda o básico de reconhecimento de padrões +2. **Construa uma Rede Neural Simples** - Entenda como redes neurais funcionam +3. **Experimente o Classificador de Imagens** - Veja IA em ação com imagens reais +4. **Analise o Sentimento do Texto** - Explore o processamento de linguagem natural ## 💡 Dicas para Iniciantes -- **Leia os comentários do código com atenção** - Eles explicam o que cada linha faz +- **Leia atentamente os comentários no código** - Eles explicam o que cada linha faz - **Experimente!** - Tente alterar valores e veja o que acontece - **Não se preocupe em entender tudo de imediato** - Aprender leva tempo -- **Faça perguntas** - Use o [Fórum de Discussão](https://github.com/microsoft/AI-For-Beginners/discussions) +- **Faça perguntas** - Use o [quadro de discussões](https://github.com/microsoft/AI-For-Beginners/discussions) ## 🔗 Próximos Passos -Depois de concluir esses exemplos, explore o currículo completo: +Após completar estes exemplos, explore o currículo completo: - [Introdução à IA](../lessons/1-Intro/README.md) - [Redes Neurais](../lessons/3-NeuralNetworks/README.md) - [Visão Computacional](../lessons/4-ComputerVision/README.md) @@ -70,16 +70,18 @@ Depois de concluir esses exemplos, explore o currículo completo: ## 🤝 Contribuindo -Achou esses exemplos úteis? Ajude-nos a melhorá-los: -- Relate problemas ou sugira melhorias +Encontrou esses exemplos úteis? Ajude-nos a melhorá-los: +- Reporte problemas ou sugira melhorias - Adicione mais exemplos para iniciantes - Melhore a documentação e os comentários --- -*Lembre-se: Todo especialista já foi um iniciante. Boa aprendizagem! 🎓* +*Lembre-se: Todo especialista já foi um iniciante. Bom aprendizado! 🎓* --- -**Aviso Legal**: -Este documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução. \ No newline at end of file + +**Aviso Legal**: +Este documento foi traduzido usando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos pela precisão, por favor, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autorizada. Para informações críticas, recomenda-se tradução profissional humana. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações incorretas decorrentes do uso desta tradução. + \ No newline at end of file diff --git a/translations/pt-BR/lessons/0-course-setup/how-to-run.md b/translations/pt-BR/lessons/0-course-setup/how-to-run.md index 50824b6c69..3ce55dd8d7 100644 --- a/translations/pt-BR/lessons/0-course-setup/how-to-run.md +++ b/translations/pt-BR/lessons/0-course-setup/how-to-run.md @@ -1,12 +1,12 @@ # Como Executar o Código -Este currículo contém muitos exemplos executáveis e laboratórios que você vai querer executar. Para isso, você precisa da capacidade de executar código Python nos Jupyter Notebooks fornecidos como parte deste currículo. Você tem várias opções para executar o código: +Este currículo contém muitos exemplos executáveis e laboratórios que você vai querer executar. Para isso, é necessário ter a capacidade de executar código Python em Jupyter Notebooks fornecidos como parte deste currículo. Você tem várias opções para executar o código: ## Executar localmente no seu computador -Para executar o código localmente no seu computador, é necessária uma instalação do Python. Uma recomendação é instalar o **[miniconda](https://conda.io/en/latest/miniconda.html)** - é uma instalação bastante leve que suporta o gerenciador de pacotes `conda` para diferentes **ambientes virtuais** Python. +Para executar o código localmente no seu computador, é necessária a instalação do Python. Uma recomendação é instalar o **[miniconda](https://conda.io/en/latest/miniconda.html)** - é uma instalação bastante leve que suporta o gerenciador de pacotes `conda` para diferentes **ambientes virtuais** de Python. -Depois de instalar o miniconda, clone o repositório e crie um ambiente virtual para ser usado neste curso: +Após instalar o miniconda, clone o repositório e crie um ambiente virtual para ser usado neste curso: ```bash git clone http://github.com/microsoft/ai-for-beginners @@ -17,55 +17,55 @@ conda activate ai4beg ### Usando Visual Studio Code com Extensão Python -Este currículo é melhor utilizado ao abri-lo no [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) com a [Extensão Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste). +Este currículo é melhor utilizado quando aberto no [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) com a [Extensão Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste). -> **Nota**: Após clonar e abrir o diretório no VS Code, ele automaticamente sugerirá a instalação das extensões Python. Você também precisará instalar o miniconda conforme descrito acima. +> **Nota**: Uma vez que você clona e abre o diretório no VS Code, ele automaticamente sugerirá a instalação das extensões Python. Você também deverá instalar o miniconda conforme descrito acima. -> **Nota**: Se o VS Code sugerir reabrir o repositório em um contêiner, você deve recusar para usar a instalação local do Python. +> **Nota**: Se o VS Code sugerir que você reabra o repositório em um container, você deve recusar para usar a instalação local do Python. ### Usando Jupyter no Navegador -Você também pode usar um ambiente Jupyter pelo navegador em seu próprio computador. Tanto o Jupyter clássico quanto o JupyterHub fornecem um ambiente de desenvolvimento conveniente com auto-completar, realce de código, etc. +Você também pode usar um ambiente Jupyter a partir do navegador no seu próprio computador. Tanto o Jupyter clássico quanto o JupyterHub oferecem um ambiente de desenvolvimento conveniente com autocompletar, realce de código, etc. -Para iniciar o Jupyter localmente, vá para o diretório do curso e execute: +Para iniciar o Jupyter localmente, vá ao diretório do curso e execute: ```bash jupyter notebook ``` -ou + ou ```bash jupyterhub ``` -Depois você pode navegar para qualquer arquivo `.ipynb`, abri-lo e começar a trabalhar. + Você então pode navegar até qualquer um dos arquivos `.ipynb`, abri-los e começar a trabalhar. -### Executando em contêiner +### Executando em container -Uma alternativa à instalação do Python seria executar o código em um contêiner. Como nosso repositório fornece uma pasta especial `.devcontainer` que instrui como construir um contêiner para este repositório, o VS Code oferece a oportunidade de reabrir o código em um contêiner. Isso requer a instalação do Docker, e também seria mais complexo, então recomendamos isso para usuários mais experientes. +Uma alternativa à instalação do Python é executar o código em um container. Como nosso repositório fornece uma pasta especial `.devcontainer` que indica como construir um container para este repositório, o VS Code oferece a oportunidade de reabrir o código em um container. Isso exigirá a instalação do Docker e será mais complexo, por isso recomendamos para usuários mais experientes. ## Executando na Nuvem -Se você não quiser instalar o Python localmente e tiver acesso a alguns recursos na nuvem - uma boa alternativa seria executar o código na nuvem. Existem várias formas de fazer isso: +Se você não quiser instalar o Python localmente e tiver acesso a alguns recursos na nuvem, uma boa alternativa é executar o código na nuvem. Há várias maneiras de fazer isso: -* Usando **[GitHub Codespaces](https://github.com/features/codespaces)**, que é um ambiente virtual criado para você no GitHub, acessível através da interface do navegador do VS Code. Se você tem acesso ao Codespaces, basta clicar no botão **Code** no repositório, iniciar um codespace e começar a trabalhar rapidamente. -* Usando **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) oferece recursos computacionais gratuitos na nuvem para pessoas como você testarem algum código no GitHub. Há um botão na página principal para abrir o repositório no Binder - isso deve levá-lo rapidamente ao site do binder, que construirá um contêiner subjacente e iniciará uma interface web Jupyter para você de forma transparente. +* Usando **[GitHub Codespaces](https://github.com/features/codespaces)**, que é um ambiente virtual criado para você no GitHub, acessível através da interface do VS Code no navegador. Se você tiver acesso ao Codespaces, basta clicar no botão **Code** no repositório, iniciar um codespace e começar rapidamente. +* Usando **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. O [Binder](https://mybinder.org) oferece recursos computacionais gratuitos fornecidos na nuvem para pessoas como você testarem algum código no GitHub. Há um botão na página inicial para abrir o repositório no Binder - isso deve levá-lo rapidamente ao site do binder, que construirá um container subjacente e iniciará uma interface web Jupyter para você sem dificuldades. -> **Nota**: Para evitar uso indevido, o Binder tem acesso a alguns recursos web bloqueado. Isso pode impedir o funcionamento de algum código que busca modelos e/ou conjuntos de dados na internet pública. Você pode precisar encontrar algumas soluções alternativas. Além disso, os recursos computacionais oferecidos pelo Binder são bastante básicos, então o treinamento será lento, especialmente em aulas mais complexas. +> **Nota**: Para evitar uso indevido, o Binder bloqueia o acesso a alguns recursos da web. Isso pode impedir que parte do código funcione, especialmente aqueles que buscam modelos e/ou conjuntos de dados da Internet pública. Você pode precisar encontrar algumas soluções alternativas. Além disso, os recursos de computação fornecidos pelo Binder são bastante básicos, então o treinamento será lento, especialmente em aulas mais avançadas e complexas. ## Executando na Nuvem com GPU -Algumas das aulas posteriores deste currículo se beneficiariam muito do suporte a GPU. O treinamento de modelos, por exemplo, pode ser dolorosamente lento sem isso. Existem algumas opções que você pode seguir, especialmente se tiver acesso à nuvem pela [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) ou pela sua instituição: +Algumas das aulas mais avançadas deste currículo se beneficiariam muito do suporte a GPU. O treinamento de modelos, por exemplo, pode ser extremamente lento sem isso. Há algumas opções que você pode seguir, especialmente se você tiver acesso à nuvem por meio do [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) ou através da sua instituição: -* Crie uma [Máquina Virtual de Ciência de Dados](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) e conecte-se a ela via Jupyter. Você pode então clonar o repositório diretamente na máquina e começar a aprender. VMs da série NC têm suporte a GPU. +* Criar uma [Máquina Virtual de Ciência de Dados](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) e conectar a ela através do Jupyter. Você pode então clonar o repositório diretamente na máquina e começar a aprender. Máquinas virtuais da série NC têm suporte a GPU. -> **Nota**: Algumas assinaturas, incluindo Azure for Students, não oferecem suporte a GPU por padrão. Você pode precisar solicitar núcleos GPU adicionais por meio de um pedido de suporte técnico. +> **Nota**: Algumas assinaturas, incluindo o Azure for Students, não fornecem suporte a GPU por padrão. Você pode precisar solicitar núcleos adicionais de GPU através de um pedido de suporte técnico. -* Crie um [Workspace do Azure Machine Learning](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) e use o recurso Notebook nele. [Este vídeo](https://azure-for-academics.github.io/quickstart/azureml-papers/) mostra como clonar um repositório dentro do notebook Azure ML e começar a usar. +* Criar um [Azure Machine Learning Workspace](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) e depois usar o recurso de Notebooks lá. [Este vídeo](https://azure-for-academics.github.io/quickstart/azureml-papers/) mostra como clonar um repositório em um notebook do Azure ML e começar a usá-lo. -Você também pode usar o Google Colab, que oferece algum suporte gratuito a GPU, e fazer upload dos Jupyter Notebooks para executá-los um por um. +Você também pode usar o Google Colab, que oferece algum suporte gratuito a GPU, e fazer upload dos Jupyter Notebooks para executar um por um. --- -**Aviso Legal**: -Este documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automáticas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomendamos a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações incorretas decorrentes do uso desta tradução. +**Aviso Legal**: +Este documento foi traduzido usando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos pela precisão, por favor, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autorizada. Para informações críticas, recomenda-se tradução profissional humana. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações incorretas decorrentes do uso desta tradução. \ No newline at end of file diff --git a/translations/pt-BR/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/pt-BR/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index 35eb192796..65a06e608f 100644 --- a/translations/pt-BR/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/pt-BR/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -6,9 +6,9 @@ "source": [ "# Modelos pré-treinados e aprendizado por transferência\n", "\n", - "Treinar CNNs pode levar muito tempo e exigir uma grande quantidade de dados. No entanto, grande parte do tempo é gasto aprendendo os melhores filtros de baixo nível que uma rede utiliza para extrair padrões de imagens. Surge uma pergunta natural: podemos usar uma rede neural treinada em um conjunto de dados e adaptá-la para classificar imagens diferentes sem passar por todo o processo de treinamento?\n", + "Treinar CNNs pode levar muito tempo, e uma grande quantidade de dados é necessária para essa tarefa. No entanto, grande parte do tempo é gasto aprendendo os melhores filtros de baixo nível que uma rede usa para extrair padrões das imagens. Surge uma pergunta natural - podemos usar uma rede neural treinada em um conjunto de dados e adaptá-la para classificar imagens diferentes sem o processo completo de treinamento?\n", "\n", - "Essa abordagem é chamada de **aprendizado por transferência**, porque transferimos algum conhecimento de um modelo de rede neural para outro. No aprendizado por transferência, normalmente começamos com um modelo pré-treinado, que foi treinado em um grande conjunto de dados de imagens, como o **ImageNet**. Esses modelos já conseguem extrair diferentes características de imagens genéricas de forma eficaz, e em muitos casos, apenas construir um classificador em cima dessas características extraídas pode gerar bons resultados.\n" + "Essa abordagem é chamada de **aprendizado por transferência**, porque transferimos algum conhecimento de um modelo de rede neural para outro. No aprendizado por transferência, normalmente começamos com um modelo pré-treinado, que foi treinado em algum grande conjunto de dados de imagens, como o **ImageNet**. Esses modelos já conseguem extrair diferentes características de imagens genéricas de forma eficaz, e em muitos casos, construir apenas um classificador sobre essas características extraídas pode gerar um bom resultado.\n" ] }, { @@ -29,11 +29,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Conjunto de Dados Cats vs. Dogs\n", + "## Conjunto de Dados Gatos vs. Cachorros\n", "\n", - "Nesta unidade, vamos resolver um problema real de classificação de imagens de gatos e cachorros. Para isso, utilizaremos o [Conjunto de Dados Cats vs. Dogs do Kaggle](https://www.kaggle.com/c/dogs-vs-cats), que também pode ser baixado [da Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n", + "Nesta unidade, resolveremos um problema da vida real de classificar imagens de gatos e cachorros. Por essa razão, usaremos o [Conjunto de Dados Gatos vs. Cachorros do Kaggle](https://www.kaggle.com/c/dogs-vs-cats), que também pode ser baixado [pela Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n", "\n", - "Vamos baixar este conjunto de dados e extraí-lo no diretório `data` (este processo pode levar algum tempo!):\n" + "Vamos baixar esse conjunto de dados e extraí-lo no diretório `data` (esse processo pode levar algum tempo!):\n" ] }, { @@ -64,7 +64,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Infelizmente, há alguns arquivos de imagem corrompidos no conjunto de dados. Precisamos fazer uma limpeza rápida para verificar os arquivos corrompidos. Para não sobrecarregar este tutorial, movemos o código para verificar o conjunto de dados para um módulo.\n" + "Infelizmente, há alguns arquivos de imagem corrompidos no conjunto de dados. Precisamos fazer uma limpeza rápida para verificar arquivos corrompidos. Para não sobrecarregar este tutorial, movemos o código para verificar o conjunto de dados para um módulo.\n" ] }, { @@ -335,11 +335,11 @@ "source": [ "## Carregando o Conjunto de Dados\n", "\n", - "Nos exemplos anteriores, estávamos carregando conjuntos de dados que já vêm integrados ao Keras. Agora, vamos trabalhar com nosso próprio conjunto de dados, que precisamos carregar a partir de um diretório de imagens.\n", + "Nos exemplos anteriores, estávamos carregando conjuntos de dados que já vêm embutidos no Keras. Agora, vamos lidar com nosso próprio conjunto de dados, que precisamos carregar a partir de um diretório de imagens.\n", "\n", - "Na prática, o tamanho dos conjuntos de dados de imagens pode ser bastante grande, e não é possível contar com a capacidade de toda a informação caber na memória. Por isso, os conjuntos de dados geralmente são representados como **geradores**, que podem retornar dados em minibatches adequados para o treinamento.\n", + "Na vida real, o tamanho dos conjuntos de dados de imagens pode ser bastante grande, e não se pode contar que todos os dados caibam na memória. Assim, os conjuntos de dados geralmente são representados como **geradores** que podem retornar dados em minibatches adequados para treinamento.\n", "\n", - "Para lidar com classificação de imagens, o Keras inclui a função especial `image_dataset_from_directory`, que pode carregar imagens de subdiretórios correspondentes a diferentes classes. Essa função também cuida do escalonamento das imagens e pode dividir o conjunto de dados em subconjuntos de treino e teste:\n" + "Para lidar com a classificação de imagens, o Keras inclui a função especial `image_dataset_from_directory`, que pode carregar imagens de subdiretórios correspondentes a diferentes classes. Essa função também cuida da escala das imagens, e pode também dividir o conjunto de dados em subconjuntos de treino e teste:\n" ] }, { @@ -383,9 +383,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "É importante definir o mesmo valor de `seed` para ambas as chamadas, pois isso afeta a divisão das imagens entre os conjuntos de treino e teste.\n", + "É importante definir o mesmo valor de `seed` para ambas as chamadas, pois isso afeta a divisão das imagens entre o conjunto de dados de treinamento e de teste.\n", "\n", - "O dataset identifica automaticamente os nomes das classes a partir dos diretórios, e você pode acessá-los, se necessário, chamando:\n" + "O Dataset pega automaticamente os nomes das classes a partir dos diretórios, e você pode acessá-los se necessário chamando:\n" ] }, { @@ -412,7 +412,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Os conjuntos de dados que obtivemos podem ser passados diretamente para a função `fit` para treinar o modelo. Eles contêm tanto as imagens correspondentes quanto os rótulos, que podem ser iterados usando a seguinte construção:\n" + "Conjuntos de dados que obtivemos podem ser passados diretamente para a função `fit` para treinar o modelo. Eles contêm tanto as imagens correspondentes quanto os rótulos, que podem ser percorridos usando a seguinte construção:\n" ] }, { @@ -453,7 +453,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "> **Nota**: Todas as imagens no conjunto de dados são representadas como tensores de ponto flutuante com intervalo de 0-255. Antes de passá-las para a rede neural, precisamos escalar esses valores para o intervalo de 0-1. Ao plotar imagens, precisamos fazer o mesmo ou converter os valores para o tipo `int` (o que fazemos no código acima), para mostrar ao `matplotlib` que queremos plotar a imagem original não escalada.\n" + "> **Nota**: Todas as imagens no conjunto de dados são representadas como tensores de ponto flutuante com faixa de 0-255. Antes de passá-las para a rede neural, precisamos escalar esses valores para a faixa de 0-1. Ao plotar imagens, precisamos fazer o mesmo, ou converter os valores para o tipo `int` (como fazemos no código acima), para mostrar ao `matplotlib` que queremos plotar a imagem original não escalada.\n" ] }, { @@ -462,7 +462,7 @@ "source": [ "## Modelos pré-treinados\n", "\n", - "Para muitas tarefas de classificação de imagens, é possível encontrar modelos de redes neurais pré-treinados. Muitos desses modelos estão disponíveis no namespace `keras.applications`, e ainda mais modelos podem ser encontrados na Internet. Vamos ver como o modelo mais simples, o VGG-16, pode ser carregado e utilizado:\n" + "Para muitas tarefas de classificação de imagens, é possível encontrar modelos de redes neurais pré-treinados. Muitos desses modelos estão disponíveis dentro do namespace `keras.applications`, e ainda mais modelos podem ser encontrados na Internet. Vamos ver como o modelo mais simples, VGG-16, pode ser carregado e utilizado:\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": [ "Há algumas coisas importantes aqui:\n", - "* Antes de passar uma entrada para qualquer rede pré-treinada, ela precisa ser pré-processada de uma maneira específica. Isso é feito chamando a função correspondente `preprocess_input`, que recebe um lote de imagens e retorna sua forma processada. No caso do VGG-16, as imagens são normalizadas, e um valor médio pré-definido para cada canal é subtraído. Isso ocorre porque o VGG-16 foi originalmente treinado com esse pré-processamento.\n", - "* A rede neural é aplicada ao lote de entrada, e recebemos como resultado um lote de tensores de 1000 elementos que mostram a probabilidade de cada classe. Podemos encontrar o número da classe mais provável chamando `argmax` nesse tensor.\n", - "* O resultado obtido é um [número de uma classe do `ImageNet`](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Para interpretar esse resultado, também podemos usar a função `decode_predictions`, que retorna as n classes principais junto com seus nomes.\n" + "* Antes de passar uma entrada para qualquer rede pré-treinada, ela precisa ser pré-processada de uma certa forma. Isso é feito chamando a função correspondente `preprocess_input`, que recebe um lote de imagens e retorna sua forma processada. No caso do VGG-16, as imagens são normalizadas, e um valor médio pré-definido para cada canal é subtraído. Isso porque o VGG-16 foi originalmente treinado com esse pré-processamento.\n", + "* A rede neural é aplicada ao lote de entrada, e recebemos como resultado um lote de tensores de 1000 elementos que mostram a probabilidade de cada classe. Podemos encontrar o número da classe mais provável chamando `argmax` neste tensor.\n", + "* O resultado obtido é um [número de uma classe do `ImageNet`](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Para fazer sentido desse resultado, também podemos usar a função `decode_predictions`, que retorna as n principais classes juntamente com seus nomes.\n" ] }, { @@ -599,7 +609,7 @@ "source": [ "## Computações em GPU\n", "\n", - "Redes neurais profundas, como a VGG-16 e outras arquiteturas mais modernas, exigem bastante poder computacional para serem executadas. Faz sentido utilizar aceleração por GPU, se estiver disponível. Felizmente, o Keras acelera automaticamente as computações na GPU, caso ela esteja disponível. Podemos verificar se o Tensorflow consegue usar a GPU com o seguinte código:\n" + "Redes neurais profundas, como a VGG-16 e outras arquiteturas mais modernas, exigem bastante poder computacional para executar. Faz sentido usar aceleração por GPU, se estiver disponível. Felizmente, o Keras acelera automaticamente os cálculos na GPU se ela estiver disponível. Podemos verificar se o Tensorflow é capaz de usar a GPU usando o seguinte código:\n" ] }, { @@ -626,9 +636,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Extraindo características do VGG\n", "\n", - "Se quisermos usar o VGG-16 para extrair características de nossas imagens, precisamos do modelo sem as camadas finais de classificação. Podemos instanciar o modelo VGG-16 sem as camadas superiores usando este código:\n" + "## Extraindo características VGG\n", + "\n", + "Se quisermos usar o VGG-16 para extrair características das nossas imagens, precisamos do modelo sem as camadas finais de classificação. Podemos instanciar o modelo VGG-16 sem as camadas superiores usando este código:\n" ] }, { @@ -680,9 +691,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "A dimensão do tensor de características é 7x7x512, mas, para visualizá-lo, tivemos que remodelá-lo para uma forma 2D.\n", + "A dimensão do tensor de características é 7x7x512, mas para visualizá-la tivemos que remodelá-la para a forma 2D.\n", "\n", - "Agora, vamos tentar verificar se essas características podem ser usadas para classificar imagens. Vamos selecionar manualmente uma parte das imagens (50 minibatches, no nosso caso) e pré-computar seus vetores de características. Podemos usar a API **dataset** do Tensorflow para isso. A função `map` pega um conjunto de dados e aplica uma lambda-function fornecida para transformá-lo. Usamos esse mecanismo para construir novos conjuntos de dados, `ds_features_train` e `ds_features_test`, que contêm as características extraídas pelo VGG em vez das imagens originais.\n" + "Agora vamos tentar ver se essas características podem ser usadas para classificar imagens. Vamos manualmente pegar uma parte das imagens (50 minibatches, no nosso caso), e pré-calcular seus vetores de características. Podemos usar a API **dataset** do Tensorflow para isso. A função `map` pega um conjunto de dados e aplica uma função lambda dada para transformá-lo. Usamos esse mecanismo para construir novos conjuntos de dados, `ds_features_train` e `ds_features_test`, que contêm características extraídas do VGG em vez das imagens originais.\n" ] }, { @@ -712,9 +723,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Usamos a construção `.take(50)` para limitar o tamanho do conjunto de dados, a fim de acelerar nossa demonstração. Você pode, é claro, realizar este experimento no conjunto de dados completo.\n", + "Usamos a construção `.take(50)` para limitar o tamanho do conjunto de dados, para acelerar nossa demonstração. Você pode, claro, realizar este experimento no conjunto de dados completo.\n", "\n", - "Agora que temos um conjunto de dados com características extraídas, podemos treinar um classificador denso simples para distinguir entre gatos e cachorros. Esta rede receberá um vetor de características com formato (7,7,512) e produzirá uma saída que corresponde a um cachorro ou a um gato. Como se trata de uma classificação binária, usamos a função de ativação `sigmoid` e a perda `binary_crossentropy`.\n" + "Agora que temos um conjunto de dados com recursos extraídos, podemos treinar um classificador denso simples para distinguir entre gatos e cachorros. Esta rede receberá um vetor de recursos com formato (7,7,512) e produzirá uma saída que corresponde a um cachorro ou a um gato. Por se tratar de uma classificação binária, usamos a função de ativação `sigmoid` e a perda `binary_crossentropy`.\n" ] }, { @@ -743,13 +754,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "O resultado é ótimo, conseguimos distinguir entre um gato e um cachorro com quase 95% de probabilidade! No entanto, testamos essa abordagem apenas em um subconjunto de todas as imagens, porque a extração manual de características parece levar muito tempo.\n", + "O resultado é ótimo, podemos distinguir entre um gato e um cachorro com quase 95% de probabilidade! No entanto, testamos essa abordagem apenas em um subconjunto de todas as imagens, porque a extração manual de características parece levar muito tempo.\n", "\n", - "## Transferência de aprendizado usando uma rede VGG\n", + "## Aprendizado por transferência usando uma rede VGG\n", "\n", - "Também podemos evitar o pré-cálculo manual das características utilizando a rede original VGG-16 como um todo durante o treinamento, adicionando o extrator de características à nossa rede como a primeira camada.\n", + "Também podemos evitar pré-calcular manualmente as características usando a rede VGG-16 original como um todo durante o treinamento, adicionando o extrator de características à nossa rede como a primeira camada.\n", "\n", - "A beleza da arquitetura do Keras é que o modelo VGG-16 que definimos acima também pode ser usado como uma camada em outra rede neural! Só precisamos construir uma rede com um classificador denso no topo dela e, em seguida, treinar toda a rede usando retropropagação.\n" + "A beleza da arquitetura Keras é que o modelo VGG-16 que definimos acima também pode ser usado como uma camada em outra rede neural! Só precisamos construir uma rede com um classificador denso em cima dela, e então treinar toda a rede usando retropropagação.\n" ] }, { @@ -793,13 +804,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Este modelo parece uma rede de classificação de ponta a ponta, que recebe uma imagem e retorna a classe. No entanto, o desafio aqui é que queremos que o VGG16 atue como um extrator de características, e não seja re-treinado. Portanto, precisamos **congelar os pesos do extrator de características convolucional**. Podemos acessar a primeira camada da rede chamando `model.layers[0]`, e só precisamos definir a propriedade `trainable` como `False`.\n", + "Este modelo se parece com uma rede de classificação de ponta a ponta, que recebe uma imagem e retorna a classe. No entanto, o complicado é que queremos que o VGG16 atue como um extrator de características, e não seja re-treinado. Assim, precisamos **congelar os pesos do extrator de características convolucionais**. Podemos acessar a primeira camada da rede chamando `model.layers[0]`, e só precisamos definir a propriedade `trainable` como `False`.\n", "\n", - "> **Nota**: O congelamento dos pesos do extrator de características é necessário, porque, caso contrário, a camada de classificação não treinada pode destruir os pesos originais pré-treinados do extrator convolucional.\n", + "> **Nota**: O congelamento dos pesos do extrator de características é necessário, porque caso contrário a camada de classificador não treinada pode destruir os pesos pré-treinados originais do extrator convolucional.\n", "\n", - "Você pode notar que, embora o número total de parâmetros na nossa rede seja em torno de 15 milhões, estamos treinando apenas 25 mil parâmetros. Todos os outros parâmetros dos filtros convolucionais de alto nível já estão pré-treinados. Isso é bom, porque conseguimos ajustar um número menor de parâmetros com um número menor de exemplos.\n", + "Você pode notar que, enquanto o número total de parâmetros em nossa rede é de cerca de 15 milhões, estamos treinando apenas 25 mil parâmetros. Todos os outros parâmetros dos filtros convolucionais de nível superior são pré-treinados. Isso é bom, pois podemos ajustar um número menor de parâmetros com uma quantidade menor de exemplos.\n", "\n", - "Agora vamos treinar nossa rede e ver quão boa ela pode ficar. Espere um tempo de execução relativamente longo e não se preocupe se a execução parecer travada por algum tempo.\n" + "Agora vamos treinar nossa rede e ver o quão bom podemos chegar. Espere um tempo de execução relativamente longo, e não se preocupe se a execução parecer congelada por algum tempo.\n" ] }, { @@ -824,11 +835,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Parece que conseguimos um classificador de gatos vs. cachorros razoavelmente preciso!\n", + "Parece que conseguimos um classificador razoavelmente preciso para gatos vs. cães! \n", "\n", "## Salvando e Carregando o Modelo\n", "\n", - "Depois de treinar o modelo, podemos salvar a arquitetura do modelo e os pesos treinados em um arquivo para uso futuro:\n" + "Uma vez que treinamos o modelo, podemos salvar a arquitetura do modelo e os pesos treinados em um arquivo para uso futuro:\n" ] }, { @@ -852,7 +863,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Podemos então carregar o modelo a partir do arquivo a qualquer momento. Você pode achar isso útil caso o próximo experimento destrua o modelo - assim, você não precisaria começar do zero.\n" + "Podemos então carregar o modelo do arquivo a qualquer momento. Você pode achar isso útil caso o próximo experimento destrua o modelo - você não precisaria recomeçar do zero.\n" ] }, { @@ -868,15 +879,15 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Ajustando o aprendizado por transferência\n", + "## Transfer learning com fine-tuning\n", "\n", - "Na seção anterior, treinamos a camada final do classificador para classificar imagens em nosso próprio conjunto de dados. No entanto, não re-treinamos o extrator de características, e nosso modelo se baseou nas características que ele aprendeu com os dados do ImageNet. Se os seus objetos diferem visualmente das imagens comuns do ImageNet, essa combinação de características pode não funcionar da melhor forma. Por isso, faz sentido começar a treinar também as camadas convolucionais.\n", + "Na seção anterior, treinamos a camada final do classificador para classificar imagens em nosso próprio conjunto de dados. No entanto, não re-treinamos o extrator de características, e nosso modelo contou com as características que o modelo aprendeu nos dados do ImageNet. Se seus objetos forem visualmente diferentes das imagens comuns do ImageNet, essa combinação de características pode não funcionar melhor. Portanto, faz sentido começar a treinar as camadas convolucionais também.\n", "\n", - "Para fazer isso, podemos \"descongelar\" os parâmetros dos filtros convolucionais que havíamos \"congelado\" anteriormente.\n", + "Para isso, podemos descongelar os parâmetros dos filtros convolucionais que havíamos congelado anteriormente.\n", "\n", - "> **Nota:** É importante que você congele os parâmetros primeiro e realize várias épocas de treinamento para estabilizar os pesos na camada de classificação. Se você começar imediatamente a treinar a rede de ponta a ponta com os parâmetros descongelados, erros grandes podem destruir os pesos pré-treinados nas camadas convolucionais.\n", + "> **Nota:** É importante que você congele os parâmetros primeiro e realize várias épocas de treinamento para estabilizar os pesos na camada de classificação. Se você começar a treinar a rede end-to-end com os parâmetros descongelados imediatamente, grandes erros provavelmente destruirão os pesos pré-treinados nas camadas convolucionais.\n", "\n", - "Nosso modelo convolucional VGG-16 está localizado dentro da primeira camada e, por si só, consiste em muitas camadas. Podemos dar uma olhada na sua estrutura:\n" + "Nosso modelo convolucional VGG-16 está localizado dentro da primeira camada, e ele próprio consiste em muitas camadas. Podemos dar uma olhada na sua estrutura:\n" ] }, { @@ -944,7 +955,9 @@ { "cell_type": "markdown", "metadata": {}, - "source": [] + "source": [ + "Podemos descongelar todas as camadas da base convolucional:\n" + ] }, { "cell_type": "code", @@ -959,7 +972,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "No entanto, descongelar todos de uma vez não é a melhor ideia. Podemos primeiro descongelar apenas algumas camadas finais de convoluções, porque elas contêm padrões de nível mais alto que são relevantes para nossas imagens. Por exemplo, para começar, podemos congelar todas as camadas, exceto as últimas 4:\n" + "No entanto, descongelar todos eles de uma vez não é a melhor ideia. Podemos primeiro descongelar apenas algumas das últimas camadas de convolução, porque elas contêm padrões de nível mais alto que são relevantes para nossas imagens. Por exemplo, para começar, podemos congelar todas as camadas, exceto as últimas 4:\n" ] }, { @@ -1000,9 +1013,9 @@ "source": [ "Observe que o número de parâmetros treináveis aumentou significativamente, mas ainda está em torno de 50% de todos os parâmetros.\n", "\n", - "Após descongelar, podemos realizar mais algumas épocas de treinamento (em nosso exemplo, faremos apenas uma). Você também pode selecionar uma taxa de aprendizado menor para minimizar o impacto nos pesos pré-treinados. No entanto, mesmo com uma taxa de aprendizado baixa, é esperado que a precisão caia no início do treinamento, até finalmente alcançar um nível ligeiramente superior em comparação ao caso de pesos fixos.\n", + "Após descongelar, podemos fazer mais algumas épocas de treinamento (no nosso exemplo, faremos apenas uma). Você também pode selecionar uma taxa de aprendizado menor, para minimizar o impacto nos pesos pré-treinados. No entanto, mesmo com taxa de aprendizado baixa, você pode esperar que a precisão caia no início do treinamento, até finalmente atingir um nível ligeiramente mais alto do que no caso de pesos fixos.\n", "\n", - "> **Note:** Este treinamento ocorre muito mais lentamente, porque precisamos propagar os gradientes de volta através de muitas camadas da rede!\n" + "> **Nota:** Este treinamento acontece muito mais devagar, porque precisamos propagar os gradientes de volta por muitas camadas da rede!\n" ] }, { @@ -1026,9 +1039,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "É provável que alcancemos uma maior precisão no treinamento, porque estamos usando uma rede mais poderosa com mais parâmetros, mas a precisão na validação não aumentará tanto.\n", + "Provavelmente alcançaremos uma precisão de treinamento mais alta, porque estamos usando uma rede mais potente com mais parâmetros, mas a precisão de validação não aumentaria tanto.\n", "\n", - "Sinta-se à vontade para desbloquear mais algumas camadas da rede e treinar mais, para ver se consegue alcançar uma precisão maior!\n" + "Sinta-se à vontade para descongelar mais algumas camadas da rede e treinar mais, para ver se você consegue alcançar uma precisão maior!\n" ] }, { @@ -1037,7 +1050,7 @@ "source": [ "## Outros modelos de visão computacional\n", "\n", - "O VGG-16 é uma das arquiteturas mais simples de visão computacional. O Keras oferece muitas outras redes pré-treinadas. As mais frequentemente utilizadas entre elas são as arquiteturas **ResNet**, desenvolvidas pela Microsoft, e **Inception**, do Google. Por exemplo, vamos explorar a arquitetura do modelo ResNet-50 mais simples (ResNet é uma família de modelos com diferentes profundidades; você pode experimentar com o ResNet-152 se quiser ver como é um modelo realmente profundo):\n" + "VGG-16 é uma das arquiteturas de visão computacional mais simples. O Keras fornece muitas outras redes pré-treinadas. As mais usadas entre elas são as arquiteturas **ResNet**, desenvolvidas pela Microsoft, e **Inception**, do Google. Por exemplo, vamos explorar a arquitetura do modelo ResNet-50 mais simples (ResNet é uma família de modelos com diferentes profundidades, você pode experimentar o ResNet-152 se quiser ver como é um modelo realmente profundo):\n" ] }, { @@ -1439,11 +1452,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Como você pode ver, o modelo contém os mesmos blocos familiares: camadas convolucionais, camadas de pooling e um classificador denso final. Podemos usar este modelo exatamente da mesma maneira que temos usado o VGG-16 para aprendizado por transferência. Você pode experimentar com o código acima, utilizando diferentes modelos ResNet como modelo base, e observar como a precisão muda.\n", + "Como você pode ver, o modelo contém os mesmos blocos familiares: camadas convolucionais, camadas de pooling e o classificador denso final. Podemos usar este modelo exatamente da mesma forma que temos usado o VGG-16 para aprendizado por transferência. Você pode tentar experimentar com o código acima, usando diferentes modelos ResNet como o modelo base, e ver como a precisão muda.\n", "\n", - "## Normalização de Lote\n", + "## Normalização em Lote\n", "\n", - "Esta rede contém mais um tipo de camada: **Normalização de Lote**. A ideia da normalização de lote é trazer os valores que fluem pela rede neural para o intervalo correto. Geralmente, redes neurais funcionam melhor quando todos os valores estão na faixa de [-1,1] ou [0,1], e é por isso que escalamos/normalizamos nossos dados de entrada de forma correspondente. No entanto, durante o treinamento de uma rede profunda, pode acontecer de os valores ficarem significativamente fora dessa faixa, o que torna o treinamento problemático. A camada de normalização de lote calcula a média e o desvio padrão para todos os valores do minibatch atual e os utiliza para normalizar o sinal antes de passá-lo por uma camada da rede neural. Isso melhora significativamente a estabilidade de redes profundas.\n" + "Esta rede contém ainda outro tipo de camada: **Normalização em Lote**. A ideia da normalização em lote é trazer os valores que fluem pela rede neural para o intervalo correto. Normalmente, redes neurais funcionam melhor quando todos os valores estão no intervalo de [-1,1] ou [0,1], e essa é a razão pela qual escalamos/normalizamos nossos dados de entrada de acordo. No entanto, durante o treinamento de uma rede profunda, pode acontecer de os valores saírem significativamente desse intervalo, o que torna o treinamento problemático. A camada de normalização em lote calcula a média e o desvio padrão para todos os valores do minibatch atual, e os usa para normalizar o sinal antes de passá-lo pela camada da rede neural. Isso melhora significativamente a estabilidade das redes profundas.\n" ] }, { @@ -1452,16 +1465,16 @@ "source": [ "## Conclusão\n", "\n", - "Utilizando aprendizado por transferência, conseguimos montar rapidamente um classificador para nossa tarefa personalizada de classificação de objetos e alcançar alta precisão. No entanto, este exemplo não foi completamente justo, pois a rede original VGG-16 foi pré-treinada para reconhecer gatos e cachorros, e, assim, estávamos apenas reutilizando a maioria dos padrões que já estavam presentes na rede. Você pode esperar uma precisão menor em objetos mais exóticos e específicos de domínio, como detalhes em uma linha de produção em uma fábrica ou diferentes tipos de folhas de árvores.\n", + "Usando aprendizado por transferência, conseguimos montar rapidamente um classificador para nossa tarefa personalizada de classificação de objetos e alcançar alta precisão. No entanto, este exemplo não foi completamente justo, pois a rede VGG-16 original foi pré-treinada para reconhecer gatos e cachorros, e assim estávamos apenas reutilizando a maioria dos padrões que já estavam presentes na rede. Você pode esperar uma precisão menor para objetos mais exóticos e específicos de domínio, como detalhes na linha de produção de uma fábrica ou diferentes folhas de árvores.\n", "\n", - "Você pode perceber que tarefas mais complexas que estamos resolvendo agora exigem maior poder computacional e não podem ser facilmente resolvidas no CPU. Na próxima unidade, tentaremos usar uma implementação mais leve para treinar o mesmo modelo utilizando menos recursos computacionais, o que resulta em uma precisão apenas ligeiramente menor.\n" + "Pode-se notar que tarefas mais complexas que estamos resolvendo agora exigem maior poder computacional e não podem ser facilmente resolvidas na CPU. Na próxima unidade, vamos tentar usar uma implementação mais leve para treinar o mesmo modelo usando recursos computacionais menores, o que resultará em uma precisão apenas ligeiramente inferior.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**Aviso Legal**: \nEste documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução.\n" + "---\n\n\n**Aviso Legal**:\nEste documento foi traduzido usando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos pela precisão, por favor, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autorizada. Para informações críticas, recomenda-se tradução profissional humana. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações incorretas decorrentes do uso desta tradução.\n\n" ] } ], @@ -1482,12 +1495,6 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" - }, - "coopTranslator": { - "original_hash": "c189abc107848f96051085cc30945129", - "translation_date": "2025-08-28T13:03:25+00:00", - "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", - "language_code": "br" } }, "nbformat": 4, diff --git a/translations/pt-BR/lessons/5-NLP/README.md b/translations/pt-BR/lessons/5-NLP/README.md index 079d6144e3..35f5d692c5 100644 --- a/translations/pt-BR/lessons/5-NLP/README.md +++ b/translations/pt-BR/lessons/5-NLP/README.md @@ -1,34 +1,34 @@ # Processamento de Linguagem Natural -![Resumo das tarefas de PLN em um desenho](../../../../translated_images/pt-BR/ai-nlp.b22dcb8ca4707cea.webp) +![Resumo das tarefas de PLN em um rabisco](../../../../translated_images/pt-BR/ai-nlp.b22dcb8ca4707cea.webp) -Nesta seção, vamos focar no uso de Redes Neurais para lidar com tarefas relacionadas ao **Processamento de Linguagem Natural (PLN)**. Existem muitos problemas de PLN que queremos que os computadores sejam capazes de resolver: +Nesta seção, iremos focar no uso de Redes Neurais para lidar com tarefas relacionadas a **Processamento de Linguagem Natural (PLN)**. Existem muitos problemas de PLN que queremos que os computadores consigam resolver: -* **Classificação de texto** é um problema típico de classificação relacionado a sequências de texto. Exemplos incluem classificar mensagens de e-mail como spam ou não-spam, ou categorizar artigos como esportes, negócios, política, etc. Além disso, ao desenvolver chatbots, frequentemente precisamos entender o que o usuário quis dizer — nesse caso, estamos lidando com **classificação de intenção**. Muitas vezes, na classificação de intenção, precisamos lidar com muitas categorias. -* **Análise de sentimento** é um problema típico de regressão, onde precisamos atribuir um número (um sentimento) correspondente ao quão positivo/negativo é o significado de uma frase. Uma versão mais avançada da análise de sentimento é a **análise de sentimento baseada em aspectos** (ABSA), onde atribuímos o sentimento não à frase inteira, mas a diferentes partes dela (aspectos), por exemplo: *Neste restaurante, gostei da culinária, mas a atmosfera era horrível*. -* **Reconhecimento de Entidades Nomeadas** (NER) refere-se ao problema de extrair certas entidades de um texto. Por exemplo, podemos precisar entender que na frase *Preciso voar para Paris amanhã* a palavra *amanhã* refere-se a uma DATA, e *Paris* é um LOCAL. -* **Extração de palavras-chave** é semelhante ao NER, mas precisamos extrair palavras importantes para o significado da frase automaticamente, sem pré-treinamento para tipos específicos de entidades. -* **Agrupamento de texto** pode ser útil quando queremos agrupar frases semelhantes, por exemplo, solicitações similares em conversas de suporte técnico. -* **Resposta a perguntas** refere-se à capacidade de um modelo de responder a uma pergunta específica. O modelo recebe um trecho de texto e uma pergunta como entradas, e precisa fornecer um local no texto onde a resposta à pergunta está contida (ou, às vezes, gerar o texto da resposta). -* **Geração de texto** é a capacidade de um modelo de gerar novo texto. Pode ser considerado como uma tarefa de classificação que prevê a próxima letra/palavra com base em algum *texto inicial*. Modelos avançados de geração de texto, como o GPT-3, são capazes de resolver outras tarefas de PLN usando uma técnica chamada [programação de prompts](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) ou [engenharia de prompts](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29). -* **Resumo de texto** é uma técnica em que queremos que um computador "leia" um texto longo e o resuma em algumas frases. -* **Tradução automática** pode ser vista como uma combinação de compreensão de texto em um idioma e geração de texto em outro. +* **Classificação de texto** é um problema típico de classificação relacionado a sequências de texto. Exemplos incluem classificar mensagens de e-mail como spam vs. não-spam, ou categorizar artigos como esporte, negócios, política, etc. Além disso, ao desenvolver chatbots, frequentemente precisamos entender o que o usuário quis dizer – nesse caso, estamos lidando com **classificação de intenção**. Muitas vezes, na classificação de intenção, precisamos lidar com muitas categorias. +* **Análise de sentimento** é um problema típico de regressão, onde precisamos atribuir um número (um sentimento) correspondente a quão positivo/negativo é o significado de uma frase. Uma versão mais avançada da análise de sentimento é a **análise de sentimento baseada em aspectos** (ABSA), onde atribuímos sentimento não à frase inteira, mas a diferentes partes dela (aspectos), por exemplo, *Neste restaurante, gostei da culinária, mas a atmosfera estava horrível*. +* **Reconhecimento de Entidades Nomeadas** (NER) refere-se ao problema de extrair certas entidades de um texto. Por exemplo, pode ser necessário entender que na frase *Preciso voar para Paris amanhã* a palavra *amanhã* refere-se a DATA, e *Paris* é um LOCAL. +* **Extração de palavras-chave** é semelhante ao NER, mas precisamos extrair automaticamente palavras importantes para o significado da frase, sem treinamento prévio para tipos específicos de entidades. +* **Agrupamento de texto** pode ser útil quando queremos agrupar frases similares, por exemplo, pedidos semelhantes em conversas de suporte técnico. +* **Resposta a perguntas** refere-se à capacidade de um modelo responder a uma pergunta específica. O modelo recebe um trecho de texto e uma pergunta como entradas, e precisa indicar onde no texto a resposta está contida (ou, às vezes, gerar o texto da resposta). +* **Geração de texto** é a capacidade de um modelo criar novo texto. Pode ser considerado uma tarefa de classificação que prevê a próxima letra/palavra com base em algum *prompt de texto*. Modelos avançados de geração de texto, como o GPT-3, são capazes de resolver outras tarefas de PLN, como classificação, usando uma técnica chamada [programação de prompt](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) ou [engenharia de prompt](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29) +* **Resumir texto** é uma técnica para fazer um computador "ler" textos longos e resumi-los em poucas frases. +* **Tradução automática** pode ser vista como uma combinação de compreensão de texto em um idioma e geração de texto em outro idioma. -Inicialmente, a maioria das tarefas de PLN era resolvida usando métodos tradicionais, como gramáticas. Por exemplo, na tradução automática, analisadores eram usados para transformar a frase inicial em uma árvore sintática, depois estruturas semânticas de nível superior eram extraídas para representar o significado da frase, e com base nesse significado e na gramática do idioma de destino, o resultado era gerado. Hoje em dia, muitas tarefas de PLN são resolvidas de forma mais eficaz usando redes neurais. +Inicialmente, a maioria das tarefas de PLN era resolvida usando métodos tradicionais, como gramáticas. Por exemplo, na tradução automática, analisadores sintáticos eram usados para transformar a frase inicial em uma árvore sintática, depois estruturas semânticas de nível mais alto eram extraídas para representar o significado da frase, e com base nesse significado e na gramática do idioma alvo, o resultado era gerado. Atualmente, muitas tarefas de PLN são resolvidas de forma mais eficaz usando redes neurais. -> Muitos métodos clássicos de PLN estão implementados na biblioteca Python [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org). Há um excelente [Livro do NLTK](https://www.nltk.org/book/) disponível online que cobre como diferentes tarefas de PLN podem ser resolvidas usando o NLTK. +> Muitos métodos clássicos de PLN são implementados na biblioteca Python [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org). Existe um ótimo [Livro NLTK](https://www.nltk.org/book/) disponível online que cobre como diferentes tarefas de PLN podem ser resolvidas usando o NLTK. -Em nosso curso, vamos focar principalmente no uso de Redes Neurais para PLN, e usaremos o NLTK quando necessário. +Em nosso curso, focaremos principalmente no uso de Redes Neurais para PLN, e usaremos o NLTK quando necessário. -Já aprendemos sobre o uso de redes neurais para lidar com dados tabulares e imagens. A principal diferença entre esses tipos de dados e texto é que o texto é uma sequência de comprimento variável, enquanto o tamanho da entrada no caso de imagens é conhecido antecipadamente. Embora redes convolucionais possam extrair padrões de dados de entrada, os padrões em texto são mais complexos. Por exemplo, podemos ter uma negação separada do sujeito por muitas palavras arbitrárias (ex.: *Eu não gosto de laranjas*, vs. *Eu não gosto dessas grandes laranjas coloridas e saborosas*), e isso ainda deve ser interpretado como um único padrão. Assim, para lidar com a linguagem, precisamos introduzir novos tipos de redes neurais, como *redes recorrentes* e *transformers*. +Já aprendemos sobre uso de redes neurais para lidar com dados tabulares e imagens. A principal diferença entre esses tipos de dados e texto é que o texto é uma sequência de comprimento variável, enquanto o tamanho da entrada no caso de imagens é conhecido antecipadamente. Enquanto redes convolucionais podem extrair padrões dos dados de entrada, padrões em texto são mais complexos. Exemplo: podemos ter uma negação separada do sujeito por um número arbitrário de palavras (ex.: *Eu não gosto de laranjas*, vs. *Eu não gosto daquelas laranjas grandes, coloridas e saborosas*), e isso ainda deve ser interpretado como um padrão único. Assim, para lidar com linguagem precisamos introduzir novos tipos de redes neurais, como *redes recorrentes* e *transformers*. ## Instalar Bibliotecas -Se você estiver usando uma instalação local do Python para executar este curso, pode ser necessário instalar todas as bibliotecas necessárias para PLN usando os seguintes comandos: +Se você estiver usando uma instalação local de Python para executar este curso, talvez precise instalar todas as bibliotecas necessárias para PLN usando os seguintes comandos: **Para PyTorch** ```bash -pip install -r requirements-torch.txt +pip install -r requirements-pytorch.txt ``` **Para TensorFlow** ```bash @@ -39,13 +39,13 @@ pip install -r requirements-tf.txt ## Aviso sobre GPU -Nesta seção, em alguns dos exemplos, treinaremos modelos bastante grandes. -* **Use um computador com GPU**: É recomendável executar seus notebooks em um computador com GPU para reduzir o tempo de espera ao trabalhar com modelos grandes. -* **Restrições de memória da GPU**: Executar em uma GPU pode levar a situações em que você fique sem memória da GPU, especialmente ao treinar modelos grandes. -* **Consumo de memória da GPU**: A quantidade de memória da GPU consumida durante o treinamento depende de vários fatores, incluindo o tamanho do minibatch. -* **Minimize o tamanho do minibatch**: Se você encontrar problemas de memória da GPU, considere reduzir o tamanho do minibatch em seu código como uma solução potencial. -* **Liberação de memória da GPU no TensorFlow**: Versões mais antigas do TensorFlow podem não liberar corretamente a memória da GPU ao treinar vários modelos dentro de um único kernel Python. Para gerenciar o uso de memória da GPU de forma eficaz, você pode configurar o TensorFlow para alocar memória da GPU apenas conforme necessário. -* **Inclusão de código**: Para configurar o TensorFlow para aumentar a alocação de memória da GPU apenas quando necessário, inclua o seguinte código em seus notebooks: +Nesta seção, em alguns exemplos, estaremos treinando modelos bastante grandes. +* **Use um Computador com GPU**: É recomendável executar seus notebooks em um computador com GPU para reduzir os tempos de espera ao trabalhar com modelos grandes. +* **Limitações de Memória da GPU**: Executar em GPU pode levar a situações em que a memória da GPU esgote, especialmente ao treinar modelos grandes. +* **Consumo de Memória da GPU**: A quantidade de memória da GPU consumida durante o treinamento depende de vários fatores, incluindo o tamanho do minibatch. +* **Minimize o Tamanho do Minibatch**: Se encontrar problemas de memória na GPU, considere reduzir o tamanho do minibatch no seu código como uma solução possível. +* **Liberação de Memória da GPU no TensorFlow**: Versões antigas do TensorFlow podem não liberar a memória da GPU corretamente ao treinar múltiplos modelos em um mesmo kernel Python. Para gerenciar o uso da memória da GPU de forma eficaz, você pode configurar o TensorFlow para alocar memória na GPU apenas conforme necessário. +* **Inclusão de Código**: Para configurar o TensorFlow para aumentar a alocação de memória da GPU somente quando necessário, inclua o código abaixo em seus 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) ``` -Se você estiver interessado em aprender sobre PLN a partir de uma perspectiva de aprendizado de máquina clássico, visite [esta coleção de lições](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP). +Se você tem interesse em aprender sobre PLN a partir de uma perspectiva clássica de ML, visite [este conjunto de lições](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP) ## Nesta Seção -Nesta seção, aprenderemos sobre: +Nesta seção vamos aprender sobre: -* [Representação de texto como tensores](13-TextRep/README.md) -* [Embeddings de palavras](14-Emdeddings/README.md) -* [Modelagem de linguagem](15-LanguageModeling/README.md) +* [Representando texto como tensores](13-TextRep/README.md) +* [Word Embeddings](14-Emdeddings/README.md) +* [Modelagem de Linguagem](15-LanguageModeling/README.md) * [Redes Neurais Recorrentes](16-RNN/README.md) * [Redes Generativas](17-GenerativeNetworks/README.md) * [Transformers](18-Transformers/README.md) -**Aviso Legal**: -Este documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução. \ No newline at end of file +--- + + +**Aviso Legal**: +Este documento foi traduzido usando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos pela precisão, por favor, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autorizada. Para informações críticas, recomenda-se tradução profissional humana. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações incorretas decorrentes do uso desta tradução. + \ No newline at end of file diff --git a/translations/pt-PT/.co-op-translator.json b/translations/pt-PT/.co-op-translator.json index fec9d1502a..ace29aaeeb 100644 --- a/translations/pt-PT/.co-op-translator.json +++ b/translations/pt-PT/.co-op-translator.json @@ -5,6 +5,12 @@ "source_file": "AGENTS.md", "language_code": "pt-PT" }, + "CONTRIBUTING.md": { + "original_hash": "c6fd7e781b67111a90abd166d0ce4aa0", + "translation_date": "2026-07-08T21:15:15+00:00", + "source_file": "CONTRIBUTING.md", + "language_code": "pt-PT" + }, "README.md": { "original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b", "translation_date": "2026-04-06T21:03:33+00:00", @@ -17,6 +23,19 @@ "source_file": "SECURITY.md", "language_code": "pt-PT" }, + "__translation_failures__": { + "lessons/sketchnotes/LICENSE.md": { + "original_hash": "45ab63a2cd8f5faef6c9b150618837a4", + "source_file": "lessons/sketchnotes/LICENSE.md", + "language_code": "pt-PT", + "failure_date": "2026-07-08T21:04:06+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:08:52+00:00", @@ -54,8 +73,8 @@ "language_code": "pt-PT" }, "examples/README.md": { - "original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7", - "translation_date": "2025-10-03T11:29:51+00:00", + "original_hash": "7883d52c2e2a221e0b07a7b112a149b9", + "translation_date": "2026-07-08T20:58:38+00:00", "source_file": "examples/README.md", "language_code": "pt-PT" }, @@ -66,8 +85,8 @@ "language_code": "pt-PT" }, "lessons/0-course-setup/how-to-run.md": { - "original_hash": "a4717bd9103b9f6cd84d534b83534689", - "translation_date": "2026-01-15T14:10:34+00:00", + "original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1", + "translation_date": "2026-07-08T20:58:59+00:00", "source_file": "lessons/0-course-setup/how-to-run.md", "language_code": "pt-PT" }, @@ -191,6 +210,12 @@ "source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md", "language_code": "pt-PT" }, + "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": { + "original_hash": "99b816b6a4957ef4100cee4c4221dff9", + "translation_date": "2026-07-08T20:54:53+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", + "language_code": "pt-PT" + }, "lessons/4-ComputerVision/08-TransferLearning/lab/README.md": { "original_hash": "7765935c35fcee69b9fe2d0cfd6963e2", "translation_date": "2025-08-24T09:01:39+00:00", @@ -330,8 +355,8 @@ "language_code": "pt-PT" }, "lessons/5-NLP/README.md": { - "original_hash": "8ef02a9318257ea140ed3ed74442096d", - "translation_date": "2025-08-24T08:52:49+00:00", + "original_hash": "038df6f1a73e49f6430740da083bfd6d", + "translation_date": "2026-07-08T20:59:26+00:00", "source_file": "lessons/5-NLP/README.md", "language_code": "pt-PT" }, diff --git a/translations/pt-PT/CONTRIBUTING.md b/translations/pt-PT/CONTRIBUTING.md new file mode 100644 index 0000000000..30c4bf4224 --- /dev/null +++ b/translations/pt-PT/CONTRIBUTING.md @@ -0,0 +1,29 @@ +# Contribuir para AI-For-Beginners + +Obrigado pelo seu interesse em contribuir para o AI-For-Beginners! Agradecemos traduções, correções de lições e correções de formatação. + +## Acordo de Licença de Contribuidor (CLA) da Microsoft + +Este projeto aceita contribuições e sugestões. A maioria das contribuições exige que concorde com um Acordo de Licença de Contribuidor (CLA) declarando que tem o direito, e de facto concede, os direitos para usarmos a sua contribuição. Para mais detalhes, visite [https://cla.microsoft.com](https://cla.microsoft.com). + +Quando submeter um pull request, um bot CLA determinará automaticamente se precisa fornecer uma CLA e decorará o PR de forma adequada (por exemplo, etiqueta, comentário). Simplesmente siga as instruções fornecidas pelo bot. Só precisará fazer isto uma vez em todos os repositórios que utilizam a nossa CLA. + +## Como Contribuir + +### 1. Corrigir Erros Tipográficos / Erros de Código +Se encontrar um erro tipográfico ou bug em qualquer notebook Jupyter ou ficheiro markdown da lição: +1. Faça um fork do repositório. +2. Corrija o erro tipográfico ou link roto. +3. Submeta um Pull Request com uma descrição clara da correção. + +### 2. Submeter Traduções +Aceitamos traduções das lições para outras línguas! Por favor, coloque as traduções na diretoria `translations/` usando as pastas existentes (por exemplo `translations/es/`, `translations/pt-BR/`, `translations/zh-CN/`). + +Para mais detalhes, veja [etc/CONTRIBUTING.md](etc/CONTRIBUTING.md). + +--- + + +**Aviso Legal**: +Este documento foi traduzido utilizando o serviço de tradução automática [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos pela precisão, esteja ciente de que traduções automáticas podem conter erros ou imprecisões. O documento original na sua língua nativa deve ser considerado a fonte autorizada. Para informações críticas, recomenda-se tradução profissional humana. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações incorretas resultantes da utilização desta tradução. + \ No newline at end of file diff --git a/translations/pt-PT/examples/README.md b/translations/pt-PT/examples/README.md index 9c6517e7b6..4ea5cad9af 100644 --- a/translations/pt-PT/examples/README.md +++ b/translations/pt-PT/examples/README.md @@ -1,27 +1,27 @@ # Exemplos de IA para Iniciantes -Bem-vindo! Este diretório contém exemplos simples e independentes para ajudá-lo a começar com IA e aprendizagem automática. Cada exemplo foi projetado para ser acessível a iniciantes, com comentários detalhados e explicações passo a passo. +Bem-vindo! Este diretório contém exemplos simples e autónomos para ajudar a iniciar-se em IA e aprendizagem automática. Cada exemplo foi desenhado para ser acessível a iniciantes, com comentários detalhados e explicações passo a passo. ## 📚 Visão Geral dos Exemplos | Exemplo | Descrição | Dificuldade | Pré-requisitos | |---------|-------------|------------|---------------| -| [Hello AI World](../../../examples/01-hello-ai-world.py) | O seu primeiro programa de IA - reconhecimento de padrões simples | ⭐ Iniciante | Noções básicas de Python | -| [Simple Neural Network](../../../examples/02-simple-neural-network.py) | Construa uma rede neural do zero | ⭐⭐ Iniciante+ | Python, matemática básica | -| [Image Classifier](./03-image-classifier.ipynb) | Classifique imagens com um modelo pré-treinado | ⭐⭐ Iniciante+ | Python, numpy | -| [Text Sentiment](../../../examples/04-text-sentiment.py) | Analise o sentimento de texto (positivo/negativo) | ⭐⭐ Iniciante+ | Python | +| [Hello AI World](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/01-hello-ai-world.py) | O seu primeiro programa de IA - reconhecimento simples de padrões | ⭐ Iniciante | Noções básicas de Python | +| [Simple Neural Network](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/02-simple-neural-network.py) | Construir uma rede neural do zero | ⭐⭐ Iniciante+ | Python, matemática básica | +| [Image Classifier](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/03-image-classifier.ipynb) | Classificar imagens com um modelo pré-treinado | ⭐⭐ Iniciante+ | Python, numpy | +| [Text Sentiment](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/04-text-sentiment.py) | Analisar o sentimento de texto (positivo/negativo) | ⭐⭐ Iniciante+ | Python | -## 🚀 Começando +## 🚀 Começar ### Pré-requisitos -Certifique-se de ter o Python instalado (recomenda-se a versão 3.8 ou superior). Instale os pacotes necessários: +Certifique-se de que tem Python instalado (recomendado 3.8 ou superior). Instale os pacotes necessários: ```bash -# For Python scripts +# Para scripts Python pip install numpy -# For Jupyter notebooks (image classifier) +# Para notebooks Jupyter (classificador de imagens) pip install jupyter numpy pillow tensorflow ``` @@ -32,7 +32,7 @@ conda env create --name ai4beg --file ../environment.yml conda activate ai4beg ``` -### Executando os Exemplos +### Executar os Exemplos **Para scripts Python (.py):** ```bash @@ -44,42 +44,44 @@ python 01-hello-ai-world.py jupyter notebook 03-image-classifier.ipynb ``` -## 📖 Caminho de Aprendizagem +## 📖 Rota de Aprendizagem -Recomendamos seguir os exemplos na ordem: +Recomendamos seguir os exemplos pela ordem: 1. **Comece com "Hello AI World"** - Aprenda o básico sobre reconhecimento de padrões -2. **Construa uma Rede Neural Simples** - Entenda como funcionam as redes neurais +2. **Construa uma Rede Neural Simples** - Compreenda como funcionam as redes neurais 3. **Experimente o Classificador de Imagens** - Veja a IA em ação com imagens reais 4. **Analise o Sentimento de Texto** - Explore o processamento de linguagem natural ## 💡 Dicas para Iniciantes -- **Leia os comentários no código com atenção** - Eles explicam o que cada linha faz -- **Experimente!** - Tente alterar valores e veja o que acontece -- **Não se preocupe em entender tudo de imediato** - Aprender leva tempo +- **Leia os comentários do código com atenção** - Eles explicam o que cada linha faz +- **Experimente!** - Tente mudar valores e veja o que acontece +- **Não se preocupe por entender tudo** - Aprender leva tempo - **Faça perguntas** - Use o [Fórum de Discussão](https://github.com/microsoft/AI-For-Beginners/discussions) ## 🔗 Próximos Passos -Depois de concluir esses exemplos, explore o currículo completo: -- [Introdução à IA](../lessons/1-Intro/README.md) +Depois de completar estes exemplos, explore o currículo completo: +- [Introdução a IA](../lessons/1-Intro/README.md) - [Redes Neurais](../lessons/3-NeuralNetworks/README.md) - [Visão Computacional](../lessons/4-ComputerVision/README.md) - [Processamento de Linguagem Natural](../lessons/5-NLP/README.md) -## 🤝 Contribuindo +## 🤝 Contribuir -Achou esses exemplos úteis? Ajude-nos a melhorá-los: -- Relate problemas ou sugira melhorias +Gostou destes exemplos? Ajude-nos a melhorá-los: +- Reporte problemas ou sugira melhorias - Adicione mais exemplos para iniciantes - Melhore a documentação e os comentários --- -*Lembre-se: Todo especialista já foi um iniciante. Boa aprendizagem! 🎓* +*Lembre-se: Todo especialista foi uma vez um iniciante. Boa aprendizagem! 🎓* --- -**Aviso**: -Este documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, é importante notar que traduções automáticas podem conter erros ou imprecisões. O documento original na sua língua nativa deve ser considerado a fonte autoritária. Para informações críticas, recomenda-se uma tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações incorretas decorrentes da utilização desta tradução. \ No newline at end of file + +**Aviso Legal**: +Este documento foi traduzido utilizando o serviço de tradução automática [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos pela precisão, esteja ciente de que traduções automáticas podem conter erros ou imprecisões. O documento original na sua língua nativa deve ser considerado a fonte autorizada. Para informações críticas, recomenda-se tradução profissional humana. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações incorretas resultantes da utilização desta tradução. + \ No newline at end of file diff --git a/translations/pt-PT/lessons/0-course-setup/how-to-run.md b/translations/pt-PT/lessons/0-course-setup/how-to-run.md index 57f30036f0..6a5a05a019 100644 --- a/translations/pt-PT/lessons/0-course-setup/how-to-run.md +++ b/translations/pt-PT/lessons/0-course-setup/how-to-run.md @@ -1,12 +1,12 @@ # Como Executar o Código -Este currículo contém muitos exemplos executáveis e laboratórios que você vai querer executar. Para isso, precisa da capacidade de executar código Python nos Jupyter Notebooks fornecidos como parte deste currículo. Tem várias opções para executar o código: +Este currículo contém muitos exemplos e laboratórios executáveis que desejará correr. Para tal, precisa da capacidade de executar código Python em Jupyter Notebooks fornecidos como parte deste currículo. Tem várias opções para executar o código: ## Executar localmente no seu computador -Para executar o código localmente no seu computador, é necessário uma instalação de Python. Uma recomendação é instalar o **[miniconda](https://conda.io/en/latest/miniconda.html)** - é uma instalação relativamente leve que suporta o gestor de pacotes `conda` para diferentes **ambientes virtuais** Python. +Para executar o código localmente no seu computador, é necessário uma instalação de Python. Uma recomendação é instalar o **[miniconda](https://conda.io/en/latest/miniconda.html)** - é uma instalação bastante leve que suporta o gestor de pacotes `conda` para diferentes **ambientes virtuais** Python. -Depois de instalar o miniconda, clone o repositório e crie um ambiente virtual a ser usado para este curso: +Depois de instalar o miniconda, clone o repositório e crie um ambiente virtual a usar neste curso: ```bash git clone http://github.com/microsoft/ai-for-beginners @@ -15,17 +15,17 @@ conda env create --name ai4beg --file .devcontainer/environment.yml conda activate ai4beg ``` -### Usar Visual Studio Code com a Extensão Python +### Utilizar o Visual Studio Code com a Extensão Python -Este currículo é melhor aproveitado quando aberto no [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) com a [Extensão Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste). +Este currículo é melhor utilizado ao abri-lo no [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) com a [Extensão Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste). -> **Nota**: Depois de clonar e abrir o diretório no VS Code, será sugerido automaticamente que instale extensões Python. Também terá de instalar o miniconda conforme descrito acima. +> **Nota**: Uma vez que clone e abra o diretório no VS Code, irá automaticamente sugerir-lhe a instalação das extensões Python. Também terá que instalar o miniconda conforme descrito acima. > **Nota**: Se o VS Code lhe sugerir reabrir o repositório num contentor, deve recusar para usar a instalação local do Python. -### Usar Jupyter no Navegador +### Utilizar o Jupyter no Navegador -Também pode usar um ambiente Jupyter a partir do navegador no seu próprio computador. Tanto o Jupyter clássico como o JupyterHub oferecem um ambiente de desenvolvimento conveniente com auto-completação, realce de código, etc. +Também pode usar um ambiente Jupyter a partir do navegador no seu próprio computador. Tanto o Jupyter clássico como o JupyterHub fornecem um ambiente de desenvolvimento conveniente com auto-completação, realce de código, etc. Para iniciar o Jupyter localmente, vá para o diretório do curso e execute: @@ -36,36 +36,36 @@ ou ```bash jupyterhub ``` -Pode então navegar para qualquer um dos ficheiros `.ipynb`, abrir e começar a trabalhar. +Pode então navegar a qualquer um dos ficheiros `.ipynb`, abri-los e começar a trabalhar. -### Executar em contentor +### Executar num contentor -Uma alternativa à instalação do Python seria executar o código num contentor. Como o nosso repositório fornece uma pasta especial `.devcontainer` que indica como construir um contentor para este repositório, o VS Code oferece a oportunidade de reabrir o código num contentor. Isto irá requerer a instalação do Docker, e também será mais complexo, pelo que recomendamos isto para utilizadores mais experientes. +Uma alternativa à instalação do Python seria executar o código num contentor. Como o nosso repositório fornece uma pasta especial `.devcontainer` que indica como construir um contentor para este repositório, o VS Code oferece a oportunidade de reabrir o código num contentor. Isto requer a instalação do Docker e seria também mais complexo, por isso recomendamos isto para utilizadores mais experientes. -## Executar na Cloud +## Execução na Nuvem -Se não pretende instalar Python localmente, e tem acesso a alguns recursos na cloud - uma boa alternativa seria executar o código na cloud. Existem várias formas de o fazer: +Se não quiser instalar Python localmente e tiver acesso a alguns recursos na nuvem - uma boa alternativa seria executar o código na nuvem. Existem várias formas de o fazer: -* Usar **[GitHub Codespaces](https://github.com/features/codespaces)**, que é um ambiente virtual criado para si no GitHub, acessível através de uma interface de navegador VS Code. Se tem acesso ao Codespaces, pode simplesmente clicar no botão **Code** no repositório, iniciar um codespace, e começar a correr em pouco tempo. -* Usar **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) oferece recursos computacionais gratuitos providenciados na cloud para pessoas como você testarem algum código no GitHub. Existe um botão na página inicial para abrir o repositório no Binder – isto deve levá-lo rapidamente ao site binder, que vai construir um contentor subjacente e iniciar uma interface web Jupyter para si de forma integrada. +* Utilizando **[GitHub Codespaces](https://github.com/features/codespaces)**, que é um ambiente virtual criado para si no GitHub, acessível através de uma interface do VS Code no navegador. Se tiver acesso ao Codespaces, pode simplesmente clicar no botão **Code** no repositório, iniciar um codespace e ficar a correr em pouco tempo. +* Utilizando **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. O [Binder](https://mybinder.org) oferece recursos computacionais gratuitos disponibilizados na nuvem para pessoas como você testarem algum código no GitHub. Existe um botão na página principal para abrir o repositório no Binder - isto deverá levá-lo rapidamente ao site do binder, que irá construir um contentor base e iniciar uma interface web do Jupyter para si sem interrupções. -> **Nota**: Para prevenir uso indevido, o Binder tem acesso a alguns recursos web bloqueados. Isto pode impedir que algum código funcione, especialmente o que descarrega modelos e/ou conjuntos de dados da Internet pública. Pode precisar de encontrar algumas soluções alternativas. Além disso, os recursos computacionais providenciados pelo Binder são bastante básicos, pelo que o treino será lento, especialmente nas lições mais avançadas e complexas. +> **Nota**: Para prevenir uso indevido, o Binder tem acesso bloqueado a alguns recursos web. Isto pode impedir que algum código funcione, especialmente aquele que obtém modelos e/ou conjuntos de dados da Internet pública. Pode ser necessário encontrar algumas soluções alternativas. Além disso, os recursos computacionais fornecidos pelo Binder são bastante básicos, por isso o treino será lento, especialmente nas lições posteriores mais complexas. -## Executar na Cloud com GPU +## Execução na Nuvem com GPU -Algumas das lições mais avançadas deste currículo beneficiariam muito do suporte a GPU. O treino de modelos, por exemplo, pode ser extremamente lento de outra forma. Existem algumas opções que pode seguir, especialmente se tiver acesso à cloud através do [Azure para Estudantes](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) ou da sua instituição: +Algumas das lições posteriores neste currículo beneficiariam muito do suporte a GPU. O treino de modelos, por exemplo, pode ser dolorosamente lento de outra forma. Existem algumas opções que pode seguir, especialmente se tiver acesso à nuvem seja através do [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste), ou através da sua instituição: -* Criar [Máquina Virtual para Ciência de Dados](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) e ligar-se a ela através do Jupyter. Pode então clonar o repositório diretamente na máquina e começar a aprender. As máquinas virtuais NC-series têm suporte a GPU. +* Crie uma [Data Science Virtual Machine](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) e ligue-se a ela através do Jupyter. Pode então clonar o repositório diretamente na máquina e começar a aprender. As VMs da série NC têm suporte GPU. -> **Nota**: Algumas subscrições, incluindo o Azure para Estudantes, não fornecem suporte a GPU por defeito. Pode precisar de pedir núcleos de GPU adicionais através de um pedido de suporte técnico. +> **Nota**: Algumas subscrições, incluindo o Azure for Students, não fornecem suporte a GPU imediatamente. Pode ser necessário solicitar núcleos GPU adicionais através de um pedido de suporte técnico. -* Criar um [Workspace Azure Machine Learning](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) e depois usar a funcionalidade Notebook aí. [Este vídeo](https://azure-for-academics.github.io/quickstart/azureml-papers/) mostra como clonar um repositório num notebook Azure ML e começar a usar. +* Crie um [Azure Machine Learning Workspace](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) e utilize depois a funcionalidade de Notebook lá. [Este vídeo](https://azure-for-academics.github.io/quickstart/azureml-papers/) mostra como clonar um repositório num notebook Azure ML e começar a utilizá-lo. -Também pode usar o Google Colab, que vem com algum suporte GPU gratuito, e carregar Jupyter Notebooks lá para executá-los um a um. +Também pode usar o Google Colab, que vem com algum suporte GPU gratuito, e carregar aí os Jupyter Notebooks para os executar um por um. --- **Aviso Legal**: -Este documento foi traduzido utilizando o serviço de tradução automática [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos por garantir a precisão, tenha em atenção que traduções automáticas podem conter erros ou imprecisões. O documento original na sua língua nativa deve ser considerado a fonte oficial. Para informações críticas, recomenda-se a tradução profissional por um tradutor humano. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações incorretas decorrentes do uso desta tradução. +Este documento foi traduzido utilizando o serviço de tradução automática [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos pela precisão, esteja ciente de que traduções automáticas podem conter erros ou imprecisões. O documento original na sua língua nativa deve ser considerado a fonte autorizada. Para informações críticas, recomenda-se tradução profissional humana. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações incorretas resultantes da utilização desta tradução. \ No newline at end of file diff --git a/translations/pt-PT/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/pt-PT/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index 4fb9226538..97d5fefbef 100644 --- a/translations/pt-PT/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/pt-PT/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -6,9 +6,9 @@ "source": [ "# Modelos pré-treinados e aprendizagem por transferência\n", "\n", - "Treinar CNNs pode levar muito tempo, e é necessário uma grande quantidade de dados para essa tarefa. No entanto, grande parte do tempo é gasto a aprender os melhores filtros de baixo nível que uma rede utiliza para extrair padrões de imagens. Surge então uma questão natural - será que podemos usar uma rede neural treinada num conjunto de dados e adaptá-la para classificar imagens diferentes sem passar por todo o processo de treino?\n", + "Treinar CNNs pode levar muito tempo, e é necessário uma grande quantidade de dados para essa tarefa. No entanto, muito tempo é dedicado a aprender os melhores filtros de baixo nível que a rede usa para extrair padrões das imagens. Surge uma questão natural - podemos usar uma rede neural treinada num conjunto de dados e adaptá-la para classificar imagens diferentes sem realizar o processo completo de treino?\n", "\n", - "Esta abordagem é chamada de **aprendizagem por transferência**, porque transferimos algum conhecimento de um modelo de rede neural para outro. Na aprendizagem por transferência, normalmente começamos com um modelo pré-treinado, que foi treinado num grande conjunto de dados de imagens, como o **ImageNet**. Esses modelos já conseguem fazer um bom trabalho ao extrair diferentes características de imagens genéricas, e em muitos casos, simplesmente construir um classificador em cima dessas características extraídas pode produzir bons resultados.\n" + "Esta abordagem é chamada **aprendizagem por transferência**, porque transferimos algum conhecimento de um modelo de rede neural para outro. Na aprendizagem por transferência, tipicamente começamos com um modelo pré-treinado, que foi treinado num grande conjunto de imagens, como o **ImageNet**. Esses modelos já conseguem extrair bem diferentes características de imagens genéricas e, em muitos casos, simplesmente construir um classificador por cima dessas características extraídas pode produzir um bom resultado.\n" ] }, { @@ -29,11 +29,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Conjunto de Dados Cats vs. Dogs\n", + "## Conjunto de Dados Gatos vs. Cães\n", "\n", - "Nesta unidade, vamos resolver um problema real de classificação de imagens de gatos e cães. Para isso, utilizaremos o [Conjunto de Dados Cats vs. Dogs do Kaggle](https://www.kaggle.com/c/dogs-vs-cats), que também pode ser descarregado [da Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n", + "Nesta unidade, iremos resolver um problema da vida real de classificar imagens de gatos e cães. Por esta razão, vamos usar o [Conjunto de Dados Gatos vs. Cães do Kaggle](https://www.kaggle.com/c/dogs-vs-cats), que também pode ser descarregado [da Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n", "\n", - "Vamos descarregar este conjunto de dados e extraí-lo para o diretório `data` (este processo pode demorar algum tempo!):\n" + "Vamos descarregar este conjunto de dados e extrair para o diretório `data` (este processo pode demorar algum tempo!):\n" ] }, { @@ -64,7 +64,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Infelizmente, existem alguns ficheiros de imagem corrompidos no conjunto de dados. Precisamos de fazer uma limpeza rápida para verificar os ficheiros corrompidos. Para não sobrecarregar este tutorial, movemos o código para verificar o conjunto de dados para um módulo.\n" + "Infelizmente, há alguns ficheiros de imagem corrompidos no conjunto de dados. Precisamos de fazer uma limpeza rápida para verificar ficheiros corrompidos. Para não comprometer este tutorial, movemos o código para verificar o conjunto de dados para um módulo.\n" ] }, { @@ -335,11 +335,11 @@ "source": [ "## Carregar o Conjunto de Dados\n", "\n", - "Nos exemplos anteriores, estávamos a carregar conjuntos de dados que já vêm integrados no Keras. Agora vamos trabalhar com o nosso próprio conjunto de dados, que precisamos de carregar a partir de um diretório de imagens.\n", + "Nos exemplos anteriores, estávamos a carregar conjuntos de dados incorporados no Keras. Agora, estamos prestes a lidar com o nosso próprio conjunto de dados, que precisamos de carregar a partir de um diretório de imagens.\n", "\n", - "Na vida real, o tamanho dos conjuntos de dados de imagens pode ser bastante grande, e não se pode contar com a possibilidade de todos os dados caberem na memória. Por isso, os conjuntos de dados são frequentemente representados como **geradores** que podem devolver dados em minibatches adequados para o treino.\n", + "Na vida real, o tamanho dos conjuntos de dados de imagens pode ser bastante grande, e não se pode contar que todos os dados caibam na memória. Assim, os conjuntos de dados são frequentemente representados como **geradores** que podem devolver dados em minibatches adequados para treino.\n", "\n", - "Para lidar com a classificação de imagens, o Keras inclui uma função especial chamada `image_dataset_from_directory`, que pode carregar imagens a partir de subdiretórios correspondentes a diferentes classes. Esta função também trata da escala das imagens e pode dividir o conjunto de dados em subconjuntos de treino e teste:\n" + "Para lidar com a classificação de imagens, o Keras inclui a função especial `image_dataset_from_directory`, que pode carregar imagens a partir de subdiretórios correspondentes a diferentes classes. Esta função também trata da escala das imagens, e também pode dividir o conjunto de dados em subconjuntos de treino e teste:\n" ] }, { @@ -383,9 +383,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "É importante definir o mesmo valor de `seed` para ambas as chamadas, pois isso afeta a divisão das imagens entre os conjuntos de treino e teste.\n", + "É importante definir o mesmo valor `seed` para ambas as chamadas, porque isso afeta a divisão das imagens entre o conjunto de treino e o conjunto de teste.\n", "\n", - "O dataset identifica automaticamente os nomes das classes a partir dos diretórios, e pode aceder a eles, se necessário, chamando:\n" + "O Dataset recolhe automaticamente os nomes das classes a partir dos diretórios, e você pode aceder a eles, se necessário, chamando:\n" ] }, { @@ -412,7 +412,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Os conjuntos de dados que obtivemos podem ser diretamente passados para a função `fit` para treinar o modelo. Eles contêm tanto as imagens correspondentes como os rótulos, que podem ser iterados utilizando a seguinte construção:\n" + "Conjuntos de dados que obtivemos podem ser diretamente passados para a função `fit` para treinar o modelo. Eles contêm tanto as imagens correspondentes como os rótulos, que podem ser percorridos utilizando a seguinte construção:\n" ] }, { @@ -453,7 +453,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "> **Nota**: Todas as imagens no conjunto de dados são representadas como tensores de ponto flutuante com intervalo de 0-255. Antes de passá-las para a rede neural, precisamos escalar esses valores para o intervalo de 0-1. Ao plotar imagens, precisamos fazer o mesmo ou converter os valores para o tipo `int` (como fazemos no código acima), para mostrar ao `matplotlib` que queremos plotar a imagem original não escalada.\n" + "> **Nota**: Todas as imagens no conjunto de dados são representadas como tensores de ponto flutuante com intervalo 0-255. Antes de as passar para a rede neural, precisamos de escalar esses valores para o intervalo 0-1. Ao plotar imagens, precisamos de fazer o mesmo, ou converter os valores para o tipo `int` (como fazemos no código acima), para mostrar ao `matplotlib` que queremos plotar a imagem original sem escala.\n" ] }, { @@ -462,7 +462,7 @@ "source": [ "## Modelos pré-treinados\n", "\n", - "Para muitas tarefas de classificação de imagens, é possível encontrar modelos de redes neurais pré-treinados. Muitos desses modelos estão disponíveis no espaço de nomes `keras.applications`, e ainda mais modelos podem ser encontrados na Internet. Vamos ver como o modelo mais simples, o VGG-16, pode ser carregado e utilizado:\n" + "Para muitas tarefas de classificação de imagens, pode encontrar modelos de redes neurais pré-treinados. Muitos desses modelos estão disponíveis dentro do namespace `keras.applications`, e ainda mais modelos podem ser encontrados na Internet. Vamos ver como o modelo VGG-16 mais simples pode ser carregado e utilizado:\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": [ - "Há algumas coisas importantes aqui:\n", - "* Antes de passar uma entrada para qualquer rede pré-treinada, é necessário pré-processá-la de uma determinada forma. Isto é feito chamando a função correspondente `preprocess_input`, que recebe um lote de imagens e devolve a sua forma processada. No caso do VGG-16, as imagens são normalizadas, e um valor médio pré-definido para cada canal é subtraído. Isto acontece porque o VGG-16 foi originalmente treinado com este pré-processamento.\n", - "* A rede neural é aplicada ao lote de entrada, e recebemos como resultado um lote de tensores com 1000 elementos que mostram a probabilidade de cada classe. Podemos encontrar o número da classe mais provável chamando `argmax` neste tensor.\n", - "* O resultado obtido é um [número de uma classe do `ImageNet`](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Para interpretar este resultado, podemos também usar a função `decode_predictions`, que devolve as n classes principais juntamente com os seus nomes.\n" + "Existem algumas coisas importantes aqui:\n", + "* Antes de passar uma entrada para qualquer rede pré-treinada, esta tem de ser pré-processada de uma certa forma. Isto é feito chamando a função `preprocess_input` correspondente, que recebe um lote de imagens e retorna a sua forma processada. No caso do VGG-16, as imagens são normalizadas e é subtraído um valor médio pré-definido para cada canal. Isso acontece porque o VGG-16 foi originalmente treinado com este pré-processamento.\n", + "* A rede neural é aplicada ao lote de entrada, e recebemos como resultado um lote de tensores com 1000 elementos que mostram a probabilidade de cada classe. Podemos encontrar o número da classe mais provável ao chamar `argmax` neste tensor.\n", + "* O resultado obtido é um [número de uma classe do `ImageNet`](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Para fazer sentido deste resultado, podemos também usar a função `decode_predictions`, que retorna as n classes principais juntamente com os seus nomes.\n" ] }, { @@ -597,9 +607,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Computações com GPU\n", + "## Cálculos na GPU\n", "\n", - "Redes neurais profundas, como a VGG-16 e outras arquiteturas mais modernas, requerem bastante poder computacional para serem executadas. Faz sentido utilizar a aceleração por GPU, se estiver disponível. Felizmente, o Keras acelera automaticamente as computações na GPU, caso esta esteja disponível. Podemos verificar se o Tensorflow consegue utilizar a GPU com o seguinte código:\n" + "Redes neurais profundas, como a VGG-16 e outras arquiteturas mais modernas, requerem bastante potência computacional para funcionar. Faz sentido usar aceleração por GPU, se estiver disponível. Felizmente, o Keras acelera automaticamente os cálculos na GPU se esta estiver disponível. Podemos verificar se o Tensorflow é capaz de usar GPU com o seguinte código:\n" ] }, { @@ -626,9 +636,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Extração de características do VGG\n", "\n", - "Se quisermos usar o VGG-16 para extrair características das nossas imagens, precisamos do modelo sem as camadas finais de classificação. Podemos instanciar o modelo VGG-16 sem as camadas superiores utilizando este código:\n" + "## Extrair características da VGG\n", + "\n", + "Se quisermos usar o VGG-16 para extrair características das nossas imagens, precisamos do modelo sem as camadas finais de classificação. Podemos instanciar o modelo VGG-16 sem as camadas superiores usando este código:\n" ] }, { @@ -680,9 +691,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "A dimensão do tensor de características é 7x7x512, mas para o visualizar tivemos de o remodelar para uma forma 2D.\n", + "A dimensão do tensor de características é 7x7x512, mas para o visualizar tivemos que o reestruturar para uma forma 2D.\n", "\n", - "Agora vamos tentar ver se essas características podem ser usadas para classificar imagens. Vamos selecionar manualmente uma parte das imagens (50 minibatches, no nosso caso) e pré-computar os seus vetores de características. Podemos usar a API **dataset** do Tensorflow para fazer isso. A função `map` recebe um dataset e aplica uma função lambda para o transformar. Usamos este mecanismo para construir novos datasets, `ds_features_train` e `ds_features_test`, que contêm as características extraídas pelo VGG em vez das imagens originais.\n" + "Agora vamos tentar ver se essas características podem ser usadas para classificar imagens. Vamos manualmente apanhar uma porção de imagens (50 minibatches, no nosso caso) e pré-calcular os seus vetores de características. Podemos usar a API **dataset** do Tensorflow para fazer isso. A função `map` recebe um conjunto de dados e aplica uma função lambda dada para o transformar. Usamos este mecanismo para construir novos conjuntos de dados, `ds_features_train` e `ds_features_test`, que contêm características extraídas da VGG em vez das imagens originais.\n" ] }, { @@ -712,9 +723,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Utilizámos a construção `.take(50)` para limitar o tamanho do conjunto de dados, de forma a acelerar a nossa demonstração. Claro que pode realizar este experimento com o conjunto de dados completo.\n", + "Usámos a construção `.take(50)` para limitar o tamanho do conjunto de dados, de forma a acelerar a nossa demonstração. Pode claro realizar este experimento no conjunto de dados completo.\n", "\n", - "Agora que temos um conjunto de dados com as características extraídas, podemos treinar um classificador denso simples para distinguir entre gatos e cães. Esta rede irá receber um vetor de características com a forma (7,7,512) e produzirá uma saída que corresponde a um cão ou a um gato. Como se trata de uma classificação binária, utilizamos a função de ativação `sigmoid` e a perda `binary_crossentropy`.\n" + "Agora que temos um conjunto de dados com características extraídas, podemos treinar um classificador denso simples para distinguir entre gatos e cães. Esta rede irá receber um vetor de características com forma (7,7,512) e produzir uma saída que corresponde a um cão ou a um gato. Como é uma classificação binária, usamos a função de ativação `sigmoid` e a perda `binary_crossentropy`.\n" ] }, { @@ -743,13 +754,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "O resultado é excelente, conseguimos distinguir entre um gato e um cão com quase 95% de probabilidade! No entanto, apenas testámos esta abordagem num subconjunto de todas as imagens, porque a extração manual de características parece demorar bastante tempo.\n", + "O resultado é ótimo, conseguimos distinguir entre um gato e um cão com quase 95% de probabilidade! No entanto, testámos esta abordagem apenas num subconjunto de todas as imagens, porque a extração manual de características parece levar muito tempo.\n", "\n", - "## Transferência de aprendizagem usando uma rede VGG\n", + "## Aprendizagem por transferência usando uma rede VGG\n", "\n", - "Também podemos evitar a pré-computação manual das características utilizando a rede VGG-16 original como um todo durante o treino, adicionando um extrator de características à nossa rede como primeira camada.\n", + "Também podemos evitar o pré-cálculo manual das características usando a rede original VGG-16 como um todo durante o treino, adicionando o extractor de características à nossa rede como uma primeira camada.\n", "\n", - "A grande vantagem da arquitetura do Keras é que o modelo VGG-16 que definimos acima pode também ser usado como uma camada noutra rede neural! Só precisamos de construir uma rede com um classificador denso por cima dela e, em seguida, treinar toda a rede utilizando retropropagação.\n" + "A beleza da arquitectura Keras é que o modelo VGG-16 que definimos acima pode também ser usado como uma camada numa outra rede neural! Só precisamos de construir uma rede com um classificador denso em cima, e depois treinar toda a rede usando retropropagação.\n" ] }, { @@ -793,13 +804,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Este modelo parece uma rede de classificação de ponta a ponta, que recebe uma imagem e retorna a classe. No entanto, o desafio aqui é que queremos que o VGG16 funcione como um extrator de características, e não seja re-treinado. Assim, precisamos **congelar os pesos do extrator de características convolucional**. Podemos aceder à primeira camada da rede chamando `model.layers[0]`, e só precisamos definir a propriedade `trainable` como `False`.\n", + "Este modelo parece uma rede de classificação de ponta a ponta, que recebe uma imagem e devolve a classe. No entanto, o complicado é que queremos que o VGG16 atue como extrator de características, e não seja re-treinado. Assim, precisamos de **congelar os pesos do extrator de características convolucionais**. Podemos aceder à primeira camada da rede chamando `model.layers[0]`, e apenas precisamos definir a propriedade `trainable` para `False`.\n", "\n", - "> **Note**: Congelar os pesos do extrator de características é necessário, porque, caso contrário, a camada de classificação não treinada pode destruir os pesos originais pré-treinados do extrator convolucional.\n", + "> **Nota**: O congelamento dos pesos do extrator de características é necessário, porque caso contrário a camada classificador não treinada pode destruir os pesos pré-treinados originais do extrator convolucional.\n", "\n", - "Pode reparar que, embora o número total de parâmetros na nossa rede seja cerca de 15 milhões, estamos apenas a treinar 25 mil parâmetros. Todos os outros parâmetros dos filtros convolucionais de nível superior estão pré-treinados. Isso é bom, porque conseguimos ajustar um número menor de parâmetros com um número menor de exemplos.\n", + "Poderá notar que enquanto o número total de parâmetros da nossa rede é cerca de 15 milhões, estamos apenas a treinar 25k parâmetros. Todos os outros parâmetros dos filtros convolucionais de topo são pré-treinados. Isso é bom, porque somos capazes de ajustar um número menor de parâmetros com um número menor de exemplos.\n", "\n", - "Agora vamos treinar a nossa rede e ver quão boa ela pode ser. Espere um tempo de execução relativamente longo e não se preocupe se a execução parecer congelada por algum tempo.\n" + "Agora vamos treinar a nossa rede e ver quão boa ela pode ficar. Espere um tempo de execução bastante longo, e não se preocupe se a execução parecer congelada por algum tempo.\n" ] }, { @@ -824,11 +835,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Parece que conseguimos um classificador de gatos vs. cães bastante preciso!\n", + "Parece que obtivemos um classificador razoavelmente preciso para gatos vs. cães! \n", "\n", "## Guardar e Carregar o Modelo\n", "\n", - "Depois de treinarmos o modelo, podemos guardar a arquitetura do modelo e os pesos treinados num ficheiro para uso futuro:\n" + "Uma vez que treinámos o modelo, podemos guardar a arquitetura do modelo e os pesos treinados num ficheiro para uso futuro:\n" ] }, { @@ -852,7 +863,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Podemos então carregar o modelo a partir do ficheiro a qualquer momento. Pode achá-lo útil caso a próxima experiência destrua o modelo - não teria de recomeçar do zero.\n" + "Podemos então carregar o modelo a partir do ficheiro a qualquer momento. Pode achar útil no caso do próximo experimento destruir o modelo - não teria que recomeçar do zero.\n" ] }, { @@ -868,15 +879,15 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Ajuste fino no aprendizado por transferência\n", + "## Aprimoramento do fine-tuning transfer learning\n", "\n", - "Na secção anterior, treinámos a camada final do classificador para classificar imagens no nosso próprio conjunto de dados. No entanto, não re-treinámos o extrator de características, e o nosso modelo baseou-se nas características que aprendeu com os dados do ImageNet. Se os seus objetos diferirem visualmente das imagens comuns do ImageNet, esta combinação de características pode não ser a mais eficaz. Assim, faz sentido começar a treinar também as camadas convolucionais.\n", + "Na secção anterior, treinámos a última camada classificador para classificar imagens no nosso próprio conjunto de dados. Contudo, não re-treinámos o extrator de características, e o nosso modelo baseou-se nas características que o modelo aprendeu com dados da ImageNet. Se os seus objetos diferirem visualmente das imagens comuns da ImageNet, esta combinação de características pode não funcionar da melhor forma. Assim, faz sentido começar a treinar as camadas convolucionais também.\n", "\n", - "Para isso, podemos desbloquear os parâmetros dos filtros convolucionais que anteriormente tínhamos bloqueado.\n", + "Para isso, podemos descongelar os parâmetros dos filtros convolucionais que anteriormente tínhamos congelado. \n", "\n", - "> **Nota:** É importante que bloqueie os parâmetros primeiro e realize várias épocas de treino para estabilizar os pesos na camada de classificação. Se começar imediatamente a treinar a rede de ponta a ponta com os parâmetros desbloqueados, é provável que grandes erros destruam os pesos pré-treinados nas camadas convolucionais.\n", + "> **Nota:** É importante que congele os parâmetros primeiro e realize várias épocas de treino para estabilizar os pesos na camada de classificação. Se começar imediatamente a treinar a rede end-to-end com os parâmetros descongelados, é provável que grandes erros destruam os pesos pré-treinados nas camadas convolucionais.\n", "\n", - "O nosso modelo convolucional VGG-16 está localizado dentro da primeira camada e, por si só, é composto por muitas camadas. Podemos observar a sua estrutura:\n" + "O nosso modelo convolucional VGG-16 está localizado dentro da primeira camada, e ele próprio consiste em muitas camadas. Podemos observar a sua estrutura:\n" ] }, { @@ -944,7 +955,9 @@ { "cell_type": "markdown", "metadata": {}, - "source": [] + "source": [ + "Podemos descongelar todas as camadas da base convolucional:\n" + ] }, { "cell_type": "code", @@ -959,7 +972,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "No entanto, descongelar todos de uma vez não é a melhor ideia. Podemos primeiro descongelar apenas algumas camadas finais de convoluções, porque elas contêm padrões de nível superior que são relevantes para as nossas imagens. Por exemplo, para começar, podemos congelar todas as camadas, exceto as últimas 4:\n" + "No entanto, descongelar todos ao mesmo tempo não é a melhor ideia. Podemos primeiro descongelar apenas algumas camadas finais de convoluções, porque elas contêm padrões de nível mais elevado que são relevantes para as nossas imagens. Por exemplo, para começar, podemos congelar todas as camadas exceto as últimas 4: \n" ] }, { @@ -998,11 +1011,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Observe que o número de parâmetros treináveis aumentou significativamente, mas ainda corresponde a cerca de 50% de todos os parâmetros.\n", + "Note que o número de parâmetros treináveis aumentou significativamente, mas ainda é cerca de 50% de todos os parâmetros.\n", "\n", - "Após desbloquear os pesos, podemos realizar mais algumas épocas de treino (no nosso exemplo, faremos apenas uma). Também pode optar por uma taxa de aprendizagem mais baixa, para minimizar o impacto nos pesos pré-treinados. No entanto, mesmo com uma taxa de aprendizagem baixa, é esperado que a precisão diminua no início do treino, até finalmente atingir um nível ligeiramente superior ao caso dos pesos fixos.\n", + "Após desbloquear, podemos fazer mais algumas épocas de treino (no nosso exemplo, faremos apenas uma). Também pode selecionar uma taxa de aprendizagem mais baixa, para minimizar o impacto nos pesos pré-treinados. No entanto, mesmo com uma taxa de aprendizagem baixa, pode esperar que a precisão diminua no início do treino, até finalmente atingir um nível ligeiramente superior ao caso dos pesos fixos.\n", "\n", - "> **Note:** Este treino é muito mais lento, porque precisamos propagar os gradientes através de muitas camadas da rede!\n" + "> **Nota:** Este treino acontece muito mais devagar, porque precisamos propagar os gradientes de volta por muitas camadas da rede!\n" ] }, { @@ -1026,9 +1039,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "É provável que alcancemos uma maior precisão no treino, porque estamos a utilizar uma rede mais poderosa com mais parâmetros, mas a precisão na validação não aumentará tanto.\n", + "É provável que consigamos uma maior precisão no treino, porque estamos a usar uma rede mais poderosa com mais parâmetros, mas a precisão na validação não aumentará tanto.\n", "\n", - "Sinta-se à vontade para desbloquear mais algumas camadas da rede e treinar mais, para ver se consegue alcançar uma maior precisão!\n" + "Sinta-se à vontade para descongelar mais algumas camadas da rede e treinar mais, para ver se consegue obter uma precisão maior!\n" ] }, { @@ -1037,7 +1050,7 @@ "source": [ "## Outros modelos de visão computacional\n", "\n", - "O VGG-16 é uma das arquiteturas de visão computacional mais simples. O Keras oferece muitas outras redes pré-treinadas. As mais frequentemente utilizadas entre elas são as arquiteturas **ResNet**, desenvolvidas pela Microsoft, e o **Inception**, do Google. Por exemplo, vamos explorar a arquitetura do modelo ResNet-50 mais simples (ResNet é uma família de modelos com diferentes profundidades; pode experimentar com o ResNet-152 se quiser ver como é um modelo realmente profundo):\n" + "O VGG-16 é uma das arquiteturas de visão computacional mais simples. O Keras fornece muitas outras redes pré-treinadas. As mais frequentemente usadas entre estas são as arquiteturas **ResNet**, desenvolvidas pela Microsoft, e o **Inception** da Google. Por exemplo, vamos explorar a arquitetura do modelo ResNet-50 mais simples (ResNet é uma família de modelos com diferentes profundidades, podes experimentar o ResNet-152 se quiseres ver como é um modelo realmente profundo):\n" ] }, { @@ -1439,29 +1452,29 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Como pode ver, o modelo contém os mesmos blocos familiares: camadas de convolução, camadas de pooling e um classificador denso final. Podemos usar este modelo exatamente da mesma forma que temos usado o VGG-16 para aprendizagem por transferência. Pode experimentar com o código acima, utilizando diferentes modelos ResNet como modelo base, e observar como a precisão muda.\n", + "Como pode ver, o modelo contém os mesmos blocos de construção familiares: camadas convolucionais, camadas de pooling e um classificador denso final. Podemos usar este modelo exatamente da mesma forma que temos usado o VGG-16 para aprendizagem por transferência. Pode tentar experimentar com o código acima, usando diferentes modelos ResNet como modelo base, e ver como a precisão muda.\n", "\n", - "## Normalização por Lote\n", + "## Normalização por Batch\n", "\n", - "Esta rede contém mais um tipo de camada: **Normalização por Lote**. A ideia da normalização por lote é ajustar os valores que passam pela rede neural para o intervalo correto. Normalmente, redes neurais funcionam melhor quando todos os valores estão no intervalo de [-1,1] ou [0,1], e é por isso que escalamos/normalizamos os nossos dados de entrada de forma adequada. No entanto, durante o treino de uma rede profunda, pode acontecer que os valores fiquem significativamente fora deste intervalo, o que torna o treino problemático. A camada de normalização por lote calcula a média e o desvio padrão para todos os valores do minibatch atual e utiliza-os para normalizar o sinal antes de o passar por uma camada da rede neural. Isto melhora significativamente a estabilidade de redes profundas.\n" + "Esta rede contém ainda outro tipo de camada: **Normalização por Batch**. A ideia da normalização por batch é trazer os valores que fluem pela rede neural para o intervalo correto. Normalmente, as redes neurais funcionam melhor quando todos os valores estão no intervalo [-1,1] ou [0,1], e essa é a razão pela qual escalamos/normalizamos os nossos dados de entrada em conformidade. No entanto, durante o treino de uma rede profunda, pode acontecer de os valores saírem significativamente deste intervalo, o que torna o treino problemático. A camada de normalização por batch calcula a média e o desvio padrão para todos os valores do minibatch atual, e usa-os para normalizar o sinal antes de o passar por uma camada da rede neural. Isto melhora significativamente a estabilidade das redes profundas.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Conclusão\n", + "## Retirada\n", "\n", - "Utilizando aprendizagem por transferência, conseguimos rapidamente montar um classificador para a nossa tarefa personalizada de classificação de objetos e alcançar uma alta precisão. No entanto, este exemplo não foi completamente justo, pois a rede original VGG-16 foi pré-treinada para reconhecer gatos e cães, e, assim, estávamos apenas reutilizando a maioria dos padrões que já estavam presentes na rede. Pode-se esperar uma precisão menor em objetos mais exóticos e específicos de domínio, como detalhes em uma linha de produção numa fábrica ou diferentes tipos de folhas de árvores.\n", + "Usando transferência de aprendizagem, conseguimos montar rapidamente um classificador para a nossa tarefa personalizada de classificação de objetos, e alcançar uma alta precisão. No entanto, este exemplo não foi completamente justo, porque a rede original VGG-16 foi pré-treinada para reconhecer gatos e cães, e portanto estávamos apenas a reutilizar a maioria dos padrões que já estavam presentes na rede. Pode esperar uma precisão mais baixa em objetos exóticos e específicos de domínio, como detalhes na linha de produção numa fábrica, ou diferentes folhas de árvores.\n", "\n", - "É possível perceber que tarefas mais complexas, como as que estamos resolvendo agora, exigem maior poder computacional e não podem ser facilmente resolvidas apenas com o CPU. Na próxima unidade, tentaremos usar uma implementação mais leve para treinar o mesmo modelo utilizando menos recursos computacionais, o que resulta em uma precisão apenas ligeiramente inferior.\n" + "Pode ver que tarefas mais complexas que estamos a resolver agora requerem maior poder computacional, e não podem ser facilmente resolvidas na CPU. Na próxima unidade, iremos tentar usar uma implementação mais leve para treinar o mesmo modelo usando menos recursos computacionais, o que resulta numa precisão ligeiramente inferior. \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**Aviso Legal**: \nEste documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, é importante ter em conta que traduções automáticas podem conter erros ou imprecisões. O documento original na sua língua nativa deve ser considerado a fonte autoritária. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações incorretas decorrentes da utilização desta tradução.\n" + "---\n\n\n**Aviso Legal**:\nEste documento foi traduzido utilizando o serviço de tradução automática [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos pela precisão, esteja ciente de que traduções automáticas podem conter erros ou imprecisões. O documento original na sua língua nativa deve ser considerado a fonte autorizada. Para informações críticas, recomenda-se tradução profissional humana. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações incorretas resultantes da utilização desta tradução.\n\n" ] } ], @@ -1482,12 +1495,6 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" - }, - "coopTranslator": { - "original_hash": "c189abc107848f96051085cc30945129", - "translation_date": "2025-08-31T11:40:14+00:00", - "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", - "language_code": "pt" } }, "nbformat": 4, diff --git a/translations/pt-PT/lessons/5-NLP/README.md b/translations/pt-PT/lessons/5-NLP/README.md index 7cdd1c0c38..85ee224184 100644 --- a/translations/pt-PT/lessons/5-NLP/README.md +++ b/translations/pt-PT/lessons/5-NLP/README.md @@ -1,69 +1,73 @@ # Processamento de Linguagem Natural -![Resumo das tarefas de PLN em um desenho](../../../../lessons/sketchnotes/ai-nlp.png) - -Nesta secção, vamos focar no uso de Redes Neuronais para lidar com tarefas relacionadas ao **Processamento de Linguagem Natural (PLN)**. Existem muitos problemas de PLN que queremos que os computadores sejam capazes de resolver: - -* **Classificação de texto** é um problema típico de classificação relacionado a sequências de texto. Exemplos incluem classificar mensagens de e-mail como spam ou não-spam, ou categorizar artigos como desporto, negócios, política, etc. Além disso, ao desenvolver chatbots, muitas vezes precisamos entender o que o utilizador quis dizer — neste caso, estamos a lidar com **classificação de intenções**. Frequentemente, na classificação de intenções, precisamos lidar com muitas categorias. -* **Análise de sentimento** é um problema típico de regressão, onde precisamos atribuir um número (um sentimento) que corresponda ao quão positiva/negativa é a mensagem de uma frase. Uma versão mais avançada da análise de sentimento é a **análise de sentimento baseada em aspetos** (ABSA), onde atribuímos o sentimento não à frase inteira, mas a diferentes partes dela (aspeto), por exemplo: *Neste restaurante, gostei da cozinha, mas a atmosfera era horrível*. -* **Reconhecimento de Entidades Nomeadas** (NER) refere-se ao problema de extrair certas entidades de um texto. Por exemplo, podemos precisar entender que na frase *Preciso de voar para Paris amanhã*, a palavra *amanhã* refere-se a uma DATA, e *Paris* é uma LOCALIZAÇÃO. -* **Extração de palavras-chave** é semelhante ao NER, mas precisamos extrair automaticamente palavras importantes para o significado da frase, sem pré-treino para tipos específicos de entidades. -* **Agrupamento de texto** pode ser útil quando queremos agrupar frases semelhantes, por exemplo, pedidos semelhantes em conversas de suporte técnico. -* **Resposta a perguntas** refere-se à capacidade de um modelo responder a uma pergunta específica. O modelo recebe um trecho de texto e uma pergunta como entradas, e precisa fornecer um local no texto onde a resposta à pergunta está contida (ou, por vezes, gerar o texto da resposta). -* **Geração de texto** é a capacidade de um modelo gerar novo texto. Pode ser considerado como uma tarefa de classificação que prevê a próxima letra/palavra com base num *texto inicial*. Modelos avançados de geração de texto, como o GPT-3, conseguem resolver outras tarefas de PLN, como classificação, usando uma técnica chamada [programação por prompts](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) ou [engenharia de prompts](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29). -* **Sumarização de texto** é uma técnica em que queremos que um computador "leia" um texto longo e o resuma em algumas frases. +![Resumo das tarefas de PLN num desenho](../../../../translated_images/pt-PT/ai-nlp.b22dcb8ca4707cea.webp) + +Nesta secção, vamos focar-nos na utilização de Redes Neurais para tratar tarefas relacionadas com o **Processamento de Linguagem Natural (PLN)**. Existem muitos problemas de PLN que queremos que os computadores consigam resolver: + +* **Classificação de texto** é um problema típico de classificação relativo a sequências de texto. Exemplos incluem classificar mensagens de e-mail como spam vs. não spam, ou categorizar artigos como desporto, negócios, política, etc. Também, ao desenvolver chat bots, muitas vezes precisamos de entender o que um utilizador quis dizer – neste caso estamos a lidar com **classificação de intenção**. Frequentemente, na classificação de intenção precisamos de lidar com muitas categorias. +* **Análise de sentimento** é um problema típico de regressão, onde precisamos de atribuir um número (um sentimento) correspondente a quão positivo/negativo é o significado de uma frase. Uma versão mais avançada da análise de sentimento é a **análise de sentimento baseada em aspetos** (ABSA), onde atribuimos sentimento não à frase toda, mas a diferentes partes dela (aspeto), por exemplo, *Neste restaurante, gostei da cozinha, mas a atmosfera era horrível*. +* **Reconhecimento de Entidades Nomeadas** (NER) refere-se ao problema de extrair certas entidades do texto. Por exemplo, podemos precisar de entender que na frase *Preciso de voar para Paris amanhã* a palavra *amanhã* refere-se a DATA, e *Paris* é uma LOCALIZAÇÃO. +* **Extração de palavras-chave** é similar ao NER, mas precisamos de extrair automaticamente palavras importantes para o significado da frase, sem pré-treinamento para tipos de entidade específicos. +* **Agrupamento de texto** pode ser útil quando queremos agrupar frases similares, por exemplo, pedidos semelhantes em conversas de apoio técnico. +* **Resolução de perguntas** refere-se à capacidade de um modelo responder a uma pergunta específica. O modelo recebe como entrada um excerto de texto e uma pergunta, e precisa de indicar um local no texto onde a resposta à pergunta está contida (ou, por vezes, gerar o texto da resposta). +* **Geração de texto** é a capacidade de um modelo gerar novo texto. Pode ser considerado como uma tarefa de classificação que prevê a próxima letra/palavra com base num *texto inicial*. Modelos avançados de geração de texto, como o GPT-3, são capazes de resolver outras tarefas de PLN tais como classificação usando uma técnica chamada [programação de indicativos](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) ou [engenharia de indicativos](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29) +* **Sumarização de texto** é uma técnica quando queremos que um computador "leia" um texto longo e o resuma em poucas frases. * **Tradução automática** pode ser vista como uma combinação de compreensão de texto numa língua e geração de texto noutra. -Inicialmente, a maioria das tarefas de PLN era resolvida usando métodos tradicionais, como gramáticas. Por exemplo, na tradução automática, analisadores sintáticos eram usados para transformar a frase inicial numa árvore sintática, depois estruturas semânticas de nível superior eram extraídas para representar o significado da frase, e com base nesse significado e na gramática da língua de destino, o resultado era gerado. Atualmente, muitas tarefas de PLN são resolvidas de forma mais eficaz usando redes neuronais. +Inicialmente, a maioria das tarefas de PLN era resolvida usando métodos tradicionais como gramáticas. Por exemplo, na tradução automática eram usados analisadores para transformar a frase inicial numa árvore sintática, depois estruturas semânticas de nível superior eram extraídas para representar o significado da frase, e com base neste significado e na gramática da língua-alvo o resultado era gerado. Atualmente, muitas tarefas de PLN são resolvidas de forma mais eficaz usando redes neurais. -> Muitos métodos clássicos de PLN estão implementados na biblioteca Python [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org). Existe um excelente [Livro NLTK](https://www.nltk.org/book/) disponível online que cobre como diferentes tarefas de PLN podem ser resolvidas usando o NLTK. +> Muitos métodos clássicos de PLN estão implementados na biblioteca Python [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org). Existe um ótimo [Livro NLTK](https://www.nltk.org/book/) disponível online que aborda como diferentes tarefas de PLN podem ser resolvidas usando o NLTK. -No nosso curso, vamos focar-nos principalmente no uso de Redes Neuronais para PLN, e usaremos o NLTK quando necessário. +No nosso curso, vamos focar-nos maioritariamente no uso de Redes Neurais para PLN, e usaremos o NLTK onde necessário. -Já aprendemos a usar redes neuronais para lidar com dados tabulares e com imagens. A principal diferença entre esses tipos de dados e texto é que o texto é uma sequência de comprimento variável, enquanto o tamanho da entrada no caso de imagens é conhecido antecipadamente. Embora redes convolucionais possam extrair padrões de dados de entrada, os padrões no texto são mais complexos. Por exemplo, podemos ter uma negação separada do sujeito por muitas palavras (ex.: *Eu não gosto de laranjas* vs. *Eu não gosto daquelas laranjas grandes, coloridas e saborosas*), e isso ainda deve ser interpretado como um único padrão. Assim, para lidar com a linguagem, precisamos introduzir novos tipos de redes neuronais, como *redes recorrentes* e *transformers*. +Já aprendemos sobre o uso de redes neurais para lidar com dados tabulares e com imagens. A principal diferença entre esses tipos de dados e o texto é que o texto é uma sequência de comprimento variável, enquanto o tamanho da entrada no caso de imagens é conhecido de antemão. Enquanto redes convolucionais podem extrair padrões dos dados de entrada, os padrões no texto são mais complexos. Por exemplo, podemos ter uma negação separada do sujeito por muitas palavras arbitrárias (exemplo: *Eu não gosto de laranjas*, vs. *Eu não gosto daquelas laranjas grandes, coloridas e saborosas*), e isso ainda deve ser interpretado como um padrão único. Assim, para lidar com a linguagem precisamos de introduzir novos tipos de redes neurais, tais como *redes recorrentes* e *transformers*. ## Instalar Bibliotecas -Se estiver a usar uma instalação local de Python para executar este curso, pode ser necessário instalar todas as bibliotecas necessárias para PLN usando os seguintes comandos: +Se estiver a usar uma instalação local de Python para executar este curso, poderá precisar de instalar todas as bibliotecas necessárias para PLN usando os seguintes comandos: -**Para PyTorch** +**Para PyTorch** ```bash -pip install -r requirements-torch.txt -``` -**Para TensorFlow** +pip install -r requirements-pytorch.txt +``` +**Para TensorFlow** ```bash pip install -r requirements-tf.txt -``` +``` -> Pode experimentar PLN com TensorFlow no [Microsoft Learn](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste) +> Pode experimentar PLN com TensorFlow em [Microsoft Learn](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste) ## Aviso sobre GPU -Nesta secção, em alguns dos exemplos, treinaremos modelos bastante grandes. -* **Use um Computador com GPU**: É recomendável executar os seus notebooks num computador com GPU para reduzir os tempos de espera ao trabalhar com modelos grandes. -* **Limitações de Memória da GPU**: Executar numa GPU pode levar a situações em que a memória da GPU se esgote, especialmente ao treinar modelos grandes. -* **Consumo de Memória da GPU**: A quantidade de memória da GPU consumida durante o treino depende de vários fatores, incluindo o tamanho do minibatch. -* **Minimize o Tamanho do Minibatch**: Se encontrar problemas de memória na GPU, considere reduzir o tamanho do minibatch no seu código como uma solução potencial. -* **Libertação de Memória da GPU no TensorFlow**: Versões mais antigas do TensorFlow podem não libertar corretamente a memória da GPU ao treinar vários modelos num único kernel Python. Para gerir o uso da memória da GPU de forma eficaz, pode configurar o TensorFlow para alocar memória da GPU apenas conforme necessário. -* **Inclusão de Código**: Para configurar o TensorFlow para aumentar a alocação de memória da GPU apenas quando necessário, inclua o seguinte código nos seus notebooks: +Nesta secção, em alguns exemplos, vamos treinar modelos bastante grandes. +* **Use um Computador com GPU Ativada**: É aconselhável executar os seus notebooks num computador com GPU ativada para reduzir os tempos de espera quando se trabalha com modelos grandes. +* **Limites de Memória da GPU**: Executar numa GPU pode levar a situações em que fica sem memória na GPU, especialmente ao treinar modelos grandes. +* **Consumo de Memória da GPU**: A quantidade de memória da GPU consumida durante o treino depende de vários fatores, incluindo o tamanho do minibatch. +* **Minimize o Tamanho do Minibatch**: Se encontrar problemas de memória na GPU, considere reduzir o tamanho do minibatch no seu código como solução potencial. +* **Libertação de Memória da GPU pelo TensorFlow**: Versões mais antigas do TensorFlow podem não libertar corretamente a memória da GPU ao treinar múltiplos modelos dentro de um kernel Python. Para gerir eficazmente o uso de memória da GPU, pode configurar o TensorFlow para alocar memória da GPU apenas conforme necessário. +* **Inclusão de Código**: Para configurar o TensorFlow para aumentar a alocação de memória da GPU apenas quando necessário, inclua o seguinte código nos seus 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) -``` +``` -Se estiver interessado em aprender sobre PLN numa perspetiva de ML clássico, visite [esta coleção de lições](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP) +Se estiver interessado em aprender sobre PLN a partir de uma perspetiva clássica de ML, visite [esta coleção de lições](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP) ## Nesta Secção -Nesta secção, vamos aprender sobre: +Nesta secção vamos aprender sobre: -* [Representar texto como tensores](13-TextRep/README.md) -* [Embeddings de palavras](14-Emdeddings/README.md) -* [Modelagem de linguagem](15-LanguageModeling/README.md) -* [Redes Neuronais Recorrentes](16-RNN/README.md) -* [Redes Generativas](17-GenerativeNetworks/README.md) -* [Transformers](18-Transformers/README.md) +* [Representar texto como tensores](13-TextRep/README.md) +* [Word Embeddings (Incorporação de Palavras)](14-Emdeddings/README.md) +* [Modelação de Linguagem](15-LanguageModeling/README.md) +* [Redes Neurais Recorrentes](16-RNN/README.md) +* [Redes Generativas](17-GenerativeNetworks/README.md) +* [Transformers](18-Transformers/README.md) -**Aviso Legal**: -Este documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, é importante notar que traduções automáticas podem conter erros ou imprecisões. O documento original na sua língua nativa deve ser considerado a fonte autoritária. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações incorretas decorrentes do uso desta tradução. \ No newline at end of file +--- + + +**Aviso Legal**: +Este documento foi traduzido utilizando o serviço de tradução automática [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos pela precisão, esteja ciente de que traduções automáticas podem conter erros ou imprecisões. O documento original na sua língua nativa deve ser considerado a fonte autorizada. Para informações críticas, recomenda-se tradução profissional humana. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações incorretas resultantes da utilização desta tradução. + \ No newline at end of file diff --git a/translations/ro/.co-op-translator.json b/translations/ro/.co-op-translator.json index 769e67d66a..70f3bd2bf3 100644 --- a/translations/ro/.co-op-translator.json +++ b/translations/ro/.co-op-translator.json @@ -5,6 +5,12 @@ "source_file": "AGENTS.md", "language_code": "ro" }, + "CONTRIBUTING.md": { + "original_hash": "c6fd7e781b67111a90abd166d0ce4aa0", + "translation_date": "2026-07-08T17:38:50+00:00", + "source_file": "CONTRIBUTING.md", + "language_code": "ro" + }, "README.md": { "original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b", "translation_date": "2026-04-06T16:37:47+00:00", @@ -17,6 +23,19 @@ "source_file": "SECURITY.md", "language_code": "ro" }, + "__translation_failures__": { + "lessons/sketchnotes/LICENSE.md": { + "original_hash": "45ab63a2cd8f5faef6c9b150618837a4", + "source_file": "lessons/sketchnotes/LICENSE.md", + "language_code": "ro", + "failure_date": "2026-07-08T17:26:48+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:39+00:00", @@ -54,8 +73,8 @@ "language_code": "ro" }, "examples/README.md": { - "original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7", - "translation_date": "2025-10-03T11:34:10+00:00", + "original_hash": "7883d52c2e2a221e0b07a7b112a149b9", + "translation_date": "2026-07-08T17:21:36+00:00", "source_file": "examples/README.md", "language_code": "ro" }, @@ -66,8 +85,8 @@ "language_code": "ro" }, "lessons/0-course-setup/how-to-run.md": { - "original_hash": "a4717bd9103b9f6cd84d534b83534689", - "translation_date": "2026-01-16T05:26:25+00:00", + "original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1", + "translation_date": "2026-07-08T17:21:58+00:00", "source_file": "lessons/0-course-setup/how-to-run.md", "language_code": "ro" }, @@ -191,6 +210,12 @@ "source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md", "language_code": "ro" }, + "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": { + "original_hash": "99b816b6a4957ef4100cee4c4221dff9", + "translation_date": "2026-07-08T17:17:42+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", + "language_code": "ro" + }, "lessons/4-ComputerVision/08-TransferLearning/lab/README.md": { "original_hash": "7765935c35fcee69b9fe2d0cfd6963e2", "translation_date": "2025-08-25T23:16:44+00:00", @@ -330,8 +355,8 @@ "language_code": "ro" }, "lessons/5-NLP/README.md": { - "original_hash": "8ef02a9318257ea140ed3ed74442096d", - "translation_date": "2025-08-25T21:28:27+00:00", + "original_hash": "038df6f1a73e49f6430740da083bfd6d", + "translation_date": "2026-07-08T17:22:26+00:00", "source_file": "lessons/5-NLP/README.md", "language_code": "ro" }, diff --git a/translations/ro/CONTRIBUTING.md b/translations/ro/CONTRIBUTING.md new file mode 100644 index 0000000000..145393a21b --- /dev/null +++ b/translations/ro/CONTRIBUTING.md @@ -0,0 +1,29 @@ +# Contribuții la AI-For-Beginners + +Vă mulțumim pentru interesul de a contribui la AI-For-Beginners! Salutăm traducerile, corecțiile lecțiilor și corecturile de formatare. + +## Acordul de Licență pentru Contribuitori Microsoft (CLA) + +Acest proiect primește contribuții și sugestii. Majoritatea contribuțiilor necesită să fii de acord cu un Acord de Licență pentru Contribuitori (CLA) prin care declari că ai dreptul și chiar ne acorzi drepturile de a utiliza contribuția ta. Pentru detalii, vizitează [https://cla.microsoft.com](https://cla.microsoft.com). + +Când trimiți un pull request, un CLA-bot va determina automat dacă trebuie să furnizezi un CLA și va decora PR-ul în mod corespunzător (de exemplu, etichetă, comentariu). Urmează pur și simplu instrucțiunile oferite de bot. Va trebui să faci acest lucru o singură dată pentru toate depozitele care folosesc CLA-ul nostru. + +## Cum să contribui + +### 1. Corectarea greșelilor de tastare / erorilor de cod +Dacă găsești o greșeală de tastare sau un bug în vreun fișier Jupyter notebook sau markdown pentru lecții: +1. Creează un fork al depozitului. +2. Corectează greșeala de tastare sau link-ul stricat. +3. Trimite un Pull Request cu o descriere clară a corecției. + +### 2. Trimiterea traducerilor +Salutăm traducerile lecțiilor în alte limbi! Te rugăm să plasezi traducerile în directorul `translations/` folosind numele de foldere existente (de exemplu, `translations/es/`, `translations/pt-BR/`, `translations/zh-CN/`). + +Pentru mai multe detalii, vezi [etc/CONTRIBUTING.md](etc/CONTRIBUTING.md). + +--- + + +**Declinare a responsabilității**: +Acest document a fost tradus folosind serviciul de traducere AI [Co-op Translator](https://github.com/Azure/co-op-translator). În timp ce ne străduim pentru acuratețe, vă rugăm să rețineți că traducerile automate pot conține erori sau inexactități. Documentul original în limba sa nativă trebuie considerat sursa autorizată. Pentru informații critice, se recomandă traducerea profesională realizată de un om. Nu ne asumăm responsabilitatea pentru eventualele neînțelegeri sau interpretări greșite care decurg din utilizarea acestei traduceri. + \ No newline at end of file diff --git a/translations/ro/examples/README.md b/translations/ro/examples/README.md index 517bc9a1b4..ce40e3d7fa 100644 --- a/translations/ro/examples/README.md +++ b/translations/ro/examples/README.md @@ -1,27 +1,27 @@ -# Exemple de AI pentru Începători +# Exemple AI Prietenoase pentru Începători -Bun venit! Acest director conține exemple simple și independente pentru a te ajuta să începi cu AI și învățarea automată. Fiecare exemplu este conceput să fie prietenos pentru începători, cu comentarii detaliate și explicații pas cu pas. +Bine ați venit! Acest director conține exemple simple, independente, pentru a vă ajuta să începeți cu AI și învățarea automată. Fiecare exemplu este conceput să fie prietenos pentru începători, cu comentarii detaliate și explicații pas cu pas. ## 📚 Prezentare Generală a Exemplului | Exemplu | Descriere | Dificultate | Cerințe Prealabile | -|---------|-----------|-------------|--------------------| -| [Hello AI World](../../../examples/01-hello-ai-world.py) | Primul tău program AI - recunoaștere simplă de tipare | ⭐ Începător | Bazele Python | -| [Rețea Neurală Simplă](../../../examples/02-simple-neural-network.py) | Construiește o rețea neurală de la zero | ⭐⭐ Începător+ | Python, matematică de bază | -| [Clasificator de Imagini](./03-image-classifier.ipynb) | Clasifică imagini cu un model pre-antrenat | ⭐⭐ Începător+ | Python, numpy | -| [Sentiment Textual](../../../examples/04-text-sentiment.py) | Analizează sentimentul textului (pozitiv/negativ) | ⭐⭐ Începător+ | Python | +|---------|-------------|------------|---------------| +| [Hello AI World](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/01-hello-ai-world.py) | Primul tău program AI - recunoaștere simplă a pattern-urilor | ⭐ Începător | Bazele Python | +| [Simple Neural Network](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/02-simple-neural-network.py) | Construiește o rețea neurală de la zero | ⭐⭐ Începător+ | Python, matematică de bază | +| [Image Classifier](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/03-image-classifier.ipynb) | Clasifică imagini cu un model pre-antrenat | ⭐⭐ Începător+ | Python, numpy | +| [Text Sentiment](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/04-text-sentiment.py) | Analizează sentimentul textului (pozitiv/negativ) | ⭐⭐ Începător+ | Python | -## 🚀 Începe +## 🚀 Începutul ### Cerințe Prealabile -Asigură-te că ai instalat Python (recomandat 3.8 sau mai nou). Instalează pachetele necesare: +Asigură-te că ai instalat Python (se recomandă versiunea 3.8 sau mai mare). Instalează pachetele necesare: ```bash -# For Python scripts +# Pentru scripturi Python pip install numpy -# For Jupyter notebooks (image classifier) +# Pentru notebook-uri Jupyter (clasificator de imagini) pip install jupyter numpy pillow tensorflow ``` @@ -32,7 +32,7 @@ conda env create --name ai4beg --file ../environment.yml conda activate ai4beg ``` -### Rularea Exemplului +### Executarea Exemplelor **Pentru scripturi Python (.py):** ```bash @@ -44,42 +44,44 @@ python 01-hello-ai-world.py jupyter notebook 03-image-classifier.ipynb ``` -## 📖 Calea de Învățare +## 📖 Traiectoria de Învățare -Recomandăm să urmezi exemplele în ordine: +Vă recomandăm să urmați exemplele în această ordine: -1. **Începe cu "Hello AI World"** - Învață bazele recunoașterii de tipare +1. **Începe cu „Hello AI World”** - Învață bazele recunoașterii pattern-urilor 2. **Construiește o Rețea Neurală Simplă** - Înțelege cum funcționează rețelele neurale 3. **Încearcă Clasificatorul de Imagini** - Vezi AI în acțiune cu imagini reale -4. **Analizează Sentimentul Textual** - Explorează procesarea limbajului natural +4. **Analizează Sentimentul Textului** - Explorează procesarea limbajului natural ## 💡 Sfaturi pentru Începători -- **Citește cu atenție comentariile din cod** - Ele explică ce face fiecare linie +- **Citește cu atenție comentariile din cod** - Explică ce face fiecare linie - **Experimentează!** - Încearcă să schimbi valori și vezi ce se întâmplă - **Nu te îngrijora dacă nu înțelegi totul** - Învățarea necesită timp -- **Pune întrebări** - Folosește [forumul de discuții](https://github.com/microsoft/AI-For-Beginners/discussions) +- **Pune întrebări** - Folosește [panoul de discuții](https://github.com/microsoft/AI-For-Beginners/discussions) -## 🔗 Următorii Pași +## 🔗 Pașii Următori -După ce finalizezi aceste exemple, explorează curriculumul complet: +După ce ai terminat aceste exemple, explorează curriculumul complet: - [Introducere în AI](../lessons/1-Intro/README.md) - [Rețele Neurale](../lessons/3-NeuralNetworks/README.md) - [Viziune Computațională](../lessons/4-ComputerVision/README.md) - [Procesarea Limbajului Natural](../lessons/5-NLP/README.md) -## 🤝 Contribuie +## 🤝 Contribuții -Ai găsit aceste exemple utile? Ajută-ne să le îmbunătățim: +Ți-au fost aceste exemple de ajutor? Ajută-ne să le îmbunătățim: - Raportează probleme sau sugerează îmbunătățiri - Adaugă mai multe exemple pentru începători - Îmbunătățește documentația și comentariile --- -*Ține minte: Fiecare expert a fost odată un începător. Învățare plăcută! 🎓* +*Amintește-ți: Fiecare expert a fost cândva începător. Spor la învățat! 🎓* --- -**Declinare de responsabilitate**: -Acest document a fost tradus folosind serviciul de traducere AI [Co-op Translator](https://github.com/Azure/co-op-translator). Deși ne străduim să asigurăm acuratețea, vă rugăm să fiți conștienți că traducerile automate pot conține erori sau inexactități. Documentul original în limba sa natală ar trebui considerat sursa autoritară. Pentru informații critice, se recomandă traducerea profesională realizată de un specialist. Nu ne asumăm responsabilitatea pentru eventualele neînțelegeri sau interpretări greșite care pot apărea din utilizarea acestei traduceri. \ No newline at end of file + +**Declinare a responsabilității**: +Acest document a fost tradus folosind serviciul de traducere AI [Co-op Translator](https://github.com/Azure/co-op-translator). În timp ce ne străduim pentru acuratețe, vă rugăm să rețineți că traducerile automate pot conține erori sau inexactități. Documentul original în limba sa nativă trebuie considerat sursa autorizată. Pentru informații critice, se recomandă traducerea profesională realizată de un om. Nu ne asumăm responsabilitatea pentru eventualele neînțelegeri sau interpretări greșite care decurg din utilizarea acestei traduceri. + \ No newline at end of file diff --git a/translations/ro/lessons/0-course-setup/how-to-run.md b/translations/ro/lessons/0-course-setup/how-to-run.md index b5804216c6..cb5cdd1128 100644 --- a/translations/ro/lessons/0-course-setup/how-to-run.md +++ b/translations/ro/lessons/0-course-setup/how-to-run.md @@ -1,12 +1,12 @@ # Cum să Rulați Codul -Acest curriculum conține multe exemple și laboratoare executabile pe care veți dori să le rulați. Pentru a face acest lucru, aveți nevoie de posibilitatea de a executa cod Python în Jupyter Notebooks furnizate ca parte a acestui curriculum. Aveți mai multe opțiuni pentru a rula codul: +Acest curriculum conține multe exemple și laboratoare executabile pe care le veți dori să le rulați. Pentru a face acest lucru, aveți nevoie de capacitatea de a executa cod Python în Jupyter Notebooks furnizate ca parte a acestui curriculum. Aveți mai multe opțiuni pentru rularea codului: -## Rulare locală pe calculatorul dvs. +## Rulare locală pe computerul dvs. -Pentru a rula codul local pe calculatorul dvs., este necesară o instalare Python. O recomandare este să instalați **[miniconda](https://conda.io/en/latest/miniconda.html)** - este o instalare relativ ușoară care suportă managerul de pachete `conda` pentru diferite **medii virtuale** Python. +Pentru a rula codul local pe computerul dvs., este necesară o instalare Python. O recomandare este să instalați **[miniconda](https://conda.io/en/latest/miniconda.html)** - este o instalare destul de ușoară care suportă managerul de pachete `conda` pentru diferite **medii virtuale** Python. -După ce instalați miniconda, clonați depozitul și creați un mediu virtual care să fie folosit pentru acest curs: +După ce instalați miniconda, clonați depozitul și creați un mediu virtual care va fi folosit pentru acest curs: ```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 ``` -### Utilizarea Visual Studio Code cu Extensia Python +### Folosind Visual Studio Code cu Extensia Python -Acest curriculum este cel mai bine folosit atunci când îl deschideți în [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) cu [Extensia Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste). +Acest curriculum este cel mai bine folosit deschizându-l în [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) cu [Extensia Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste). -> **Notă**: Odată ce clonați și deschideți directorul în VS Code, acesta vă va sugera automat să instalați extensiile pentru Python. Va trebui, de asemenea, să instalați miniconda așa cum este descris mai sus. +> **Notă**: Odată ce clonați și deschideți directorul în VS Code, acesta vă va sugera automat să instalați extensiile Python. De asemenea, trebuie să instalați miniconda așa cum este descris mai sus. -> **Notă**: Dacă VS Code vă sugerează să redeschideți depozitul într-un container, ar trebui să refuzați această opțiune pentru a folosi instalarea locală Python. +> **Notă**: Dacă VS Code vă sugerează să redeschideți depozitul într-un container, ar trebui să refuzați această opțiune pentru a folosi instalarea Python locală. -### Utilizarea Jupyter în Browser +### Folosind Jupyter în Browser -Puteți, de asemenea, să folosiți un mediu Jupyter din browser pe propriul calculator. Atât Jupyter clasic, cât și JupyterHub oferă un mediu convenabil de dezvoltare cu completare automată, evidențierea codului, etc. +Puteți de asemenea să folosiți un mediu Jupyter din browser pe propriul computer. Atât Jupyter clasic, cât și JupyterHub oferă un mediu de dezvoltare convenabil cu auto-completare, evidențierea codului etc. -Pentru a porni Jupyter local, navigați în directorul cursului și executați: +Pentru a porni Jupyter local, mergeți în directorul cursului și executați: ```bash jupyter notebook @@ -36,36 +36,36 @@ sau ```bash jupyterhub ``` -Apoi puteți naviga la oricare din fișierele `.ipynb`, să le deschideți și să începeți să lucrați. +Puteți apoi naviga la oricare dintre fișierele `.ipynb`, să le deschideți și să începeți lucrul. ### Rulare în container -O alternativă la instalarea Python ar fi să rulați codul într-un container. Deoarece depozitul nostru oferă un folder special `.devcontainer` care indică cum să construiți un container pentru acest repo, VS Code oferă oportunitatea de a redeschide codul în container. Aceasta va necesita instalarea Docker și ar fi mai complexă, așadar recomandăm acest lucru utilizatorilor mai experimentați. +O alternativă la instalarea Python ar fi să rulați codul într-un container. Deoarece depozitul nostru oferă un folder special `.devcontainer` care indică cum să construiți un container pentru acest repo, VS Code oferă posibilitatea de a redeschide codul într-un container. Acest lucru va necesita instalarea Docker și ar fi mai complex, așa că recomandăm această metodă utilizatorilor mai experimentați. ## Rulare în Cloud -Dacă nu doriți să instalați Python local și aveți acces la unele resurse cloud – o alternativă bună este să rulați codul în cloud. Există mai multe moduri în care puteți face asta: +Dacă nu doriți să instalați Python local și aveți acces la unele resurse cloud - o alternativă bună ar fi să rulați codul în cloud. Sunt mai multe moduri prin care puteți face acest lucru: -* Utilizând **[GitHub Codespaces](https://github.com/features/codespaces)**, care este un mediu virtual creat pentru dvs. pe GitHub, accesibil printr-o interfață VS Code în browser. Dacă aveți acces la Codespaces, puteți face pur și simplu clic pe butonul **Code** din repo, începeți un codespace și porniți rapid. -* Utilizând **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) oferă resurse de calcul gratuite furnizate în cloud pentru persoane ca dvs. să testeze cod de pe GitHub. Există un buton pe pagina principală pentru a deschide depozitul în Binder – asta vă va duce rapid pe site-ul Binder, care va construi un container de bază și va porni o interfață web Jupyter pentru dvs. fără probleme. +* Folosind **[GitHub Codespaces](https://github.com/features/codespaces)**, care este un mediu virtual creat pentru dvs. pe GitHub, accesibil printr-o interfață VS Code în browser. Dacă aveți acces la Codespaces, puteți pur și simplu să faceți clic pe butonul **Code** din repo, să porniți un codespace și să începeți rapid. +* Folosind **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) oferă resurse de calcul gratuite furnizate în cloud pentru oameni ca dvs. să testeze cod de pe GitHub. Există un buton pe pagina principală pentru a deschide depozitul în Binder - aceasta vă va duce rapid la site-ul Binder, care va construi un container de bază și va porni o interfață web Jupyter pentru dvs. -> **Notă**: Pentru a preveni utilizarea neadecvată, Binder are acces blocat la unele resurse web. Acest lucru poate împiedica funcționarea unor coduri care descarcă modele și/sau seturi de date de pe Internetul public. Va trebui să găsiți unele soluții alternative. În plus, resursele de calcul oferite de Binder sunt destul de simple, deci antrenamentul va fi lent, mai ales în lecțiile mai complexe ulterioare. +> **Notă**: Pentru a preveni utilizarea necorespunzătoare, Binder are accesul la unele resurse web blocat. Acest lucru poate împiedica funcționarea unor coduri care descarcă modele și/sau seturi de date de pe Internet public. Este posibil să fie nevoie să găsiți câteva soluții alternative. De asemenea, resursele de calcul oferite de Binder sunt destul de limitate, astfel antrenarea va fi lentă, în special în lecțiile ulterioare, mai complexe. ## Rulare în Cloud cu GPU -Unele dintre lecțiile ulterioare din acest curriculum ar beneficia foarte mult de suport GPU. Antrenarea modelului, de exemplu, poate fi dureros de lentă altfel. Există câteva opțiuni pe care le puteți urma, mai ales dacă aveți acces la cloud prin [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) sau prin instituția dvs.: +Unele dintre lecțiile ulterioare din acest curriculum ar beneficia foarte mult de suport GPU. Antrenarea modelelor, de exemplu, poate fi altfel dureros de lentă. Există câteva opțiuni pe care le puteți urma, mai ales dacă aveți acces la cloud prin [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) sau prin instituția dvs.: -* Creați [Mașină Virtuală pentru Data Science](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) și conectați-vă la ea prin Jupyter. Puteți apoi să clonați repo direct pe mașină și să începeți să învățați. Mașinile virtuale din seria NC au suport GPU. +* Creați [Mașina Virtuală pentru Știința Datelor](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) și conectați-vă la ea prin Jupyter. Puteți apoi să clonați repo-ul direct pe mașină și să începeți să învățați. Mașinile virtuale din seria NC au suport GPU. -> **Notă**: Unele abonamente, inclusiv Azure for Students, nu oferă suport GPU din start. Este posibil să trebuiască să solicitați nuclee GPU suplimentare printr-o cerere de asistență tehnică. +> **Notă**: Unele abonamente, inclusiv Azure for Students, nu oferă suport GPU implicit. Este posibil să trebuiască să solicitați nuclee GPU suplimentare printr-un ticket de suport tehnic. -* Creați [Azure Machine Learning Workspace](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) și apoi folosiți funcția Notebook acolo. [Acest video](https://azure-for-academics.github.io/quickstart/azureml-papers/) arată cum să clonați un depozit într-un notebook Azure ML și să începeți să îl folosiți. +* Creați [Workspace Azure Machine Learning](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) și apoi folosiți funcția Notebook acolo. [Acest video](https://azure-for-academics.github.io/quickstart/azureml-papers/) arată cum să clonați un depozit în notebook-ul Azure ML și să începeți să îl folosiți. -De asemenea, puteți folosi Google Colab, care vine cu suport GPU gratuit și puteți încărca acolo Jupyter Notebooks pentru a le executa unul câte unul. +Puteți de asemenea să folosiți Google Colab, care oferă suport GPU gratuit și să încărcați Jupyter Notebooks acolo pentru a le executa unul câte unul. --- -**Declinarea responsabilității**: -Acest document a fost tradus folosind serviciul de traducere AI [Co-op Translator](https://github.com/Azure/co-op-translator). În timp ce ne străduim pentru acuratețe, vă rugăm să rețineți că traducerile automate pot conține erori sau inexactități. Documentul original în limba sa nativă trebuie considerat sursa autorizată. Pentru informații critice, se recomandă traducerea profesională realizată de un specialist. Nu ne asumăm nicio responsabilitate pentru eventualele neînțelegeri sau interpretări greșite rezultate din utilizarea acestei traduceri. +**Declinare a responsabilității**: +Acest document a fost tradus folosind serviciul de traducere AI [Co-op Translator](https://github.com/Azure/co-op-translator). În timp ce ne străduim pentru acuratețe, vă rugăm să rețineți că traducerile automate pot conține erori sau inexactități. Documentul original în limba sa nativă trebuie considerat sursa autorizată. Pentru informații critice, se recomandă traducerea profesională realizată de un om. Nu ne asumăm responsabilitatea pentru eventualele neînțelegeri sau interpretări greșite care decurg din utilizarea acestei traduceri. \ No newline at end of file diff --git a/translations/ro/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/ro/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index f8d4c8a833..2ba8602f84 100644 --- a/translations/ro/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/ro/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -6,9 +6,9 @@ "source": [ "# Modele pre-antrenate și învățarea prin transfer\n", "\n", - "Antrenarea rețelelor CNN poate dura mult timp și necesită o cantitate mare de date. Totuși, o mare parte din acest timp este petrecut pentru a învăța cele mai bune filtre de nivel scăzut pe care o rețea le folosește pentru a extrage tipare din imagini. Apare o întrebare firească - putem folosi o rețea neuronală antrenată pe un set de date și să o adaptăm pentru a clasifica imagini diferite fără a trece prin întregul proces de antrenare?\n", + "Antrenarea CNN-urilor poate dura mult timp și este necesară o cantitate mare de date pentru această sarcină. Totuși, o mare parte din timp este consumată pentru a învăța cele mai bune filtre de nivel scăzut pe care o rețea le folosește pentru a extrage tipare din imagini. Se ridică o întrebare naturală - putem folosi o rețea neuronală antrenată pe un set de date și să o adaptăm pentru clasificarea unor imagini diferite fără a parcurge întregul proces de antrenament?\n", "\n", - "Această abordare se numește **învățare prin transfer**, deoarece transferăm o parte din cunoștințele unui model de rețea neuronală către altul. În învățarea prin transfer, de obicei începem cu un model pre-antrenat, care a fost antrenat pe un set mare de date de imagini, cum ar fi **ImageNet**. Aceste modele sunt deja capabile să extragă diferite caracteristici din imagini generice, iar în multe cazuri, construirea unui clasificator deasupra acestor caracteristici extrase poate oferi un rezultat bun.\n" + "Această abordare se numește **învățare prin transfer**, deoarece transferăm unele cunoștințe de la un model de rețea neuronală la altul. În învățarea prin transfer, în mod tipic începem cu un model pre-antrenat, care a fost antrenat pe un set mare de date de imagini, cum ar fi **ImageNet**. Aceste modele pot face deja o treabă bună în extragerea diferitelor caracteristici din imagini generice, iar în multe cazuri construirea unui clasificator deasupra acestor caracteristici extrase poate oferi un rezultat bun.\n" ] }, { @@ -29,11 +29,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Setul de date Cats vs. Dogs\n", + "## Set de date Pisici vs. Câini\n", "\n", - "În această unitate, vom rezolva o problemă reală de clasificare a imaginilor cu pisici și câini. Din acest motiv, vom folosi [Kaggle Cats vs. Dogs Dataset](https://www.kaggle.com/c/dogs-vs-cats), care poate fi descărcat și [de la Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n", + "În această unitate, vom rezolva o problemă reală de clasificare a imaginilor cu pisici și câini. Din acest motiv, vom folosi [Setul de date Kaggle Pisici vs. Câini](https://www.kaggle.com/c/dogs-vs-cats), care poate fi descărcat și [de la Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n", "\n", - "Să descărcăm acest set de date și să-l extragem în directorul `data` (acest proces poate dura ceva timp!):\n" + "Haideți să descărcăm acest set de date și să-l extragem în directorul `data` (acest proces poate dura ceva timp!):\n" ] }, { @@ -64,7 +64,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Din păcate, există unele fișiere imagine corupte în setul de date. Trebuie să facem o curățare rapidă pentru a verifica fișierele corupte. Pentru a nu afecta acest tutorial, am mutat codul de verificare a setului de date într-un modul.\n" + "Din păcate, există unele fișiere de imagine corupte în setul de date. Trebuie să facem o curățare rapidă pentru a verifica fișierele corupte. Pentru a nu afecta acest tutorial, am mutat codul pentru verificarea setului de date într-un modul.\n" ] }, { @@ -335,11 +335,11 @@ "source": [ "## Încărcarea setului de date\n", "\n", - "În exemplele anterioare, am încărcat seturi de date integrate în Keras. Acum urmează să lucrăm cu propriul nostru set de date, pe care trebuie să-l încărcăm dintr-un director de imagini.\n", + "În exemplele anterioare, am încărcat seturi de date integrate în Keras. Acum urmează să lucrăm cu propriul nostru set de date, pe care trebuie să îl încărcăm dintr-un director cu imagini.\n", "\n", - "În viața reală, dimensiunea seturilor de date de imagini poate fi destul de mare, iar nu ne putem baza pe faptul că toate datele vor încăpea în memorie. Astfel, seturile de date sunt adesea reprezentate ca **generatoare** care pot returna date în minibatch-uri potrivite pentru antrenare.\n", + "În viața reală, dimensiunea seturilor de date cu imagini poate fi destul de mare, iar datele nu pot încăpea toate în memorie. Astfel, seturile de date sunt adesea reprezentate ca **generatoare** care pot returna date în minibatch-uri potrivite pentru antrenare.\n", "\n", - "Pentru a lucra cu clasificarea imaginilor, Keras include funcția specială `image_dataset_from_directory`, care poate încărca imagini din subdirectoare corespunzătoare diferitelor clase. Această funcție se ocupă, de asemenea, de scalarea imaginilor și poate împărți setul de date în subseturi de antrenare și testare:\n" + "Pentru a face față clasificării imaginilor, Keras include funcția specială `image_dataset_from_directory`, care poate încărca imagini din subdirectoare ce corespund claselor diferite. Această funcție se ocupă și de scalarea imaginilor și poate de asemenea împărți setul de date în subseturi pentru antrenare și testare:\n" ] }, { @@ -383,9 +383,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Este important să setați aceeași valoare `seed` pentru ambele apeluri, deoarece aceasta influențează împărțirea imaginilor între setul de date de antrenament și cel de testare.\n", + "Este important să setați aceeași valoare `seed` pentru ambele apeluri, deoarece aceasta afectează împărțirea imaginilor între setul de antrenament și cel de testare.\n", "\n", - "Setul de date preia automat numele claselor din directoare, iar dacă este necesar, le puteți accesa apelând:\n" + "Dataset preia automat numele claselor din directoare și puteți accesa aceste nume dacă este necesar apelând:\n" ] }, { @@ -412,7 +412,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Seturile de date pe care le-am obținut pot fi transmise direct funcției `fit` pentru a antrena modelul. Acestea conțin atât imagini corespunzătoare, cât și etichete, care pot fi parcurse utilizând următoarea construcție:\n" + "Seturile de date pe care le-am obținut pot fi transmise direct funcției `fit` pentru a antrena modelul. Acestea conțin atât imaginile corespunzătoare, cât și etichetele, pe care le puteți parcurge folosind următoarea construcție:\n" ] }, { @@ -453,7 +453,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "> **Notă**: Toate imaginile din setul de date sunt reprezentate ca tensori cu punct flotant, având intervalul 0-255. Înainte de a le transmite rețelei neuronale, trebuie să scalăm aceste valori în intervalul 0-1. Când afișăm imagini, trebuie fie să facem același lucru, fie să convertim valorile în tipul `int` (ceea ce facem în codul de mai sus), pentru a arăta `matplotlib` că dorim să afișăm imaginea originală nescalată.\n" + "> **Notă**: Toate imaginile din setul de date sunt reprezentate ca tensori de puncte flotante cu intervalul 0-255. Înainte de a le transmite rețelei neuronale, trebuie să scalăm aceste valori în intervalul 0-1. Când afișăm imaginile, trebuie fie să facem același lucru, fie să convertim valorile în tipul `int` (așa cum facem în codul de mai sus), pentru a arăta `matplotlib` că dorim să afișăm imaginea originală nescalată.\n" ] }, { @@ -462,7 +462,7 @@ "source": [ "## Modele pre-antrenate\n", "\n", - "Pentru multe sarcini de clasificare a imaginilor, se pot găsi modele de rețele neuronale pre-antrenate. Multe dintre aceste modele sunt disponibile în spațiul de nume `keras.applications`, iar și mai multe modele pot fi găsite pe Internet. Să vedem cum poate fi încărcat și utilizat cel mai simplu model VGG-16:\n" + "Pentru multe sarcini de clasificare a imaginilor se pot găsi modele de rețele neuronale pre-antrenate. Multe dintre aceste modele sunt disponibile în spațiul de nume `keras.applications`, iar și mai multe modele pot fi găsite pe internet. Să vedem cum poate fi încărcat și utilizat cel mai simplu model 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": [ "Există câteva lucruri importante aici:\n", - "* Înainte de a trimite un input către orice rețea pre-antrenată, acesta trebuie pre-procesat într-un anumit mod. Acest lucru se face apelând funcția corespunzătoare `preprocess_input`, care primește un lot de imagini și returnează forma lor procesată. În cazul VGG-16, imaginile sunt normalizate, iar o valoare medie predefinită pentru fiecare canal este scăzută. Acest lucru se datorează faptului că VGG-16 a fost inițial antrenată cu acest tip de pre-procesare.\n", - "* Rețeaua neuronală este aplicată pe lotul de input, iar rezultatul este un lot de tensori cu 1000 de elemente care indică probabilitatea fiecărei clase. Putem găsi numărul clasei celei mai probabile apelând `argmax` pe acest tensor.\n", - "* Rezultatul obținut este un [număr al unei clase din `ImageNet`](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Pentru a înțelege acest rezultat, putem folosi și funcția `decode_predictions`, care returnează primele n clase împreună cu numele lor.\n" + "* Înainte de a transmite o intrare către orice rețea pre-antrenată, aceasta trebuie pre-procesată într-un anumit mod. Acest lucru se face prin apelarea funcției corespunzătoare `preprocess_input`, care primește un set de imagini și returnează forma lor procesată. În cazul VGG-16, imaginile sunt normalizate, iar o valoare medie predefinită pentru fiecare canal este scăzută. Acest lucru se datorează faptului că VGG-16 a fost inițial antrenat cu acest pre-procesare.\n", + "* Rețeaua neuronală este aplicată pe setul de intrări, și primim ca rezultat un lot de tensorii de 1000 de elemente care arată probabilitatea fiecărei clase. Putem găsi numărul clasei cea mai probabilă prin apelarea `argmax` pe acest tensor.\n", + "* Rezultatul obținut este un [număr al unei clase `ImageNet`](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Pentru a înțelege acest rezultat, putem folosi și funcția `decode_predictions`, care returnează primele n clase împreună cu numele lor.\n" ] }, { @@ -597,9 +607,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Calculații GPU\n", + "## Calcul GPU\n", "\n", - "Rețelele neuronale profunde, precum VGG-16 și alte arhitecturi mai moderne, necesită o cantitate considerabilă de putere de calcul pentru a funcționa. Este logic să folosim accelerarea GPU, dacă este disponibilă. Din fericire, Keras accelerează automat calculele pe GPU dacă acesta este disponibil. Putem verifica dacă Tensorflow poate utiliza GPU-ul folosind următorul cod:\n" + "Rețelele neuronale profunde, precum VGG-16 și alte arhitecturi mai moderne, necesită destul de multă putere de calcul pentru a rula. Are sens să folosim accelerarea GPU, dacă este disponibilă. Din fericire, Keras accelerează automat calculele pe GPU dacă acesta este disponibil. Putem verifica dacă Tensorflow poate folosi GPU folosind următorul cod:\n" ] }, { @@ -626,7 +636,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Extragerea caracteristicilor VGG\n", + "\n", + "## Extracția caracteristicilor VGG\n", "\n", "Dacă dorim să folosim VGG-16 pentru a extrage caracteristici din imaginile noastre, avem nevoie de modelul fără straturile finale de clasificare. Putem instanția modelul VGG-16 fără straturile de sus folosind acest cod:\n" ] @@ -680,9 +691,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Dimensiunea tensorului de caracteristici este 7x7x512, dar pentru a-l vizualiza a trebuit să îl transformăm într-o formă 2D.\n", + "Dimensiunea tensorului de caracteristici este 7x7x512, însă pentru a-l vizualiza a trebuit să-l remodelăm în formă 2D.\n", "\n", - "Acum să încercăm să vedem dacă aceste caracteristici pot fi utilizate pentru a clasifica imagini. Să luăm manual o parte din imagini (50 de minibatch-uri, în cazul nostru) și să pre-calculăm vectorii lor de caracteristici. Putem folosi API-ul **dataset** din Tensorflow pentru a face acest lucru. Funcția `map` ia un dataset și aplică o lambda-funcție dată pentru a-l transforma. Folosim acest mecanism pentru a construi noi dataset-uri, `ds_features_train` și `ds_features_test`, care conțin caracteristicile extrase de VGG în locul imaginilor originale.\n" + "Acum să încercăm să vedem dacă aceste caracteristici pot fi folosite pentru a clasifica imagini. Să luăm manual o porțiune de imagini (50 de minibatch-uri, în cazul nostru) și să pre-computăm vectorii lor de caracteristici. Putem folosi API-ul **dataset** din Tensorflow pentru asta. Funcția `map` ia un set de date și aplică o funcție lambda pentru a-l transforma. Folosim acest mecanism pentru a construi noi seturi de date, `ds_features_train` și `ds_features_test`, care conțin caracteristici extrase de VGG în loc de imaginile originale.\n" ] }, { @@ -712,9 +723,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Am folosit construcția `.take(50)` pentru a limita dimensiunea setului de date, pentru a accelera demonstrația noastră. Desigur, puteți efectua acest experiment pe întregul set de date.\n", + "Am folosit construcția `.take(50)` pentru a limita dimensiunea setului de date, pentru a accelera demonstrația noastră. Desigur, puteți efectua acest experiment pe întreg setul de date.\n", "\n", - "Acum că avem un set de date cu caracteristici extrase, putem antrena un clasificator dens simplu pentru a distinge între pisici și câini. Această rețea va primi un vector de caracteristici cu forma (7,7,512) și va produce o ieșire care corespunde fie unui câine, fie unei pisici. Deoarece este o clasificare binară, folosim funcția de activare `sigmoid` și pierderea `binary_crossentropy`.\n" + "Acum că avem un set de date cu caracteristici extrase, putem antrena un clasificator dens simplu pentru a distinge între pisici și câini. Această rețea va lua un vector de caracteristici de formă (7,7,512) și va produce o ieșire care corespunde fie unui câine, fie unei pisici. Deoarece este o clasificare binară, folosim funcția de activare `sigmoid` și pierderea `binary_crossentropy`.\n" ] }, { @@ -743,13 +754,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Rezultatul este grozav, putem distinge între o pisică și un câine cu o probabilitate de aproape 95%! Totuși, am testat această abordare doar pe un subset al tuturor imaginilor, deoarece extragerea manuală a caracteristicilor pare să dureze foarte mult timp.\n", + "Rezultatul este grozav, putem distinge între o pisică și un câine cu o probabilitate de aproape 95%! Totuși, am testat această abordare doar pe un subset din toate imaginile, deoarece extragerea manuală a caracteristicilor pare să ia mult timp.\n", "\n", - "## Transferul învățării folosind o rețea VGG\n", + "## Învățare prin transfer folosind o rețea VGG\n", "\n", - "Putem evita, de asemenea, pre-calcularea manuală a caracteristicilor utilizând întreaga rețea VGG-16 originală în timpul antrenării, adăugând extractorul de caracteristici la rețeaua noastră ca prim strat.\n", + "De asemenea, putem evita precomputarea manuală a caracteristicilor folosind rețeaua VGG-16 originală în întregime în timpul antrenamentului, adăugând extractorul de caracteristici în rețeaua noastră ca primul strat.\n", "\n", - "Frumusețea arhitecturii Keras constă în faptul că modelul VGG-16 pe care l-am definit mai sus poate fi folosit și ca un strat într-o altă rețea neuronală! Trebuie doar să construim o rețea cu un clasificator dens deasupra acestuia și apoi să antrenăm întreaga rețea folosind propagarea înapoi.\n" + "Frumusețea arhitecturii Keras constă în faptul că modelul VGG-16 pe care l-am definit mai sus poate fi folosit și ca strat într-o altă rețea neuronală! Trebuie doar să construim o rețea cu un clasificator dens deasupra sa, și apoi să antrenăm întreaga rețea folosind backpropagation.\n" ] }, { @@ -793,13 +804,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Acest model seamănă cu o rețea de clasificare end-to-end, care primește o imagine și returnează clasa. Totuși, partea complicată este că dorim ca VGG16 să acționeze ca un extractor de caracteristici și să nu fie re-antrenat. Prin urmare, trebuie să **înghețăm greutățile extractorului de caracteristici convoluționale**. Putem accesa primul strat al rețelei apelând `model.layers[0]`, și trebuie doar să setăm proprietatea `trainable` la `False`.\n", + "Acest model arată ca o rețea de clasificare end-to-end, care primește o imagine și returnează clasa. Totuși, lucrul dificil este că dorim ca VGG16 să acționeze ca extragător de caracteristici și să nu fie reantrenat. Astfel, trebuie să **înghețăm greutățile extragătorului convoluțional de caracteristici**. Putem accesa primul strat al rețelei apelând `model.layers[0]`, iar tot ce trebuie să facem este să setăm proprietatea `trainable` la `False`.\n", "\n", - "> **Notă**: Înghețarea greutăților extractorului de caracteristici este necesară, deoarece altfel stratul de clasificare neantrenat poate distruge greutățile originale pre-antrenate ale extractorului convoluțional.\n", + "> **Notă**: Înghețarea greutăților extragătorului de caracteristici este necesară, deoarece altfel stratul neantrenat de clasificare poate distruge greutățile originale pre-antrenate ale extragătorului convoluțional.\n", "\n", - "Poți observa că, deși numărul total de parametri din rețeaua noastră este de aproximativ 15 milioane, antrenăm doar 25k parametri. Toți ceilalți parametri ai filtrelor convoluționale de nivel superior sunt pre-antrenați. Acest lucru este benefic, deoarece putem ajusta un număr mai mic de parametri folosind un număr mai mic de exemple.\n", + "Observați că, în timp ce numărul total de parametri din rețeaua noastră este în jur de 15 milioane, antrenăm doar 25k parametri. Toți ceilalți parametri ai filtrelor convoluționale de nivel superior sunt pre-antrenați. Acest lucru este bine, deoarece putem ajusta un număr mai mic de parametri folosind un număr mai mic de exemple.\n", "\n", - "Vom antrena acum rețeaua noastră și vom vedea cât de bine putem obține rezultate. Așteaptă-te la un timp de rulare destul de lung și nu te îngrijora dacă execuția pare blocată pentru o perioadă.\n" + "Acum vom antrena rețeaua și vom vedea cât de bine poate performa. Așteptați-vă la un timp de execuție destul de lung și nu vă faceți griji dacă execuția pare blocată pentru o perioadă.\n" ] }, { @@ -824,11 +835,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Se pare că am obținut un clasificator destul de precis pentru pisici vs. câini!\n", + "Se pare că am obținut un clasificator destul de precis pentru pisici vs. câini! \n", "\n", - "## Salvarea și încărcarea modelului\n", + "## Salvarea și Încărcarea Modelului\n", "\n", - "După ce am antrenat modelul, putem salva arhitectura modelului și greutățile antrenate într-un fișier pentru utilizare ulterioară:\n" + "Odată ce am antrenat modelul, putem salva arhitectura modelului și greutățile antrenate într-un fișier pentru utilizare viitoare:\n" ] }, { @@ -852,7 +863,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Putem apoi să încărcăm modelul din fișier în orice moment. S-ar putea să fie util în cazul în care următorul experiment distruge modelul - nu ar trebui să începeți de la zero.\n" + "Putem apoi încărca modelul din fișier în orice moment. S-ar putea să vi se pară util în cazul în care următorul experiment distruge modelul - nu va trebui să începeți de la zero.\n" ] }, { @@ -870,13 +881,13 @@ "source": [ "## Ajustarea fină a învățării prin transfer\n", "\n", - "În secțiunea anterioară, am antrenat stratul final al clasificatorului pentru a clasifica imaginile din propriul nostru set de date. Totuși, nu am reantrenat extractorul de caracteristici, iar modelul nostru s-a bazat pe caracteristicile pe care le-a învățat din datele ImageNet. Dacă obiectele tale diferă vizual de imaginile obișnuite din ImageNet, această combinație de caracteristici s-ar putea să nu funcționeze optim. Prin urmare, are sens să începem să antrenăm și straturile convoluționale.\n", + "În secțiunea anterioară, am antrenat stratul final al clasificatorului pentru a clasifica imaginile din propriul nostru set de date. Cu toate acestea, nu am recalibrat extractorul de caracteristici, iar modelul nostru s-a bazat pe caracteristicile pe care le-a învățat din datele ImageNet. Dacă obiectele tale diferă vizual de imaginile obișnuite ImageNet, această combinație de caracteristici s-ar putea să nu funcționeze cel mai bine. Prin urmare, este logic să începem să antrenăm și straturile convoluționale.\n", "\n", - "Pentru a face acest lucru, putem debloca parametrii filtrelor convoluționale pe care i-am blocat anterior.\n", + "Pentru asta, putem debloca parametrii filtrului convoluțional pe care i-am înghețat anterior.\n", "\n", - "> **Notă:** Este important să blocați mai întâi parametrii și să efectuați câteva epoci de antrenament pentru a stabiliza greutățile în stratul de clasificare. Dacă începeți imediat să antrenați rețeaua cap-coadă cu parametrii deblocați, erorile mari pot distruge greutățile pre-antrenate din straturile convoluționale.\n", + "> **Notă:** Este important să înghețați mai întâi parametrii și să efectuați mai multe epoci de antrenament pentru a stabiliza greutățile în stratul de clasificare. Dacă începeți imediat antrenamentul rețelei end-to-end cu parametrii deblocați, erorile mari pot distruge greutățile pre-antrenate din straturile convoluționale.\n", "\n", - "Modelul nostru convoluțional VGG-16 se află în primul strat și este format din multe straturi în sine. Putem analiza structura sa:\n" + "Modelul nostru convoluțional VGG-16 se află în interiorul primului strat și este alcătuit din multe straturi. Putem arunca o privire asupra structurii sale:\n" ] }, { @@ -944,7 +955,9 @@ { "cell_type": "markdown", "metadata": {}, - "source": [] + "source": [ + "Putem debloca toate straturile bazei convoluționale:\n" + ] }, { "cell_type": "code", @@ -959,7 +972,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Cu toate acestea, deblocarea tuturor deodată nu este cea mai bună idee. Putem mai întâi să deblocăm doar câteva straturi finale de convoluții, deoarece acestea conțin modele de nivel superior care sunt relevante pentru imaginile noastre. De exemplu, pentru început, putem bloca toate straturile, cu excepția ultimelor 4:\n" + "Totuși, deblocarea tuturor odată nu este cea mai bună idee. Putem începe prin a debloca doar câteva dintre ultimele straturi de convoluție, deoarece acestea conțin tipare de nivel superior relevante pentru imaginile noastre. De exemplu, pentru început, putem îngheța toate straturile cu excepția ultimelor 4: \n" ] }, { @@ -998,11 +1011,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Observați că numărul de parametri antrenabili a crescut semnificativ, dar este încă în jur de 50% din totalul parametrilor.\n", + "Observați că numărul parametrilor antrenabili a crescut semnificativ, dar este încă în jur de 50% din toți parametrii.\n", "\n", - "După deblocare, putem face câteva epoci suplimentare de antrenament (în exemplul nostru, vom face doar una). De asemenea, puteți selecta o rată de învățare mai mică, pentru a minimiza impactul asupra greutăților pre-antrenate. Totuși, chiar și cu o rată de învățare mică, vă puteți aștepta ca acuratețea să scadă la începutul antrenamentului, până când ajunge în cele din urmă la un nivel ușor mai ridicat decât în cazul greutăților fixe.\n", + "După deblocare, putem efectua câteva epoci suplimentare de antrenament (în exemplul nostru, vom face doar una). De asemenea, puteți selecta o rată de învățare mai mică, pentru a minimiza impactul asupra greutăților pre-antrenate. Totuși, chiar și cu o rată de învățare mică, puteți aștepta o scădere a acurateței la începutul antrenamentului, până când în cele din urmă se atinge un nivel ușor mai ridicat decât în cazul greutăților fixe.\n", "\n", - "> **Notă:** Acest antrenament se desfășoară mult mai lent, deoarece trebuie să propagăm gradientele înapoi prin multe straturi ale rețelei!\n" + "> **Notă:** Acest antrenament se desfășoară mult mai lent, deoarece trebuie să propagăm înapoi gradientii prin multe straturi ale rețelei!\n" ] }, { @@ -1026,9 +1039,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Este probabil să obținem o acuratețe mai mare în antrenare, deoarece folosim o rețea mai puternică, cu mai mulți parametri, dar acuratețea validării nu va crește la fel de mult.\n", + "Este probabil să obținem o acuratețe mai mare la antrenare, deoarece folosim o rețea mai puternică cu mai mulți parametri, dar acuratețea pe datele de validare nu va crește la fel de mult.\n", "\n", - "Simțiți-vă liber să deblocați câteva straturi suplimentare ale rețelei și să antrenați mai mult, pentru a vedea dacă puteți obține o acuratețe mai mare!\n" + "Simțiți-vă liber să deblocați câteva straturi în plus ale rețelei și să antrenați mai mult, pentru a vedea dacă puteți obține o acuratețe mai mare!\n" ] }, { @@ -1037,7 +1050,7 @@ "source": [ "## Alte modele de viziune computerizată\n", "\n", - "VGG-16 este una dintre cele mai simple arhitecturi de viziune computerizată. Keras oferă multe alte rețele pre-antrenate. Cele mai utilizate dintre acestea sunt arhitecturile **ResNet**, dezvoltate de Microsoft, și **Inception** de la Google. De exemplu, să explorăm arhitectura celui mai simplu model ResNet-50 (ResNet este o familie de modele cu adâncimi diferite, puteți încerca să experimentați cu ResNet-152 dacă doriți să vedeți cum arată un model cu adevărat profund):\n" + "VGG-16 este una dintre cele mai simple arhitecturi de viziune computerizată. Keras oferă multe alte rețele pre-antrenate. Cele mai frecvent utilizate dintre acestea sunt arhitecturile **ResNet**, dezvoltate de Microsoft, și **Inception** de Google. De exemplu, să explorăm arhitectura celui mai simplu model ResNet-50 (ResNet este o familie de modele cu adâncimi diferite, poți încerca să experimentezi cu ResNet-152 dacă vrei să vezi cum arată un model cu adevărat profund):\n" ] }, { @@ -1439,29 +1452,29 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Așa cum se poate observa, modelul conține aceleași blocuri de construcție familiare: straturi de convoluție, straturi de pooling și un clasificator dens final. Putem utiliza acest model exact în același mod în care am folosit VGG-16 pentru învățarea transferului. Poți încerca să experimentezi cu codul de mai sus, folosind diferite modele ResNet ca model de bază, și să observi cum se schimbă acuratețea.\n", + "După cum se poate vedea, modelul conține aceleași blocuri familiare de construcție: straturi convoluționale, straturi de pooling și un clasificator dens final. Putem folosi acest model exact în același mod în care am folosit VGG-16 pentru învățarea prin transfer. Puteți încerca să experimentați cu codul de mai sus, folosind diferite modele ResNet ca model de bază, și să vedeți cum se schimbă acuratețea.\n", "\n", - "## Normalizarea Batch-urilor\n", + "## Normalizarea Batch-ului\n", "\n", - "Această rețea conține încă un tip de strat: **Normalizarea Batch-urilor**. Ideea normalizării batch-urilor este de a aduce valorile care trec prin rețeaua neuronală în intervalul corect. De obicei, rețelele neuronale funcționează cel mai bine atunci când toate valorile sunt în intervalul [-1,1] sau [0,1], și acesta este motivul pentru care scalăm/normalizăm datele de intrare corespunzător. Totuși, în timpul antrenării unei rețele profunde, se poate întâmpla ca valorile să iasă semnificativ din acest interval, ceea ce face ca antrenarea să fie problematică. Stratul de normalizare batch calculează media și deviația standard pentru toate valorile din minibatch-ul curent și le folosește pentru a normaliza semnalul înainte de a-l trece printr-un strat al rețelei neuronale. Acest lucru îmbunătățește semnificativ stabilitatea rețelelor profunde.\n" + "Această rețea conține încă un tip de strat: **Normalizarea Batch-ului**. Ideea normalizării batch-ului este să aducă valorile care circulă prin rețeaua neuronală într-un interval corect. De obicei, rețelele neuronale funcționează cel mai bine când toate valorile sunt în intervalul [-1,1] sau [0,1], și acesta este motivul pentru care scalăm/normalizăm datele noastre de intrare în consecință. Totuși, în timpul antrenării unei rețele adânci, se poate întâmpla ca valorile să depășească semnificativ acest interval, ceea ce face antrenamentul problematic. Stratului de normalizare batch calculează media și deviația standard pentru toate valorile minibatch-ului curent și le folosește pentru a normaliza semnalul înainte de a-l transmite printr-un strat al rețelei neuronale. Aceasta îmbunătățește semnificativ stabilitatea rețelelor adânci.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Concluzii\n", + "## Concluzie\n", "\n", - "Folosind învățarea prin transfer, am reușit să realizăm rapid un clasificator pentru sarcina noastră personalizată de clasificare a obiectelor și să obținem o acuratețe ridicată. Totuși, acest exemplu nu a fost complet echitabil, deoarece rețeaua originală VGG-16 a fost pre-antrenată pentru a recunoaște pisici și câini, astfel că am reutilizat majoritatea tiparelor deja prezente în rețea. Te poți aștepta la o acuratețe mai scăzută pentru obiecte mai exotice, specifice unui domeniu, cum ar fi detalii de pe linia de producție dintr-o fabrică sau diferite frunze de copaci.\n", + "Folosind transferul de învățare, am reușit să realizăm rapid un clasificator pentru sarcina noastră personalizată de clasificare a obiectelor și să obținem o precizie ridicată. Totuși, acest exemplu nu a fost complet echitabil, deoarece rețeaua originală VGG-16 a fost pre-antrenată să recunoască pisici și câini, astfel că am reutilizat majoritatea tiparelor deja prezente în rețea. Te poți aștepta la o precizie mai scăzută pentru obiecte mai exotice, specifice unui domeniu, cum ar fi detalii de pe linia de producție într-o fabrică sau diferite frunze de copaci.\n", "\n", - "Se poate observa că sarcinile mai complexe pe care le rezolvăm acum necesită o putere de calcul mai mare și nu pot fi rezolvate ușor pe CPU. În unitatea următoare, vom încerca să folosim o implementare mai ușoară pentru a antrena același model folosind resurse de calcul mai reduse, ceea ce va duce la o scădere doar ușoară a acurateței.\n" + "Se poate observa că sarcinile mai complexe pe care le rezolvăm acum necesită o putere de calcul mai mare și nu pot fi soluționate ușor pe CPU. În unitatea următoare, vom încerca să folosim o implementare mai ușoară pentru a antrena același model folosind resurse de calcul mai reduse, ceea ce va conduce la o precizie doar puțin mai mică. \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**Declinare de responsabilitate**: \nAcest document a fost tradus folosind serviciul de traducere AI [Co-op Translator](https://github.com/Azure/co-op-translator). Deși ne străduim să asigurăm acuratețea, vă rugăm să fiți conștienți că traducerile automate pot conține erori sau inexactități. Documentul original în limba sa natală ar trebui considerat sursa autoritară. Pentru informații critice, se recomandă traducerea profesională realizată de un specialist uman. Nu ne asumăm responsabilitatea pentru eventualele neînțelegeri sau interpretări greșite care pot apărea din utilizarea acestei traduceri.\n" + "---\n\n\n**Declinare a responsabilității**:\nAcest document a fost tradus folosind serviciul de traducere AI [Co-op Translator](https://github.com/Azure/co-op-translator). În timp ce ne străduim pentru acuratețe, vă rugăm să rețineți că traducerile automate pot conține erori sau inexactități. Documentul original în limba sa nativă trebuie considerat sursa autorizată. Pentru informații critice, se recomandă traducerea profesională realizată de un om. Nu ne asumăm responsabilitatea pentru eventualele neînțelegeri sau interpretări greșite care decurg din utilizarea acestei traduceri.\n\n" ] } ], @@ -1482,12 +1495,6 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" - }, - "coopTranslator": { - "original_hash": "c189abc107848f96051085cc30945129", - "translation_date": "2025-08-29T23:19:46+00:00", - "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", - "language_code": "ro" } }, "nbformat": 4, diff --git a/translations/ro/lessons/5-NLP/README.md b/translations/ro/lessons/5-NLP/README.md index 6295bf4199..c55b45e929 100644 --- a/translations/ro/lessons/5-NLP/README.md +++ b/translations/ro/lessons/5-NLP/README.md @@ -1,51 +1,51 @@ # Procesarea Limbajului Natural -![Rezumat al sarcinilor NLP într-un desen](../../../../translated_images/ro/ai-nlp.b22dcb8ca4707cea.webp) +![Rezumat al sarcinilor NLP într-un doodle](../../../../translated_images/ro/ai-nlp.b22dcb8ca4707cea.webp) -În această secțiune, ne vom concentra pe utilizarea Rețelelor Neuronale pentru a rezolva sarcini legate de **Procesarea Limbajului Natural (NLP)**. Există multe probleme NLP pe care ne dorim ca calculatoarele să le poată rezolva: +În această secțiune, ne vom concentra pe utilizarea Rețelelor Neuronale pentru a gestiona sarcini legate de **Procesarea Limbajului Natural (NLP)**. Există multe probleme NLP pe care dorim ca calculatoarele să le poată rezolva: -* **Clasificarea textului** este o problemă tipică de clasificare care implică secvențe de text. Exemple includ clasificarea mesajelor e-mail ca spam sau non-spam, sau categorisirea articolelor ca sport, afaceri, politică etc. De asemenea, atunci când dezvoltăm chatboți, trebuie adesea să înțelegem ce a vrut să spună utilizatorul – în acest caz ne confruntăm cu **clasificarea intenției**. Adesea, în clasificarea intenției, trebuie să gestionăm multe categorii. -* **Analiza sentimentelor** este o problemă tipică de regresie, unde trebuie să atribuim un număr (un sentiment) care corespunde cât de pozitiv/negativ este sensul unei propoziții. O versiune mai avansată a analizei sentimentelor este **analiza sentimentelor bazată pe aspecte** (ABSA), unde atribuim sentimente nu întregii propoziții, ci diferitelor părți ale acesteia (aspecte), de exemplu: *La acest restaurant, mi-a plăcut bucătăria, dar atmosfera a fost groaznică*. -* **Recunoașterea Entităților Numite** (NER) se referă la problema extragerii anumitor entități din text. De exemplu, trebuie să înțelegem că în fraza *Trebuie să zbor la Paris mâine* cuvântul *mâine* se referă la DATA, iar *Paris* este o LOCAȚIE. -* **Extracția de cuvinte cheie** este similară cu NER, dar trebuie să extragem automat cuvinte importante pentru sensul propoziției, fără antrenare prealabilă pentru tipuri specifice de entități. -* **Clusterele de text** pot fi utile atunci când dorim să grupăm propoziții similare, de exemplu, cereri similare în conversațiile de asistență tehnică. -* **Răspunsul la întrebări** se referă la abilitatea unui model de a răspunde la o întrebare specifică. Modelul primește un pasaj de text și o întrebare ca intrări și trebuie să furnizeze un loc în text unde se află răspunsul la întrebare (sau, uneori, să genereze textul răspunsului). -* **Generarea de text** este abilitatea unui model de a genera text nou. Poate fi considerată o sarcină de clasificare care prezice următoarea literă/cuvânt pe baza unui *text prompt*. Modelele avansate de generare de text, cum ar fi GPT-3, pot rezolva alte sarcini NLP folosind o tehnică numită [programare prin prompturi](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) sau [ingineria prompturilor](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29). -* **Sumarizarea textului** este o tehnică prin care dorim ca un computer să "citească" un text lung și să-l rezume în câteva propoziții. -* **Traducerea automată** poate fi privită ca o combinație între înțelegerea textului într-o limbă și generarea textului într-o altă limbă. +* **Clasificarea textului** este o problemă tipică de clasificare referitoare la secvențe de text. Exemple includ clasificarea mesajelor de e-mail ca spam vs. non-spam, sau clasificarea articolelor ca sport, afaceri, politică etc. De asemenea, când dezvoltăm chat bots, adesea trebuie să înțelegem ce a dorit să spună un utilizator -- în acest caz ne ocupăm de **clasificarea intențiilor**. Adesea, în clasificarea intențiilor trebuie să gestionăm multe categorii. +* **Analiza sentimentelor** este o problemă tipică de regresie, unde trebuie să atribuim un număr (un sentiment) corespunzător cât de pozitiv/negativ este înțelesul unei propoziții. O versiune mai avansată a analizei sentimentelor este **analiza sentimentului bazată pe aspecte** (ABSA), unde atribuim sentiment nu întregii propoziții, ci diferitelor părți ale acesteia (aspecte), de ex. *În acest restaurant, mi-a plăcut bucătăria, dar atmosfera a fost groaznică*. +* **Recunoașterea Entităților Nume (NER)** se referă la problema extragerii anumitor entități din text. De exemplu, poate fi necesar să înțelegem că în expresia *Trebuie să zbor la Paris mâine* cuvântul *mâine* se referă la DATĂ, iar *Paris* este o LOCAȚIE. +* **Extracția de cuvinte cheie** este similară cu NER, dar trebuie să extragem automat cuvinte importante pentru înțelesul propoziției, fără a pre-antrena pentru tipuri specifice de entități. +* **Clusterizarea textului** poate fi utilă când dorim să grupăm propoziții similare, de exemplu, solicitări similare în conversații de suport tehnic. +* **Răspunsul la întrebări** se referă la abilitatea unui model de a răspunde la o întrebare specifică. Modelul primește un pasaj de text și o întrebare ca intrări și trebuie să indice un loc în text unde se conține răspunsul la întrebare (sau, uneori, să genereze textul răspunsului). +* **Generarea textului** este abilitatea unui model de a genera text nou. Poate fi considerată o sarcină de clasificare care prezice următoarea literă/cuvânt bazat pe un *prompt de text*. Modelele avansate de generare de text, cum ar fi GPT-3, sunt capabile să rezolve și alte sarcini NLP precum clasificarea folosind o tehnică numită [programare prin prompt](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) sau [inginerie de prompt](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29) +* **Sumarizarea textului** este o tehnică când dorim ca un calculator să "citească" un text lung și să-l rezume în câteva propoziții. +* **Traducerea automată** poate fi privită ca o combinație între înțelegerea textului într-o limbă și generarea textului în alta. -Inițial, majoritatea sarcinilor NLP erau rezolvate folosind metode tradiționale, cum ar fi gramaticile. De exemplu, în traducerea automată, se foloseau parsere pentru a transforma propoziția inițială într-un arbore sintactic, apoi se extrăgeau structuri semantice de nivel superior pentru a reprezenta sensul propoziției, iar pe baza acestui sens și a gramaticii limbii țintă se genera rezultatul. În prezent, multe sarcini NLP sunt rezolvate mai eficient folosind rețele neuronale. +Inițial, majoritatea sarcinilor NLP erau rezolvate folosind metode tradiționale cum ar fi gramatica. De exemplu, în traducerea automată se foloseau parseri pentru a transforma propoziția inițială într-un arbore sintactic, apoi se extrăgeau structuri semantice de nivel înalt pentru a reprezenta sensul propoziției și, pe baza acestui sens și a gramaticii limbii țintă, se genera rezultatul. În prezent, multe sarcini NLP sunt rezolvate mai eficient folosind rețele neuronale. -> Multe metode clasice NLP sunt implementate în biblioteca Python [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org). Există o excelentă [Carte NLTK](https://www.nltk.org/book/) disponibilă online, care acoperă modul în care diferite sarcini NLP pot fi rezolvate folosind NLTK. +> Multe metode clasice NLP sunt implementate în biblioteca Python [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org). Există o excelentă [Carte NLTK](https://www.nltk.org/book/) disponibilă online care acoperă modul în care diferite sarcini NLP pot fi rezolvate folosind NLTK. -În cadrul acestui curs, ne vom concentra în principal pe utilizarea Rețelelor Neuronale pentru NLP și vom folosi NLTK acolo unde este necesar. +În cursul nostru, ne vom concentra mai ales pe utilizarea Rețelelor Neuronale pentru NLP și vom folosi NLTK când este necesar. -Am învățat deja despre utilizarea rețelelor neuronale pentru a lucra cu date tabelare și imagini. Principala diferență între aceste tipuri de date și text este că textul este o secvență de lungime variabilă, în timp ce dimensiunea intrării în cazul imaginilor este cunoscută în avans. Deși rețelele convoluționale pot extrage tipare din datele de intrare, tiparele din text sunt mai complexe. De exemplu, putem avea o negație separată de subiect printr-un număr arbitrar de cuvinte (de exemplu: *Nu îmi plac portocalele* vs. *Nu îmi plac acele portocale mari, colorate și gustoase*), iar acest lucru ar trebui interpretat tot ca un singur tipar. Astfel, pentru a gestiona limbajul, trebuie să introducem noi tipuri de rețele neuronale, cum ar fi *rețelele recurente* și *transformerele*. +Am învățat deja despre utilizarea rețelelor neuronale pentru gestionarea datelor tabelare și a imaginilor. Diferența principală dintre aceste tipuri de date și text este că textul este o secvență de lungime variabilă, în timp ce dimensiunea intrării în cazul imaginilor este cunoscută dinainte. În timp ce rețelele convoluționale pot extrage modele din date de intrare, modelele din text sunt mai complexe. De exemplu, putem avea negarea separată de subiect printr-un număr arbitrar de cuvinte (ex. *Nu îmi plac portocalele*, vs. *Nu îmi plac acele portocale mari colorate și gustoase*), iar aceasta ar trebui să fie interpretată tot ca un pattern. Astfel, pentru a gestiona limbajul, trebuie să introducem noi tipuri de rețele neuronale, cum ar fi *rețelele recurente* și *transformer-ele*. ## Instalarea Bibliotecilor -Dacă utilizați o instalare locală de Python pentru a rula acest curs, este posibil să fie nevoie să instalați toate bibliotecile necesare pentru NLP folosind următoarele comenzi: +Dacă folosești o instalare locală de Python pentru a rula acest curs, poate fi nevoie să instalezi toate bibliotecile necesare pentru NLP folosind următoarele comenzi: **Pentru PyTorch** ```bash -pip install -r requirements-torch.txt +pip install -r requirements-pytorch.txt ``` **Pentru TensorFlow** ```bash pip install -r requirements-tf.txt ``` -> Puteți încerca NLP cu TensorFlow pe [Microsoft Learn](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste) +> Poți încerca NLP cu TensorFlow pe [Microsoft Learn](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste) -## Avertisment GPU +## Atenționare GPU În această secțiune, în unele exemple vom antrena modele destul de mari. -* **Utilizați un computer cu GPU**: Este recomandat să rulați notebook-urile pe un computer cu GPU pentru a reduce timpii de așteptare atunci când lucrați cu modele mari. -* **Constrângeri de memorie GPU**: Rularea pe un GPU poate duce la situații în care rămâneți fără memorie GPU, mai ales când antrenați modele mari. +* **Folosește un calculator cu GPU activat**: Este recomandat să rulezi notebook-urile pe un calculator cu GPU activat pentru a reduce timpii de așteptare când lucrezi cu modele mari. +* **Limitări ale memoriei GPU**: Rularea pe GPU poate duce la situații în care memoria GPU se epuizează, mai ales când se antrenează modele mari. * **Consum de memorie GPU**: Cantitatea de memorie GPU consumată în timpul antrenării depinde de diverși factori, inclusiv dimensiunea minibatch-ului. -* **Minimizați dimensiunea minibatch-ului**: Dacă întâmpinați probleme de memorie GPU, luați în considerare reducerea dimensiunii minibatch-ului în codul dvs. ca o soluție posibilă. -* **Eliberarea memoriei GPU în TensorFlow**: Versiunile mai vechi de TensorFlow pot să nu elibereze corect memoria GPU atunci când antrenați mai multe modele într-un singur kernel Python. Pentru a gestiona eficient utilizarea memoriei GPU, puteți configura TensorFlow să aloce memorie GPU doar atunci când este necesar. -* **Includerea codului**: Pentru a seta TensorFlow să crească alocarea memoriei GPU doar când este necesar, includeți următorul cod în notebook-urile dvs.: +* **Minimizează dimensiunea Minibatch-ului**: Dacă întâmpini probleme cu memoria GPU, ia în considerare reducerea dimensiunii minibatch-ului în codul tău ca soluție potențială. +* **Eliberarea memoriei GPU în TensorFlow**: Versiunile mai vechi de TensorFlow pot să nu elibereze corect memoria GPU când antrenezi mai multe modele într-un singur kernel Python. Pentru a gestiona eficient utilizarea memoriei GPU, poți configura TensorFlow să aloce memoria GPU doar după necesitate. +* **Includerea codului**: Pentru a seta TensorFlow să mărească alocarea memoriei GPU doar când este necesar, include următorul cod în notebook-uri: ```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) ``` -Dacă sunteți interesat să învățați despre NLP dintr-o perspectivă clasică a ML, vizitați [această suită de lecții](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP) +Dacă ești interesat să înveți despre NLP dintr-o perspectivă clasică ML, vizitează [această suită de lecții](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP) -## În această secțiune +## În această Secțiune În această secțiune vom învăța despre: * [Reprezentarea textului ca tensori](13-TextRep/README.md) -* [Încorporări de cuvinte](14-Emdeddings/README.md) +* [Cuvinte încorporate (Word Embeddings)](14-Emdeddings/README.md) * [Modelarea limbajului](15-LanguageModeling/README.md) -* [Rețele Neuronale Recurente](16-RNN/README.md) -* [Rețele Generative](17-GenerativeNetworks/README.md) +* [Rețele neuronale recurente](16-RNN/README.md) +* [Rețele generative](17-GenerativeNetworks/README.md) * [Transformere](18-Transformers/README.md) -**Declinare de responsabilitate**: -Acest document a fost tradus folosind serviciul de traducere AI [Co-op Translator](https://github.com/Azure/co-op-translator). Deși ne străduim să asigurăm acuratețea, vă rugăm să fiți conștienți că traducerile automate pot conține erori sau inexactități. Documentul original în limba sa natală ar trebui considerat sursa autoritară. Pentru informații critice, se recomandă traducerea profesională realizată de un specialist uman. Nu ne asumăm responsabilitatea pentru eventualele neînțelegeri sau interpretări greșite care pot apărea din utilizarea acestei traduceri. \ No newline at end of file +--- + + +**Declinare a responsabilității**: +Acest document a fost tradus folosind serviciul de traducere AI [Co-op Translator](https://github.com/Azure/co-op-translator). În timp ce ne străduim pentru acuratețe, vă rugăm să rețineți că traducerile automate pot conține erori sau inexactități. Documentul original în limba sa nativă trebuie considerat sursa autorizată. Pentru informații critice, se recomandă traducerea profesională realizată de un om. Nu ne asumăm responsabilitatea pentru eventualele neînțelegeri sau interpretări greșite care decurg din utilizarea acestei traduceri. + \ No newline at end of file diff --git a/translations/ru/.co-op-translator.json b/translations/ru/.co-op-translator.json index 042f1ea966..b2b3707c7c 100644 --- a/translations/ru/.co-op-translator.json +++ b/translations/ru/.co-op-translator.json @@ -5,6 +5,12 @@ "source_file": "AGENTS.md", "language_code": "ru" }, + "CONTRIBUTING.md": { + "original_hash": "c6fd7e781b67111a90abd166d0ce4aa0", + "translation_date": "2026-07-08T21:37:26+00:00", + "source_file": "CONTRIBUTING.md", + "language_code": "ru" + }, "README.md": { "original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b", "translation_date": "2026-04-06T21:11:39+00:00", @@ -17,6 +23,19 @@ "source_file": "SECURITY.md", "language_code": "ru" }, + "__translation_failures__": { + "lessons/sketchnotes/LICENSE.md": { + "original_hash": "45ab63a2cd8f5faef6c9b150618837a4", + "source_file": "lessons/sketchnotes/LICENSE.md", + "language_code": "ru", + "failure_date": "2026-07-08T21:26:59+00:00", + "status": "failed", + "error_type": "TranslationIncompleteError", + "error_message": "Markdown translation remained incomplete for chunk 1.1.1 of 'LICENSE.md', and the chunk could not be split further.", + "translator_version": "0.20.0", + "failure_policy_version": 1 + } + }, "etc/CODE_OF_CONDUCT.md": { "original_hash": "c06b12caf3c901eb3156e3dd5b0aea56", "translation_date": "2025-08-26T06:51:51+00:00", @@ -54,8 +73,8 @@ "language_code": "ru" }, "examples/README.md": { - "original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7", - "translation_date": "2025-10-03T11:26:42+00:00", + "original_hash": "7883d52c2e2a221e0b07a7b112a149b9", + "translation_date": "2026-07-08T21:22:27+00:00", "source_file": "examples/README.md", "language_code": "ru" }, @@ -66,8 +85,8 @@ "language_code": "ru" }, "lessons/0-course-setup/how-to-run.md": { - "original_hash": "a4717bd9103b9f6cd84d534b83534689", - "translation_date": "2026-01-15T10:56:41+00:00", + "original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1", + "translation_date": "2026-07-08T21:22:48+00:00", "source_file": "lessons/0-course-setup/how-to-run.md", "language_code": "ru" }, @@ -191,6 +210,12 @@ "source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md", "language_code": "ru" }, + "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": { + "original_hash": "99b816b6a4957ef4100cee4c4221dff9", + "translation_date": "2026-07-08T21:18:49+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", + "language_code": "ru" + }, "lessons/4-ComputerVision/08-TransferLearning/lab/README.md": { "original_hash": "7765935c35fcee69b9fe2d0cfd6963e2", "translation_date": "2025-08-26T06:44:12+00:00", @@ -330,8 +355,8 @@ "language_code": "ru" }, "lessons/5-NLP/README.md": { - "original_hash": "8ef02a9318257ea140ed3ed74442096d", - "translation_date": "2025-08-26T06:34:51+00:00", + "original_hash": "038df6f1a73e49f6430740da083bfd6d", + "translation_date": "2026-07-08T21:23:14+00:00", "source_file": "lessons/5-NLP/README.md", "language_code": "ru" }, diff --git a/translations/ru/CONTRIBUTING.md b/translations/ru/CONTRIBUTING.md new file mode 100644 index 0000000000..555a81fac0 --- /dev/null +++ b/translations/ru/CONTRIBUTING.md @@ -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](https://github.com/Azure/co-op-translator). Несмотря на наши усилия по обеспечению точности, имейте в виду, что автоматический перевод может содержать ошибки или неточности. Оригинальный документ на его исходном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется обратиться к профессиональному человеческому переводу. Мы не несем ответственности за любые недоразумения или неправильные толкования, возникшие в результате использования этого перевода. + \ No newline at end of file diff --git a/translations/ru/examples/README.md b/translations/ru/examples/README.md index 5791895ddc..1020d9754a 100644 --- a/translations/ru/examples/README.md +++ b/translations/ru/examples/README.md @@ -1,27 +1,27 @@ # Примеры ИИ для начинающих -Добро пожаловать! Этот каталог содержит простые, автономные примеры, которые помогут вам начать изучение ИИ и машинного обучения. Каждый пример разработан с учетом потребностей начинающих, с подробными комментариями и пошаговыми объяснениями. +Добро пожаловать! В этой папке содержатся простые, автономные примеры, которые помогут вам начать работу с искусственным интеллектом и машинным обучением. Каждый пример разработан с учётом начинающих — с подробными комментариями и пошаговыми объяснениями. ## 📚 Обзор примеров | Пример | Описание | Сложность | Предварительные знания | -|--------|----------|-----------|-------------------------| -| [Hello AI World](../../../examples/01-hello-ai-world.py) | Ваша первая программа на ИИ — простое распознавание шаблонов | ⭐ Начинающий | Основы Python | -| [Простая нейронная сеть](../../../examples/02-simple-neural-network.py) | Создание нейронной сети с нуля | ⭐⭐ Начинающий+ | Python, базовая математика | -| [Классификатор изображений](./03-image-classifier.ipynb) | Классификация изображений с использованием предварительно обученной модели | ⭐⭐ Начинающий+ | Python, numpy | -| [Анализ текста на тональность](../../../examples/04-text-sentiment.py) | Анализ тональности текста (положительный/отрицательный) | ⭐⭐ Начинающий+ | Python | +|---------|-------------|------------|---------------| +| [Hello AI World](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/01-hello-ai-world.py) | Ваша первая программа ИИ — простое распознавание шаблонов | ⭐ Начинающий | Основы Python | +| [Simple Neural Network](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/02-simple-neural-network.py) | Постройте нейронную сеть с нуля | ⭐⭐ Начинающий+ | Python, базовая математика | +| [Image Classifier](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/03-image-classifier.ipynb) | Классификация изображений с предварительно обученной моделью | ⭐⭐ Начинающий+ | Python, numpy | +| [Text Sentiment](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/04-text-sentiment.py) | Анализ сентимента текста (положительный/отрицательный) | ⭐⭐ Начинающий+ | Python | ## 🚀 Начало работы -### Предварительные требования +### Требования Убедитесь, что у вас установлен Python (рекомендуется версия 3.8 или выше). Установите необходимые пакеты: ```bash -# For Python scripts +# Для скриптов на Python pip install numpy -# For Jupyter notebooks (image classifier) +# Для блокнотов Jupyter (классификатор изображений) pip install jupyter numpy pillow tensorflow ``` @@ -34,52 +34,54 @@ conda activate ai4beg ### Запуск примеров -**Для Python-скриптов (.py файлы):** +**Для скриптов Python (.py файлы):** ```bash python 01-hello-ai-world.py ``` -**Для Jupyter-ноутбуков (.ipynb файлы):** +**Для Jupyter ноутбуков (.ipynb файлы):** ```bash jupyter notebook 03-image-classifier.ipynb ``` -## 📖 Путь обучения +## 📖 Учебный путь -Мы рекомендуем проходить примеры по порядку: +Рекомендуем проходить примеры в следующем порядке: 1. **Начните с "Hello AI World"** — изучите основы распознавания шаблонов -2. **Создайте простую нейронную сеть** — поймите, как работают нейронные сети -3. **Попробуйте классификатор изображений** — увидьте ИИ в действии с реальными изображениями -4. **Анализируйте тональность текста** — исследуйте обработку естественного языка +2. **Постройте простую нейронную сеть** — поймите, как работают нейронные сети +3. **Попробуйте классификатор изображений** — увидьте ИИ в действии на реальных изображениях +4. **Анализ Сентимента Текста** — изучите обработку естественного языка ## 💡 Советы для начинающих - **Внимательно читайте комментарии в коде** — они объясняют, что делает каждая строка -- **Экспериментируйте!** — попробуйте менять значения и наблюдайте за результатами -- **Не переживайте, если что-то непонятно** — обучение требует времени -- **Задавайте вопросы** — используйте [доску обсуждений](https://github.com/microsoft/AI-For-Beginners/discussions) +- **Экспериментируйте!** — меняйте значения и смотрите, что происходит +- **Не переживайте, если что-то не понятно сразу** — обучение требует времени +- **Задавайте вопросы** — используйте [форум обсуждений](https://github.com/microsoft/AI-For-Beginners/discussions) ## 🔗 Следующие шаги -После завершения этих примеров изучите полный курс: +После выполнения этих примеров изучите полный курс: - [Введение в ИИ](../lessons/1-Intro/README.md) - [Нейронные сети](../lessons/3-NeuralNetworks/README.md) - [Компьютерное зрение](../lessons/4-ComputerVision/README.md) - [Обработка естественного языка](../lessons/5-NLP/README.md) -## 🤝 Вклад +## 🤝 Содействие -Эти примеры оказались полезными? Помогите нам их улучшить: +Эти примеры были полезны? Помогите нам их улучшить: - Сообщайте о проблемах или предлагайте улучшения - Добавляйте больше примеров для начинающих - Улучшайте документацию и комментарии --- -*Помните: Каждый эксперт когда-то был новичком. Удачи в обучении! 🎓* +*Помните: каждый эксперт когда-то был новичком. Успешного обучения! 🎓* --- -**Отказ от ответственности**: -Этот документ был переведен с использованием сервиса автоматического перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Несмотря на наши усилия обеспечить точность, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его исходном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникшие в результате использования данного перевода. \ No newline at end of file + +**Отказ от ответственности**: +Этот документ был переведен с использованием сервиса машинного перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Несмотря на наши усилия по обеспечению точности, имейте в виду, что автоматический перевод может содержать ошибки или неточности. Оригинальный документ на его исходном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется обратиться к профессиональному человеческому переводу. Мы не несем ответственности за любые недоразумения или неправильные толкования, возникшие в результате использования этого перевода. + \ No newline at end of file diff --git a/translations/ru/lessons/0-course-setup/how-to-run.md b/translations/ru/lessons/0-course-setup/how-to-run.md index 3d72e43a5e..5a8bf2e37e 100644 --- a/translations/ru/lessons/0-course-setup/how-to-run.md +++ b/translations/ru/lessons/0-course-setup/how-to-run.md @@ -1,12 +1,12 @@ -# Как запустить код +# Как запускать код -В этой программе содержится множество исполняемых примеров и лабораторных работ, которые вы захотите запустить. Для этого вам нужна возможность выполнять код на Python в Jupyter Notebook, предоставленных в рамках этой программы. У вас есть несколько вариантов запуска кода: +В этой учебной программе много исполняемых примеров и лабораторных работ, которые вы наверняка захотите запустить. Для этого необходимо уметь выполнять код Python в Jupyter Notebook, предоставленных в рамках этой программы. У вас есть несколько вариантов запуска кода: ## Запуск локально на вашем компьютере -Для запуска кода локально на вашем компьютере необходима установка Python. Одним из рекомендованных вариантов является установка **[miniconda](https://conda.io/en/latest/miniconda.html)** — это достаточно легковесная установка, которая поддерживает менеджер пакетов `conda` для создания различных **виртуальных окружений** Python. +Для запуска кода локально на компьютере нужна установка Python. Одной из рекомендаций является установка **[miniconda](https://conda.io/en/latest/miniconda.html)** — это достаточно легкий установочный пакет, который поддерживает пакетный менеджер `conda` для различных Python **виртуальных окружений**. -После установки miniconda склонируйте репозиторий и создайте виртуальное окружение, которое будет использоваться для этого курса: +После установки miniconda клонируйте репозиторий и создайте виртуальное окружение для использования в этом курсе: ```bash git clone http://github.com/microsoft/ai-for-beginners @@ -17,17 +17,17 @@ conda activate ai4beg ### Использование Visual Studio Code с расширением Python -Эта программа лучше всего используется при открытии в [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) с расширением [Python Extension](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste). +Эта учебная программа лучше всего используется при открытии в [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) с установкой [Python Extension](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste). -> **Примечание**: После клонирования и открытия каталога в VS Code, он автоматически предложит установить расширение Python. Также необходимо будет установить miniconda, как описано выше. +> **Примечание**: После клонирования и открытия папки в VS Code будет автоматически предложено установить расширения Python. Также нужно установить miniconda, как описано выше. -> **Примечание**: Если VS Code предлагает открыть репозиторий в контейнере, стоит отказаться от этого, чтобы использовать локальную установку Python. +> **Примечание**: Если VS Code предложит переоткрыть репозиторий в контейнере, следует отказаться, чтобы пользоваться локальной установкой Python. ### Использование Jupyter в браузере -Вы также можете использовать среду Jupyter из браузера на вашем компьютере. Как классический Jupyter, так и JupyterHub предоставляют удобную среду разработки с автодополнением, подсветкой кода и др. +Вы также можете использовать среду Jupyter из браузера на своем компьютере. Классический Jupyter и JupyterHub предоставляют удобную среду разработки с автозаполнением, подсветкой кода и другими функциями. -Чтобы запустить Jupyter локально, перейдите в каталог курса и выполните: +Для запуска Jupyter локально перейдите в директорию курса и выполните: ```bash jupyter notebook @@ -36,36 +36,36 @@ jupyter notebook ```bash jupyterhub ``` -После этого вы сможете перейти к любому из файлов `.ipynb`, открыть их и начать работу. +Затем вы можете открыть любой файл с расширением `.ipynb`, открыть его и начать работу. ### Запуск в контейнере -Альтернативой установке Python может быть запуск кода в контейнере. Поскольку в нашем репозитории есть специальная папка `.devcontainer`, которая содержит инструкции по сборке контейнера для этого репозитория, VS Code дает возможность заново открыть код в контейнере. Это требует установки Docker и более сложной настройки, поэтому мы рекомендуем этот вариант для более опытных пользователей. +Альтернативой установке Python является запуск кода в контейнере. Поскольку в нашем репозитории есть специальная папка `.devcontainer`, которая описывает, как собрать контейнер для данного репозитория, VS Code предлагает открыть код в контейнере. Для этого потребуется установка Docker, и данный способ сложнее, поэтому его рекомендуют более опытным пользователям. ## Запуск в облаке -Если вы не хотите устанавливать Python локально и у вас есть доступ к облачным ресурсам, хорошей альтернативой будет запуск кода в облаке. Есть несколько способов сделать это: +Если вы не хотите устанавливать Python локально и имеете доступ к облачным ресурсам, хорошим вариантом будет запуск кода в облаке. Есть несколько способов сделать это: -* Использование **[GitHub Codespaces](https://github.com/features/codespaces)** — виртуальная среда, созданная для вас на GitHub, доступная через браузерный интерфейс VS Code. Если у вас есть доступ к Codespaces, просто нажмите кнопку **Code** в репозитории, запустите codespace и начните работу быстро. -* Использование **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) предлагает бесплатные вычислительные ресурсы в облаке для людей, как вы, чтобы тестировать код с GitHub. На главной странице есть кнопка для открытия репозитория в Binder — это быстро приведет вас на сайт Binder, который создаст контейнер и запустит веб-интерфейс Jupyter для вас. +* Использовать **[GitHub Codespaces](https://github.com/features/codespaces)** — это виртуальная среда, созданная для вас на GitHub, доступная через браузерный интерфейс VS Code. Если у вас есть доступ к Codespaces, просто нажмите кнопку **Code** в репозитории, запустите codespace и начните работу за считанные минуты. +* Использовать **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) предоставляет бесплатные вычислительные ресурсы в облаке для тестирования кода с GitHub. На главной странице есть кнопка для запуска репозитория в Binder — это быстро перенаправит вас на сайт Binder, который соберет контейнер и запустит веб-интерфейс Jupyter. -> **Примечание**: Для предотвращения злоупотреблений у Binder заблокирован доступ к некоторым веб-ресурсам. Это может помешать работе некоторых частей кода, которые загружают модели и/или наборы данных из интернета. Возможно, потребуется поискать обходные пути. Кроме того, предоставляемые Binder вычислительные ресурсы довольно ограничены, поэтому обучение будет медленным, особенно в более поздних, сложных уроках. +> **Примечание**: Чтобы предотвратить злоупотребления, Binder блокирует доступ к некоторым веб-ресурсам. Это может помешать работе части кода, который загружает модели и/или наборы данных из интернета. Возможно, придётся искать обходные пути. Кроме того, предоставляемые биредовательные мощности у Binder достаточно базовые, поэтому обучение будет идти медленно, особенно на поздних, более сложных уроках. -## Запуск в облаке с GPU +## Запуск в облаке с поддержкой GPU -Некоторые из поздних уроков этой программы значительно выиграют от поддержки GPU. Например, обучение моделей может быть чрезвычайно медленным без нее. Есть несколько вариантов, если у вас есть доступ к облаку, например, через [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) или через ваше учебное учреждение: +Некоторые из более поздних уроков в этой программе сильно выигрывают от поддержки GPU. Обучение моделей, например, без этой поддержки будет очень медленным. Есть несколько вариантов, особенно если у вас есть доступ к облаку через [Azure для студентов](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) или через ваше учебное заведение: -* Создайте [Data Science Virtual Machine](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) и подключитесь к ней через Jupyter. Вы можете клонировать репозиторий непосредственно на машину и начать учиться. Виртуальные машины серии NC поддерживают GPU. +* Создать [виртуальную машину для науки о данных](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) и подключиться к ней через Jupyter. Затем можно клонировать репозиторий прямо на машине и начать обучение. Виртуальные машины серии NC поддерживают GPU. -> **Примечание**: Некоторые подписки, включая Azure for Students, изначально не предоставляют поддержку GPU. Возможно, потребуется подать запрос в техническую поддержку для получения дополнительных ядер GPU. +> **Примечание**: Некоторые подписки, включая Azure для студентов, не предоставляют поддержку GPU изначально. Возможно, потребуется запросить дополнительные GPU-ядра через техническую поддержку. -* Создайте [Azure Machine Learning Workspace](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) и используйте функцию Notebook там. [Это видео](https://azure-for-academics.github.io/quickstart/azureml-papers/) показывает, как клонировать репозиторий в Azure ML notebook и начать работу. +* Создать [рабочее пространство Azure Machine Learning](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) и использовать там функцию Notebook. [Это видео](https://azure-for-academics.github.io/quickstart/azureml-papers/) показывает, как клонировать репозиторий в Azure ML notebook и начать работу. -Вы также можете использовать Google Colab, который предоставляет некоторую бесплатную поддержку GPU, и загружать туда Jupyter Notebook для их последовательного выполнения. +Вы также можете использовать Google Colab, который предоставляет бесплатную поддержку GPU, и загружать туда Jupyter Notebook для поочередного выполнения. --- **Отказ от ответственности**: -Этот документ был переведен с помощью сервиса автоматического перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Несмотря на наши усилия по обеспечению точности, просим учитывать, что автоматический перевод может содержать ошибки или неточности. Оригинальный документ на его исходном языке следует считать авторитетным источником. Для критически важной информации рекомендуется использовать профессиональный перевод, выполненный человеком. Мы не несем ответственности за любые недоразумения или неправильные толкования, возникшие в результате использования данного перевода. +Этот документ был переведен с использованием сервиса машинного перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Несмотря на наши усилия по обеспечению точности, имейте в виду, что автоматический перевод может содержать ошибки или неточности. Оригинальный документ на его исходном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется обратиться к профессиональному человеческому переводу. Мы не несем ответственности за любые недоразумения или неправильные толкования, возникшие в результате использования этого перевода. \ No newline at end of file diff --git a/translations/ru/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/ru/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index 0078ceac21..196a6111ca 100644 --- a/translations/ru/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/ru/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -4,11 +4,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Предобученные модели и перенос обучения\n", + "# Предварительно обученные модели и перенос обучения\n", "\n", - "Обучение CNN может занимать много времени, а для этой задачи требуется большое количество данных. Однако значительная часть времени уходит на изучение лучших низкоуровневых фильтров, которые сеть использует для извлечения паттернов из изображений. Возникает естественный вопрос — можем ли мы использовать нейронную сеть, обученную на одном наборе данных, и адаптировать её для классификации других изображений без полного процесса обучения?\n", + "Обучение сверточных нейронных сетей может занять много времени, и для этой задачи требуется большое количество данных. Однако значительная часть времени уходит на обучение лучших низкоуровневых фильтров, которые сеть использует для извлечения паттернов из изображений. Возникает естественный вопрос — можем ли мы использовать нейронную сеть, обученную на одном наборе данных, и адаптировать её к классификации других изображений без полного процесса обучения?\n", "\n", - "Этот подход называется **переносом обучения**, потому что мы переносим часть знаний от одной модели нейронной сети к другой. В переносе обучения мы обычно начинаем с предобученной модели, которая была обучена на каком-либо крупном наборе изображений, например, **ImageNet**. Эти модели уже хорошо справляются с извлечением различных признаков из общих изображений, и во многих случаях построение классификатора поверх этих извлечённых признаков может дать хороший результат.\n" + "Этот подход называется **переносом обучения**, поскольку мы переносим часть знаний из одной модели нейронной сети в другую. В переносе обучения мы обычно начинаем с предварительно обученной модели, которая была обучена на некотором большом наборе изображений, например, на **ImageNet**. Такие модели уже хорошо справляются с извлечением различных признаков из универсальных изображений, и во многих случаях достаточно построить классификатор на основе этих извлечённых признаков, чтобы получить хороший результат.\n" ] }, { @@ -29,11 +29,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Набор данных \"Кошки против собак\"\n", + "## Набор данных Коты против Собак\n", "\n", - "В этом разделе мы решим реальную задачу классификации изображений кошек и собак. Для этого мы будем использовать [Kaggle Cats vs. Dogs Dataset](https://www.kaggle.com/c/dogs-vs-cats), который также можно скачать [с сайта Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n", + "В этом разделе мы решим практическую задачу классификации изображений котов и собак. Для этого мы будем использовать [набор данных Kaggle Cats vs. Dogs](https://www.kaggle.com/c/dogs-vs-cats), который также можно скачать [с сайта Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n", "\n", - "Давайте скачаем этот набор данных и извлечем его в директорию `data` (этот процесс может занять некоторое время!):\n" + "Давайте скачиваем этот набор данных и распакуем его в директорию `data` (этот процесс может занять некоторое время!):\n" ] }, { @@ -64,7 +64,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "К сожалению, в наборе данных есть некоторые поврежденные файлы изображений. Нам нужно быстро очистить данные, чтобы проверить наличие поврежденных файлов. Чтобы не загромождать этот учебник, мы перенесли код для проверки набора данных в модуль.\n" + "К сожалению, в наборе данных есть несколько повреждённых файлов изображений. Нам нужно быстро их проверить и очистить от повреждённых файлов. Чтобы не загромождать этот учебник, мы вынесли код для проверки набора данных в отдельный модуль.\n" ] }, { @@ -335,11 +335,11 @@ "source": [ "## Загрузка набора данных\n", "\n", - "В предыдущих примерах мы загружали наборы данных, встроенные в Keras. Теперь мы будем работать с собственным набором данных, который нужно загрузить из директории с изображениями.\n", + "В предыдущих примерах мы загружали наборы данных, встроенные в Keras. Теперь мы будем работать с нашим собственным набором данных, который нужно загрузить из каталога с изображениями.\n", "\n", - "В реальной жизни размер наборов данных изображений может быть довольно большим, и нельзя рассчитывать, что все данные поместятся в оперативной памяти. Поэтому наборы данных часто представляются в виде **генераторов**, которые могут возвращать данные небольшими партиями, подходящими для обучения.\n", + "В реальной жизни размер наборов данных с изображениями может быть достаточно большим, и нельзя полагаться на то, что все данные поместятся в память. Поэтому наборы данных часто представлены в виде **генераторов**, которые могут возвращать данные небольшими партиями, подходящими для обучения.\n", "\n", - "Для работы с классификацией изображений Keras включает специальную функцию `image_dataset_from_directory`, которая может загружать изображения из поддиректорий, соответствующих различным классам. Эта функция также автоматически масштабирует изображения и может разделить набор данных на обучающую и тестовую выборки:\n" + "Для работы с задачей классификации изображений Keras включает специальную функцию `image_dataset_from_directory`, которая может загружать изображения из подкаталогов, соответствующих разным классам. Эта функция также заботится о масштабировании изображений и может разделять набор данных на обучающую и тестовую части:\n" ] }, { @@ -383,9 +383,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Важно установить одинаковое значение `seed` для обоих вызовов, так как оно влияет на разделение изображений между обучающим и тестовым наборами данных.\n", + "Важно установить одинаковое значение `seed` для обоих вызовов, так как это влияет на разделение изображений между обучающим и тестовым наборами данных.\n", "\n", - "Набор данных автоматически считывает названия классов из директорий, и вы можете получить к ним доступ, если это необходимо, вызвав:\n" + "Dataset автоматически получает имена классов из каталогов, и вы можете получить к ним доступ, если это необходимо, вызвав:\n" ] }, { @@ -412,7 +412,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Наборы данных, которые мы получили, могут быть напрямую переданы в функцию `fit` для обучения модели. Они содержат как соответствующие изображения, так и метки, которые можно перебрать с помощью следующей конструкции:\n" + "Наборы данных, которые мы получили, могут быть напрямую переданы функции `fit` для обучения модели. Они содержат как соответствующие изображения, так и метки, по которым можно выполнять цикл с использованием следующей конструкции:\n" ] }, { @@ -453,16 +453,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "> **Примечание**: Все изображения в наборе данных представлены в виде тензоров с плавающей точкой в диапазоне 0-255. Перед передачей их в нейронную сеть, нам нужно масштабировать эти значения в диапазон 0-1. При отображении изображений мы также должны сделать то же самое или преобразовать значения в тип `int` (что мы делаем в коде выше), чтобы показать `matplotlib`, что мы хотим отобразить оригинальное немасштабированное изображение.\n" + "> **Примечание**: Все изображения в наборе данных представлены в виде тензоров с плавающей точкой в диапазоне 0-255. Перед передачей их в нейронную сеть необходимо масштабировать эти значения в диапазон 0-1. При построении графиков изображений нам нужно либо сделать то же самое, либо преобразовать значения в тип `int` (что мы и делаем в коде выше), чтобы показать `matplotlib`, что мы хотим отобразить оригинальное немасштабированное изображение.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Предобученные модели\n", + "## Предварительно обученные модели\n", "\n", - "Для многих задач классификации изображений можно найти предобученные модели нейронных сетей. Многие из этих моделей доступны в пространстве имен `keras.applications`, а еще больше моделей можно найти в Интернете. Давайте посмотрим, как можно загрузить и использовать самую простую модель VGG-16:\n" + "Для многих задач классификации изображений можно найти предварительно обученные модели нейронных сетей. Многие из этих моделей доступны внутри пространства имен `keras.applications`, а еще больше моделей можно найти в Интернете. Давайте посмотрим, как можно загрузить и использовать простейшую модель VGG-16:\n" ] }, { @@ -497,7 +497,17 @@ } ], "source": [ - "vgg = keras.applications.VGG16()\n", + "# SHA-256 of VGG16 weights (with top)\n", + "VGG16_WEIGHTS_SHA256 = '64373286793e3c8b2b4e3219cbf3544bce2f55ab4682710a29f5e7af8f5e4f61'\n", + "\n", + "_weights_path = keras.utils.get_file(\n", + " 'vgg16_weights_tf_dim_ordering_tf_kernels.h5',\n", + " 'https://storage.googleapis.com/tensorflow/keras-applications/vgg16/vgg16_weights_tf_dim_ordering_tf_kernels.h5',\n", + " file_hash=VGG16_WEIGHTS_SHA256,\n", + " hash_algorithm='sha256',\n", + ")\n", + "\n", + "vgg = keras.applications.VGG16(weights=_weights_path)\n", "inp = keras.applications.vgg16.preprocess_input(x_sample[:1])\n", "\n", "res = vgg(inp)\n", @@ -510,11 +520,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Есть несколько важных моментов:\n", - "\n", - "* Перед тем как передать входные данные в любую предварительно обученную сеть, их необходимо предварительно обработать определенным образом. Это выполняется с помощью вызова соответствующей функции `preprocess_input`, которая принимает пакет изображений и возвращает их обработанную форму. В случае VGG-16 изображения нормализуются, и из каждого канала вычитается заранее определенное среднее значение. Это связано с тем, что VGG-16 изначально обучалась с таким предварительным обработкой.\n", - "* Нейронная сеть применяется к входному пакету, и в результате мы получаем пакет тензоров из 1000 элементов, которые показывают вероятность каждого класса. Мы можем найти номер наиболее вероятного класса, вызвав `argmax` для этого тензора.\n", - "* Полученный результат — это [номер класса из `ImageNet`](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Чтобы понять этот результат, можно также использовать функцию `decode_predictions`, которая возвращает n наиболее вероятных классов вместе с их названиями.\n" + "Здесь есть несколько важных моментов:\n", + "* Перед передачей входных данных в любую предварительно обученную сеть они должны быть предварительно обработаны определённым образом. Это делается вызовом соответствующей функции `preprocess_input`, которая принимает пакет изображений и возвращает их обработанную форму. В случае VGG-16 изображения нормализуются, и из каждого канала вычитается заранее определённое среднее значение. Это связано с тем, что VGG-16 изначально обучалась с такой предобработкой.\n", + "* К входному пакету применяется нейронная сеть, и в результате мы получаем пакет тензоров размером 1000 элементов, которые показывают вероятность каждого класса. Мы можем найти номер наиболее вероятного класса, вызвав `argmax` для этого тензора.\n", + "* Полученный результат — это [номер класса из `ImageNet`](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Чтобы понять этот результат, мы также можем использовать функцию `decode_predictions`, которая возвращает n лучших классов вместе с их именами.\n" ] }, { @@ -600,7 +609,7 @@ "source": [ "## Вычисления на GPU\n", "\n", - "Глубокие нейронные сети, такие как VGG-16 и другие более современные архитектуры, требуют значительных вычислительных ресурсов для работы. Поэтому имеет смысл использовать ускорение на GPU, если оно доступно. К счастью, Keras автоматически ускоряет вычисления на GPU, если оно доступно. Мы можем проверить, может ли Tensorflow использовать GPU, с помощью следующего кода:\n" + "Глубокие нейронные сети, такие как VGG-16 и другие более современные архитектуры, требуют довольно много вычислительных ресурсов для работы. Логично использовать ускорение на GPU, если оно доступно. К счастью, Keras автоматически ускоряет вычисления на GPU, если он доступен. Мы можем проверить, способен ли Tensorflow использовать GPU, используя следующий код:\n" ] }, { @@ -627,9 +636,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Извлечение признаков с помощью VGG\n", "\n", - "Если мы хотим использовать VGG-16 для извлечения признаков из наших изображений, нам нужен модель без финальных слоев классификации. Мы можем создать модель VGG-16 без верхних слоев, используя следующий код:\n" + "## Извлечение признаков VGG\n", + "\n", + "Если мы хотим использовать VGG-16 для извлечения признаков из наших изображений, нам нужна модель без финальных классификационных слоев. Мы можем инициализировать модель VGG-16 без верхних слоев, используя этот код:\n" ] }, { @@ -681,9 +691,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Размерность тензора признаков составляет 7x7x512, но для визуализации нам пришлось преобразовать его в 2D-форму.\n", + "Размерность тензора признаков 7x7x512, но для визуализации нам пришлось преобразовать его в 2D форму.\n", "\n", - "Теперь давайте попробуем выяснить, можно ли использовать эти признаки для классификации изображений. Возьмем вручную некоторую часть изображений (в нашем случае 50 минибатчей) и предварительно вычислим их векторные представления признаков. Для этого мы можем использовать API **dataset** из Tensorflow. Функция `map` принимает датасет и применяет заданную lambda-функцию для его преобразования. Мы используем этот механизм, чтобы создать новые датасеты, `ds_features_train` и `ds_features_test`, которые содержат признаки, извлеченные с помощью VGG, вместо оригинальных изображений.\n" + "Теперь давайте попробуем проверить, можно ли использовать эти признаки для классификации изображений. Вручную возьмём некоторую часть изображений (50 минибатчей в нашем случае) и предварительно вычислим для них вектор признаков. Мы можем использовать API **dataset** Tensorflow для этого. Функция `map` принимает набор данных и применяет к нему заданную лямбда-функцию для преобразования. Мы используем этот механизм для построения новых наборов данных, `ds_features_train` и `ds_features_test`, которые содержат признаки, извлечённые с помощью VGG, вместо исходных изображений.\n" ] }, { @@ -713,9 +723,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Мы использовали конструкцию `.take(50)` для ограничения размера набора данных, чтобы ускорить демонстрацию. Конечно, вы можете провести этот эксперимент на полном наборе данных.\n", + "Мы использовали конструкцию `.take(50)`, чтобы ограничить размер набора данных и ускорить нашу демонстрацию. Конечно, вы можете провести этот эксперимент на полном наборе данных.\n", "\n", - "Теперь, когда у нас есть набор данных с извлеченными признаками, мы можем обучить простой плотный классификатор для различения кошек и собак. Эта сеть будет принимать вектор признаков формы (7,7,512) и выдавать один результат, который соответствует либо собаке, либо кошке. Поскольку это бинарная классификация, мы используем функцию активации `sigmoid` и функцию потерь `binary_crossentropy`.\n" + "Теперь, когда у нас есть набор данных с извлечёнными признаками, мы можем обучить простой плотный классификатор для различения кошек и собак. Эта сеть будет принимать вектор признаков формы (7,7,512) и выдавать один выход, который соответствует либо собаке, либо кошке. Поскольку это задача бинарной классификации, мы используем функцию активации `sigmoid` и функцию потерь `binary_crossentropy`.\n" ] }, { @@ -744,13 +754,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Результат впечатляющий, мы можем различать кошку и собаку с вероятностью почти 95%! Однако мы протестировали этот подход только на подмножестве всех изображений, так как ручное извлечение признаков занимает много времени.\n", + "Результат отличный, мы можем с вероятностью почти 95% отличить кошку от собаки! Однако мы протестировали этот подход только на подмножестве всех изображений, потому что ручное извлечение признаков занимает много времени.\n", "\n", "## Трансферное обучение с использованием одной сети VGG\n", "\n", - "Мы также можем избежать ручного предварительного вычисления признаков, используя оригинальную сеть VGG-16 целиком во время обучения, добавив извлечение признаков в нашу сеть в качестве первого слоя.\n", + "Мы также можем избежать ручного предварительного вычисления признаков, используя исходную сеть VGG-16 целиком во время обучения, добавив извлекатель признаков в нашу сеть в качестве первого слоя.\n", "\n", - "Прелесть архитектуры Keras заключается в том, что модель VGG-16, которую мы определили выше, может быть использована как слой в другой нейронной сети! Нам просто нужно построить сеть с плотным классификатором поверх нее, а затем обучить всю сеть с использованием обратного распространения.\n" + "Прелесть архитектуры Keras в том, что модель VGG-16, которую мы определили выше, также может быть использована как слой в другой нейронной сети! Нам просто нужно построить сеть с плотным классификатором поверх неё, а затем обучать всю сеть с помощью обратного распространения ошибки.\n" ] }, { @@ -794,13 +804,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Эта модель выглядит как сеть для классификации \"от конца до конца\", которая принимает изображение и возвращает класс. Однако сложность заключается в том, что мы хотим, чтобы VGG16 работала как извлекатель признаков, а не переобучалась. Поэтому нам нужно **заморозить веса сверточного извлекателя признаков**. Мы можем получить доступ к первому слою сети, вызвав `model.layers[0]`, и нам просто нужно установить свойство `trainable` в значение `False`.\n", + "Эта модель выглядит как сквозная сеть классификации, которая принимает изображение и возвращает класс. Однако сложность в том, что мы хотим, чтобы VGG16 выступал в роли извлекателя признаков и не подвергался дообучению. Поэтому нам нужно **заморозить веса сверточного извлекателя признаков**. Мы можем обратиться к первому слою сети, вызвав `model.layers[0]`, и просто установить свойство `trainable` в `False`.\n", "\n", - "> **Note**: Заморозка весов извлекателя признаков необходима, потому что в противном случае необученный слой классификатора может разрушить исходные предобученные веса сверточного извлекателя.\n", + "> **Примечание**: Заморозка весов извлекателя признаков необходима, потому что в противном случае ненастроенный слой классификатора может испортить оригинальные предварительно обученные веса сверточного извлекателя.\n", "\n", - "Вы можете заметить, что хотя общее количество параметров в нашей сети составляет около 15 миллионов, мы обучаем только 25 тысяч параметров. Все остальные параметры верхнего уровня сверточных фильтров уже предобучены. Это хорошо, потому что мы можем настроить меньшее количество параметров, используя меньшее количество примеров.\n", + "Вы можете заметить, что в то время как общее количество параметров в нашей сети составляет около 15 миллионов, мы обучаем только 25 тысяч параметров. Все остальные параметры верхнеуровневых сверточных фильтров предварительно обучены. Это хорошо, потому что мы можем тонко настроить меньшее количество параметров с меньшим числом примеров.\n", "\n", - "Теперь мы будем обучать нашу сеть и посмотрим, каких результатов мы сможем добиться. Ожидайте довольно длительного времени выполнения, и не переживайте, если выполнение кажется замороженным на некоторое время.\n" + "Теперь мы обучим нашу сеть и посмотрим, насколько хорошо это получится. Ожидайте достаточно длительное время работы, и не беспокойтесь, если выполнение будет казаться зависшим на некоторое время.\n" ] }, { @@ -825,11 +835,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Кажется, у нас получилось создать достаточно точный классификатор кошек и собак!\n", + "Похоже, у нас получился достаточно точный классификатор кошек и собак! \n", "\n", "## Сохранение и загрузка модели\n", "\n", - "После того как мы обучили модель, мы можем сохранить архитектуру модели и обученные веса в файл для дальнейшего использования:\n" + "После обучения модели мы можем сохранить архитектуру модели и обученные веса в файл для дальнейшего использования:\n" ] }, { @@ -853,7 +863,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Мы можем загрузить модель из файла в любое время. Это может быть полезно, если следующий эксперимент разрушит модель - вам не придется начинать с нуля.\n" + "Затем мы можем загрузить модель из файла в любое время. Это может быть полезно, если следующий эксперимент повредит модель — вам не придется начинать с нуля.\n" ] }, { @@ -869,15 +879,15 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Тонкая настройка переноса обучения\n", + "## Тонкая настройка трансферного обучения\n", "\n", - "В предыдущем разделе мы обучили финальный слой классификатора для классификации изображений в нашем собственном наборе данных. Однако мы не переобучали извлекатель признаков, и наша модель полагалась на признаки, которые она изучила на данных ImageNet. Если ваши объекты визуально отличаются от обычных изображений ImageNet, такая комбинация признаков может работать не лучшим образом. Поэтому имеет смысл начать обучение сверточных слоев.\n", + "В предыдущем разделе мы обучили последний классификационный слой для классификации изображений в нашем собственном наборе данных. Однако мы не дообучали извлекатель признаков, и наша модель полагалась на признаки, которые она выучила на данных ImageNet. Если ваши объекты визуально отличаются от обычных изображений ImageNet, такое сочетание признаков может работать не лучшим образом. Поэтому имеет смысл начать обучать также сверточные слои.\n", "\n", - "Для этого мы можем \"разморозить\" параметры сверточных фильтров, которые ранее были \"заморожены\".\n", + "Для этого мы можем разморозить параметры фильтров свёрточного слоя, которые ранее были заморожены.\n", "\n", - "> **Примечание:** Важно сначала \"заморозить\" параметры и провести несколько эпох обучения, чтобы стабилизировать веса в слое классификации. Если сразу начать обучение всей сети с \"размороженными\" параметрами, большие ошибки могут разрушить предварительно обученные веса в сверточных слоях.\n", + "> **Примечание:** Важно сначала заморозить параметры и выполнить несколько эпох обучения, чтобы стабилизировать веса в классификационном слое. Если сразу начать обучать всю сеть с размороженными параметрами, большие ошибки могут разрушить предварительно обученные веса в сверточных слоях.\n", "\n", - "Наша сверточная модель VGG-16 находится внутри первого слоя и сама состоит из множества слоев. Мы можем взглянуть на ее структуру:\n" + "Наша свёрточная модель VGG-16 находится внутри первого слоя и сама состоит из многих слоёв. Мы можем посмотреть на её структуру:\n" ] }, { @@ -945,7 +955,9 @@ { "cell_type": "markdown", "metadata": {}, - "source": [] + "source": [ + "Мы можем разморозить все слои сверточной базы:\n" + ] }, { "cell_type": "code", @@ -960,7 +972,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Однако размораживание всех слоев сразу — не лучшая идея. Сначала мы можем разморозить только несколько последних слоев сверток, так как они содержат высокоуровневые шаблоны, которые имеют значение для наших изображений. Например, для начала мы можем заморозить все слои, кроме последних четырех:\n" + "Однако размораживать все сразу — не лучшая идея. Сначала можно разморозить лишь несколько последних сверточных слоёв, так как они содержат паттерны более высокого уровня, которые релевантны для наших изображений. Например, для начала можно заморозить все слои, кроме последних четырёх: \n" ] }, { @@ -999,11 +1011,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Обратите внимание, что количество обучаемых параметров значительно увеличилось, но оно все еще составляет около 50% от общего числа параметров.\n", + "Обратите внимание, что количество обучаемых параметров значительно увеличилось, но по-прежнему составляет около 50% от общего числа параметров.\n", "\n", - "После разморозки можно провести еще несколько эпох обучения (в нашем примере мы проведем только одну). Вы также можете выбрать более низкую скорость обучения, чтобы минимизировать влияние на предварительно обученные веса. Однако даже при низкой скорости обучения можно ожидать снижения точности в начале обучения, пока она, наконец, не достигнет немного более высокого уровня, чем в случае фиксированных весов.\n", + "После размораживания мы можем провести ещё несколько эпох обучения (в нашем примере мы проведём всего одну). Также можно выбрать более низкую скорость обучения, чтобы минимизировать влияние на предварительно обученные веса. Однако даже при низкой скорости обучения можно ожидать, что точность сначала снизится, а затем в конечном итоге достигнет уровня немного выше, чем в случае фиксированных весов.\n", "\n", - "> **Примечание:** Это обучение происходит гораздо медленнее, так как необходимо распространять градиенты обратно через множество слоев сети!\n" + "> **Примечание:** Это обучение происходит намного медленнее, потому что нам нужно распространять градиенты назад через многие слои сети!\n" ] }, { @@ -1027,9 +1039,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Мы, скорее всего, достигнем более высокой точности на обучающей выборке, так как используем более мощную сеть с большим количеством параметров, но точность на проверочной выборке увеличится не так значительно.\n", + "Мы, вероятно, достигнем более высокой точности на обучении, потому что используем более мощную сеть с большим количеством параметров, но точность на валидации увеличится не так сильно.\n", "\n", - "Не стесняйтесь разморозить еще несколько слоев сети и продолжить обучение, чтобы проверить, сможете ли вы добиться более высокой точности!\n" + "Не стесняйтесь разморозить ещё несколько слоёв сети и обучать дальше, чтобы увидеть, сможете ли вы достичь более высокой точности!\n" ] }, { @@ -1038,7 +1050,7 @@ "source": [ "## Другие модели компьютерного зрения\n", "\n", - "VGG-16 — одна из самых простых архитектур компьютерного зрения. Keras предоставляет множество других предварительно обученных сетей. Наиболее часто используемые среди них — архитектуры **ResNet**, разработанные Microsoft, и **Inception** от Google. Например, давайте рассмотрим архитектуру самой простой модели ResNet-50 (ResNet — это семейство моделей с различной глубиной, вы можете попробовать поэкспериментировать с ResNet-152, если хотите увидеть, как выглядит действительно глубокая модель):\n" + "VGG-16 — одна из самых простых архитектур компьютерного зрения. Keras предоставляет множество других предобученных сетей. Наиболее часто используемыми из них являются архитектуры **ResNet**, разработанные Microsoft, и **Inception** от Google. Например, давайте изучим архитектуру самой простой модели ResNet-50 (ResNet — это семейство моделей разной глубины, вы можете попробовать поэкспериментировать с ResNet-152, если хотите увидеть, как выглядит действительно глубокая модель):\n" ] }, { @@ -1440,29 +1452,29 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Как вы можете видеть, модель содержит те же знакомые строительные блоки: сверточные слои, слои объединения и финальный плотный классификатор. Мы можем использовать эту модель точно так же, как мы использовали VGG-16 для обучения с переносом. Вы можете попробовать экспериментировать с приведенным выше кодом, используя разные модели ResNet в качестве базовой модели, и посмотреть, как изменяется точность.\n", + "Как вы можете видеть, модель содержит те же знакомые строительные блоки: сверточные слои, слои подвыборки и конечный плотный классификатор. Мы можем использовать эту модель точно так же, как использовали VGG-16 для трансферного обучения. Вы можете попробовать поэкспериментировать с приведённым выше кодом, используя разные модели ResNet в качестве базовой модели, и посмотреть, как изменится точность.\n", "\n", - "## Нормализация пакетов\n", + "## Нормализация по батчу\n", "\n", - "Эта сеть содержит еще один тип слоя: **Нормализация пакетов**. Идея нормализации пакетов заключается в том, чтобы привести значения, проходящие через нейронную сеть, к правильному интервалу. Обычно нейронные сети работают лучше всего, когда все значения находятся в диапазоне [-1,1] или [0,1], и именно поэтому мы масштабируем/нормализуем наши входные данные соответствующим образом. Однако во время обучения глубокой сети может случиться так, что значения значительно выходят за пределы этого диапазона, что делает обучение проблематичным. Слой нормализации пакетов вычисляет среднее значение и стандартное отклонение для всех значений текущего минипакета и использует их для нормализации сигнала перед его прохождением через слой нейронной сети. Это значительно улучшает стабильность глубоких сетей.\n" + "Эта сеть содержит ещё один тип слоя: **Нормализация по батчу**. Идея нормализации по батчу заключается в том, чтобы привести значения, проходящие через нейронную сеть, к правильному интервалу. Обычно нейронные сети работают лучше всего, когда все значения находятся в диапазоне [-1,1] или [0,1], и именно поэтому мы масштабируем/нормализуем наши входные данные соответствующим образом. Однако в процессе обучения глубокой сети может возникнуть ситуация, когда значения значительно выходят за пределы этого диапазона, что затрудняет обучение. Слой нормализации по батчу вычисляет среднее и стандартное отклонение для всех значений текущего мини-батча и использует их для нормализации сигнала перед передачей через слой нейронной сети. Это значительно улучшает стабильность глубоких сетей.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Основные выводы\n", + "## Вывод\n", "\n", - "Используя метод переноса обучения, мы смогли быстро создать классификатор для нашей задачи классификации пользовательских объектов и добиться высокой точности. Однако этот пример нельзя назвать полностью честным, так как изначально сеть VGG-16 была предварительно обучена распознавать кошек и собак, и мы просто использовали большинство уже существующих в сети паттернов. Вы можете ожидать более низкую точность на более специфичных объектах из узких областей, таких как детали на производственной линии на заводе или различные листья деревьев.\n", + "Используя трансферное обучение, мы смогли быстро собрать классификатор для нашей задачи классификации объектов и достичь высокой точности. Однако этот пример был не совсем справедлив, так как оригинальная сеть VGG-16 была предварительно обучена распознавать кошек и собак, и, таким образом, мы просто повторно использовали большинство шаблонов, уже присутствующих в сети. Можно ожидать более низкую точность на более экзотических специфичных для домена объектах, таких как детали на производственной линии на заводе или разные листья деревьев.\n", "\n", - "Вы можете заметить, что более сложные задачи, которые мы решаем сейчас, требуют большей вычислительной мощности и не могут быть легко выполнены на процессоре. В следующем разделе мы попробуем использовать более легковесную реализацию для обучения той же модели с меньшими вычислительными ресурсами, что приведет к лишь незначительному снижению точности.\n" + "Можно увидеть, что более сложные задачи, которые мы решаем сейчас, требуют большей вычислительной мощности и не могут быть легко решены на CPU. В следующем блоке мы попробуем использовать более легковесную реализацию для обучения той же модели с использованием меньших вычислительных ресурсов, что приведет лишь к небольшому снижению точности.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**Отказ от ответственности**: \nЭтот документ был переведен с помощью сервиса автоматического перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Несмотря на наши усилия обеспечить точность, автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникшие в результате использования данного перевода.\n" + "---\n\n\n**Отказ от ответственности**:\nЭтот документ был переведен с использованием сервиса машинного перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Несмотря на наши усилия по обеспечению точности, имейте в виду, что автоматический перевод может содержать ошибки или неточности. Оригинальный документ на его исходном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется обратиться к профессиональному человеческому переводу. Мы не несем ответственности за любые недоразумения или неправильные толкования, возникшие в результате использования этого перевода.\n\n" ] } ], @@ -1483,12 +1495,6 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" - }, - "coopTranslator": { - "original_hash": "c189abc107848f96051085cc30945129", - "translation_date": "2025-08-28T10:59:43+00:00", - "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", - "language_code": "ru" } }, "nbformat": 4, diff --git a/translations/ru/lessons/5-NLP/README.md b/translations/ru/lessons/5-NLP/README.md index 93f62dcc05..fa21070452 100644 --- a/translations/ru/lessons/5-NLP/README.md +++ b/translations/ru/lessons/5-NLP/README.md @@ -1,51 +1,51 @@ -# Обработка естественного языка +# Обработка Естественного Языка -![Сводка задач NLP в виде рисунка](../../../../translated_images/ru/ai-nlp.b22dcb8ca4707cea.webp) +![Сводка задач НЛП в зарисовке](../../../../translated_images/ru/ai-nlp.b22dcb8ca4707cea.webp) -В этом разделе мы сосредоточимся на использовании нейронных сетей для решения задач, связанных с **обработкой естественного языка (NLP)**. Существует множество задач NLP, которые мы хотим, чтобы компьютеры могли решать: +В этом разделе мы сосредоточимся на использовании нейронных сетей для решения задач, связанных с **обработкой естественного языка (НЛП)**. Существует много задач НЛП, которые мы хотим, чтобы компьютеры могли решать: -* **Классификация текста** — это типичная задача классификации, связанная с текстовыми последовательностями. Примеры включают классификацию электронных писем как спам или не спам, или категоризацию статей по темам, таким как спорт, бизнес, политика и т.д. Также, при разработке чат-ботов часто необходимо понимать, что пользователь хотел сказать — в этом случае мы имеем дело с **классификацией намерений**. Часто в классификации намерений приходится работать с большим количеством категорий. -* **Анализ тональности** — это типичная задача регрессии, где необходимо присвоить числовое значение (тональность), соответствующее тому, насколько положительным или отрицательным является смысл предложения. Более сложная версия анализа тональности — это **анализ тональности на основе аспектов** (ABSA), где тональность присваивается не всему предложению, а его отдельным частям (аспектам), например: *В этом ресторане мне понравилась кухня, но атмосфера была ужасной*. -* **Распознавание именованных сущностей** (NER) — это задача извлечения определенных сущностей из текста. Например, нужно понять, что в фразе *Мне нужно лететь в Париж завтра* слово *завтра* относится к ДАТЕ, а *Париж* — это ЛОКАЦИЯ. -* **Извлечение ключевых слов** похоже на NER, но здесь необходимо автоматически извлекать слова, важные для смысла предложения, без предварительного обучения для конкретных типов сущностей. -* **Кластеризация текста** может быть полезна, когда нужно сгруппировать похожие предложения, например, похожие запросы в разговорах технической поддержки. -* **Ответы на вопросы** — это способность модели отвечать на конкретный вопрос. Модель получает текстовый отрывок и вопрос в качестве входных данных, и должна указать место в тексте, где содержится ответ на вопрос (или, иногда, сгенерировать текст ответа). -* **Генерация текста** — это способность модели создавать новый текст. Это можно рассматривать как задачу классификации, где предсказывается следующая буква/слово на основе некоторого *текстового запроса*. Продвинутые модели генерации текста, такие как GPT-3, способны решать другие задачи NLP, такие как классификация, используя технику [программирования с подсказками](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) или [инженерии подсказок](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29). -* **Суммаризация текста** — это техника, когда мы хотим, чтобы компьютер "прочитал" длинный текст и кратко изложил его в нескольких предложениях. -* **Машинный перевод** можно рассматривать как комбинацию понимания текста на одном языке и генерации текста на другом. +* **Классификация текста** — это типичная задача классификации, связанная с текстовыми последовательностями. Примеры включают классификацию электронных писем как спам или не спам, или категоризацию статей по темам: спорт, бизнес, политика и т.д. Также при разработке чат-ботов часто нужно понимать, что хочет сказать пользователь — в этом случае мы имеем дело с **классификацией намерений**. Часто при классификации намерений требуется работать с большим количеством категорий. +* **Анализ сентимента** — это типичная задача регрессии, где необходимо присвоить число (сентимент), отражающее насколько положительно/отрицательно значение предложения. Более продвинутым видом анализа сентимента является **аспектно-ориентированный анализ сентимента** (ABSA), когда сентимент присваивается не всему предложению, а его разным частям (аспектам), например: *В этом ресторане мне понравилась кухня, но атмосфера была ужасной*. +* **Распознавание именованных сущностей** (NER) — это задача извлечения определённых сущностей из текста. Например, нужно понять, что в фразе *Мне нужно лететь в Париж завтра* слово *завтра* относится к ДАТЕ, а *Париж* — к ЛОКАЦИИ. +* **Извлечение ключевых слов** похоже на NER, но требуется автоматически выделять слова, важные для смысла предложения, без предварительного обучения на конкретных типах сущностей. +* **Кластеризация текста** может быть полезна, если нужно сгруппировать похожие предложения, например, схожие запросы в технической поддержке. +* **Ответы на вопросы** — это способность модели отвечать на конкретный вопрос. Модель получает текстовый фрагмент и вопрос на вход, и должна указать место в тексте, где содержится ответ (или, иногда, сгенерировать текст ответа). +* **Генерация текста** — способность модели создавать новый текст. Это можно рассматривать как задачу классификации, которая предсказывает следующую букву/слово на основе некоторого *текстового примера*. Продвинутые модели генерации текста, такие как GPT-3, могут решать и другие задачи НЛП, например классификацию, с помощью техники, называемой [prompt programming](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) или [prompt engineering](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29) +* **Суммирование текста** — это метод, когда мы хотим, чтобы компьютер «прочитал» длинный текст и суммировал его несколькими предложениями. +* **Машинный перевод** можно рассматривать как комбинацию понимания текста на одном языке и генерации текста на другом языке. -Изначально большинство задач NLP решались с использованием традиционных методов, таких как грамматики. Например, в машинном переводе использовались парсеры для преобразования исходного предложения в синтаксическое дерево, затем извлекались более высокоуровневые семантические структуры для представления смысла предложения, и на основе этого смысла и грамматики целевого языка генерировался результат. В настоящее время многие задачи NLP более эффективно решаются с использованием нейронных сетей. +Изначально большинство задач НЛП решалось с помощью традиционных методов, таких как грамматики. Например, в машинном переводе использовались парсеры для преобразования исходного предложения в синтаксическое дерево, затем извлекались более высокоуровневые семантические структуры для представления смысла предложения, и на основе этого смысла и грамматики целевого языка генерировался результат. В настоящее время многие задачи НЛП эффективнее решаются с использованием нейронных сетей. -> Многие классические методы NLP реализованы в библиотеке Python [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org). Существует отличная [книга по NLTK](https://www.nltk.org/book/), доступная онлайн, которая охватывает, как различные задачи NLP могут быть решены с помощью NLTK. +> Многие классические методы НЛП реализованы в библиотеке Python [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org). В интернете доступна отличная [книга по NLTK](https://www.nltk.org/book/), которая раскрывает, как решать различные задачи НЛП с помощью NLTK. -В нашем курсе мы в основном будем сосредоточены на использовании нейронных сетей для NLP, и будем использовать NLTK, где это необходимо. +В нашем курсе мы в основном будем сосредоточены на использовании нейронных сетей для НЛП и будем использовать NLTK там, где это нужно. -Мы уже изучили использование нейронных сетей для работы с табличными данными и изображениями. Основное отличие этих типов данных от текста заключается в том, что текст — это последовательность переменной длины, тогда как размер входных данных в случае изображений известен заранее. Хотя сверточные сети могут извлекать шаблоны из входных данных, шаблоны в тексте более сложны. Например, отрицание может быть отделено от субъекта произвольным количеством слов (например, *Мне не нравятся апельсины* vs. *Мне не нравятся эти большие красочные вкусные апельсины*), и это все равно должно интерпретироваться как один шаблон. Таким образом, для обработки языка необходимо вводить новые типы нейронных сетей, такие как *рекуррентные сети* и *трансформеры*. +Мы уже изучили использование нейронных сетей для работы с табличными данными и изображениями. Главное отличие между этими типами данных и текстом заключается в том, что текст — это последовательность переменной длины, тогда как размер входа в случае изображений известен заранее. Хотя сверточные сети могут извлекать паттерны из входных данных, паттерны в тексте более сложные. Например, отрицание может быть отделено от подлежащего произвольным числом слов (например, *Мне не нравятся апельсины* против *Мне не нравятся эти большие цветные вкусные апельсины*), и это всё равно должно интерпретироваться как один паттерн. Поэтому для обработки языка необходимо вводить новые типы нейронных сетей, такие как *рекуррентные сети* и *трансформеры*. ## Установка библиотек -Если вы используете локальную установку Python для выполнения этого курса, вам может понадобиться установить все необходимые библиотеки для NLP с помощью следующих команд: +Если вы используете локальную установку Python для изучения этого курса, вам может понадобиться установить все необходимые библиотеки для НЛП с помощью следующих команд: **Для PyTorch** ```bash -pip install -r requirements-torch.txt +pip install -r requirements-pytorch.txt ``` **Для TensorFlow** ```bash pip install -r requirements-tf.txt ``` -> Вы можете попробовать NLP с TensorFlow на [Microsoft Learn](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste) +> Вы можете попробовать НЛП с TensorFlow на [Microsoft Learn](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste) -## Предупреждение о GPU +## Предупреждение по поводу GPU -В этом разделе в некоторых примерах мы будем обучать довольно крупные модели. -* **Используйте компьютер с поддержкой GPU**: Рекомендуется запускать ваши ноутбуки на компьютере с поддержкой GPU, чтобы сократить время ожидания при работе с крупными моделями. -* **Ограничения памяти GPU**: Работа на GPU может привести к ситуациям, когда у вас закончится память GPU, особенно при обучении крупных моделей. -* **Потребление памяти GPU**: Количество памяти GPU, потребляемой во время обучения, зависит от различных факторов, включая размер минибатча. -* **Минимизируйте размер минибатча**: Если вы столкнулись с проблемами памяти GPU, попробуйте уменьшить размер минибатча в вашем коде как возможное решение. -* **Освобождение памяти GPU в TensorFlow**: Старые версии TensorFlow могут некорректно освобождать память GPU при обучении нескольких моделей в одном ядре Python. Чтобы эффективно управлять использованием памяти GPU, вы можете настроить TensorFlow на выделение памяти GPU только по мере необходимости. -* **Включение кода**: Чтобы настроить TensorFlow на увеличение выделения памяти GPU только при необходимости, включите следующий код в ваши ноутбуки: +В этом разделе в некоторых примерах мы будем обучать довольно большие модели. +* **Используйте компьютер с поддержкой GPU**: рекомендуется запускать ноутбуки на компьютере с GPU, чтобы сократить время ожидания при работе с большими моделями. +* **Ограничения памяти GPU**: при работе на GPU могут возникать ситуации, когда заканчивается память GPU, особенно при обучении больших моделей. +* **Потребление памяти GPU**: количество памяти GPU, используемой во время обучения, зависит от различных факторов, включая размер мини-батча. +* **Минимизируйте размер мини-батча**: если возникают проблемы с памятью GPU, рассмотрите возможность уменьшения размера мини-батча в вашем коде как возможное решение. +* **Освобождение памяти GPU в TensorFlow**: старые версии TensorFlow могут некорректно освобождать память GPU при обучении нескольких моделей внутри одного ядра Python. Чтобы эффективно управлять использованием памяти GPU, можно настроить TensorFlow так, чтобы он выделял память на GPU только по мере необходимости. +* **Включение кода**: чтобы настроить TensorFlow на выделение памяти GPU только по мере роста потребности, включите следующий код в ваши ноутбуки: ```python physical_devices = tf.config.list_physical_devices('GPU') @@ -53,17 +53,21 @@ if len(physical_devices)>0: tf.config.experimental.set_memory_growth(physical_devices[0], True) ``` -Если вас интересует изучение NLP с точки зрения классического машинного обучения, посетите [этот набор уроков](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP) +Если вам интересен классический подход к НЛП с точки зрения машинного обучения, посетите [этот набор уроков](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP) ## В этом разделе В этом разделе мы изучим: * [Представление текста в виде тензоров](13-TextRep/README.md) -* [Словарные эмбеддинги](14-Emdeddings/README.md) +* [Встраивания слов](14-Emdeddings/README.md) * [Моделирование языка](15-LanguageModeling/README.md) * [Рекуррентные нейронные сети](16-RNN/README.md) * [Генеративные сети](17-GenerativeNetworks/README.md) * [Трансформеры](18-Transformers/README.md) -**Отказ от ответственности**: -Этот документ был переведен с использованием сервиса автоматического перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Несмотря на наши усилия обеспечить точность, автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникающие в результате использования данного перевода. \ No newline at end of file +--- + + +**Отказ от ответственности**: +Этот документ был переведен с использованием сервиса машинного перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Несмотря на наши усилия по обеспечению точности, имейте в виду, что автоматический перевод может содержать ошибки или неточности. Оригинальный документ на его исходном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется обратиться к профессиональному человеческому переводу. Мы не несем ответственности за любые недоразумения или неправильные толкования, возникшие в результате использования этого перевода. + \ No newline at end of file diff --git a/translations/sk/.co-op-translator.json b/translations/sk/.co-op-translator.json index c3f6384717..25d2a0dd72 100644 --- a/translations/sk/.co-op-translator.json +++ b/translations/sk/.co-op-translator.json @@ -5,6 +5,12 @@ "source_file": "AGENTS.md", "language_code": "sk" }, + "CONTRIBUTING.md": { + "original_hash": "c6fd7e781b67111a90abd166d0ce4aa0", + "translation_date": "2026-07-08T17:14:12+00:00", + "source_file": "CONTRIBUTING.md", + "language_code": "sk" + }, "README.md": { "original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b", "translation_date": "2026-04-06T16:49:42+00:00", @@ -17,6 +23,19 @@ "source_file": "SECURITY.md", "language_code": "sk" }, + "__translation_failures__": { + "lessons/sketchnotes/LICENSE.md": { + "original_hash": "45ab63a2cd8f5faef6c9b150618837a4", + "source_file": "lessons/sketchnotes/LICENSE.md", + "language_code": "sk", + "failure_date": "2026-07-08T17:13: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-26T00:44:33+00:00", @@ -54,8 +73,8 @@ "language_code": "sk" }, "examples/README.md": { - "original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7", - "translation_date": "2025-10-03T11:33:56+00:00", + "original_hash": "7883d52c2e2a221e0b07a7b112a149b9", + "translation_date": "2026-07-08T17:07:26+00:00", "source_file": "examples/README.md", "language_code": "sk" }, @@ -66,8 +85,8 @@ "language_code": "sk" }, "lessons/0-course-setup/how-to-run.md": { - "original_hash": "a4717bd9103b9f6cd84d534b83534689", - "translation_date": "2026-01-16T04:57:59+00:00", + "original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1", + "translation_date": "2026-07-08T17:07:54+00:00", "source_file": "lessons/0-course-setup/how-to-run.md", "language_code": "sk" }, @@ -191,6 +210,12 @@ "source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md", "language_code": "sk" }, + "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": { + "original_hash": "99b816b6a4957ef4100cee4c4221dff9", + "translation_date": "2026-07-08T16:53:09+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", + "language_code": "sk" + }, "lessons/4-ComputerVision/08-TransferLearning/lab/README.md": { "original_hash": "7765935c35fcee69b9fe2d0cfd6963e2", "translation_date": "2025-08-25T23:16:36+00:00", @@ -330,8 +355,8 @@ "language_code": "sk" }, "lessons/5-NLP/README.md": { - "original_hash": "8ef02a9318257ea140ed3ed74442096d", - "translation_date": "2025-08-25T21:28:05+00:00", + "original_hash": "038df6f1a73e49f6430740da083bfd6d", + "translation_date": "2026-07-08T17:08:28+00:00", "source_file": "lessons/5-NLP/README.md", "language_code": "sk" }, diff --git a/translations/sk/CONTRIBUTING.md b/translations/sk/CONTRIBUTING.md new file mode 100644 index 0000000000..fdeb7249a9 --- /dev/null +++ b/translations/sk/CONTRIBUTING.md @@ -0,0 +1,29 @@ +# Prispievanie do AI-For-Beginners + +Ďakujeme za váš záujem prispieť do AI-For-Beginners! Vítame preklady, opravy lekcií a úpravy formátovania. + +## Licenčná dohoda prispievateľa spoločnosti Microsoft (CLA) + +Tento projekt vítá príspevky a návrhy. Väčšina príspevkov vyžaduje, aby ste súhlasili s Licenčnou dohodou prispievateľa (CLA), ktorá deklaruje, že máte právo a skutočne nám udeľujete práva na používanie vášho príspevku. Podrobnosti nájdete na [https://cla.microsoft.com](https://cla.microsoft.com). + +Keď odošlete pull request, CLA-bot automaticky určí, či musíte poskytnúť CLA, a príslušne označí PR (napríklad štítkom alebo komentárom). Stačí postupovať podľa pokynov bota. Toto budete musieť urobiť iba raz vo všetkých repozitároch používajúcich našu CLA. + +## Ako prispieť + +### 1. Oprava preklepov / chýb v kóde +Ak nájdete preklep alebo chybu v ľubovoľnom Jupyter notebooku alebo markdown súbore lekcie: +1. Vytvorte fork repozitára. +2. Opravte preklep alebo nefunkčný odkaz. +3. Pošlite Pull Request s jasným popisom opravy. + +### 2. Odosielanie prekladov +Vitáme preklady lekcií do iných jazykov! Preklady umiestnite do priečinka `translations/` podľa existujúcich názvov priečinkov (napríklad `translations/es/`, `translations/pt-BR/`, `translations/zh-CN/`). + +Podrobnosti nájdete v súbore [etc/CONTRIBUTING.md](etc/CONTRIBUTING.md). + +--- + + +**Vyhlásenie o zodpovednosti**: +Tento dokument bol preložený pomocou AI prekladateľskej služby [Co-op Translator](https://github.com/Azure/co-op-translator). Hoci sa snažíme o presnosť, vezmite prosím na vedomie, že automatické preklady môžu obsahovať chyby alebo nepresnosti. Pôvodný dokument v jeho natívnom jazyku by mal byť považovaný za autoritatívny zdroj. Pre kritické informácie sa odporúča profesionálny ľudský preklad. Nie sme zodpovední za žiadne nedorozumenia alebo nesprávne interpretácie vyplývajúce z použitia tohto prekladu. + \ No newline at end of file diff --git a/translations/sk/examples/README.md b/translations/sk/examples/README.md index 0d3f6c9ea2..dc5010d084 100644 --- a/translations/sk/examples/README.md +++ b/translations/sk/examples/README.md @@ -1,27 +1,27 @@ -# Príklady AI pre začiatočníkov +# Príklady AI vhodné pre začiatočníkov -Vitajte! Tento adresár obsahuje jednoduché, samostatné príklady, ktoré vám pomôžu začať s AI a strojovým učením. Každý príklad je navrhnutý tak, aby bol priateľský pre začiatočníkov, s podrobnými komentármi a krok za krokom vysvetleniami. +Vitajte! Tento adresár obsahuje jednoduché, samostatné príklady, ktoré vám pomôžu začať s AI a strojovým učením. Každý príklad je navrhnutý tak, aby bol priateľský k začiatočníkom s podrobnými komentármi a krok za krokom vysvetleniami. ## 📚 Prehľad príkladov | Príklad | Popis | Obtiažnosť | Predpoklady | |---------|-------------|------------|---------------| -| [Hello AI World](../../../examples/01-hello-ai-world.py) | Váš prvý AI program - jednoduché rozpoznávanie vzorov | ⭐ Začiatočník | Základy Pythonu | -| [Jednoduchá neurónová sieť](../../../examples/02-simple-neural-network.py) | Vytvorte neurónovú sieť od základov | ⭐⭐ Začiatočník+ | Python, základná matematika | -| [Klasifikátor obrázkov](./03-image-classifier.ipynb) | Klasifikujte obrázky pomocou predtrénovaného modelu | ⭐⭐ Začiatočník+ | Python, numpy | -| [Analýza sentimentu textu](../../../examples/04-text-sentiment.py) | Analyzujte sentiment textu (pozitívny/negatívny) | ⭐⭐ Začiatočník+ | Python | +| [Hello AI World](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/01-hello-ai-world.py) | Váš prvý AI program – jednoduché rozpoznávanie vzorov | ⭐ Začiatočník | Základy Pythonu | +| [Simple Neural Network](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/02-simple-neural-network.py) | Vytvorte neurónovú sieť od základov | ⭐⭐ Začiatočník+ | Python, základná matematika | +| [Image Classifier](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/03-image-classifier.ipynb) | Klasifikujte obrázky s predtrénovaným modelom | ⭐⭐ Začiatočník+ | Python, numpy | +| [Text Sentiment](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/04-text-sentiment.py) | Analyzujte sentiment textu (pozitívny/negatívny) | ⭐⭐ Začiatočník+ | Python | ## 🚀 Začíname ### Predpoklady -Uistite sa, že máte nainštalovaný Python (odporúča sa verzia 3.8 alebo vyššia). Nainštalujte potrebné balíčky: +Uistite sa, že máte nainštalovaný Python (odporúčaná verzia 3.8 alebo novšia). Nainštalujte potrebné balíčky: ```bash -# For Python scripts +# Pre Python skripty pip install numpy -# For Jupyter notebooks (image classifier) +# Pre Jupyter notebooky (klasifikátor obrázkov) pip install jupyter numpy pillow tensorflow ``` @@ -32,7 +32,7 @@ conda env create --name ai4beg --file ../environment.yml conda activate ai4beg ``` -### Spustenie príkladov +### Spúšťanie príkladov **Pre Python skripty (.py súbory):** ```bash @@ -46,19 +46,19 @@ jupyter notebook 03-image-classifier.ipynb ## 📖 Učebná cesta -Odporúčame postupovať podľa príkladov v tomto poradí: +Odporúčame nasledovať príklady v tomto poradí: -1. **Začnite s "Hello AI World"** - Naučte sa základy rozpoznávania vzorov -2. **Vytvorte jednoduchú neurónovú sieť** - Pochopte, ako fungujú neurónové siete -3. **Vyskúšajte klasifikátor obrázkov** - Pozrite sa na AI v akcii s reálnymi obrázkami -4. **Analyzujte sentiment textu** - Preskúmajte spracovanie prirodzeného jazyka +1. **Začnite s „Hello AI World“** – Naučte sa základy rozpoznávania vzorov +2. **Postavte jednoduchú neurónovú sieť** – Pochopte, ako fungujú neurónové siete +3. **Vyskúšajte klasifikátor obrázkov** – Pozrite si AI v akcii s reálnymi obrázkami +4. **Analyzujte sentiment textu** – Preskúmajte spracovanie prirodzeného jazyka ## 💡 Tipy pre začiatočníkov -- **Pozorne čítajte komentáre v kóde** - Vysvetľujú, čo robí každý riadok -- **Experimentujte!** - Skúste meniť hodnoty a sledujte, čo sa stane -- **Netrápte sa, ak všetkému nerozumiete** - Učenie si vyžaduje čas -- **Pýtajte sa otázky** - Použite [diskusné fórum](https://github.com/microsoft/AI-For-Beginners/discussions) +- **Starostlivo čítajte komentáre v kóde** – Vysvetľujú, čo každý riadok robí +- **Experimentujte!** – Skúšajte meniť hodnoty a sledujte, čo sa stane +- **Nestrašte sa, ak všetko hneď nepochopíte** – Učenie si vyžaduje čas +- **Pýtajte sa otázky** – Použite [diskusnú platformu](https://github.com/microsoft/AI-For-Beginners/discussions) ## 🔗 Ďalšie kroky @@ -68,18 +68,20 @@ Po dokončení týchto príkladov preskúmajte celý kurz: - [Počítačové videnie](../lessons/4-ComputerVision/README.md) - [Spracovanie prirodzeného jazyka](../lessons/5-NLP/README.md) -## 🤝 Prispievanie +## 🤝 Príspevky -Považujete tieto príklady za užitočné? Pomôžte nám ich zlepšiť: -- Nahláste problémy alebo navrhnite vylepšenia -- Pridajte ďalšie príklady pre začiatočníkov +Páčia sa vám tieto príklady? Pomôžte nám ich zlepšiť: +- Nahláste chyby alebo navrhnite vylepšenia +- Pridajte viac príkladov pre začiatočníkov - Zlepšite dokumentáciu a komentáre --- -*Pamätajte: Každý odborník bol kedysi začiatočníkom. Šťastné učenie! 🎓* +*Pamätajte: Každý expert bol raz začiatočník. Šťastné učenie! 🎓* --- -**Upozornenie**: -Tento dokument bol preložený pomocou služby AI prekladu [Co-op Translator](https://github.com/Azure/co-op-translator). Hoci sa snažíme o presnosť, prosím, berte na vedomie, že automatizované preklady môžu obsahovať chyby alebo nepresnosti. Pôvodný dokument v jeho rodnom jazyku by mal byť považovaný za autoritatívny zdroj. Pre kritické informácie sa odporúča profesionálny ľudský preklad. Nie sme zodpovední za žiadne nedorozumenia alebo nesprávne interpretácie vyplývajúce z použitia tohto prekladu. \ No newline at end of file + +**Vyhlásenie o zodpovednosti**: +Tento dokument bol preložený pomocou AI prekladateľskej služby [Co-op Translator](https://github.com/Azure/co-op-translator). Hoci sa snažíme o presnosť, vezmite prosím na vedomie, že automatické preklady môžu obsahovať chyby alebo nepresnosti. Pôvodný dokument v jeho natívnom jazyku by mal byť považovaný za autoritatívny zdroj. Pre kritické informácie sa odporúča profesionálny ľudský preklad. Nie sme zodpovední za žiadne nedorozumenia alebo nesprávne interpretácie vyplývajúce z použitia tohto prekladu. + \ No newline at end of file diff --git a/translations/sk/lessons/0-course-setup/how-to-run.md b/translations/sk/lessons/0-course-setup/how-to-run.md index 0eb93b3967..5aca481ccb 100644 --- a/translations/sk/lessons/0-course-setup/how-to-run.md +++ b/translations/sk/lessons/0-course-setup/how-to-run.md @@ -1,12 +1,12 @@ # Ako spustiť kód -Tento učebný plán obsahuje veľa vykonateľných príkladov a laboratórií, ktoré by ste chceli spustiť. Aby ste to mohli urobiť, potrebujete možnosť vykonávať Python kód v Jupyter Notebookoch poskytovaných ako súčasť tohto učebného plánu. Máte niekoľko možností, ako spustiť kód: +Tento učebný plán obsahuje veľa spustiteľných príkladov a laboratórií, ktoré budete chcieť spustiť. Aby ste to mohli urobiť, potrebujete možnosť vykonávať Python kód v Jupyter Notebookoch, ktoré sú súčasťou tohto učebného plánu. Máte niekoľko možností, ako spustiť kód: -## Spustiť lokálne na vašom počítači +## Spustenie lokálne na vašom počítači -Na spustenie kódu lokálne na vašom počítači je potrebná inštalácia Pythonu. Jedným z odporúčaní je inštalovať **[miniconda](https://conda.io/en/latest/miniconda.html)** - ide o pomerne ľahkú inštaláciu, ktorá podporuje správcu balíčkov `conda` pre rôzne Python **virtuálne prostredia**. +Na spustenie kódu lokálne na vašom počítači je potrebná inštalácia Pythonu. Jedným z odporúčaní je nainštalovať **[miniconda](https://conda.io/en/latest/miniconda.html)** – je to pomerne ľahká inštalácia, ktorá podporuje správcu balíkov `conda` pre rôzne Python **virtuálne prostredia**. -Po nainštalovaní minicondy si naklonujte repozitár a vytvorte virtuálne prostredie, ktoré bude použité pre tento kurz: +Po nainštalovaní minicondy si naklonujte repozitár a vytvorte virtuálne prostredie, ktoré budete používať pre tento kurz: ```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 ``` -### Použitie Visual Studio Code s rozšírením Python +### Používanie Visual Studio Code s Python rozšírením -Tento učebný plán je najlepšie používať pri jeho otvorení v [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) s rozšírením [Python Extension](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste). +Tento učebný plán je najlepšie používať pri otvorení v [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) s [Python rozšírením](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste). -> **Poznámka**: Po naklonovaní a otvorení adresára vo VS Code vám automaticky navrhne inštaláciu rozšírení Python. Tiež budete musieť nainštalovať miniconda, ako je to popísané vyššie. +> **Poznámka**: Po naklonovaní a otvorení priečinka vo VS Code vám automaticky odporučí nainštalovať Python rozšírenia. Tiež si musíte nainštalovať minicondu, ako bolo popísané vyššie. -> **Poznámka**: Ak vám VS Code navrhne znovu otvoriť repozitár v kontajneri, mali by ste to odmietnuť, aby ste použili lokálnu inštaláciu Pythonu. +> **Poznámka**: Ak vám VS Code navrhne znovu otvoriť repozitár v kontajneri, mali by ste tento návrh odmietnuť, aby ste použili lokálnu inštaláciu Pythonu. -### Použitie Jupyter v prehliadači +### Používanie Jupyteru v prehliadači -Môžete tiež použiť Jupyter prostredie z prehliadača na vašom vlastnom počítači. Klasický Jupyter aj JupyterHub poskytujú pohodlné vývojové prostredie s automatickým dopĺňaním, zvýrazňovaním kódu atď. +Môžete tiež použiť Jupyter prostredie z prehliadača na vašom počítači. Klasický Jupyter aj JupyterHub poskytujú pohodlné vývojové prostredie s automatickým dopĺňaním, zvýraznením kódu a pod. -Na spustenie Jupyter lokálne choďte do adresára kurzu a spustite: +Na spustenie Jupyteru lokálne prejdite do priečinka kurzu a vykonajte: ```bash jupyter notebook ``` -alebo + alebo ```bash jupyterhub ``` -Potom môžete prechádzať k ľubovoľnému súboru `.ipynb`, otvoriť ho a začať pracovať. + Potom môžete prechádzať k ľubovoľným `.ipynb` súborom, otvárať ich a začať pracovať. ### Spustenie v kontajneri -Jednou z alternatív k inštalácii Pythonu je spustiť kód v kontajneri. Keďže náš repozitár obsahuje špeciálny priečinok `.devcontainer`, ktorý ukazuje, ako zostaviť kontajner pre tento repozitár, VS Code ponúka možnosť znova otvoriť kód v kontajneri. Toto vyžaduje inštaláciu Dockeru a tiež je to zložitejšie, preto to odporúčame skúsenejším používateľom. +Jednou z alternatív inštalácie Pythonu je spustiť kód v kontajneri. Keďže náš repozitár obsahuje špeciálny priečinok `.devcontainer`, ktorý určuje, ako sa má kontajner pre tento repozitár zostaviť, VS Code ponúka možnosť znovu otvoriť kód v kontajneri. To bude vyžadovať inštaláciu Dockeru a je to zložitejšie, preto to odporúčame skúsenejším používateľom. ## Spustenie v cloude -Ak nechcete inštalovať Python lokálne a máte prístup ku cloudovým zdrojom - dobrá alternatíva je spustiť kód v cloude. Existuje niekoľko spôsobov, ako to urobiť: +Ak nechcete inštalovať Python lokálne a máte prístup k nejakým cloudovým zdrojom, dobrou alternatívou je spúšťať kód v cloude. Existuje niekoľko spôsobov, ako to môžete urobiť: -* Použitie **[GitHub Codespaces](https://github.com/features/codespaces)**, čo je virtuálne prostredie vytvorené pre vás na GitHube, prístupné cez rozhranie VS Code v prehliadači. Ak máte prístup ku Codespaces, môžete jednoducho kliknúť na tlačidlo **Code** v repozitári, spustiť codespace a začať bez zbytočného čakania. -* Použitie **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) ponúka bezplatné výpočtové zdroje poskytované v cloude pre ľudí ako vy, ktorí chcú otestovať nejaký kód na GitHube. Na úvodnej stránke je tlačidlo na otvorenie repozitára v Bindri - to vás rýchlo zavedie na stránku Bindra, ktorá zostaví podkladový kontajner a spustí pre vás webové rozhranie Jupyter bez prerušenia. +* Použitie **[GitHub Codespaces](https://github.com/features/codespaces)**, čo je virtuálne prostredie vytvorené pre vás na GitHube, prístupné prostredníctvom rozhrania VS Code v prehliadači. Ak máte prístup ku Codespaces, stačí kliknúť na tlačidlo **Code** v repozitári, spustiť codespace a môžete okamžite začať. +* Použitie **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) ponúka voľné výpočtové zdroje v cloude pre ľudí ako ste vy, aby mohli testovať kód na GitHube. Na hlavnej stránke nájdete tlačidlo na otvorenie repozitára v Bindri – to vás rýchlo zavedie na stránku bindra, ktorá zostaví podkladový kontajner a bezproblémovo spustí webové rozhranie Jupyter. -> **Poznámka**: Aby sa predišlo zneužitiu, Binder má prístup k niektorým webovým zdrojom zablokovaný. To môže zabrániť správnej funkcii niektorého kódu, ktorý sťahuje modely a/alebo dátové sady z verejného internetu. Môžete potrebovať nájsť nejaké obchádzky. Tiež výpočtové zdroje poskytované Binderom sú pomerne základné, takže tréning bude pomalý, zvlášť v neskorších, komplexnejších lekciách. +> **Poznámka**: Na prevenciu zneužitia má Binder zablokovaný prístup k niektorým webovým zdrojom. To môže spôsobiť, že niektoré časti kódu, ktoré sťahujú modely a/alebo dataset zo siete, nemusia fungovať. Možno budete musieť nájsť nejaké alternatívne riešenie. Tiež výpočtové zdroje, ktoré Binder poskytuje, sú pomerne základné, takže tréning bude pomalý, najmä v neskorších, zložitejších lekciách. ## Spustenie v cloude s GPU -Niektoré z neskorších lekcií v tomto učebnom pláne by výrazne profitovali z podpory GPU. Tréning modelov môže byť inak bolestivo pomalý. Existuje niekoľko možností, ktoré môžete sledovať, najmä ak máte prístup ku cloudu buď cez [Azure pre študentov](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste), alebo cez vašu inštitúciu: +Niektoré z neskorších lekcií v tomto učebnom pláne by veľmi profitovali zo podpory GPU. Napríklad tréning modelu môže byť inak bolestivo pomalý. Môžete postupovať niektorým z nasledujúcich spôsobov, najmä ak máte prístup ku cloudu buď cez [Azure pre študentov](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste), alebo cez vašu inštitúciu: -* Vytvorte [Data Science Virtual Machine](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) a pripojte sa k nej cez Jupyter. Môžete si potom naklonovať repozitár priamo na stroj a začať sa učiť. VM série NC majú podporu GPU. +* Vytvorte [Data Science Virtual Machine](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) a pripojte sa k nej cez Jupyter. Môžete si potom klonovať repozitár priamo na túto mašinu a začať s učením. NC-series VM podporujú GPU. -> **Poznámka**: Niektoré predplatné, vrátane Azure pre študentov, neposkytujú podporu GPU automaticky. Môžete potrebovať požiadať o ďalšie GPU jadrá cez technickú podporu. +> **Poznámka**: Niektoré predplatné, vrátane Azure pre študentov, neposkytujú GPU podporu automaticky. Možno budete musieť požiadať o ďalšie GPU jadrá cez technickú podporu. -* Vytvorte [Azure Machine Learning Workspace](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) a potom použite funkciu Notebook tam. [Toto video](https://azure-for-academics.github.io/quickstart/azureml-papers/) ukazuje, ako naklonovať repozitár do Azure ML notebooku a začať ho používať. +* Vytvorte [Azure Machine Learning Workspace](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) a potom využite funkciu Notebook tam. [Toto video](https://azure-for-academics.github.io/quickstart/azureml-papers/) ukazuje, ako naklonovať repozitár do Azure ML notebooku a začať ho používať. -Môžete tiež použiť Google Colab, ktorý má nejakú bezplatnú podporu GPU, a nahrať tam Jupyter Notebooky na ich postupné spustenie. +Môžete tiež použiť Google Colab, ktorý má zadarmo určitú podporu GPU, a nahrať tam Jupyter Notebooky na spustenie jeden po druhom. --- -**Zrieknutie sa zodpovednosti**: -Tento dokument bol preložený pomocou AI prekladateľskej služby [Co-op Translator](https://github.com/Azure/co-op-translator). Aj keď sa snažíme o presnosť, prosím berte na vedomie, že automatické preklady môžu obsahovať chyby alebo nepresnosti. Originálny dokument v jeho pôvodnom jazyku by mal byť považovaný za autoritatívny zdroj. Pri kritických informáciách sa odporúča profesionálny ľudský preklad. Nepreberáme zodpovednosť za akékoľvek nedorozumenia alebo mylné výklady vyplývajúce z použitia tohto prekladu. +**Vyhlásenie o zodpovednosti**: +Tento dokument bol preložený pomocou AI prekladateľskej služby [Co-op Translator](https://github.com/Azure/co-op-translator). Hoci sa snažíme o presnosť, vezmite prosím na vedomie, že automatické preklady môžu obsahovať chyby alebo nepresnosti. Pôvodný dokument v jeho natívnom jazyku by mal byť považovaný za autoritatívny zdroj. Pre kritické informácie sa odporúča profesionálny ľudský preklad. Nie sme zodpovední za žiadne nedorozumenia alebo nesprávne interpretácie vyplývajúce z použitia tohto prekladu. \ No newline at end of file diff --git a/translations/sk/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/sk/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index 3cbafbf58a..c671bb313d 100644 --- a/translations/sk/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/sk/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -4,11 +4,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Predtrénované modely a transferové učenie\n", + "# Predtrénované modely a transfer learning\n", "\n", - "Trénovanie CNN môže byť časovo náročné a vyžaduje veľké množstvo dát. Veľká časť času sa však venuje učeniu najlepších nízkoúrovňových filtrov, ktoré sieť používa na extrahovanie vzorov z obrázkov. Prirodzene sa vynára otázka - môžeme použiť neurónovú sieť vytrénovanú na jednom datasete a prispôsobiť ju na klasifikáciu iných obrázkov bez kompletného procesu trénovania?\n", + "Tréning CNN môže zabrať veľa času a na túto úlohu je potrebné veľa dát. Väčšina času sa však strávi učením najlepších nízkoúrovňových filtrov, ktoré sieť používa na extrahovanie vzorov z obrázkov. Vyvstáva teda prirodzená otázka - môžeme použiť neurónovú sieť natrénovanú na jednej sade dát a prispôsobiť ju klasifikácii iných obrázkov bez kompletného tréningového procesu?\n", "\n", - "Tento prístup sa nazýva **transferové učenie**, pretože prenášame určité znalosti z jedného modelu neurónovej siete na druhý. Pri transferovom učení zvyčajne začíname s predtrénovaným modelom, ktorý bol vytrénovaný na veľkom datasete obrázkov, ako je napríklad **ImageNet**. Tieto modely už dokážu efektívne extrahovať rôzne črty z bežných obrázkov, a v mnohých prípadoch stačí postaviť klasifikátor na vrchole týchto extrahovaných čŕt, aby sme dosiahli dobrý výsledok.\n" + "Tento prístup sa nazýva **transfer learning**, pretože prenášame časť znalostí z jedného modelu neurónovej siete na druhý. Pri transfer learningu zvyčajne začíname s predtrénovaným modelom, ktorý bol natrénovaný na nejakej veľkej sade obrázkov, napríklad na **ImageNet**. Tieto modely už dokážu dobre extrahovať rôzne vlastnosti z generických obrázkov a v mnohých prípadoch stačí postaviť klasifikátor na týchto extrahovaných vlastnostiach, čo môže priniesť dobrý výsledok.\n" ] }, { @@ -31,9 +31,9 @@ "source": [ "## Dataset Mačky vs. Psy\n", "\n", - "V tejto jednotke vyriešime reálny problém klasifikácie obrázkov mačiek a psov. Na tento účel použijeme [Kaggle Cats vs. Dogs Dataset](https://www.kaggle.com/c/dogs-vs-cats), ktorý je možné stiahnuť aj [z Microsoftu](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n", + "V tejto jednotke vyriešime reálny problém klasifikácie obrázkov mačiek a psov. Na tento účel použijeme [Kaggle dataset Mačky vs. Psy](https://www.kaggle.com/c/dogs-vs-cats), ktorý je možné stiahnuť aj [z Microsoftu](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n", "\n", - "Stiahnime si tento dataset a rozbaľme ho do adresára `data` (tento proces môže chvíľu trvať!):\n" + "Stiahnime si tento dataset a rozbaľme ho do priečinka `data` (tento proces môže chvíľu trvať!):\n" ] }, { @@ -64,7 +64,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Bohužiaľ, v dátovom súbore sa nachádzajú niektoré poškodené obrazové súbory. Musíme vykonať rýchle čistenie na kontrolu poškodených súborov. Aby sme nezahltili tento návod, presunuli sme kód na overenie dátového súboru do modulu.\n" + "Bohužiaľ, v dátovej sade sa nachádzajú niektoré poškodené obrazové súbory. Potrebujeme rýchle očistenie na kontrolu poškodených súborov. Aby sme tento tutoriál neunavili, presunuli sme kód na overenie dátovej sady do modulu.\n" ] }, { @@ -333,13 +333,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Načítanie datasetu\n", + "## Načítavanie datasetu\n", "\n", - "V predchádzajúcich príkladoch sme načítavali datasety, ktoré sú zabudované v Keras. Teraz sa chystáme pracovať s vlastným datasetom, ktorý musíme načítať z adresára obrázkov.\n", + "V predchádzajúcich príkladoch sme načítavali datasety, ktoré sú súčasťou Kerasu. Teraz sa chystáme pracovať s naším vlastným datasetom, ktorý potrebujeme načítať zo zložky s obrázkami.\n", "\n", - "V reálnom živote môže byť veľkosť datasetov obrázkov pomerne veľká, a preto sa nedá spoliehať na to, že všetky dáta sa zmestia do pamäte. Z tohto dôvodu sú datasety často reprezentované ako **generátory**, ktoré dokážu vracať dáta v minibatchoch vhodných na tréning.\n", + "V reálnom živote môžu byť veľkosti obrazových datasetov pomerne veľké a nemožno počítať s tým, že všetky údaje sa zmestia do pamäte. Preto sú datasety často reprezentované ako **generátory**, ktoré môžu vracať dáta v minibatchoch vhodných na trénovanie.\n", "\n", - "Na prácu s klasifikáciou obrázkov obsahuje Keras špeciálnu funkciu `image_dataset_from_directory`, ktorá dokáže načítať obrázky z podadresárov zodpovedajúcich rôznym triedam. Táto funkcia sa tiež stará o škálovanie obrázkov a dokáže dataset rozdeliť na tréningovú a testovaciu podmnožinu:\n" + "Na spracovanie klasifikácie obrazov Keras obsahuje špeciálnu funkciu `image_dataset_from_directory`, ktorá dokáže načítať obrázky zo podadresárov zodpovedajúcich rôznym triedam. Táto funkcia sa tiež stará o škálovanie obrázkov a dokáže rozdeliť dataset na trénovaciu a testovaciu množinu:\n" ] }, { @@ -383,9 +383,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Je dôležité nastaviť rovnakú hodnotu `seed` pre oba volania, pretože ovplyvňuje rozdelenie obrázkov medzi tréningovú a testovaciu množinu.\n", + "Je dôležité nastaviť rovnakú hodnotu `seed` pre oba volania, pretože ovplyvňuje rozdelenie obrázkov medzi trénovaciu a testovaciu množinu dát.\n", "\n", - "Dataset automaticky preberá názvy tried z adresárov a môžete k nim pristúpiť, ak je to potrebné, zavolaním:\n" + "Dataset automaticky načíta názvy tried z adresárov a k nim môžete získať prístup, ak je to potrebné, zavolaním:\n" ] }, { @@ -412,7 +412,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Datasety, ktoré sme získali, môžu byť priamo odovzdané funkcii `fit` na natrénovanie modelu. Obsahujú zodpovedajúce obrázky aj štítky, ktoré je možné prechádzať pomocou nasledujúcej konštrukcie:\n" + "Dataset, ktoré sme získali, možno priamo odovzdať funkcii `fit` na trénovanie modelu. Obsahujú príslušné obrázky aj štítky, s ktorými je možné prechádzať pomocou nasledujúcej konštrukcie:\n" ] }, { @@ -453,7 +453,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "> **Poznámka**: Všetky obrázky v datasete sú reprezentované ako desatinné bodové tenzory v rozsahu 0-255. Pred ich odoslaním do neurónovej siete musíme tieto hodnoty škálovať do rozsahu 0-1. Pri zobrazovaní obrázkov musíme urobiť to isté, alebo konvertovať hodnoty na typ `int` (čo robíme v kóde vyššie), aby sme ukázali `matplotlib`, že chceme zobraziť pôvodný neškálovaný obrázok.\n" + "> **Poznámka**: Všetky obrázky v dátovej sade sú reprezentované ako tenzory s pohyblivou desatinou čiarkou v rozsahu 0-255. Pred ich odovzdaním neuronovej sieti musíme tieto hodnoty škálovať do rozsahu 0-1. Pri zobrazovaní obrázkov musíme urobiť to isté, alebo prekonvertovať hodnoty na typ `int` (čo robíme v kóde vyššie), aby sme `matplotlib` ukázali, že chceme zobraziť pôvodný neskalovaný obrázok.\n" ] }, { @@ -462,7 +462,7 @@ "source": [ "## Predtrénované modely\n", "\n", - "Pre mnohé úlohy klasifikácie obrázkov je možné nájsť predtrénované modely neurónových sietí. Mnohé z týchto modelov sú dostupné v rámci názvového priestoru `keras.applications`, a ešte viac modelov je možné nájsť na internete. Pozrime sa, ako možno načítať a použiť najjednoduchší model VGG-16:\n" + "Pre mnohé úlohy klasifikácie obrázkov je možné nájsť predtrénované modely neurónových sietí. Mnoho týchto modelov je dostupných v rámci priestoru názvov `keras.applications` a ešte viac modelov možno nájsť na internete. Pozrime sa, ako možno načítať a použiť najjednoduchší model VGG-16:\n" ] }, { @@ -497,7 +497,17 @@ } ], "source": [ - "vgg = keras.applications.VGG16()\n", + "# SHA-256 of VGG16 weights (with top)\n", + "VGG16_WEIGHTS_SHA256 = '64373286793e3c8b2b4e3219cbf3544bce2f55ab4682710a29f5e7af8f5e4f61'\n", + "\n", + "_weights_path = keras.utils.get_file(\n", + " 'vgg16_weights_tf_dim_ordering_tf_kernels.h5',\n", + " 'https://storage.googleapis.com/tensorflow/keras-applications/vgg16/vgg16_weights_tf_dim_ordering_tf_kernels.h5',\n", + " file_hash=VGG16_WEIGHTS_SHA256,\n", + " hash_algorithm='sha256',\n", + ")\n", + "\n", + "vgg = keras.applications.VGG16(weights=_weights_path)\n", "inp = keras.applications.vgg16.preprocess_input(x_sample[:1])\n", "\n", "res = vgg(inp)\n", @@ -510,11 +520,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Existuje niekoľko dôležitých vecí:\n", - "\n", - "* Pred odoslaním vstupu do akejkoľvek predtrénovanej siete je potrebné ho určitým spôsobom predspracovať. Toto sa vykonáva volaním príslušnej funkcie `preprocess_input`, ktorá prijíma dávku obrázkov a vracia ich spracovanú formu. V prípade VGG-16 sú obrázky normalizované a od každého kanála sa odpočíta preddefinovaná priemerná hodnota. Je to preto, že VGG-16 bola pôvodne trénovaná s týmto predspracovaním.\n", - "* Neurónová sieť sa aplikuje na vstupnú dávku a výsledkom je dávka 1000-prvkových tenzorov, ktoré ukazujú pravdepodobnosť každej triedy. Najpravdepodobnejšie číslo triedy môžeme nájsť volaním `argmax` na tomto tenzore.\n", - "* Získaný výsledok je [číslo triedy `ImageNet`](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Aby sme tomuto výsledku porozumeli, môžeme použiť aj funkciu `decode_predictions`, ktorá vráti n najlepších tried spolu s ich názvami.\n" + "Tu je niekoľko dôležitých vecí:\n", + "* Pred odovzdaním vstupu do akejkoľvek predtrénovanej siete musí byť vstup predspracovaný určitým spôsobom. To sa robí volaním príslušnej funkcie `preprocess_input`, ktorá prijíma dávku obrázkov a vracia ich spracovanú formu. V prípade VGG-16 sú obrázky normalizované a od jednotlivých kanálov sa odčíta preddefinovaná priemerná hodnota. Je to preto, že VGG-16 bol pôvodne trénovaný s týmto predspracovaním.\n", + "* Na vstupnú dávku sa aplikuje neurónová sieť a ako výsledok dostaneme dávku 1000-prvkových tenzorov, ktoré ukazujú pravdepodobnosť každej triedy. Najpravdepodobnejšie číslo triedy môžeme nájsť volaním `argmax` na tomto tenzore.\n", + "* Získaný výsledok je [číslo triedy `ImageNet`](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Aby výsledok dával zmysel, môžeme tiež použiť funkciu `decode_predictions`, ktorá vráti najlepších n tried spolu s ich názvami.\n" ] }, { @@ -600,7 +609,7 @@ "source": [ "## Výpočty na GPU\n", "\n", - "Hlboké neurónové siete, ako napríklad VGG-16 a ďalšie modernejšie architektúry, vyžadujú pomerne veľa výpočtového výkonu na spustenie. Má zmysel využiť akceleráciu GPU, ak je k dispozícii. Našťastie, Keras automaticky zrýchľuje výpočty na GPU, ak je dostupná. Môžeme skontrolovať, či Tensorflow dokáže používať GPU pomocou nasledujúceho kódu:\n" + "Hlboké neurónové siete, ako VGG-16 a iné modernejšie architektúry, vyžadujú na spustenie pomerne veľký výpočtový výkon. Má zmysel použiť akceleráciu na GPU, ak je dostupná. Našťastie, Keras automaticky zrýchľuje výpočty na GPU, ak je k dispozícii. Môžeme skontrolovať, či Tensorflow dokáže použiť GPU pomocou nasledujúceho kódu:\n" ] }, { @@ -627,9 +636,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ + "\n", "## Extrahovanie vlastností VGG\n", "\n", - "Ak chceme použiť VGG-16 na extrahovanie vlastností z našich obrázkov, potrebujeme model bez posledných klasifikačných vrstiev. Model VGG-16 bez vrchných vrstiev môžeme inicializovať pomocou tohto kódu:\n" + "Ak chceme použiť VGG-16 na extrahovanie vlastností z našich obrázkov, potrebujeme model bez posledných klasifikačných vrstiev. Model VGG-16 bez horných vrstiev môžeme vytvoriť pomocou tohto kódu:\n" ] }, { @@ -681,9 +691,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Rozmer tenzora vlastností je 7x7x512, ale aby sme ho mohli vizualizovať, museli sme ho preformátovať do 2D podoby.\n", + "Rozmery tenzora príznakov sú 7x7x512, ale na jeho vizualizáciu sme ho museli preusporiadať do 2D formy.\n", "\n", - "Teraz sa pokúsme zistiť, či je možné tieto vlastnosti použiť na klasifikáciu obrázkov. Manuálne vezmeme určitú časť obrázkov (v našom prípade 50 minibatchov) a predpočítame ich vektor vlastností. Na to môžeme použiť API **dataset** od Tensorflow. Funkcia `map` vezme dataset a aplikuje zadanú lambda-funkciu na jeho transformáciu. Tento mechanizmus využívame na vytvorenie nových datasetov, `ds_features_train` a `ds_features_test`, ktoré obsahujú vlastnosti extrahované pomocou VGG namiesto pôvodných obrázkov.\n" + "Teraz skúsme zistiť, či je možné tieto príznaky použiť na klasifikáciu obrazov. Manuálne vezmeme nejakú časť obrázkov (v našom prípade 50 minibatchov) a predpočítame ich vektorové príznaky. Na to môžeme použiť Tensorflow **dataset** API. Funkcia `map` vezme dataset a aplikuje naň danú lambda-funkciu na transformáciu. Tento mechanizmus používame na vytvorenie nových datasetov, `ds_features_train` a `ds_features_test`, ktoré obsahujú príznaky extrahované z VGG namiesto pôvodných obrázkov.\n" ] }, { @@ -713,9 +723,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Použili sme konštrukciu `.take(50)` na obmedzenie veľkosti datasetu, aby sme urýchlili našu ukážku. Samozrejme, tento experiment môžete vykonať na celom datasete.\n", + "Použili sme konštrukciu `.take(50)` na obmedzenie veľkosti dátovej množiny, aby sme zrýchlili našu ukážku. Samozrejme môžete tento experiment vykonať na celej dátovej množine.\n", "\n", - "Teraz, keď máme dataset s extrahovanými črtami, môžeme natrénovať jednoduchý hustý klasifikátor na rozlíšenie medzi mačkami a psami. Táto sieť bude prijímať vektor čŕt s tvarom (7,7,512) a produkovať jeden výstup, ktorý zodpovedá buď psovi, alebo mačke. Keďže ide o binárnu klasifikáciu, používame aktivačnú funkciu `sigmoid` a stratu `binary_crossentropy`.\n" + "Teraz, keď máme dátovú množinu s vyextrahovanými črtami, môžeme trénovať jednoduchý hustý klasifikátor na rozlíšenie medzi mačkami a psami. Táto sieť prijme vektor čŕt v tvare (7,7,512) a vytvorí jeden výstup, ktorý zodpovedá buď psovi, alebo mačke. Keďže ide o binárnu klasifikáciu, používame aktivačnú funkciu `sigmoid` a stratu `binary_crossentropy`.\n" ] }, { @@ -744,13 +754,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Výsledok je skvelý, dokážeme rozlíšiť medzi mačkou a psom s takmer 95% pravdepodobnosťou! Avšak, tento prístup sme testovali iba na podmnožine všetkých obrázkov, pretože manuálna extrakcia čŕt sa zdá byť veľmi časovo náročná.\n", + "Výsledok je skvelý, dokážeme rozlíšiť medzi mačkou a psom s takmer 95 % pravdepodobnosťou! Avšak tento prístup sme otestovali iba na podmnožine všetkých obrázkov, pretože manuálne extrahovanie čŕt sa zdá byť časovo náročné.\n", "\n", - "## Transfer learning pomocou jednej siete VGG\n", + "## Transferové učenie s použitím jednej siete VGG\n", "\n", - "Manuálnemu predpočítavaniu čŕt sa môžeme vyhnúť aj tak, že počas tréningu použijeme pôvodnú sieť VGG-16 ako celok, pričom do našej siete pridáme extraktor čŕt ako prvú vrstvu.\n", + "Môžeme sa tiež vyhnúť manuálnemu predpočítaču čŕt tým, že počas tréningu použijeme pôvodnú sieť VGG-16 ako celok, pridaním extraktora čŕt do našej siete ako prvej vrstvy.\n", "\n", - "Krása architektúry Keras spočíva v tom, že model VGG-16, ktorý sme definovali vyššie, môže byť použitý aj ako vrstva v inej neurónovej sieti! Stačí nám zostaviť sieť s hustým klasifikátorom na vrchu a potom trénovať celú sieť pomocou spätného šírenia.\n" + "Krása architektúry Keras je v tom, že model VGG-16, ktorý sme definovali vyššie, môže byť tiež použitý ako vrstva v inej neurónovej sieti! Stačí, ak zkonštruujeme sieť s hustým klasifikátorom na jej vrchu a potom naučíme celú sieť pomocou spätného šírenia.\n" ] }, { @@ -794,13 +804,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Tento model vyzerá ako end-to-end klasifikačná sieť, ktorá prijíma obrázok a vracia triedu. Zádrhel však spočíva v tom, že chceme, aby VGG16 fungoval ako extraktor čŕt, a nie aby bol znovu trénovaný. Preto musíme **zmraziť váhy konvolučného extraktora čŕt**. K prvej vrstve siete sa dostaneme volaním `model.layers[0]` a stačí nastaviť vlastnosť `trainable` na hodnotu `False`.\n", + "Tento model vyzerá ako sieť na klasifikáciu end-to-end, ktorá vezme obrázok a vráti triedu. Avšak, zložitosť spočíva v tom, že chceme, aby VGG16 fungoval ako extraktor charakteristík, a nie aby bol znovu trénovaný. Preto potrebujeme **zmraziť váhy konvolučného extraktora charakteristík**. K prvej vrstve siete môžeme pristúpiť zavolaním `model.layers[0]` a stačí nastaviť vlastnosť `trainable` na `False`.\n", "\n", - "> **Note**: Zmrazenie váh extraktora čŕt je potrebné, pretože inak by netrénovaná klasifikačná vrstva mohla zničiť pôvodné predtrénované váhy konvolučného extraktora.\n", + "> **Poznámka**: Zmrazenie váh extraktora charakteristík je potrebné, pretože inak by netrénovaná klasifikačná vrstva mohla zničiť pôvodné predtrénované váhy konvolučného extraktora.\n", "\n", - "Môžete si všimnúť, že hoci celkový počet parametrov v našej sieti je okolo 15 miliónov, trénujeme iba 25 tisíc parametrov. Všetky ostatné parametre vrchných konvolučných filtrov sú predtrénované. To je dobré, pretože môžeme doladiť menší počet parametrov s menším počtom príkladov.\n", + "Môžete si všimnúť, že hoci je celkový počet parametrov v našej sieti okolo 15 miliónov, trénujeme len 25 tisíc parametrov. Všetky ostatné parametre vrcholových konvolučných filtrov sú predtrénované. To je dobré, pretože môžeme doladiť menší počet parametrov s menším počtom príkladov.\n", "\n", - "Teraz budeme trénovať našu sieť a uvidíme, aké dobré výsledky môžeme dosiahnuť. Očakávajte pomerne dlhý čas vykonávania a nebojte sa, ak sa zdá, že vykonávanie na chvíľu zamrzlo.\n" + "Teraz našu sieť natrénujeme a uvidíme, ako dobré výsledky môžeme dosiahnuť. Očakávajte skôr dlhší čas behu a nebojte sa, ak sa vykonávanie na chvíľu zdá zamrznuté.\n" ] }, { @@ -825,11 +835,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Vyzerá to, že sme získali pomerne presný klasifikátor mačiek a psov!\n", + "Vyzerá to, že sme získali pomerne presný klasifikátor mačiek a psov! \n", "\n", "## Ukladanie a načítanie modelu\n", "\n", - "Keď máme model natrénovaný, môžeme uložiť architektúru modelu a natrénované váhy do súboru na budúce použitie:\n" + "Keď máme model vytrénovaný, môžeme uložiť architektúru modelu a naučené váhy do súboru pre budúce použitie:\n" ] }, { @@ -853,7 +863,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Model môžeme kedykoľvek načítať zo súboru. Môže to byť užitočné v prípade, že nasledujúci experiment zničí model - nemuseli by ste začínať od začiatku.\n" + "Model si potom môžeme kedykoľvek načítať zo súboru. Môže sa vám to hodiť v prípade, že nasledujúci experiment model zničí – nebudete musieť začínať od začiatku.\n" ] }, { @@ -869,15 +879,15 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Jemné doladenie prenosového učenia\n", + "## Doladenie transferového učenia\n", "\n", - "V predchádzajúcej časti sme natrénovali poslednú vrstvu klasifikátora na klasifikáciu obrázkov v našej vlastnej dátovej sade. Avšak, nepretrénovali sme extraktor čŕt a náš model sa spoliehal na črty, ktoré sa naučil na dátach ImageNet. Ak sa vaše objekty vizuálne líšia od bežných obrázkov z ImageNet, táto kombinácia čŕt nemusí fungovať najlepšie. Preto má zmysel začať trénovať aj konvolučné vrstvy.\n", + "V predchádzajúcej časti sme vytrénovali poslednú klasifikačnú vrstvu, aby sme klasifikovali obrázky v našej vlastnej sade dát. Avšak extraktor príznakov sme nepreučovali a náš model sa spoliehal na príznaky, ktoré sa model naučil na údajoch ImageNet. Ak sa vaše objekty vizuálne líšia od bežných obrázkov ImageNet, táto kombinácia príznakov nemusí fungovať najlepšie. Preto má zmysel začať trénovať aj konvolučné vrstvy.\n", "\n", - "Aby sme to dosiahli, môžeme odomknúť parametre konvolučných filtrov, ktoré sme predtým zamkli.\n", + "Na to môžeme \"odmraziť\" parametre konvolučných filtrov, ktoré sme predtým zamrazili.\n", "\n", - "> **Note:** Je dôležité, aby ste najprv zamkli parametre a vykonali niekoľko epoch trénovania, aby sa stabilizovali váhy vo vrstve klasifikátora. Ak okamžite začnete trénovať sieť end-to-end s odomknutými parametrami, veľké chyby môžu zničiť predtrénované váhy v konvolučných vrstvách.\n", + "> **Poznámka:** Je dôležité, aby ste najskôr zamrazili parametre a vykonali niekoľko epoch trénovania, aby sa stabilizovali váhy v klasifikačnej vrstve. Ak hneď začnete trénovať end-to-end sieť s odmrazenými parametrami, veľké chyby pravdepodobne zničia predtrénované váhy v konvolučných vrstvách.\n", "\n", - "Náš konvolučný model VGG-16 sa nachádza v prvej vrstve a sám o sebe pozostáva z mnohých vrstiev. Môžeme sa pozrieť na jeho štruktúru:\n" + "Náš konvolučný VGG-16 model sa nachádza v prvej vrstve a sám pozostáva z mnohých vrstiev. Môžeme sa pozrieť na jeho štruktúru:\n" ] }, { @@ -945,7 +955,9 @@ { "cell_type": "markdown", "metadata": {}, - "source": [] + "source": [ + "Môžeme odblokovať všetky vrstvy konvolučnej bázy:\n" + ] }, { "cell_type": "code", @@ -960,7 +972,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Avšak, rozmraziť všetky naraz nie je najlepší nápad. Najskôr môžeme rozmraziť len niekoľko posledných vrstiev konvolúcií, pretože obsahujú vyššie úrovne vzorov, ktoré sú relevantné pre naše obrázky. Napríklad, na začiatok môžeme zmraziť všetky vrstvy okrem posledných 4:\n" + "Avšak všetky naraz rozmraziť nie je najlepší nápad. Najskôr môžeme rozmraziť len niekoľko posledných vrstiev konvolúcií, pretože obsahujú vzory vyššej úrovne, ktoré sú relevantné pre naše obrázky. Napríklad, na začiatok môžeme zmraziť všetky vrstvy okrem posledných 4: \n" ] }, { @@ -999,11 +1011,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Počet trénovateľných parametrov sa výrazne zvýšil, ale stále je to približne 50 % zo všetkých parametrov.\n", + "Všimnite si, že počet trénovateľných parametrov sa výrazne zvýšil, ale stále je to približne 50 % zo všetkých parametrov.\n", "\n", - "Po odomknutí môžeme vykonať ešte niekoľko epoch trénovania (v našom príklade vykonáme iba jednu). Môžete si tiež zvoliť nižšiu rýchlosť učenia, aby ste minimalizovali vplyv na predtrénované váhy. Avšak, aj pri nízkej rýchlosti učenia môžete očakávať, že presnosť na začiatku trénovania klesne, až kým nakoniec nedosiahne mierne vyššiu úroveň ako v prípade fixných váh.\n", + "Po odomknutí môžeme vykonať niekoľko ďalších epoch trénovania (v našom príklade urobíme len jednu). Môžete tiež zvoliť nižšiu mieru učenia, aby ste minimalizovali vplyv na predtrénované váhy. Avšak aj pri nízkej miere učenia môžete očakávať pokles presnosti na začiatku tréningu, až kým nakoniec nedosiahne mierne vyššiu úroveň než v prípade pevných váh.\n", "\n", - "> **Note:** Toto trénovanie prebieha oveľa pomalšie, pretože musíme šíriť gradienty späť cez mnoho vrstiev siete!\n" + "> **Poznámka:** Toto trénovanie prebieha omnoho pomalšie, pretože musíme spätne šíriť gradienty cez mnoho vrstiev siete!\n" ] }, { @@ -1027,9 +1039,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Je pravdepodobné, že dosiahneme vyššiu presnosť na tréningovej množine, pretože používame výkonnejšiu sieť s väčším počtom parametrov, ale presnosť na validačnej množine sa nezvýši až tak výrazne.\n", + "Je pravdepodobné, že dosiahneme vyššiu presnosť na tréningu, pretože používame výkonejšiu sieť s viacerými parametrami, ale presnosť na validácii by sa nezvýšila tak veľmi.\n", "\n", - "Neváhajte odomknúť niekoľko ďalších vrstiev siete a trénovať ďalej, aby ste zistili, či dokážete dosiahnuť vyššiu presnosť!\n" + "Kľudne odomknite niekoľko ďalších vrstiev siete a trénujte viac, aby ste zistili, či dokážete dosiahnuť vyššiu presnosť!\n" ] }, { @@ -1038,7 +1050,7 @@ "source": [ "## Iné modely počítačového videnia\n", "\n", - "VGG-16 je jednou z najjednoduchších architektúr počítačového videnia. Keras poskytuje mnoho ďalších predtrénovaných sietí. Medzi najčastejšie používané patria architektúry **ResNet**, vyvinuté spoločnosťou Microsoft, a **Inception** od Googlu. Napríklad, poďme preskúmať architektúru najjednoduchšieho modelu ResNet-50 (ResNet je rodina modelov s rôznou hĺbkou, môžete skúsiť experimentovať s ResNet-152, ak chcete vidieť, ako vyzerá skutočne hlboký model):\n" + "VGG-16 je jedna z najjednoduchších architektúr počítačového videnia. Keras poskytuje mnoho ďalších predtrénovaných sietí. Medzi najčastejšie používané patria **ResNet** architektúry vyvinuté spoločnosťou Microsoft a **Inception** od Google. Napríklad preskúmajme architektúru najjednoduchšieho modelu ResNet-50 (ResNet je rodina modelov s rôznou hĺbkou, môžete skúsiť experimentovať s ResNet-152, ak chcete vidieť, ako vyzerá naozaj hlboký model):\n" ] }, { @@ -1440,11 +1452,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Ako môžete vidieť, model obsahuje rovnaké známe stavebné bloky: konvolučné vrstvy, pooling vrstvy a finálny hustý klasifikátor. Tento model môžeme použiť presne rovnakým spôsobom, ako sme používali VGG-16 na transferové učenie. Môžete skúsiť experimentovať s vyššie uvedeným kódom, použiť rôzne ResNet modely ako základný model a sledovať, ako sa mení presnosť.\n", + "Ako vidíte, model obsahuje rovnaké známe stavebné bloky: konvolučné vrstvy, poolingové vrstvy a záverečný hustý klasifikátor. Tento model môžeme použiť presne rovnakým spôsobom, ako sme používali VGG-16 na prenosové učenie. Môžete si skúsiť experimentovať s kódom vyššie, použiť rôzne modely ResNet ako základný model a sledovať, ako sa mení presnosť.\n", "\n", - "## Batch Normalizácia\n", + "## Normalizácia batchov\n", "\n", - "Táto sieť obsahuje ešte jeden typ vrstvy: **Batch Normalizácia**. Myšlienka batch normalizácie spočíva v tom, že hodnoty, ktoré prechádzajú neurónovou sieťou, sa privedú do správneho intervalu. Zvyčajne neurónové siete fungujú najlepšie, keď sú všetky hodnoty v rozsahu [-1,1] alebo [0,1], a preto naše vstupné dáta primerane škálujeme/normalizujeme. Počas trénovania hlbokej siete sa však môže stať, že hodnoty sa výrazne dostanú mimo tento rozsah, čo spôsobuje problémy pri trénovaní. Vrstva batch normalizácie vypočíta priemer a štandardnú odchýlku pre všetky hodnoty aktuálneho minibatchu a použije ich na normalizáciu signálu predtým, ako ho pošle cez vrstvu neurónovej siete. Toto výrazne zlepšuje stabilitu hlbokých sietí.\n" + "Táto sieť obsahuje ešte jeden typ vrstvy: **Batch Normalization** (normalizácia batchov). Myšlienkou normalizácie batchov je dostať hodnoty, ktoré prechádzajú neurónovou sieťou, do správneho intervalu. Zvyčajne neurónové siete fungujú najlepšie, keď sú všetky hodnoty v rozsahu [-1,1] alebo [0,1], a preto vstupné údaje podľa toho škálujeme/normalizujeme. Avšak počas trénovania hlbokej siete sa môže stať, že hodnoty výrazne prekročia tento rozsah, čo robí trénovanie problematickým. Vrstva batch normalization vypočíta priemer a štandardnú odchýlku pre všetky hodnoty aktuálneho minibatchu a použije ich na normalizáciu signálu predtým, než ho posunie cez neurónovú vrstvu. Toto výrazne zlepšuje stabilitu hlbokých sietí.\n" ] }, { @@ -1453,16 +1465,16 @@ "source": [ "## Zhrnutie\n", "\n", - "Použitím transferového učenia sme dokázali rýchlo zostaviť klasifikátor pre našu úlohu klasifikácie vlastných objektov a dosiahnuť vysokú presnosť. Tento príklad však nebol úplne spravodlivý, pretože pôvodná sieť VGG-16 bola predtrénovaná na rozpoznávanie mačiek a psov, takže sme len znovu využívali väčšinu vzorov, ktoré už boli v sieti prítomné. Môžete očakávať nižšiu presnosť pri exotickejších objektoch špecifických pre danú oblasť, ako sú detaily na výrobnej linke v továrni alebo rôzne listy stromov.\n", + "Použitím transferového učenia sme dokázali rýchlo zostaviť klasifikátor pre našu vlastnú úlohu klasifikácie objektov a dosiahnuť vysokú presnosť. Tento príklad však nebol úplne spravodlivý, pretože pôvodná sieť VGG-16 bola predtrénovaná na rozpoznávanie mačiek a psov, a tak sme len znovu použili väčšinu vzorov, ktoré už v sieti boli. Nižšiu presnosť možno očakávať pri exotickejších predmetoch špecifických pre danú doménu, ako sú detaily na výrobnej linke v závode alebo rôzne listy stromov.\n", "\n", - "Vidíte, že zložitejšie úlohy, ktoré teraz riešime, vyžadujú vyšší výpočtový výkon a nemôžu byť ľahko vyriešené na CPU. V ďalšej jednotke sa pokúsime použiť ľahšiu implementáciu na trénovanie toho istého modelu s nižšími výpočtovými zdrojmi, čo povedie len k mierne nižšej presnosti.\n" + "Je vidieť, že zložitejšie úlohy, ktoré teraz riešime, vyžadujú vyšší výpočtový výkon a nedajú sa jednoducho riešiť na CPU. V nasledujúcej jednotke sa pokúsime použiť ľahšiu implementáciu na trénovanie toho istého modelu s využitím nižších výpočtových zdrojov, čo má za následok len o niečo nižšiu presnosť.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**Upozornenie**: \nTento dokument bol preložený pomocou služby AI prekladu [Co-op Translator](https://github.com/Azure/co-op-translator). Hoci sa snažíme o presnosť, prosím, berte na vedomie, že automatizované preklady môžu obsahovať chyby alebo nepresnosti. Pôvodný dokument v jeho rodnom jazyku by mal byť považovaný za autoritatívny zdroj. Pre kritické informácie sa odporúča profesionálny ľudský preklad. Nie sme zodpovední za žiadne nedorozumenia alebo nesprávne interpretácie vyplývajúce z použitia tohto prekladu.\n" + "---\n\n\n**Vyhlásenie o zodpovednosti**:\nTento dokument bol preložený pomocou AI prekladateľskej služby [Co-op Translator](https://github.com/Azure/co-op-translator). Hoci sa snažíme o presnosť, vezmite prosím na vedomie, že automatické preklady môžu obsahovať chyby alebo nepresnosti. Pôvodný dokument v jeho natívnom jazyku by mal byť považovaný za autoritatívny zdroj. Pre kritické informácie sa odporúča profesionálny ľudský preklad. Nie sme zodpovední za žiadne nedorozumenia alebo nesprávne interpretácie vyplývajúce z použitia tohto prekladu.\n\n" ] } ], @@ -1483,12 +1495,6 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" - }, - "coopTranslator": { - "original_hash": "c189abc107848f96051085cc30945129", - "translation_date": "2025-08-29T23:18:28+00:00", - "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", - "language_code": "sk" } }, "nbformat": 4, diff --git a/translations/sk/lessons/5-NLP/README.md b/translations/sk/lessons/5-NLP/README.md index c500831d25..d221a9797f 100644 --- a/translations/sk/lessons/5-NLP/README.md +++ b/translations/sk/lessons/5-NLP/README.md @@ -1,26 +1,26 @@ # Spracovanie prirodzeného jazyka -![Zhrnutie úloh NLP v kresbe](../../../../translated_images/sk/ai-nlp.b22dcb8ca4707cea.webp) +![Zhrnutie úloh NLP v náčrte](../../../../translated_images/sk/ai-nlp.b22dcb8ca4707cea.webp) -V tejto sekcii sa zameriame na používanie neurónových sietí na riešenie úloh súvisiacich so **spracovaním prirodzeného jazyka (NLP)**. Existuje mnoho problémov v oblasti NLP, ktoré by sme chceli, aby počítače dokázali vyriešiť: +V tejto sekcii sa zameriame na využitie neurónových sietí na riešenie úloh súvisiacich so **spracovaním prirodzeného jazyka (NLP)**. Existuje veľa problémov v oblasti NLP, ktoré chceme, aby počítače vedeli riešiť: -* **Klasifikácia textu** je typický klasifikačný problém týkajúci sa textových sekvencií. Príklady zahŕňajú klasifikáciu e-mailových správ ako spam vs. ne-spam alebo kategorizáciu článkov ako šport, biznis, politika atď. Pri vývoji chatbotov často potrebujeme pochopiť, čo chcel používateľ povedať – v tomto prípade ide o **klasifikáciu zámeru**. Často sa pri klasifikácii zámeru musíme vysporiadať s mnohými kategóriami. -* **Analýza sentimentu** je typický regresný problém, kde musíme priradiť číslo (sentiment), ktoré zodpovedá tomu, ako pozitívny/negatívny je význam vety. Pokročilejšou verziou analýzy sentimentu je **analýza sentimentu na základe aspektov** (ABSA), kde priraďujeme sentiment nie celej vete, ale jej rôznym častiam (aspektom), napr. *V tejto reštaurácii sa mi páčila kuchyňa, ale atmosféra bola hrozná*. -* **Rozpoznávanie pomenovaných entít** (NER) sa týka problému extrakcie určitých entít z textu. Napríklad, môžeme potrebovať pochopiť, že vo fráze *Potrebujem letieť do Paríža zajtra* slovo *zajtra* odkazuje na DÁTUM a *Paríž* je LOKÁCIA. -* **Extrakcia kľúčových slov** je podobná NER, ale musíme automaticky extrahovať slová dôležité pre význam vety bez predchádzajúceho trénovania na konkrétne typy entít. -* **Zoskupovanie textu** môže byť užitočné, keď chceme zoskupiť podobné vety, napríklad podobné požiadavky v konverzáciách technickej podpory. -* **Odpovedanie na otázky** sa týka schopnosti modelu odpovedať na konkrétnu otázku. Model dostane textový úryvok a otázku ako vstupy a musí poskytnúť miesto v texte, kde sa nachádza odpoveď na otázku (alebo niekedy vygenerovať text odpovede). -* **Generovanie textu** je schopnosť modelu generovať nový text. Môže byť považované za klasifikačnú úlohu, ktorá predpovedá ďalšie písmeno/slovo na základe určitého *textového podnetu*. Pokročilé modely generovania textu, ako GPT-3, dokážu riešiť aj iné úlohy NLP, ako je klasifikácia, pomocou techniky nazývanej [programovanie podnetov](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) alebo [inžinierstvo podnetov](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29). -* **Sumarizácia textu** je technika, keď chceme, aby počítač "prečítal" dlhý text a zhrnul ho do niekoľkých viet. -* **Strojový preklad** môže byť vnímaný ako kombinácia porozumenia textu v jednom jazyku a generovania textu v inom. +* **Klasifikácia textu** je typický klasifikačný problém týkajúci sa sekvencií textu. Príklady zahŕňajú triedenie e-mailových správ na spam a ne-spam, alebo kategorizáciu článkov ako šport, biznis, politika a pod. Tiež pri vývoji chat botov často potrebujeme rozumieť, čo používateľ chcel povedať – v tomto prípade ide o **klasifikáciu zámerov** (intent classification). Často musíme v klasifikácii zámerov pracovať s mnohými kategóriami. +* **Sentimentálna analýza** je typický regresný problém, kde potrebujeme priradiť číselnú hodnotu (sentiment) zodpovedajúcu tomu, ako pozitívny alebo negatívny je význam vety. Pokročilejšou verziou sentimentálnej analýzy je **analýza založená na aspektoch** (ABSA), kde sentiment nepriraďujeme celej vete, ale rôznym jej častiam (aspektom), napr. *V tejto reštaurácii som mal rád kuchyňu, ale atmosféra bola hrozná*. +* **Rozpoznávanie pomenovaných entít** (NER) sa týka problému extrahovania určitých entít z textu. Napríklad potrebujeme pochopiť, že vo vete *Musím zajtra letieť do Paríža* slovo *zajtra* označuje DÁTUM a *Paríž* je MIESTO. +* **Extrahovanie kľúčových slov** je podobné NER, ale automaticky musíme vybrať slová dôležité pre význam vety bez predtrénovania na špecifické typy entít. +* **Zhlukovanie textu** je užitočné, keď chceme zoskupiť podobné vety, napríklad podobné požiadavky v rozhovoroch technickej podpory. +* **Odpovedanie na otázky** znamená schopnosť modelu odpovedať na konkrétnu otázku. Model dostáva ako vstup textový úsek a otázku a musí poskytnúť miesto v texte, kde je odpoveď obsiahnutá (alebo niekedy vygenerovať odpoveď). +* **Generovanie textu** je schopnosť modelu vytvárať nový text. Dá sa to považovať za klasifikačnú úlohu, ktorá predpovedá ďalší znak/slovo na základe nejakej *textovej výzvy*. Pokročilé modely generovania textu, ako GPT-3, dokážu riešiť aj iné úlohy NLP, napríklad klasifikáciu pomocou techniky nazývanej [prompt programming](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) alebo [prompt engineering](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29) +* **Zhrnutie textu** je technika, keď chceme, aby počítač „prečítal“ dlhý text a zhrnul ho do niekoľkých viet. +* **Strojový preklad** možno považovať za kombináciu pochopenia textu v jednom jazyku a generovania textu v inom jazyku. -Spočiatku sa väčšina úloh NLP riešila pomocou tradičných metód, ako sú gramatiky. Napríklad pri strojovom preklade sa používali analyzátory na transformáciu pôvodnej vety na syntaktický strom, potom sa extrahovali vyššie úrovne sémantických štruktúr na reprezentáciu významu vety a na základe tohto významu a gramatiky cieľového jazyka sa generoval výsledok. Dnes sa mnohé úlohy NLP efektívnejšie riešia pomocou neurónových sietí. +Spočiatku sa väčšina úloh NLP riešila použitím tradičných metód, ako sú gramatiky. Napríklad pri strojovom preklade sa používali parsery na transformáciu vety na syntaktický strom, potom sa extrahovali vyššie úrovne sémantických štruktúr na reprezentáciu významu vety a na základe tohto významu a gramatiky cieľového jazyka sa generoval výsledok. Dnes sa veľa úloh NLP efektívnejšie rieši pomocou neurónových sietí. -> Mnohé klasické metódy NLP sú implementované v Python knižnici [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org). Online je dostupná skvelá [NLTK kniha](https://www.nltk.org/book/), ktorá pokrýva, ako môžu byť rôzne úlohy NLP riešené pomocou NLTK. +> Mnohé klasické metódy NLP sú implementované v Python knižnici [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org). K dispozícii je výborná [NLTK kniha](https://www.nltk.org/book/), ktorá pokrýva, ako rôzne úlohy NLP riešiť s využitím NLTK. -V našom kurze sa budeme prevažne zameriavať na používanie neurónových sietí pre NLP a NLTK použijeme tam, kde to bude potrebné. +V našom kurze sa budeme predovšetkým venovať využitiu neurónových sietí pre NLP a NLTK využijeme tam, kde bude potrebné. -Už sme sa naučili používať neurónové siete na prácu s tabuľkovými dátami a obrázkami. Hlavný rozdiel medzi týmito typmi dát a textom je, že text je sekvencia s variabilnou dĺžkou, zatiaľ čo veľkosť vstupu v prípade obrázkov je známa vopred. Zatiaľ čo konvolučné siete dokážu extrahovať vzory z vstupných dát, vzory v texte sú zložitejšie. Napríklad, negácia môže byť oddelená od subjektu ľubovoľným počtom slov (napr. *Nemám rád pomaranče* vs. *Nemám rád tie veľké farebné chutné pomaranče*), a to by stále malo byť interpretované ako jeden vzor. Preto na spracovanie jazyka potrebujeme zaviesť nové typy neurónových sietí, ako sú *rekurentné siete* a *transformery*. +Už sme sa učili používať neurónové siete na spracovanie tabuľkových údajov a obrázkov. Hlavný rozdiel medzi týmito typmi dát a textom je, že text je sekvencia premennej dĺžky, zatiaľ čo veľkosť vstupu v prípade obrázkov je vopred známa. Kým konvolučné siete dokážu extrahovať vzory zo vstupných dát, vzory v texte sú zložitejšie. Napríklad záporka môže byť vzdialená od podmetu o ľubovoľný počet slov (napr. *Nemám rád pomaranče* vs. *Nemám rád tie veľké farebné chutné pomaranče*) a stále by to malo byť interpretované ako jeden vzor. Preto na spracovanie jazyka potrebujeme zaviesť nové typy neurónových sietí, ako sú *rekurentné siete* a *transformery*. ## Inštalácia knižníc @@ -28,7 +28,7 @@ Ak používate lokálnu inštaláciu Pythonu na spustenie tohto kurzu, možno bu **Pre PyTorch** ```bash -pip install -r requirements-torch.txt +pip install -r requirements-pytorch.txt ``` **Pre TensorFlow** ```bash @@ -40,12 +40,12 @@ pip install -r requirements-tf.txt ## Upozornenie na GPU V tejto sekcii budeme v niektorých príkladoch trénovať pomerne veľké modely. -* **Používajte počítač s podporou GPU**: Odporúča sa spúšťať vaše notebooky na počítači s podporou GPU, aby sa skrátili čakacie doby pri práci s veľkými modelmi. -* **Obmedzenia pamäte GPU**: Používanie GPU môže viesť k situáciám, keď vám dôjde pamäť GPU, najmä pri trénovaní veľkých modelov. -* **Spotreba pamäte GPU**: Množstvo pamäte GPU spotrebovanej počas trénovania závisí od rôznych faktorov, vrátane veľkosti minibatchu. -* **Minimalizujte veľkosť minibatchu**: Ak narazíte na problémy s pamäťou GPU, zvážte zníženie veľkosti minibatchu vo vašom kóde ako možné riešenie. -* **Uvoľnenie pamäte GPU v TensorFlow**: Staršie verzie TensorFlow nemusia správne uvoľniť pamäť GPU pri trénovaní viacerých modelov v jednom Python kerneli. Na efektívne riadenie využitia pamäte GPU môžete nakonfigurovať TensorFlow tak, aby alokoval pamäť GPU iba podľa potreby. -* **Zahrnutie kódu**: Ak chcete nastaviť TensorFlow na dynamické alokovanie pamäte GPU, zahrňte nasledujúci kód do vašich notebookov: +* **Používajte počítač s GPU**: Odporúča sa spúšťať notebooky na počítači s GPU, aby sa skrátili čakacie doby pri práci s veľkými modelmi. +* **Obmedzenia pamäte GPU**: Pri práci na GPU môže nastať situácia vyčerpania pamäte GPU, najmä pri trénovaní veľkých modelov. +* **Spotreba pamäte GPU**: Množstvo spotrebovanej pamäte GPU pri tréningu závisí od rôznych faktorov, vrátane veľkosti minibatchu. +* **Minimalizujte veľkosť minibatchu**: Ak narazíte na problém s pamäťou GPU, zvážte zníženie veľkosti minibatchu vo vašom kóde ako možné riešenie. +* **Uvoľňovanie pamäte GPU v TensorFlow**: Staršie verzie TensorFlow nemusia správne uvoľňovať pamäť GPU pri tréningu viacerých modelov v jednom Python kerneli. Na efektívne riadenie spotreby pamäte GPU môžete nakonfigurovať TensorFlow tak, aby alokoval pamäť GPU len podľa potreby. +* **Zahrnutie kódu**: Na nastavenie TensorFlow tak, aby zväčšoval alokáciu pamäte GPU len podľa potreby, vložte do svojich notebookov nasledujúci 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) ``` -Ak máte záujem o učenie sa NLP z pohľadu klasického ML, navštívte [tento súbor lekcií](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP) +Ak vás zaujíma učenie NLP z klasickej perspektívy strojového učenia, navštívte [túto sadu lekcií](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP) ## V tejto sekcii V tejto sekcii sa naučíme: * [Reprezentácia textu ako tenzorov](13-TextRep/README.md) -* [Vstupné vektory slov](14-Emdeddings/README.md) +* [Vkladanie slov](14-Emdeddings/README.md) * [Modelovanie jazyka](15-LanguageModeling/README.md) * [Rekurentné neurónové siete](16-RNN/README.md) * [Generatívne siete](17-GenerativeNetworks/README.md) * [Transformery](18-Transformers/README.md) -**Upozornenie**: -Tento dokument bol preložený pomocou služby AI prekladu [Co-op Translator](https://github.com/Azure/co-op-translator). Aj keď sa snažíme o presnosť, prosím, berte na vedomie, že automatizované preklady môžu obsahovať chyby alebo nepresnosti. Pôvodný dokument v jeho rodnom jazyku by mal byť považovaný za autoritatívny zdroj. Pre kritické informácie sa odporúča profesionálny ľudský preklad. Nie sme zodpovední za akékoľvek nedorozumenia alebo nesprávne interpretácie vyplývajúce z použitia tohto prekladu. \ No newline at end of file +--- + + +**Vyhlásenie o zodpovednosti**: +Tento dokument bol preložený pomocou AI prekladateľskej služby [Co-op Translator](https://github.com/Azure/co-op-translator). Hoci sa snažíme o presnosť, vezmite prosím na vedomie, že automatické preklady môžu obsahovať chyby alebo nepresnosti. Pôvodný dokument v jeho natívnom jazyku by mal byť považovaný za autoritatívny zdroj. Pre kritické informácie sa odporúča profesionálny ľudský preklad. Nie sme zodpovední za žiadne nedorozumenia alebo nesprávne interpretácie vyplývajúce z použitia tohto prekladu. + \ No newline at end of file diff --git a/translations/sl/.co-op-translator.json b/translations/sl/.co-op-translator.json index d68ddf7bc0..41c69d8a4c 100644 --- a/translations/sl/.co-op-translator.json +++ b/translations/sl/.co-op-translator.json @@ -5,6 +5,12 @@ "source_file": "AGENTS.md", "language_code": "sl" }, + "CONTRIBUTING.md": { + "original_hash": "c6fd7e781b67111a90abd166d0ce4aa0", + "translation_date": "2026-07-08T19:56:20+00:00", + "source_file": "CONTRIBUTING.md", + "language_code": "sl" + }, "README.md": { "original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b", "translation_date": "2026-04-06T16:31:26+00:00", @@ -17,6 +23,19 @@ "source_file": "SECURITY.md", "language_code": "sl" }, + "__translation_failures__": { + "lessons/sketchnotes/LICENSE.md": { + "original_hash": "45ab63a2cd8f5faef6c9b150618837a4", + "source_file": "lessons/sketchnotes/LICENSE.md", + "language_code": "sl", + "failure_date": "2026-07-08T19:48:24+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:45:04+00:00", @@ -54,8 +73,8 @@ "language_code": "sl" }, "examples/README.md": { - "original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7", - "translation_date": "2025-10-03T11:35:04+00:00", + "original_hash": "7883d52c2e2a221e0b07a7b112a149b9", + "translation_date": "2026-07-08T19:43:20+00:00", "source_file": "examples/README.md", "language_code": "sl" }, @@ -66,8 +85,8 @@ "language_code": "sl" }, "lessons/0-course-setup/how-to-run.md": { - "original_hash": "a4717bd9103b9f6cd84d534b83534689", - "translation_date": "2026-01-16T06:10:42+00:00", + "original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1", + "translation_date": "2026-07-08T19:43:42+00:00", "source_file": "lessons/0-course-setup/how-to-run.md", "language_code": "sl" }, @@ -191,6 +210,12 @@ "source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md", "language_code": "sl" }, + "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": { + "original_hash": "99b816b6a4957ef4100cee4c4221dff9", + "translation_date": "2026-07-08T19:35:58+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", + "language_code": "sl" + }, "lessons/4-ComputerVision/08-TransferLearning/lab/README.md": { "original_hash": "7765935c35fcee69b9fe2d0cfd6963e2", "translation_date": "2025-08-25T23:17:15+00:00", @@ -330,8 +355,8 @@ "language_code": "sl" }, "lessons/5-NLP/README.md": { - "original_hash": "8ef02a9318257ea140ed3ed74442096d", - "translation_date": "2025-08-25T21:30:03+00:00", + "original_hash": "038df6f1a73e49f6430740da083bfd6d", + "translation_date": "2026-07-08T19:44:11+00:00", "source_file": "lessons/5-NLP/README.md", "language_code": "sl" }, diff --git a/translations/sl/CONTRIBUTING.md b/translations/sl/CONTRIBUTING.md new file mode 100644 index 0000000000..c43ec296d1 --- /dev/null +++ b/translations/sl/CONTRIBUTING.md @@ -0,0 +1,29 @@ +# Prispevanje k AI-For-Beginners + +Hvala za vaš interes za prispevanje k AI-For-Beginners! Veselimo se prevodov, popravkov lekcij in popravkov oblikovanja. + +## Microsoft Contributor License Agreement (CLA) + +Ta projekt sprejema prispevke in predloge. Večina prispevkov zahteva, da se strinjate s pogodbo Contributor License Agreement (CLA), v kateri izjavite, da imate pravico, in ji dejansko podelite pravice za uporabo vašega prispevka. Za podrobnosti obiščite [https://cla.microsoft.com](https://cla.microsoft.com). + +Ko oddate pull request, bo CLA-bot samodejno ugotovil, ali morate predložiti CLA, in ustrezno označil PR (npr. z nalepko, komentarjem). Preprosto sledite navodilom, ki jih poda bot. To bo treba storiti samo enkrat za vse repozitorije, ki uporabljajo naš CLA. + +## Kako prispevati + +### 1. Popravljanje tipkarskih napak / kodnih napak +Če najdete tipkarsko napako ali napako v kateri koli Jupyter beležnici ali markdown datoteki lekcije: +1. Forkajte repozitorij. +2. Popravite tipkarsko napako ali pokvarjeno povezavo. +3. Pošljite Pull Request z jasnim opisom popravka. + +### 2. Oddaja prevodov +Veselimo se prevodov lekcij v druge jezike! Prosimo, da prevode postavite v mapo `translations/` z uporabo obstoječih imen map (na primer `translations/es/`, `translations/pt-BR/`, `translations/zh-CN/`). + +Za več podrobnosti glejte [etc/CONTRIBUTING.md](etc/CONTRIBUTING.md). + +--- + + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo AI prevajalske storitve [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da avtomatizirani prevodi lahko vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za kritične informacije je priporočljiv strokovni človeški prevod. Ne odgovarjamo za morebitna nesporazume ali napačne interpretacije, ki izhajajo iz uporabe tega prevoda. + \ No newline at end of file diff --git a/translations/sl/examples/README.md b/translations/sl/examples/README.md index a2914fc46e..449c470cab 100644 --- a/translations/sl/examples/README.md +++ b/translations/sl/examples/README.md @@ -1,31 +1,31 @@ -# Primeri umetne inteligence za začetnike +# Primeri AI za začetnike -Dobrodošli! Ta imenik vsebuje preproste, samostojne primere, ki vam bodo pomagali začeti z umetno inteligenco in strojno učenje. Vsak primer je zasnovan tako, da je prijazen začetnikom, z natančnimi komentarji in razlagami korak za korakom. +Dobrodošli! Ta imenik vsebuje preproste, samostojne primere, ki vam pomagajo začeti z umetno inteligenco in strojno učenje. Vsak primer je zasnovan tako, da je prijazen do začetnikov z podrobnimi komentarji in pojasnili korak za korakom. ## 📚 Pregled primerov -| Primer | Opis | Težavnost | Predznanje | -|--------|------|-----------|------------| -| [Hello AI World](../../../examples/01-hello-ai-world.py) | Vaš prvi program umetne inteligence - preprosto prepoznavanje vzorcev | ⭐ Začetnik | Osnove Pythona | -| [Preprosta nevronska mreža](../../../examples/02-simple-neural-network.py) | Zgradite nevronsko mrežo iz nič | ⭐⭐ Začetnik+ | Python, osnovna matematika | -| [Razvrščevalnik slik](./03-image-classifier.ipynb) | Razvrščajte slike s predhodno naučenim modelom | ⭐⭐ Začetnik+ | Python, numpy | -| [Besedilni sentiment](../../../examples/04-text-sentiment.py) | Analizirajte sentiment besedila (pozitivno/negativno) | ⭐⭐ Začetnik+ | Python | +| Primer | Opis | Težavnost | Predpogoji | +|---------|-------------|------------|---------------| +| [Hello AI World](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/01-hello-ai-world.py) | Vaš prvi AI program – prepoznavanje preprostih vzorcev | ⭐ Začetnik | Osnove Pythona | +| [Simple Neural Network](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/02-simple-neural-network.py) | Ustvarite nevronsko mrežo iz nič | ⭐⭐ Začetnik+ | Python, osnovna matematika | +| [Image Classifier](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/03-image-classifier.ipynb) | Razvrščanje slik z vnaprej usposobljenim modelom | ⭐⭐ Začetnik+ | Python, numpy | +| [Text Sentiment](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/04-text-sentiment.py) | Analiza čustvenega tona besedila (pozitivno/negativno) | ⭐⭐ Začetnik+ | Python | ## 🚀 Začetek ### Predpogoji -Prepričajte se, da imate nameščen Python (priporočena različica 3.8 ali višja). Namestite potrebne pakete: +Poskrbite, da imate nameščen Python (priporočena različica 3.8 ali novejša). Namestite zahtevane pakete: ```bash -# For Python scripts +# Za Python skripte pip install numpy -# For Jupyter notebooks (image classifier) +# Za Jupyter zvezke (razvrščevalnik slik) pip install jupyter numpy pillow tensorflow ``` -Ali uporabite conda okolje iz glavnega kurikuluma: +Ali uporabite conda okolje iz glavnega učnega načrta: ```bash conda env create --name ai4beg --file ../environment.yml @@ -39,47 +39,49 @@ conda activate ai4beg python 01-hello-ai-world.py ``` -**Za Jupyter beležke (.ipynb datoteke):** +**Za Jupyter zapiske (.ipynb datoteke):** ```bash jupyter notebook 03-image-classifier.ipynb ``` ## 📖 Učni načrt -Priporočamo, da sledite primerom po vrsti: +Priporočamo, da sledite primerom po vrstnem redu: -1. **Začnite z "Hello AI World"** - Spoznajte osnove prepoznavanja vzorcev -2. **Zgradite preprosto nevronsko mrežo** - Razumite, kako delujejo nevronske mreže -3. **Preizkusite razvrščevalnik slik** - Oglejte si umetno inteligenco v akciji s pravimi slikami -4. **Analizirajte besedilni sentiment** - Raziščite obdelavo naravnega jezika +1. **Začnite s "Hello AI World"** – Spoznajte osnove prepoznavanja vzorcev +2. **Zgradite preprosto nevronsko mrežo** – Razumite, kako delujejo nevronske mreže +3. **Preizkusite razvrščevalec slik** – Oglejte si AI pri delu z resničnimi slikami +4. **Analizirajte čustveni ton besedila** – Raziskujte obdelavo naravnega jezika ## 💡 Nasveti za začetnike -- **Pozorno preberite komentarje v kodi** - Razložijo, kaj počne vsaka vrstica -- **Eksperimentirajte!** - Poskusite spreminjati vrednosti in opazujte rezultate -- **Ne skrbite, če ne razumete vsega** - Učenje zahteva čas -- **Postavljajte vprašanja** - Uporabite [diskusijsko ploščo](https://github.com/microsoft/AI-For-Beginners/discussions) +- **Pozorno preberite komentarje v kodi** – Pojasnjujejo, kaj naredi vsak vrstica +- **Eksperimentirajte!** – Spreminjajte vrednosti in opazujte, kaj se zgodi +- **Ne skrbite, če ne razumete vsega takoj** – Učenje zahteva čas +- **Postavljajte vprašanja** – Uporabite [forum za razpravo](https://github.com/microsoft/AI-For-Beginners/discussions) ## 🔗 Naslednji koraki -Ko zaključite te primere, raziščite celoten kurikulum: -- [Uvod v umetno inteligenco](../lessons/1-Intro/README.md) +Ko končate s temi primeri, si oglejte celotni učni načrt: +- [Uvod v AI](../lessons/1-Intro/README.md) - [Nevronske mreže](../lessons/3-NeuralNetworks/README.md) - [Računalniški vid](../lessons/4-ComputerVision/README.md) - [Obdelava naravnega jezika](../lessons/5-NLP/README.md) -## 🤝 Prispevanje +## 🤝 Prispevki -So vam bili ti primeri v pomoč? Pomagajte nam jih izboljšati: -- Prijavite težave ali predlagajte izboljšave +So vam ti primeri v pomoč? Pomagajte nam jih izboljšati: +- Poročajte o težavah ali predlagajte izboljšave - Dodajte več primerov za začetnike - Izboljšajte dokumentacijo in komentarje --- -*Zapomnite si: Vsak strokovnjak je bil nekoč začetnik. Veselo učenje! 🎓* +*Zapomnite si: Vsak strokovnjak je bil nekoč začetnik. Srečno učenje! 🎓* --- -**Omejitev odgovornosti**: -Ta dokument je bil preveden z uporabo storitve AI za prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem maternem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo profesionalni človeški prevod. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo AI prevajalske storitve [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da avtomatizirani prevodi lahko vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za kritične informacije je priporočljiv strokovni človeški prevod. Ne odgovarjamo za morebitna nesporazume ali napačne interpretacije, ki izhajajo iz uporabe tega prevoda. + \ No newline at end of file diff --git a/translations/sl/lessons/0-course-setup/how-to-run.md b/translations/sl/lessons/0-course-setup/how-to-run.md index 03a2ea2f44..12dd90c9f5 100644 --- a/translations/sl/lessons/0-course-setup/how-to-run.md +++ b/translations/sl/lessons/0-course-setup/how-to-run.md @@ -1,12 +1,12 @@ # Kako zagnati kodo -Ta učni načrt vsebuje veliko izvajalnih primerov in laboratorijskih vaj, ki jih boste želeli zagnati. Da bi to naredili, morate imeti možnost izvajanja Python kode v Jupyter beležnicah, ki so vključene v ta učni načrt. Za izvajanje kode imate več možnosti: +Ta učni načrt vsebuje veliko izvedljivih primerov in laboratorijskih vaj, ki jih boste želeli zagnati. Za to potrebujete možnost izvajanja Pythona v Jupyter zvezkih, ki so del tega učnega načrta. Na voljo imate več možnosti za zagon kode: ## Zagon lokalno na vašem računalniku -Za lokalni zagon kode na vašem računalniku je potrebna namestitev Pythona. Ena izmed priporočil je namestitev **[miniconda](https://conda.io/en/latest/miniconda.html)** – gre za dokaj lahko namestitev, ki podpira upravitelja paketov `conda` za različna Python **virtualna okolja**. +Za zagon kode lokalno na vašem računalniku je potrebna Python namestitev. Priporočamo namestitev **[miniconda](https://conda.io/en/latest/miniconda.html)** – gre za razmeroma lahko namestitev, ki podpira upravljanje paketov `conda` za različna Python **virtualna okolja**. -Ko namestite minicondo, klonirajte repozitorij in ustvarite virtualno okolje, ki bo uporabljeno za ta tečaj: +Po namestitvi miniconde klonirajte repozitorij in ustvarite virtualno okolje, ki bo uporabljeno za ta tečaj: ```bash git clone http://github.com/microsoft/ai-for-beginners @@ -17,17 +17,17 @@ conda activate ai4beg ### Uporaba Visual Studio Code z razširitvijo Python -Ta učni načrt je najbolje uporabljati, ko ga odprete v [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) z [razširitvijo Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste). +Ta učni načrt je najbolje uporabljati, če ga odprete v [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) z [razširitvijo Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste). -> **Opomba**: Ko klonirate in odprete mapo v VS Code, vam bo samodejno predlagal, da namestite Python razširitve. Prav tako boste morali namestiti minicondo, kot je opisano zgoraj. +> **Opomba**: Ko klonirate in odprete mapo v VS Code, vam bo samodejno predlagal namestitev Python razširitev. Prav tako boste morali namestiti minicondo, kot je opisano zgoraj. -> **Opomba**: Če vam VS Code predlaga, da ponovno odprete repozitorij v vsebniku, to zavrnite, da uporabite lokalno namestitev Pythona. +> **Opomba**: Če vam VS Code predlaga, da repozitorij ponovno odprete v vsebniku, tega zavrnite, da boste uporabljali lokalno Python namestitev. ### Uporaba Jupyter v brskalniku -Lahko uporabite tudi Jupyter okolje prek brskalnika na vašem računalniku. Tako klasični Jupyter kot JupyterHub nudita priročno razvojno okolje z avtomatskim dokončevanjem, poudarkom kode itd. +Jupyter okolje lahko uporabljate tudi iz brskalnika na svojem računalniku. Tako klasični Jupyter kot JupyterHub nudita priročno razvojno okolje z avto-dokončevanjem, poudarjanjem kode itd. -Za zagon Juypterja lokalno pojdite v mapo s tečajem in izvedite: +Za zagon Jupyterja lokalno pojdite v mapo s tečajem in zaženite: ```bash jupyter notebook @@ -36,36 +36,36 @@ ali ```bash jupyterhub ``` -Nato lahko odprete katerokoli `.ipynb` datoteko in začnete z delom. +Nato lahko odprete katere koli `.ipynb` datoteke in začnete z delom. ### Zagon v vsebniku -Ena alternativa lokalni namestitvi Pythona je zagon kode v vsebniku. Ker naš repozitorij vsebuje posebno mapo `.devcontainer`, ki navodila za gradnjo vsebnika za ta repozitorij, VS Code ponuja možnost ponovnega odpiranja kode v vsebniku. To zahteva namestitev Dockerja in je nekoliko bolj zapleteno, zato priporočamo to bolj izkušenim uporabnikom. +Ena alternativa Python namestitvi je zagon kode v vsebniku. Ker naš repozitorij vsebuje posebno mapo `.devcontainer`, ki določa, kako zgraditi vsebnik za ta repozitorij, VS Code ponuja možnost ponovnega odpiranja kode v vsebniku. To zahteva namestitev Dockerja in je nekoliko bolj zapleteno, zato priporočamo to izkušenejšim uporabnikom. ## Zagon v oblaku -Če ne želite namestiti Pythona lokalno in imate dostop do oblačnih virov, je dobra alternativa zagon kode v oblaku. Obstaja več načinov, kako to storite: +Če ne želite namestiti Pythona lokalno in imate dostop do oblakov, je dobra alternativa zagon kode v oblaku. Obstaja več načinov za to: -* Uporaba **[GitHub Codespaces](https://github.com/features/codespaces)**, ki je virtualno okolje, ustvarjeno za vas na GitHubu, dostopno prek brskalniškega vmesnika VS Code. Če imate dostop do Codespaces, lahko preprosto kliknete gumb **Code** v repozitoriju, začnete codespace in kmalu zaženete okolje. -* Uporaba **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) nudi brezplačne računalniške vire v oblaku, da lahko uporabniki, kot ste vi, preizkusijo kodo na GitHubu. Na začetni strani je gumb za odpiranje repozitorija v Binderju – s tem boste hitro preusmerjeni na Binder spletno mesto, ki bo zgradilo osnovni vsebnik in brez težav zagnalo Jupyter spletni vmesnik. +* Uporaba **[GitHub Codespaces](https://github.com/features/codespaces)**, ki je virtualno okolje, ustvarjeno za vas na GitHubu, dostopno preko VS Code v brskalniku. Če imate dostop do Codespaces, lahko kliknete gumb **Code** v repozitoriju, zaženete codespace in začnete v hipu. +* Uporaba **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) nudi brezplačne računske vire v oblaku za ljudi, ki želijo preizkusiti kodo na GitHubu. Na vstupni strani je gumb za odprtje repozitorija v Binderju – to vas bo hitro odpeljalo na Binder spletno stran, ki bo zgradila osnovni vsebnik in brez težav zagnala Jupyter spletni vmesnik. -> **Opomba**: Da bi preprečili zlorabe, Binder blokira dostop do določenih spletnih virov. To lahko prepreči delovanje nekaterih kod, ki nalagajo modele in/ali podatkovne nabore iz interneta. Morda boste morali poiskati kakšne rešitve. Prav tako so računalniški viri, ki jih nudi Binder, precej osnovni, zato bo učenje zanje počasnejše, zlasti v kasnejših, bolj zahtevnih lekcijah. +> **Opomba**: Da prepreči zlorabe, ima Binder blokiran dostop do nekatere spletne vsebine. To lahko prepreči delovanje kode, ki prenese modele in/ali podatkovne nize iz javnega interneta. Morda boste morali najti načine za zaobid. Računski viri, ki jih nudi Binder, so precej osnovni, zato bo učenje, zlasti v poznejših, bolj zapletenih lekcijah, počasno. ## Zagon v oblaku z GPU -Nekatere kasnejše lekcije tega učnega načrta bi zelo koristile podporo GPU. Na primer, treniranje modelov je drugače lahko zelo počasen proces. Nekaj možnosti imate še posebej, če imate dostop do oblačnih virov preko [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) ali vaše institucije: +Nekatere poznejše lekcije v tem učnem načrtu bi močno koristi podpora GPU. Na primer, trening modela je sicer lahko zelo počasen. Obstaja nekaj možnosti, ki jih lahko uporabite, še posebej, če imate dostop do oblaka preko [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) ali prek svoje institucije: -* Ustvarite [virtualni stroj za znanost o podatkih](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) in se povežite z njim prek Jupyter. Nato lahko klonirate repozitorij neposredno na stroj in začnete z učenjem. NC-serije VM-jev imajo podporo za GPU. +* Ustvarite [Data Science Virtual Machine](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) in se povežite nanjo preko Jupyterja. Nato lahko replicirate repozitorij neposredno v stroj in začnete z učenjem. NC-serija VM-jev ima podporo za GPU. -> **Opomba**: Nekatere naročnine, vključno z Azure for Students, ne zagotavljajo podpore za GPU privzeto. Morda boste morali preko tehnične podpore zaprositi za dodatna GPU jedra. +> **Opomba**: Nekateri naročniški paketi, vključno z Azure for Students, ne nudijo podpore za GPU takoj. Morda boste morali zaprositi za dodatne GPU jedra s tehnično podporo. -* Ustvarite [delovno okolje Azure Machine Learning](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) in uporabite funkcijo beležnice tam. [Ta video](https://azure-for-academics.github.io/quickstart/azureml-papers/) prikazuje, kako klonirati repozitorij v Azure ML beležnico in začeti z uporabo. +* Ustvarite [Azure Machine Learning Workspace](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) in nato uporabite funkcijo Notebook tam. [Ta video](https://azure-for-academics.github.io/quickstart/azureml-papers/) prikazuje, kako replicirati repozitorij v Azure ML notebook in ga začeti uporabljati. -Lahko uporabite tudi Google Colab, ki nudi nekaj brezplačne podpore za GPU, in naložite Jupyter beležnice, da jih izvajate eno za drugo. +Prav tako lahko uporabite Google Colab, ki nudi nekaj brezplačne podpore za GPU, in naložite Jupyter zvezke tam za izvajanje posamezno. --- **Omejitev odgovornosti**: -To besedilo je bilo prevedeno z uporabo AI prevajalske storitve [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, upoštevajte, da lahko avtomatski prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvorno jeziku velja za zanesljiv vir. Za pomembne informacije priporočamo strokovni človeški prevod. Ne odgovarjamo za morebitna nesporazume ali napačne razlage, ki nastanejo zaradi uporabe tega prevoda. +Ta dokument je bil preveden z uporabo AI prevajalske storitve [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da avtomatizirani prevodi lahko vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za kritične informacije je priporočljiv strokovni človeški prevod. Ne odgovarjamo za morebitna nesporazume ali napačne interpretacije, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file diff --git a/translations/sl/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/sl/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index d0e2bff309..79d6f947e8 100644 --- a/translations/sl/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/sl/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -4,11 +4,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Vnaprej naučeni modeli in prenos učenja\n", + "# Predhodno naučeni modeli in prenosno učenje\n", "\n", - "Učenje CNN-jev lahko vzame veliko časa, poleg tega pa je za to nalogo potrebnih tudi veliko podatkov. Vendar pa se velik del časa porabi za učenje najboljših nizkonivojskih filtrov, ki jih mreža uporablja za izločanje vzorcev iz slik. Naravno se pojavi vprašanje - ali lahko uporabimo nevronsko mrežo, naučeno na enem naboru podatkov, in jo prilagodimo za razvrščanje drugih slik brez celotnega procesa učenja?\n", + "Učenje CNN-jev lahko traja veliko časa, za to nalogo pa je potrebnih tudi veliko podatkov. Vendar pa večino časa porabimo za učenje najboljših nizkonivojskih filtrov, ki jih omrežje uporablja za izločanje vzorcev iz slik. Naravno vprašanje se pojavi - ali lahko uporabimo nevronsko omrežje, naučeno na enem naboru podatkov, in ga prilagodimo za razvrščanje različnih slik brez celotnega procesa učenja?\n", "\n", - "Ta pristop se imenuje **prenos učenja**, saj prenesemo nekaj znanja iz enega modela nevronske mreže na drugega. Pri prenosu učenja običajno začnemo z vnaprej naučenim modelom, ki je bil naučen na velikem naboru slikovnih podatkov, kot je na primer **ImageNet**. Ti modeli že dobro opravljajo nalogo izločanja različnih značilnosti iz splošnih slik, in v mnogih primerih lahko že samo z gradnjo klasifikatorja na podlagi teh izločenih značilnosti dosežemo dobre rezultate.\n" + "Ta pristop se imenuje **prenosno učenje**, ker prenašamo nekaj znanja iz enega modela nevronskega omrežja v drugega. Pri prenosnem učenju običajno začnemo s predhodno naučenim modelom, ki je bil usposobljen na velikem naboru slik, kot je **ImageNet**. Ti modeli že dobro opravljajo delo pri izločanju različnih lastnosti iz generičnih slik, in v mnogih primerih lahko samo izgradnja klasifikatorja na vrhu teh izločenih lastnosti prinese dober rezultat.\n" ] }, { @@ -29,11 +29,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Dataset Mačke proti Psom\n", + "## Podatkovni niz Mačke proti Psom\n", "\n", - "V tej enoti bomo reševali resničen problem razvrščanja slik mačk in psov. Za ta namen bomo uporabili [Kaggle Cats vs. Dogs Dataset](https://www.kaggle.com/c/dogs-vs-cats), ki ga lahko prenesete tudi [z Microsofta](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n", + "V tej enoti bomo rešili resničen problem razvrščanja slik mačk in psov. Za ta namen bomo uporabili [Kaggle Cats vs. Dogs Dataset](https://www.kaggle.com/c/dogs-vs-cats), ki ga je mogoče tudi prenesti [pri Microsoftu](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n", "\n", - "Prenesimo ta nabor podatkov in ga razširimo v imenik `data` (ta postopek lahko traja nekaj časa!):\n" + "Prenesimo ta podatkovni niz in ga razpakirajmo v imenik `data` (ta postopek lahko traja nekaj časa!):\n" ] }, { @@ -64,7 +64,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Na žalost je v naboru podatkov nekaj poškodovanih slikovnih datotek. Hitro čiščenje moramo opraviti, da preverimo poškodovane datoteke. Da ne bi preobremenili tega priročnika, smo kodo za preverjanje nabora podatkov premaknili v modul.\n" + "Na žalost je v naboru podatkov nekaj poškodovanih slikovnih datotek. Potrebno je hitro čiščenje za preverjanje poškodovanih datotek. Da ne bi poremetili tega vodiča, smo kodo za preverjanje nabora podatkov premaknili v modul.\n" ] }, { @@ -333,13 +333,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Nalaganje podatkovnega nabora\n", + "## Nalaganje nabora podatkov\n", "\n", - "V prejšnjih primerih smo nalagali podatkovne nabore, ki so že vgrajeni v Keras. Zdaj se bomo ukvarjali z lastnim podatkovnim naborom, ki ga moramo naložiti iz imenika slik.\n", + "V prejšnjih primerih smo nalagali nabore podatkov, ki so vgrajeni v Keras. Zdaj pa bomo obravnavali lasten nabor podatkov, ki ga moramo naložiti iz imenika slik.\n", "\n", - "V resničnem življenju so velikosti podatkovnih naborov slik lahko precej velike, zato se ne moremo zanašati na to, da bodo vsi podatki lahko shranjeni v pomnilniku. Zaradi tega so podatkovni nabori pogosto predstavljeni kot **generatorji**, ki lahko vračajo podatke v manjših serijah, primernih za učenje.\n", + "V resničnem življenju so lahko velikosti naborov slik precej velike in ni mogoče računati, da se vsi podatki lahko shranijo v pomnilnik. Zato so nabori podatkov pogosto predstavljeni kot **generatorji**, ki lahko vračajo podatke v minibatchih, primernih za učenje.\n", "\n", - "Za obravnavo klasifikacije slik Keras vključuje posebno funkcijo `image_dataset_from_directory`, ki lahko naloži slike iz podimenikov, ki ustrezajo različnim razredom. Ta funkcija prav tako poskrbi za skaliranje slik in lahko razdeli podatkovni nabor na učne in testne podnabor:\n" + "Za obravnavo klasifikacije slik Keras vključuje posebno funkcijo `image_dataset_from_directory`, ki lahko naloži slike iz podimenikov, ki ustrezajo različnim razredom. Ta funkcija poskrbi tudi za skaliranje slik, prav tako pa lahko razdeli nabor podatkov na podnabor treninga in testa:\n" ] }, { @@ -383,9 +383,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Pomembno je nastaviti enako vrednost `seed` za oba klica, saj to vpliva na razdelitev slik med učnim in testnim naborom podatkov.\n", + "Pomembno je nastaviti enako vrednost `seed` za oba klica, saj to vpliva na razdelitev slik med učni in testni nabor podatkov.\n", "\n", - "Nabor podatkov samodejno prepozna imena razredov iz imenikov, do njih pa lahko dostopate, če je potrebno, z naslednjim klicem:\n" + "Nabor podatkov samodejno zajame imena razredov iz imenikov, in do njih lahko dostopate, če je to potrebno, z klicem:\n" ] }, { @@ -412,7 +412,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Podatkovne zbirke, ki smo jih pridobili, lahko neposredno posredujemo funkciji `fit` za treniranje modela. Vsebujejo tako ustrezne slike kot oznake, ki jih lahko pregledujemo z naslednjo konstrukcijo:\n" + "Nabore podatkov, ki smo jih pridobili, je mogoče neposredno posredovati funkciji `fit` za učenje modela. Vsebujejo tako ustrezne slike kot oznake, preko katerih je mogoče zanko izvesti z naslednjo konstrukcijo:\n" ] }, { @@ -453,7 +453,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "> **Opomba**: Vse slike v podatkovnem naboru so predstavljene kot plavajoče točkovne tenzorje z razponom 0-255. Preden jih posredujemo nevronski mreži, moramo te vrednosti skalirati v razpon 0-1. Pri risanju slik moramo storiti enako ali pretvoriti vrednosti v tip `int` (kar naredimo v zgornji kodi), da `matplotlib` pokažemo, da želimo narisati izvirno neskalirano sliko.\n" + "> **Opomba**: Vse slike v podatkovnem naboru so predstavljene kot plavajoče točke tenzorji z razponom 0-255. Preden jih posredujemo nevronski mreži, moramo te vrednosti skalirati v razpon 0-1. Pri risanju slik moramo enako storiti ali pa vrednosti pretvoriti v tip `int` (kar naredimo v zgornji kodi), da pokažemo `matplotlib`, da želimo narisati izvirno neskalirano sliko.\n" ] }, { @@ -462,7 +462,7 @@ "source": [ "## Vnaprej naučeni modeli\n", "\n", - "Za številne naloge razvrščanja slik lahko najdemo vnaprej naučene modele nevronskih mrež. Veliko teh modelov je na voljo v imenskem prostoru `keras.applications`, še več modelov pa je mogoče najti na internetu. Poglejmo, kako lahko naložimo in uporabimo najpreprostejši model VGG-16:\n" + "Za številne naloge razvrščanja slik lahko najdemo vnaprej naučene modele nevronskih mrež. Veliko teh modelov je na voljo znotraj imenskega prostora `keras.applications`, še več modelov pa lahko najdemo na internetu. Poglejmo, kako lahko najpreprostejši model VGG-16 naložimo in uporabimo:\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": [ - "Obstaja nekaj pomembnih stvari tukaj:\n", - "* Preden posredujemo vhodne podatke kateremu koli vnaprej naučenemu omrežju, jih je treba predhodno obdelati na določen način. To se izvede z uporabo ustrezne funkcije `preprocess_input`, ki prejme serijo slik in vrne njihovo obdelano obliko. V primeru VGG-16 so slike normalizirane, nato pa se odšteje vnaprej določena povprečna vrednost za vsak kanal. To je zato, ker je bil VGG-16 prvotno naučen s to predhodno obdelavo.\n", - "* Nevronsko omrežje se uporabi na vhodni seriji, rezultat pa je serija 1000-elementnih tenzorjev, ki prikazujejo verjetnost za vsak razred. Najbolj verjetno številko razreda lahko najdemo z uporabo funkcije `argmax` na tem tenzorju.\n", - "* Pridobljeni rezultat je [številka razreda `ImageNet`](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Da bi ta rezultat razumeli, lahko uporabimo tudi funkcijo `decode_predictions`, ki vrne n najboljših razredov skupaj z njihovimi imeni.\n" + "Tukaj je nekaj pomembnih stvari:\n", + "* Preden vhod podamo kateremu koli predhodno naučenemu omrežju, ga je treba na določen način predobdelati. To se naredi z uporabo ustrezne funkcije `preprocess_input`, ki prejme serijo slik in vrne njihovo predoblikovano obliko. V primeru VGG-16 so slike normalizirane in od vsakega kanala je odšteta vnaprej določena povprečna vrednost. To je zato, ker je bil VGG-16 prvotno treniran s to predobdelavo.\n", + "* Nevronska mreža se uporabi na vhodno serijo, kot rezultat pa dobimo serijo tenzorjev s 1000 elementi, ki prikazujejo verjetnost za vsako kategorijo. Najverjetnejšo kategorijo najdemo z uporabo `argmax` na tem tenzorju.\n", + "* Pridobljen rezultat je [številka `ImageNet` kategorije](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Za razumevanje tega rezultata lahko uporabimo tudi funkcijo `decode_predictions`, ki vrne najbolj verjetne n razredov skupaj z njihovimi imeni.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Poglejmo si tudi arhitekturo omrežja VGG-16:\n" + "Poglejmo tudi arhitekturo omrežja VGG-16:\n" ] }, { @@ -597,9 +607,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Izračuni na GPU\n", + "## Izračuni z GPU\n", "\n", - "Globoke nevronske mreže, kot je VGG-16 in druge sodobnejše arhitekture, zahtevajo precej računske moči za delovanje. Smiselno je uporabiti pospeševanje z GPU, če je na voljo. Na srečo Keras samodejno pospeši izračune na GPU, če je ta na voljo. Preverimo lahko, ali Tensorflow lahko uporablja GPU, z naslednjo kodo:\n" + "Globoke nevronske mreže, kot so VGG-16 in druge bolj sodobne arhitekture, zahtevajo precej računske moči za delovanje. Smiselno je uporabiti pospeševanje z GPU, če je na voljo. Na srečo Keras samodejno pohitri izračune na GPU, če je ta na voljo. Preverimo lahko, ali Tensorflow lahko uporablja GPU z naslednjo kodo:\n" ] }, { @@ -626,9 +636,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Ekstrakcija značilnosti z VGG\n", "\n", - "Če želimo uporabiti VGG-16 za ekstrakcijo značilnosti iz naših slik, potrebujemo model brez končnih slojev za klasifikacijo. Model VGG-16 brez zgornjih slojev lahko ustvarimo z naslednjo kodo:\n" + "## Izvlečenje VGG značilk\n", + "\n", + "Če želimo uporabiti VGG-16 za izvlečenje značilk iz naših slik, potrebujemo model brez končnih klasifikacijskih plasti. Model VGG-16 brez zgornjih plasti lahko ustvarimo z naslednjo kodo:\n" ] }, { @@ -680,9 +691,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Dimenzija tenzorja značilnosti je 7x7x512, vendar smo ga morali za vizualizacijo preoblikovati v 2D obliko.\n", + "Dimenzija tensorskih značilk je 7x7x512, vendar smo jo za vizualizacijo morali preoblikovati v 2D obliko.\n", "\n", - "Zdaj poskusimo ugotoviti, ali lahko te značilnosti uporabimo za razvrščanje slik. Ročno bomo vzeli del slik (v našem primeru 50 mini serij) in vnaprej izračunali njihove vektorske značilnosti. Za to lahko uporabimo Tensorflow **dataset** API. Funkcija `map` vzame podatkovni niz in nanj uporabi podano lambda-funkcijo za transformacijo. Ta mehanizem uporabimo za konstrukcijo novih podatkovnih nizov, `ds_features_train` in `ds_features_test`, ki vsebujejo značilnosti, pridobljene z VGG, namesto originalnih slik.\n" + "Zdaj poskusimo ugotoviti, ali je mogoče te značilke uporabiti za razvrščanje slik. Ročno bomo vzeli nekaj delov slik (50 mini paketov, v našem primeru) in predhodno izračunali njihove vektorske značilke. Za to lahko uporabimo Tensorflow **dataset** API. Funkcija `map` vzame podatkovni niz in uporabi dano lambda-funkcijo za njegovo transformacijo. Ta mehanizem uporabljamo za ustvarjanje novih podatkovnih nizov, `ds_features_train` in `ds_features_test`, ki namesto izvirnih slik vsebujejo značilke, pridobljene z VGG.\n" ] }, { @@ -712,9 +723,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Uporabili smo konstrukcijo `.take(50)`, da smo omejili velikost nabora podatkov in s tem pospešili našo predstavitev. Seveda lahko ta eksperiment izvedete na celotnem naboru podatkov.\n", + "Uporabljali smo konstrukcijo `.take(50)`, da omejimo velikost nabora podatkov, s čimer smo pospešili našo demonstracijo. Seveda lahko ta eksperiment izvedete na celotnem naboru podatkov.\n", "\n", - "Zdaj, ko imamo nabor podatkov z izluščenimi značilnostmi, lahko naučimo preprost gost klasifikator za razlikovanje med mačkami in psi. Ta mreža bo sprejela vektorsko značilnost oblike (7,7,512) in proizvedla en izhod, ki ustreza bodisi psu bodisi mački. Ker gre za binarno klasifikacijo, uporabimo aktivacijsko funkcijo `sigmoid` in izgubo `binary_crossentropy`.\n" + "Zdaj, ko imamo nabor podatkov z izvlečenimi značilnostmi, lahko naučimo preprost gosto povezan klasifikator za razlikovanje med mačkami in psi. Ta nevronska mreža bo sprejela vektor značilnosti oblike (7,7,512) in proizvedla en izhod, ki ustreza psu ali mački. Ker gre za binarno klasifikacijo, uporabljamo aktivacijsko funkcijo `sigmoid` in funkcijo izgube `binary_crossentropy`.\n" ] }, { @@ -743,13 +754,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Rezultat je odličen, saj lahko z skoraj 95-odstotno verjetnostjo ločimo med mačko in psom! Vendar smo ta pristop testirali le na podmnožici vseh slik, ker ročno pridobivanje značilnosti zahteva veliko časa.\n", + "Rezultat je odličen, razlikujemo lahko med mačko in psom z skoraj 95-odstotno verjetnostjo! Vendar smo ta pristop preizkusili le na podmnožici vseh slik, saj se zdi ročno izvlečenje značilk zelo časovno zahtevno.\n", "\n", - "## Prenos učenja z uporabo ene VGG mreže\n", + "## Prenosno učenje z uporabo enega VGG omrežja\n", "\n", - "Ročnega predhodnega izračunavanja značilnosti se lahko izognemo tudi tako, da med treningom uporabimo celotno izvirno mrežo VGG-16, tako da dodamo ekstraktor značilnosti kot prvo plast v našo mrežo.\n", + "Prav tako se lahko izognemo ročnemu predračunanju značilk tako, da uporabimo izvirno VGG-16 omrežje kot celoto med treniranjem, tako, da našemu omrežju kot prvo plast dodamo ekstraktor značilk. \n", "\n", - "Lepota arhitekture Keras je v tem, da se model VGG-16, ki smo ga definirali zgoraj, lahko uporabi tudi kot plast v drugi nevronski mreži! Potrebno je le sestaviti mrežo z gostim klasifikatorjem na vrhu in nato celotno mrežo trenirati z uporabo povratnega razširjanja.\n" + "Lepota Keras arhitekture je, da lahko VGG-16 model, ki smo ga definirali zgoraj, uporabimo tudi kot plast v drugem nevronskem omrežju! Potrebno je le sestaviti omrežje z gostim klasifikatorjem na vrhu in nato celotno omrežje trenirati z metodo povratnega širjenja napake.\n" ] }, { @@ -793,13 +804,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Ta model je videti kot mreža za klasifikacijo od začetka do konca, ki sprejme sliko in vrne razred. Vendar je zapleteno to, da želimo, da VGG16 deluje kot ekstraktor značilnosti in da se ne ponovno uči. Zato moramo **zamrzniti uteži konvolucijskega ekstraktorja značilnosti**. Do prve plasti mreže lahko dostopamo z ukazom `model.layers[0]`, nato pa moramo samo nastaviti lastnost `trainable` na `False`.\n", + "Ta model izgleda kot celovita klasifikacijska mreža, ki vzame sliko in vrne razred. Vendar je zapleteno to, da želimo, da VGG16 deluje kot extractor značilk in da se ne trenira znova. Zato moramo **zamrzniti uteži konvolucijskega extractorja značilk**. Do prve plasti mreže lahko dostopamo z `model.layers[0]`, in samo nastaviti moramo lastnost `trainable` na `False`.\n", "\n", - "> **Opomba**: Zamrznitev uteži ekstraktorja značilnosti je potrebna, ker lahko neizurjena plast klasifikatorja uniči originalne predhodno naučene uteži konvolucijskega ekstraktorja.\n", + "> **Opomba**: Zamrzovanje uteži extractorja značilk je potrebno, ker bi sicer netrenirana klasifikacijska plast lahko uničila prvotne predtrenirane uteži konvolucijskega extractorja.\n", "\n", - "Opazite lahko, da čeprav je skupno število parametrov v naši mreži približno 15 milijonov, treniramo le 25 tisoč parametrov. Vsi drugi parametri konvolucijskih filtrov na višji ravni so predhodno naučeni. To je dobro, saj lahko prilagodimo manjše število parametrov z manjšim številom primerov.\n", + "Opazili boste, da je medtem ko je skupno število parametrov v naši mreži okoli 15 milijonov, treniramo samo 25 tisoč parametrov. Vsi drugi parametri konvolucijskih filtrov najvišje ravni so predtrenirani. To je dobro, ker lahko tako fino nastavimo manjše število parametrov z manjšim številom primerov.\n", "\n", - "Zdaj bomo trenirali našo mrežo in preverili, kako dobro lahko dosežemo. Pričakujte precej dolgo trajanje izvajanja, in ne skrbite, če se zdi, da je izvajanje za nekaj časa zamrznjeno.\n" + "Sedaj bomo trenirali našo mrežo in videli, kako dobri lahko postanemo. Pričakujte precej dolgo trajanje in ne skrbite, če se bo izvajanje za nekaj časa zdelo zaustavljeno.\n" ] }, { @@ -824,11 +835,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Zdi se, da smo pridobili dokaj natančen klasifikator za mačke in pse!\n", + "Izgleda, da smo pridobili razmeroma natančen razvrščevalnik mačk proti psom! \n", "\n", "## Shranjevanje in nalaganje modela\n", "\n", - "Ko model enkrat treniramo, lahko arhitekturo modela in naučene uteži shranimo v datoteko za prihodnjo uporabo:\n" + "Ko enkrat naučimo model, lahko arhitekturo modela in naučene uteži shranimo v datoteko za prihodnjo uporabo:\n" ] }, { @@ -852,7 +863,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Model lahko nato kadar koli naložimo iz datoteke. To je lahko koristno, če naslednji poskus uniči model - ne bi vam bilo treba začeti znova od začetka.\n" + "Model lahko nato kadar koli naložimo iz datoteke. To se vam lahko zdi uporabno v primeru, da naslednji eksperiment uniči model - ne bi se vam bilo treba znova začeti od začetka.\n" ] }, { @@ -868,15 +879,15 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Fino uglaševanje prenosa učenja\n", + "## Prenova prenosnega učenja s fino nastavljenjem\n", "\n", - "V prejšnjem poglavju smo izurili zadnji sloj klasifikatorja za razvrščanje slik v našem lastnem naboru podatkov. Vendar pa nismo ponovno izurili ekstraktorja značilnosti, zato se je naš model zanašal na značilnosti, ki jih je model naučil na podatkih ImageNet. Če se vaši objekti vizualno razlikujejo od običajnih slik ImageNet, ta kombinacija značilnosti morda ne bo delovala najbolje. Zato je smiselno začeti trenirati tudi konvolucijske sloje.\n", + "V prejšnjem razdelku smo usposobili zadnjo klasifikacijsko plast za razvrščanje slik v našem lastnem naboru podatkov. Vendar pa nismo ponovno usposobili izvlečka značilk in naš model je temeljil na značilkah, ki se jih je model naučil na podatkih ImageNet. Če se vaši objekti vizualno razlikujejo od običajnih slik ImageNet, ta kombinacija značilk morda ne bo najbolj učinkovita. Zato je smiselno začeti usposabljati tudi konvolucijske plasti.\n", "\n", - "Da to storimo, lahko odmrznemo parametre konvolucijskih filtrov, ki smo jih prej zamrznili.\n", + "Za to lahko odmrznemo parametre konvolucijskih filtrov, ki smo jih prej zamrznili.\n", "\n", - "> **Opomba:** Pomembno je, da najprej zamrznete parametre in izvedete več epoh treniranja, da stabilizirate uteži v klasifikacijskem sloju. Če takoj začnete trenirati celotno mrežo z odmrznjenimi parametri, bodo velike napake verjetno uničile vnaprej naučene uteži v konvolucijskih slojih.\n", + "> **Opomba:** Pomembno je, da najprej zamrznete parametre in izvedete več epoh usposabljanja, da stabilizirate uteži v klasifikacijski plasti. Če takoj začnete usposabljati celotno omrežje z odmrznjenimi parametri, lahko velike napake uničijo vnaprej usposobljene uteži v konvolucijskih plasteh.\n", "\n", - "Naš konvolucijski model VGG-16 se nahaja znotraj prvega sloja in je sestavljen iz več slojev. Lahko si ogledamo njegovo strukturo:\n" + "Naš konvolucijski VGG-16 model se nahaja znotraj prve plasti in je sam sestavljen iz mnogih plasti. Lahko si pogledamo njegovo strukturo:\n" ] }, { @@ -945,7 +956,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Lahko odmrznemo vse plasti konvolucijske osnove:\n" + "Vse plasti konvolucijske baze lahko odklenemo:\n" ] }, { @@ -961,7 +972,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Vendar odmrznitev vseh naenkrat ni najboljša ideja. Najprej lahko odmrznemo le nekaj zadnjih slojev konvolucij, saj ti vsebujejo višjenivojske vzorce, ki so pomembni za naše slike. Na primer, za začetek lahko zamrznemo vse sloje razen zadnjih 4:\n" + "Vendar pa odmrzovanje vseh hkrati ni najboljša ideja. Najprej lahko odmrznemo le nekaj zadnjih slojev konvolucij, ker vsebujejo višje nivojske vzorce, ki so pomembni za naše slike. Na primer, lahko najprej zamrznemo vse sloje razen zadnjih 4:\n" ] }, { @@ -1000,11 +1011,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Opazite, da se je število učljivih parametrov znatno povečalo, vendar je še vedno približno 50 % vseh parametrov.\n", + "Opazimo, da se je število učnih parametrov bistveno povečalo, a je še vedno okoli 50 % vseh parametrov.\n", "\n", - "Po odmrznitvi lahko izvedemo še nekaj epochov učenja (v našem primeru bomo izvedli le enega). Prav tako lahko izberete nižjo hitrost učenja, da zmanjšate vpliv na vnaprej naučene uteži. Vendar pa lahko tudi pri nizki hitrosti učenja pričakujete, da bo natančnost na začetku učenja padla, dokler končno ne doseže nekoliko višje ravni kot v primeru fiksnih uteži.\n", + "Po odmrzovanju lahko izvedemo še nekaj epoh učenja (v našem primeru bomo izvedli samo eno). Prav tako lahko izberete nižjo hitrost učenja, da zmanjšate vpliv na že naučene uteži. Vendar pa lahko tudi pri nizki hitrosti učenja pričakujete, da bo natančnost na začetku učenja padla, dokler na koncu ne doseže nekoliko višje ravni kot v primeru fiksnih uteži.\n", "\n", - "> **Opomba:** To učenje poteka veliko počasneje, saj moramo propagirati gradientne vrednosti nazaj skozi številne plasti mreže!\n" + "> **Opomba:** To učenje poteka veliko počasneje, saj moramo propagirati gradient nazaj skozi veliko slojev nevronske mreže!\n" ] }, { @@ -1028,9 +1039,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Verjetno bomo dosegli višjo natančnost pri učenju, saj uporabljamo močnejšo mrežo z več parametri, vendar pa se natančnost pri validaciji ne bo povečala v enaki meri.\n", + "Verjetno bomo dosegli višjo natančnost učenja, ker uporabljamo zmogljivejšo mrežo z več parametri, vendar se bo natančnost na validaciji povečala ne toliko.\n", "\n", - "Lahko sprostite še nekaj dodatnih slojev mreže in nadaljujete z učenjem, da preverite, ali lahko dosežete višjo natančnost!\n" + "Brez zadržkov odmrznite še nekaj plasti mreže in trenirajte naprej, da vidite, ali lahko dosežete višjo natančnost!\n" ] }, { @@ -1039,7 +1050,7 @@ "source": [ "## Drugi modeli računalniškega vida\n", "\n", - "VGG-16 je ena najpreprostejših arhitektur za računalniški vid. Keras ponuja še veliko več predhodno naučenih omrežij. Med najpogosteje uporabljenimi so arhitekture **ResNet**, ki jih je razvilo podjetje Microsoft, in **Inception**, ki ga je razvil Google. Na primer, raziščimo arhitekturo najpreprostejšega modela ResNet-50 (ResNet je družina modelov z različno globino, lahko poskusite eksperimentirati z ResNet-152, če želite videti, kako izgleda res globok model):\n" + "VGG-16 je ena izmed najpreprostejših arhitektur računalniškega vida. Keras ponuja še mnogo več predhodno izurjenih mrež. Med najbolj pogosto uporabljenimi so **ResNet** arhitekture, ki jih je razvilo Microsoft, in **Inception** podjetja Google. Na primer, raziskujmo arhitekturo najpreprostejšega modela ResNet-50 (ResNet je družina modelov z različnimi globinami, lahko poskusiš tudi z ResNet-152, če želiš videti, kako izgleda res globok model):\n" ] }, { @@ -1441,29 +1452,29 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Kot lahko vidite, model vsebuje iste poznane gradnike: konvolucijske plasti, plasti za združevanje (pooling) in končno gosto klasifikacijsko plast. Ta model lahko uporabimo na popolnoma enak način, kot smo uporabljali VGG-16 za prenosno učenje. Lahko poskusite eksperimentirati s kodo zgoraj, uporabite različne modele ResNet kot osnovni model in opazujete, kako se spreminja natančnost.\n", + "Kot lahko vidite, model vsebuje enake znane gradnike: konvolucijske plasti, sloje združevanja in končni gosti klasifikator. Ta model lahko uporabljamo na točno enak način, kot smo uporabljali VGG-16 za prenosno učenje. Lahko poskusite eksperimentirati s kodo zgoraj, uporabite različne modele ResNet kot osnovni model in si ogledate, kako se spreminja natančnost.\n", "\n", - "## Normalizacija serij (Batch Normalization)\n", + "## Normalizacija serije\n", "\n", - "Ta mreža vsebuje še eno vrsto plasti: **Normalizacija serij**. Ideja normalizacije serij je, da vrednosti, ki tečejo skozi nevronsko mrežo, pripeljemo v pravi interval. Običajno nevronske mreže najbolje delujejo, ko so vse vrednosti v razponu [-1,1] ali [0,1], zato ustrezno prilagodimo/normaliziramo vhodne podatke. Vendar pa se med učenjem globoke mreže lahko zgodi, da vrednosti močno presežejo ta razpon, kar otežuje učenje. Plast za normalizacijo serij izračuna povprečje in standardni odklon za vse vrednosti trenutne mini serije ter jih uporabi za normalizacijo signala, preden ga prenese skozi plast nevronske mreže. To bistveno izboljša stabilnost globokih mrež.\n" + "Ta nevronska mreža vsebuje še en tip plasti: **normalizacija serije**. Ideja normalizacije serije je pripeljati vrednosti, ki tečejo skozi nevronsko mrežo, v pravilen interval. Običajno nevronske mreže najbolje delujejo, ko so vse vrednosti v območju [-1,1] ali [0,1], zato ustrezno skaliramo/normaliziramo vhodne podatke. Vendar pa se lahko med učenjem globoke mreže zgodi, da vrednosti močno odstopajo od tega območja, kar oteži učenje. Plast normalizacije serije izračuna povprečje in standardni odklon za vse vrednosti trenutne minibatch skupine in ju uporabi za normalizacijo signala, preden ga preda naprej skozi plast nevronske mreže. To bistveno izboljša stabilnost globokih mrež.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Ključne točke\n", + "## Ključna ugotovitev\n", "\n", - "S pomočjo prenosa učenja smo lahko hitro sestavili klasifikator za našo nalogo klasifikacije prilagojenih objektov in dosegli visoko natančnost. Vendar pa ta primer ni bil povsem pravičen, saj je bila originalna mreža VGG-16 predhodno naučena prepoznavati mačke in pse, zato smo zgolj ponovno uporabili večino vzorcev, ki so že bili prisotni v mreži. Pričakujete lahko nižjo natančnost pri bolj eksotičnih, specifičnih objektih, kot so detajli na proizvodni liniji v tovarni ali različni listi dreves.\n", + "Z uporabo prenosnega učenja smo lahko hitro sestavili klasifikator za naše prilagojeno nalogo klasifikacije objektov in dosegli visoko natančnost. Vendar ta primer ni bil povsem pošten, saj je bil izvirni VGG-16 omrežje predhodno naučeno prepoznavati mačke in pse, zato smo le ponovno uporabili večino vzorcev, ki so že bili prisotni v omrežju. Pri bolj eksotičnih objektih, značilnih za določen področje, kot so podrobnosti na proizvodni liniji v tovarni ali različni listi dreves, lahko pričakujete manjšo natančnost.\n", "\n", - "Vidite lahko, da bolj kompleksne naloge, ki jih rešujemo zdaj, zahtevajo večjo računsko moč in jih ni mogoče enostavno rešiti na CPU-ju. V naslednji enoti bomo poskusili uporabiti bolj lahkotno implementacijo za treniranje istega modela z nižjimi računalniškimi viri, kar bo prineslo le rahlo nižjo natančnost.\n" + "Vidite lahko, da bolj kompleksne naloge, ki jih zdaj rešujemo, zahtevajo večjo računalniško moč in jih ni mogoče enostavno rešiti na CPU-ju. V naslednji enoti bomo poskusili uporabiti bolj lahkotno implementacijo za usposabljanje istega modela z nižjimi računalniškimi viri, kar bo privedlo do nekoliko manjše natančnosti.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**Omejitev odgovornosti**: \nTa dokument je bil preveden z uporabo storitve za prevajanje z umetno inteligenco [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem maternem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo profesionalni človeški prevod. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki bi nastale zaradi uporabe tega prevoda.\n" + "---\n\n\n**Omejitev odgovornosti**:\nTa dokument je bil preveden z uporabo AI prevajalske storitve [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da avtomatizirani prevodi lahko vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za kritične informacije je priporočljiv strokovni človeški prevod. Ne odgovarjamo za morebitna nesporazume ali napačne interpretacije, ki izhajajo iz uporabe tega prevoda.\n\n" ] } ], @@ -1484,12 +1495,6 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" - }, - "coopTranslator": { - "original_hash": "c189abc107848f96051085cc30945129", - "translation_date": "2025-08-30T07:23:31+00:00", - "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", - "language_code": "sl" } }, "nbformat": 4, diff --git a/translations/sl/lessons/5-NLP/README.md b/translations/sl/lessons/5-NLP/README.md index 29568bad82..cb48573f38 100644 --- a/translations/sl/lessons/5-NLP/README.md +++ b/translations/sl/lessons/5-NLP/README.md @@ -2,25 +2,25 @@ ![Povzetek nalog NLP v skici](../../../../translated_images/sl/ai-nlp.b22dcb8ca4707cea.webp) -V tem poglavju se bomo osredotočili na uporabo nevronskih mrež za reševanje nalog, povezanih z **obdelavo naravnega jezika (NLP)**. Obstaja veliko NLP problemov, ki jih želimo, da jih računalniki rešujejo: +V tem poglavju se bomo osredotočili na uporabo nevronskih mrež za obdelavo nalog, povezanih z **obdelavo naravnega jezika (NLP)**. Obstaja veliko problemov NLP, ki jih želimo, da jih računalniki znajo rešiti: -* **Razvrščanje besedil** je tipičen problem razvrščanja, ki se nanaša na zaporedja besedil. Primeri vključujejo razvrščanje e-poštnih sporočil kot spam ali ne-spam, ali kategorizacijo člankov kot šport, posel, politika itd. Prav tako pri razvoju klepetalnih robotov pogosto potrebujemo razumeti, kaj uporabnik želi povedati – v tem primeru gre za **razvrščanje namenov**. Pri razvrščanju namenov se pogosto soočamo z mnogimi kategorijami. -* **Analiza sentimenta** je tipičen regresijski problem, kjer moramo pripisati številko (sentiment), ki ustreza temu, kako pozitiven/negativen je pomen stavka. Naprednejša različica analize sentimenta je **analiza sentimenta po vidikih** (ABSA), kjer sentiment ne pripisujemo celotnemu stavku, temveč različnim delom (vidikom), npr. *V tej restavraciji mi je bila všeč kuhinja, vendar je bila atmosfera grozna*. -* **Prepoznavanje imenovanih entitet** (NER) se nanaša na problem izločanja določenih entitet iz besedila. Na primer, razumeti moramo, da v stavku *Jutri moram leteti v Pariz* beseda *jutri* pomeni DATUM, medtem ko je *Pariz* LOKACIJA. -* **Izvleček ključnih besed** je podoben NER, vendar moramo samodejno izločiti besede, ki so pomembne za pomen stavka, brez predhodnega učenja za specifične tipe entitet. -* **Združevanje besedil** je uporabno, ko želimo združiti podobne stavke, na primer podobne zahteve v pogovorih tehnične podpore. -* **Odgovarjanje na vprašanja** se nanaša na sposobnost modela, da odgovori na specifično vprašanje. Model prejme besedilni odlomek in vprašanje kot vhod, nato pa mora zagotoviti mesto v besedilu, kjer je odgovor na vprašanje (ali včasih generirati besedilo odgovora). -* **Generiranje besedila** je sposobnost modela, da ustvari novo besedilo. To lahko obravnavamo kot nalogo razvrščanja, kjer model napoveduje naslednjo črko/besedo na podlagi nekega *besedilnega poziva*. Napredni modeli za generiranje besedila, kot je GPT-3, lahko rešujejo tudi druge NLP naloge, kot je razvrščanje, z uporabo tehnike, imenovane [programiranje s pozivi](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) ali [inženiring pozivov](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29). -* **Povzemanje besedila** je tehnika, pri kateri želimo, da računalnik "prebere" dolgo besedilo in ga povzame v nekaj stavkih. -* **Strojno prevajanje** lahko obravnavamo kot kombinacijo razumevanja besedila v enem jeziku in generiranja besedila v drugem jeziku. +* **Klasifikacija besedil** je tipičen problem klasifikacije, ki se nanaša na besedilne zaporedja. Primeri vključujejo klasifikacijo e-poštnih sporočil kot spam ali ne-spam, ali kategorizacijo člankov kot šport, poslovanje, politika itd. Prav tako, ko razvijamo klepetalne bote, pogosto želimo razumeti, kaj je uporabnik hotel povedati — v tem primeru se ukvarjamo z **klasifikacijo namena**. Pogosto moramo pri klasifikaciji namena obravnavati veliko kategorij. +* **Analiza sentimenta** je tipičen problem regresije, kjer moramo pripisati številko (sentiment), ki ustreza stopnji pozitivnosti/negativnosti pomena stavka. Bolj napredna različica analize sentimenta je **analiza sentimenta na osnovi vidikov** (ABSA), kjer sentiment pripisujemo ne celotnemu stavku, ampak različnim delom (vidikom), npr. *V tej restavraciji mi je bila všeč kulinarika, vendar je bila atmosfera grozna*. +* **Prepoznavanje imenovanih entitet** (NER) se nanaša na problem izvlečenja določenih entitet iz besedila. Na primer, morda moramo razumeti, da v frazi *Moram jutri poleteti v Pariz* beseda *jutri* označuje DATUM, *Pariz* pa LOKACIJO. +* **Izvlečenje ključnih besed** je podobno kot NER, vendar moramo samodejno izluščiti besede, pomembne za pomen stavka, brez predhodnega treniranja za specifične tipe entitet. +* **Gručenje besedil** je uporabno, ko želimo združiti podobne stavke, na primer podobne zahteve v pogovorih tehnične podpore. +* **Odgovarjanje na vprašanja** pomeni sposobnost modela, da odgovori na specifično vprašanje. Model prejme besedilni odlomek in vprašanje kot vhod, ter mora zagotovi mesto v besedilu, kjer je odgovor na vprašanje vsebovan (ali pa včasih generirati besedilni odgovor). +* **Generiranje besedila** je sposobnost modela, da ustvari novo besedilo. Lahko ga obravnavamo kot nalogo klasifikacije, ki napove naslednjo črko/besedo na osnovi nekega *besedilnega poziva*. Napredni modeli generiranja besedila, kot je GPT-3, zmorejo reševati tudi druge naloge NLP, kot je klasifikacija, z uporabo tehnike, imenovane [prompt programming](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) ali [prompt engineering](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29) +* **Povzemanje besedil** je tehnika, ko želimo, da računalnik "prebere" dolgo besedilo in ga strne v nekaj stavkov. +* **Strojno prevajanje** lahko razumemo kot kombinacijo razumevanja besedila v enem jeziku in generiranja besedila v drugem jeziku. -Sprva so bile večina NLP nalog reševane z uporabo tradicionalnih metod, kot so slovnice. Na primer, pri strojnem prevajanju so se uporabljali analizatorji za pretvorbo začetnega stavka v sintaktično drevo, nato so se izločile višje ravni semantičnih struktur za predstavitev pomena stavka, na podlagi tega pomena in slovnice ciljnega jezika pa je bil ustvarjen rezultat. Danes se mnoge NLP naloge učinkoviteje rešujejo z uporabo nevronskih mrež. +Sprva so bile večina NLP nalog rešljive z uporabo tradicionalnih metod, kot so slovnice. Na primer, pri strojnih prevodih so parserji iskali transformacijo začetnega stavka v sintaktično drevo, nato so ekstrahirali višje semantične strukture, ki predstavljajo pomen stavka, in na osnovi tega pomena ter slovnice ciljanega jezika so ustvarili rezultat. Danes se številne naloge NLP učinkoviteje rešujejo z nevronskimi mrežami. -> Veliko klasičnih NLP metod je implementiranih v Python knjižnici [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org). Na voljo je odlična [NLTK knjiga](https://www.nltk.org/book/), ki pokriva, kako lahko različne NLP naloge rešujemo z uporabo NLTK. +> Mnoge klasične metode NLP so implementirane v Python knjižnici [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org). Na voljo je odlična [NLTK knjiga](https://www.nltk.org/book/), ki pojasnjuje, kako lahko z NLTK rešujemo različne NLP naloge. -V našem tečaju se bomo večinoma osredotočili na uporabo nevronskih mrež za NLP, NLTK pa bomo uporabili, kjer bo potrebno. +V našem tečaju se bomo večinoma osredotočili na uporabo nevronskih mrež za NLP in uporabili bomo NLTK, kjer bo potrebno. -Že smo se naučili uporabljati nevronske mreže za delo s tabelarnimi podatki in slikami. Glavna razlika med temi vrstami podatkov in besedilom je, da je besedilo zaporedje spremenljive dolžine, medtem ko je velikost vhodnih podatkov pri slikah znana vnaprej. Čeprav konvolucijske mreže lahko izločajo vzorce iz vhodnih podatkov, so vzorci v besedilu bolj zapleteni. Na primer, zanikanje je lahko ločeno od subjekta z mnogimi besedami (npr. *Ne maram pomaranč* proti *Ne maram tistih velikih pisanih okusnih pomaranč*), kar bi moralo biti še vedno interpretirano kot en vzorec. Zato za obdelavo jezika potrebujemo nove vrste nevronskih mrež, kot so *rekurentne mreže* in *transformerji*. +Že smo se naučili uporabljati nevronske mreže za delo s tabelaričnimi podatki in slikami. Glavna razlika med temi vrstami podatkov in besedilom je, da je besedilo zaporedje poljubne dolžine, medtem ko je vhodna velikost pri slikah vnaprej znana. Medtem ko konvolucijske mreže ekstrahirajo vzorce iz vhodnih podatkov, so vzorci v besedilu bolj kompleksni. Npr., negacija je lahko ločena od subjekta za poljubno število besed (npr. *Ne maram pomaranč*, v nasprotju z *Ne maram tistih velikih, pisanih, okusnih pomaranč*), in to je treba še vedno razumeti kot en vzorec. Zato moramo za obdelavo jezika uvesti nove vrste nevronskih mrež, kot so *rekurentne mreže* in *transformatorji*. ## Namestitev knjižnic @@ -28,24 +28,24 @@ V našem tečaju se bomo večinoma osredotočili na uporabo nevronskih mrež za **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 TensorFlow lahko preizkusite na [Microsoft Learn](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste) +> NLP lahko preizkusite z uporabo TensorFlow na [Microsoft Learn](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste) ## Opozorilo glede GPU -V tem poglavju bomo v nekaterih primerih trenirali precej velike modele. -* **Uporabite računalnik z GPU**: Priporočljivo je, da svoje zapiske izvajate na računalniku z omogočenim GPU, da zmanjšate čakalne čase pri delu z velikimi modeli. -* **Omejitve pomnilnika GPU**: Uporaba GPU lahko privede do situacij, ko vam zmanjka pomnilnika GPU, še posebej pri treniranju velikih modelov. -* **Poraba pomnilnika GPU**: Količina pomnilnika GPU, porabljenega med treniranjem, je odvisna od različnih dejavnikov, vključno z velikostjo minibatcha. -* **Zmanjšajte velikost minibatcha**: Če naletite na težave s pomnilnikom GPU, razmislite o zmanjšanju velikosti minibatcha v svoji kodi kot možni rešitvi. -* **Sprostitev pomnilnika GPU v TensorFlow**: Starejše različice TensorFlow morda ne sprostijo pomnilnika GPU pravilno, ko trenirate več modelov znotraj enega Python jedra. Za učinkovito upravljanje porabe pomnilnika GPU lahko TensorFlow nastavite tako, da dodeli pomnilnik GPU le po potrebi. -* **Vključitev kode**: Če želite nastaviti TensorFlow, da raste dodelitev pomnilnika GPU le, ko je to potrebno, vključite naslednjo kodo v svoje zapiske: +V tem poglavju bomo za nekatere primere trenirali precej velike modele. +* **Uporabljajte računalnik z omogočenim GPU**: priporočljivo je, da svoje zvezke izvajate na računalniku z omogočenim GPU, da zmanjšate čakanje pri delu z velikimi modeli. +* **Omejitve pomnilnika GPU**: izvajanje na GPU lahko povzroči primere, ko zmanjka pomnilnika na GPU, zlasti med treniranjem velikih modelov. +* **Poraba pomnilnika GPU**: količina pomnilnika GPU, ki se porabi med treniranjem, je odvisna od različnih dejavnikov, vključno z velikostjo minipaketa. +* **Zmanjšajte velikost minipaketa**: če se soočite s težavami z GPU pomnilnikom, razmislite o zmanjšanju velikosti minipaketa v vaši kodi kot možni rešitvi. +* **Prostost pomnilnika TensorFlow na GPU**: starejše različice TensorFlow morda ne sprostijo pravilno pomnilnika GPU, ko trenirate več modelov znotraj enega Pythona. Za učinkovito upravljanje rabe pomnilnika GPU lahko nastavite TensorFlow tako, da alocira pomnilnik GPU le po potrebi. +* **Vključitev kode**: da nastavite TensorFlow, da povečuje alokacijo pomnilnika GPU le, ko je potrebno, vključite naslednjo kodo v svoje zvezke: ```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) ``` -Če vas zanima učenje NLP z vidika klasičnega strojnega učenja, obiščite [to zbirko lekcij](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP). +Če vas zanima učenje NLP z vidika klasičnega strojnega učenja, obiščite [ta sklop lekcij](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP) ## V tem poglavju -V tem poglavju bomo spoznali: +V tem poglavju se bomo naučili o: -* [Predstavljanje besedila kot tenzorjev](13-TextRep/README.md) -* [Vgrajevanje besed](14-Emdeddings/README.md) -* [Modeliranje jezika](15-LanguageModeling/README.md) +* [Predstavljanje besedila kot tenzorji](13-TextRep/README.md) +* [Vgradnje besed (Word Embeddings)](14-Emdeddings/README.md) +* [Jezikovno modeliranje](15-LanguageModeling/README.md) * [Rekurentne nevronske mreže](16-RNN/README.md) * [Generativne mreže](17-GenerativeNetworks/README.md) -* [Transformerji](18-Transformers/README.md) +* [Transformatorji](18-Transformers/README.md) -**Omejitev odgovornosti**: -Ta dokument je bil preveden z uporabo storitve AI za prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem maternem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo profesionalni človeški prevod. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki bi nastale zaradi uporabe tega prevoda. \ No newline at end of file +--- + + +**Omejitev odgovornosti**: +Ta dokument je bil preveden z uporabo AI prevajalske storitve [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da avtomatizirani prevodi lahko vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za kritične informacije je priporočljiv strokovni človeški prevod. Ne odgovarjamo za morebitna nesporazume ali napačne interpretacije, ki izhajajo iz uporabe tega prevoda. + \ No newline at end of file diff --git a/translations/sr/.co-op-translator.json b/translations/sr/.co-op-translator.json index d03e7d648f..a03ab18ccc 100644 --- a/translations/sr/.co-op-translator.json +++ b/translations/sr/.co-op-translator.json @@ -5,6 +5,12 @@ "source_file": "AGENTS.md", "language_code": "sr" }, + "CONTRIBUTING.md": { + "original_hash": "c6fd7e781b67111a90abd166d0ce4aa0", + "translation_date": "2026-07-08T17:39:08+00:00", + "source_file": "CONTRIBUTING.md", + "language_code": "sr" + }, "README.md": { "original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b", "translation_date": "2026-04-06T16:41:41+00:00", @@ -17,6 +23,19 @@ "source_file": "SECURITY.md", "language_code": "sr" }, + "__translation_failures__": { + "lessons/sketchnotes/LICENSE.md": { + "original_hash": "45ab63a2cd8f5faef6c9b150618837a4", + "source_file": "lessons/sketchnotes/LICENSE.md", + "language_code": "sr", + "failure_date": "2026-07-08T17:38: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:51+00:00", @@ -54,8 +73,8 @@ "language_code": "sr" }, "examples/README.md": { - "original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7", - "translation_date": "2025-10-03T11:34:33+00:00", + "original_hash": "7883d52c2e2a221e0b07a7b112a149b9", + "translation_date": "2026-07-08T17:33:15+00:00", "source_file": "examples/README.md", "language_code": "sr" }, @@ -66,8 +85,8 @@ "language_code": "sr" }, "lessons/0-course-setup/how-to-run.md": { - "original_hash": "a4717bd9103b9f6cd84d534b83534689", - "translation_date": "2026-01-16T05:37:07+00:00", + "original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1", + "translation_date": "2026-07-08T17:33:37+00:00", "source_file": "lessons/0-course-setup/how-to-run.md", "language_code": "sr" }, @@ -191,6 +210,12 @@ "source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md", "language_code": "sr" }, + "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": { + "original_hash": "99b816b6a4957ef4100cee4c4221dff9", + "translation_date": "2026-07-08T17:21:17+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", + "language_code": "sr" + }, "lessons/4-ComputerVision/08-TransferLearning/lab/README.md": { "original_hash": "7765935c35fcee69b9fe2d0cfd6963e2", "translation_date": "2025-08-25T23:17:00+00:00", @@ -330,8 +355,8 @@ "language_code": "sr" }, "lessons/5-NLP/README.md": { - "original_hash": "8ef02a9318257ea140ed3ed74442096d", - "translation_date": "2025-08-25T21:29:17+00:00", + "original_hash": "038df6f1a73e49f6430740da083bfd6d", + "translation_date": "2026-07-08T17:34:06+00:00", "source_file": "lessons/5-NLP/README.md", "language_code": "sr" }, diff --git a/translations/sr/CONTRIBUTING.md b/translations/sr/CONTRIBUTING.md new file mode 100644 index 0000000000..5a12e37772 --- /dev/null +++ b/translations/sr/CONTRIBUTING.md @@ -0,0 +1,29 @@ +# Допринос AI-потпуним-почетницима + +Хвала вам што сте заинтересовани да допринесете AI-потпуним-почетницима! Добродошле су преводи, исправке лекција и корекције форматирања. + +## Microsoft Уговор о лиценци за сараднике (CLA) + +Овај пројекат прихвата доприносе и предлоге. Већина доприноса захтева да се сложите са Уговором о лиценци за сараднике (CLA) који изјављује да имате право и заиста нам дајете права да користимо ваш допринос. За детаље посетите [https://cla.microsoft.com](https://cla.microsoft.com). + +Када пошаљете захтев за повлачење, CLA-бот ће аутоматски одредити да ли је потребно да доставите CLA и одговарајуће означити захтев (нпр. ознаком, коментаром). Само пратите упутства која вам даје бот. Ово ћете морати да урадите само једном у свим репозиторијумима који користе наш 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](https://github.com/Azure/co-op-translator). Иако тежимо тачности, имајте у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални људски превод. Нисмо одговорни за било каква неспоразума или погрешна тумачења која произилазе из коришћења овог превода. + \ No newline at end of file diff --git a/translations/sr/examples/README.md b/translations/sr/examples/README.md index 0fc1faad35..d49d7ee86d 100644 --- a/translations/sr/examples/README.md +++ b/translations/sr/examples/README.md @@ -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) | Ваш први 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) | Класификујте слике са унапред обученим моделом | ⭐⭐ Почетник+ | Питон, 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 +# За Python скрипте pip install numpy -# For Jupyter notebooks (image classifier) +# За Jupyter бележнице (класификатор слика) pip install jupyter numpy pillow tensorflow ``` -Или користите conda окружење из главног курикулума: +Или користите конда окружење из главног наставног плана: ```bash conda env create --name ai4beg --file ../environment.yml @@ -34,52 +34,54 @@ conda activate ai4beg ### Покретање примера -**За Python скрипте (.py датотеке):** +**За Питон скрипте (.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. **Испробајте Image Classifier** - Погледајте 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) -- [Обрада природног језика](../lessons/5-NLP/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). Иако настојимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква погрешна тумачења или неспоразуме који могу произаћи из коришћења овог превода. \ No newline at end of file + +**Изјава о одрицању одговорности**: +Овај документ је преведен коришћењем услуге за аутоматски превод [Co-op Translator](https://github.com/Azure/co-op-translator). Иако тежимо тачности, имајте у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални људски превод. Нисмо одговорни за било каква неспоразума или погрешна тумачења која произилазе из коришћења овог превода. + \ No newline at end of file diff --git a/translations/sr/lessons/0-course-setup/how-to-run.md b/translations/sr/lessons/0-course-setup/how-to-run.md index 7ebdf7c20f..3c20327748 100644 --- a/translations/sr/lessons/0-course-setup/how-to-run.md +++ b/translations/sr/lessons/0-course-setup/how-to-run.md @@ -1,12 +1,12 @@ # Како покренути код -Овај програм садржи много извршних примера и лабораторија које ћете желети да покренете. Да бисте то урадили, потребна вам је могућност извршавања Питхон кода у Јупитер свескама које су део овог програма. Имате неколико опција за покретање кода: +Овај курикулум садржи много извршних примера и лабораторијских вежби које ћете желети да покренете. Да бисте то урадили, потребна вам је могућност извођења Python кода у Jupyter Notebook-овима који су обезбеђени као део овог курикулума. Имaте неколико опција за покретање кода: -## Покрени локално на вашем рачунару +## Покрени локално на свом рачунару -Да бисте покренули код локално на вашем рачунару, потребна је инсталација Питхона. Један од предлога је да инсталирате **[miniconda](https://conda.io/en/latest/miniconda.html)** – то је прилично лагана инсталација која подржава `conda` менаџер пакета за различита Питхон **виртуелна окружења**. +Да бисте покренули код локално на свом рачунару, потребна је Python инсталација. Једна препорука је да инсталирате **[miniconda](https://conda.io/en/latest/miniconda.html)** - то је релативно лагана инсталација која подржава `conda` менаџер пакета за различита Python **виртуелна окружења**. -Након што инсталирате miniconda, клонирајте репозиторијум и креирајте виртуелно окружење које ће се користити за овај курс: +Након што инсталирате miniconda, клонујте репозиторијум и направите виртуелно окружење које ће се користити за овај курс: ```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 са 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 предложи да поново отворите репозиторијум у контејнеру, требало би да одбијете то да бисте користили локалну Python инсталацију. ### Коришћење Jupyter-а у прегледачу -Такође можете користити Jupyter окружење у прегледачу на свом рачунару. И класични Jupyter и JupyterHub пружају практично развојно окружење са ауто-комплетирањем, истицањем кода итд. +Такође можете да користите Jupyter окружење из прегледача на сопственом рачунару. И класични Jupyter и JupyterHub пружају згодно развојно окружење са аутоматским допуњавањем, истицањем кода, итд. -За покретање Jupyter-а локално, идите у фасциклу курса и извршите: +Да бисте покренули Jupyter локално, идите у директоријум курса и извршите: ```bash jupyter notebook @@ -36,36 +36,36 @@ jupyter notebook ```bash jupyterhub ``` -Затим можете навигацијом отворити било који од `.ipynb` фајлова и почети да радите. +Затим можете отићи на било који `.ipynb` фајл, отворити га и почети са радом. ### Покретање у контејнеру -Једна алтернатива инсталацији Python-а је покретање кода у контејнеру. Пошто наш репозиторијум садржи посебну `.devcontainer` фасциклу која указује како се гради контејнер за овај репо, VS Code пружа могућност да поново отворите код у контејнеру. Ово захтева инсталацију Docker-а и је сложеније, па то препоручујемо корисницима са више искуства. +Једна алтернатива Python инсталацији је покретање кода у контејнеру. Пошто наш репозиторијум садржи посебан `.devcontainer` фолдер који објашњава како се прави контејнер за овај репозиторијум, VS Code нуди могућност да поново отворите код у контејнеру. Ово ће захтевати инсталацију Docker-а, и такође је сложеније, па то препоручујемо искуснијим корисницима. ## Покретање у облаку -Ако не желите локалну инсталацију Python-а, а имате приступ неким облачним ресурсима – добра алтернатива је покретање кода у облаку. Постоји неколико начина да то урадите: +Ако не желите да инсталирате Python локално и имате приступ неким облачним ресурсима, добра алтернатива је покретање кода у облаку. Постоји неколико начина да то урадите: -* Коришћење **[GitHub Codespaces](https://github.com/features/codespaces)**, који је виртуелно окружење направљено за вас на GitHub-у, доступно преко VS Code интерфејса у прегледачу. Ако имате приступ Codespaces, можете само кликнути на дугме **Code** у репозиторијуму, покренути codespace и почети одмах. -* Коришћење **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) нуди бесплатне рачунарске ресурсе у облаку, тако да људи попут вас могу тестирати неки код са GitHub-а. На почетној страници постоји дугме за отварање репозиторијума у Binder-у – ово вас брзо води на сајт Binder-а, који ће изградити основни контејнер и покренути вам Jupyter веб интерфејс глатко. +* Коришћење **[GitHub Codespaces](https://github.com/features/codespaces)**, што је виртуелно окружење креирано за вас на GitHub-у, доступно преко VS Code интерфејса у прегледачу. Ако имате приступ Codespaces-у, можете једноставно кликнути на дугме **Code** у репозиторијуму, покренути codespace и одмах почети са радом. +* Коришћење **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) нуди бесплатне рачунарске ресурсе у облаку за људе као ви да тестирају неки код на GitHub-у. На почетној страни постоји дугме за отварање репозиторијума у Binder-у - ово ће вас брзо одвести на сајт Binder-а, који ће изградити основни контејнер и неприметно покренути Jupyter веб интерфејс за вас. -> **Напомена**: Да би се спречила злоупотреба, Binder има приступ блокиран за неке веб ресурсе. Ово може спречити рад дела кода који преузима моделе и/или скупове података са јавног интернета. Можда ће вам бити потребна нека заобилазна решења. Такође, ресурси за рачунање које пружа Binder су прилично основни, па ће тренирање бити споро, нарочито у каснијим, сложенијим лекцијама. +> **Напомена**: Да би се спречила злоупотреба, Binder има приступ неким веб ресурсима блокиран. Ово може спречити да неки код ради који преузима моделе и/или скупове података са јавног интернета. Можда ћете морати да нађете нека заобилазна решења. Такође, ресурси које пружа Binder су прилично основни, па ће тренирање бити споро, нарочито у каснијим, сложенијим лекцијама. -## Покретање у облаку са GPU +## Покретање у облаку са GPU-ом -Неколико каснијих лекција у овом програму веома би имало користи од подршке за GPU. Тренирање модела, на пример, може бити веома споро без тога. Постоји неколико опција које можете пратити, нарочито ако имате приступ облаку преко [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) или преко ваше институције: +Неки од каснијих лекција у овом курикулуму би много имали користи од подршке за GPU. Тренирање модела, на пример, може бити ужасно споро у супротном. Постоји неколико опција које можете следити, посебно ако имате приступ облаку преко [Azure 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 виртуелне машине имају подршку за 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-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/) показује како да клонирате репозиторијум у Azure ML notebook и почнете да га користите. +* Креирајте [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 и почнете да га користите. -Такође можете користити Google Colab, који долази са неком бесплатном подршком за GPU, и у њега отпремити Jupyter свеске да их извршавате један по један. +Такође можете користити Google Colab, који долази са неком бесплатном подршком за GPU, и учитати Jupyter Notebooks тамо да бисте их извршавали један по један. --- **Изјава о одрицању одговорности**: -Овај документ је преведен коришћењем AI преводилачке услуге [Co-op Translator](https://github.com/Azure/co-op-translator). Док се трудимо да превод буде што прецизнији, молимо вас да имате у виду да аутоматизовани преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати ауторитетним извором. За критичне информације препоручује се професионални превод од стране људског стручњака. Нисмо одговорни за било каква неспоразумевања или погрешне тумачења настале коришћењем овог превода. +Овај документ је преведен коришћењем услуге за аутоматски превод [Co-op Translator](https://github.com/Azure/co-op-translator). Иако тежимо тачности, имајте у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални људски превод. Нисмо одговорни за било каква неспоразума или погрешна тумачења која произилазе из коришћења овог превода. \ No newline at end of file diff --git a/translations/sr/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/sr/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index b9f4a8643e..7d1957fc31 100644 --- a/translations/sr/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/sr/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -4,11 +4,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Претходно обучени модели и трансфер учење\n", + "# Предходно обучени модели и пренос учења\n", "\n", - "Обучавање CNN-а може да траје доста времена, а за тај задатак је потребно много података. Међутим, велики део времена се троши на учење најбољих ниско-нивоских филтера које мрежа користи за издвајање образаца из слика. Поставља се природно питање - можемо ли користити неуронску мрежу обучену на једном скупу података и прилагодити је за класификацију различитих слика без комплетног процеса обучавања?\n", + "Обучавање ЦНН мрежа може потрајати доста времена, као и бити потребан велики број података за тај задатак. Међутим, много времена се троши на учење најбољих ниско-ниволских филтера које мрежа користи за издвајање образаца са слика. Поставља се природно питање - можемо ли искористити неуронску мрежу обучену на једном скупу података и прилагодити је за класификацију различитих слика без потпуно новог процеса обучавања?\n", "\n", - "Овај приступ се назива **трансфер учење**, јер преносимо одређено знање из једног модела неуронске мреже у други. У трансфер учењу, обично почињемо са претходно обученим моделом, који је обучен на неком великом скупу слика, као што је **ImageNet**. Ти модели већ могу добро да издвајају различите карактеристике из општих слика, и у многим случајевима само изградња класификатора на основу тих издвојених карактеристика може дати добар резултат.\n" + "Овај приступ се назива **пренос учења**, јер преносимо део знања са једног неуронског модела на други. У преносу учења, обично почињемо са предходно обученим моделом, који је већ обучен на неком великом скупу слика, као што је **ImageNet**. Те моделе већ могу добро да извуку различите карактеристике из општих слика, и у многим случајевима само изградња класификатора на врху тих издвојених карактеристика може дати добар резултат.\n" ] }, { @@ -29,11 +29,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Скуп података Мачке против Паса\n", + "## Скуп података мачке против паса\n", "\n", - "У овој јединици решаваћемо стварни проблем класификације слика мачака и паса. Из тог разлога, користићемо [Kaggle Cats vs. Dogs Dataset](https://www.kaggle.com/c/dogs-vs-cats), који се такође може преузети [са Microsoft-а](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n", + "У овој јединици решићемо стварни проблем класификације слика мачака и паса. Из тог разлога ћемо користити [Kaggle Cats vs. Dogs 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", + "## Учитавање скупa података\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": [ - "Скупoви података које смо добили могу се директно проследити функцији `fit` за тренирање модела. Они садрже и одговарајуће слике и ознаке, које се могу обрађивати помоћу следеће конструкције:\n" + "Набављене скупове података можемо директно proslediti функцији `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", @@ -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": [ + "\n", "## Извлачење VGG карактеристика\n", "\n", - "Ако желимо да користимо VGG-16 за извлачење карактеристика из наших слика, потребан нам је модел без завршних слојева за класификацију. Можемо инстанцирати VGG-16 модел без горњих слојева користећи овај код:\n" + "Ако желимо да користимо VGG-16 за извлачење карактеристика из наших слика, потребан нам је модел без завршних класификационих слојева. Можемо инстанцирати VGG-16 модел без горњих слојева помоћу овог кода:\n" ] }, { @@ -680,9 +691,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Димензија тензора карактеристика је 7x7x512, али да бисмо га визуализовали, морали смо да га преобликујемо у 2Д форму.\n", + "Димензија тензора карактеристика је 7x7x512, али да бисмо га визуелизовали морали смо да га преобликујемо у 2D форму.\n", "\n", - "Сада хајде да видимо да ли те карактеристике могу да се користе за класификацију слика. Ручно ћемо узети део слика (у нашем случају 50 минибатчева) и унапред израчунати њихове векторе карактеристика. Можемо користити Tensorflow **dataset** API за то. Функција `map` узима скуп података и примењује задату ламбда-функцију како би га трансформисала. Користимо овај механизам да конструишемо нове скупове података, `ds_features_train` и `ds_features_test`, који садрже карактеристике изведене помоћу VGG-а уместо оригиналних слика.\n" + "Хајде сада да видимо да ли се те карактеристике могу користити за класификовање слика. Ручно узмимо неки део слика (50 минипакета, у нашем случају) и претходно израчунамо њихове векторе карактеристика. За то можемо користити Tensorflow **dataset** API. `map` функција узима скуп података и примењује дати lambda-израз за трансформацију. Користимо овај механизам да конструишемо нове скупове података, `ds_features_train` и `ds_features_test`, који садрже извађене карактеристике из VGG уместо оригиналних слика.\n" ] }, { @@ -712,9 +723,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Користили смо конструкцију `.take(50)` да ограничимо величину скупа података, како бисмо убрзали нашу демонстрацију. Наравно, можете извршити овај експеримент на целом скупу података.\n", + "Користили смо конструкцију `.take(50)` да ограничимо величину скупa података, како бисмо убрзали нашу демонстрацију. Наравно, можете извести овај експеримент на целом скупу података.\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", "\n", - "Такође можемо избећи ручно предрачунавање карактеристика коришћењем оригиналне VGG-16 мреже у целини током тренинга, додавањем екстрактора карактеристика као првог слоја у нашу мрежу.\n", + "Такође можемо избјећи ручно претходно рачунање карактеристика коришћењем оригиналне ВГГ-16 мреже у целини током тренинга, додавањем екстрактора карактеристика нашој мрежи као првог слоја.\n", "\n", - "Лепота Keras архитектуре је у томе што се VGG-16 модел који смо горе дефинисали може користити и као слој у другој неуронској мрежи! Потребно је само да конструишемо мрежу са густим класификатором на врху, а затим тренирамо целу мрежу користећи back propagation.\n" + "Лепота Керас архитектуре је у томе што се ВГГ-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" + "Када обучимо модел, можемо сачувати архитектуру модела и тежине које смо обучили у фајл за будућу употребу:\n" ] }, { @@ -852,7 +863,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Можемо тада учитати модел из датотеке у било ком тренутку. Можда ће вам бити корисно у случају да следећи експеримент уништи модел - не бисте морали да почнете испочетка.\n" + "Можемо затим учитати модел из датотеке у било које време. Можда ће вам бити корисно у случају да следећи експеримент уништи модел - нећете морати да почнете испочетка.\n" ] }, { @@ -870,13 +881,13 @@ "source": [ "## Фино подешавање трансфер учења\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": [ - "Међутим, одмрзавање свих одједном није најбоља идеја. Можемо прво одмрзнути само неколико завршних слојева конволуција, јер они садрже обрасце вишег нивоа који су релевантни за наше слике. На пример, за почетак, можемо замрзнути све слојеве осим последња 4:\n" + "Међутим, одмрзавање свих одједном није најбоља идеја. Прво можемо одмрзнути само неколико последњих слојева конволуција, јер они садрже вишем нивоу обрасце који су релевантни за наше слике. На пример, за почетак можемо замрзнути све слојеве осим последња 4: \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**, које је развио Microsoft, и **Inception** од Google-а. На пример, погледајмо архитектуру најједноставнијег ResNet-50 модела (ResNet је породична архитектура модела различитог дубине, можете пробати и ResNet-152 ако желите да видите како изгледа заиста дубок модел):\n" ] }, { @@ -1441,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" ] }, { @@ -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Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако се трудимо да превод буде тачан, молимо вас да имате у виду да аутоматизовани преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати меродавним извором. За критичне информације препоручује се професионални превод од стране људи. Не преузимамо одговорност за било каква погрешна тумачења или неспоразуме који могу настати услед коришћења овог превода.\n" + "---\n\n\n**Изјава о одрицању одговорности**:\nОвај документ је преведен коришћењем услуге за аутоматски превод [Co-op Translator](https://github.com/Azure/co-op-translator). Иако тежимо тачности, имајте у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални људски превод. Нисмо одговорни за било каква неспоразума или погрешна тумачења која произилазе из коришћења овог превода.\n\n" ] } ], @@ -1484,12 +1495,6 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" - }, - "coopTranslator": { - "original_hash": "c189abc107848f96051085cc30945129", - "translation_date": "2025-08-29T23:22:39+00:00", - "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", - "language_code": "sr" } }, "nbformat": 4, diff --git a/translations/sr/lessons/5-NLP/README.md b/translations/sr/lessons/5-NLP/README.md index a2e8fb6667..f6d066a1cc 100644 --- a/translations/sr/lessons/5-NLP/README.md +++ b/translations/sr/lessons/5-NLP/README.md @@ -1,51 +1,51 @@ # Обрада природног језика -![Резиме NLP задатака у скици](../../../../translated_images/sr/ai-nlp.b22dcb8ca4707cea.webp) +![Резиме NLP задатака у дудлу](../../../../translated_images/sr/ai-nlp.b22dcb8ca4707cea.webp) -У овом делу ћемо се фокусирати на коришћење неуронских мрежа за решавање задатака везаних за **обраду природног језика (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). -* **Сажимање текста** је техника када желимо да рачунар "прочита" дугачак текст и сажме га у неколико реченица. -* **Машински превод** може се посматрати као комбинација разумевања текста на једном језику и генерисања текста на другом. +* **Класификација текста** је типичан проблем класификације који се односи на секвенце текста. Примери укључују класификовање мејлова као спам или не-спам, или категоризацију чланака као спорт, бизнис, политика итд. Такође, када развијамо ћаскање роботе, често морамо да разумемо шта је корисник желео да каже -- у овом случају радимо са **класификацијом намере**. Често у класификацији намере морамо да обрадимо много категорија. +* **Анализа сентимента** је типичан проблем регресије, где морамо да доделимо број (сентимент) који одговара колико је значење реченице позитивно/негативно. Напреднија верзија анализе сентимента је **анализa сентимента по аспектима** (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 методе су реализоване у [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org) Python библиотеци. Постоји одличан [NLTK књига](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 меморијом, размотрите смањење величине мини-бача у вашем коду као потенцијално решење. -* **Ослобађање GPU меморије у TensorFlow-у**: Старије верзије TensorFlow-а можда не ослобађају GPU меморију исправно приликом тренирања више модела унутар једног Python језгра. Да бисте ефикасно управљали коришћењем GPU меморије, можете конфигурисати TensorFlow да алоцира GPU меморију само по потреби. -* **Укључивање кода**: Да бисте подесили TensorFlow да расте алокацију GPU меморије само када је потребно, укључите следећи код у своје бележнице: +У овом одељку ћемо неке примере тренирати прилично велике моделе. +* **Користите рачунар са омогућеним GPU-ом**: Препоручује се да покрећете своје сличице на рачунару са омогућеним GPU-ом како бисте смањили време чекања када радите са великим моделима. +* **Ограничења меморије GPU-а**: Покретање на GPU-у може довести до ситуација у којима вам понестаје меморије GPU-а, посебно код тренирања великих модела. +* **Потрошња меморије GPU-а**: Количина меморије GPU-а која се троши током тренинга зависи од различитих фактора, укључујући величину минибатча. +* **Минимализујте величину минибатча**: Ако наиђете на проблеме са меморијом GPU-а, размислите о смањењу величине минибатча у свом коду као могућем решењу. +* **Ослобађање меморије GPU-а у TensorFlow-у**: Старије верзије TensorFlow-а можда не ослобађају меморију GPU-а правилно када се тренира више модела унутар једног Python кеpнела. Да бисте ефикасно управљали коришћењем GPU меморије, можете конфигурисати TensorFlow да додељује GPU меморију само када је потребно. +* **Укључивање кода**: Да бисте поставили TensorFlow да повећава доделу GPU меморије само кад је потребно, укључите следећи код у своје сличице: ```python physical_devices = tf.config.list_physical_devices('GPU') @@ -53,17 +53,21 @@ if len(physical_devices)>0: tf.config.experimental.set_memory_growth(physical_devices[0], True) ``` -Ако сте заинтересовани за учење о NLP-у из перспективе класичног машинског учења, посетите [овај сет лекција](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP). +Ако желите да учите о 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). Иако се трудимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати меродавним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква погрешна тумачења или неспоразуме који могу произаћи из коришћења овог превода. \ No newline at end of file +--- + + +**Изјава о одрицању одговорности**: +Овај документ је преведен коришћењем услуге за аутоматски превод [Co-op Translator](https://github.com/Azure/co-op-translator). Иако тежимо тачности, имајте у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални људски превод. Нисмо одговорни за било каква неспоразума или погрешна тумачења која произилазе из коришћења овог превода. + \ No newline at end of file diff --git a/translations/sv/.co-op-translator.json b/translations/sv/.co-op-translator.json index 93e0530ac2..ce7bb3e4d3 100644 --- a/translations/sv/.co-op-translator.json +++ b/translations/sv/.co-op-translator.json @@ -5,6 +5,12 @@ "source_file": "AGENTS.md", "language_code": "sv" }, + "CONTRIBUTING.md": { + "original_hash": "c6fd7e781b67111a90abd166d0ce4aa0", + "translation_date": "2026-07-08T18:04:00+00:00", + "source_file": "CONTRIBUTING.md", + "language_code": "sv" + }, "README.md": { "original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b", "translation_date": "2026-04-06T16:23:14+00:00", @@ -17,6 +23,19 @@ "source_file": "SECURITY.md", "language_code": "sv" }, + "__translation_failures__": { + "lessons/sketchnotes/LICENSE.md": { + "original_hash": "45ab63a2cd8f5faef6c9b150618837a4", + "source_file": "lessons/sketchnotes/LICENSE.md", + "language_code": "sv", + "failure_date": "2026-07-08T17:57:55+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-28T16:06:50+00:00", @@ -54,8 +73,8 @@ "language_code": "sv" }, "examples/README.md": { - "original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7", - "translation_date": "2025-10-03T11:31:15+00:00", + "original_hash": "7883d52c2e2a221e0b07a7b112a149b9", + "translation_date": "2026-07-08T17:52:33+00:00", "source_file": "examples/README.md", "language_code": "sv" }, @@ -66,8 +85,8 @@ "language_code": "sv" }, "lessons/0-course-setup/how-to-run.md": { - "original_hash": "a4717bd9103b9f6cd84d534b83534689", - "translation_date": "2026-01-16T02:22:35+00:00", + "original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1", + "translation_date": "2026-07-08T17:52:58+00:00", "source_file": "lessons/0-course-setup/how-to-run.md", "language_code": "sv" }, @@ -191,6 +210,12 @@ "source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md", "language_code": "sv" }, + "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": { + "original_hash": "99b816b6a4957ef4100cee4c4221dff9", + "translation_date": "2026-07-08T17:44:25+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", + "language_code": "sv" + }, "lessons/4-ComputerVision/08-TransferLearning/lab/README.md": { "original_hash": "7765935c35fcee69b9fe2d0cfd6963e2", "translation_date": "2025-08-28T15:17:45+00:00", @@ -330,8 +355,8 @@ "language_code": "sv" }, "lessons/5-NLP/README.md": { - "original_hash": "8ef02a9318257ea140ed3ed74442096d", - "translation_date": "2025-08-28T15:50:08+00:00", + "original_hash": "038df6f1a73e49f6430740da083bfd6d", + "translation_date": "2026-07-08T17:53:29+00:00", "source_file": "lessons/5-NLP/README.md", "language_code": "sv" }, diff --git a/translations/sv/CONTRIBUTING.md b/translations/sv/CONTRIBUTING.md new file mode 100644 index 0000000000..feaa374dde --- /dev/null +++ b/translations/sv/CONTRIBUTING.md @@ -0,0 +1,29 @@ +# Bidra till AI-For-Beginners + +Tack för ditt intresse att bidra till AI-For-Beginners! Vi välkomnar översättningar, lektionfixar och korrigeringar av formatering. + +## Microsoft Contributor License Agreement (CLA) + +Det här projektet välkomnar bidrag och förslag. De flesta bidrag kräver att du godkänner ett Contributor License Agreement (CLA) där du intygar att du har rätt att, och faktiskt ger oss rättigheterna att använda ditt bidrag. För detaljer, besök [https://cla.microsoft.com](https://cla.microsoft.com). + +När du skickar en pull-begäran kommer en CLA-bot automatiskt avgöra om du behöver lämna en CLA och märka PR på lämpligt sätt (t.ex. etikett, kommentar). Följ bara instruktionerna från boten. Du behöver bara göra detta en gång för alla förvar som använder vår CLA. + +## Hur man bidrar + +### 1. Rätta stavfel / kodfel +Om du hittar ett stavfel eller bugg i någon Jupyter-notebook eller lektionens markdown-fil: +1. Fork:a förvaret. +2. Rätta stavfelet eller den brutna länken. +3. Skicka en Pull Request med en tydlig beskrivning av rättelsen. + +### 2. Skicka in översättningar +Vi välkomnar översättningar av lektionerna till andra språk! Placera översättningarna i katalogen `translations/` med de befintliga mappnamnen där (till exempel `translations/es/`, `translations/pt-BR/`, `translations/zh-CN/`). + +För mer information, se [etc/CONTRIBUTING.md](etc/CONTRIBUTING.md). + +--- + + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, var vänlig notera att automatiska översättningar kan innehålla fel eller brister. Det ursprungliga dokumentet på dess modersmål bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för några missförstånd eller feltolkningar som uppstår till följd av användningen av denna översättning. + \ No newline at end of file diff --git a/translations/sv/examples/README.md b/translations/sv/examples/README.md index ccb060ac04..b025ed5b79 100644 --- a/translations/sv/examples/README.md +++ b/translations/sv/examples/README.md @@ -1,31 +1,31 @@ # Nybörjarvänliga AI-exempel -Välkommen! Den här katalogen innehåller enkla, fristående exempel för att hjälpa dig komma igång med AI och maskininlärning. Varje exempel är utformat för att vara nybörjarvänligt med detaljerade kommentarer och steg-för-steg-förklaringar. +Välkommen! Denna katalog innehåller enkla, fristående exempel för att hjälpa dig komma igång med AI och maskininlärning. Varje exempel är utformat för att vara nybörjarvänligt med detaljerade kommentarer och steg-för-steg-förklaringar. -## 📚 Översikt över exempel +## 📚 Exempelöversikt | Exempel | Beskrivning | Svårighetsgrad | Förkunskaper | -|---------|-------------|----------------|--------------| -| [Hello AI World](../../../examples/01-hello-ai-world.py) | Ditt första AI-program - enkel mönsterigenkänning | ⭐ Nybörjare | Grundläggande Python | -| [Simple Neural Network](../../../examples/02-simple-neural-network.py) | Bygg ett neuralt nätverk från grunden | ⭐⭐ Nybörjare+ | Python, grundläggande matematik | -| [Image Classifier](./03-image-classifier.ipynb) | Klassificera bilder med en förtränad modell | ⭐⭐ Nybörjare+ | Python, numpy | -| [Text Sentiment](../../../examples/04-text-sentiment.py) | Analysera textens sentiment (positivt/negativt) | ⭐⭐ Nybörjare+ | Python | +|---------|-------------|------------|---------------| +| [Hello AI World](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/01-hello-ai-world.py) | Ditt första AI-program - enkel mönsterigenkänning | ⭐ Nybörjare | Grundläggande Python | +| [Simple Neural Network](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/02-simple-neural-network.py) | Bygg ett neuralt nätverk från grunden | ⭐⭐ Nybörjare+ | Python, grundläggande matematik | +| [Image Classifier](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/03-image-classifier.ipynb) | Klassificera bilder med en förtränad modell | ⭐⭐ Nybörjare+ | Python, numpy | +| [Text Sentiment](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/04-text-sentiment.py) | Analysera textens känsloläge (positiv/negativ) | ⭐⭐ Nybörjare+ | Python | ## 🚀 Kom igång ### Förkunskaper -Se till att du har Python installerat (version 3.8 eller högre rekommenderas). Installera nödvändiga paket: +Se till att du har Python installerat (3.8 eller högre rekommenderas). Installera nödvändiga paket: ```bash -# For Python scripts +# För Python-skript pip install numpy -# For Jupyter notebooks (image classifier) +# För Jupyter-notebooks (bildklassificerare) pip install jupyter numpy pillow tensorflow ``` -Eller använd conda-miljön från huvudkursplanen: +Eller använd conda-miljön från huvudkursen: ```bash conda env create --name ai4beg --file ../environment.yml @@ -44,25 +44,25 @@ python 01-hello-ai-world.py jupyter notebook 03-image-classifier.ipynb ``` -## 📖 Lärandebana +## 📖 Lärväg -Vi rekommenderar att du följer exemplen i ordning: +Vi rekommenderar att följa exemplen i ordning: 1. **Börja med "Hello AI World"** - Lär dig grunderna i mönsterigenkänning 2. **Bygg ett enkelt neuralt nätverk** - Förstå hur neurala nätverk fungerar -3. **Testa bildklassificeraren** - Se AI i praktiken med riktiga bilder -4. **Analysera textens sentiment** - Utforska naturlig språkbehandling +3. **Testa bildklassificeraren** - Se AI i arbete med riktiga bilder +4. **Analysera textens känsloläge** - Utforska naturlig språkbehandling ## 💡 Tips för nybörjare - **Läs kodkommentarerna noggrant** - De förklarar vad varje rad gör - **Experimentera!** - Prova att ändra värden och se vad som händer -- **Oroa dig inte för att förstå allt direkt** - Lärande tar tid +- **Oroa dig inte för att förstå allt** - Inlärning tar tid - **Ställ frågor** - Använd [Diskussionsforumet](https://github.com/microsoft/AI-For-Beginners/discussions) ## 🔗 Nästa steg -Efter att ha slutfört dessa exempel, utforska hela kursplanen: +När du har gått igenom dessa exempel, utforska hela kursplanen: - [Introduktion till AI](../lessons/1-Intro/README.md) - [Neurala nätverk](../lessons/3-NeuralNetworks/README.md) - [Datorseende](../lessons/4-ComputerVision/README.md) @@ -70,16 +70,18 @@ Efter att ha slutfört dessa exempel, utforska hela kursplanen: ## 🤝 Bidra -Tyckte du att dessa exempel var hjälpsamma? Hjälp oss att förbättra dem: +Tyckte du att dessa exempel var hjälpsamma? Hjälp oss förbättra dem: - Rapportera problem eller föreslå förbättringar - Lägg till fler exempel för nybörjare - Förbättra dokumentation och kommentarer --- -*Kom ihåg: Varje expert var en gång nybörjare. Lycka till med lärandet! 🎓* +*Kom ihåg: Varje expert har en gång varit nybörjare. Lycka till med lärandet! 🎓* --- -**Ansvarsfriskrivning**: -Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, bör det noteras att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, var vänlig notera att automatiska översättningar kan innehålla fel eller brister. Det ursprungliga dokumentet på dess modersmål bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för några missförstånd eller feltolkningar som uppstår till följd av användningen av denna översättning. + \ No newline at end of file diff --git a/translations/sv/lessons/0-course-setup/how-to-run.md b/translations/sv/lessons/0-course-setup/how-to-run.md index a3701216c3..dec7017d7f 100644 --- a/translations/sv/lessons/0-course-setup/how-to-run.md +++ b/translations/sv/lessons/0-course-setup/how-to-run.md @@ -1,12 +1,12 @@ # Hur man kör koden -Detta kursmaterial innehåller många exekverbara exempel och labbar som du vill köra. För att göra detta behöver du möjligheten att köra Python-kod i Jupyter Notebook-filer som tillhandahålls som en del av detta kursmaterial. Du har flera alternativ för att köra koden: +Denna kursplan innehåller många körbara exempel och laborationer som du vill köra. För att göra detta behöver du möjligheten att köra Python-kod i Jupyter Notebooks som tillhandahålls som en del av denna kurs. Du har flera alternativ för att köra koden: ## Kör lokalt på din dator -För att köra koden lokalt på din dator behövs en Python-installation. Ett rekommenderat alternativ är att installera **[miniconda](https://conda.io/en/latest/miniconda.html)** – det är en ganska lätt installation som stöder `conda` paketförvaltaren för olika Python **virtuella miljöer**. +För att köra koden lokalt på din dator behövs en Python-installation. Ett rekommenderat alternativ är att installera **[miniconda](https://conda.io/en/latest/miniconda.html)** – det är en ganska lätt installation som stöder `conda` paket hanterare för olika Python **virtuella miljöer**. -Efter att du installerat miniconda, klona repot och skapa en virtuell miljö som ska användas för denna kurs: +Efter att du installerat miniconda, klona repositoryt och skapa en virtuell miljö som ska användas för denna kurs: ```bash git clone http://github.com/microsoft/ai-for-beginners @@ -17,55 +17,55 @@ conda activate ai4beg ### Använda Visual Studio Code med Python Extension -Detta kursmaterial används bäst när du öppnar 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). +Denna kursplan används bäst när du öppnar den 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). -> **Notera**: När du klonar och öppnar katalogen i VS Code kommer det automatiskt att föreslå att du installerar Python extensions. Du behöver också installera miniconda som beskrivs ovan. +> **Obs**: När du har klonat och öppnat katalogen i VS Code kommer det automatiskt att föreslå att du installerar Python-tillägg. Du måste också installera miniconda som beskrivs ovan. -> **Notera**: Om VS Code föreslår att du öppnar repot i en container bör du tacka nej till detta för att kunna använda den lokala Python-installationen. +> **Obs**: Om VS Code föreslår att du öppnar repositoryt igen i en container bör du tacka nej till detta för att kunna använda den lokala Python-installationen. ### Använda Jupyter i webbläsaren -Du kan också använda en Jupyter-miljö från webbläsaren på din egen dator. Både klassisk Jupyter och JupyterHub erbjuder en bekväm utvecklingsmiljö med automatiskt slutförande, kodmarkering med mera. +Du kan också använda en Jupyter-miljö från webbläsaren på din egen dator. Både klassisk Jupyter och JupyterHub erbjuder en bekväm utvecklingsmiljö med automatisk komplettering, kodmarkering etc. För att starta Jupyter lokalt, gå till kurskatalogen och kör: ```bash jupyter notebook ``` - eller +eller ```bash jupyterhub ``` -Du kan därefter navigera till vilken `.ipynb`-fil som helst, öppna dem och börja arbeta. +Du kan sedan navigera till valfri `.ipynb`-fil, öppna den och börja arbeta. ### Köra i container -Ett alternativ till Python-installation är att köra koden i en container. Eftersom vårt repo tillhandahåller en speciell `.devcontainer`-mapp som visar hur man bygger en container för detta repo, erbjuder VS Code möjligheten att öppna koden i en container. Detta kräver att Docker är installerat och är också mer komplext, så vi rekommenderar detta för mer erfarna användare. +Ett alternativ till Python-installation är att köra koden i en container. Eftersom vårt repository innehåller en speciell `.devcontainer`-mapp som instruerar hur man bygger en container för detta repo, erbjuder VS Code möjligheten att öppna koden i en container. Detta kräver Docker-installation och är mer komplext, så vi rekommenderar detta för mer erfarna användare. ## Köra i molnet Om du inte vill installera Python lokalt och har tillgång till molnresurser är ett bra alternativ att köra koden i molnet. Det finns flera sätt att göra detta: -* Använd **[GitHub Codespaces](https://github.com/features/codespaces)**, som är en virtuell miljö skapad för dig på GitHub, tillgänglig genom ett VS Code-webbinslag. Om du har tillgång till Codespaces kan du bara klicka på **Code**-knappen i repot, starta ett codespace och komma igång snabbt. -* Använd **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) erbjuder gratis datorresurser i molnet för personer som du att testa kod på GitHub. Det finns en knapp på startsidan för att öppna repot i Binder – detta tar dig snabbt till binder-sidan, som bygger en underliggande container och startar ett Jupyter-webbgränssnitt för dig sömlöst. +* Använd **[GitHub Codespaces](https://github.com/features/codespaces)**, vilket är en virtuell miljö skapad för dig på GitHub, tillgänglig via ett VS Code webbläsargränssnitt. Om du har tillgång till Codespaces kan du bara klicka på **Code**-knappen i repo, starta en codespace och komma igång på nolltid. +* Använd **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) erbjuder gratis datorkraft i molnet för personer som du att testa kod från GitHub. Det finns en knapp på framsidan för att öppna repositoryt i Binder – detta tar dig snabbt till binder-webbplatsen, som bygger en underliggande container och startar ett Jupyter webgränssnitt för dig sömlöst. -> **Notera**: För att förhindra missbruk har Binder blockerat tillgång till vissa webbresurser. Detta kan förhindra att viss kod, som hämtar modeller och/eller dataset från det offentliga internet, fungerar. Du kan behöva hitta lösningar. Dessutom är datorresurser som tillhandahålls av Binder ganska enkla, så träningen kan gå långsamt, särskilt i senare, mer komplexa lektioner. +> **Obs**: För att förhindra missbruk har Binder blockerat åtkomst till vissa webbresurser. Detta kan hindra vissa delar av koden från att fungera, särskilt de som hämtar modeller och/eller dataset från det offentliga Internet. Du kan behöva hitta några lösningar. Dessutom är de datorkraftresurser som Binder tillhandahåller ganska grundläggande, så träning kommer att vara långsam, särskilt i senare och mer komplexa lektioner. ## Köra i molnet med GPU -Några av de senare lektionerna i detta kursmaterial skulle ha stor nytta av GPU-stöd. Modellträning kan till exempel vara smärtsamt långsam annars. Det finns några alternativ du kan följa, särskilt om du har tillgång till molnet antingen via [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) eller via din institution: +Vissa av de senare lektionerna i denna kursplan skulle ha stor nytta av GPU-stöd. Modellträning, till exempel, kan vara smärtsamt långsam annars. Det finns några alternativ du kan följa, särskilt om du har tillgång till molnet antingen via [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) eller via din institution: -* Skapa [Data Science Virtual Machine](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) och anslut till den via Jupyter. Du kan sedan klona repot direkt på maskinen och börja lära dig. NC-seriens virtuella maskiner har GPU-stöd. +* Skapa [Data Science Virtual Machine](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) och anslut till den via Jupyter. Du kan då klona repo direkt på maskinen och börja lära dig. NC-seriens VM:er har GPU-stöd. -> **Notera**: Vissa prenumerationer, inklusive Azure for Students, ger inte GPU-stöd från början. Du kan behöva begära extra GPU-kärnor med ett tekniskt supportärende. +> **Obs**: Vissa prenumerationer, inklusive Azure for Students, erbjuder inte GPU-stöd direkt. Du kan behöva begära extra GPU-kärnor med en teknisk supportförfrågan. -* Skapa [Azure Machine Learning Workspace](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) och använd sedan Notebooks-funktionen där. [Den här videon](https://azure-for-academics.github.io/quickstart/azureml-papers/) visar hur man klonar ett repo till en Azure ML Notebook och börjar använda det. +* Skapa [Azure Machine Learning Workspace](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) och använd sedan Notebook-funktionen där. [Denna video](https://azure-for-academics.github.io/quickstart/azureml-papers/) visar hur man klonar ett repository till Azure ML-notebook och börjar använda det. -Du kan också använda Google Colab, som har visst gratis GPU-stöd, och ladda upp Jupyter Notebook-filer där för att exekvera dem en i taget. +Du kan också använda Google Colab, som har viss gratis GPU-stöd, och ladda upp Jupyter Notebooks där för att köra dem en efter en. --- **Ansvarsfriskrivning**: -Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen var medveten om att automatiska översättningar kan innehålla fel eller brister. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår från användningen av denna översättning. +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, var vänlig notera att automatiska översättningar kan innehålla fel eller brister. Det ursprungliga dokumentet på dess modersmål bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för några missförstånd eller feltolkningar som uppstår till följd av användningen av denna översättning. \ No newline at end of file diff --git a/translations/sv/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/sv/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index cefdab0245..c05e8e043f 100644 --- a/translations/sv/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/sv/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -4,11 +4,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Förtränade modeller och transfer learning\n", + "# Förtränade modeller och överföringsinlärning\n", "\n", - "Att träna CNN:er kan ta mycket tid, och det krävs en stor mängd data för den uppgiften. Dock går mycket av tiden åt till att lära sig de bästa låg-nivåfiltren som ett nätverk använder för att extrahera mönster från bilder. En naturlig fråga uppstår - kan vi använda ett neuralt nätverk som tränats på en dataset och anpassa det för att klassificera andra bilder utan att genomgå hela träningsprocessen?\n", + "Att träna CNN:er kan ta mycket tid, och mycket data krävs för den uppgiften. Dock spenderas mycket tid på att lära sig de bästa låg-nivå filtren som ett nätverk använder för att extrahera mönster från bilder. En naturlig fråga uppstår – kan vi använda ett neuralt nätverk tränat på en datamängd och anpassa det till att klassificera olika bilder utan att behöva träna det från början?\n", "\n", - "Denna metod kallas **transfer learning**, eftersom vi överför viss kunskap från en modell av ett neuralt nätverk till ett annat. Vid transfer learning börjar vi vanligtvis med en förtränad modell, som har tränats på en stor bilddataset, såsom **ImageNet**. Dessa modeller är redan bra på att extrahera olika funktioner från generiska bilder, och i många fall kan det räcka att bygga en klassificerare ovanpå dessa extraherade funktioner för att uppnå ett bra resultat.\n" + "Detta tillvägagångssätt kallas **överföringsinlärning**, eftersom vi överför viss kunskap från en neural nätverksmodell till en annan. Vid överföringsinlärning börjar vi vanligtvis med en förtränad modell, som har tränats på någon stor bilddatamängd, såsom **ImageNet**. Dessa modeller kan redan göra ett bra jobb med att extrahera olika funktioner från generiska bilder, och i många fall kan man bara bygga en klassificerare ovanpå dessa extraherade funktioner för att få ett bra resultat.\n" ] }, { @@ -29,11 +29,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Datasetet Cats vs. Dogs\n", + "## Katter vs. Hundar Dataset\n", "\n", - "I denna enhet kommer vi att lösa ett verkligt problem med att klassificera bilder av katter och hundar. För detta ändamål kommer vi att använda [Kaggle Cats vs. Dogs Dataset](https://www.kaggle.com/c/dogs-vs-cats), som också kan laddas ner [från Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n", + "I denna enhet ska vi lösa ett verkligt problem med att klassificera bilder på katter och hundar. Av denna anledning kommer vi att använda [Kaggle Cats vs. Dogs Dataset](https://www.kaggle.com/c/dogs-vs-cats), som också kan laddas ner [från Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n", "\n", - "Låt oss ladda ner detta dataset och extrahera det till katalogen `data` (denna process kan ta lite tid!):\n" + "Låt oss ladda ner denna dataset och extrahera den till `data`-katalogen (denna process kan ta lite tid!):\n" ] }, { @@ -64,7 +64,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Tyvärr finns det några korrupta bildfiler i datasetet. Vi behöver göra en snabb rensning för att kontrollera korrupta filer. För att inte störa denna handledning har vi flyttat koden för att verifiera datasetet till en modul.\n" + "Tyvärr finns det några korrupta bildfiler i datasetet. Vi behöver göra en snabb rengöring för att kontrollera korrupta filer. För att inte förstöra denna handledning har vi flyttat koden för att verifiera datasetet till en modul.\n" ] }, { @@ -335,11 +335,11 @@ "source": [ "## Ladda datasetet\n", "\n", - "I tidigare exempel laddade vi dataset som är inbyggda i Keras. Nu ska vi arbeta med vårt eget dataset, som vi behöver ladda från en katalog med bilder.\n", + "I tidigare exempel laddade vi dataset som är inbyggda i Keras. Nu ska vi hantera vårt eget dataset, som vi behöver ladda från en katalog med bilder.\n", "\n", "I verkligheten kan storleken på bilddataset vara ganska stor, och man kan inte förlita sig på att all data får plats i minnet. Därför representeras dataset ofta som **generatorer** som kan returnera data i minibatcher som är lämpliga för träning.\n", "\n", - "För att hantera bildklassificering inkluderar Keras en speciell funktion `image_dataset_from_directory`, som kan ladda bilder från underkataloger som motsvarar olika klasser. Denna funktion tar också hand om att skala bilder, och den kan även dela upp datasetet i tränings- och testdelar:\n" + "För att hantera bildklassificering inkluderar Keras en speciell funktion `image_dataset_from_directory`, som kan ladda bilder från undermappar som motsvarar olika klasser. Denna funktion sköter även skalning av bilder, och kan dessutom dela upp datasetet i tränings- och testdelar:\n" ] }, { @@ -383,9 +383,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Det är viktigt att ange samma `seed`-värde för båda anropen, eftersom det påverkar uppdelningen av bilder mellan tränings- och testdataset.\n", + "Det är viktigt att sätta samma `seed`-värde för båda anropen, eftersom det påverkar hur bilderna delas upp mellan tränings- och testdataset.\n", "\n", - "Datasetet hämtar automatiskt klassnamn från kataloger, och du kan komma åt dem vid behov genom att anropa:\n" + "Dataset plockar automatiskt upp klassnamn från kataloger, och du kan komma åt dem om det behövs genom att anropa:\n" ] }, { @@ -412,7 +412,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Datasets som vi har erhållit kan direkt skickas till `fit`-funktionen för att träna modellen. De innehåller både motsvarande bilder och etiketter, som kan loopas över med följande konstruktion:\n" + "Dataset som vi har erhållit kan direkt skickas till funktionen `fit` för att träna modellen. De innehåller både motsvarande bilder och etiketter, vilka kan loopas igenom med följande konstruktion:\n" ] }, { @@ -453,7 +453,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "> **Observera**: Alla bilder i datasetet representeras som flyttalstensorer med intervallet 0-255. Innan vi skickar dem till neurala nätverket måste vi skala dessa värden till intervallet 0-1. När vi plottar bilder behöver vi antingen göra samma sak, eller konvertera värdena till typen `int` (vilket vi gör i koden ovan), för att visa `matplotlib` att vi vill plotta den ursprungliga oskalade bilden.\n" + "> **Obs**: Alla bilder i datasetet representeras som flyttalspunkt-tensorer med värden i intervallet 0-255. Innan vi skickar dem till neurala nätverket behöver vi skala dessa värden till intervallet 0-1. När vi plottrar bilder behöver vi antingen göra samma sak, eller konvertera värdena till typen `int` (vilket vi gör i koden ovan), för att visa `matplotlib` att vi vill plottra den ursprungliga oskalade bilden.\n" ] }, { @@ -462,7 +462,7 @@ "source": [ "## Förtränade modeller\n", "\n", - "För många bildklassificeringsuppgifter kan man hitta förtränade neurala nätverksmodeller. Många av dessa modeller finns tillgängliga inom `keras.applications`-namnrymden, och ännu fler modeller kan hittas på Internet. Låt oss se hur den enklaste VGG-16-modellen kan laddas och användas:\n" + "För många bildklassificeringsuppgifter kan man hitta förtränade neurala nätverksmodeller. Många av dessa modeller finns tillgängliga i `keras.applications`-namnrymden, och ännu fler modeller kan hittas på Internet. Låt oss se hur den enklaste VGG-16-modellen kan laddas och användas:\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": [ - "Det finns ett par viktiga saker här:\n", - "* Innan man skickar in en input till ett förtränat nätverk måste den förbehandlas på ett visst sätt. Detta görs genom att anropa motsvarande `preprocess_input`-funktion, som tar emot en batch av bilder och returnerar deras bearbetade form. I fallet med VGG-16 normaliseras bilderna, och ett fördefinierat medelvärde för varje kanal subtraheras. Detta beror på att VGG-16 ursprungligen tränades med denna förbehandling.\n", - "* Det neurala nätverket appliceras på input-batchen, och som resultat får vi en batch av 1000-elementstensorer som visar sannolikheten för varje klass. Vi kan hitta det mest sannolika klassnumret genom att anropa `argmax` på denna tensor.\n", - "* Det erhållna resultatet är ett [nummer för en `ImageNet`-klass](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). För att förstå detta resultat kan vi också använda funktionen `decode_predictions`, som returnerar de n främsta klasserna tillsammans med deras namn.\n" + "Det finns några viktiga saker här:\n", + "* Innan man skickar in en input till något förtränat nätverk måste den förbehandlas på ett visst sätt. Detta görs genom att kalla på motsvarande `preprocess_input`-funktion, som tar emot ett batch av bilder och returnerar deras bearbetade form. I fallet med VGG-16 normaliseras bilderna, och ett fördefinierat medelvärde för varje kanal subtraheras. Detta beror på att VGG-16 ursprungligen tränades med denna förbehandling.\n", + "* Det neurala nätverket appliceras på input-batchen, och vi får som resultat ett batch av 1000-elementstensorer som visar sannolikheten för varje klass. Vi kan hitta det mest sannolika klassnumret genom att kalla `argmax` på denna tensor.\n", + "* Det erhållna resultatet är ett [nummer för en `ImageNet`-klass](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). För att tolka resultatet kan vi även använda funktionen `decode_predictions` som returnerar de top n klasserna tillsammans med deras namn.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Låt oss också se arkitekturen för VGG-16-nätverket:\n" + "Låt oss också titta på arkitekturen för VGG-16-nätverket:\n" ] }, { @@ -599,7 +609,7 @@ "source": [ "## GPU-beräkningar\n", "\n", - "Djupa neurala nätverk, såsom VGG-16 och andra mer moderna arkitekturer, kräver ganska mycket beräkningskraft för att köras. Det är logiskt att använda GPU-acceleration om det är tillgängligt. Som tur är snabbar Keras automatiskt upp beräkningarna på GPU:n om den är tillgänglig. Vi kan kontrollera om Tensorflow kan använda GPU med följande kod:\n" + "Djupa neurala nätverk, såsom VGG-16 och andra mer moderna arkitekturer, kräver ganska mycket beräkningskraft för att köras. Det är rimligt att använda GPU-acceleration om det är tillgängligt. Lyckligtvis snabbar Keras automatiskt upp beräkningarna på GPU om det finns tillgängligt. Vi kan kontrollera om Tensorflow kan använda GPU med följande kod:\n" ] }, { @@ -626,9 +636,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ + "\n", "## Extrahera VGG-funktioner\n", "\n", - "Om vi vill använda VGG-16 för att extrahera funktioner från våra bilder behöver vi modellen utan de sista klassificeringslagren. Vi kan skapa en VGG-16-modell utan toppskikt med följande kod:\n" + "Om vi vill använda VGG-16 för att extrahera funktioner från våra bilder behöver vi modellen utan de slutliga klassificeringslagren. Vi kan skapa en VGG-16-modell utan de översta lagren med den här koden:\n" ] }, { @@ -680,9 +691,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Dimensionen av funktions-tensorn är 7x7x512, men för att kunna visualisera den var vi tvungna att omforma den till 2D-format.\n", + "Dimensionen på feature-tensorn är 7x7x512, men för att visualisera den var vi tvungna att omforma den till 2D-form.\n", "\n", - "Nu ska vi försöka se om dessa funktioner kan användas för att klassificera bilder. Låt oss manuellt ta en del av bilderna (50 minibatcher, i vårt fall) och förberäkna deras funktionsvektorer. Vi kan använda Tensorflow **dataset** API för att göra detta. `map`-funktionen tar ett dataset och applicerar en given lambda-funktion för att transformera det. Vi använder denna mekanism för att skapa nya dataset, `ds_features_train` och `ds_features_test`, som innehåller VGG-extraherade funktioner istället för de ursprungliga bilderna.\n" + "Nu ska vi försöka se om dessa features kan användas för att klassificera bilder. Vi tar manuellt en del av bilderna (50 minibatcher, i vårt fall) och förberäknar deras feature-vektorer. Vi kan använda Tensorflow **dataset** API för att göra det. `map`-funktionen tar en dataset och tillämpar en given lambda-funktion för att transformera den. Vi använder denna mekanism för att konstruera nya datasets, `ds_features_train` och `ds_features_test`, som innehåller VGG-extraherade features istället för ursprungliga bilder.\n" ] }, { @@ -714,7 +725,7 @@ "source": [ "Vi använde konstruktionen `.take(50)` för att begränsa datasetets storlek, för att snabba upp vår demonstration. Du kan naturligtvis utföra detta experiment på hela datasetet.\n", "\n", - "Nu när vi har ett dataset med extraherade funktioner kan vi träna en enkel tät klassificerare för att skilja mellan katter och hundar. Detta nätverk kommer att ta en funktionsvektor med formen (7,7,512) och producera ett output som motsvarar antingen en hund eller en katt. Eftersom det är en binär klassificering använder vi aktiveringsfunktionen `sigmoid` och förlustfunktionen `binary_crossentropy`.\n" + "Nu när vi har ett dataset med extraherade funktioner kan vi träna en enkel tät klassificerare för att skilja mellan katter och hundar. Detta nätverk kommer att ta en funktionsvektor med formen (7,7,512) och producera en utgång som motsvarar antingen en hund eller en katt. Eftersom det är en binär klassificering använder vi `sigmoid` aktiveringsfunktion och `binary_crossentropy` förlust.\n" ] }, { @@ -743,13 +754,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Resultatet är fantastiskt, vi kan skilja mellan en katt och en hund med nästan 95% sannolikhet! Dock har vi bara testat detta tillvägagångssätt på en delmängd av alla bilder, eftersom manuell funktionsextraktion verkar ta mycket tid.\n", + "Resultatet är fantastiskt, vi kan skilja mellan en katt och en hund med nästan 95% sannolikhet! Dock har vi bara testat detta tillvägagångssätt på en undergrupp av alla bilder, eftersom manuell features-extraktion verkar ta mycket tid.\n", "\n", - "## Transfer learning med en VGG-nätverk\n", + "## Transferinlärning med ett VGG-nätverk\n", "\n", - "Vi kan också undvika att manuellt förberäkna funktionerna genom att använda det ursprungliga VGG-16-nätverket i sin helhet under träningen, genom att lägga till en funktionsextraktor som första lager i vårt nätverk.\n", + "Vi kan också undvika att manuellt förberäkna egenskaperna genom att använda det ursprungliga VGG-16-nätverket som helhet under träning, genom att lägga till feature extractor till vårt nätverk som ett första lager.\n", "\n", - "Det fina med Keras-arkitekturen är att VGG-16-modellen som vi har definierat ovan också kan användas som ett lager i ett annat neuralt nätverk! Vi behöver bara konstruera ett nätverk med en tät klassificerare ovanpå det, och sedan träna hela nätverket med hjälp av backpropagation.\n" + "Det fina med Keras arkitektur är att VGG-16-modellen som vi definierat ovan också kan användas som ett lager i ett annat neuralt nätverk! Vi behöver bara konstruera ett nätverk med en tät klassificerare ovanpå det, och sedan träna hela nätverket med backpropagation.\n" ] }, { @@ -793,13 +804,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Den här modellen ser ut som ett end-to-end klassificeringsnätverk, som tar en bild och returnerar klassen. Det knepiga är dock att vi vill att VGG16 ska fungera som en funktionsutdragare och inte tränas om. Därför behöver vi **frysa vikterna för det konvolutionella funktionsutdraget**. Vi kan komma åt det första lagret i nätverket genom att anropa `model.layers[0]`, och vi behöver bara ställa in egenskapen `trainable` till `False`.\n", + "Denna modell ser ut som ett end-to-end klassificeringsnätverk, som tar en bild och returnerar klassen. Det knepiga är dock att vi vill att VGG16 ska agera som en feature-extraktor, och inte tränas om. Därför behöver vi **frysa vikterna i den konvolutionella feature-extraktorn**. Vi kan komma åt det första lagret i nätverket genom att anropa `model.layers[0]`, och vi behöver bara sätta egenskapen `trainable` till `False`.\n", "\n", - "> **Note**: Att frysa vikterna för funktionsutdraget är nödvändigt, eftersom ett otränat klassificeringslager annars kan förstöra de ursprungliga förtränade vikterna i det konvolutionella utdraget.\n", + "> **Notera**: Frysning av vikter för feature-extraktorn är nödvändig, eftersom ett otränat klassificeringslager annars kan förstöra de ursprungliga förtränade vikterna i den konvolutionella extraktorn.\n", "\n", - "Du kan märka att även om det totala antalet parametrar i vårt nätverk är runt 15 miljoner, tränar vi bara 25 000 parametrar. Alla andra parametrar i de översta konvolutionella filtren är förtränade. Det är bra, eftersom vi kan finjustera ett mindre antal parametrar med ett mindre antal exempel.\n", + "Du kan märka att medan det totala antalet parametrar i vårt nätverk är runt 15 miljoner, tränar vi endast 25k parametrar. Alla andra parametrar i de översta konvolutionella filtren är förtränade. Det är bra, eftersom vi kan finjustera ett mindre antal parametrar med ett mindre antal exempel.\n", "\n", - "Vi ska nu träna vårt nätverk och se hur bra vi kan bli. Förvänta dig ganska lång körtid, och oroa dig inte om det verkar som att körningen har frusit en stund.\n" + "Vi kommer nu att träna vårt nätverk och se hur bra det kan bli. Räkna med ganska lång körtid, och oroa dig inte om exekveringen verkar frusen under en tid.\n" ] }, { @@ -824,11 +835,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Det verkar som att vi har fått en ganska träffsäker klassificerare för katter och hundar!\n", + "Det ser ut som att vi har fått fram en ganska exakt klassificerare för katter vs. hundar! \n", "\n", "## Spara och ladda modellen\n", "\n", - "När vi har tränat modellen kan vi spara modellens arkitektur och tränade vikter i en fil för framtida användning:\n" + "När vi har tränat modellen kan vi spara modellens arkitektur och tränade vikter till en fil för framtida användning:\n" ] }, { @@ -852,7 +863,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Vi kan sedan ladda modellen från filen när som helst. Du kan tycka att det är användbart om nästa experiment förstör modellen - du skulle inte behöva börja om från början.\n" + "Vi kan sedan ladda modellen från fil när som helst. Du kan tycka att det är användbart om nästa experiment förstör modellen – du behöver då inte börja om från början.\n" ] }, { @@ -868,15 +879,15 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Finjustering av transfer learning\n", + "## Finjustering av överföringsinlärning\n", "\n", - "I föregående avsnitt tränade vi det sista klassificeringslagret för att klassificera bilder i vårt eget dataset. Däremot tränade vi inte om funktionsutvinnaren, och vår modell förlitade sig på de funktioner som modellen hade lärt sig från ImageNet-data. Om dina objekt visuellt skiljer sig från vanliga ImageNet-bilder kanske denna kombination av funktioner inte fungerar optimalt. Därför är det logiskt att börja träna konvolutionella lager också.\n", + "I föregående avsnitt tränade vi det slutgiltiga klassificeringslagret för att klassificera bilder i vår egen datamängd. Vi tränade dock inte om funktionsutdragaren, och vår modell förlitade sig på de funktioner som modellen har lärt sig från ImageNet-data. Om dina objekt visuellt skiljer sig från vanliga ImageNet-bilder, kanske denna kombination av funktioner inte fungerar bäst. Det är därför vettigt att börja träna de konvolutionella lagren också.\n", "\n", - "För att göra detta kan vi låsa upp parametrarna för de konvolutionella filtren som vi tidigare låste.\n", + "För att göra det kan vi tina upp parametrarna för konvolutionsfiltren som vi tidigare fryst.\n", "\n", - "> **Note:** Det är viktigt att du först låser parametrarna och genomför flera träningsomgångar för att stabilisera vikterna i klassificeringslagret. Om du omedelbart börjar träna ett nätverk från början till slut med upplåsta parametrar är det stor risk att stora fel förstör de förtränade vikterna i de konvolutionella lagren.\n", + "> **Obs:** Det är viktigt att du fryser parametrarna först och utför flera tränings-epoker för att stabilisera vikterna i klassificeringslagret. Om du omedelbart börjar träna hela nätverket med ofrysta parametrar är det stor risk att stora fel förstör de förtränade vikterna i de konvolutionella lagren.\n", "\n", - "Vår konvolutionella VGG-16-modell finns i det första lagret och består i sig av många lager. Vi kan titta på dess struktur:\n" + "Vår konvolutionella VGG-16-modell finns inuti det första lagret, och den består själv av många lager. Vi kan titta på dess struktur:\n" ] }, { @@ -945,7 +956,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Vi kan avfrosta alla lager av konvolutionell bas:\n" + "Vi kan låsa upp alla lager i konvolutionsbasen:\n" ] }, { @@ -961,7 +972,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Men att tina upp alla på en gång är inte den bästa idén. Vi kan först tina upp bara några få slutlager av konvolutioner, eftersom de innehåller högre nivåmönster som är relevanta för våra bilder. Till exempel kan vi börja med att frysa alla lager utom de sista 4:\n" + "Men att tina upp alla på en gång är inte den bästa idén. Vi kan först tina upp bara några få slutgiltiga lager av konvolutioner, eftersom de innehåller högre nivåers mönster som är relevanta för våra bilder. Till exempel kan vi börja med att frysa alla lager utom de sista 4: \n" ] }, { @@ -1000,11 +1011,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Observera att antalet tränbara parametrar ökade avsevärt, men det är fortfarande runt 50 % av alla parametrar.\n", + "Observera att antalet träningsbara parametrar ökade betydligt, men det är fortfarande runt 50 % av alla parametrar.\n", "\n", - "Efter att ha låst upp parametrarna kan vi köra några fler tränings-epoker (i vårt exempel kommer vi bara att köra en). Du kan också välja en lägre inlärningshastighet för att minimera påverkan på de förtränade vikterna. Men även med låg inlärningshastighet kan du förvänta dig att noggrannheten sjunker i början av träningen, innan den slutligen når en något högre nivå än i fallet med fasta vikter.\n", + "Efter att ha låst upp kan vi göra några fler träningscykler (i vårt exempel gör vi bara en). Du kan också välja en lägre inlärningshastighet för att minimera påverkan på de förtränade vikterna. Men även med låg inlärningshastighet kan du förvänta dig att noggrannheten sjunker i början av träningen, tills den slutligen når en något högre nivå än i fallet med fasta vikter.\n", "\n", - "> **Note:** Den här träningen går mycket långsammare eftersom vi behöver sprida gradienter tillbaka genom många lager i nätverket!\n" + "> **Obs:** Den här träningen sker mycket långsammare eftersom vi måste propagera gradienterna bakåt genom många lager i nätverket!\n" ] }, { @@ -1028,9 +1039,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Vi kommer sannolikt att uppnå högre träningsnoggrannhet eftersom vi använder ett kraftfullare nätverk med fler parametrar, men valideringsnoggrannheten kommer inte att öka lika mycket.\n", + "Vi kommer sannolikt att uppnå högre träningsnoggrannhet, eftersom vi använder ett kraftfullare nätverk med fler parametrar, men valideringsnoggrannheten skulle inte öka lika mycket.\n", "\n", - "Känn dig fri att låsa upp några fler lager i nätverket och träna vidare för att se om du kan uppnå högre noggrannhet!\n" + "Känn dig fri att låsa upp några fler lager i nätverket och träna mer, för att se om du kan uppnå högre noggrannhet!\n" ] }, { @@ -1039,7 +1050,7 @@ "source": [ "## Andra datorvisionsmodeller\n", "\n", - "VGG-16 är en av de enklaste datorvisionsarkitekturerna. Keras erbjuder många fler förtränade nätverk. De mest använda bland dessa är **ResNet**-arkitekturer, utvecklade av Microsoft, och **Inception** av Google. Till exempel, låt oss utforska arkitekturen för den enklaste ResNet-50-modellen (ResNet är en familj av modeller med olika djup, du kan prova att experimentera med ResNet-152 om du vill se hur en riktigt djup modell ser ut):\n" + "VGG-16 är en av de enklaste datorvisionsarkitekturerna. Keras tillhandahåller många fler förtränade nätverk. De mest använda bland dessa är **ResNet**-arkitekturer, utvecklade av Microsoft, och **Inception** av Google. Till exempel, låt oss utforska arkitekturen för den enklaste ResNet-50-modellen (ResNet är en familj av modeller med olika djup, du kan prova att experimentera med ResNet-152 om du vill se hur en riktigt djup modell ser ut):\n" ] }, { @@ -1441,11 +1452,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Som du kan se innehåller modellen samma välbekanta byggstenar: konvolutionslager, poolinglager och en slutlig tät klassificerare. Vi kan använda denna modell på exakt samma sätt som vi har använt VGG-16 för transfer learning. Du kan prova att experimentera med koden ovan, använda olika ResNet-modeller som basmodell och se hur noggrannheten förändras.\n", + "Som du kan se innehåller modellen samma välbekanta byggstenar: konvolutionella lager, poolningslager och slutligen en tät (dense) klassificerare. Vi kan använda denna modell på exakt samma sätt som vi har använt VGG-16 för transferinlärning. Du kan prova att experimentera med koden ovan, använda olika ResNet-modeller som basmodell, och se hur noggrannheten förändras.\n", "\n", - "## Batchnormalisering\n", + "## Batch Normalization\n", "\n", - "Detta nätverk innehåller ytterligare en typ av lager: **Batchnormalisering**. Idén med batchnormalisering är att föra värden som flödar genom det neurala nätverket till rätt intervall. Vanligtvis fungerar neurala nätverk bäst när alla värden ligger inom intervallet [-1,1] eller [0,1], och det är därför vi skalar/normaliserar våra indata därefter. Under träning av ett djupt nätverk kan det dock hända att värden hamnar betydligt utanför detta intervall, vilket gör träningen problematisk. Batchnormaliseringslagret beräknar medelvärde och standardavvikelse för alla värden i den aktuella minibatchen och använder dem för att normalisera signalen innan den skickas genom ett neuralt nätverkslager. Detta förbättrar stabiliteten hos djupa nätverk avsevärt.\n" + "Detta nätverk innehåller en ytterligare typ av lager: **Batch Normalization**. Idén med batchnormalisering är att föra värdena som flyter genom det neurala nätverket till rätt intervall. Vanligtvis fungerar neurala nätverk bäst när alla värden är inom intervallet [-1,1] eller [0,1], och det är anledningen till att vi skalar/normaliserar vår indata därefter. Under träningen av ett djupt nätverk kan det dock hända att värdena hamnar avsevärt utanför detta intervall, vilket gör träningen problematisk. Batchnormaliseringslagret beräknar medelvärde och standardavvikelse för alla värden i den aktuella minibatchen, och använder dem för att normalisera signalen innan den passerar genom ett lager i det neurala nätverket. Detta förbättrar stabiliteten i djupa nätverk avsevärt.\n" ] }, { @@ -1454,16 +1465,16 @@ "source": [ "## Slutsats\n", "\n", - "Genom att använda transfer learning kunde vi snabbt sätta ihop en klassificerare för vår anpassade objektklassificeringsuppgift och uppnå hög noggrannhet. Dock var detta exempel inte helt rättvist, eftersom det ursprungliga VGG-16-nätverket var förtränat för att känna igen katter och hundar, och vi återanvände därför de flesta mönster som redan fanns i nätverket. Du kan förvänta dig lägre noggrannhet för mer exotiska, domänspecifika objekt, såsom detaljer på produktionslinjen i en fabrik eller olika trädblad.\n", + "Genom att använda transfer learning kunde vi snabbt sätta ihop en klassificerare för vår anpassade objektklassificeringsuppgift och uppnå hög noggrannhet. Dock var detta exempel inte helt rättvist, eftersom det ursprungliga VGG-16-nätverket var förtränat för att känna igen katter och hundar, och därför återanvände vi mestadels mönster som redan fanns i nätverket. Du kan förvänta dig lägre noggrannhet på mer exotiska domänspecifika objekt, såsom detaljer på en produktionslinje i en fabrik eller olika trädblad.\n", "\n", - "Du kan se att mer komplexa uppgifter som vi löser nu kräver högre beräkningskraft och inte enkelt kan lösas på en CPU. I nästa enhet kommer vi att försöka använda en mer lättviktig implementation för att träna samma modell med lägre beräkningsresurser, vilket resulterar i endast något lägre noggrannhet.\n" + "Du kan se att mer komplexa uppgifter som vi löser nu kräver högre beräkningskraft och inte enkelt kan lösas på CPU. I nästa enhet kommer vi att försöka använda en mer lättviktig implementation för att träna samma modell med lägre beräkningsresurser, vilket resulterar i bara något lägre noggrannhet.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**Ansvarsfriskrivning**: \nDetta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, bör det noteras att automatiska översättningar kan innehålla fel eller brister. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som kan uppstå vid användning av denna översättning.\n" + "---\n\n\n**Ansvarsfriskrivning**:\nDetta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, var vänlig notera att automatiska översättningar kan innehålla fel eller brister. Det ursprungliga dokumentet på dess modersmål bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för några missförstånd eller feltolkningar som uppstår till följd av användningen av denna översättning.\n\n" ] } ], @@ -1484,12 +1495,6 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" - }, - "coopTranslator": { - "original_hash": "c189abc107848f96051085cc30945129", - "translation_date": "2025-08-28T16:28:22+00:00", - "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", - "language_code": "sv" } }, "nbformat": 4, diff --git a/translations/sv/lessons/5-NLP/README.md b/translations/sv/lessons/5-NLP/README.md index 93758bcd9f..7ff54463bb 100644 --- a/translations/sv/lessons/5-NLP/README.md +++ b/translations/sv/lessons/5-NLP/README.md @@ -1,34 +1,34 @@ # Naturlig Språkbearbetning -![Sammanfattning av NLP-uppgifter i en skiss](../../../../translated_images/sv/ai-nlp.b22dcb8ca4707cea.webp) - -I den här delen kommer vi att fokusera på att använda neurala nätverk för att hantera uppgifter relaterade till **naturlig språkbearbetning (NLP)**. Det finns många NLP-problem som vi vill att datorer ska kunna lösa: - -* **Textklassificering** är ett typiskt klassificeringsproblem som rör textsekvenser. Exempel inkluderar att klassificera e-postmeddelanden som skräppost eller inte, eller att kategorisera artiklar som sport, ekonomi, politik, etc. När vi utvecklar chattbotar behöver vi ofta förstå vad en användare vill säga – i detta fall handlar det om **avsiktsklassificering**. Ofta måste vi hantera många kategorier i avsiktsklassificering. -* **Sentimentanalys** är ett typiskt regressionsproblem där vi behöver tilldela ett värde (ett sentiment) som motsvarar hur positivt/negativt innebörden av en mening är. En mer avancerad version av sentimentanalys är **aspektbaserad sentimentanalys** (ABSA), där vi tilldelar sentiment inte till hela meningen, utan till olika delar av den (aspekter), t.ex. *På den här restaurangen gillade jag maten, men atmosfären var hemsk*. -* **Named Entity Recognition** (NER) handlar om att extrahera vissa enheter från text. Till exempel kan vi behöva förstå att i frasen *Jag behöver flyga till Paris imorgon* hänvisar ordet *imorgon* till DATUM, och *Paris* är en PLATS. -* **Nyckelordsutvinning** liknar NER, men här behöver vi automatiskt extrahera ord som är viktiga för meningen, utan att förträna för specifika enhetstyper. -* **Textklustring** kan vara användbart när vi vill gruppera liknande meningar, till exempel liknande förfrågningar i tekniska supportkonversationer. -* **Frågehantering** handlar om en modells förmåga att svara på en specifik fråga. Modellen får en textpassage och en fråga som indata, och den behöver ange en plats i texten där svaret på frågan finns (eller ibland generera själva svarstexten). -* **Textgenerering** är en modells förmåga att skapa ny text. Det kan ses som en klassificeringsuppgift där nästa bokstav/ord förutsägs baserat på en *textprompt*. Avancerade textgenereringsmodeller, som GPT-3, kan lösa andra NLP-uppgifter som klassificering med hjälp av en teknik som kallas [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). -* **Textsammanfattning** är en teknik där vi vill att en dator ska "läsa" lång text och sammanfatta den i några meningar. +![Sammanfattning av NLP-uppgifter i en kladd](../../../../translated_images/sv/ai-nlp.b22dcb8ca4707cea.webp) + +I detta avsnitt kommer vi att fokusera på att använda neurala nätverk för att hantera uppgifter relaterade till **Naturlig Språkbearbetning (NLP)**. Det finns många NLP-problem som vi vill att datorer ska kunna lösa: + +* **Textklassificering** är ett typiskt klassificeringsproblem som rör textsekvenser. Exempel inkluderar att klassificera e-postmeddelanden som skräppost vs. inte skräppost, eller att kategorisera artiklar som sport, affärer, politik, osv. Också när vi utvecklar chattbotar behöver vi ofta förstå vad en användare ville säga – i detta fall handlar det om **avsiktsklassificering**. Ofta, vid avsiktsklassificering, behöver vi hantera många kategorier. +* **Sentimentanalys** är ett typiskt regressionsproblem, där vi behöver tilldela ett nummer (en känsla) som motsvarar hur positiv/negativ meningen i en mening är. En mer avancerad version av sentimentanalys är **aspektbaserad sentimentanalys** (ABSA), där vi tilldelar sentiment inte till hela meningen, utan till olika delar av den (aspekter), t.ex. *I denna restaurang gillade jag maten, men atmosfären var hemsk*. +* **Named Entity Recognition** (NER) syftar på problemet att extrahera vissa entiteter från text. Till exempel kan vi behöva förstå att i frasen *Jag behöver flyga till Paris imorgon* refererar ordet *imorgon* till DATUM, och *Paris* är en PLATS. +* **Nyckelordsutvinning** liknar NER, men vi behöver automatiskt extrahera ord som är viktiga för meningen i meningen, utan förträning för specifika entitetstyper. +* **Textklustring** kan vara användbart när vi vill gruppera liknande meningar, till exempel liknande förfrågningar i teknisk support. +* **Frågesvar** syftar på förmågan hos en modell att svara på en specifik fråga. Modellen får en textavsnitt och en fråga som indata, och den behöver ange en plats i texten där svaret på frågan finns (eller ibland generera svaret i textform). +* **Textgenerering** är en modells förmåga att generera ny text. Det kan ses som en klassificeringsuppgift där nästa bokstav/ord förutsägs baserat på någon *textprompt*. Avancerade textgenereringsmodeller, såsom GPT-3, kan lösa andra NLP-uppgifter som klassificering med en teknik som kallas [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) +* **Textsammanfattning** är en teknik där vi vill att en dator "läser" lång text och sammanfattar den i några meningar. * **Maskinöversättning** kan ses som en kombination av textförståelse på ett språk och textgenerering på ett annat. -Från början löstes de flesta NLP-uppgifter med traditionella metoder som grammatik. Till exempel användes parsers i maskinöversättning för att omvandla en ursprunglig mening till ett syntaxträd, sedan extraherades högre semantiska strukturer för att representera meningen av meningen, och baserat på denna mening och grammatiken i målspråket genererades resultatet. Idag löses många NLP-uppgifter mer effektivt med hjälp av neurala nätverk. +Inledningsvis löstes de flesta NLP-uppgifter med traditionella metoder såsom grammatiker. Till exempel användes parsers i maskinöversättning för att omvandla den ursprungliga meningen till ett syntaxträd, sedan extraherades högre nivåers semantiska strukturer för att representera meningen av meningen, och baserat på denna mening och grammatiken i målspråket genererades resultatet. Numera löses många NLP-uppgifter mer effektivt med neurala nätverk. -> Många klassiska NLP-metoder är implementerade i Python-biblioteket [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org). Det finns en fantastisk [NLTK-bok](https://www.nltk.org/book/) tillgänglig online som täcker hur olika NLP-uppgifter kan lösas med NLTK. +> Många klassiska NLP-metoder är implementerade i Python-biblioteket [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org). Det finns en utmärkt [NLTK Book](https://www.nltk.org/book/) tillgänglig online som täcker hur olika NLP-uppgifter kan lösas med NLTK. -I vår kurs kommer vi främst att fokusera på att använda neurala nätverk för NLP, och vi kommer att använda NLTK där det behövs. +I vår kurs kommer vi mestadels att fokusera på att använda neurala nätverk för NLP, och vi kommer att använda NLTK där det behövs. -Vi har redan lärt oss att använda neurala nätverk för att hantera tabulära data och bilder. Den största skillnaden mellan dessa typer av data och text är att text är en sekvens med variabel längd, medan indata i fallet med bilder är känd i förväg. Även om konvolutionella nätverk kan extrahera mönster från indata, är mönster i text mer komplexa. Till exempel kan negation vara separerad från subjektet med ett godtyckligt antal ord (t.ex. *Jag gillar inte apelsiner* vs. *Jag gillar inte de där stora färgglada goda apelsinerna*), och det bör fortfarande tolkas som ett mönster. Därför behöver vi introducera nya typer av neurala nätverk, såsom *rekurrenta nätverk* och *transformers*, för att hantera språk. +Vi har redan lärt oss om att använda neurala nätverk för att hantera tabulär data och bilder. Den huvudsakliga skillnaden mellan dessa typer av data och text är att text är en sekvens med variabel längd, medan indatastorleken vid bilder är känd i förväg. Medan konvolutionsnätverk kan extrahera mönster från indata, är mönster i text mer komplexa. T.ex., kan negation vara separerad från subjektet med godtyckligt många ord (t.ex. *Jag gillar inte apelsiner*, vs. *Jag gillar inte de där stora färgglada goda apelsinerna*), och det bör ändå tolkas som ett mönster. Därför behöver vi nya typer av neurala nätverk för att hantera språk, såsom *rekurrenta nätverk* och *transformers*. -## Installera bibliotek +## Installera Bibliotek -Om du använder en lokal Python-installation för att köra den här kursen kan du behöva installera alla nödvändiga bibliotek för NLP med följande kommandon: +Om du använder en lokal Python-installation för att köra denna kurs, kan du behöva installera alla nödvändiga bibliotek för NLP med följande kommandon: **För PyTorch** ```bash -pip install -r requirements-torch.txt +pip install -r requirements-pytorch.txt ``` **För TensorFlow** ```bash @@ -39,13 +39,13 @@ pip install -r requirements-tf.txt ## GPU-varning -I den här delen kommer vi i vissa exempel att träna ganska stora modeller. -* **Använd en dator med GPU-stöd**: Det är lämpligt att köra dina anteckningsböcker på en dator med GPU-stöd för att minska väntetiderna när du arbetar med stora modeller. -* **Begränsningar för GPU-minne**: Att köra på en GPU kan leda till situationer där GPU-minnet tar slut, särskilt när du tränar stora modeller. -* **GPU-minnesförbrukning**: Mängden GPU-minne som används under träning beror på olika faktorer, inklusive minibatch-storleken. -* **Minimera minibatch-storlek**: Om du stöter på problem med GPU-minne, överväg att minska minibatch-storleken i din kod som en möjlig lösning. -* **TensorFlow GPU-minneshantering**: Äldre versioner av TensorFlow kanske inte frigör GPU-minne korrekt när flera modeller tränas inom en Python-kärna. För att hantera GPU-minnesanvändning effektivt kan du konfigurera TensorFlow att endast allokera GPU-minne vid behov. -* **Kod för inkludering**: För att ställa in TensorFlow att växa GPU-minnesallokering endast när det behövs, inkludera följande kod i dina anteckningsböcker: +I detta avsnitt kommer vi i några av exemplen träna ganska stora modeller. +* **Använd en dator med GPU-stöd**: Det är rekommenderat att köra dina anteckningsböcker på en dator med GPU-stöd för att minska väntetider när du arbetar med stora modeller. +* **Begränsningar i GPU-minne**: Att köra på GPU kan leda till situationer där du får slut på GPU-minne, särskilt när du tränar stora modeller. +* **GPU-minnesförbrukning**: Mängden GPU-minne som förbrukas under träning beror på olika faktorer, bland annat minibatch-storleken. +* **Minimera minibatch-storleken**: Om du stöter på problem med GPU-minnet, överväg att minska minibatch-storleken i din kod som en möjlig lösning. +* **TensorFlow GPU-minnesfrigöring**: Äldre versioner av TensorFlow kan ha problem med att frigöra GPU-minnet korrekt när man tränar flera modeller i en och samma Python-kärna. För att effektivt hantera GPU-minnesanvändning kan du konfigurera TensorFlow att bara allokera GPU-minne vid behov. +* **Kod inkludering**: För att ställa in TensorFlow så att GPU-minnesallokeringen växer endast när det behövs, inkludera följande kod i dina anteckningsböcker: ```python physical_devices = tf.config.list_physical_devices('GPU') @@ -53,13 +53,13 @@ if len(physical_devices)>0: tf.config.experimental.set_memory_growth(physical_devices[0], True) ``` -Om du är intresserad av att lära dig om NLP ur ett klassiskt ML-perspektiv, besök [denna serie lektioner](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP) +Om du är intresserad av att lära dig om NLP från ett klassiskt ML-perspektiv, besök [denna serie lektioner](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP) -## I den här delen -I den här delen kommer vi att lära oss om: +## I detta avsnitt +I detta avsnitt kommer vi att lära oss om: * [Att representera text som tensorer](13-TextRep/README.md) -* [Ordinbäddningar](14-Emdeddings/README.md) +* [Ordbäddningar](14-Emdeddings/README.md) * [Språkmodellering](15-LanguageModeling/README.md) * [Rekurrenta neurala nätverk](16-RNN/README.md) * [Generativa nätverk](17-GenerativeNetworks/README.md) @@ -67,5 +67,7 @@ I den här delen kommer vi att lära oss om: --- -**Ansvarsfriskrivning**: -Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, bör du vara medveten om att automatiserade översättningar kan innehålla fel eller inexaktheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file + +**Ansvarsfriskrivning**: +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, var vänlig notera att automatiska översättningar kan innehålla fel eller brister. Det ursprungliga dokumentet på dess modersmål bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för några missförstånd eller feltolkningar som uppstår till följd av användningen av denna översättning. + \ No newline at end of file diff --git a/translations/sw/.co-op-translator.json b/translations/sw/.co-op-translator.json index 8ed28d8e17..990c1ed1f3 100644 --- a/translations/sw/.co-op-translator.json +++ b/translations/sw/.co-op-translator.json @@ -5,6 +5,12 @@ "source_file": "AGENTS.md", "language_code": "sw" }, + "CONTRIBUTING.md": { + "original_hash": "c6fd7e781b67111a90abd166d0ce4aa0", + "translation_date": "2026-07-08T16:45:07+00:00", + "source_file": "CONTRIBUTING.md", + "language_code": "sw" + }, "README.md": { "original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b", "translation_date": "2026-04-06T16:17:02+00:00", @@ -17,6 +23,19 @@ "source_file": "SECURITY.md", "language_code": "sw" }, + "__translation_failures__": { + "lessons/sketchnotes/LICENSE.md": { + "original_hash": "45ab63a2cd8f5faef6c9b150618837a4", + "source_file": "lessons/sketchnotes/LICENSE.md", + "language_code": "sw", + "failure_date": "2026-07-08T16:44:37+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-25T21:06:19+00:00", @@ -54,8 +73,8 @@ "language_code": "sw" }, "examples/README.md": { - "original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7", - "translation_date": "2025-10-03T11:33:09+00:00", + "original_hash": "7883d52c2e2a221e0b07a7b112a149b9", + "translation_date": "2026-07-08T16:39:18+00:00", "source_file": "examples/README.md", "language_code": "sw" }, @@ -66,8 +85,8 @@ "language_code": "sw" }, "lessons/0-course-setup/how-to-run.md": { - "original_hash": "a4717bd9103b9f6cd84d534b83534689", - "translation_date": "2026-01-16T04:20:07+00:00", + "original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1", + "translation_date": "2026-07-08T16:39:45+00:00", "source_file": "lessons/0-course-setup/how-to-run.md", "language_code": "sw" }, @@ -191,6 +210,12 @@ "source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md", "language_code": "sw" }, + "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": { + "original_hash": "99b816b6a4957ef4100cee4c4221dff9", + "translation_date": "2026-07-08T16:25:35+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", + "language_code": "sw" + }, "lessons/4-ComputerVision/08-TransferLearning/lab/README.md": { "original_hash": "7765935c35fcee69b9fe2d0cfd6963e2", "translation_date": "2025-08-25T20:57:37+00:00", @@ -330,8 +355,8 @@ "language_code": "sw" }, "lessons/5-NLP/README.md": { - "original_hash": "8ef02a9318257ea140ed3ed74442096d", - "translation_date": "2025-08-25T20:48:39+00:00", + "original_hash": "038df6f1a73e49f6430740da083bfd6d", + "translation_date": "2026-07-08T16:40:16+00:00", "source_file": "lessons/5-NLP/README.md", "language_code": "sw" }, diff --git a/translations/sw/CONTRIBUTING.md b/translations/sw/CONTRIBUTING.md new file mode 100644 index 0000000000..d6628e8d30 --- /dev/null +++ b/translations/sw/CONTRIBUTING.md @@ -0,0 +1,29 @@ +# Kuchangia AI-Kwa-Wananchi + +Asante kwa kuonesha nia ya kuchangia AI-Kwa-Wananchi! Tunakaribisha tafsiri, marekebisho ya masomo, na marekebisho ya uundaji. + +## Makubaliano ya Leseni ya Mchangiaji ya Microsoft (CLA) + +Mradi huu unakaribisha michango na mapendekezo. Michango mingi inahitaji ukubaliane na Makubaliano ya Leseni ya Mchangiaji (CLA) yanayosema kuwa una haki ya, na kwa kweli unatupa, haki za kutumia mchango wako. Kwa maelezo, tembelea [https://cla.microsoft.com](https://cla.microsoft.com). + +Unapowasilisha ombi la kuvuta, bot wa CLA otomatiki ataamua ikiwa unatakiwa kutoa CLA na kupamba PR ipasavyo (mfano, lebo, maoni). Fuata tu maelekezo yaliyotolewa na bot. Utahitaji kufanya hivi mara moja tu kwa hifadhidata zote zinazotumia CLA yetu. + +## Jinsi ya Kuchangia + +### 1. Marekebisho ya Makosa ya Kielelezo / Makosa ya Nambari +Ikiwa utapata kosa la kielelezo au hitilafu katika daftari lolote la Jupyter au faili ya masomo ya markdown: +1. Fanya fork hifadhidata. +2. Rekebisha kosa la kielelezo au kiungo kilichovunjika. +3. Wasilisha Ombi la Kuvuta (Pull Request) lenye maelezo wazi ya marekebisho. + +### 2. Kusambaza Tafsiri +Tunakaribisha tafsiri za masomo katika lugha nyingine! Tafadhali weka tafsiri chini ya saraka ya `translations/` ukitumia majina ya folda zilizopo (mfano `translations/es/`, `translations/pt-BR/`, `translations/zh-CN/`). + +Kwa maelezo zaidi, ona [etc/CONTRIBUTING.md](etc/CONTRIBUTING.md). + +--- + + +**Kionyozo**: +Hati hii imetafsiriwa kwa kutumia huduma ya tafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kupata usahihi, tafadhali fahamu kwamba tafsiri za kiotomatiki zinaweza kuwa na makosa au upungufu wa usahihi. Hati ya asili katika lugha yake halisi inapaswa kuchukuliwa kama chanzo cha mamlaka. Kwa taarifa muhimu, tafsiri ya kitaalamu inayofanywa na binadamu inapendekezwa. Hatutojibu kwa kuelewa vibaya au tafsiri potofu zinazotokea kutokana na matumizi ya tafsiri hii. + \ No newline at end of file diff --git a/translations/sw/examples/README.md b/translations/sw/examples/README.md index 83ea006767..9eb2862ec1 100644 --- a/translations/sw/examples/README.md +++ b/translations/sw/examples/README.md @@ -1,31 +1,31 @@ -# Mifano ya AI kwa Wanaoanza +# Mifano Rahisi ya AI Kwa Waanzilishi -Karibu! Hii ni orodha ya mifano rahisi, inayojitegemea ili kukusaidia kuanza na AI na ujifunzaji wa mashine. Kila mfano umeundwa kuwa rafiki kwa wanaoanza, ukiwa na maelezo ya kina na maelekezo ya hatua kwa hatua. +Karibu! Saraka hii ina mifano rahisi, huru inayokusaidia kuanza na AI na mashine kujifunza. Kila mfano umeundwa kwa urafiki kwa wanaoanza ikiwa na maelezo ya kina na ufafanuzi hatua kwa hatua. ## 📚 Muhtasari wa Mifano -| Mfano | Maelezo | Ugumu | Mahitaji ya awali | -|-------|---------|-------|-------------------| -| [Hello AI World](../../../examples/01-hello-ai-world.py) | Programu yako ya kwanza ya AI - utambuzi rahisi wa mifumo | ⭐ Msingi | Msingi wa Python | -| [Simple Neural Network](../../../examples/02-simple-neural-network.py) | Jenga mtandao wa neva kutoka mwanzo | ⭐⭐ Msingi+ | Python, hesabu za msingi | -| [Image Classifier](./03-image-classifier.ipynb) | Tambua picha kwa kutumia modeli iliyofunzwa awali | ⭐⭐ Msingi+ | Python, numpy | -| [Text Sentiment](../../../examples/04-text-sentiment.py) | Changanua hisia za maandishi (chanya/hasira) | ⭐⭐ Msingi+ | Python | +| Mfano | Maelezo | Ugumu | Masharti | +|---------|-------------|------------|---------------| +| [Hello AI World](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/01-hello-ai-world.py) | Programu yako ya kwanza ya AI - utambuzi rahisi wa mifumo | ⭐ Maanzilishi | Misingi ya Python | +| [Simple Neural Network](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/02-simple-neural-network.py) | Tengeneza mtandao wa neva kutoka mwanzo | ⭐⭐ Maanzilishi+ | Python, hisabati ya msingi | +| [Image Classifier](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/03-image-classifier.ipynb) | Tengeneza waainishi wa picha kwa kutumia mfano uliobobea | ⭐⭐ Maanzilishi+ | Python, numpy | +| [Text Sentiment](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/04-text-sentiment.py) | Changanua hisia za maandishi (zaki/ hasi) | ⭐⭐ Maanzilishi+ | Python | -## 🚀 Kuanza +## 🚀 Kuanzisha -### Mahitaji ya awali +### Masharti -Hakikisha una Python imewekwa (inayopendekezwa ni 3.8 au zaidi). Weka pakiti zinazohitajika: +Hakikisha umeweka Python (3.8 au juu zaidi inapendekezwa). Toshea vifurushi vinavyohitajika: ```bash -# For Python scripts +# Kwa maandishi ya Python pip install numpy -# For Jupyter notebooks (image classifier) +# Kwa daftari za Jupyter (kipanga picha) pip install jupyter numpy pillow tensorflow ``` -Au tumia mazingira ya conda kutoka kwenye mtaala mkuu: +Au tumia mazingira ya conda kutoka mtaala mkuu: ```bash conda env create --name ai4beg --file ../environment.yml @@ -34,52 +34,54 @@ conda activate ai4beg ### Kuendesha Mifano -**Kwa faili za Python (.py):** +**Kwa ajili ya faili za Python (.py):** ```bash python 01-hello-ai-world.py ``` -**Kwa Jupyter notebooks (.ipynb):** +**Kwa ajili ya daftari za Jupyter (.ipynb):** ```bash jupyter notebook 03-image-classifier.ipynb ``` ## 📖 Njia ya Kujifunza -Tunapendekeza ufuate mifano kwa mpangilio: +Tunapendekeza kufuata mifano kwa mpangilio: 1. **Anza na "Hello AI World"** - Jifunze misingi ya utambuzi wa mifumo 2. **Jenga Mtandao Rahisi wa Neva** - Elewa jinsi mitandao ya neva inavyofanya kazi -3. **Jaribu Image Classifier** - Tazama AI ikifanya kazi na picha halisi -4. **Changanua Hisia za Maandishi** - Gusa uchakataji wa lugha asilia +3. **Jaribu Waainishi wa Picha** - Tazama AI ikifanya kazi kwa picha halisi +4. **Changanua Hisia za Maandishi** - Gundua usindikaji wa lugha asilia -## 💡 Vidokezo kwa Wanaoanza +## 💡 Vidokezo kwa Waanzilishi -- **Soma maoni ya kificho kwa makini** - Yanatoa maelezo ya kila mstari -- **Jaribu!** - Badilisha thamani na uone kinachotokea -- **Usijali kuhusu kuelewa kila kitu** - Kujifunza ni mchakato +- **Soma maelezo ya msimbo kwa makini** - Yanaeleza kila mstari hutenda nini +- **Jaribu mabadiliko!** - Badilisha thamani na uone kinachotokea +- **Usijali kuelewa kila kitu** - Kujifunza kunachukua muda - **Uliza maswali** - Tumia [Bodi ya Majadiliano](https://github.com/microsoft/AI-For-Beginners/discussions) ## 🔗 Hatua Zifuatazo -Baada ya kukamilisha mifano hii, gundua mtaala kamili: +Baada ya kukamilisha mifano hii, chunguza mtaala mzima: - [Utangulizi wa AI](../lessons/1-Intro/README.md) - [Mitandao ya Neva](../lessons/3-NeuralNetworks/README.md) -- [Uchambuzi wa Picha](../lessons/4-ComputerVision/README.md) -- [Uchakataji wa Lugha Asilia](../lessons/5-NLP/README.md) +- [Utambuzi wa Kompyuta](../lessons/4-ComputerVision/README.md) +- [Usindikaji wa Lugha Asilia](../lessons/5-NLP/README.md) ## 🤝 Kuchangia -Umeona mifano hii inasaidia? Saidia kuiboresha: -- Ripoti matatizo au pendekeza maboresho -- Ongeza mifano zaidi kwa wanaoanza -- Boresha nyaraka na maoni +Umeona mifano hii ni msaada? Tusaidie kuiboresha: +- Ripoti matatizo au mapendekezo ya maboresho +- Ongeza mifano zaidi kwa waanzilishi +- Boresheni nyaraka na maelezo --- -*Kumbuka: Kila mtaalamu alikuwa mwanzoni. Kujifunza kunafurahisha! 🎓* +*Kumbuka: Kila mtaalamu alikuwa mwanzo. Furahia kujifunza! 🎓* --- -**Kanusho**: -Hati hii imetafsiriwa kwa kutumia huduma ya tafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kwa usahihi, tafadhali fahamu kuwa tafsiri za kiotomatiki zinaweza kuwa na makosa au kutokuwa sahihi. Hati ya asili katika lugha yake ya awali inapaswa kuzingatiwa kama chanzo cha mamlaka. Kwa taarifa muhimu, inashauriwa kutumia huduma ya tafsiri ya kibinadamu ya kitaalamu. Hatutawajibika kwa kutoelewana au tafsiri zisizo sahihi zinazotokana na matumizi ya tafsiri hii. \ No newline at end of file + +**Kionyozo**: +Hati hii imetafsiriwa kwa kutumia huduma ya tafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kupata usahihi, tafadhali fahamu kwamba tafsiri za kiotomatiki zinaweza kuwa na makosa au upungufu wa usahihi. Hati ya asili katika lugha yake halisi inapaswa kuchukuliwa kama chanzo cha mamlaka. Kwa taarifa muhimu, tafsiri ya kitaalamu inayofanywa na binadamu inapendekezwa. Hatutojibu kwa kuelewa vibaya au tafsiri potofu zinazotokea kutokana na matumizi ya tafsiri hii. + \ No newline at end of file diff --git a/translations/sw/lessons/0-course-setup/how-to-run.md b/translations/sw/lessons/0-course-setup/how-to-run.md index 66841141ba..12655e0e89 100644 --- a/translations/sw/lessons/0-course-setup/how-to-run.md +++ b/translations/sw/lessons/0-course-setup/how-to-run.md @@ -1,12 +1,12 @@ # Jinsi ya Kuendesha Msimbo -Mtaala huu una mifano mingi inayoweza kutekelezwa na maabara ambazo ungependa kuendesha. Ili kufanya hivi, unahitaji uwezo wa kutekeleza msimbo wa Python katika Jupyter Notebooks zinazotolewa kama sehemu ya mtaala huu. Una chaguzi kadhaa za kuendesha msimbo: +Mtaala huu una mifano mingi inayoweza kutekelezwa na maabara ambazo ungependa kuendesha. Ili kufanya hivyo, unahitaji uwezo wa kutekeleza msimbo wa Python katika Jupyter Notebooks zinazotolewa kama sehemu ya mtaala huu. Una chaguzi kadhaa za kuendesha msimbo: -## Endesha kwa karibu kwenye kompyuta yako +## Endesha kwa ndani kwenye kompyuta yako -Ili kuendesha msimbo kwa karibu kwenye kompyuta yako, usakinishaji wa Python unahitajika. Moja ya mapendekezo ni kusakinisha **[miniconda](https://conda.io/en/latest/miniconda.html)** - ni usakinishaji mzito mdogo unaounga mkono meneja wa pakiti `conda` kwa **mazingira pepe** tofauti za Python. +Ili kuendesha msimbo kwa ndani kwenye kompyuta yako, unahitaji kuwa na usakinishaji wa Python. Moja ya mapendekezo ni kusakinisha **[miniconda](https://conda.io/en/latest/miniconda.html)** - ni usakinishaji mwepesi unaounga mkono meneja wa vifurushi `conda` kwa mazingira mbalimbali ya Python **virtual environments**. -Baada ya kusakinisha miniconda, tengeneza nakala ya hazina na unda mazingira pepe yatakayotumika kwa kozi hii: +Baada ya kusakinisha miniconda, nakili (clone) hifadhidata na unda mazingira ya virtual yatakayotumika kwa kozi hii: ```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 ``` -### Kutumia Visual Studio Code na Ongezeko la Python +### Kutumia Visual Studio Code na Virutubisho vya Python -Mtaala huu unatumika vyema unapoifungua katika [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) pamoja na [Ongezeko la Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste). +Mtaala huu unatumika vizuri zaidi unapoufungua katika [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) ukiwa na [Virutubisho vya Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste). -> **Kumbuka**: Mara tu unapochukua nakala na kufungua saraka katika VS Code, itapendekeza kiotomati kusakinisha ongezeko la Python. Pia utahitaji kusakinisha miniconda kama ilivyoelezwa hapo juu. +> **Kumbuka**: Mara baada ya kunakili na kufungua saraka katika VS Code, itapendekeza moja kwa moja kusakinisha virutubisho vya Python. Pia utahitaji kusakinisha miniconda kama ilivyoelezwa hapo juu. -> **Kumbuka**: Ikiwa VS Code itapendekeza kufungua tena hazina katika chombo (container), unapaswa kukataa ili kutumia usakinishaji wa Python wenyewe wenyewe. +> **Kumbuka**: Ikiwa VS Code itakupendekeza kufungua hifadhidata upya ndani ya kontena, unapaswa kukataa hii ili kutumia usakinishaji wa Python kwa ndani. ### Kutumia Jupyter katika Kivinjari -Unaweza pia kutumia mazingira ya Jupyter kutoka kwa kivinjari kwenye kompyuta yako mwenyewe. Jupyter wa kawaida na JupyterHub zote hutoa mazingira mazuri ya maendeleo yenye ukamilishaji wa kiotomatiki, kuangazia msimbo, n.k. +Unaweza pia kutumia mazingira ya Jupyter kutoka kivinjari kwenye kompyuta yako mwenyewe. Jupyter wa kawaida na JupyterHub zote zinatoa mazingira mazuri ya maendeleo yenye utimilifu wa nira (auto-completion), muonekano wa msimbo, n.k. -Kuanza Jupyter kwa karibu, nenda kwenye saraka ya kozi, na tekereza: +Ili kuanza Jupyter kwa ndani, nenda kwenye saraka ya kozi, na tekeleza: ```bash jupyter notebook @@ -36,36 +36,36 @@ au ```bash jupyterhub ``` -Kisha unaweza kuvinjari kwenye faili yoyote za `.ipynb`, uzifungue na kuanza kufanya kazi. +Kisha unaweza kuvinjari faili yoyote ya `.ipynb`, ufungue na kuanza kufanya kazi. -### Kuendesha katika chombo (container) +### Kuendesha katika kontena -Mbali na usakinishaji wa Python, utaratibu mwingine ni kuendesha msimbo katika chombo. Kwa kuwa hazina yetu hutoa folda maalum ya `.devcontainer` inayofundisha jinsi ya kujenga chombo kwa ajili ya hazina hii, VS Code hutoa fursa ya kufungua tena msimbo katika chombo. Hii itahitaji usakinishaji wa Docker, na pia itakuwa na ngumu zaidi, kwa hivyo tunapendekeza hii kwa watumiaji waliobobea zaidi. +Njia mbadala ya usakinishaji wa Python ni kuendesha msimbo katika kontena. Kwa kuwa hifadhidata yetu ina jalada maalum `.devcontainer` linaloelekeza jinsi ya kujenga kontena kwa ajili ya repository hii, VS Code inatoa fursa ya kufungua upya msimbo ndani ya kontena. Hii itahitaji usakinishaji wa Docker, na pia itakuwa ngumu zaidi, kwa hiyo tunapendekeza hii kwa watumiaji wenye uzoefu zaidi. -## Kuendesha katika Wingu +## Kuendesha kwenye Wingu -Ikiwa hutaki kusakinisha Python kwa karibu, na una upatikanaji wa baadhi ya rasilimali za wingu - chaguo zuri ni kuendesha msimbo katika wingu. Kuna njia kadhaa unazoweza kufanya hivi: +Ikiwa hutaki kusakinisha Python kwa ndani, na una upatikanaji wa rasilimali za wingu - njia nzuri ni kuendesha msimbo kwenye wingu. Kuna njia kadhaa unazoweza kutumia kufanya hivi: -* Kutumia **[GitHub Codespaces](https://github.com/features/codespaces)**, ambacho ni mazingira pepe yaliyoandaliwa kwa ajili yako kwenye GitHub, yanayoweza kufikiwa kupitia kiolesura cha kivinjari cha VS Code. Ikiwa una upatikanaji wa Codespaces, unaweza kubofya tu kitufe cha **Code** katika hazina, anza codespace, na kuanza kufanya kazi mara moja. -* Kutumia **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) hutoa rasilimali za kompyuta bure mtandaoni kwa watu kama wewe kujaribu msimbo wa GitHub. Kuna kitufe katika ukurasa wa mwanzo kufungua hazina katika Binder - hii itakupeleka haraka kwenye tovuti ya binder, ambayo itajenga chombo cha msingi na kuanzisha kiolesura cha mtandao cha Jupyter kwa urahisi. +* Kutumia **[GitHub Codespaces](https://github.com/features/codespaces)**, ambayo ni mazingira halisi yaliyoundwa kwa ajili yako kwenye GitHub, yanayopatikana kupitia kiolesura cha kivinjari cha VS Code. Ikiwa una upatikanaji wa Codespaces, unaweza kubofya tu kitufe cha **Code** katika repo, anza codespace, na uanze kuendesha mara moja. +* Kutumia **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) hutoa rasilimali za kompyuta bure zinazotolewa kwenye wingu kwa watu kama wewe kujaribu msimbo wa GitHub. Kuna kitufe kwenye ukurasa wa mwanzo cha kufungua repository kwenye Binder - hii itakupeleka haraka kwenye tovuti ya binder, ambayo itajenga kontena la msingi na kuanzisha kiolesura cha wavuti cha Jupyter kwako kwa urahisi. -> **Kumbuka**: Ili kuzuia matumizi mabaya, Binder ina rasilimali za wavuti zilizo vizuiziwa. Hii inaweza kuzuia baadhi ya misimbo kufanya kazi, ambayo hupakua mifano na/au seti za data kutoka mtandao wa umma. Huenda ukahitaji kupata njia mbadala. Pia, rasilimali za kompyuta zinazotolewa na Binder ni za msingi, hivyo mafunzo yatachukua muda mrefu, hasa katika masomo ya baadaye yenye ugumu zaidi. +> **Kumbuka**: Ili kuzuia matumizi mabaya, Binder ina upatikanaji wa baadhi ya rasilimali za wavuti zilizozuiwa. Hii inaweza kuzuia baadhi ya misimbo kufanya kazi, ambayo hupakua mifano na/au seti za data kutoka kwenye mtandao wa umma. Huenda utahitaji kutafuta mbinu mbadala. Pia, rasilimali za kompyuta zinazotolewa na Binder ni za kawaida tu, kwa hiyo mafunzo yatakuwa polepole, hasa katika mafunzo ya baadaye, magumu zaidi. -## Kuendesha katika Wingu na GPU +## Kuendesha kwenye Wingu kwa GPU -Baadhi ya masomo ya baadaye katika mtaala huu yatanufaika sana na msaada wa GPU. Mafunzo ya mfano, kwa mfano, yanaweza kuwa polepole sana vinginevyo. Kuna chaguzi kadhaa unazoweza kufuata, hasa ikiwa una upatikanaji wa wingu kupitia [Azure kwa Wanafunzi](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste), au kupitia taasisi yako: +Baadhi ya masomo ya baadaye katika mtaala huu yangefaidika sana na msaada wa GPU. Mafunzo ya mifano, kwa mfano, yanaweza kuwa polepole sana vinginevyo. Kuna chaguzi kadhaa unazoweza kufuata, hasa ikiwa una upatikanaji wa wingu kupitia [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste), au kupitia taasisi yako: -* Unda [Mashine Pepe ya Sayansi ya Data](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) na uungane nayo kupitia Jupyter. Kisha unaweza kuunda nakala ya hazina moja kwa moja kwenye mashine, na kuanza kujifunza. VMs za mfululizo wa NC zina msaada wa GPU. +* Unda [Data Science Virtual Machine](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) na uunganishe kupitia Jupyter. Kisha unaweza kunakili repo moja kwa moja kwenye mashine, na kuanza kujifunza. VMs za NC-series zina msaada wa GPU. -> **Kumbuka**: Baadhi ya usajili, ikiwa ni pamoja na Azure kwa Wanafunzi, hazitoi msaada wa GPU moja kwa moja. Huenda ukahitaji kuomba cores za GPU ziada kupitia ombi la msaada wa kiufundi. +> **Kumbuka**: Baadhi ya usajili, ikiwemo Azure for Students, haipati msaada wa GPU moja kwa moja. Huenda utahitaji kuomba cores za ziada za GPU kupitia ombi la msaada wa kiufundi. -* Unda [Eneo la Kazi la Azure Machine Learning](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) kisha tumia kipengele cha Notebook pale. [Video hii](https://azure-for-academics.github.io/quickstart/azureml-papers/) inaonyesha jinsi ya kunakili hazina katika daftari la Azure ML na kuanza kuitumia. +* Unda [Azure Machine Learning Workspace](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) na kisha tumia kipengele cha Notebook hapo. [Video hii](https://azure-for-academics.github.io/quickstart/azureml-papers/) inaonyesha jinsi ya kunakili repository ndani ya Azure ML notebook na kuanza kuitumia. -Unaweza pia kutumia Google Colab, ambayo inakuja na msaada wa bure wa GPU, na kupakia Jupyter Notebooks pale kuzikamilisha moja moja. +Unaweza pia kutumia Google Colab, ambayo huja na msaada wa GPU bure, na kupakia Jupyter Notebooks huko ili kuzitekeleza mmoja mmoja. --- -**Kielezi cha Majumuisho**: -Hati hii imetafsiriwa kwa kutumia huduma ya tafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kwa usahihi, tafadhali fahamu kwamba tafsiri za kiotomatiki zinaweza kuwa na makosa au upungufu wa usahihi. Hati ya awali katika lugha yake ya asili inapaswa kuchukuliwa kama chanzo halali. Kwa taarifa muhimu, tafsiri ya kitaalamu inayofanywa na watu inashauriwa. Hatuwajibiki kwa maelewano au ufafanuzi mbaya unaotokana na matumizi ya tafsiri hii. +**Kionyozo**: +Hati hii imetafsiriwa kwa kutumia huduma ya tafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kupata usahihi, tafadhali fahamu kwamba tafsiri za kiotomatiki zinaweza kuwa na makosa au upungufu wa usahihi. Hati ya asili katika lugha yake halisi inapaswa kuchukuliwa kama chanzo cha mamlaka. Kwa taarifa muhimu, tafsiri ya kitaalamu inayofanywa na binadamu inapendekezwa. Hatutojibu kwa kuelewa vibaya au tafsiri potofu zinazotokea kutokana na matumizi ya tafsiri hii. \ No newline at end of file diff --git a/translations/sw/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/sw/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index 25b51b0206..0bc02ed5f0 100644 --- a/translations/sw/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/sw/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -4,11 +4,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Miundo iliyofunzwa awali na ujifunzaji wa kuhamisha\n", + "# Modeli zilizofunzwa awali na ujifunzaji wa usafirishaji\n", "\n", - "Kufundisha CNNs kunaweza kuchukua muda mwingi, na data nyingi inahitajika kwa kazi hiyo. Hata hivyo, muda mwingi hutumika kujifunza vichujio vya kiwango cha chini bora ambavyo mtandao unatumia kutoa mifumo kutoka kwa picha. Swali la asili linatokea - je, tunaweza kutumia mtandao wa neva uliyopewa mafunzo kwenye seti moja ya data na kuubadilisha ili kuainisha picha tofauti bila mchakato kamili wa mafunzo?\n", + "Kufunza CNN kunaweza kuchukua muda mwingi, na inahitajika data nyingi kwa kazi hiyo. Hata hivyo, sehemu kubwa ya muda hutumika kujifunza kichujio bora cha ngazi ya chini ambacho mtandao unatumia kutoa mifumo kutoka kwa picha. Swali la asili linatokea - je, tunaweza kutumia mtandao wa neva uliopigwa mafunzo kwenye seti moja ya data kisha kuubadilisha ili kukagua picha tofauti bila kupitia mchakato wa mafunzo kamili?\n", "\n", - "Mbinu hii inaitwa **ujifunzaji wa kuhamisha**, kwa sababu tunahamisha maarifa fulani kutoka kwa mfano mmoja wa mtandao wa neva kwenda mwingine. Katika ujifunzaji wa kuhamisha, kwa kawaida tunaanza na mfano uliyopewa mafunzo awali, ambao umefundishwa kwenye seti kubwa ya data ya picha, kama vile **ImageNet**. Miundo hiyo tayari inaweza kufanya kazi nzuri ya kutoa vipengele tofauti kutoka kwa picha za kawaida, na mara nyingi kujenga kionainishaji juu ya vipengele hivyo vilivyotolewa kunaweza kutoa matokeo mazuri.\n" + "Mbinu hii huitwa **ujifunzaji wa usafirishaji**, kwa sababu tunasafirisha maarifa fulani kutoka kwa mfano mmoja wa mtandao wa neva hadi mwingine. Katika ujifunzaji wa usafirishaji, kawaida huanza na mfano uliofunzwa awali, ambao umefundishwa kwenye seti kubwa ya picha, kama vile **ImageNet**. Modeli hizo tayari zinaweza kufanya kazi nzuri kutoa sifa tofauti kutoka kwa picha za jumla, na katika kesi nyingi kujenga kikagua tu juu ya sifa hizo zilizotolewa kunaweza kutoa matokeo mazuri.\n" ] }, { @@ -29,11 +29,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Seti ya Paka dhidi ya Mbwa\n", + "## Seti ya Takwimu ya Paka dhidi ya Mbwa\n", "\n", - "Katika sehemu hii, tutashughulikia tatizo halisi la kuainisha picha za paka na mbwa. Kwa sababu hii, tutatumia [Seti ya Paka dhidi ya Mbwa ya Kaggle](https://www.kaggle.com/c/dogs-vs-cats), ambayo pia inaweza kupakuliwa [kutoka Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n", + "Katika kitengo hiki, tutatatua tatizo halisi la kuainisha picha za paka na mbwa. Kwa sababu hii, tutatumia [Kaggle Cats vs. Dogs Dataset](https://www.kaggle.com/c/dogs-vs-cats), ambayo pia inaweza kupakuliwa [kutoka Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n", "\n", - "Hebu tupakue seti hii ya data na kuitoa kwenye saraka ya `data` (mchakato huu unaweza kuchukua muda!):\n" + "Hebu pakua seti hii ya takwimu na uifanye ichanue kwenye saraka ya `data` (mchakato huu unaweza kuchukua muda!):\n" ] }, { @@ -64,7 +64,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Kwa bahati mbaya, kuna baadhi ya faili za picha zilizoharibika kwenye seti ya data. Tunahitaji kufanya usafishaji wa haraka ili kuangalia faili zilizoharibika. Ili kuepuka kuvuruga mafunzo haya, tumehamisha msimbo wa kuthibitisha seti ya data kwenye moduli.\n" + "Kwa bahati mbaya, kuna baadhi ya faili za picha zilizoharibika katika seti ya data. Tunahitaji kufanya usafi wa haraka ili kuangalia faili zilizoharibika. Ili kutoathiri mafunzo haya, tulibadilisha msimbo wa kuthibitisha seti ya data kuwa moduli.\n" ] }, { @@ -333,13 +333,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Kupakia Dataset\n", + "## Kupakia Dataseti\n", "\n", - "Katika mifano ya awali, tulikuwa tunapakia dataset ambazo zimejengwa ndani ya Keras. Sasa tunakaribia kushughulikia dataset yetu wenyewe, ambayo tunahitaji kupakia kutoka kwenye saraka ya picha.\n", + "Katika mifano iliyopita, tulikuwa tukipakia dataseti zilizojengwa ndani ya Keras. Sasa tuko karibu kushughulikia dataseti yetu wenyewe, ambayo tunahitaji kuipakia kutoka katika saraka ya picha.\n", "\n", - "Katika maisha halisi, ukubwa wa dataset za picha unaweza kuwa mkubwa sana, na mtu hawezi kutegemea data yote kuweza kutoshea kwenye kumbukumbu. Kwa hivyo, dataset mara nyingi huwakilishwa kama **generators** ambazo zinaweza kurudisha data kwa vikundi vidogo vinavyofaa kwa mafunzo.\n", + "Katika maisha halisi, ukubwa wa dataseti za picha unaweza kuwa mkubwa sana, na mtu hawezi kutegemea data zote kuweza kuendana ndani ya kumbukumbu. Kwa hivyo, dataseti mara nyingi huwakilishwa kama **janitors** zinazoweza kurudisha data katika minibatch zinazofaa kwa mafunzo.\n", "\n", - "Ili kushughulikia uainishaji wa picha, Keras inajumuisha kazi maalum `image_dataset_from_directory`, ambayo inaweza kupakia picha kutoka kwenye saraka ndogo zinazowakilisha madarasa tofauti. Kazi hii pia inashughulikia kupunguza ukubwa wa picha, na inaweza pia kugawanya dataset kuwa sehemu za mafunzo na majaribio:\n" + "Kushughulikia uainishaji wa picha, Keras inajumuisha kazi maalum `image_dataset_from_directory`, inayoweza kupakia picha kutoka saraka ndogo zinazolingana na madarasa tofauti. Kazi hii pia inahakikisha kupunguza ukubwa wa picha, na inaweza pia kugawanya dataseti katika sehemu za mafunzo na za mtihani:\n" ] }, { @@ -383,9 +383,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Ni muhimu kuweka thamani sawa ya `seed` kwa miito yote miwili, kwa sababu inathiri mgawanyo wa picha kati ya seti ya mafunzo na seti ya majaribio.\n", + "Ni muhimu kuweka thamani sawa ya `seed` kwa simu zote mbili, kwa sababu inaathiri mgawanyo wa picha kati ya mafunzo na dataset ya majaribio.\n", "\n", - "Dataset huchukua majina ya madarasa moja kwa moja kutoka kwenye folda, na unaweza kuyapata ikiwa unahitaji kwa kuita:\n" + "Dataset huchukua majina ya darasa moja kwa moja kutoka kwenye saraka, na unaweza kuyapata ikiwa utahitaji kwa kupiga simu:\n" ] }, { @@ -412,7 +412,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Seti za data tulizopata zinaweza kupitishwa moja kwa moja kwenye kazi ya `fit` ili kufundisha modeli. Zinajumuisha picha na lebo zinazohusiana, ambazo zinaweza kurudiwa kwa kutumia ujenzi ufuatao:\n" + "Seti za data tulizozipata zinaweza kutumwa moja kwa moja kwenye kazi ya `fit` kufundisha modeli. Zinajumuisha picha na lebo zinazolingana, ambazo zinaweza kuzungushwa kwa kutumia muundo unaofuata:\n" ] }, { @@ -453,16 +453,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "> **Kumbuka**: Picha zote kwenye seti ya data zinawakilishwa kama tensors za nukta za kuelea zenye kiwango cha 0-255. Kabla ya kuzipitisha kwenye mtandao wa neva, tunahitaji kupunguza thamani hizo kuwa kiwango cha 0-1. Wakati wa kuchora picha, tunahitaji kufanya vivyo hivyo, au kubadilisha thamani kuwa aina ya `int` (ambayo tunafanya kwenye msimbo hapo juu), ili kuonyesha `matplotlib` kwamba tunataka kuchora picha ya asili isiyopunguzwa.\n" + "> **Kumbuka**: Picha zote katika seti ya data zinawakilishwa kama tensor za pointi nambari za kupepea zenye awamu ya 0-255. Kabla ya kuzipitisha kwenye mtandao wa neva, tunahitaji kupima upya thamani hizo katika awamu ya 0-1. Tunapochora picha, tunahitaji kufanya vivyo hivyo, au kubadilisha thamani kuwa aina ya `int` (ambayo tunafanya katika msimbo hapo juu), ili kuonyesha `matplotlib` kuwa tunataka kuchora picha halisi isiyopimwa upya.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Miundo iliyofunzwa awali\n", + "## Miundo Iliyoandaliwa Awali\n", "\n", - "Kwa kazi nyingi za uainishaji wa picha, mtu anaweza kupata miundo ya mtandao wa neva iliyofunzwa awali. Miundo mingi kati ya hiyo inapatikana ndani ya namespace ya `keras.applications`, na miundo mingine zaidi inaweza kupatikana kwenye Intaneti. Hebu tuone jinsi mfano rahisi wa VGG-16 unavyoweza kupakiwa na kutumika:\n" + "Kwa kazi nyingi za upangaji picha mtu anaweza kupata miundo ya mitandao ya neva iliyopangwa awali. Mengi ya miundo hiyo inapatikana ndani ya nafasi ya majina `keras.applications`, na miundo mingine mingi zaidi inaweza kupatikana mtandaoni. Tuaone jinsi mfano rahisi wa VGG-16 unaweza kupakuliwa na kutumiwa:\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": [ - "Kuna mambo kadhaa muhimu hapa: \n", - "* Kabla ya kupitisha ingizo lolote kwenye mtandao uliokwisha funzwa, lazima liandaliwe kwa njia fulani. Hii inafanyika kwa kuita kazi ya `preprocess_input`, ambayo hupokea kundi la picha na kurudisha toleo lao lililoandaliwa. Kwa mfano wa VGG-16, picha zinasawazishwa, na thamani fulani ya wastani iliyotanguliwa kwa kila njia huondolewa. Hii ni kwa sababu VGG-16 ilifundishwa awali kwa kutumia maandalizi haya. \n", - "* Mtandao wa neva unatumika kwenye kundi la ingizo, na tunapokea kama matokeo kundi la tensors zenye vipengele 1000 vinavyoonyesha uwezekano wa kila darasa. Tunaweza kupata namba ya darasa lenye uwezekano mkubwa zaidi kwa kutumia `argmax` kwenye tensor hii. \n", - "* Matokeo yaliyopatikana ni [namba ya darasa la `ImageNet`](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Ili kuelewa matokeo haya, tunaweza pia kutumia kazi ya `decode_predictions`, ambayo inarudisha madarasa ya juu zaidi n pamoja na majina yao. \n" + "Kuna mambo kadhaa muhimu hapa:\n", + "* Kabla ya kupitisha ingizo kwa mtandao wowote uliosoma mafunzo awali lazima uanze kuandaliwa kwa njia fulani. Hii hufanywa kwa kuita kazi inayohusiana ya `preprocess_input`, ambayo hupokea kundi la picha, na kurudisha toleo lililopangwa la picha hizo. Katika kesi ya VGG-16, picha huwekwa sawa (normalize), na thamani ya wastani iliyotangazwa kwa kila njia huondolewa. Hii ni kwa sababu VGG-16 ilifunzwa asili na maandalizi haya ya awali.\n", + "* Mtandao wa neva hutumika kwa kundi la ingizo, na tunapokea matokeo kama kundi la tensors lenye vipengele 1000 vinavyoonyesha uwezekano wa kila darasa. Tunaweza kupata nambari ya darasa inayowezekana zaidi kwa kuita `argmax` kwenye tensor hii.\n", + "* Matokeo yaliyopatikana ni [nambari ya darasa la `ImageNet`](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Ili kuelewa matokeo haya vyema, pia tunaweza kutumia kazi ya `decode_predictions`, inayorejesha madarasa ya juu n pamoja na majina yao.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Hebu pia tuone usanifu wa mtandao wa VGG-16:\n" + "Tuwe pia tuone usanifu wa mtandao wa VGG-16:\n" ] }, { @@ -597,9 +607,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Mahesabu ya GPU\n", + "## Maunzi ya GPU\n", "\n", - "Mitandao ya neva ya kina, kama VGG-16 na usanifu mwingine wa kisasa zaidi, inahitaji nguvu kubwa ya kompyuta ili kuendesha. Inaleta maana kutumia kasi ya GPU ikiwa inapatikana. Kwa bahati nzuri, Keras huongeza kasi ya mahesabu kwenye GPU moja kwa moja ikiwa inapatikana. Tunaweza kuangalia kama Tensorflow inaweza kutumia GPU kwa kutumia msimbo ufuatao:\n" + "Mitandao ya neva ya kina, kama vile VGG-16 na miundo mingine ya kisasa inahitaji nguvu kubwa ya kompyuta kuendesha. Inafaa kutumia kuharakisha kwa GPU, ikiwa inapatikana. Kwa bahati nzuri, Keras huongeza kasi kwa automatiska maunzi kwenye GPU ikiwa inapatikana. Tunaweza kuangalia ikiwa Tensorflow inaweza kutumia GPU kwa kutumia msimbo ufuatao:\n" ] }, { @@ -626,9 +636,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Kuchukua Sifa za VGG\n", "\n", - "Ikiwa tunataka kutumia VGG-16 kuchukua sifa kutoka kwenye picha zetu, tunahitaji mfano wa mtindo bila tabaka za mwisho za uainishaji. Tunaweza kuanzisha mtindo wa VGG-16 bila tabaka za juu kwa kutumia msimbo huu:\n" + "## Kutoa vipengele vya VGG\n", + "\n", + "Ikiwa tunataka kutumia VGG-16 kutoa vipengele kutoka kwa picha zetu, tunahitaji modeli bila tabaka za mwisho za upangaji. Tunaweza kuanzisha modeli ya VGG-16 bila tabaka za juu tukitumia msimbo huu:\n" ] }, { @@ -680,9 +691,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Vipimo vya tensor ya sifa ni 7x7x512, lakini ili kuweza kuiona tulilazimika kuibadilisha kuwa umbo la 2D.\n", + "Kigezo cha tensor ya kipengele ni 7x7x512, lakini kwa ajili ya kuionyesha tulilazimika kuibadilisha kuwa fomu ya 2D.\n", "\n", - "Sasa hebu tujaribu kuona kama sifa hizo zinaweza kutumika kuainisha picha. Hebu tuchukue sehemu fulani ya picha (vikundi vidogo 50, katika hali yetu), na tuhesabu vektori za sifa zao mapema. Tunaweza kutumia API ya **dataset** ya Tensorflow kufanya hivyo. Kazi ya `map` inachukua dataset na kutumia lambda-function iliyotolewa kubadilisha dataset hiyo. Tunatumia utaratibu huu kuunda dataset mpya, `ds_features_train` na `ds_features_test`, ambazo zina sifa zilizotolewa na VGG badala ya picha asili.\n" + "Sasa hebu tajaribu kuona kama vipengele hivyo vinaweza kutumika kuainisha picha. Hebu tuchukue sehemu fulani ya picha kwa mkono (minibatches 50, katika kesi yetu), na kuhesabu awali vekta zao za vipengele. Tunaweza tumia API ya Tensorflow **dataset** kufanya hivyo. Kazi ya `map` inachukua dataset na kutekeleza kipengele cha lambda kilichotolewa kubadilisha dataset hiyo. Tunatumia mfumo huu kuunda datasets mpya, `ds_features_train` na `ds_features_test`, ambazo zina vipengele vilivyotolewa na VGG badala ya picha asilia.\n" ] }, { @@ -712,9 +723,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Tulitumia ujenzi `.take(50)` kupunguza ukubwa wa seti ya data, ili kuharakisha maonyesho yetu. Bila shaka unaweza kufanya jaribio hili kwenye seti ya data kamili.\n", + "Tuli tumia ujenzi `.take(50)` kupunguza ukubwa wa seti ya data, ili kuharakisha maonyesho yetu. Bila shaka unaweza kufanya jaribio hili kwenye seti kamili ya data.\n", "\n", - "Sasa kwa kuwa tuna seti ya data yenye vipengele vilivyotolewa, tunaweza kufundisha kisainia rahisi cha mnene ili kutofautisha kati ya paka na mbwa. Mtandao huu utachukua vector ya vipengele yenye umbo (7,7,512), na kutoa matokeo moja yanayowakilisha aidha mbwa au paka. Kwa sababu ni uainishaji wa binary, tunatumia `sigmoid` kama kazi ya uanzishaji na `binary_crossentropy` kama hasara.\n" + "Sasa tuna seti ya data yenye vipengele vilivyotolewa, tunaweza kufundisha mchuja rahisi mnyoofu kutofautisha kati ya paka na mbwa. Mtandao huu utachukua vekta ya kipengele yenye umbo (7,7,512), na kutoa matokeo moja ambayo yanaendana na mbwa au paka. Kwa kuwa ni uainishaji wa binary, tunatumia kipengele cha uamsho `sigmoid` na hasara ya `binary_crossentropy`.\n" ] }, { @@ -743,13 +754,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Matokeo ni mazuri, tunaweza kutofautisha kati ya paka na mbwa kwa uwezekano wa karibu 95%! Hata hivyo, tumepima mbinu hii tu kwenye sehemu ndogo ya picha zote, kwa sababu uchimbaji wa sifa kwa mikono unaonekana kuchukua muda mwingi.\n", + "Matokeo ni mazuri, tunaweza kutofautisha kati ya paka na mbwa kwa uwezekano wa karibu 95%! Hata hivyo, tumetumia mbinu hii tu kwenye sehemu ndogo ya picha zote, kwa sababu uchimbaji wa sifa kwa mikono unaonekana kuchukua muda mwingi.\n", "\n", - "## Kujifunza kwa uhamisho kwa kutumia mtandao mmoja wa VGG\n", + "## Kujifunza kwa uhamishaji kwa kutumia mtandao mmoja wa VGG\n", "\n", - "Tunaweza pia kuepuka uchimbaji wa sifa kwa mikono kwa kutumia mtandao wa awali wa VGG-16 kama mzima wakati wa mafunzo, kwa kuongeza kichimbaji cha sifa kwenye mtandao wetu kama safu ya kwanza.\n", + "Pia tunaweza kuepuka kuhesabu sifa kwa mikono kwa kutumia mtandao wa asili wa VGG-16 kwa ujumla wakati wa mafunzo, kwa kuongeza kichimbaji sifa kwenye mtandao wetu kama tabaka la kwanza.\n", "\n", - "Uzuri wa usanifu wa Keras ni kwamba mfano wa VGG-16 ambao tumeufafanua hapo juu unaweza pia kutumika kama safu katika mtandao mwingine wa neva! Tunachohitaji ni kujenga mtandao wenye kichanganuzi mnene juu yake, kisha kufundisha mtandao mzima kwa kutumia kurudi nyuma kwa kueneza.\n" + "Uzuri wa usanifu wa Keras ni kwamba mfano wa VGG-16 tulioutaja hapo juu pia unaweza kutumika kama tabaka katika mtandao mwingine wa neva! Tunahitaji tu kuunda mtandao wenye kichanganuzi mnene juu yake, kisha kufundisha mtandao mzima kwa kutumia ueneaji wa nyuma.\n" ] }, { @@ -793,13 +804,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Mtindo huu unaonekana kama mtandao wa uainishaji wa mwisho hadi mwisho, ambao unachukua picha na kurudisha darasa. Hata hivyo, jambo gumu ni kwamba tunataka VGG16 ifanye kazi kama kichanganuzi cha sifa, na si kufundishwa upya. Kwa hivyo, tunahitaji **kufungia uzito wa kichanganuzi cha sifa za convolutional**. Tunaweza kufikia safu ya kwanza ya mtandao kwa kuita `model.layers[0]`, na tunachohitaji ni kuweka mali ya `trainable` kuwa `False`.\n", + "Mfumo huu unaonekana kama mtandao wa uainishaji wa mwisho-mwisho, unaochukua picha na kurudisha darasa. Hata hivyo, kitu kigumu ni kwamba tunataka VGG16 itumike kama kivunja sifa, na isifundishwe upya. Kwa hivyo, tunahitaji **kukandamiza uzito wa kivunja sifa cha convolutional**. Tunaweza kufikia tabaka la kwanza la mtandao kwa kuita `model.layers[0]`, na tunahitaji tu kuweka mali ya `trainable` kuwa `False`.\n", "\n", - "> **Note**: Kufungia uzito wa kichanganuzi cha sifa ni muhimu, kwa sababu vinginevyo safu ya uainishaji isiyofundishwa inaweza kuharibu uzito wa awali wa kichanganuzi cha convolutional kilichofundishwa awali.\n", + "> **Kumbuka**: Kukandamiza uzito wa kivunja sifa ni muhimu, kwa sababu vinginevyo tabaka la klasifaya lisilofundishwa linaweza kuharibu uzito wa awali uliowekwa wa kivunja cha convolutional.\n", "\n", - "Unaweza kugundua kwamba ingawa jumla ya idadi ya vigezo katika mtandao wetu ni takriban milioni 15, tunafundisha tu vigezo 25,000. Vigezo vingine vyote vya vichujio vya convolutional vya kiwango cha juu vimefundishwa awali. Hii ni nzuri, kwa sababu tunaweza kurekebisha idadi ndogo ya vigezo kwa kutumia idadi ndogo ya mifano.\n", + "Unaweza kuona kwamba wakati jumla ya vigezo katika mtandao wetu ni takriban milioni 15, tunafunza vigezo 25k tu. Vigezo vingine vyote vya kichujio cha convolutional cha ngazi ya juu ni vilivyofundishwa awali. Hilo ni zuri, kwa sababu tunaweza kufanya marekebisho madogo kwa idadi ndogo ya vigezo kwa idadi ndogo ya mifano.\n", "\n", - "Sasa tutafundisha mtandao wetu na kuona jinsi tunavyoweza kufanikisha. Tarajia muda mrefu wa utekelezaji, na usijali ikiwa utekelezaji utaonekana kama umesimama kwa muda fulani.\n" + "Sasa tutafunza mtandao wetu na kuona jinsi tunavyoweza kufikia matokeo mazuri. Tarajia muda mrefu wa utekelezaji, na usijali kama utekelezaji utaonekana kusimama kwa muda.\n" ] }, { @@ -824,11 +835,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Inaonekana tumepata kiondoa tofauti cha paka dhidi ya mbwa ambacho ni sahihi kwa kiasi kikubwa!\n", + "Inaonekana tumepata kisagaambazo sahihi kwa watu wa paka dhidi ya mbwa! \n", "\n", - "## Kuhifadhi na Kupakia Modeli\n", + "## Kuhifadhi na Kupakua Mfano\n", "\n", - "Baada ya kufundisha modeli, tunaweza kuhifadhi usanifu wa modeli na uzito uliofundishwa kwenye faili kwa matumizi ya baadaye:\n" + "Mara tu tunapomaliza kufundisha mfano, tunaweza kuhifadhi usanifu wa mfano na uzito uliopimwa kwenye faili kwa matumizi ya baadaye:\n" ] }, { @@ -852,7 +863,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Tunaweza kisha kupakia modeli kutoka kwenye faili wakati wowote. Unaweza kuona kuwa ni muhimu iwapo jaribio linalofuata litaharibu modeli - hutahitaji kuanza tena kutoka mwanzo.\n" + "Tunaweza kisha kupakia mfano kutoka kwa faili wakati wowote. Unaweza kuupata kuwa muhimu ikiwa jaribio lijalo litaangamiza mfano - hutakuwa na haja ya kuanza tena kabisa kutoka mwanzo.\n" ] }, { @@ -868,15 +879,15 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Kurekebisha Kujifunza kwa Uhamisho\n", + "## Kufinyaza upendeleo wa kujifunza kwa uhamisho\n", "\n", - "Katika sehemu iliyopita, tulifundisha safu ya mwisho ya uainishaji ili kuainisha picha katika seti yetu ya data. Hata hivyo, hatukufundisha tena kipengele cha uchimbaji, na modeli yetu ilitegemea vipengele ambavyo modeli ilijifunza kutoka kwa data ya ImageNet. Ikiwa vitu vyako vinaonekana tofauti na picha za kawaida za ImageNet, mchanganyiko huu wa vipengele huenda usifanye kazi vizuri. Kwa hivyo, inafaa kuanza kufundisha tabaka za convolutional pia.\n", + "Katika sehemu iliyopita, tumejifunza kifuniko cha mwisho cha mchujo wa picha katika seti yetu ya data. Hata hivyo, hatukuponda tena kichujio cha sifa, na mfano wetu ulitegemea sifa ambazo mfano umejifunza kutoka kwa data ya ImageNet. Ikiwa vitu vyako vinaonekana tofauti na picha za kawaida za ImageNet, mchanganyiko huu wa sifa unaweza usifanye kazi vizuri kabisa. Hivyo inafaika kuanza kufundisha tabaka za convolution pia.\n", "\n", - "Ili kufanya hivyo, tunaweza kufungua vigezo vya kichujio cha convolutional ambavyo tulivifungia awali.\n", + "Ili kufanya hivyo, tunaweza kufungua tena vigezo vya kichuja cha convolution ambavyo tulikuwa tumefunga awali.\n", "\n", - "> **Note:** Ni muhimu kufungia vigezo kwanza na kufanya mazoezi kwa mizunguko kadhaa ili kuimarisha uzito katika safu ya uainishaji. Ikiwa utaanza mara moja kufundisha mtandao wa mwisho hadi mwisho na vigezo vilivyofunguliwa, makosa makubwa yanaweza kuharibu uzito uliowekwa awali katika tabaka za convolutional.\n", + "> **Kumbuka:** Ni muhimu kwamba ufungie vigezo kwanza na ufanye mizunguko kadhaa ya mafunzo ili kuimarisha uzito katika tabaka la uainishaji. Ikiwa utaanza mara moja kufundisha mtandao mzima ukiwa na vigezo visivyofunguliwa, makosa makubwa yanaweza kuharibu uzito uliojifunzwa awali katika tabaka za convolution.\n", "\n", - "Modeli yetu ya convolutional VGG-16 iko ndani ya safu ya kwanza, na yenyewe ina tabaka nyingi. Tunaweza kuangalia muundo wake:\n" + "Mfano wetu wa convolutional VGG-16 uko ndani ya tabaka la kwanza, na una tabaka nyingi ndani yake. Tunaweza kuangalia muundo wake:\n" ] }, { @@ -944,7 +955,9 @@ { "cell_type": "markdown", "metadata": {}, - "source": [] + "source": [ + "Tunaweza kufungua vifuniko vyote vya msingi wa convolutional:\n" + ] }, { "cell_type": "code", @@ -959,7 +972,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Hata hivyo, kufungua zote kwa wakati mmoja si wazo bora. Tunaweza kwanza kufungua tabaka chache za mwisho za convolutions, kwa sababu zina mifumo ya juu inayohusiana na picha zetu. Kwa mfano, kuanza, tunaweza kufungia tabaka zote isipokuwa 4 za mwisho:\n" + "Hata hivyo, kuondoa kufungia zote kwa wakati mmoja si wazo bora. Tunaweza kwanza kuondoa kufungia tabaka za mwisho chache tu za convolutions, kwa sababu zinashikilia mifumo ya ngazi ya juu ambayo ni muhimu kwa picha zetu. Kwa mfano, kuanzia, tunaweza kufungia tabaka zote isipokuwa 4 za mwisho: \n" ] }, { @@ -998,11 +1011,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Angalia kwamba idadi ya vigezo vinavyoweza kufundishwa imeongezeka sana, lakini bado ni karibu 50% ya vigezo vyote.\n", + "Angalia kuwa idadi ya vigezo vinavyoweza kufunzwa imeongezeka kwa kiasi kikubwa, lakini bado ni karibu 50% ya vigezo vyote.\n", "\n", - "Baada ya kufungua tabaka zilizogandishwa, tunaweza kufanya mazoezi ya ziada kwa mizunguko michache zaidi (katika mfano wetu, tutafanya mzunguko mmoja tu). Unaweza pia kuchagua kiwango cha chini cha kujifunza, ili kupunguza athari kwa uzito uliokwisha funzwa awali. Hata hivyo, hata kwa kiwango cha chini cha kujifunza, unaweza kutarajia usahihi kushuka mwanzoni mwa mafunzo, hadi hatimaye kufikia kiwango kidogo cha juu kuliko katika hali ya uzito uliowekwa.\n", + "Baada ya kufungua kwa kuzuia, tunaweza kufanya mzunguko kadhaa zaidi wa mafunzo (katika mfano wetu, tutafanya mmoja tu). Pia unaweza kuchagua viwango vya ujifunzaji vya chini, ili kupunguza athari kwenye uzito uliopangwa awali. Hata hivyo, hata kwa kiwango cha ujifunzaji cha chini, unaweza kutarajia usahihi kupungua mwanzoni mwa mafunzo, hadi hatimaye kufikia kiwango kidogo cha juu kuliko katika kesi ya uzito wa kudumu.\n", "\n", - "> **Note:** Mafunzo haya huchukua muda mrefu zaidi, kwa sababu tunahitaji kueneza miteremko kurudi kupitia tabaka nyingi za mtandao!\n" + "> **Kumbuka:** Mafunzo haya hufanyika kwa taratibu zaidi, kwa sababu tunahitaji kusambaza gradi nyuma kupitia tabaka nyingi za mtandao!\n" ] }, { @@ -1026,18 +1039,18 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Tuna uwezekano mkubwa wa kufikia usahihi wa juu zaidi wa mafunzo, kwa sababu tunatumia mtandao wenye nguvu zaidi na vigezo vingi, lakini usahihi wa uthibitishaji hautaongezeka sana.\n", + "Tunaweza kufanikisha usahihi wa mafunzo zaidi, kwa sababu tunatumia mtandao wenye nguvu zaidi na vigezo vingi, lakini usahihi wa uhakiki hautoongezeka sana.\n", "\n", - "Usisite kufungua tabaka chache zaidi za mtandao na kuendelea kufundisha, ili kuona kama unaweza kufikia usahihi wa juu zaidi!\n" + "Huna haja ya hofu kufungua safu chache zaidi za mtandao na kufundisha zaidi, ili kuona kama unaweza kupata usahihi mkubwa zaidi!\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Miundo mingine ya maono ya kompyuta\n", + "## Mifano mingine ya kuona kwa kompyuta\n", "\n", - "VGG-16 ni mojawapo ya usanifu rahisi wa maono ya kompyuta. Keras inatoa mitandao mingine mingi iliyokwisha funzwa. Miongoni mwa mitandao inayotumika mara kwa mara ni usanifu wa **ResNet**, ulioendelezwa na Microsoft, na **Inception** kutoka Google. Kwa mfano, hebu tuchunguze usanifu wa modeli rahisi ya ResNet-50 (ResNet ni familia ya modeli zenye kina tofauti, unaweza kujaribu kufanya majaribio na ResNet-152 ikiwa unataka kuona jinsi modeli yenye kina kirefu inavyoonekana):\n" + "VGG-16 ni moja ya usanifu rahisi zaidi wa kuona kwa kompyuta. Keras inatoa mitandao mingi zaidi iliyofunzwa awali. Zinazotumika zaidi kati ya hizo ni usanifu wa **ResNet**, ulioandaliwa na Microsoft, na **Inception** na Google. Kwa mfano, hebu tuchunguze usanifu wa mfano rahisi wa ResNet-50 (ResNet ni familia ya mifano yenye kina tofauti, unaweza kujaribu kujaribu ResNet-152 ikiwa unataka kuona jinsi mfano wenye kina kina kweli unavyoonekana): \n" ] }, { @@ -1439,11 +1452,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Kama unavyoona, mfano huu una vipengele vile vile vya msingi: tabaka za convolutional, tabaka za pooling, na tabaka ya mwisho ya classifier yenye msongamano. Tunaweza kutumia mfano huu kwa njia ile ile tulivyokuwa tunatumia VGG-16 kwa kujifunza kwa uhamisho. Unaweza kujaribu kufanya majaribio na msimbo hapo juu, ukitumia mifano tofauti ya ResNet kama mfano wa msingi, na kuona jinsi usahihi unavyobadilika.\n", + "Kama unavyoona, modeli ina vifungo vya ujenzi vinavyofahamika sawa: safu za kuunganisha (convolutional layers), safu za kuchukua sampuli (pooling layers) na mchakato wa mwisho wa mshalishaji mnene (dense classifier). Tunaweza kutumia modeli hii kwa njia moja tu kama tulivyokuwa tunatumia VGG-16 kwa kujifunza kwa uhamishaji (transfer learning). Unaweza kujaribu kufanya majaribio na msimbo hapo juu, ukitumia mifano tofauti ya ResNet kama modeli msingi, na kuona jinsi usahihi unavyobadilika.\n", "\n", - "## Uwekaji Kawaida wa Kundi\n", + "## Urejeshaji wa Kiwango cha Kawaida (Batch Normalization)\n", "\n", - "Mtandao huu una aina nyingine ya tabaka: **Uwekaji Kawaida wa Kundi**. Wazo la uwekaji kawaida wa kundi ni kuleta thamani zinazopita kwenye mtandao wa neva katika kiwango sahihi. Kwa kawaida, mitandao ya neva hufanya kazi vizuri zaidi wakati thamani zote ziko katika kiwango cha [-1,1] au [0,1], na ndiyo sababu tunapima/kawaida data yetu ya ingizo ipasavyo. Hata hivyo, wakati wa mafunzo ya mtandao wa kina, inaweza kutokea kwamba thamani zinatoka nje ya kiwango hiki kwa kiasi kikubwa, jambo ambalo linafanya mafunzo kuwa na changamoto. Tabaka ya uwekaji kawaida wa kundi huhesabu wastani na upotofu wa kawaida kwa thamani zote za kundi la sasa, na kuzitumia kuweka kawaida ishara kabla ya kuipitisha kupitia tabaka ya mtandao wa neva. Hii inaboresha kwa kiasi kikubwa uthabiti wa mitandao ya kina.\n" + "Mtandao huu una aina nyingine ya safu: **Urejeshaji wa Kiwango cha Kawaida (Batch Normalization)**. Wazo la urejeshaji wa kiwango cha kawaida ni kuleta thamani zinazopita kwenye mtandao wa neva katika vipindi vinavyofaa. Kawaida mitandao ya neva hufanya kazi vyema wakati thamani zote ziko katika anuwai ya [-1,1] au [0,1], na hiyo ndiyo sababu tunapima/kurejesha data yetu ya ingizo ipasavyo. Hata hivyo, wakati wa mafunzo ya mtandao mzito, inaweza kutokea thamani zikashuka sana nje ya anuwai hii, jambo ambalo hufanya mafunzo kuwa magumu. Safu ya urejeshaji wa kiwango cha kawaida huhesabu wastani na kiwango cha kawaida kwa thamani zote za kundi dogo la sasa, na kuzitumia kurejesha ishara kabla ya kuipitisha kupitia safu ya mtandao wa neva. Hii huongeza sana utulivu wa mitandao mizito.\n" ] }, { @@ -1452,16 +1465,16 @@ "source": [ "## Muhimu\n", "\n", - "Kwa kutumia kujifunza kwa uhamisho, tuliweza kuunda haraka kiondoaji kwa kazi yetu ya kuainisha vitu maalum, na kufanikisha usahihi wa hali ya juu. Hata hivyo, mfano huu haukuwa wa haki kabisa, kwa sababu mtandao wa awali wa VGG-16 ulifundishwa kutambua paka na mbwa, na hivyo tulikuwa tunatumia tena mifumo mingi ambayo tayari ilikuwepo kwenye mtandao. Unaweza kutarajia usahihi wa chini zaidi kwa vitu vya kipekee vya kikoa maalum, kama maelezo ya mstari wa uzalishaji kwenye kiwanda, au majani tofauti ya miti.\n", + "Kutumia ujifunzaji wa kuhamisha, tuliweza haraka kuunda mchanganuzi wa aina kwa kazi yetu maalum ya upangaji wa vitu, na kupata usahihi wa juu. Hata hivyo, mfano huu haukuwa wa haki kabisa, kwa sababu mtandao wa asili wa VGG-16 ulikuwa umefundishwa awali kutambua paka na mbwa, na hivyo basi tulikuwa tunatumia tena mifumo mingi iliyokuwepo tayari kwenye mtandao. Unaweza kutarajia usahihi mdogo kwa vitu vya aina maalum zaidi, kama vile maelezo kwenye mstari wa uzalishaji katika kiwanda, au majani tofauti ya mti.\n", "\n", - "Unaweza kuona kwamba kazi ngumu zaidi tunazotatua sasa zinahitaji nguvu kubwa ya kompyuta, na haziwezi kutatuliwa kwa urahisi kwenye CPU. Katika sehemu inayofuata, tutajaribu kutumia utekelezaji mwepesi zaidi ili kufundisha modeli hiyo hiyo kwa kutumia rasilimali za kompyuta za chini, ambayo matokeo yake ni usahihi kidogo tu wa chini.\n" + "Unaweza kuona kwamba kazi ngumu zaidi tunazozitatua sasa zinahitaji nguvu zaidi za kompyuta, na haziwezi kutatuliwa kwa urahisi kwenye CPU. Katika sehemu inayofuata, tuta jaribu kutumia utekelezaji mwepesi zaidi kufundisha mfano uleule kwa kutumia rasilimali za chini za kompyuta, jambo ambalo hutoa usahihi kidogo tu wa chini. \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**Kanusho**: \nHati hii imetafsiriwa kwa kutumia huduma ya tafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kuhakikisha usahihi, tafsiri za kiotomatiki zinaweza kuwa na makosa au kutokuwa sahihi. Hati ya asili katika lugha yake ya awali inapaswa kuzingatiwa kama chanzo cha mamlaka. Kwa taarifa muhimu, tafsiri ya kitaalamu ya binadamu inapendekezwa. Hatutawajibika kwa kutokuelewana au tafsiri zisizo sahihi zinazotokana na matumizi ya tafsiri hii.\n" + "---\n\n\n**Kionyozo**:\nHati hii imetafsiriwa kwa kutumia huduma ya tafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kupata usahihi, tafadhali fahamu kwamba tafsiri za kiotomatiki zinaweza kuwa na makosa au upungufu wa usahihi. Hati ya asili katika lugha yake halisi inapaswa kuchukuliwa kama chanzo cha mamlaka. Kwa taarifa muhimu, tafsiri ya kitaalamu inayofanywa na binadamu inapendekezwa. Hatutojibu kwa kuelewa vibaya au tafsiri potofu zinazotokea kutokana na matumizi ya tafsiri hii.\n\n" ] } ], @@ -1482,12 +1495,6 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" - }, - "coopTranslator": { - "original_hash": "c189abc107848f96051085cc30945129", - "translation_date": "2025-08-29T13:39:14+00:00", - "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", - "language_code": "sw" } }, "nbformat": 4, diff --git a/translations/sw/lessons/5-NLP/README.md b/translations/sw/lessons/5-NLP/README.md index a2e828da18..0594327f83 100644 --- a/translations/sw/lessons/5-NLP/README.md +++ b/translations/sw/lessons/5-NLP/README.md @@ -1,77 +1,73 @@ -# Usindikaji wa Lugha Asilia +# Uchanganuzi wa Lugha Asilia ![Muhtasari wa kazi za NLP katika mchoro](../../../../translated_images/sw/ai-nlp.b22dcb8ca4707cea.webp) -Katika sehemu hii, tutazingatia kutumia Mitandao ya Neural kushughulikia kazi zinazohusiana na **Usindikaji wa Lugha Asilia (NLP)**. Kuna matatizo mengi ya NLP ambayo tunataka kompyuta iweze kuyatatua: +Katika sehemu hii, tutazingatia kutumia Mitandao ya Neva kushughulikia kazi zinazohusiana na **Uchambuzi wa Lugha Asilia (NLP)**. Kuna matatizo mengi ya NLP tunayopenda kompyuta ziweze kuyatatua: -* **Uainishaji wa maandishi** ni tatizo la kawaida la uainishaji linalohusiana na mfuatano wa maandishi. Mifano ni pamoja na kuainisha barua pepe kama spam au si-spam, au kuainisha makala kama michezo, biashara, siasa, n.k. Pia, tunapounda roboti za mazungumzo, mara nyingi tunahitaji kuelewa kile mtumiaji alitaka kusema -- katika kesi hii tunashughulika na **uainishaji wa nia**. Mara nyingi, katika uainishaji wa nia tunahitaji kushughulikia kategoria nyingi. +* **Uainishaji wa maandishi** ni tatizo la kawaida la uainishaji linalohusiana na mfululizo wa maandishi. Mifano ni pamoja na kuainisha barua pepe kama taka au si taka, au kupangilia makala kama michezo, biashara, siasa, n.k. Pia, wakati wa kuendeleza roboti za mazungumzo, mara nyingi tunahitaji kuelewa kile mtumiaji alitaka kusema -- katika kesi hii tunashughulika na **uainishaji wa nia**. Mara nyingi, katika uainishaji wa nia tunahitaji kushughulikia makundi mengi. +* **Tathmini ya hisia** ni tatizo la kawaida la murejesho, ambapo tunahitaji kutoa nambari (hisia) inayolingana na jinsi maana ya sentensi ni chanya/negativi. Toleo la hali ya juu la tathmini ya hisia ni **tathmini ya hisia kwa misingi ya vipengele** (ABSA), ambapo tunahusisha hisia si kwa sentensi nzima, bali kwa sehemu tofauti za sentensi (vipengele), kwa mfano, *Katika mgahawa huu, nilipenda chakula, lakini mazingira yalikuwa mabaya*. +* **Utambuzi wa Vitu Vilivyopewa Majina** (NER) unahusu tatizo la kutoa vitu fulani kutoka kwa maandishi. Kwa mfano, tunaweza kuhitaji kuelewa kwamba katika kifungu *Nahitaji kuruka kwenda Paris kesho* neno *kesho* linahusu TAREHE, na *Paris* ni MAHALI. +* **Utoaji wa maneno muhimu** ni sawa na NER, lakini tunahitaji kutoa maneno muhimu kwa maana ya sentensi kwa njia ya moja kwa moja, bila mafunzo ya awali kwa aina maalum za vitu. +* **Kukusanya maandishi** kunaweza kuwa muhimu tunapotaka kuunganisha sentensi zinazofanana pamoja, kwa mfano, maombi yanayofanana katika mazungumzo ya msaada wa kiufundi. +* **Kujibu maswali** kunahusu uwezo wa mfano kujibu swali maalum. Mfano hupokea kipande cha maandishi na swali kama ingizo, na unahitaji kutoa sehemu katika maandishi ambapo jibu la swali linapatikana (au, wakati mwingine, kuzalisha maandishi ya jibu). +* **Uundaji wa maandishi** ni uwezo wa mfano kuzalisha maandishi mapya. Inaweza kuzingatiwa kama kazi ya uainishaji inayotabiri herufi/neno lijalo kulingana na *mwanzo wa maandishi*. Mifano ya hali ya juu ya uzalishaji wa maandishi, kama GPT-3, inaweza kutatua kazi nyingine za NLP kama uainishaji kwa kutumia mbinu inayoitwa [programu ya kuwezesha](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) au [ubunifu wa kuwezesha](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29) +* **Kufupisha maandishi** ni mbinu tunapotaka kompyuta "ikusome" maandishi marefu na kuyafupisha kwa sentensi chache. +* **Tafsiri ya mashine** inaweza kuzingatiwa kama muunganiko wa kuelewa maandishi katika lugha moja, na kuzalisha maandishi katika nyingine. -* **Uchambuzi wa hisia** ni tatizo la kawaida la regression, ambapo tunahitaji kuhusisha namba (hisia) inayolingana na jinsi maana ya sentensi ilivyo chanya/mbaya. Toleo la juu zaidi la uchambuzi wa hisia ni **uchambuzi wa hisia kulingana na vipengele** (ABSA), ambapo tunahusisha hisia si kwa sentensi nzima, bali kwa sehemu zake tofauti (vipengele), mfano: *Katika mgahawa huu, nilipenda chakula, lakini mazingira yalikuwa mabaya*. +Hapo awali, kazi nyingi za NLP zilitatuliwa kwa kutumia mbinu za jadi kama sarufi. Kwa mfano, katika tafsiri ya mashine, wachambuzi walitumiwa kubadilisha sentensi ya awali kuwa mti wa sarufi, kisha miundo ya hali ya juu ya semantiki ilitolewa kuonyesha maana ya sentensi, na kutegemea maana hii na sarufi ya lugha lengwa matokeo yalizalishwa. Siku hizi, kazi nyingi za NLP hutatuliwa kwa ufanisi zaidi kwa kutumia mitandao ya neva. -* **Utambuzi wa Viumbe Vilivyotajwa** (NER) inahusu tatizo la kutoa viumbe fulani kutoka kwa maandishi. Kwa mfano, tunaweza kuhitaji kuelewa kwamba katika kifungu *Nahitaji kuruka kwenda Paris kesho* neno *kesho* linahusu TAREHE, na *Paris* ni MAHALI. +> Mbinu nyingi za jadi za NLP zimetekelezwa katika maktaba ya Python iitwayo [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org). Kuna [Kitabu cha NLTK](https://www.nltk.org/book/) kizuri kinachopatikana mtandaoni kinachoelezea jinsi kazi tofauti za NLP zinavyoweza kutatuliwa kwa kutumia NLTK. -* **Uchimbaji wa maneno muhimu** ni sawa na NER, lakini tunahitaji kutoa maneno muhimu kwa maana ya sentensi moja kwa moja, bila mafunzo ya awali kwa aina maalum za viumbe. +Katika kozi yetu, tutazingatia zaidi matumizi ya Mitandao ya Neva kwa NLP, na tutatumia NLTK pale itakapohitajika. -* **Kugawanya maandishi katika makundi** kunaweza kuwa muhimu tunapotaka kuunganisha sentensi zinazofanana, kwa mfano, maombi yanayofanana katika mazungumzo ya msaada wa kiufundi. - -* **Kujibu maswali** inahusu uwezo wa mfano kujibu swali maalum. Mfano hupokea kifungu cha maandishi na swali kama pembejeo, na inahitaji kutoa sehemu ya maandishi ambapo jibu la swali linapatikana (au, wakati mwingine, kutengeneza maandishi ya jibu). - -* **Uzalishaji wa maandishi** ni uwezo wa mfano kutengeneza maandishi mapya. Inaweza kuchukuliwa kama kazi ya uainishaji inayotabiri herufi/maneno yanayofuata kulingana na *msukumo wa maandishi*. Mifano ya juu ya uzalishaji wa maandishi, kama vile GPT-3, inaweza kutatua kazi nyingine za NLP kama uainishaji kwa kutumia mbinu inayoitwa [programu ya msukumo](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) au [uhandisi wa msukumo](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29). - -* **Muhtasari wa maandishi** ni mbinu tunapotaka kompyuta "kusoma" maandishi marefu na kuyafupisha kwa sentensi chache. - -* **Tafsiri ya mashine** inaweza kuonekana kama mchanganyiko wa kuelewa maandishi kwa lugha moja, na uzalishaji wa maandishi kwa lugha nyingine. - -Hapo awali, kazi nyingi za NLP zilitatuliwa kwa kutumia mbinu za jadi kama sarufi. Kwa mfano, katika tafsiri ya mashine, vichanganuzi vilitumika kubadilisha sentensi ya awali kuwa mti wa sintaksia, kisha miundo ya juu ya kisemantiki ilitolewa ili kuwakilisha maana ya sentensi, na kulingana na maana hii na sarufi ya lugha lengwa, matokeo yalitengenezwa. Siku hizi, kazi nyingi za NLP zinatatuliwa kwa ufanisi zaidi kwa kutumia mitandao ya neural. - -> Mbinu nyingi za jadi za NLP zinatekelezwa katika maktaba ya Python inayoitwa [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org). Kuna [Kitabu cha NLTK](https://www.nltk.org/book/) kinachopatikana mtandaoni ambacho kinaelezea jinsi kazi tofauti za NLP zinaweza kutatuliwa kwa kutumia NLTK. - -Katika kozi yetu, tutazingatia zaidi kutumia Mitandao ya Neural kwa NLP, na tutatumia NLTK pale inapohitajika. - -Tayari tumejifunza kuhusu kutumia mitandao ya neural kushughulikia data ya jedwali na picha. Tofauti kuu kati ya aina hizo za data na maandishi ni kwamba maandishi ni mfuatano wa urefu unaobadilika, wakati saizi ya pembejeo katika picha inajulikana mapema. Wakati mitandao ya convolutional inaweza kutoa mifumo kutoka kwa data ya pembejeo, mifumo katika maandishi ni changamano zaidi. Kwa mfano, tunaweza kuwa na kukanusha kunakotenganishwa na somo kwa maneno mengi (mfano: *Sipendi machungwa*, dhidi ya *Sipendi yale machungwa makubwa yenye rangi nzuri na ladha*), na hiyo bado inapaswa kufasiriwa kama muundo mmoja. Kwa hivyo, ili kushughulikia lugha tunahitaji kuanzisha aina mpya za mitandao ya neural, kama vile *mitandao ya kurudiarudia* na *transformers*. +Tayari tumekuwa tukijifunza kuhusu matumizi ya mitandao ya neva kushughulikia data za jedwali na picha. Tofauti kuu kati ya aina hizi za data na maandishi ni kwamba maandishi ni mfuatano wa urefu unaobadilika, wakati ukubwa wa ingizo katika picha unajulikana mapema. Wakati mitandao ya convolutional inaweza kutoa mifumo kutoka kwa data ya ingizo, mifumo katika maandishi ni ngumu zaidi. Kwa mfano, tunaweza kuwa na kinyume kilichotengwa na somo kwa maneno mengi (mfano *Sipendi machungwa*, dhidi ya *Sipendi machungwa makubwa yenye rangi tofauti na ladha*), na hiyo bado inapaswa kufasiriwa kama mfumo mmoja. Hivyo, kushughulikia lugha tunahitaji kuanzisha aina mpya za mitandao ya neva, kama *mitandao inayorudia* na *transformers*. ## Sakinisha Maktaba -Ikiwa unatumia usakinishaji wa Python wa ndani kuendesha kozi hii, unaweza kuhitaji kusakinisha maktaba zote zinazohitajika kwa NLP kwa kutumia amri zifuatazo: +Ikiwa unatumia usakinishaji wa Python wa eneo lako kukamilisha kozi hii, unaweza kuhitaji kusakinisha maktaba zote zinazohitajika kwa NLP kwa kutumia amri zifuatazo: -**Kwa PyTorch** +**Kwa PyTorch** ```bash -pip install -r requirements-torch.txt -``` -**Kwa TensorFlow** +pip install -r requirements-pytorch.txt +``` +**Kwa TensorFlow** ```bash pip install -r requirements-tf.txt -``` +``` -> Unaweza kujaribu NLP na TensorFlow kwenye [Microsoft Learn](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste) +> Unaweza kujaribu NLP kwa TensorFlow kwenye [Microsoft Learn](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste) -## Onyo Kuhusu GPU +## Onyo la GPU -Katika sehemu hii, katika baadhi ya mifano tutakuwa tukifundisha mifano mikubwa. -* **Tumia Kompyuta Yenye GPU**: Inashauriwa kuendesha daftari zako kwenye kompyuta yenye GPU ili kupunguza muda wa kusubiri wakati wa kufanya kazi na mifano mikubwa. -* **Vikwazo vya Kumbukumbu ya GPU**: Kuendesha kwenye GPU kunaweza kusababisha hali ambapo kumbukumbu ya GPU inajaa, hasa wakati wa kufundisha mifano mikubwa. -* **Matumizi ya Kumbukumbu ya GPU**: Kiasi cha kumbukumbu ya GPU kinachotumika wakati wa mafunzo kinategemea mambo mbalimbali, ikiwa ni pamoja na ukubwa wa minibatch. -* **Punguza Ukubwa wa Minibatch**: Ikiwa unakutana na matatizo ya kumbukumbu ya GPU, fikiria kupunguza ukubwa wa minibatch katika msimbo wako kama suluhisho linalowezekana. -* **Utoaji wa Kumbukumbu ya GPU kwa TensorFlow**: Matoleo ya zamani ya TensorFlow yanaweza yasitoe kumbukumbu ya GPU ipasavyo wakati wa kufundisha mifano mingi ndani ya kernel moja ya Python. Ili kudhibiti matumizi ya kumbukumbu ya GPU kwa ufanisi, unaweza kusanidi TensorFlow kugawa kumbukumbu ya GPU tu inapohitajika. -* **Ujumuishaji wa Msimbo**: Ili kuweka TensorFlow kugawa kumbukumbu ya GPU tu inapohitajika, jumuisha msimbo ufuatao katika daftari zako: +Katika sehemu hii, katika baadhi ya mifano tutakuwa tukifundisha mifano mikubwa. +* **Tumia Kompyuta Yenye GPU**: Inashauriwa kuendesha daftari zako za kumbukumbu kwenye kompyuta yenye GPU ili kupunguza muda wa kusubiri wakati wa kufanya kazi na mifano mikubwa. +* **Mikwamo ya Kumbukumbu ya GPU**: Kuendesha kwenye GPU kunaweza kusababisha hali ambapo kumbukumbu ya GPU inakamilika, hasa wakati wa mafunzo ya mifano mikubwa. +* **Matumizi ya Kumbukumbu ya GPU**: Kiasi cha kumbukumbu ya GPU kinachotumiwa wakati wa mafunzo kinategemea mambo mbalimbali, ikiwa ni pamoja na ukubwa wa minibatch. +* **Punguza Ukubwa wa Minibatch**: Ikiwa unakutana na matatizo ya kumbukumbu ya GPU, fikiria kupunguza ukubwa wa minibatch katika msimbo wako kama suluhisho linalowezekana. +* **Uachishaji wa Kumbukumbu ya GPU kwa TensorFlow**: Matoleo ya zamani ya TensorFlow huenda yasitoe kumbukumbu ya GPU ipasavyo wakati wa kufundisha mifano mingi ndani ya kiini kimoja cha Python. Ili kudhibiti matumizi ya kumbukumbu ya GPU kwa ufanisi, unaweza kusanidi TensorFlow ili itenge kumbukumbu ya GPU tu inapohitajika. +* **Ujumuishaji wa Msimbo**: Ili kuweka TensorFlow iyatengenie kumbukumbu ya GPU polepole tu inapohitajika, jumuisha msimbo ifuatayo katika daftari zako za kumbukumbu: ```python physical_devices = tf.config.list_physical_devices('GPU') if len(physical_devices)>0: tf.config.experimental.set_memory_growth(physical_devices[0], True) -``` +``` -Ikiwa una nia ya kujifunza kuhusu NLP kutoka mtazamo wa ML wa jadi, tembelea [hii seti ya masomo](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP) +Ikiwa unavutiwa na kujifunza kuhusu NLP kutoka kwa mtazamo wa ML wa jadi, tembelea [mfululizo huu wa masomo](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP) -## Katika Sehemu Hii +## Katika Sehemu Hii Katika sehemu hii tutajifunza kuhusu: -* [Kuwakilisha maandishi kama tensors](13-TextRep/README.md) -* [Uwakilishi wa Maneno](14-Emdeddings/README.md) -* [Uundaji wa Lugha](15-LanguageModeling/README.md) -* [Mitandao ya Neural ya Kurudiarudia](16-RNN/README.md) -* [Mitandao ya Kizazi](17-GenerativeNetworks/README.md) -* [Transformers](18-Transformers/README.md) +* [Kuonyesha maandishi kama tensors](13-TextRep/README.md) +* [Uingiliano wa Maneno](14-Emdeddings/README.md) +* [Mifano ya Lugha](15-LanguageModeling/README.md) +* [Mitandao ya Neva Inayorudia](16-RNN/README.md) +* [Mitandao Inazozalisha](17-GenerativeNetworks/README.md) +* [Transformers](18-Transformers/README.md) + +--- -**Kanusho**: -Hati hii imetafsiriwa kwa kutumia huduma ya kutafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kuhakikisha usahihi, tafadhali fahamu kuwa tafsiri za kiotomatiki zinaweza kuwa na makosa au kutokuwa sahihi. Hati ya asili katika lugha yake ya awali inapaswa kuzingatiwa kama chanzo cha mamlaka. Kwa taarifa muhimu, tafsiri ya kitaalamu ya binadamu inapendekezwa. Hatutawajibika kwa kutoelewana au tafsiri zisizo sahihi zinazotokana na matumizi ya tafsiri hii. \ No newline at end of file + +**Kionyozo**: +Hati hii imetafsiriwa kwa kutumia huduma ya tafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kupata usahihi, tafadhali fahamu kwamba tafsiri za kiotomatiki zinaweza kuwa na makosa au upungufu wa usahihi. Hati ya asili katika lugha yake halisi inapaswa kuchukuliwa kama chanzo cha mamlaka. Kwa taarifa muhimu, tafsiri ya kitaalamu inayofanywa na binadamu inapendekezwa. Hatutojibu kwa kuelewa vibaya au tafsiri potofu zinazotokea kutokana na matumizi ya tafsiri hii. + \ No newline at end of file diff --git a/translations/ta/.co-op-translator.json b/translations/ta/.co-op-translator.json index f787fe5f13..3899d59d4f 100644 --- a/translations/ta/.co-op-translator.json +++ b/translations/ta/.co-op-translator.json @@ -5,6 +5,12 @@ "source_file": "AGENTS.md", "language_code": "ta" }, + "CONTRIBUTING.md": { + "original_hash": "c6fd7e781b67111a90abd166d0ce4aa0", + "translation_date": "2026-07-08T15:01:14+00:00", + "source_file": "CONTRIBUTING.md", + "language_code": "ta" + }, "README.md": { "original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b", "translation_date": "2026-04-06T20:36:19+00:00", @@ -17,6 +23,19 @@ "source_file": "SECURITY.md", "language_code": "ta" }, + "__translation_failures__": { + "lessons/sketchnotes/LICENSE.md": { + "original_hash": "45ab63a2cd8f5faef6c9b150618837a4", + "source_file": "lessons/sketchnotes/LICENSE.md", + "language_code": "ta", + "failure_date": "2026-07-08T15:00:39+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:00+00:00", @@ -54,8 +73,8 @@ "language_code": "ta" }, "examples/README.md": { - "original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7", - "translation_date": "2025-10-11T11:16:53+00:00", + "original_hash": "7883d52c2e2a221e0b07a7b112a149b9", + "translation_date": "2026-07-08T14:52:57+00:00", "source_file": "examples/README.md", "language_code": "ta" }, @@ -66,8 +85,8 @@ "language_code": "ta" }, "lessons/0-course-setup/how-to-run.md": { - "original_hash": "a4717bd9103b9f6cd84d534b83534689", - "translation_date": "2026-01-16T06:55:50+00:00", + "original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1", + "translation_date": "2026-07-08T14:54:21+00:00", "source_file": "lessons/0-course-setup/how-to-run.md", "language_code": "ta" }, @@ -191,6 +210,12 @@ "source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md", "language_code": "ta" }, + "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": { + "original_hash": "99b816b6a4957ef4100cee4c4221dff9", + "translation_date": "2026-07-08T14:41:57+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", + "language_code": "ta" + }, "lessons/4-ComputerVision/08-TransferLearning/lab/README.md": { "original_hash": "7765935c35fcee69b9fe2d0cfd6963e2", "translation_date": "2025-10-11T11:21:48+00:00", @@ -330,8 +355,8 @@ "language_code": "ta" }, "lessons/5-NLP/README.md": { - "original_hash": "8ef02a9318257ea140ed3ed74442096d", - "translation_date": "2025-10-11T11:38:10+00:00", + "original_hash": "038df6f1a73e49f6430740da083bfd6d", + "translation_date": "2026-07-08T14:55:04+00:00", "source_file": "lessons/5-NLP/README.md", "language_code": "ta" }, diff --git a/translations/ta/CONTRIBUTING.md b/translations/ta/CONTRIBUTING.md new file mode 100644 index 0000000000..e3a326f137 --- /dev/null +++ b/translations/ta/CONTRIBUTING.md @@ -0,0 +1,29 @@ +# AI-For-Beginners இல் பங்களித்தல் + +AI-For-Beginners இல் பங்களிக்க உங்கள் ஆர்வத்திற்கு நன்றி! நாங்கள் மொழிபெயர்ப்புகள், பாட மேம்பாடுகள் மற்றும் வடிவமைப்பு திருத்தங்களை வரவேற்கின்றோம். + +## Microsoft பங்களிப்பாளரின் உரிம ஒப்பந்தம் (CLA) + +இந்த திட்டம் பங்களிப்புகள் மற்றும் பரிந்துரைகளை வரவேற்கிறது. பெரும்பாலான பங்களிப்புகள் நீங்கள் உரிமம் பெற்றுள்ளதாகவும் உங்கள் பங்களிப்பை பயன்படுத்த உரிமம் வழங்குகிறீர்கள் என்றும் அறிவிக்கும் பங்களிப்பாளர் உரிம ஒப்பந்தம் (CLA) ஒன்றை ஏற்க தேவையுண்டு. விரிவுகளுக்கு [https://cla.microsoft.com](https://cla.microsoft.com) ஐப் பார்வையிடவும். + +நீங்கள் ஒரு புல் கோரிக்கையை சமர்ப்பிக்கும் போது, CLA-பாட் தானாகவே நீங்கள் CLA வழங்க வேண்டும் என்பதை தீர்மானித்து PR-ஐ உரிய முறையில் குறி-நூற்படுத்தும் (எ.கா., லேபிள், கருத்து). பாட்டின் வழங்கும் வழிமுறைகளை பின்பற்றவும். எங்கள் CLA பயன்படும் அனைத்து ரெப்போசிடரிகளிலும் இதை ஒருமுறை மட்டுமே செய்வது போதும். + +## எப்படி பங்களிப்பது + +### 1. குறைபாடுகள் / கோடு பிழைகளை சீர்செய்தல் +எந்த Jupyter நோட்புக் அல்லது பாடம் மார்க்டவுன் கோப்பிலும் பிழை அல்லது தவறு கண்டுபிடித்தால்: +1. ரெப்போசிடரியை பிளவு செய்யவும். +2. பிழை அல்லது உடைந்த இணைப்பை சரி செய்யவும். +3. திருத்தம் பற்றிய தெளிவான விளக்கத்துடன் ஒரு புல் கோரிக்கை சமர்ப்பிக்கவும். + +### 2. மொழிபெயர்ப்புகளை சமர்ப்பித்தல் +பாடங்களை மற்ற மொழிகளில் மொழிபெயர்ப்பதற்கு நாங்கள் அன்புடன் வரவேற்கின்றோம்! `translations/` அடைவுக்குள் உள்ள ஏற்கனவே உள்ள ஃபோல்டர் பெயர்களைப் பயன்படுத்தி மொழிபெயர்ப்புகளை வைக்கவும் (எ.கா., `translations/es/`, `translations/pt-BR/`, `translations/zh-CN/`). + +மேலதிக விபரங்களுக்கு, [etc/CONTRIBUTING.md](etc/CONTRIBUTING.md) ஐ பார்க்கவும். + +--- + + +**மறுப்பு**: +இந்த ஆவணம் AI மொழிபெயர்ப்பு சேவை [Co-op Translator](https://github.com/Azure/co-op-translator) பயன்படுத்தி மொழிபெயர்க்கப்பட்டுள்ளது. நாங்கள் துல்லியத்திற்காக முயற்சி செய்துள்ளோம், ஆனால் தானாக செய்யப்படும் மொழிபெயர்ப்புகளில் பிழைகள் அல்லது தவறுகள் இருக்கலாம் என்பதை கவனத்தில் கொள்ளவும். அசல் ஆவணம் அதன் தாய்மொழியில் அதிகாரப்பூர்வ ஆதாரமாக கருதப்பட வேண்டும். முக்கியமான தகவல்களுக்கு, தொழில்நுட்பமான மனித மொழிபெயர்ப்பு பரிந்துரைக்கப்படுகிறது. இந்த மொழிபெயர்ப்பைப் பயன்படுத்துவதால் ஏற்படும் எந்த தவறான புரிதல்கள் அல்லது தவறான விளக்கத்திற்கும் நாங்கள் பொறுப்பில்வில்லை. + \ No newline at end of file diff --git a/translations/ta/examples/README.md b/translations/ta/examples/README.md index 1071b5d0aa..9412855b70 100644 --- a/translations/ta/examples/README.md +++ b/translations/ta/examples/README.md @@ -1,85 +1,87 @@ -# தொடக்கநிலை 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 +# 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 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 board](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) -- [இயற்கை மொழி செயலாக்கம்](../lessons/5-NLP/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) ## 🤝 பங்களிப்பு -இந்த உதாரணங்கள் பயனுள்ளதாக இருந்ததா? அவற்றை மேம்படுத்த உதவுங்கள்: -- பிரச்சினைகளை அறிவிக்கவும் அல்லது மேம்பாடுகளை பரிந்துரைக்கவும் -- தொடக்கநிலை மாணவர்களுக்கான மேலும் உதாரணங்களைச் சேர்க்கவும் -- ஆவணங்கள் மற்றும் கருத்துரைகளை மேம்படுத்தவும் +இந்த எடுத்துக்காட்டுகள் உதவியாக இருந்ததா? அவற்றை மேம்படுத்த உதவுங்கள்: +- பிரச்சனைகளை அறிக்கை செய்யவும் அல்லது மேம்பாடுகள் பரிந்துரைக்கவும் +- துவக்க நிலை பயனர்களுக்கான மேலும் எடுத்துக்காட்டுகளை சேர்த்தல் +- ஆவணங்கள் மற்றும் கருத்துக்களை மேம்படுத்தல் --- -*நினைவில் கொள்ளுங்கள்: ஒவ்வொரு நிபுணரும் ஒருமுறை தொடக்கநிலையிலிருந்தவரே. மகிழ்ச்சியான கற்றல்! 🎓* +*நினைவில் வையுங்கள்: ஒவ்வொரு நிபுணரும் ஒருகாலத்தில் துவக்க நிலை பயனராக இருந்தார்கள். சந்தோஷமாக கற்றுக்கொள்ளுங்கள்! 🎓* --- -**குறிப்பு**: -இந்த ஆவணம் [Co-op Translator](https://github.com/Azure/co-op-translator) என்ற AI மொழிபெயர்ப்பு சேவையை பயன்படுத்தி மொழிபெயர்க்கப்பட்டுள்ளது. எங்கள் தரச்சிறப்பிற்காக முயற்சி செய்தாலும், தானியங்கி மொழிபெயர்ப்புகளில் பிழைகள் அல்லது தவறுகள் இருக்கக்கூடும் என்பதை கவனத்தில் கொள்ளவும். அதன் தாய்மொழியில் உள்ள மூல ஆவணம் அதிகாரப்பூர்வ ஆதாரமாக கருதப்பட வேண்டும். முக்கியமான தகவல்களுக்கு, தொழில்முறை மனித மொழிபெயர்ப்பு பரிந்துரைக்கப்படுகிறது. இந்த மொழிபெயர்ப்பைப் பயன்படுத்துவதால் ஏற்படும் எந்த தவறான புரிதல்கள் அல்லது தவறான விளக்கங்களுக்கு நாங்கள் பொறுப்பல்ல. \ No newline at end of file + +**மறுப்பு**: +இந்த ஆவணம் AI மொழிபெயர்ப்பு சேவை [Co-op Translator](https://github.com/Azure/co-op-translator) பயன்படுத்தி மொழிபெயர்க்கப்பட்டுள்ளது. நாங்கள் துல்லியத்திற்காக முயற்சி செய்துள்ளோம், ஆனால் தானாக செய்யப்படும் மொழிபெயர்ப்புகளில் பிழைகள் அல்லது தவறுகள் இருக்கலாம் என்பதை கவனத்தில் கொள்ளவும். அசல் ஆவணம் அதன் தாய்மொழியில் அதிகாரப்பூர்வ ஆதாரமாக கருதப்பட வேண்டும். முக்கியமான தகவல்களுக்கு, தொழில்நுட்பமான மனித மொழிபெயர்ப்பு பரிந்துரைக்கப்படுகிறது. இந்த மொழிபெயர்ப்பைப் பயன்படுத்துவதால் ஏற்படும் எந்த தவறான புரிதல்கள் அல்லது தவறான விளக்கத்திற்கும் நாங்கள் பொறுப்பில்வில்லை. + \ No newline at end of file diff --git a/translations/ta/lessons/0-course-setup/how-to-run.md b/translations/ta/lessons/0-course-setup/how-to-run.md index 504a8c9dbc..34ea417fc8 100644 --- a/translations/ta/lessons/0-course-setup/how-to-run.md +++ b/translations/ta/lessons/0-course-setup/how-to-run.md @@ -1,12 +1,12 @@ -# குறியீட்டை எப்படி இயக்குவது +# குறியீட்டைப் இயக்குவது எப்படி -இந்த பாடத்திட்டத்தில் நீங்கள் இயக்க விரும்பும் நிறைய செயலாக்கக் கூடிய உதாரணங்கள் மற்றும் 실습களைக் கொண்டுள்ளது. இதைச் செய்ய, நீங்கள் இந்த பாடத்திட்டத்தின் ஒரு பகுதியான Jupyter Notebooks இல் Python குறியீட்டை இயக்கும் திறனுடன் இருக்க வேண்டும். குறியீட்டை இயக்குவதற்கு உங்களுக்கு பலவிதமான விருப்பங்கள் உள்ளன: +இந்த பாடத்திட்டத்தில் நீங்கள் இயக்க விரும்பக்கூடிய நிறைய செயல்படுத்தக்கூடிய உதாரணங்களும் பேராசைகளும் உள்ளன. இதை செய்யப்பதற்கு, இந்த பாடத்திட்டத்தின் ஒரு பகுதியான Jupyter நோட்ட்புக்களில் Python குறியீட்டை இயக்கும் திறன் வேண்டும். குறியீட்டை இயக்க பல வழிகளும் உண்டு: -## உங்கள் கணினியில் உள்ளூர் முறையில் இயக்குதல் +## உங்கள் கணினியில் உள்ளார்மாக இயக்கவும் -உங்கள் கணினியில் உள்ளூர் முறையில் குறியீட்டை இயக்க Python நிறுவல் தேவைப்படும். ஒரு பரிந்துரையாக **[miniconda](https://conda.io/en/latest/miniconda.html)** ஐ நிறுவ பரிந்துரைக்கப்படுகின்றது - இது மிகவும் எளிமையான நிறுவல் ஆகும் மற்றும் Python இன் வேறு வேறு **உண்மை சூழல்கள் (virtual environments)** க்கான `conda` பாகேஜ் மேலாளரை ஆதரிக்கிறது. +உங்கள் கணினியில் குறியீட்டை இயக்க Python நிறுவல் அவசியம். ஒருமுறை பரிந்துரை **[miniconda](https://conda.io/en/latest/miniconda.html)** - இது विभिन्न Python **மெய்நிகர் சுற்றுச்சூழல்**களுக்கான `conda` தொகுப்பு மேலாளரை ஆதரிக்கும் ஒரு எளிமையான நிறுவல். -miniconda ஐ நிறுவிய பிறகு, ரெப்போஸிட்டரியை கிளோன் செய்து இந்த பாடத்திட்டத்திற்கான ஒரு உண்மை சூழலை உருவாக்கவும்: +miniconda நிறுவிய பிறகு, திரட்டகத்தில் (repository) கிளோன் செய்து, இந்த பாடத்திட்டத்திற்கு பயன்படும் மெய்நிகர் சூழலை உருவாக்கவும்: ```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 ``` -### Python விரிவாக்கத்துடன் Visual Studio Code பயன்படுத்துதல் +### Python நீட்சியுடன் 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) மற்றும் [Python Extension](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste) சிறந்தது. -> **குறிப்பு**: நீங்கள் ரெப்போஸிட்டரியை கிளோன் செய்து VS Code இல் கோப்புறையை திறக்கும் போது, அது தானாக Python விரிவாக்கங்களை நிறுவ பரிந்துரைக்கும். மேலும், மேலே விளக்கப்பட்டபடி miniconda ஐ நிறுவ வேண்டியும் இருக்கும். +> **குறிப்பு**: ஒரு முறையாக நீங்கள் கிளோன் செய்து VS Code இல் கோப்புறை திறந்துவிட்டால், Python விரிவுருக்களை நிறுவ பரிந்துரைக்கப்படும்.மேலும் மேலே விளக்கப்பட்டபடி miniconda ஐ நிறுவவும் அவசியம். -> **குறிப்பு**: VS Code உங்களுக்கு ரெப்போஸிட்டரியை ஒரு கன்டைனரில் மீண்டும் திறக்க பரிந்துரைத்தால், உள்ளூர் Python நிறுவலைப் பயன்படுத்த இதை மறுத்தல் வேண்டும். +> **குறிப்பு**: VS Code உங்களிடம் கோப்புறையை ஒரு கொண்டெய்னரில் மீண்டும் திறக்கச் சொல்லின், நீங்கள் அதை நிராகரித்து உள்ளார்மாக Python நிறுவலை பயன்படுத்த வேண்டும். ### உலாவியில் Jupyter பயன்படுத்துதல் -உங்கள் கணினியில் உலாவி மூலம் ஒரு Jupyter சூழலை நீங்கள் பயன்படுத்தலாம். பாரம்பரிய Jupyter மற்றும் JupyterHub இரண்டும் தானாக பூட்டப்படுதல், குறியீட்டு ஒளிர்வு போன்ற வசதிகளுடன் ஒரு சிறந்த அபிவிருத்தி சூழலை வழங்குகின்றன. +உங்களது கணினியில் உலாவியில் இருந்து Jupyter சூழலைப் பயன்படுத்தலாம். பாரம்பரிய Jupyter மற்றும் JupyterHub கள் ஆட்டோ-கூட்டல், குறியீட்டு ஒளிர்வு போன்ற நன்மைகள் கொண்ட வசதிகரமான உருவாக்க சூழலை வழங்குகின்றன. -Jupyter ஐ உள்ளூர் இயக்க, பாடத்திட்டத்தின் கோப்புறைக்குச் சென்று கீழ்காணும் கட்டளைகளை இயக்கவும்: +உள்ளார்மாக Jupyter ஐ துவக்க கோர்ஸ் கோப்புறைக்கு சென்று இதனை இயக்கு: ```bash jupyter notebook @@ -36,37 +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 ஐத் தொடக்கியவுடன் உடனுக்குடன் தொடங்கலாம். +* GitHub இல் உங்களுக்காக உருவாக்கப்பட்ட வேறுவிதமான சூழல் ஆகும் **[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) இலவச கணினி வளங்களை வழங்கும், GitHub குறியீட்டை சோதிக்க உதவுகிறது. முன்னணி பக்கத்தில் உள்ள பொத்தானைக் கிளிக் செய்யவும், அது உடனடியாக அடிப்படை கொண்டெய்னரை உருவாக்கி Jupyter இணைய இடைமுகத்தைக் தொடங்கும். -* **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)** பயன்படுத்துதல் - [Binder](https://mybinder.org) என்பது GitHub இல் உள்ள குறியீடை சோதிக்க மக்களுக்கு மேகத்தில் இலவச கணினிசார் வளங்களை வழங்குகிறது. முன்னணி பக்கத்தில் ஒரு பொத்தான் உள்ளது, இதன் மூலம் அந்த ரெப்போசிட்டரியை Binder இல் திறக்கலாம் - இது விரைவாக binder தளத்தை திறக்கும், அடிப்படை கன்டைனரை கட்டி, Jupyter இணைய முகப்பை ஆட்டோமாக ஆரம்பிக்கும். +> **குறிப்பு**: தவறான பயன்பாட்டைத் தடுப்பதற்காக, Binder சில இணைய வளங்களுக்கான அணுகலை தடுக்கும். இது பொதுத் துணையிலிருந்து தரவுக்கோப்புகள் மற்றும் மாதிரிகளைப் பெறும் சில குறியீடுகள் வேலை செய்யாமை ஏற்படுத்தலாம். சில விருப்ப வழிகளைக் கண்டறிய வேண்டும். மேலும், Binder வழங்கும் கணினி வளங்கள் அடிப்படையாக உள்ளன, ஆகையால் பயிற்சி மெல்ல ஆகும், சிறந்த பாடங்களில் குறிப்பாக. -> **குறிப்பு**: தவறான பயன்பாட்டைத் தடுப்பதற்காக, Binder சில இணைய வளங்களுக்கு அணுகலைத் தடை செய்துள்ளது. இது சில குறியீடுகள், பொதுச்சேவையகங்கள் மற்றும் தரவுத்தொகுப்புகளைப் பெறும் போது வேலை செய்யாமற் போகலாம். நீங்கள் சில மாற்று வழிகளை தேட வேண்டியிருக்கலாம். மேலும், Binder வழங்கும் கணினிசார் வளங்கள் அடிப்படை மட்டமாகவே உள்ளதால், பயிற்சி மிகவும் மெதுவாக நடக்கும், குறிப்பாக பின்னர் சிக்கலான பாடங்களில். +## GPU உடன் மூகிலில் இயக்குதல் -## GPU உடன் மேகத்தில் இயக்குதல் +சில பிற பாடங்கள் GPU ஆதரவுடன் சிறந்த பயன் தரும். மாதிரி பயிற்சி மேம்பட்டதாக இருக்கும், இல்லையெனில் சீரற்ற வேகம் குறைவு. சில வழிகளும் உள்ளன, குறிப்பாக நீங்கள் [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) மூலம் அல்லது உங்கள் தொழிற்சங்கம் வழியாக மூகிலில் அணுகல் இருந்தால்: -இந்த பாடத்திட்டத்தின் சில பின்னுலக்க பாடங்கள் GPU ஆதரவுடன் பெரிதும் பயனடையும். மாதிரி பயிற்சி, உதாரணமாக, இல்லையெனில் மிகவும் மெதுவாக நடைபெறும். சில விருப்பங்கள் இருக்கின்றன, குறிப்பாக நீங்கள் மேகத்தில் [Azure 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) உருவாக்கி Jupyter மூலம் அதனுடன் இணைவது. பின்னர் நீங்கள் ரெப்போவை நேரடியாக மின்னணு இயந்திரத்தில் கிளோன் செய்து изучு தொடங்கலாம். NC-வரிசை VM களில் 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 நோட்புக்கில் கிளோன் செய்து பயன்படுத்துவது என்பதைக் காட்டுகிறது. - -மேலும், சில இலவச GPU ஆதரவுடன் கூடிய Google Colab ஐப் பயன்படுத்தி, Jupyter நோட்புக்குகளை அங்கே ஏற்றிக் கொண்டு ஒன்றரைவிடை இயக்கலாம். +Google Colab ஐவும் பயன்படுத்தலாம், இது இலவச GPU ஆதரவுடன் வருகிறது; Jupyter நோட்புக்களை அங்கே பதிவேற்றியும் ஒவ்வொன்றாக இயக்கலாம். --- -**மறுப்பு**: -இந்த ஆவணம் [Co-op Translator](https://github.com/Azure/co-op-translator) எனும் AI மொழிபெயர்ப்பு சேவையினைப் பயன்படுத்தி மொழிபெயர்க்கப்பட்டுள்ளது. நாம் சரியானதாக முயற்சித்தோமோ என்றாலும், தானியங்கி மொழிபெயர்ப்புகள் தவறுகள் அல்லது துல்லியமற்றவையாக இருக்கக்கூடும் என்பதை தயவுசெய்து கவனியுங்கள். மூல ஆவணம் அதன் பூர்வ மொழியில் அதிகாரப்பூர்வமான மூலமாக கருதப்பட வேண்டும். முக்கியமான தகவல்களுக்கு, தொழில்முறை மனித மொழிபெயர்ப்பு பரிந்துரைக்கப்படுகிறது. இந்த மொழிபெயர்ப்பைப் பயன்படுத்துவதால் ஏற்பட்ட எந்த தவறான புரிதல்கள் அல்லது தவறான விளக்கங்களுக்கும் நாங்கள் பொறுப்பேற்கவில்லை. +**மறுப்பு**: +இந்த ஆவணம் AI மொழிபெயர்ப்பு சேவை [Co-op Translator](https://github.com/Azure/co-op-translator) பயன்படுத்தி மொழிபெயர்க்கப்பட்டுள்ளது. நாங்கள் துல்லியத்திற்காக முயற்சி செய்துள்ளோம், ஆனால் தானாக செய்யப்படும் மொழிபெயர்ப்புகளில் பிழைகள் அல்லது தவறுகள் இருக்கலாம் என்பதை கவனத்தில் கொள்ளவும். அசல் ஆவணம் அதன் தாய்மொழியில் அதிகாரப்பூர்வ ஆதாரமாக கருதப்பட வேண்டும். முக்கியமான தகவல்களுக்கு, தொழில்நுட்பமான மனித மொழிபெயர்ப்பு பரிந்துரைக்கப்படுகிறது. இந்த மொழிபெயர்ப்பைப் பயன்படுத்துவதால் ஏற்படும் எந்த தவறான புரிதல்கள் அல்லது தவறான விளக்கத்திற்கும் நாங்கள் பொறுப்பில்வில்லை. \ No newline at end of file diff --git a/translations/ta/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/ta/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index e800adac72..ebb8ab5eb8 100644 --- a/translations/ta/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/ta/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -4,11 +4,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# முன்பே பயிற்சி பெற்ற மாதிரிகள் மற்றும் மாற்றம் கற்றல்\n", + "# முன்புதயாரிக்கப்பட்ட மாதிரிகள் மற்றும் மாற்று கல்வி\n", "\n", - "CNNகளை (கன்வல்யூஷனல் நியூரல் நெட்வொர்க்) பயிற்சி செய்வது மிகவும் நேரம் எடுத்துக்கொள்ளக்கூடியது, மேலும் அதற்கான பணிக்குப் பெருமளவு தரவுகள் தேவைப்படும். ஆனால், பெரும்பாலான நேரம் ஒரு நெட்வொர்க் படங்களிலிருந்து முறைபாடுகளை எடுக்க பயன்படுத்தும் சிறந்த தாழ்நிலை வடிகட்டிகளை கற்றுக்கொள்வதற்காக செலவிடப்படுகிறது. ஒரு இயல்பான கேள்வி எழுகிறது - ஒரு தரவுத்தொகுப்பில் பயிற்சி பெற்ற நியூரல் நெட்வொர்க்கை பயன்படுத்தி, முழுமையான பயிற்சி செயல்முறையின்றி வேறு படங்களை வகைப்படுத்துவதற்கு அதை ஏற்றுக்கொள்ள முடியுமா?\n", + "CNN-களை பயிற்றுவது அதிக நேரம் எடுக்கக்கூடியதும், இந்த பணிக்காக நிறைய தரவுக்களம் தேவைப்படும். இருப்பினும், அதிக நேரம் ஒரு நெட்வொர்க் படங்களிலிருந்து டேட்டா எடுக்கும் சிறந்த குறைந்த-நிலை வடிகட்டிகளை கற்றுக்கொள்ள பயன்படுத்தப்படுகிறது. ஒரு இயல்பான கேள்வி எழுகின்றது - ஒரு தரவுத்தொகுதியில் பயிற்றப்பட்ட நியூரல் நெட்வொர்க் மூலம் வேறு படங்களைக் வகைப்பதில் முழு பயிற்றல் தேவையில்லாமல் பயனப்படுத்த முடியுமா?\n", "\n", - "இந்த அணுகுமுறை **மாற்றம் கற்றல்** என்று அழைக்கப்படுகிறது, ஏனெனில் நாம் ஒரு நியூரல் நெட்வொர்க் மாதிரியில் இருந்து மற்றொன்றுக்கு சில அறிவை மாற்றுகிறோம். மாற்றம் கற்றலில், நாம் பொதுவாக ஒரு முன்பே பயிற்சி பெற்ற மாதிரியுடன் தொடங்குகிறோம், இது **ImageNet** போன்ற பெரிய படத் தரவுத்தொகுப்பில் பயிற்சி பெற்றது. அந்த மாதிரிகள் ஏற்கனவே பொதுவான படங்களில் இருந்து பல்வேறு அம்சங்களை எடுக்க சிறந்த வேலை செய்ய முடியும், மேலும் பல சந்தர்ப்பங்களில், அந்த எடுக்கப்பட்ட அம்சங்களின் மேல் ஒரு வகைப்படுத்தியை உருவாக்குவது நல்ல முடிவை வழங்க முடியும்.\n" + "இந்த அணுகுமுறை **மாற்று கல்வி** என அழைக்கப்படுகிறது, ஏனெனில் நாம் ஒரு நியூரல் நெட்வொர்க் மாதிரியில் இருந்து இன்னொரு மாதிரிக்கு சில அறிவுகளை மாற்றுகிறோம். மாற்று கற்றலில், பொதுவாக நாம் ஒரு முன்புதயாரிக்கப்பட்ட மாதிரியைத் தொடங்குகிறோம், இது **ImageNet** போன்ற பெரிய படத் தொகுதியில் பயிற்றப்பட்டிருக்கும். அந்த மாதிரிகள் ஏற்கனவே பொதுவான படங்களிலிருந்து வேறுபட்ட அம்சங்களை எடுக்க சிறந்த திறன் கொண்டவை, பலமுறை அந்த எடுக்கப்பட்ட அம்சங்களை அடிப்படையாக கொண்டு ஒரு வகைப்போர் கட்டும் பின் நல்ல முடிவை தர முடியும்.\n" ] }, { @@ -31,9 +31,9 @@ "source": [ "## பூனைகள் மற்றும் நாய்கள் தரவுத்தொகுப்பு\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", + "உண்மையான வாழ்க்கையில், படத் தரவுத்தொகுப்புகளின் அளவு மிகப்பெரியதுகூட இருக்கலாம், மற்றும் எல்லா தரவுகளும் நினைவகத்தில் இருக்க முடியும் என்று நம்ப முடியாது. அதனால், தரவுத்தொகுப்புகள் பொதுவாக **உற்பத்தியாளர்களாக** (generators) உள்ளன, இது பயிற்சிக்கான சிறிய தொகுதிகளாக தரவுகளை வழங்கும்.\n", "\n", - "பட வகைப்படுத்தலைச் சமாளிக்க, Keras-ல் `image_dataset_from_directory` என்ற சிறப்பு செயல்பாடு உள்ளது, இது வெவ்வேறு வகைகளுக்கு இணையான துணை அடைவுகளில் இருந்து படங்களை ஏற்ற முடியும். இந்த செயல்பாடு படங்களை அளவிடுவதையும் கவனிக்கிறது, மேலும் தரவுத்தொகுப்பை பயிற்சி மற்றும் சோதனை துணைத் தொகுதிகளாகப் பிரிக்கவும் முடியும்:\n" + "பட வகைப்படுத்தலை கையாள, Keras சிறப்பான செயல்பாடு `image_dataset_from_directory`-ஐ கொண்டுள்ளது, இது வெவ்வேறு வகையான அண்டைவலைகளில் இருந்து படங்களை ஏற்ற முடியும். இந்த செயல்பாடு படங்களின் அளவை சரிசெய்தலும் (scaling), மற்றும் தரவுத்தொகுப்பை பயிற்சி மற்றும் சோதனை தொகdut்களாக பிரிப்பதும் கவனிக்கிறது:\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` namespace-இல் கிடைக்கின்றன, மேலும் இன்னும் பல மாதிரிகள் இணையத்தில் கிடைக்கின்றன. மிக எளிய 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-உறுப்புகளைக் கொண்ட தொகுப்பை பெறுகிறோம். இந்த tensor இல் `argmax` அழைத்து மிக அதிக வாய்க்கை உள்ள வகுப்பு எணினை கண்டுபிடிக்க முடியும்.\n", + "* கிடைத்த முடிவு என்பது [ஒரு `ImageNet` வகுப்பின் எண்](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). இந்த முடிவை புரிந்துகொள்ள, நாம் `decode_predictions` செயலியையும் பயன்படுத்தி, அதன் பெயர்களுடன் கூடிய மிக முக்கியமான n வகுப்புகளைப் பெறலாம்.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "விஜிஜி-16 நெட்வொர்க்கின் கட்டமைப்பையும் பார்ப்போம்:\n" + "VGG-16 நெட்வொர்க் கட்டமைப்பையும் பார்க்கலாம்:\n" ] }, { @@ -597,9 +607,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## GPU கணக்கீடுகள்\n", + "## GPU கணக்கிடல்கள்\n", "\n", - "VGG-16 மற்றும் பிற நவீன கட்டமைப்புகள் போன்ற ஆழமான நரம்பியல் வலையமைப்புகள் இயங்குவதற்கு மிக அதிக கணினி சக்தியை தேவைப்படுத்துகின்றன. GPU வேகத்தை பயன்படுத்துவது பொருத்தமாக இருக்கும், அது கிடைப்பதானால். அதிர்ஷ்டவசமாக, GPU கிடைப்பதானால், Keras தானாகவே கணக்கீடுகளை வேகமாகச் செய்கிறது. 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 மினி பேட்ச்கள்) கையால் எடுத்து, அவற்றின் கூறு வெக்டர்களை முன்கூட்டியே கணக்கிடலாம். இதற்கு Tensorflow **dataset** API ஐ பயன்படுத்தலாம். `map` செயல்பாடு ஒரு dataset ஐ எடுத்து, கொடுக்கப்பட்ட lambda-function ஐ பயன்படுத்தி அதை மாற்றுகிறது. இந்த முறைமையை பயன்படுத்தி, `ds_features_train` மற்றும் `ds_features_test` என்ற புதிய datasets ஐ உருவாக்குகிறோம், இதில் VGG மூலம் எடுக்கப்பட்ட கூறுகள், மூல படங்களின் பதிலாக இருக்கும்.\n" + "இப்போது அந்த அம்சங்களை படங்களை வகைப்படுத்த பயன்படுத்த முடியுமா என்று பார்க்க முயலலாம். சில படங்களின் ஒரு பகுதியை (எமது அம்சமாக 50 மினி பேட்ச்கள்) தேர்வுசெய்து அவற்றின் அம்ச வெக்டர்களை முன்கூட்டியே கணக்கிடுவோம். அதற்காக Tensorflow **dataset** APIவை பயன்படுத்தலாம். `map` செயல்பாடு ஒரு தரவுத்தொகுதியை எடுத்துக் கொடுத்து குறிப்பிட்ட லாம்டா- செயல்பாட்டை இயக்குகிறது. இந்த முறையைப் பயன்படுத்தி, முழுமையான படங்களுக்குப் பதிலாக VGG-இருந்து எடுக்கப்பட்ட அம்சங்களை கொண்ட புதிய தரவுத்தொகுதிகள், `ds_features_train` மற்றும் `ds_features_test` உருவாக்கப்பட்டன.\n" ] }, { @@ -712,9 +723,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "நாம் `.take(50)` கட்டமைப்பைப் பயன்படுத்தி தரவுத்தொகுப்பின் அளவை வரையறுத்தோம், எங்கள் விளக்கத்தை வேகமாக செய்ய. நீங்கள் முழு தரவுத்தொகுப்பில் இந்த பரிசோதனையை செய்யலாம்.\n", + "நாங்கள் எங்கள் காட்சி விரைவு செய்யும் நோக்கில `.take(50)` கட்டுமானத்தை dataset அளவை குறைக்கும் வகையில் பயன்படுத்தினோம். முழு dataset-இல் நீங்கள் இந்த முயற்சியை நடத்தலாம்.\n", "\n", - "இப்போது, அம்சங்கள் எடுக்கப்பட்ட ஒரு தரவுத்தொகுப்பை பெற்றுள்ளதால், நாங்கள் பூனைகள் மற்றும் நாய்களை வேறுபடுத்த ஒரு எளிய அடர்த்தியான வகைப்பாட்டாளரை பயிற்றுவிக்க முடியும். இந்த நெட்வொர்க் (7,7,512) வடிவிலான அம்ச வெக்டரை எடுத்துக்கொண்டு, அது நாய் அல்லது பூனைக்கு இணையான ஒரு வெளியீட்டை உருவாக்கும். இது இரும வகைப்பாடு என்பதால், நாங்கள் `sigmoid` செயல்பாட்டு செயல்பாட்டையும் `binary_crossentropy` இழப்பையும் பயன்படுத்துகிறோம்.\n" + "இப்போது நாம் பெறப்பட்ட அம்சங்களுடன் dataset ஒன்றைக் கொண்டுள்ளோம், சிறிய dense வகைப்பாட்டாளரை பயிற்றுவித்து பூனைகள் மற்றும் நாய்களை வேறுபடுத்தலாம். இந்த நெட்வொர்க் (7,7,512) வடிவத்தில் உள்ள அம்ச வெக்டர் ஒன்றைப் பெறும், மற்றும் நாய் அல்லது பூனை என்பதற்கான ஒரு வெளியீட்டை உருவாக்கும். இது binary classification ஆக இருப்பதால், நாம் `sigmoid` activation function மற்றும் `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": [ - "இந்த மாடல் ஒரு முடிவு-to-முடிவு வகைப்பாடு நெட்வொர்க் போல தோன்றுகிறது, இது ஒரு படத்தை எடுத்து அதன் வகையை திருப்பி அளிக்கிறது. ஆனால், சிக்கலான விஷயம் என்னவென்றால், VGG16 ஒரு அம்சம் எடுக்கும் கருவியாக செயல்பட வேண்டும், மறுபயிற்சி செய்யப்படக்கூடாது. எனவே, **கன்வல்யூஷனல் அம்சம் எடுக்கும் கருவியின் எடைகளை உறைபடுத்த வேண்டும்**. நெட்வொர்கின் முதல் அடுக்கு `model.layers[0]` என்று அழைப்பதன் மூலம் அணுகலாம், மேலும் `trainable` பண்பை `False` ஆக அமைக்க வேண்டும்.\n", + "இந்த மாடல் ஒரு end-to-end வகைப்பாடு நெட்வொர்க்கைப் போன்றது, இது ஒரு படத்தை எடுத்துக்கொண்டு வகுப்பை 반환 செய்கிறது. எனினும், சிக்கலான விஷயம் என்னவென்றால் நாம் VGG16-ஐ ஒரு அம்சப் பறிமாற்றியாக செயல்படவைக்க விரும்புகிறோம், மீண்டும் பயிற்சி செய்யப்பட வேண்டாம். ஆகவே, நாமே **கலக்கு அம்ச பறிமாற்றி எடைங்களை உறுத்த வேண்டும்**. நெட்வொர்க்கின் முதல் அடியினை `model.layers[0]` என்று அழைக்கும் மூலம் அணுகலாம், மேலும் `trainable` பண்பை `False` ஆக அமைக்கவேண்டும்.\n", "\n", - "> **குறிப்பு**: அம்சம் எடுக்கும் கருவியின் எடைகளை உறைபடுத்துவது அவசியம், ஏனெனில், பயிற்சி செய்யப்படாத வகைப்பாட்டு அடுக்கு, கன்வல்யூஷனல் எடுக்கும் கருவியின் முதன்மை பயிற்சி செய்யப்பட்ட எடைகளை அழிக்கக்கூடும்.\n", + "> **குறிப்பு**: அம்ச பறிமாற்றி எடைங்களை உறுத்த தேவையானது, ஏனெனில் பயிற்சி செய்யப்படாத வகைப்படுத்தி அடுக்கு convolutional பறிமாற்றியின் முதன்மை முன்கூட்டியே பயிற்சி செய்யப்பட்ட எடை யை அழிக்கக்கூடும்.\n", "\n", - "நெட்வொர்க்கில் மொத்த அளவிலான அளவுருக்கள் சுமார் 15 மில்லியன் இருக்கும் போது, நாம் 25k அளவுருக்களை மட்டுமே பயிற்சி செய்கிறோம் என்பதை நீங்கள் கவனிக்கலாம். மேல்நிலை கன்வல்யூஷனல் வடிகட்டிகளின் மற்ற அனைத்து அளவுருக்களும் முதன்மை பயிற்சி செய்யப்பட்டவை. இது நல்லது, ஏனெனில் குறைந்த எண்ணிக்கையிலான எடுத்துக்காட்டுகளுடன் குறைந்த எண்ணிக்கையிலான அளவுருக்களை நன்றாகச் சரிசெய்ய முடிகிறது.\n", + "நமது நெட்வொர்க்கில் மொத்த அளவுகோல் சுமார் 15 மில்லியன் இருக்கும்போது, நாங்கள் வெறும் 25k அளவுகோலை மட்டும் பயிற்சி செய்கிறோம் என்பதை கவனிக்கலாம். மேல்நிலை convolutional வடிகட்டிகளின் மற்ற அனைத்து அளவுகோல்களும் முன்கூட்டியே பயிற்சி செய்யப்பட்டவை. இது நன்மை காரணம், ஏனெனில் நாம் சிறிய எண்ணிக்கையுடன் குறைந்த அளவுகோல்களை நன்கு சரிசெய்ய முடியும்.\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", + "முந்தைய பகுதியில், நாங்கள் இறுதி வகைப்படுத்தும் அடுக்கை நமது சொந்த தரவுத்தொகுப்பில் உள்ள படங்களை வகைப்படுத்த பயிற்றுவித்தோம். ஆனால், அம்சக் கழிப்பாய்வாளரை மீண்டும் பயிற்றுவிக்கவில்லை மற்றும் நமது மodel் ImageNet தரவின் அம்சங்களையே நம்பியது. உங்கள் பொருட்கள் பொதுவான ImageNet படங்களிலிருந்து கண்ணோட்ட ரீதியாக வேறுபட்டிருந்தால், இந்த அம்சக் கூட்டணி சிறந்ததாக வேலை செய்யாதிருக்கலாம். ஆகவே, தொகுதி அடுக்குகளையும் பயிற்றுவிக்கத் தொடங்குவது நிவர்த்தியானது.\n", "\n", - "அதற்காக, நாம் முன்பு உறைந்த கான்வல்யூஷனல் ஃபில்டர் அளவுருக்களை மீண்டும் திறக்கலாம்.\n", + "அதற்காக, நாங்கள் முந்தய ஃப்ரீஜ் செய்திருந்த தொகுதி வடிகட்டி அளவுருக்களைக் கிளப்ப முடியும்.\n", "\n", - "> **குறிப்பு:** முதலில் அளவுருக்களை உறையவைத்து, வகைப்பாட்டாளர் அடுக்கில் எடை நிலைத்திருக்க பல எபோக்களைப் பயிற்சி செய்வது முக்கியம். நீங்கள் உடனடியாக உறையாத அளவுருக்களுடன் முழு நெட்வொர்க்கை பயிற்சி செய்யத் தொடங்கினால், பெரிய பிழைகள் கான்வல்யூஷனல் அடுக்குகளில் முன்பே பயிற்சி செய்யப்பட்ட எடைகளை அழிக்கக்கூடும்.\n", + "> **குறிப்பு:** முதலில் அளவுருக்களை ஃப்ரீஜ் செய்து, வகைப்படுத்தும் அடுக்கில் எடைகள் நிலைத்திருப்பதற்காக பல இடைவெளிகள் பயிற்சியைச் செய்வது முக்கியம். உங்கள் அகற்றப்பட்ட அளவுருக்களுடன் உடனுக்குடன் முழு இணையத்தை பயிற்றுவித்தால், பெரிய பிழைகள் தொகுதி அடுக்குகளில் இருக்கும் முந்தைய பயிற்சி எடைகளை சேதம் செய்ய வாய்ப்புள்ளது.\n", "\n", - "எங்கள் கான்வல்யூஷனல் VGG-16 மாதிரி முதல் அடுக்கில் உள்ளது, மேலும் இது பல அடுக்குகளை கொண்டது. அதன் அமைப்பைப் பார்ப்போம்:\n" + "நமது தொகுதி VGG-16 மodel் முதல் அடுக்கில் உள்ளது, அது பல அடுக்குகளைக் கொண்டது. அதன் அமைப்பை நாம் பார்ப்போம்:\n" ] }, { @@ -945,7 +956,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "நாம் கான்வல்யூஷனல் அடிப்படையின் அனைத்து அடுக்குகளையும் உருகவிடலாம்:\n" + "நாம் கூட்டிச் சுருக்க அடித்தளத்தின் அனைத்து அடுக்குகளையும் மீள்க்கடத்தலாம்:\n" ] }, { @@ -961,7 +972,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "எனினும், அவற்றை அனைத்தையும் ஒரே நேரத்தில் உருகச் செய்வது சிறந்த யோசனை அல்ல. முதலில் சில இறுதி சுருட்டல்களின் அடுக்கு மட்டுமே உருகச் செய்யலாம், ஏனெனில் அவை எங்கள் படங்களுக்குத் தொடர்புடைய உயர் நிலை வடிவங்களை கொண்டுள்ளன. உதாரணமாக, தொடக்கத்தில், இறுதி 4 அடுக்குகளைத் தவிர அனைத்து அடுக்குகளையும் உறையவிடலாம்:\n" + "இருப்பினும், அவற்றில் எல்லாவற்றையும் ஒரே நேரத்தில் அன்ஃப்ரீஸ் செய்வது சிறந்த யோசனை அல்ல. முதலில், நாங்கள் வெறும் சில கடைசி convolution அடுக்குகளை மட்டும் அன்ஃப்ரீஸ் செய்யலாம், ஏனெனில் அவைகள் எங்கள் படங்களுக்கே பொருந்தக்கூடிய உயர் மட்டத்தின் மாதிரிகளை கொண்டிருக்கின்றன. உதாரணமாக, முதலில், கடைசி 4 அடுக்குகளை தவிர்த்து மற்ற எல்லா அடுக்குகளையும் ஃப்ரீஸ் செய்யலாம்: \n" ] }, { @@ -1000,11 +1011,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "கற்றுக்கொள்ளக்கூடிய அளவுகோள்களின் எண்ணிக்கை குறிப்பிடத்தக்க அளவில் அதிகரித்துள்ளது, ஆனால் இது இன்னும் மொத்த அளவுகோள்களின் சுமார் 50% மட்டுமே உள்ளது.\n", + "பயிற்சி அளக்க கூடிய அளவுருக்களின் எண்ணிக்கை முக்கியமாக அதிகரித்துள்ளதை கவனியுங்கள், ஆனால் அது இன்னும் அனைத்து அளவுருக்களின் சுமார் 50% ஆகும்.\n", "\n", - "உறைந்த நிலையை நீக்கிய பிறகு, மேலும் சில காலகட்டங்களுக்கு பயிற்சி செய்யலாம் (எங்கள் எடுத்துக்காட்டில், நாம் ஒரு காலகட்டம் மட்டுமே செய்வோம்). முன்பயிற்சியளிக்கப்பட்ட எடைகளின் தாக்கத்தை குறைக்க, குறைந்த கற்றல் வீதத்தைத் தேர்ந்தெடுக்கலாம். ஆனால், குறைந்த கற்றல் வீதத்துடன் கூட, பயிற்சியின் தொடக்கத்தில் துல்லியத்திற்கான மதிப்பு குறையலாம், பின்னர் நிலையான எடைகளின் நிலைமையை விட சிறிது அதிகமான நிலையை அடையும்.\n", + "உறையாமல் வைத்து விடுவதன் பிறகு, நாம் மேலும் சில epoch பயிற்சிகளை செய்யலாம் (எங்கள் எடுத்துக்காட்டில், நாம் ஒரேயொரு epoch செய்யப்போவது). முன்-பயிற்சி அளவுருக்களுக்கு குறைவான தாக்கத்தை ஏற்படுத்த குறைந்த கட்டுப்பாட்டு விகிதத்தை நீங்கள் தேர்வு செய்யவும் முடியும். இருப்பினும், குறைந்த கட்டுப்பாட்டு விகிதத்துடனும், பயிற்சி தொடக்கத்தில் துல்லியம் குறையலாம் என்று எதிர்பார்க்கலாம், இறுதியில் நிரந்தர அளவுருக்களைப் பயன்படுத்தியதைவிட சிறிது அதிகமான நிலைக்கு வரும் வரை.\n", "\n", - "> **குறிப்பு:** இந்த பயிற்சி மிகவும் மெதுவாக நடக்கிறது, ஏனெனில் நெட்வொர்க்கின் பல அடுக்குகள் வழியாக gradients-ஐ மீண்டும் பரப்ப வேண்டும்!\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 பல முன்பே பயிற்றுவிக்கப்பட்ட நெட்வொர்க்குகளை வழங்குகிறது. அவைகளுள் அதிகம் பயன்பாட்டில் உள்ளவை Microsoft உருவாக்கிய **ResNet** உருவமைப்புகள் மற்றும் Google உருவாக்கிய **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", "\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) என்ற AI மொழிபெயர்ப்பு சேவையைப் பயன்படுத்தி மொழிபெயர்க்கப்பட்டுள்ளது. நாங்கள் துல்லியத்திற்காக முயற்சிக்கின்றோம், ஆனால் தானியங்கி மொழிபெயர்ப்புகளில் பிழைகள் அல்லது தவறான தகவல்கள் இருக்கக்கூடும் என்பதை கவனத்தில் கொள்ளவும். அதன் தாய்மொழியில் உள்ள மூல ஆவணம் அதிகாரப்பூர்வ ஆதாரமாக கருதப்பட வேண்டும். முக்கியமான தகவல்களுக்கு, தொழில்முறை மனித மொழிபெயர்ப்பு பரிந்துரைக்கப்படுகிறது. இந்த மொழிபெயர்ப்பைப் பயன்படுத்துவதால் ஏற்படும் எந்த தவறான புரிதல்கள் அல்லது தவறான விளக்கங்களுக்கு நாங்கள் பொறுப்பல்ல.\n" + "---\n\n\n**மறுப்பு**:\nஇந்த ஆவணம் AI மொழிபெயர்ப்பு சேவை [Co-op Translator](https://github.com/Azure/co-op-translator) பயன்படுத்தி மொழிபெயர்க்கப்பட்டுள்ளது. நாங்கள் துல்லியத்திற்காக முயற்சி செய்துள்ளோம், ஆனால் தானாக செய்யப்படும் மொழிபெயர்ப்புகளில் பிழைகள் அல்லது தவறுகள் இருக்கலாம் என்பதை கவனத்தில் கொள்ளவும். அசல் ஆவணம் அதன் தாய்மொழியில் அதிகாரப்பூர்வ ஆதாரமாக கருதப்பட வேண்டும். முக்கியமான தகவல்களுக்கு, தொழில்நுட்பமான மனித மொழிபெயர்ப்பு பரிந்துரைக்கப்படுகிறது. இந்த மொழிபெயர்ப்பைப் பயன்படுத்துவதால் ஏற்படும் எந்த தவறான புரிதல்கள் அல்லது தவறான விளக்கத்திற்கும் நாங்கள் பொறுப்பில்வில்லை.\n\n" ] } ], @@ -1484,12 +1495,6 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" - }, - "coopTranslator": { - "original_hash": "c189abc107848f96051085cc30945129", - "translation_date": "2025-10-11T12:00:57+00:00", - "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", - "language_code": "ta" } }, "nbformat": 4, diff --git a/translations/ta/lessons/5-NLP/README.md b/translations/ta/lessons/5-NLP/README.md index 3cee4138e2..238b8e4209 100644 --- a/translations/ta/lessons/5-NLP/README.md +++ b/translations/ta/lessons/5-NLP/README.md @@ -1,59 +1,51 @@ # இயற்கை மொழி செயலாக்கம் -![NLP பணிகளின் சுருக்கம் ஒரு ஓவியத்தில்](../../../../translated_images/ta/ai-nlp.b22dcb8ca4707cea.webp) +![NLP பணிகளின் சுருக்கம் ஒரு டூடிலில்](../../../../translated_images/ta/ai-nlp.b22dcb8ca4707cea.webp) -இந்த பிரிவில், **இயற்கை மொழி செயலாக்கம் (NLP)** தொடர்பான பணிகளை கையாள நரம்பியல் வலையமைப்புகளைப் பயன்படுத்துவதில் கவனம் செலுத்துவோம். கணினிகள் தீர்க்க வேண்டிய பல NLP பிரச்சினைகள் உள்ளன: +இந்த பிரிவில், நாங்கள் நியூரல் நெட்வொர்க்குகளைப் பயன்படுத்தி **இயற்கை மொழி செயலாக்கம் (NLP)** தொடர்பான பணிகளை மேற்கொள்ள கவனம் செலுத்தப்போகிறோம். கணினிகள் தீர்க்க விரும்பும் பல NLP பிரச்சினைகள் உள்ளன: -* **உரை வகைப்படுத்தல்** என்பது உரை வரிசைகளுக்கான ஒரு வழக்கமான வகைப்படுத்தல் பிரச்சினையாகும். உதாரணமாக, மின்னஞ்சல் செய்திகளை ஸ்பாம் மற்றும் ஸ்பாம் அல்ல என வகைப்படுத்துதல் அல்லது கட்டுரைகளை விளையாட்டு, வணிகம், அரசியல் போன்றவையாக வகைப்படுத்துதல். மேலும், சாட் போட்களை உருவாக்கும்போது, பயனர் என்ன சொல்ல விரும்புகிறார் என்பதைப் புரிந்துகொள்ள வேண்டும் - இந்தச் சூழலில் நாம் **நோக்க வகைப்படுத்தல்** (intent classification) பிரச்சினையை கையாளுகிறோம். நோக்க வகைப்படுத்தலில் பல வகைகளை கையாள வேண்டிய நிலை ஏற்படும். +* **ஆயிர்த்தொடர் வர்க்கப்பிரிவு** என்பது உரை தொடர்களுக்கு தொடர்புடைய ஒரு வழக்கமான வகைப்பாடு பிரச்சினை. உதாரணமாக, மின்னஞ்சல் எடை அஞ்சல்கள் ஸ்பாம் அல்லது ஸ்பாம் அல்ல என வகைப்படுத்துதல் அல்லது கட்டுரைகளை விளையாட்டுக் காலம், தொழில், அரசியல் என்பனவாக வகைப்படுத்துதல். மேலும், சாட் பாட்டுகளை உருவாக்கும்போது, பயனர் என்னக் கூற விரும்பினார்களோ அதை புரிந்துகொள்ள வேண்டும் -- இதை **நோக்கம் வகைப்படுத்தல்** என்று கூறுகிறோம். நோக்கம் வகைப்படுத்தலில் பல வகைகளை கையாள வேண்டி இருக்கிறது. +* **புகைப்படம் பகுப்பாய்வு** என்பது ஒரு வழக்கமான மறுபடியும் கணக்கிடுதல் பிரச்சினை, இதில் ஒரு வாக்கியத்தின் பொருள் எவ்வளவு நேர்மறை/எதிர்மறை என ஒரு எண்ணை (புகைப்படம்) நாங்கள் ஒதுக்கவேண்டும். புகைப்படக் கணக்கீட்டின் மேம்பட்ட பதிப்பு **அங்ஙீகங்களை அடிப்படையாகக் கொண்ட புகைப்பட பகுப்பாய்வு** (ABSA), இதில் முழு வாக்கியத்திற்கு மாறாக அதன் வெவ்வேறு பகுதிகளுக்கு (அங்ஙீகங்கள்) புகைப்படம் ஒதுக்கப்படுகிறது, உதாரணமாக *இந்த உணவுக்கடையில், எனக்கு சமையல் பிடித்தது, ஆனால் சூழல் மோசமாக இருந்தது*. +* **பெயர் பொருள் அடையாளம்** (NER) என்பது உரையிலிருந்து குறிப்பிட்ட பொருட்களை எடுக்கும் பிரச்சினை. எடுத்துக்காட்டிற்கு, *நாளை பாரிஸுக்கு பறக்க வேண்டும்* என்ற வாக்கியத்தில் *நாளை* என்பது தேதி (DATE) என்பதையும் *பாரிஸ்* என்பது இடம் (LOCATION) என்பதையும் புரிந்துகொள்ள வேண்டும். +* **துணைக்குறிகள் எடுக்கும் பணிகள்** NER போன்றது, ஆனால் நாங்கள் குறிப்பிட்ட பொருள் வகைகளுக்காக முன் பயிற்சி செய்யாமல் வாக்கியத்தின் பொருளுக்கு முக்கியமான வார்த்தைகளை தானாக எடுக்கவேண்டும். +* **உரை தொகுப்பு** என்பது ஒரே மாதிரியான வாக்கியங்களை குழுவாக்கவேண்டியபோது உதவியாக இருக்கக்கூடும், உதாரணமாக, தொழில்நுட்ப ஆதரவு உரையாடல்களில் ஒரே மாதிரியான கோரிக்கைகள். +* **பிரச்னை பதில் அளித்தல்** என்பது ஒரு மாதிரியால் ஒரு குறிப்பிட்ட கேள்விக்கு பதில் அளிக்கும் திறன். மாதிரி ஒரு உரை பகுதியையும் ஒரு கேள்வியையும் உள்ளீடாக பெறுகிறது, கேள்விக்கு பதில் கொண்டிருக்கும் இடத்தை (அல்லது, சில சமயங்களில், பதில் உரையை உருவாக்க) வழங்க வேண்டும். +* **உரை உருவாக்கம்** என்பது ஒரு மாதிரி புதிய உரையை உருவாக்கும் திறனாகும். இது ஒரு வகைப்பாடு வேலைவாய்ப்பு போல கருதப்படலாம், அடுத்து வரும் அகரவியல்/வார்த்தையை *உரை ஊக்கம்* அடிப்படையில் முன்னறிவிக்கும். GPT-3 போன்ற மேம்பட்ட உரை உருவாக்க மாதிரிகள், [prompt programming](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) அல்லது [prompt engineering](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29) என்ற முறையைப் பயன்படுத்தி வகைப்படுத்தல் போன்ற மற்ற NLP பணிகளையும் எளிதில் செய்ய முடியும். +* **உரை சுருக்கம்** என்பது கணினி நீண்ட உரையை "படித்து" அதை சில வாக்கியங்களில் சுருக்க வேண்டும் என்று இரு தொழில். +* **மெஷின் மொழிபெயர்ப்பு** என்பது ஒரு மொழியில் உரையை புரிந்து, மற்றொரு மொழியில் உரையை உருவாக்குவதன் கலவையாக பார்க்க முடியும். -* **உணர்வு பகுப்பாய்வு** என்பது ஒரு வழக்கமான மடங்கல் (regression) பிரச்சினையாகும், இதில் ஒரு வாக்கியத்தின் அர்த்தம் எவ்வளவு நேர்மறை/எதிர்மறை என்பதைப் பிரதிபலிக்கும் ஒரு எண்ணை (உணர்வு) வழங்க வேண்டும். உணர்வு பகுப்பாய்வின் மேம்பட்ட பதிப்பு **கோண அடிப்படையிலான உணர்வு பகுப்பாய்வு** (ABSA) ஆகும், இதில் முழு வாக்கியத்திற்கு அல்லாமல் அதன் பல்வேறு பகுதிகளுக்கு (கோணங்கள்) உணர்வை வழங்க வேண்டும், உதாரணமாக *இந்த உணவகத்தில், நான் சமையலை விரும்பினேன், ஆனால் சூழல் மோசமாக இருந்தது*. +ஆரம்பத்தில், பல NLP பணிகள் வழக்கமான வேதியியல் முறைகளைப் பயன்படுத்தி தீர்க்கப்பட்டன. எடுத்துக்காட்டிற்கு, மெஷின் மொழிபெயர்ப்பில் ஆரம்ப வாக்கியத்தை ஒரு வர்க்க மரமாக மாற்ற பர்ஸர்கள் பயன்படுத்தப்பட்டனர், பின்னர் மேல்நிலை பொருள் அமைப்புகள் எடுக்கப்பட்டு வாக்கியத்தின் பொருள் பிரதிநிதித்துவப்படுத்தப்பட்டது, இதற்கும் இலக்க மொழியின் வேதியியலும் அடிப்படையாக கொண்டு முடிவு உருவாக்கப்பட்டது. இந்நிலையில், இன்று பல NLP பணிகள் நியூரல் நெட்வொர்க்குகளைப் பயன்படுத்தி இன்னும் பயனுள்ள முறையில் தீர்க்கப்படுகின்றன. -* **பெயரிடப்பட்ட பொருள் அடையாளம்** (NER) என்பது உரையிலிருந்து குறிப்பிட்ட பொருட்களை எடுப்பதற்கான பிரச்சினையாகும். உதாரணமாக, *நான் நாளை பாரிசுக்கு பறக்க வேண்டும்* என்ற வாக்கியத்தில் *நாளை* என்பது தேதி (DATE) மற்றும் *பாரிஸ்* என்பது இடம் (LOCATION) என்பதைப் புரிந்துகொள்ள வேண்டும். +> பல பாரம்பரிய NLP முறைகள் [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org) பைதான் நூலகத்தில் வடிவமைக்கப்பட்டுள்ளன. பல்வேறு NLP பணிகளை NLTK மூலம் எப்படி தீர்க்கலாம் என்பதை கொண்ட ஒரு சிறந்த [NLTK புத்தகம்](https://www.nltk.org/book/) இணையத்தில் கிடைக்கும். -* **முக்கிய வார்த்தை எடுப்பது** NER-க்கு ஒத்ததாக உள்ளது, ஆனால் குறிப்பிட்ட பொருள் வகைகளை முன்பயிற்சி செய்யாமல், வாக்கியத்தின் அர்த்தத்திற்கு முக்கியமான வார்த்தைகளை தானாக எடுக்க வேண்டும். +எங்கள் பாடத்தில், பெரும்பாலும் NLP க்கான நியூரல் நெட்வொர்க்குகளை பயன்படுத்துவோம், தேவையான இடங்களில் NLTK பயன்செய்யப்படும். -* **உரை குழுமம்** (Text clustering) என்பது ஒரே மாதிரியான வாக்கியங்களை ஒன்றாகக் குழுமிக்க உதவியாக இருக்கலாம், உதாரணமாக, தொழில்நுட்ப ஆதரவு உரையாடல்களில் ஒரே மாதிரியான கோரிக்கைகளை. +நாங்கள் ஏற்கனவே நியூரல் நெட்வொர்க்குகள் மூலம் அட்டவணை தரவையும் படங்களையும் கையாள எப்படி என்று கற்றுக்கொண்டுள்ளோம். அந்த வகை தரவுகளுக்கும் உரைக்கும் இடையேயான முக்கிய வேறுபாடு என்னவெனில் உரை ஒரு மாறி நீள கொண்ட தொடர் ஆகும், ஆனால் படங்களின் உள்ளீடு அளவு முன்கூட்டியே தெரியும். கான்வால்யூஷனல் நெட்வொர்க்குகள் உள்ளீடில் இருந்து வடிவங்களை எடுத்துக் கொள்ள முடியும், ஆனால் உரையின் வடிவங்கள் மிகவும் சிக்கலானவை. எடுத்துக்காட்டிற்கு, மறுப்பு (negation) தலைப்பு (subject) இலிருந்து நான் பல வார்த்தைகளுக்கு விலகி இருக்கலாம் (உதா., *நான் ஆரஞ்சுகளை விரும்பவில்லை*, vs. *நான் அந்த பெரிய வண்ணமயமான சுவையான ஆரஞ்சுகளை விரும்பவில்லை*), ஆனால் அதே வடிவமாகவே பொருள்படுத்தப்படவேண்டும். ஆகவே, மொழியை கையாள நமது புதிய நியூரல் நெட்வொர்க்கு வகைகள், உதாரணமாக *ஆரம்ப நெட்வொர்க்குகள்* மற்றும் *டிரான்ஸ்ஃபார்மர்கள்* அறிமுகப்படுத்த வேண்டியிருக்கும். -* **கேள்வி பதில்** (Question answering) என்பது ஒரு மாடல் குறிப்பிட்ட கேள்விக்கு பதிலளிக்கக் கூடிய திறனை குறிக்கிறது. மாடல் ஒரு உரை பகுதி மற்றும் ஒரு கேள்வியை உள்ளீடுகளாகப் பெறுகிறது, மற்றும் கேள்விக்கு பதில் உள்ள இடத்தை உரையில் வழங்க வேண்டும் (அல்லது, சில நேரங்களில், பதில் உரையை உருவாக்க வேண்டும்). +## நூலகங்கள் நிறுவுதல் -* **உரை உருவாக்கல்** (Text Generation) என்பது ஒரு மாடல் புதிய உரையை உருவாக்கும் திறனை குறிக்கிறது. இது ஒரு வகைப்படுத்தல் பணியாகக் கருதப்படலாம், இது *உரைத் தூண்டுதல்* (text prompt) அடிப்படையில் அடுத்த எழுத்து/வார்த்தையை கணிக்கிறது. GPT-3 போன்ற மேம்பட்ட உரை உருவாக்கல் மாடல்கள், [prompt programming](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) அல்லது [prompt engineering](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29) என்ற தொழில்நுட்பத்தைப் பயன்படுத்தி வகைப்படுத்தல் போன்ற பிற NLP பணிகளைத் தீர்க்க முடியும். - -* **உரை சுருக்கம்** (Text summarization) என்பது ஒரு கணினி நீண்ட உரையை "படித்து" சில வாக்கியங்களில் சுருக்க வேண்டும். - -* **இயந்திர மொழிபெயர்ப்பு** (Machine translation) என்பது ஒரு மொழியில் உரையைப் புரிந்து கொள்ளுதல் மற்றும் மற்றொரு மொழியில் உரை உருவாக்குதல் ஆகியவற்றின் கலவையாகக் கருதலாம். - -தொடக்கத்தில், பல NLP பணிகள் பாரம்பரிய முறைகளைப் பயன்படுத்தி தீர்க்கப்பட்டன, உதாரணமாக, இலக்கணங்கள். இயந்திர மொழிபெயர்ப்பில், ஆரம்ப வாக்கியத்தை ஒரு இலக்கண மரமாக மாற்ற பார்சர்கள் பயன்படுத்தப்பட்டன, பின்னர் வாக்கியத்தின் அர்த்தத்தை பிரதிபலிக்கும் உயர் நிலை அர்த்த அமைப்புகள் எடுக்கப்பட்டன, மற்றும் இந்த அர்த்தத்தின் அடிப்படையில் மற்றும் இலக்கு மொழியின் இலக்கணத்தின் அடிப்படையில் முடிவு உருவாக்கப்பட்டது. இன்று, பல NLP பணிகள் நரம்பியல் வலையமைப்புகளைப் பயன்படுத்தி மேலும் பயனுள்ளதாக தீர்க்கப்படுகின்றன. - -> பல பாரம்பரிய NLP முறைகள் [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org) Python நூலகத்தில் செயல்படுத்தப்பட்டுள்ளன. [NLTK புத்தகம்](https://www.nltk.org/book/) ஆன்லைனில் கிடைக்கிறது, இது NLTK-ஐப் பயன்படுத்தி வெவ்வேறு NLP பணிகளை எப்படி தீர்க்கலாம் என்பதைப் பற்றிக் கூறுகிறது. - -இந்த பாடத்தில், நாங்கள் பெரும்பாலும் NLP க்கு நரம்பியல் வலையமைப்புகளைப் பயன்படுத்துவதில் கவனம் செலுத்துவோம், மேலும் தேவையான இடங்களில் NLTK-ஐப் பயன்படுத்துவோம். - -நாங்கள் ஏற்கனவே டேபிள் தரவுகள் மற்றும் படங்களுக்கான நரம்பியல் வலையமைப்புகளைப் பயன்படுத்துவது பற்றி கற்றுக்கொண்டுள்ளோம். இந்த தரவுகளின் வகைகள் மற்றும் உரையின் இடையே முக்கியமான வேறுபாடு என்னவென்றால், உரை என்பது மாறும் நீளத்துடன் கூடிய வரிசையாகும், ஆனால் படங்களின் வழக்கில் உள்ளீட்டு அளவு முன்கூட்டியே தெரிந்திருக்கும். குவியல்களால் (convolutional networks) உள்ளீட்டு தரவிலிருந்து முறைமைகளை எடுக்க முடியும், ஆனால் உரையில் உள்ள முறைமைகள் மேலும் சிக்கலானவை. உதாரணமாக, *நான் ஆரஞ்சுகளை விரும்பவில்லை* மற்றும் *நான் அந்த பெரிய வண்ணமயமான சுவையான ஆரஞ்சுகளை விரும்பவில்லை* போன்ற வாக்கியங்களில் மறுப்பு (negation) பொருளிலிருந்து பல வார்த்தைகளால் பிரிக்கப்பட்டிருக்கலாம், ஆனால் இது ஒரு முறைமையாகவே பொருள் கொள்ள வேண்டும். எனவே, மொழியை கையாள நாங்கள் புதிய நரம்பியல் வலையமைப்பு வகைகளை அறிமுகப்படுத்த வேண்டும், உதாரணமாக *மீளும் வலையமைப்புகள்* (recurrent networks) மற்றும் *மாற்றிகள்* (transformers). - -## நூலகங்களை நிறுவுதல் - -இந்த பாடத்தை இயக்குவதற்கான உள்ளூர் Python நிறுவலை நீங்கள் பயன்படுத்தினால், கீழே உள்ள கட்டளைகளைப் பயன்படுத்தி NLP க்கு தேவையான அனைத்து நூலகங்களையும் நிறுவ வேண்டும்: +நீங்கள் இந்த பாடத்திட்டத்தைக் கணினியில் உள்ள பைதான் நிறுவலைப் பயன்படுத்தி இயக்கினால், கீழ்காணும் கட்டளைகளைப் பயன்படுத்தி NLP க்கான தேவையான அனைத்து நூலகங்களையும் நிறுவ வேண்டும்: **PyTorch க்கு** ```bash -pip install -r requirements-torch.txt +pip install -r requirements-pytorch.txt ``` **TensorFlow க்கு** ```bash pip install -r requirements-tf.txt ``` -> TensorFlow-ஐப் பயன்படுத்தி NLP-ஐ [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) இல் முயற்சிக்கலாம் ## GPU எச்சரிக்கை -இந்த பிரிவில், சில உதாரணங்களில், நாங்கள் மிகவும் பெரிய மாடல்களைப் பயிற்சி செய்யப் போகிறோம். -* **GPU-இயக்கப்பட்ட கணினியைப் பயன்படுத்தவும்**: பெரிய மாடல்களுடன் வேலை செய்யும்போது காத்திருக்கும் நேரத்தை குறைக்க GPU-இயக்கப்பட்ட கணினியில் உங்கள் நோட்புக்குகளை இயக்க பரிந்துரைக்கப்படுகிறது. -* **GPU நினைவக கட்டுப்பாடுகள்**: GPU-இல் இயக்குவது, குறிப்பாக பெரிய மாடல்களைப் பயிற்சி செய்யும்போது, GPU நினைவகம் குறைவாக இருக்கும் சூழல்களை உருவாக்கலாம். -* **GPU நினைவக பயன்பாடு**: பயிற்சியின் போது GPU நினைவக பயன்பாட்டின் அளவு, மினிபேட்ச் அளவு உள்ளிட்ட பல காரணிகளின் அடிப்படையில் மாறுபடும். -* **மினிபேட்ச் அளவை குறைக்கவும்**: GPU நினைவக பிரச்சினைகளை எதிர்கொள்வீர்கள் என்றால், உங்கள் குறியீட்டில் மினிபேட்ச் அளவை குறைப்பதை ஒரு தீர்வாகக் கருதவும். -* **TensorFlow GPU நினைவக வெளியீடு**: Python கர்னலில் பல மாடல்களைப் பயிற்சி செய்யும்போது, TensorFlow-இன் பழைய பதிப்புகள் GPU நினைவகத்தை சரியாக வெளியிடாமல் இருக்கலாம். GPU நினைவக பயன்பாட்டை திறமையாக நிர்வகிக்க, தேவையான போது GPU நினைவகத்தை ஒதுக்க TensorFlow-ஐ அமைக்கலாம். -* **குறியீட்டு சேர்க்கை**: GPU நினைவக ஒதுக்கீட்டை தேவையான போது மட்டுமே வளரச் செய்ய, உங்கள் நோட்புக்குகளில் கீழே உள்ள குறியீட்டைச் சேர்க்கவும்: +இந்தப் பிரிவில், சில உதாரணங்களில் நாங்கள் பெரிய மாதிரிகளை பயிற்சி செய்யப் போகிறோம். +* **GPU-ஐ இயக்கு கணினியைப் பயன்படுத்தவும்**: பெரிய மாதிரிகளுடன் வேலை செய்யும் போது காத்திருக்கும் நேரங்களை குறைக்க GPU இயக்கு கணினியில் உங்கள் நோட்புக்களை இயக்க பரிந்துரைக்கப்படுகிறது. +* **GPU நினைவகத் தடைகள்**: பெரிய மாதிரிகள் பயிற்சி செய்யும் போது GPU நினைவகம் மூடிவிடும் நிலைகள் ஏற்படலாம். +* **GPU நினைவக பயன்பாடு**: பயிற்சியின் போது பயன்படுத்தப்படும் GPU நினைவக அளவு பல காரணிகளால் பாதிக்கப்படும், அதில் மினிபேட்ச்(குழு அளவு) முக்கியம். +* **மினிபேட்ச் அளவை சிறியது செய்யவும்**: GPU நினைவக பிரச்சினைகள் இருந்தால், உங்கள் குறியீட்டில் மினிபேட்ச் அளவை குறைப்பதைக் கவனிக்கவும். +* **TensorFlow GPU நினைவகம் வெளியேற்றம்**: பழைய TensorFlow பதிப்புகள் ஒரே Python கர்னலில் பல மாதிரிகள் பயிற்சியிடும் போது GPU நினைவகத்தை சரியாக விடு விடாமலிருக்கும். GPU நினைவகத்தை சீராக நிர்வகிக்க, தேவைப்பட்டால் மட்டுமே GPU நினைவகம் ஒதுக்க TensorFlow ஐ அமைக்கலாம். +* **குறியீட்டு உள்ளடக்கம்**: 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) ``` -பாரம்பரிய ML பார்வையில் இருந்து NLP பற்றி கற்றுக்கொள்ள ஆர்வமாக இருந்தால், [இந்த பாடங்களின் தொகுப்பை](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP) பார்வையிடவும். +நீங்கள் பாரம்பரிய எம்பிஎல் (ML) பார்வையில் 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) +* [உரை துணைப்பொருள்களாக (tensors) பிரதிநிதிக்கும்](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) என்ற AI மொழிபெயர்ப்பு சேவையை பயன்படுத்தி மொழிபெயர்க்கப்பட்டுள்ளது. எங்கள் நோக்கம் துல்லியமாக இருக்க வேண்டும் என்பதுதான், ஆனால் தானியங்கி மொழிபெயர்ப்புகளில் பிழைகள் அல்லது துல்லியமின்மைகள் இருக்கக்கூடும் என்பதை தயவுசெய்து கவனத்தில் கொள்ளவும். அதன் தாய்மொழியில் உள்ள மூல ஆவணம் அதிகாரப்பூர்வ ஆதாரமாக கருதப்பட வேண்டும். முக்கியமான தகவல்களுக்கு, தொழில்முறை மனித மொழிபெயர்ப்பு பரிந்துரைக்கப்படுகிறது. இந்த மொழிபெயர்ப்பைப் பயன்படுத்துவதால் ஏற்படும் எந்த தவறான புரிதல்கள் அல்லது தவறான விளக்கங்களுக்கு நாங்கள் பொறுப்பல்ல. \ No newline at end of file + +**மறுப்பு**: +இந்த ஆவணம் AI மொழிபெயர்ப்பு சேவை [Co-op Translator](https://github.com/Azure/co-op-translator) பயன்படுத்தி மொழிபெயர்க்கப்பட்டுள்ளது. நாங்கள் துல்லியத்திற்காக முயற்சி செய்துள்ளோம், ஆனால் தானாக செய்யப்படும் மொழிபெயர்ப்புகளில் பிழைகள் அல்லது தவறுகள் இருக்கலாம் என்பதை கவனத்தில் கொள்ளவும். அசல் ஆவணம் அதன் தாய்மொழியில் அதிகாரப்பூர்வ ஆதாரமாக கருதப்பட வேண்டும். முக்கியமான தகவல்களுக்கு, தொழில்நுட்பமான மனித மொழிபெயர்ப்பு பரிந்துரைக்கப்படுகிறது. இந்த மொழிபெயர்ப்பைப் பயன்படுத்துவதால் ஏற்படும் எந்த தவறான புரிதல்கள் அல்லது தவறான விளக்கத்திற்கும் நாங்கள் பொறுப்பில்வில்லை. + \ No newline at end of file diff --git a/translations/te/.co-op-translator.json b/translations/te/.co-op-translator.json index a0f4bad9dd..787fd14e62 100644 --- a/translations/te/.co-op-translator.json +++ b/translations/te/.co-op-translator.json @@ -5,6 +5,12 @@ "source_file": "AGENTS.md", "language_code": "te" }, + "CONTRIBUTING.md": { + "original_hash": "c6fd7e781b67111a90abd166d0ce4aa0", + "translation_date": "2026-07-08T18:24:41+00:00", + "source_file": "CONTRIBUTING.md", + "language_code": "te" + }, "README.md": { "original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b", "translation_date": "2026-04-06T16:08:14+00:00", @@ -17,6 +23,19 @@ "source_file": "SECURITY.md", "language_code": "te" }, + "__translation_failures__": { + "lessons/sketchnotes/LICENSE.md": { + "original_hash": "45ab63a2cd8f5faef6c9b150618837a4", + "source_file": "lessons/sketchnotes/LICENSE.md", + "language_code": "te", + "failure_date": "2026-07-08T18:24:16+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-11-25T20:21:56+00:00", @@ -54,8 +73,8 @@ "language_code": "te" }, "examples/README.md": { - "original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7", - "translation_date": "2025-11-25T20:32:59+00:00", + "original_hash": "7883d52c2e2a221e0b07a7b112a149b9", + "translation_date": "2026-07-08T18:20:41+00:00", "source_file": "examples/README.md", "language_code": "te" }, @@ -66,8 +85,8 @@ "language_code": "te" }, "lessons/0-course-setup/how-to-run.md": { - "original_hash": "a4717bd9103b9f6cd84d534b83534689", - "translation_date": "2026-01-16T07:36:36+00:00", + "original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1", + "translation_date": "2026-07-08T18:20:58+00:00", "source_file": "lessons/0-course-setup/how-to-run.md", "language_code": "te" }, @@ -191,6 +210,12 @@ "source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md", "language_code": "te" }, + "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": { + "original_hash": "99b816b6a4957ef4100cee4c4221dff9", + "translation_date": "2026-07-08T18:10:33+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", + "language_code": "te" + }, "lessons/4-ComputerVision/08-TransferLearning/lab/README.md": { "original_hash": "7765935c35fcee69b9fe2d0cfd6963e2", "translation_date": "2025-11-25T22:43:23+00:00", @@ -330,8 +355,8 @@ "language_code": "te" }, "lessons/5-NLP/README.md": { - "original_hash": "8ef02a9318257ea140ed3ed74442096d", - "translation_date": "2025-11-25T21:12:36+00:00", + "original_hash": "038df6f1a73e49f6430740da083bfd6d", + "translation_date": "2026-07-08T18:21:20+00:00", "source_file": "lessons/5-NLP/README.md", "language_code": "te" }, diff --git a/translations/te/CONTRIBUTING.md b/translations/te/CONTRIBUTING.md new file mode 100644 index 0000000000..e27ec9335c --- /dev/null +++ b/translations/te/CONTRIBUTING.md @@ -0,0 +1,29 @@ +# AI-For-Beginners కి సహకరించడం + +AI-For-Beginners లో సహకరించడానికి మీ ఆసక్తికి ధన్యవాదాలు! మేము అనువాదాలు, పాఠం సవరణలు మరియు ఫార్మాటింగ్ సరిదిద్దుటలను స్వాగతిస్తాము. + +## Microsoft సహకారదారు లైసెన్స్ ఒప్పందం (CLA) + +ఈ ప్రాజెక్ట్ సహకారాలు మరియు సూచనలను స్వాగతిస్తుంది. ఎక్కువ భాగమైన సహకారాలకు మీరు ఒక సహకారదారు లైసెన్స్ ఒప్పందాన్ని (CLA) అంగీకరించాల్సి ఉంటుంది, ఇది మీరు మీ సహకారాన్ని ఉపయోగించే హక్కుల కలిగి ఉన్నారని మరియు వాటిని మాకు ఇవ్వడం జరిగింది అని ప్రకటిస్తుంది. వివరాలకు, [https://cla.microsoft.com](https://cla.microsoft.com) ను చూడండి. + +మీరు ఒక పుల్ రిక్వెస్ట్ సబ్మిట్ చేసినప్పుడు, CLA-బాట్ స్వయంచాలకంగా మీరు CLA అందించాల్సి ఉందో లేదో నిర్ణయించి PR ను తగినట్లు అలంకరిస్తుంది (ఉదాహరణకు, లేబుల్, వ్యాఖ్య). బాట్ ఇచ్చే సూచనలను పాటించండి. మా CLA ఉపయోగించే అన్ని రెపోల్లో మీరు ఒక్కసారి దీన్ని చేయవలసి ఉంటుంది. + +## ఎలా సహకరించాలి + +### 1. టైపోస్ / కోడ్ పొరపాట్లు సరిచేయడం +మీరు ఏ Jupyter నోట్‌బుక్ లేదా పాఠం మార్క్‌డౌన్ ఫైలులో టైపో లేదా బగ్ కనుగొన్నట్లయితే: +1. రెపోను ఫోర్క్ చేయండి. +2. టైపో లేదా బ్రోకెన్ లింక్ ని సరిచేయండి. +3. సరిదిద్దిన విషయమును స్పష్టంగా వివరించునట్లు పుల్ రిక్వెస్ట్ సబ్మిట్ చేయండి. + +### 2. అనువాదాలను సమర్పించడం +మేము పాఠాలను మరొక భాషలకు అనువాదాలను స్వాగతిస్తాము! దయచేసి అనువాదాలను ప్రస్తుతం ఉన్న ఫొల్డర్ పేర్లను ఉపయోగించుకుని `translations/` డైరెక్టరీ కింద ఉంచండి (ఉదాహరణకు `translations/es/`, `translations/pt-BR/`, `translations/zh-CN/`). + +మరిన్ని వివరాలకు, [etc/CONTRIBUTING.md](etc/CONTRIBUTING.md) ను చూడండి. + +--- + + +**అస్వీకరణ**: +ఈ పత్రం AI అనువాద సేవ [Co-op Translator](https://github.com/Azure/co-op-translator) ఉపయోగించి అనువదించబడింది. మేము ఖచ్చితత్వానికి ప్రయత్నిస్తున్నప్పటికీ, ఆటోమేటెడ్ అనువాదాలు తప్పులు లేదా అసమగ్రతలను కలిగి ఉండవచ్చు. దాని స్వదేశ భాషలో ఉన్న అసలు పత్రాన్ని అధికారం కలిగిన మూలంగా పరిగణించాలి. కీలకమైన సమాచారం కోసం, ప్రొఫెషనల్ మానవ అనువాదాన్ని సిఫారసు చేస్తాము. ఈ అనువాదం ఉపయోగం వల్ల కలిగే ఏవైనా అపార్థాలు లేదా తప్పుదారులు కోసం మేము బాధ్యత వహించము. + \ No newline at end of file diff --git a/translations/te/examples/README.md b/translations/te/examples/README.md index dc570f20dd..3aec9841e3 100644 --- a/translations/te/examples/README.md +++ b/translations/te/examples/README.md @@ -1,87 +1,87 @@ -# ప్రారంభికులకు అనుకూలమైన 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 -# పైథాన్ స్క్రిప్టుల కోసం +# పైన స్క్రిప్టుల కోసం pip install numpy -# జూపైటర్ నోట్‌బుక్స్ (చిత్ర వర్గీకర్త) కోసం +# జూయపిటర్ నోట్బుక్స్ (చిత్ర వర్గీకరించే యంత్రం) కోసం pip install jupyter numpy pillow tensorflow ``` -లేదా ప్రధాన పాఠ్యాంశం నుండి conda వాతావరణాన్ని ఉపయోగించండి: +లేదా ప్రధాన పాఠ్యాంశం నుండి కిందా వాతావరణాన్ని ఉపయోగించండి: ```bash conda env create --name ai4beg --file ../environment.yml 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. **Image Classifier ప్రయత్నించండి** - వాస్తవ చిత్రాలతో AI కార్యకలాపాలను చూడు +4. **టెక్స్ట్ భావాన్ని విశ్లేషించండి** - సహజ భాషా ప్రాసెసింగ్ పరిశీలించండి ## 💡 ప్రారంభికులకు సూచనలు -- **కోడ్ వ్యాఖ్యలను జాగ్రత్తగా చదవండి** - ప్రతి లైన్ ఏమి చేస్తుందో అవి వివరించాయి -- **ప్రయోగాలు చేయండి!** - విలువలను మార్చి ఫలితాలను చూడండి -- **అన్నీ అర్థం చేసుకోవాలని ఆందోళన చెందకండి** - నేర్చుకోవడానికి సమయం పడుతుంది -- **ప్రశ్నలు అడగండి** - [చర్చా బోర్డు](https://github.com/microsoft/AI-For-Beginners/discussions) ఉపయోగించండి +- **కోడ్ వ్యాఖ్యలను జాగ్రత్తగా చదవండి** - ప్రతి లైన్ ఏమి చేస్తుందో వివరిస్తాయి +- **ప్రయోగించండి!** - విలువలను మార్చి ఫలితాల్ని చూసుకోండి +- **అన్నీ అర్థం చేసుకోవాలని బతకవద్దు** - నేర్చుకోవడానికి సమయం పడుతుంది +- **ప్రశ్నలు అడగండి** - [విచారణ విభాగం](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) ఉపయోగించి అనువదించబడింది. మేము ఖచ్చితత్వానికి ప్రయత్నించినప్పటికీ, ఆటోమేటెడ్ అనువాదాల్లో పొరపాట్లు లేదా తప్పిదాలు ఉండవచ్చు. మూల పత్రం దాని స్వదేశీ భాషలో అధికారిక మూలంగా పరిగణించాలి. ముఖ్యమైన సమాచారానికి, ప్రొఫెషనల్ మానవ అనువాదం సిఫార్సు చేయబడుతుంది. ఈ అనువాదం వాడకం వల్ల కలిగే ఏవైనా అపార్థాలు లేదా తప్పుదారుల బాధ్యత మేము తీసుకోము. +**అస్వీకరణ**: +ఈ పత్రం AI అనువాద సేవ [Co-op Translator](https://github.com/Azure/co-op-translator) ఉపయోగించి అనువదించబడింది. మేము ఖచ్చితత్వానికి ప్రయత్నిస్తున్నప్పటికీ, ఆటోమేటెడ్ అనువాదాలు తప్పులు లేదా అసమగ్రతలను కలిగి ఉండవచ్చు. దాని స్వదేశ భాషలో ఉన్న అసలు పత్రాన్ని అధికారం కలిగిన మూలంగా పరిగణించాలి. కీలకమైన సమాచారం కోసం, ప్రొఫెషనల్ మానవ అనువాదాన్ని సిఫారసు చేస్తాము. ఈ అనువాదం ఉపయోగం వల్ల కలిగే ఏవైనా అపార్థాలు లేదా తప్పుదారులు కోసం మేము బాధ్యత వహించము. \ No newline at end of file diff --git a/translations/te/lessons/0-course-setup/how-to-run.md b/translations/te/lessons/0-course-setup/how-to-run.md index 61a93060c2..583166c89b 100644 --- a/translations/te/lessons/0-course-setup/how-to-run.md +++ b/translations/te/lessons/0-course-setup/how-to-run.md @@ -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 ఉపయోగించడం +### Python ఎక్స్‌టెన్షన్‌తో 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) లో [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 ఎన్విరాన్‌మెంట్ ఉపయోగించవచ్చు. సంప్రదాయ Jupyter, జూపిటర్‌హబ్ రెండూ ఆటో-కంప్లీషన్, కోడ్ హైలైటింగ్ మొదలైన సౌకర్యాలతో ఒక సౌకర్యవంతమైన అభివృద్ధి వాతావరణం అందిస్తాయి. +మీరు మీ స్వంత కంప్యూటర్ లో బ్రౌజర్ ద్వారా కూడా Jupyter ఎన్విరాన్‌మెంట్ ఉపయోగించుకోవచ్చు. క్లాసికల్ Jupyter మరియు JupyterHub రెండూ ఆటో-కంప్లీషన్, కోడ్ హైలైటింగ్ వంటి సౌకర్యాలను కలిగి ఉండే అభివృద్ధి వాతావరణాన్ని అందిస్తాయి. -స్థానికంగా Jupyter ప్రారంభించటానికి, కోర్సు డైరెక్టరీకి వెళ్ళి ఈ ఆదేశాలను అమలుచేయండి: +స్థానికంగా Jupyter ప్రారంభించడానికి, కోర్సు డైరెక్టరీకి వెళ్లి, క్రింది విధంగా అమలు చేయండి: ```bash jupyter notebook ``` -or + లేదా ```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 లో ఓపెన్ చేయొచ్చు - ఇది వేగంగా బైండర్ సైటుకు తీసుకెళ్లి, మీకు బ్యాక్‌గ్రౌండ్‌లో కంటైనర్ నిర్మించి 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) cloud లో ఉచిత కంప్యూటింగ్ వనరులను అందిస్తుంది, మీరు GitHub పై కొన్ని కోడ్‌ను పరీక్షించే అవకాశం కలుగుతుంది. ముందుముఖ పేజీలో రిపోను Binder లో తెరవడానికి ఒక బటన్ ఉంటుంది - ఇది త్వరగా బైండర్ సైట్‌కు తీసుకెళ్లుతుంది, అక్కడ వెనుకనుంచి కంటైనర్ తయారు చేసి Jupyter వెబ్ ఇంటర్‌ఫేస్‌ను మీకు ప్రారంభిస్తుంది. -> **గమనిక**: తప్పుగా ఉపయోగించడం నివారించడానికి, Binder కు కొన్ని వెబ్ వనరుల యాక్సెస్ బ్లాక్ చేయబడింది. ఇది కొంత కోడ్ పనిచేయడానికి నిరోధకమవచ్చు, ముఖ్యంగా ఇండిపబ్లిక్ ఇంటర్నెట్ నుండి మోడల్స్ మరియు/లేదా డేటాసెట్లు పొందే సందర్భంలో. మీరు కొంత పరిష్కారాలు కనుగొంటారు కావచ్చు. అదనంగా, Binder అందించే కంప్యూట్ వనరులు బేసిక్ స్థాయి మాత్రమే, కాబట్టి మందగమన శిక్షణ వేళ్లలో నిబంధన మీరిద్దరు తప్పకుండా నేర్చుకోవాలి. +> **గమనిక**: దుర్వినియోగాన్ని నివారించడానికి, Binder కొన్ని వెబ్ వనరులకు ప్రాప్తిని నిరోధిస్తుంది. ఇది కొంత కోడ్ పనిచేయకుండా ఉండవచ్చు, అది మోడల్స్ మరియు/లేదా డేటాసెట్లను పబ్లిక్ ఇంటర్నెట్ నుండి తీసుకొంటుంది. మీరు కొన్ని మార్గాల్ని కనుగొనవలసి వస్తుంది. అలాగే, Binder అందించే కంప్యూటింగ్ వనరులు బేసిక్, అందుచేత శిక్షణ నెమ్మదిగా జరుగుతుంది, ముఖ్యంగా తర్వాతి, మరింత క్లిష్టమైన పాఠాల్లో. -## GPU తో క్లౌడ్‌లో నడపడం +## GPU తో క్లౌడ్ లో నడపడం -ఈ పాఠ్యక్రమం యొక్క కొంతమంది తరువాతి పాఠాలు GPU మద్దతుతో గణనీయంగా ప్రయోజనం పొందుతాయి. మోడల్ శిక్షణ, ఉదాహరణకి, లేకపోతే బాగా మందగమనంగా ఉంటుంది. మీరు అనుసరించగల కొంత ఎంపికలు ఉన్నాయి, ముఖ్యంగా మీరు క్లౌడ్‌కు యాక్సెస్ ఉంటే [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) లేదా మీ సంస్థ ద్వారా: +ఈ పాఠ్యాంశంలోని కొన్ని తర్వాతి పాఠాలు GPU మద్దతుతో చాలా ప్రయోజనకరం. ఉదాహరణకు మodel శిక్షణ అనగా ఎక్కువ సమయం పడతుంది. మీరు అనుసరించగల కొన్ని ఎంపికలు ఉన్నాయి, ముఖ్యంగా మీకు క్లౌడ్‌కి ప్రాప్తి ఉంటే, [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) ను సృష్టించండి మరియు Jupyter ద్వారా దానికి కనెక్ట్ అవ్వండి. మీరు ఆ మెషీన్లోనే రిపోను క్లోన్ చేసి, నేర్చడాన్ని ప్రారంభించవచ్చు. NC-సిరీస్ VM లు 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) సృష్టించి అక్కడ Notebook ఫీచర్ ఉపయోగించండి. [ఈ వీడియో](https://azure-for-academics.github.io/quickstart/azureml-papers/)లో ఎలా రిపోజిటరీని Azure ML నోట్‌బుక్ లో క్లోన్ చేసి ఉపయోగించాలో చూపిస్తున్నది. -మీరు Google Colab కూడా ఉపయోగించవచ్చు, ఇది కొంత ఉచిత GPU మద్దతుతో వస్తుంది, మరియు అక్కడ Jupyter నోట్బుక్స్‌ను ఒక్కొక్కటి అప్లోడ్ చేసి అమలు చేయవచ్చు. +మీరు Google Colab కూడా ఉపయోగించవచ్చు, ఇది కొంత ఉచిత GPU మద్దతుతో వస్తుంది, మరియు అక్కడ Jupyter నోట్బుక్లను ఒకదాని తర్వాత ఒకటి అప్లోడ్ చేసి అమలు చేయవచ్చు. --- -**డిస్క్లెయిమర్**: -ఈ డాక్యుమెంట్‌ను AI అనువాద సేవ [Co-op Translator](https://github.com/Azure/co-op-translator) ను ఉపయోగించి అనువదించబడింది. మేము సరిగ్గా అనువదించేందుకు గట్టిగా శ్రమిస్తునప్పటికీ, స్వయంచాలక అనువాదాలలో పొరపాట్లు లేదా తప్పులు ఉండవచ్చు అనే విషయాన్ని దయచేసి గమనించండి. అసలు డాక్యుమెంట్ native భాషలో ఉనికివున్న డాక్యుమెంట్‌ను ప్రామాణిక మూలంగా పరిగణించాలి. ముఖ్యమైన సమాచారం కోసం, వృత్తిపరమైన మానవ అనువాదాన్ని సూచిస్తాము. ఈ అనువాదం వలన ఏర్పడే ఏదైనా అవగాహనలు లేదా తప్పు అర్థపరిచయాలకు మేము బాధ్యత వహించము. +**అస్వీకరణ**: +ఈ పత్రం AI అనువాద సేవ [Co-op Translator](https://github.com/Azure/co-op-translator) ఉపయోగించి అనువదించబడింది. మేము ఖచ్చితత్వానికి ప్రయత్నిస్తున్నప్పటికీ, ఆటోమేటెడ్ అనువాదాలు తప్పులు లేదా అసమగ్రతలను కలిగి ఉండవచ్చు. దాని స్వదేశ భాషలో ఉన్న అసలు పత్రాన్ని అధికారం కలిగిన మూలంగా పరిగణించాలి. కీలకమైన సమాచారం కోసం, ప్రొఫెషనల్ మానవ అనువాదాన్ని సిఫారసు చేస్తాము. ఈ అనువాదం ఉపయోగం వల్ల కలిగే ఏవైనా అపార్థాలు లేదా తప్పుదారులు కోసం మేము బాధ్యత వహించము. \ No newline at end of file diff --git a/translations/te/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/te/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index 1918b857d4..e62b3652f7 100644 --- a/translations/te/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/te/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -1,1497 +1,1502 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# ముందుగా శిక్షణ పొందిన మోడల్స్ మరియు ట్రాన్స్‌ఫర్ లెర్నింగ్\n", - "\n", - "CNNలను శిక్షణ ఇవ్వడం చాలా సమయం తీసుకోవచ్చు, మరియు ఆ పనికి చాలా డేటా అవసరం. అయితే, ఎక్కువ సమయం నెట్‌వర్క్ ఇమేజ్‌ల నుండి నమూనాలను తీసుకోవడానికి ఉపయోగించే ఉత్తమ లో-లెవల్ ఫిల్టర్లను నేర్చుకోవడంలో వెళుతుంది. ఒక సహజమైన ప్రశ్న ఉత్పన్నమవుతుంది - ఒక డేటాసెట్‌పై శిక్షణ పొందిన న్యూరల్ నెట్‌వర్క్‌ను ఉపయోగించి, పూర్తి శిక్షణ ప్రక్రియ లేకుండా వేరే ఇమేజ్‌లను వర్గీకరించడానికి దాన్ని అనుకూలపరచగలమా?\n", - "\n", - "ఈ విధానం **ట్రాన్స్‌ఫర్ లెర్నింగ్** అని పిలవబడుతుంది, ఎందుకంటే మనం ఒక న్యూరల్ నెట్‌వర్క్ మోడల్ నుండి మరొకదానికి కొంత జ్ఞానం బదిలీ చేస్తాము. ట్రాన్స్‌ఫర్ లెర్నింగ్‌లో, సాధారణంగా మనం ముందుగా శిక్షణ పొందిన మోడల్‌తో ప్రారంభిస్తాము, ఇది **ImageNet** వంటి పెద్ద ఇమేజ్ డేటాసెట్‌పై శిక్షణ పొందింది. ఆ మోడల్స్ ఇప్పటికే సాధారణ ఇమేజ్‌ల నుండి వివిధ లక్షణాలను బాగా తీసుకోవడంలో నైపుణ్యం కలిగి ఉంటాయి, మరియు చాలా సందర్భాల్లో ఆ లక్షణాలపై కేవలం ఒక వర్గీకర్తను నిర్మించడం మంచి ఫలితాన్ని ఇస్తుంది.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import tensorflow as tf\n", - "from tensorflow import keras\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - "import os\n", - "from tfcv import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## పిల్లులు 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", - "\n", - "ఈ డేటాసెట్‌ను డౌన్లోడ్ చేసి `data` డైరెక్టరీలో ఎక్స్‌ట్రాక్ట్ చేద్దాం (ఈ ప్రక్రియ కొంత సమయం తీసుకోవచ్చు!):\n" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "if not os.path.exists('data/kagglecatsanddogs_5340.zip'):\n", - " !wget -P data https://download.microsoft.com/download/3/E/1/3E1C3F21-ECDB-4869-8368-6DEBA77B919F/kagglecatsanddogs_5340.zip" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "import zipfile\n", - "if not os.path.exists('data/PetImages'):\n", - " with zipfile.ZipFile('data/kagglecatsanddogs_5340.zip', 'r') as zip_ref:\n", - " zip_ref.extractall('data')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "దురదృష్టవశాత్తు, డేటాసెట్‌లో కొన్ని దెబ్బతిన్న చిత్రం ఫైళ్లు ఉన్నాయి. దెబ్బతిన్న ఫైళ్లను తనిఖీ చేయడానికి మేము త్వరిత శుభ్రపరిచే పనిని చేయాలి. ఈ ట్యుటోరియల్‌ను దెబ్బతినకుండా ఉండేందుకు, డేటాసెట్‌ను ధృవీకరించడానికి కోడ్‌ను ఒక మాడ్యూల్‌లోకి మార్చాము.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Corrupt image or wrong format: data/PetImages/Cat/12235.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/2663.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/4929.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/8183.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/11083.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/6435.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/6491.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/7968.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/6768.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/11397.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/8295.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/4874.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/23.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/11864.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/3491.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/11729.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/3197.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/10874.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/6376.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/9361.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/9328.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/910.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/2021.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/666.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/3710.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/9171.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/6906.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/11095.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/660.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/8415.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/3161.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/850.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/7003.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/1267.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/7642.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/8553.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/6900.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/4334.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/10404.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/6980.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/936.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/9619.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/3300.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/7647.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/2742.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/9565.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/1757.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/11874.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/1936.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/5077.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/7845.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/8832.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/11935.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/9208.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/4322.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/7978.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/10820.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/391.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/10073.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/8958.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/8470.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/445.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/4821.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/11565.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/4351.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/4833.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/140.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/3153.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/5370.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/5819.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/3649.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/4293.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/3967.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/1937.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/10125.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/1386.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/4750.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/6029.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/5614.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/2569.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/9778.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/6486.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/11210.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/7502.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/2189.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/1151.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/4629.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/12080.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/10501.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/1914.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/11086.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/4000.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/9100.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/5553.jpg\n", - "Corrupt image or wrong format: data/PetImages/Cat/12269.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/5243.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/3288.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/11912.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/3320.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/11166.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/8194.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/2353.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/9026.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/8557.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/7969.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/8693.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/4367.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/1900.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/5730.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/9961.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/8126.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/8521.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/11560.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/11233.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/11675.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/8889.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/9414.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/3588.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/10353.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/10733.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/6238.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/5618.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/7743.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/10747.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/6503.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/11410.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/5955.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/2915.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/3136.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/4086.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/2905.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/2494.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/3546.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/5547.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/9851.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/9188.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/4203.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/8715.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/4640.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/1866.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/7718.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/7514.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/1017.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/12102.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/296.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/6718.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/11253.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/10173.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/11849.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/10383.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/10678.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/5790.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/6318.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/1884.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/4654.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/9145.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/2479.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/12289.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/2688.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/4134.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/10637.jpg\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/anaconda/envs/py38_tensorflow/lib/python3.8/site-packages/PIL/TiffImagePlugin.py:793: UserWarning: Truncated File Read\n", - " warnings.warn(str(msg))\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Corrupt image or wrong format: data/PetImages/Dog/543.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/8730.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/12114.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/522.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/10863.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/10401.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/7739.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/561.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/1308.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/9643.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/3155.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/5736.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/4257.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/11853.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/6855.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/1259.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/7652.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/573.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/11702.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/414.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/4301.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/9500.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/10726.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/9367.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/2877.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/10907.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/10972.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/7311.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/10797.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/2317.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/7128.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/6500.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/11285.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/6430.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/6032.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/10969.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/8364.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/11692.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/3038.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/5604.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/565.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/9640.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/7459.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/6305.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/6555.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/11590.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/6059.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/3927.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/10705.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/2384.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/3885.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/663.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/9043.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/8563.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/9556.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/9967.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/10158.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/5263.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/8641.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/7369.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/4924.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/10351.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/6213.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/5104.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/1356.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/7133.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/7112.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/1168.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/719.jpg\n", - "Corrupt image or wrong format: data/PetImages/Dog/50.jpg\n" - ] - } - ], - "source": [ - "check_image_dir('data/PetImages/Cat/*.jpg')\n", - "check_image_dir('data/PetImages/Dog/*.jpg')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## డేటాసెట్ లోడ్ చేయడం\n", - "\n", - "మునుపటి ఉదాహరణల్లో, మేము Kerasలో నిర్మించిన డేటాసెట్లను లోడ్ చేసుకుంటున్నాము. ఇప్పుడు మనం మన స్వంత డేటాసెట్‌ను నిర్వహించబోతున్నాము, ఇది చిత్రాల డైరెక్టరీ నుండి లోడ్ చేయాలి.\n", - "\n", - "వాస్తవ జీవితంలో, చిత్ర డేటాసెట్ల పరిమాణం చాలా పెద్దగా ఉండవచ్చు, మరియు అన్ని డేటా మెమరీలో సరిపోవడం మీద ఆధారపడలేము. అందువల్ల, డేటాసెట్లు తరచుగా **జెనరేటర్ల** రూపంలో ఉంటాయి, ఇవి శిక్షణకు అనుకూలమైన మినీబ్యాచ్‌లలో డేటాను అందించగలవు.\n", - "\n", - "చిత్ర వర్గీకరణను నిర్వహించడానికి, Keras ప్రత్యేకమైన `image_dataset_from_directory` ఫంక్షన్‌ను కలిగి ఉంది, ఇది వేర్వేరు తరగతులకు సంబంధించిన ఉపడైరెక్టరీల నుండి చిత్రాలను లోడ్ చేయగలదు. ఈ ఫంక్షన్ చిత్రాలను స్కేల్ చేయడాన్ని కూడా చూసుకుంటుంది, అలాగే డేటాసెట్‌ను శిక్షణ మరియు పరీక్ష ఉపసమితులుగా విభజించగలదు:\n" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Found 24769 files belonging to 2 classes.\n", - "Using 19816 files for training.\n", - "Found 24769 files belonging to 2 classes.\n", - "Using 4953 files for validation.\n" - ] - } - ], - "source": [ - "data_dir = 'data/PetImages'\n", - "batch_size = 64\n", - "ds_train = keras.preprocessing.image_dataset_from_directory(\n", - " data_dir,\n", - " validation_split = 0.2,\n", - " subset = 'training',\n", - " seed = 13,\n", - " image_size = (224,224),\n", - " batch_size = batch_size\n", - ")\n", - "ds_test = keras.preprocessing.image_dataset_from_directory(\n", - " data_dir,\n", - " validation_split = 0.2,\n", - " subset = 'validation',\n", - " seed = 13,\n", - " image_size = (224,224),\n", - " batch_size = batch_size\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "రెండు కాల్స్‌కు ఒకే `seed` విలువను సెట్ చేయడం ముఖ్యం, ఎందుకంటే ఇది ట్రైన్ మరియు టెస్ట్ డేటాసెట్‌ల మధ్య చిత్రాల విభజనను ప్రభావితం చేస్తుంది.\n", - "\n", - "డేటాసెట్ ఆటోమేటిక్‌గా డైరెక్టరీల నుండి క్లాస్ పేర్లను తీసుకుంటుంది, అవసరమైతే మీరు వాటిని ఈ విధంగా యాక్సెస్ చేయవచ్చు:\n" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['Cat', 'Dog']" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ds_train.class_names" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "మేము పొందిన డేటాసెట్లను మోడల్‌ను శిక్షణ ఇవ్వడానికి నేరుగా `fit` ఫంక్షన్‌కు పంపవచ్చు. అవి సంబంధిత చిత్రాలు మరియు లేబుళ్లను రెండింటినీ కలిగి ఉంటాయి, వీటిని క్రింది నిర్మాణం ఉపయోగించి లూప్ చేయవచ్చు:\n" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Training batch shape: features=(64, 224, 224, 3), labels=(64,)\n" - ] - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "for x,y in ds_train:\n", - " print(f\"Training batch shape: features={x.shape}, labels={y.shape}\")\n", - " x_sample, y_sample = x,y\n", - " break\n", - " \n", - "display_dataset(x_sample.numpy().astype(np.int),np.expand_dims(y_sample,1),classes=ds_train.class_names)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "> **గమనిక**: డేటాసెట్‌లోని అన్ని చిత్రాలు 0-255 పరిధిలో ఫ్లోటింగ్ పాయింట్ టెన్సార్లుగా ప్రదర్శించబడ్డాయి. వాటిని న్యూరల్ నెట్‌వర్క్‌కు పంపించే ముందు, ఆ విలువలను 0-1 పరిధిలో స్కేల్ చేయాలి. చిత్రాలను ప్లాట్ చేయేటప్పుడు, అదే చేయాలి లేదా విలువలను `int` రకంగా మార్చాలి (మేము పై కోడ్‌లో ఇది చేస్తాము), తద్వారా `matplotlib`కి మేము అసలు స్కేల్ చేయని చిత్రాన్ని ప్లాట్ చేయాలనుకుంటున్నామని చూపించవచ్చు.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## ముందుగా శిక్షణ పొందిన మోడల్స్\n", - "\n", - "చాలా ఇమేజ్ వర్గీకరణ పనుల కోసం ముందుగా శిక్షణ పొందిన న్యూరల్ నెట్‌వర్క్ మోడల్స్‌ను కనుగొనవచ్చు. ఆ మోడల్స్‌లో చాలా భాగం `keras.applications` నేమ్‌స్పేస్‌లో అందుబాటులో ఉంటాయి, ఇంకా మరిన్ని మోడల్స్ ఇంటర్నెట్‌లో కూడా లభిస్తాయి. సులభమైన VGG-16 మోడల్‌ను ఎలా లోడ్ చేసి ఉపయోగించాలో చూద్దాం:\n" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Downloading data from https://storage.googleapis.com/tensorflow/keras-applications/vgg16/vgg16_weights_tf_dim_ordering_tf_kernels.h5\n", - "553467904/553467096 [==============================] - 6s 0us/step\n", - "Most probable class = [208]\n", - "Downloading data from https://storage.googleapis.com/download.tensorflow.org/data/imagenet_class_index.json\n", - "40960/35363 [==================================] - 0s 0us/step\n" - ] - }, - { - "data": { - "text/plain": [ - "[[('n02099712', 'Labrador_retriever', 0.5340957),\n", - " ('n02100236', 'German_short-haired_pointer', 0.0939442),\n", - " ('n02092339', 'Weimaraner', 0.08160535),\n", - " ('n02099849', 'Chesapeake_Bay_retriever', 0.057179328),\n", - " ('n02109047', 'Great_Dane', 0.03733857)]]" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "vgg = keras.applications.VGG16()\n", - "inp = keras.applications.vgg16.preprocess_input(x_sample[:1])\n", - "\n", - "res = vgg(inp)\n", - "print(f\"Most probable class = {tf.argmax(res,1)}\")\n", - "\n", - "keras.applications.vgg16.decode_predictions(res.numpy())" - ] - }, - { - "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" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "మనం VGG-16 నెట్‌వర్క్ యొక్క ఆర్కిటెక్చర్‌ను కూడా చూద్దాం:\n" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Model: \"vgg16\"\n", - "_________________________________________________________________\n", - "Layer (type) Output Shape Param # \n", - "=================================================================\n", - "input_1 (InputLayer) [(None, 224, 224, 3)] 0 \n", - "_________________________________________________________________\n", - "block1_conv1 (Conv2D) (None, 224, 224, 64) 1792 \n", - "_________________________________________________________________\n", - "block1_conv2 (Conv2D) (None, 224, 224, 64) 36928 \n", - "_________________________________________________________________\n", - "block1_pool (MaxPooling2D) (None, 112, 112, 64) 0 \n", - "_________________________________________________________________\n", - "block2_conv1 (Conv2D) (None, 112, 112, 128) 73856 \n", - "_________________________________________________________________\n", - "block2_conv2 (Conv2D) (None, 112, 112, 128) 147584 \n", - "_________________________________________________________________\n", - "block2_pool (MaxPooling2D) (None, 56, 56, 128) 0 \n", - "_________________________________________________________________\n", - "block3_conv1 (Conv2D) (None, 56, 56, 256) 295168 \n", - "_________________________________________________________________\n", - "block3_conv2 (Conv2D) (None, 56, 56, 256) 590080 \n", - "_________________________________________________________________\n", - "block3_conv3 (Conv2D) (None, 56, 56, 256) 590080 \n", - "_________________________________________________________________\n", - "block3_pool (MaxPooling2D) (None, 28, 28, 256) 0 \n", - "_________________________________________________________________\n", - "block4_conv1 (Conv2D) (None, 28, 28, 512) 1180160 \n", - "_________________________________________________________________\n", - "block4_conv2 (Conv2D) (None, 28, 28, 512) 2359808 \n", - "_________________________________________________________________\n", - "block4_conv3 (Conv2D) (None, 28, 28, 512) 2359808 \n", - "_________________________________________________________________\n", - "block4_pool (MaxPooling2D) (None, 14, 14, 512) 0 \n", - "_________________________________________________________________\n", - "block5_conv1 (Conv2D) (None, 14, 14, 512) 2359808 \n", - "_________________________________________________________________\n", - "block5_conv2 (Conv2D) (None, 14, 14, 512) 2359808 \n", - "_________________________________________________________________\n", - "block5_conv3 (Conv2D) (None, 14, 14, 512) 2359808 \n", - "_________________________________________________________________\n", - "block5_pool (MaxPooling2D) (None, 7, 7, 512) 0 \n", - "_________________________________________________________________\n", - "flatten (Flatten) (None, 25088) 0 \n", - "_________________________________________________________________\n", - "fc1 (Dense) (None, 4096) 102764544 \n", - "_________________________________________________________________\n", - "fc2 (Dense) (None, 4096) 16781312 \n", - "_________________________________________________________________\n", - "predictions (Dense) (None, 1000) 4097000 \n", - "=================================================================\n", - "Total params: 138,357,544\n", - "Trainable params: 138,357,544\n", - "Non-trainable params: 0\n", - "_________________________________________________________________\n" - ] - } - ], - "source": [ - "vgg.summary()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## GPU గణనలు\n", - "\n", - "VGG-16 మరియు ఇతర ఆధునిక ఆర్కిటెక్చర్ల వంటి డీప్ న్యూరల్ నెట్‌వర్క్స్ నడపడానికి చాలా గణన శక్తి అవసరం. GPU వేగవంతత అందుబాటులో ఉంటే దాన్ని ఉపయోగించడం బాగుంటుంది. అదృష్టవశాత్తూ, Keras GPU లపై గణనలను ఆటోమేటిక్‌గా వేగవంతం చేస్తుంది, అది అందుబాటులో ఉంటే. Tensorflow GPU ఉపయోగించగలదో లేదో క్రింది కోడ్ ద్వారా చెక్ చేసుకోవచ్చు:\n" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "tf.config.list_physical_devices('GPU')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## VGG ఫీచర్లను తీసుకోవడం\n", - "\n", - "మన చిత్రాల నుండి ఫీచర్లను తీసుకోవడానికి VGG-16 ఉపయోగించాలనుకుంటే, చివరి వర్గీకరణ లేయర్లు లేకుండా మోడల్ అవసరం. టాప్ లేయర్లు లేకుండా VGG-16 మోడల్‌ను ఈ కోడ్ ఉపయోగించి సృష్టించవచ్చు:\n" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Shape after applying VGG-16: (7, 7, 512)\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "vgg = keras.applications.VGG16(include_top=False)\n", - "\n", - "inp = keras.applications.vgg16.preprocess_input(x_sample[:1])\n", - "res = vgg(inp)\n", - "print(f\"Shape after applying VGG-16: {res[0].shape}\")\n", - "plt.figure(figsize=(15,3))\n", - "plt.imshow(res[0].numpy().reshape(-1,512))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "ఫీచర్ టెన్సార్ పరిమాణం 7x7x512 ఉంది, కానీ దాన్ని విజువలైజ్ చేయడానికి మేము దాన్ని 2D రూపంలో మార్చాల్సి వచ్చింది.\n", - "\n", - "ఇప్పుడు ఆ ఫీచర్లు చిత్రాలను వర్గీకరించడానికి ఉపయోగించగలమో చూడండి. మనం చేతితో కొన్ని చిత్రాల భాగాన్ని (మా సందర్భంలో 50 మినీబ్యాచ్లు) తీసుకుని, వాటి ఫీచర్ వెక్టర్లను ముందుగా లెక్కించవచ్చు. దీని కోసం Tensorflow **dataset** APIని ఉపయోగించవచ్చు. `map` ఫంక్షన్ ఒక dataset తీసుకుని ఇచ్చిన లాంబ్డా-ఫంక్షన్ ద్వారా దాన్ని మార్చుతుంది. మేము ఈ విధానాన్ని ఉపయోగించి కొత్త datasetలు, `ds_features_train` మరియు `ds_features_test`, తయారు చేస్తాము, ఇవి అసలు చిత్రాల స్థానంలో VGG ద్వారా తీసిన ఫీచర్లను కలిగి ఉంటాయి.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(64, 7, 7, 512) (64,)\n" - ] - } - ], - "source": [ - "num = batch_size*50\n", - "ds_features_train = ds_train.take(50).map(lambda x,y : (vgg(x),y))\n", - "ds_features_test = ds_test.take(10).map(lambda x,y : (vgg(x),y))\n", - "\n", - "for x,y in ds_features_train:\n", - " print(x.shape,y.shape)\n", - " break" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "మేము మా ప్రదర్శనను వేగవంతం చేయడానికి డేటాసెట్ పరిమాణాన్ని పరిమితం చేయడానికి `.take(50)` నిర్మాణాన్ని ఉపయోగించాము. మీరు ఖచ్చితంగా ఈ ప్రయోగాన్ని పూర్తి డేటాసెట్‌పై నిర్వహించవచ్చు.\n", - "\n", - "ఇప్పుడు మాకు ఎక్స్‌ట్రాక్ట్ చేసిన ఫీచర్లతో కూడిన డేటాసెట్ ఉన్నందున, మేము పిల్లులు మరియు కుక్కలను వేరుచేసే సాదా డెన్స్ క్లాసిఫయర్‌ను శిక్షణ ఇవ్వవచ్చు. ఈ నెట్‌వర్క్ (7,7,512) ఆకారంలోని ఫీచర్ వెక్టర్‌ను తీసుకుని, కుక్క లేదా పిల్లి ఏదో ఒకదానికి సరిపడే ఒక అవుట్పుట్‌ను ఉత్పత్తి చేస్తుంది. ఇది ద్విభాగ క్లాసిఫికేషన్ కావడంతో, మేము `sigmoid` యాక్టివేషన్ ఫంక్షన్ మరియు `binary_crossentropy` లాస్‌ను ఉపయోగిస్తాము.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "50/50 [==============================] - 1896s 38s/step - loss: 1.4845 - acc: 0.9144 - val_loss: 0.7220 - val_acc: 0.9516\n" - ] - } - ], - "source": [ - "model = keras.models.Sequential([\n", - " keras.layers.Flatten(input_shape=(7,7,512)),\n", - " keras.layers.Dense(1,activation='sigmoid')\n", - "])\n", - "model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc'])\n", - "hist = model.fit(ds_features_train, validation_data=ds_features_test)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "ఫలితం అద్భుతంగా ఉంది, మేము సుమారు 95% అవకాశంతో పిల్లి మరియు కుక్క మధ్య తేడా చేయగలుగుతున్నాము! అయితే, మేము ఈ విధానాన్ని అన్ని చిత్రాల ఉపసమూహంలో మాత్రమే పరీక్షించాము, ఎందుకంటే మానవీయంగా ఫీచర్ ఎక్స్‌ట్రాక్షన్ చాలా సమయం తీసుకుంటుంది.\n", - "\n", - "## ఒక VGG నెట్‌వర్క్ ఉపయోగించి ట్రాన్స్‌ఫర్ లెర్నింగ్\n", - "\n", - "మేము ట్రైనింగ్ సమయంలో ఫీచర్ ఎక్స్‌ట్రాక్టర్‌ను మా నెట్‌వర్క్‌లో మొదటి లేయర్‌గా చేర్చడం ద్వారా అసలు VGG-16 నెట్‌వర్క్‌ను మొత్తం ఉపయోగించి మానవీయంగా ఫీచర్లను ముందుగా లెక్కించకుండా ఉండవచ్చు.\n", - "\n", - "Keras ఆర్కిటెక్చర్ అందమైన విషయం ఏమిటంటే, మేము పైగా నిర్వచించిన VGG-16 మోడల్‌ను మరో న్యూరల్ నెట్‌వర్క్‌లో లేయర్‌గా కూడా ఉపయోగించవచ్చు! మేము దాని పై డెన్స్ క్లాసిఫైయర్‌తో ఒక నెట్‌వర్క్ నిర్మించి, ఆ తర్వాత బ్యాక్ ప్రొపగేషన్ ఉపయోగించి మొత్తం నెట్‌వర్క్‌ను ట్రైన్ చేయాలి.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Model: \"sequential\"\n", - "_________________________________________________________________\n", - "Layer (type) Output Shape Param # \n", - "=================================================================\n", - "vgg16 (Functional) (None, 7, 7, 512) 14714688 \n", - "_________________________________________________________________\n", - "flatten (Flatten) (None, 25088) 0 \n", - "_________________________________________________________________\n", - "dense (Dense) (None, 1) 25089 \n", - "=================================================================\n", - "Total params: 14,739,777\n", - "Trainable params: 25,089\n", - "Non-trainable params: 14,714,688\n", - "_________________________________________________________________\n" - ] - } - ], - "source": [ - "model = keras.models.Sequential()\n", - "model.add(keras.applications.VGG16(include_top=False,input_shape=(224,224,3)))\n", - "model.add(keras.layers.Flatten())\n", - "model.add(keras.layers.Dense(1,activation='sigmoid'))\n", - "\n", - "model.layers[0].trainable = False\n", - "\n", - "model.summary()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "ఈ మోడల్ ఒక ఎండ్-టు-ఎండ్ క్లాసిఫికేషన్ నెట్‌వర్క్‌లా కనిపిస్తుంది, ఇది ఒక చిత్రాన్ని తీసుకుని క్లాస్‌ను తిరిగి ఇస్తుంది. అయితే, ఇక్కడ క్లిష్టమైన విషయం ఏమిటంటే, మేము VGG16ని ఫీచర్ ఎక్స్‌ట్రాక్టర్‌గా ఉపయోగించాలనుకుంటున్నాము, మరియు దాన్ని మళ్లీ శిక్షణ ఇవ్వకూడదు. అందుకే, మేము **కన్వల్యూషనల్ ఫీచర్ ఎక్స్‌ట్రాక్టర్ యొక్క వెయిట్స్‌ను ఫ్రీజ్ చేయాలి**. నెట్‌వర్క్ యొక్క మొదటి లేయర్‌ను `model.layers[0]` అని పిలిచి యాక్సెస్ చేయవచ్చు, మరియు `trainable` ప్రాపర్టీని `False` గా సెట్ చేయాలి.\n", - "\n", - "> **Note**: ఫీచర్ ఎక్స్‌ట్రాక్టర్ వెయిట్స్‌ను ఫ్రీజ్ చేయడం అవసరం, ఎందుకంటే లేకపోతే శిక్షణ పొందని క్లాసిఫయర్ లేయర్ ఒరిజినల్ ప్రీ-ట్రెయిన్డ్ కన్వల్యూషనల్ ఎక్స్‌ట్రాక్టర్ వెయిట్స్‌ను ధ్వంసం చేయవచ్చు.\n", - "\n", - "మనం గమనించవచ్చు, మన నెట్‌వర్క్‌లో మొత్తం పారామీటర్లు సుమారు 15 మిలియన్లుగా ఉన్నప్పటికీ, మేము కేవలం 25 వేల పారామీటర్లను మాత్రమే శిక్షణ ఇస్తున్నాము. టాప్-లెవల్ కన్వల్యూషనల్ ఫిల్టర్ల ఇతర అన్ని పారామీటర్లు ప్రీ-ట్రెయిన్డ్ ఉన్నాయి. ఇది మంచిది, ఎందుకంటే మేము తక్కువ సంఖ్యలో ఉదాహరణలతో తక్కువ సంఖ్యలో పారామీటర్లను ఫైన్-ట్యూన్ చేయగలుగుతాము.\n", - "\n", - "ఇప్పుడు మనం నెట్‌వర్క్‌ను శిక్షణ ఇస్తాము మరియు ఎంత మంచి ఫలితాలు వస్తాయో చూద్దాం. శిక్షణ కొంత సమయం పడవచ్చు, మరియు ఎగ్జిక్యూషన్ కొంతసేపు ఫ్రీజ్ అయినట్లు అనిపించినా ఆందోళన చెందకండి.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "310/310 [==============================] - 265s 716ms/step - loss: 0.9917 - acc: 0.9512 - val_loss: 0.8156 - val_acc: 0.9671\n" - ] - } - ], - "source": [ - "model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc'])\n", - "hist = model.fit(ds_train, validation_data=ds_test)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "మనం సరిగ్గా కేట్స్ vs. డాగ్స్ వర్గీకరణ మోడల్ పొందినట్లు కనిపిస్తోంది!\n", - "\n", - "## మోడల్ సేవ్ చేయడం మరియు లోడ్ చేయడం\n", - "\n", - "మనం మోడల్‌ను శిక్షణ ఇచ్చిన తర్వాత, భవిష్యత్తులో ఉపయోగించుకోవడానికి మోడల్ నిర్మాణం మరియు శిక్షణ పొందిన వెయిట్లను ఒక ఫైల్‌లో సేవ్ చేయవచ్చు:\n" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "INFO:tensorflow:Assets written to: data/cats_dogs.tf/assets\n" - ] - } - ], - "source": [ - "model.save('data/cats_dogs.tf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "మనం ఆ తర్వాత ఎప్పుడైనా ఫైల్ నుండి మోడల్‌ను లోడ్ చేసుకోవచ్చు. తదుపరి ప్రయోగం మోడల్‌ను ధ్వంసం చేస్తే ఇది మీకు ఉపయోగకరంగా ఉండవచ్చు - మీరు మొదలైన స్థాయికి తిరిగి ప్రారంభించాల్సిన అవసరం ఉండదు.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "model = keras.models.load_model('data/cats_dogs.tf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## ఫైన్-ట్యూనింగ్ ట్రాన్స్‌ఫర్ లెర్నింగ్\n", - "\n", - "మునుపటి విభాగంలో, మనం చివరి క్లాసిఫైయర్ లేయర్‌ను మన dataset లోని చిత్రాలను వర్గీకరించడానికి శిక్షణ ఇచ్చాము. అయితే, మనం ఫీచర్ ఎక్స్‌ట్రాక్టర్‌ను మళ్లీ శిక్షణ ఇవ్వలేదు, మరియు మన మోడల్ ImageNet డేటా పై నేర్చుకున్న ఫీచర్లపై ఆధారపడి ఉంది. మీ వస్తువులు సాధారణ ImageNet చిత్రాల నుండి దృశ్యంగా భిన్నంగా ఉంటే, ఈ ఫీచర్ల కలయిక ఉత్తమంగా పనిచేయకపోవచ్చు. అందువల్ల, కన్వల్యూషనల్ లేయర్లను కూడా శిక్షణ ప్రారంభించడం అర్థవంతం.\n", - "\n", - "అందుకోసం, మనం ముందుగా ఫ్రోజెన్ చేసిన కన్వల్యూషనల్ ఫిల్టర్ పరామితులను అన్‌ఫ్రీజ్ చేయవచ్చు.\n", - "\n", - "> **Note:** మీరు ముందుగా పరామితులను ఫ్రీజ్ చేసి, క్లాసిఫికేషన్ లేయర్‌లో వెయిట్లను స్థిరపరచడానికి కొన్ని epochs శిక్షణ నిర్వహించడం ముఖ్యం. మీరు వెంటనే అన్‌ఫ్రీజ్ చేసిన పరామితులతో end-to-end నెట్‌వర్క్ శిక్షణ ప్రారంభిస్తే, పెద్ద తప్పిదాలు కన్వల్యూషనల్ లేయర్లలో ప్రీ-ట్రెయిన్ చేసిన వెయిట్లను నాశనం చేయవచ్చు.\n", - "\n", - "మన కన్వల్యూషనల్ VGG-16 మోడల్ మొదటి లేయర్ లో ఉంది, మరియు అది అనేక లేయర్లతో కూడి ఉంటుంది. దాని నిర్మాణాన్ని మనం పరిశీలించవచ్చు:\n" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Model: \"vgg16\"\n", - "_________________________________________________________________\n", - "Layer (type) Output Shape Param # \n", - "=================================================================\n", - "input_1 (InputLayer) [(None, 224, 224, 3)] 0 \n", - "_________________________________________________________________\n", - "block1_conv1 (Conv2D) (None, 224, 224, 64) 1792 \n", - "_________________________________________________________________\n", - "block1_conv2 (Conv2D) (None, 224, 224, 64) 36928 \n", - "_________________________________________________________________\n", - "block1_pool (MaxPooling2D) (None, 112, 112, 64) 0 \n", - "_________________________________________________________________\n", - "block2_conv1 (Conv2D) (None, 112, 112, 128) 73856 \n", - "_________________________________________________________________\n", - "block2_conv2 (Conv2D) (None, 112, 112, 128) 147584 \n", - "_________________________________________________________________\n", - "block2_pool (MaxPooling2D) (None, 56, 56, 128) 0 \n", - "_________________________________________________________________\n", - "block3_conv1 (Conv2D) (None, 56, 56, 256) 295168 \n", - "_________________________________________________________________\n", - "block3_conv2 (Conv2D) (None, 56, 56, 256) 590080 \n", - "_________________________________________________________________\n", - "block3_conv3 (Conv2D) (None, 56, 56, 256) 590080 \n", - "_________________________________________________________________\n", - "block3_pool (MaxPooling2D) (None, 28, 28, 256) 0 \n", - "_________________________________________________________________\n", - "block4_conv1 (Conv2D) (None, 28, 28, 512) 1180160 \n", - "_________________________________________________________________\n", - "block4_conv2 (Conv2D) (None, 28, 28, 512) 2359808 \n", - "_________________________________________________________________\n", - "block4_conv3 (Conv2D) (None, 28, 28, 512) 2359808 \n", - "_________________________________________________________________\n", - "block4_pool (MaxPooling2D) (None, 14, 14, 512) 0 \n", - "_________________________________________________________________\n", - "block5_conv1 (Conv2D) (None, 14, 14, 512) 2359808 \n", - "_________________________________________________________________\n", - "block5_conv2 (Conv2D) (None, 14, 14, 512) 2359808 \n", - "_________________________________________________________________\n", - "block5_conv3 (Conv2D) (None, 14, 14, 512) 2359808 \n", - "_________________________________________________________________\n", - "block5_pool (MaxPooling2D) (None, 7, 7, 512) 0 \n", - "=================================================================\n", - "Total params: 14,714,688\n", - "Trainable params: 0\n", - "Non-trainable params: 14,714,688\n", - "_________________________________________________________________\n" - ] - } - ], - "source": [ - "model.layers[0].summary()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "మేము కన్వల్యూషనల్ బేస్ యొక్క అన్ని లేయర్లను అన్‌ఫ్రీజ్ చేయవచ్చు:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "model.layers[0].trainable = True" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "అయితే, వాటన్నింటినీ ఒకేసారి అన్‌ఫ్రీజ్ చేయడం ఉత్తమ ఆలోచన కాదు. మనం మొదట కొన్ని చివరి కాంవల్యూషన్ లేయర్లను మాత్రమే అన్‌ఫ్రీజ్ చేయవచ్చు, ఎందుకంటే అవి మన చిత్రాలకు సంబంధించి ఉన్న ఉన్నత స్థాయి నమూనాలను కలిగి ఉంటాయి. ఉదాహరణకు, మొదటగా, చివరి 4 లేయర్లను తప్ప అన్ని లేయర్లను ఫ్రీజ్ చేయవచ్చు:\n" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Model: \"sequential\"\n", - "_________________________________________________________________\n", - "Layer (type) Output Shape Param # \n", - "=================================================================\n", - "vgg16 (Functional) (None, 7, 7, 512) 14714688 \n", - "_________________________________________________________________\n", - "flatten (Flatten) (None, 25088) 0 \n", - "_________________________________________________________________\n", - "dense (Dense) (None, 1) 25089 \n", - "=================================================================\n", - "Total params: 14,739,777\n", - "Trainable params: 7,104,513\n", - "Non-trainable params: 7,635,264\n", - "_________________________________________________________________\n" - ] - } - ], - "source": [ - "for i in range(len(model.layers[0].layers)-4):\n", - " model.layers[0].layers[i].trainable = False\n", - "model.summary()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "శిక్షణ పొందగల పరామితుల సంఖ్య గణనీయంగా పెరిగిందని గమనించండి, కానీ ఇది ఇంకా మొత్తం పరామితుల సుమారు 50% చుట్టూ ఉంది.\n", - "\n", - "అన్‌ఫ్రీజ్ చేసిన తర్వాత, మేము మరికొన్ని epochs శిక్షణ చేయవచ్చు (మన ఉదాహరణలో, మేము కేవలం ఒకటిని చేస్తాము). మీరు ప్రీ-ట్రెయిన్ చేసిన వెయిట్స్‌పై ప్రభావాన్ని తగ్గించడానికి తక్కువ లెర్నింగ్ రేట్‌ను కూడా ఎంచుకోవచ్చు. అయితే, తక్కువ లెర్నింగ్ రేట్ ఉన్నప్పటికీ, శిక్షణ ప్రారంభంలో ఖచ్చితత్వం తగ్గిపోవడం ఆశించవచ్చు, చివరికి ఫిక్స్ చేసిన వెయిట్స్ కంటే కొంచెం ఎక్కువ స్థాయికి చేరుకుంటుంది.\n", - "\n", - "> **Note:** ఈ శిక్షణ చాలా మందగిస్తుంది, ఎందుకంటే నెట్‌వర్క్ యొక్క అనేక లేయర్ల ద్వారా గ్రాడియెంట్లను వెనక్కి పంపించాల్సి ఉంటుంది!\n" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "310/310 [==============================] - 201s 645ms/step - loss: 0.5270 - acc: 0.9776 - val_loss: 1.4132 - val_acc: 0.9653\n" - ] - } - ], - "source": [ - "hist = model.fit(ds_train, validation_data=ds_test)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "మేము ఎక్కువ పరామితులతో మరింత శక్తివంతమైన నెట్‌వర్క్‌ను ఉపయోగిస్తున్నందున, శిక్షణ ఖచ్చితత్వం ఎక్కువగా సాధించగలమని అనుకుంటున్నాము, కానీ ధృవీకరణ ఖచ్చితత్వం అంతగా పెరగదు.\n", - "\n", - "మీరు నెట్‌వర్క్‌లో మరికొన్ని లేయర్లను అన్‌ఫ్రీజ్ చేసి మరింత శిక్షణ ఇవ్వవచ్చు, తద్వారా మీరు ఎక్కువ ఖచ్చితత్వం సాధించగలరా అని చూడండి!\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## ఇతర కంప్యూటర్ విజన్ మోడల్స్\n", - "\n", - "VGG-16 అనేది అత్యంత సులభమైన కంప్యూటర్ విజన్ ఆర్కిటెక్చర్లలో ఒకటి. Keras అనేక ఇతర ప్రీ-ట్రెయిన్డ్ నెట్‌వర్క్‌లను అందిస్తుంది. వాటిలో అత్యంత తరచుగా ఉపయోగించే వాటిలో **ResNet** ఆర్కిటెక్చర్లు, మైక్రోసాఫ్ట్ అభివృద్ధి చేసినవి, మరియు **Inception** గూగుల్ అభివృద్ధి చేసినది. ఉదాహరణకు, సులభమైన ResNet-50 మోడల్ ఆర్కిటెక్చర్‌ను పరిశీలిద్దాం (ResNet అనేది వివిధ లోతుల మోడల్స్ కుటుంబం, మీరు నిజంగా లోతైన మోడల్ ఎలా ఉంటుందో చూడాలనుకుంటే ResNet-152 తో ప్రయోగించవచ్చు):\n" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Model: \"resnet50\"\n", - "__________________________________________________________________________________________________\n", - "Layer (type) Output Shape Param # Connected to \n", - "==================================================================================================\n", - "input_3 (InputLayer) [(None, 224, 224, 3) 0 \n", - "__________________________________________________________________________________________________\n", - "conv1_pad (ZeroPadding2D) (None, 230, 230, 3) 0 input_3[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv1_conv (Conv2D) (None, 112, 112, 64) 9472 conv1_pad[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv1_bn (BatchNormalization) (None, 112, 112, 64) 256 conv1_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv1_relu (Activation) (None, 112, 112, 64) 0 conv1_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "pool1_pad (ZeroPadding2D) (None, 114, 114, 64) 0 conv1_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "pool1_pool (MaxPooling2D) (None, 56, 56, 64) 0 pool1_pad[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block1_1_conv (Conv2D) (None, 56, 56, 64) 4160 pool1_pool[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block1_1_bn (BatchNormali (None, 56, 56, 64) 256 conv2_block1_1_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block1_1_relu (Activation (None, 56, 56, 64) 0 conv2_block1_1_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block1_2_conv (Conv2D) (None, 56, 56, 64) 36928 conv2_block1_1_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block1_2_bn (BatchNormali (None, 56, 56, 64) 256 conv2_block1_2_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block1_2_relu (Activation (None, 56, 56, 64) 0 conv2_block1_2_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block1_0_conv (Conv2D) (None, 56, 56, 256) 16640 pool1_pool[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block1_3_conv (Conv2D) (None, 56, 56, 256) 16640 conv2_block1_2_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block1_0_bn (BatchNormali (None, 56, 56, 256) 1024 conv2_block1_0_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block1_3_bn (BatchNormali (None, 56, 56, 256) 1024 conv2_block1_3_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block1_add (Add) (None, 56, 56, 256) 0 conv2_block1_0_bn[0][0] \n", - " conv2_block1_3_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block1_out (Activation) (None, 56, 56, 256) 0 conv2_block1_add[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block2_1_conv (Conv2D) (None, 56, 56, 64) 16448 conv2_block1_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block2_1_bn (BatchNormali (None, 56, 56, 64) 256 conv2_block2_1_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block2_1_relu (Activation (None, 56, 56, 64) 0 conv2_block2_1_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block2_2_conv (Conv2D) (None, 56, 56, 64) 36928 conv2_block2_1_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block2_2_bn (BatchNormali (None, 56, 56, 64) 256 conv2_block2_2_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block2_2_relu (Activation (None, 56, 56, 64) 0 conv2_block2_2_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block2_3_conv (Conv2D) (None, 56, 56, 256) 16640 conv2_block2_2_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block2_3_bn (BatchNormali (None, 56, 56, 256) 1024 conv2_block2_3_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block2_add (Add) (None, 56, 56, 256) 0 conv2_block1_out[0][0] \n", - " conv2_block2_3_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block2_out (Activation) (None, 56, 56, 256) 0 conv2_block2_add[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block3_1_conv (Conv2D) (None, 56, 56, 64) 16448 conv2_block2_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block3_1_bn (BatchNormali (None, 56, 56, 64) 256 conv2_block3_1_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block3_1_relu (Activation (None, 56, 56, 64) 0 conv2_block3_1_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block3_2_conv (Conv2D) (None, 56, 56, 64) 36928 conv2_block3_1_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block3_2_bn (BatchNormali (None, 56, 56, 64) 256 conv2_block3_2_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block3_2_relu (Activation (None, 56, 56, 64) 0 conv2_block3_2_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block3_3_conv (Conv2D) (None, 56, 56, 256) 16640 conv2_block3_2_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block3_3_bn (BatchNormali (None, 56, 56, 256) 1024 conv2_block3_3_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block3_add (Add) (None, 56, 56, 256) 0 conv2_block2_out[0][0] \n", - " conv2_block3_3_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv2_block3_out (Activation) (None, 56, 56, 256) 0 conv2_block3_add[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block1_1_conv (Conv2D) (None, 28, 28, 128) 32896 conv2_block3_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block1_1_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block1_1_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block1_1_relu (Activation (None, 28, 28, 128) 0 conv3_block1_1_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block1_2_conv (Conv2D) (None, 28, 28, 128) 147584 conv3_block1_1_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block1_2_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block1_2_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block1_2_relu (Activation (None, 28, 28, 128) 0 conv3_block1_2_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block1_0_conv (Conv2D) (None, 28, 28, 512) 131584 conv2_block3_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block1_3_conv (Conv2D) (None, 28, 28, 512) 66048 conv3_block1_2_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block1_0_bn (BatchNormali (None, 28, 28, 512) 2048 conv3_block1_0_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block1_3_bn (BatchNormali (None, 28, 28, 512) 2048 conv3_block1_3_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block1_add (Add) (None, 28, 28, 512) 0 conv3_block1_0_bn[0][0] \n", - " conv3_block1_3_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block1_out (Activation) (None, 28, 28, 512) 0 conv3_block1_add[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block2_1_conv (Conv2D) (None, 28, 28, 128) 65664 conv3_block1_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block2_1_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block2_1_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block2_1_relu (Activation (None, 28, 28, 128) 0 conv3_block2_1_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block2_2_conv (Conv2D) (None, 28, 28, 128) 147584 conv3_block2_1_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block2_2_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block2_2_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block2_2_relu (Activation (None, 28, 28, 128) 0 conv3_block2_2_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block2_3_conv (Conv2D) (None, 28, 28, 512) 66048 conv3_block2_2_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block2_3_bn (BatchNormali (None, 28, 28, 512) 2048 conv3_block2_3_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block2_add (Add) (None, 28, 28, 512) 0 conv3_block1_out[0][0] \n", - " conv3_block2_3_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block2_out (Activation) (None, 28, 28, 512) 0 conv3_block2_add[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block3_1_conv (Conv2D) (None, 28, 28, 128) 65664 conv3_block2_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block3_1_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block3_1_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block3_1_relu (Activation (None, 28, 28, 128) 0 conv3_block3_1_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block3_2_conv (Conv2D) (None, 28, 28, 128) 147584 conv3_block3_1_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block3_2_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block3_2_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block3_2_relu (Activation (None, 28, 28, 128) 0 conv3_block3_2_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block3_3_conv (Conv2D) (None, 28, 28, 512) 66048 conv3_block3_2_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block3_3_bn (BatchNormali (None, 28, 28, 512) 2048 conv3_block3_3_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block3_add (Add) (None, 28, 28, 512) 0 conv3_block2_out[0][0] \n", - " conv3_block3_3_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block3_out (Activation) (None, 28, 28, 512) 0 conv3_block3_add[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block4_1_conv (Conv2D) (None, 28, 28, 128) 65664 conv3_block3_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block4_1_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block4_1_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block4_1_relu (Activation (None, 28, 28, 128) 0 conv3_block4_1_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block4_2_conv (Conv2D) (None, 28, 28, 128) 147584 conv3_block4_1_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block4_2_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block4_2_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block4_2_relu (Activation (None, 28, 28, 128) 0 conv3_block4_2_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block4_3_conv (Conv2D) (None, 28, 28, 512) 66048 conv3_block4_2_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block4_3_bn (BatchNormali (None, 28, 28, 512) 2048 conv3_block4_3_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block4_add (Add) (None, 28, 28, 512) 0 conv3_block3_out[0][0] \n", - " conv3_block4_3_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv3_block4_out (Activation) (None, 28, 28, 512) 0 conv3_block4_add[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block1_1_conv (Conv2D) (None, 14, 14, 256) 131328 conv3_block4_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block1_1_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block1_1_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block1_1_relu (Activation (None, 14, 14, 256) 0 conv4_block1_1_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block1_2_conv (Conv2D) (None, 14, 14, 256) 590080 conv4_block1_1_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block1_2_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block1_2_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block1_2_relu (Activation (None, 14, 14, 256) 0 conv4_block1_2_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block1_0_conv (Conv2D) (None, 14, 14, 1024) 525312 conv3_block4_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block1_3_conv (Conv2D) (None, 14, 14, 1024) 263168 conv4_block1_2_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block1_0_bn (BatchNormali (None, 14, 14, 1024) 4096 conv4_block1_0_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block1_3_bn (BatchNormali (None, 14, 14, 1024) 4096 conv4_block1_3_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block1_add (Add) (None, 14, 14, 1024) 0 conv4_block1_0_bn[0][0] \n", - " conv4_block1_3_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block1_out (Activation) (None, 14, 14, 1024) 0 conv4_block1_add[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block2_1_conv (Conv2D) (None, 14, 14, 256) 262400 conv4_block1_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block2_1_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block2_1_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block2_1_relu (Activation (None, 14, 14, 256) 0 conv4_block2_1_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block2_2_conv (Conv2D) (None, 14, 14, 256) 590080 conv4_block2_1_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block2_2_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block2_2_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block2_2_relu (Activation (None, 14, 14, 256) 0 conv4_block2_2_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block2_3_conv (Conv2D) (None, 14, 14, 1024) 263168 conv4_block2_2_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block2_3_bn (BatchNormali (None, 14, 14, 1024) 4096 conv4_block2_3_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block2_add (Add) (None, 14, 14, 1024) 0 conv4_block1_out[0][0] \n", - " conv4_block2_3_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block2_out (Activation) (None, 14, 14, 1024) 0 conv4_block2_add[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block3_1_conv (Conv2D) (None, 14, 14, 256) 262400 conv4_block2_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block3_1_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block3_1_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block3_1_relu (Activation (None, 14, 14, 256) 0 conv4_block3_1_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block3_2_conv (Conv2D) (None, 14, 14, 256) 590080 conv4_block3_1_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block3_2_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block3_2_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block3_2_relu (Activation (None, 14, 14, 256) 0 conv4_block3_2_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block3_3_conv (Conv2D) (None, 14, 14, 1024) 263168 conv4_block3_2_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block3_3_bn (BatchNormali (None, 14, 14, 1024) 4096 conv4_block3_3_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block3_add (Add) (None, 14, 14, 1024) 0 conv4_block2_out[0][0] \n", - " conv4_block3_3_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block3_out (Activation) (None, 14, 14, 1024) 0 conv4_block3_add[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block4_1_conv (Conv2D) (None, 14, 14, 256) 262400 conv4_block3_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block4_1_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block4_1_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block4_1_relu (Activation (None, 14, 14, 256) 0 conv4_block4_1_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block4_2_conv (Conv2D) (None, 14, 14, 256) 590080 conv4_block4_1_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block4_2_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block4_2_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block4_2_relu (Activation (None, 14, 14, 256) 0 conv4_block4_2_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block4_3_conv (Conv2D) (None, 14, 14, 1024) 263168 conv4_block4_2_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block4_3_bn (BatchNormali (None, 14, 14, 1024) 4096 conv4_block4_3_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block4_add (Add) (None, 14, 14, 1024) 0 conv4_block3_out[0][0] \n", - " conv4_block4_3_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block4_out (Activation) (None, 14, 14, 1024) 0 conv4_block4_add[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block5_1_conv (Conv2D) (None, 14, 14, 256) 262400 conv4_block4_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block5_1_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block5_1_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block5_1_relu (Activation (None, 14, 14, 256) 0 conv4_block5_1_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block5_2_conv (Conv2D) (None, 14, 14, 256) 590080 conv4_block5_1_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block5_2_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block5_2_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block5_2_relu (Activation (None, 14, 14, 256) 0 conv4_block5_2_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block5_3_conv (Conv2D) (None, 14, 14, 1024) 263168 conv4_block5_2_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block5_3_bn (BatchNormali (None, 14, 14, 1024) 4096 conv4_block5_3_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block5_add (Add) (None, 14, 14, 1024) 0 conv4_block4_out[0][0] \n", - " conv4_block5_3_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block5_out (Activation) (None, 14, 14, 1024) 0 conv4_block5_add[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block6_1_conv (Conv2D) (None, 14, 14, 256) 262400 conv4_block5_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block6_1_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block6_1_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block6_1_relu (Activation (None, 14, 14, 256) 0 conv4_block6_1_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block6_2_conv (Conv2D) (None, 14, 14, 256) 590080 conv4_block6_1_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block6_2_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block6_2_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block6_2_relu (Activation (None, 14, 14, 256) 0 conv4_block6_2_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block6_3_conv (Conv2D) (None, 14, 14, 1024) 263168 conv4_block6_2_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block6_3_bn (BatchNormali (None, 14, 14, 1024) 4096 conv4_block6_3_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block6_add (Add) (None, 14, 14, 1024) 0 conv4_block5_out[0][0] \n", - " conv4_block6_3_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv4_block6_out (Activation) (None, 14, 14, 1024) 0 conv4_block6_add[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block1_1_conv (Conv2D) (None, 7, 7, 512) 524800 conv4_block6_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block1_1_bn (BatchNormali (None, 7, 7, 512) 2048 conv5_block1_1_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block1_1_relu (Activation (None, 7, 7, 512) 0 conv5_block1_1_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block1_2_conv (Conv2D) (None, 7, 7, 512) 2359808 conv5_block1_1_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block1_2_bn (BatchNormali (None, 7, 7, 512) 2048 conv5_block1_2_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block1_2_relu (Activation (None, 7, 7, 512) 0 conv5_block1_2_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block1_0_conv (Conv2D) (None, 7, 7, 2048) 2099200 conv4_block6_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block1_3_conv (Conv2D) (None, 7, 7, 2048) 1050624 conv5_block1_2_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block1_0_bn (BatchNormali (None, 7, 7, 2048) 8192 conv5_block1_0_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block1_3_bn (BatchNormali (None, 7, 7, 2048) 8192 conv5_block1_3_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block1_add (Add) (None, 7, 7, 2048) 0 conv5_block1_0_bn[0][0] \n", - " conv5_block1_3_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block1_out (Activation) (None, 7, 7, 2048) 0 conv5_block1_add[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block2_1_conv (Conv2D) (None, 7, 7, 512) 1049088 conv5_block1_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block2_1_bn (BatchNormali (None, 7, 7, 512) 2048 conv5_block2_1_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block2_1_relu (Activation (None, 7, 7, 512) 0 conv5_block2_1_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block2_2_conv (Conv2D) (None, 7, 7, 512) 2359808 conv5_block2_1_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block2_2_bn (BatchNormali (None, 7, 7, 512) 2048 conv5_block2_2_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block2_2_relu (Activation (None, 7, 7, 512) 0 conv5_block2_2_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block2_3_conv (Conv2D) (None, 7, 7, 2048) 1050624 conv5_block2_2_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block2_3_bn (BatchNormali (None, 7, 7, 2048) 8192 conv5_block2_3_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block2_add (Add) (None, 7, 7, 2048) 0 conv5_block1_out[0][0] \n", - " conv5_block2_3_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block2_out (Activation) (None, 7, 7, 2048) 0 conv5_block2_add[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block3_1_conv (Conv2D) (None, 7, 7, 512) 1049088 conv5_block2_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block3_1_bn (BatchNormali (None, 7, 7, 512) 2048 conv5_block3_1_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block3_1_relu (Activation (None, 7, 7, 512) 0 conv5_block3_1_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block3_2_conv (Conv2D) (None, 7, 7, 512) 2359808 conv5_block3_1_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block3_2_bn (BatchNormali (None, 7, 7, 512) 2048 conv5_block3_2_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block3_2_relu (Activation (None, 7, 7, 512) 0 conv5_block3_2_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block3_3_conv (Conv2D) (None, 7, 7, 2048) 1050624 conv5_block3_2_relu[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block3_3_bn (BatchNormali (None, 7, 7, 2048) 8192 conv5_block3_3_conv[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block3_add (Add) (None, 7, 7, 2048) 0 conv5_block2_out[0][0] \n", - " conv5_block3_3_bn[0][0] \n", - "__________________________________________________________________________________________________\n", - "conv5_block3_out (Activation) (None, 7, 7, 2048) 0 conv5_block3_add[0][0] \n", - "__________________________________________________________________________________________________\n", - "avg_pool (GlobalAveragePooling2 (None, 2048) 0 conv5_block3_out[0][0] \n", - "__________________________________________________________________________________________________\n", - "predictions (Dense) (None, 1000) 2049000 avg_pool[0][0] \n", - "==================================================================================================\n", - "Total params: 25,636,712\n", - "Trainable params: 25,583,592\n", - "Non-trainable params: 53,120\n", - "__________________________________________________________________________________________________\n" - ] - } - ], - "source": [ - "resnet = keras.applications.ResNet50()\n", - "resnet.summary()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "మీరు చూడగలిగినట్లుగా, మోడల్‌లో అదే పరిచిత నిర్మాణ భాగాలు ఉన్నాయి: కన్వల్యూషనల్ లేయర్లు, పూలింగ్ లేయర్లు మరియు చివరి డెన్స్ క్లాసిఫయర్. మేము ఈ మోడల్‌ను VGG-16ని ట్రాన్స్‌ఫర్ లెర్నింగ్ కోసం ఉపయోగించినట్లే పూర్తిగా అదే విధంగా ఉపయోగించవచ్చు. మీరు పై కోడ్‌తో ప్రయోగాలు చేయవచ్చు, వేరే ResNet మోడల్స్‌ను బేస్ మోడల్‌గా ఉపయోగించి, ఖచ్చితత్వం ఎలా మారుతుందో చూడవచ్చు.\n", - "\n", - "## బ్యాచ్ నార్మలైజేషన్\n", - "\n", - "ఈ నెట్‌వర్క్‌లో మరో రకమైన లేయర్ ఉంది: **బ్యాచ్ నార్మలైజేషన్**. బ్యాచ్ నార్మలైజేషన్ యొక్క భావన ఏమిటంటే, న్యూరల్ నెట్‌వర్క్ ద్వారా ప్రవహించే విలువలను సరైన పరిధిలోకి తీసుకురావడం. సాధారణంగా న్యూరల్ నెట్‌వర్క్స్ ఉత్తమంగా పనిచేస్తాయి, అన్ని విలువలు [-1,1] లేదా [0,1] పరిధిలో ఉన్నప్పుడు, అందుకే మనం ఇన్‌పుట్ డేటాను తగిన విధంగా స్కేల్/నార్మలైజ్ చేస్తాము. అయితే, లోతైన నెట్‌వర్క్ శిక్షణ సమయంలో, విలువలు ఈ పరిధి నుండి గణనీయంగా బయటకు పోవచ్చు, ఇది శిక్షణను కష్టతరం చేస్తుంది. బ్యాచ్ నార్మలైజేషన్ లేయర్ ప్రస్తుత మినీబ్యాచ్‌లోని అన్ని విలువల సగటు మరియు ప్రమాణ విభిన్నతను లెక్కించి, వాటిని ఉపయోగించి సిగ్నల్‌ను నార్మలైజ్ చేసి, న్యూరల్ నెట్‌వర్క్ లేయర్‌కు పంపుతుంది. ఇది లోతైన నెట్‌వర్క్స్ స్థిరత్వాన్ని గణనీయంగా మెరుగుపరుస్తుంది.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## ముఖ్యాంశం\n", - "\n", - "ట్రాన్స్‌ఫర్ లెర్నింగ్ ఉపయోగించి, మన కస్టమ్ ఆబ్జెక్ట్ వర్గీకరణ పనికి తక్షణమే ఒక క్లాసిఫయర్ తయారు చేసి, అధిక ఖచ్చితత్వాన్ని సాధించగలిగాము. అయితే, ఈ ఉదాహరణ పూర్తిగా న్యాయమైనది కాదు, ఎందుకంటే అసలు VGG-16 నెట్‌వర్క్ పిల్లులు మరియు కుక్కలను గుర్తించడానికి ముందుగా శిక్షణ పొందింది, కాబట్టి మనం ఇప్పటికే నెట్‌వర్క్‌లో ఉన్న చాలా నమూనాలను మళ్లీ ఉపయోగించుకున్నాము. ప్లాంట్‌లో ఉత్పత్తి లైన్‌లోని వివరాలు లేదా వేర్వేరు చెట్టు ఆకులు వంటి మరింత ప్రత్యేక డొమైన్-స్పెసిఫిక్ వస్తువులపై తక్కువ ఖచ్చితత్వం ఆశించవచ్చు.\n", - "\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" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "py38_tensorflow", - "language": "python", - "name": "conda-env-py38_tensorflow-py" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.10" - }, - "coopTranslator": { - "original_hash": "c189abc107848f96051085cc30945129", - "translation_date": "2025-11-26T00:57:08+00:00", - "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", - "language_code": "te" - } - }, - "nbformat": 4, - "nbformat_minor": 4 +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# ముందుగా శిక్షణ పొందిన మోడళ్ళు మరియు ట్రాన్స్ఫర్ లెర్నింగ్\n", + "\n", + "CNNలను శిక్షణ ఇవ్వడం చాలా సమయం తీసుకోగలదు, మరియు ఆ పనికి చాలా డేటా అవసరం ఉంటుంది. అయితే, ఎక్కువ సమయం ఒక నెట్‌వర్క్ ఇమేజెస్ నుండి నమూనాలు తీసివేయడానికి ఉపయోగిస్తున్న ఉత్తమ తక్కువ-స్థాయి ఫిల్టర్లను నేర్చుకోవడంలో ఖర్చవుతుంది. ఒక సహజమైన ప్రశ్న రాకపోవడం లేదు - ఒక డేటాసెట్‌పై శిక్షణ పొందిన న్యూరల్ నెట్‌వర్క్‌ను తీసుకుని, పూర్తి శిక్షణ ప్రాసెస్ లేకుండా భిన్నమైన ఇమేజెస్‌ను వర్గీకరించడంలో దాన్ని అనుకూలపరచగలమా?\n", + "\n", + "ఈ దృష్టికోణాన్ని **ట్రాన్స్ఫర్ లెర్నింగ్** అంటారు, ఎందుకంటే మనం ఒక న్యూరల్ నెట్‌వర్క్ మోడల్ నుండి మరొకదానికి కొంత జ్ఞానం బదిలీ చేసుకుంటాము. ట్రాన్స్ఫర్ లెర్నింగ్‌లో, సాధారణంగా మనం ముందుగా శిక్షణ పొందిన మోడల్‌తో ప్రారంభిస్తాము, అది ఒక పెద్ద ఇమేజ్ డేటాసెట్, ఉదాహరణకు **ImageNet**పై శిక్షణ పొందింది. ఆ మోడళ్లు ఇప్పటికే సాధారణ ఇమేజెస్ నుండి విభిన్న ఫీచర్‌లను బాగా గ్రహించగలవు, మరియు అనేక సందర్భాల్లో ఆ ఫీచర్‌లు ఉపయోగించి ఒక క్లాసిఫయర్ తయారు చేయడం మంచి ఫలితాన్ని ఇస్తుంది.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import tensorflow as tf\n", + "from tensorflow import keras\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import os\n", + "from tfcv import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## పిల్లులు vs. కుక్కల డేటాసెట్\n", + "\n", + "ఈయే ఎపిసోడ్‌లో, మేము పిల్లులు మరియు కుక్కల చిత్రాలను వర్గీకరించే ఒక నిజజీవి సమస్యను పరిష్కరిస్తాము. ఈ కారణంగా, మేము [Kaggle Cats vs. Dogs Dataset](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" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "if not os.path.exists('data/kagglecatsanddogs_5340.zip'):\n", + " !wget -P data https://download.microsoft.com/download/3/E/1/3E1C3F21-ECDB-4869-8368-6DEBA77B919F/kagglecatsanddogs_5340.zip" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import zipfile\n", + "if not os.path.exists('data/PetImages'):\n", + " with zipfile.ZipFile('data/kagglecatsanddogs_5340.zip', 'r') as zip_ref:\n", + " zip_ref.extractall('data')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "దురదృష్టవశాత్తూ, డేటాసెట్‌లో కొన్ని దెబ్బతిన్న ఇమేజ్ ఫైళ్లు ఉన్నాయి. దెబ్బతిన్న ఫైల్స్ కోసం వేగంగా పరిశీలించడానికి మేము శుభ్రపరిచే పని చేయాలి. ఈ ట్యుటోరియల్‌ను దెబ్బతీస్తూనే కాకుండా ఉండాలంటే, మేము డేటాసెట్‌ను నిర్ధారించడానికిఆ కో드를 ఒక మాడ్యూల్‌గా మార్చాము.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Corrupt image or wrong format: data/PetImages/Cat/12235.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/2663.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/4929.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/8183.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/11083.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/6435.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/6491.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/7968.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/6768.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/11397.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/8295.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/4874.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/23.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/11864.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/3491.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/11729.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/3197.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/10874.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/6376.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/9361.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/9328.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/910.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/2021.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/666.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/3710.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/9171.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/6906.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/11095.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/660.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/8415.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/3161.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/850.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/7003.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/1267.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/7642.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/8553.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/6900.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/4334.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/10404.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/6980.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/936.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/9619.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/3300.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/7647.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/2742.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/9565.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/1757.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/11874.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/1936.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/5077.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/7845.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/8832.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/11935.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/9208.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/4322.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/7978.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/10820.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/391.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/10073.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/8958.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/8470.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/445.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/4821.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/11565.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/4351.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/4833.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/140.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/3153.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/5370.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/5819.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/3649.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/4293.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/3967.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/1937.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/10125.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/1386.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/4750.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/6029.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/5614.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/2569.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/9778.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/6486.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/11210.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/7502.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/2189.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/1151.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/4629.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/12080.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/10501.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/1914.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/11086.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/4000.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/9100.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/5553.jpg\n", + "Corrupt image or wrong format: data/PetImages/Cat/12269.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/5243.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/3288.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/11912.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/3320.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/11166.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/8194.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/2353.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/9026.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/8557.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/7969.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/8693.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/4367.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/1900.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/5730.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/9961.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/8126.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/8521.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/11560.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/11233.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/11675.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/8889.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/9414.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/3588.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/10353.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/10733.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/6238.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/5618.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/7743.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/10747.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/6503.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/11410.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/5955.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/2915.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/3136.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/4086.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/2905.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/2494.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/3546.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/5547.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/9851.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/9188.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/4203.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/8715.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/4640.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/1866.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/7718.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/7514.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/1017.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/12102.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/296.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/6718.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/11253.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/10173.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/11849.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/10383.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/10678.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/5790.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/6318.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/1884.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/4654.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/9145.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/2479.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/12289.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/2688.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/4134.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/10637.jpg\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/anaconda/envs/py38_tensorflow/lib/python3.8/site-packages/PIL/TiffImagePlugin.py:793: UserWarning: Truncated File Read\n", + " warnings.warn(str(msg))\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Corrupt image or wrong format: data/PetImages/Dog/543.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/8730.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/12114.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/522.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/10863.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/10401.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/7739.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/561.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/1308.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/9643.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/3155.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/5736.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/4257.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/11853.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/6855.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/1259.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/7652.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/573.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/11702.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/414.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/4301.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/9500.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/10726.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/9367.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/2877.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/10907.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/10972.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/7311.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/10797.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/2317.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/7128.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/6500.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/11285.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/6430.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/6032.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/10969.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/8364.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/11692.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/3038.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/5604.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/565.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/9640.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/7459.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/6305.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/6555.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/11590.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/6059.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/3927.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/10705.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/2384.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/3885.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/663.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/9043.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/8563.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/9556.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/9967.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/10158.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/5263.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/8641.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/7369.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/4924.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/10351.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/6213.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/5104.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/1356.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/7133.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/7112.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/1168.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/719.jpg\n", + "Corrupt image or wrong format: data/PetImages/Dog/50.jpg\n" + ] + } + ], + "source": [ + "check_image_dir('data/PetImages/Cat/*.jpg')\n", + "check_image_dir('data/PetImages/Dog/*.jpg')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## డేటాసెట్ లోడ్ చేయడం\n", + "\n", + "మునుపటి ఉదాహరణల్లో, మనం Keras లో నడిచే డేటాసెట్టులను లోడ్ చేస్తున్నారు. ఇప్పుడు మన సొంత డేటాసెట్‌ను, అది చిత్రాల డైరెక్టరీ నుండి లోడ్ చేయాల్సిన అవసరం ఉంది.\n", + "\n", + "వాస్తవ జీవితంలో, చిత్ర డేటాసెట్ పరిమాణం చాలా పెద్దగా ఉండవచ్చు, అందువల్ల అన్ని డేటా మెమరీలో సరిపోవడం సాధ్యం కాదు. కాబట్టి, డేటాసెట్లను తరచుగా ట్రైనింగ్‌కు అనువైన మినిబ్యాచుల్లో డేటా ఇవ్వగల **జనరేటర్ల** రూపంలో ప్రాతినిధ్యం చేస్తారు.\n", + "\n", + "చిత్రం వర్గీకరణకు సంబంధించిన సమస్యను పరిష్కరించడానికి, Keras ప్రత్యేకమైన `image_dataset_from_directory` ఫంక్షన్‌ను కలిగి ఉంది, ఇది వర్గాలలో ఉన్న ఉపడైరెక్టరీల నుండి చిత్రాలను లోడ్ చేయగలదు. ఈ ఫంక్షన్ చిత్రాలను స్కేల్ చేయడాన్ని కూడా చూసుకుంటుంది, అలాగే డేటాసెట్‌ను ట్రైన్ మరియు టెస్ట్ సబ్‌సెట్‌లుగా విభజించగలదు:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Found 24769 files belonging to 2 classes.\n", + "Using 19816 files for training.\n", + "Found 24769 files belonging to 2 classes.\n", + "Using 4953 files for validation.\n" + ] + } + ], + "source": [ + "data_dir = 'data/PetImages'\n", + "batch_size = 64\n", + "ds_train = keras.preprocessing.image_dataset_from_directory(\n", + " data_dir,\n", + " validation_split = 0.2,\n", + " subset = 'training',\n", + " seed = 13,\n", + " image_size = (224,224),\n", + " batch_size = batch_size\n", + ")\n", + "ds_test = keras.preprocessing.image_dataset_from_directory(\n", + " data_dir,\n", + " validation_split = 0.2,\n", + " subset = 'validation',\n", + " seed = 13,\n", + " image_size = (224,224),\n", + " batch_size = batch_size\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "ట్రైన్ మరియు టెస్ట్ డేటాసెట్ మధ్య చిత్రాల విభజనపై ప్రభావం చూపే కారణంగా రెండింటి కోసం సమానం అయిన `seed` విలువ సెట్ చేయడం ముఖ్యం.\n", + "\n", + "డేటాసెట్ ఆటోమేటిగ్గా డైరెక్టరీల నుండి తరగతి పేర్లను ఎంచుకుంటుంది, మరియు అవసరం ఉంటే మీరు వాటిని కాల్ చేసి యాక్సెస్ చేయవచ్చు:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['Cat', 'Dog']" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ds_train.class_names" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "మేము పొందిన డేటాసెట్లు మోడల్‌ను శిక్షణ ఇచ్చేందుకు నేరుగా `fit` ఫంక్షన్‌కు పంపవచ్చు. అవి సంబంధిత చిత్రాలు మరియు లేబుల్స్ రెండింటినీ కలిగి ఉంటాయి, వీటిని క్రింది నిర్మాణం ఉపయోగించి లూప్ చేయవచ్చు:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training batch shape: features=(64, 224, 224, 3), labels=(64,)\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "for x,y in ds_train:\n", + " print(f\"Training batch shape: features={x.shape}, labels={y.shape}\")\n", + " x_sample, y_sample = x,y\n", + " break\n", + " \n", + "display_dataset(x_sample.numpy().astype(np.int),np.expand_dims(y_sample,1),classes=ds_train.class_names)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "> **గమనిక**: డేటాసెట్‌లోని అన్ని చిత్రాలు 0-255 పరిధితో ఫ్లోటింగ్ పాయింట్ టెన్సార్లుగా ప్రాతినిధ్యం వహిస్తాయి. వాటిని న్యూరల్ నెట్‌వర్క్‌కు పంపించేముందు, ఆ విలువలను 0-1 పరిధిలోకి స్కేల్ చేయాలి. చిత్రాలను ప్లాట్ చేసే సమయంలో, మనం అదే చేయాలి లేదా విలువలను `int` రకానికి మార్చాలి (ముందుగా ఇచ్చిన కోడ్‌లో మనం ఇది చేస్తాము), తద్వారా `matplotlib`కి మనం అసలు స్కేల్ చేయని చిత్రం ప్లాట్ చేయదలచినట్లు చూపించవచ్చు.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## ముందుగా శిక్షణ పొందిన మోడల్స్\n", + "\n", + "అనేక చిత్రం వర్గీకరణ పనుల కోసం ముందుగా శిక్షణ పొందిన న్యూరల్ నెట్‌వర్క్ మోడల్స్‌ను కనుగొనవచ్చు. ఆ మోడల్స్‌లో అనేకం `keras.applications` నేమ్‌స్పేస్‌లో అందుబాటులో ఉన్నాయి, ఇంకా మరిన్ని మోడల్స్ ఇంటర్నెట్‌లో కనిపిస్తాయి. సులభమైన VGG-16 మోడల్ ఎలా లోడ్ చేసి ఉపయోగించవచ్చో చూద్దాం:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Downloading data from https://storage.googleapis.com/tensorflow/keras-applications/vgg16/vgg16_weights_tf_dim_ordering_tf_kernels.h5\n", + "553467904/553467096 [==============================] - 6s 0us/step\n", + "Most probable class = [208]\n", + "Downloading data from https://storage.googleapis.com/download.tensorflow.org/data/imagenet_class_index.json\n", + "40960/35363 [==================================] - 0s 0us/step\n" + ] + }, + { + "data": { + "text/plain": [ + "[[('n02099712', 'Labrador_retriever', 0.5340957),\n", + " ('n02100236', 'German_short-haired_pointer', 0.0939442),\n", + " ('n02092339', 'Weimaraner', 0.08160535),\n", + " ('n02099849', 'Chesapeake_Bay_retriever', 0.057179328),\n", + " ('n02109047', 'Great_Dane', 0.03733857)]]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# 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", + "print(f\"Most probable class = {tf.argmax(res,1)}\")\n", + "\n", + "keras.applications.vgg16.decode_predictions(res.numpy())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "ఇక్కడ కొన్ని ముఖ్యమైన విషయాలు ఉన్నాయి:\n", + "* ప్రీ-ట్రెయిన్ చేసిన ఏ నెట్‌వర్క్‌కు ఇన్పుట్‌ను పంపేముందు, అది ఒక నిర్దిష్ట విధంగా ప్రీ-ప్రాసెస్ చేయబడాలి. ఇది సంబంధిత `preprocess_input` ఫంక్షన్‌ను పిలవడం ద్వారా జరుగుతుంది, ఇది ఒక బ్యాచ్ చిత్రాలను అందుకుని, వాటి ప్రాసెస్ చేసిన రూపాన్ని తిరిగి ఇస్తుంది. VGG-16 సందర్భంలో, చిత్రాలను సాధారణీకరించబడతాయి, మరియు ప్రతి ఛానెల్‌కు ముందుగా నిర్వచించిన సగటు విలువ తగ్గించబడుతుంది. ఇది ఎందుకంటే VGG-16 ప్రాథమికంగా ఈ ప్రీ-ప్రాసెసింగ్‌తో శిక్షణ పొందింది.\n", + "* న్యూరల్ నెట్‌వర్క్ ఇన్‌పుట్ బ్యాచ్‌కు వర్తించబడుతుంది, మరియు ఫలితంగా 1000-మెంబర్ టెన్సర్ల బ్యాచ్ వస్తుంది, ఇది ప్రతి వర్గం యొక్క probability చూపిస్తుంది. ఈ టెన్సర్‌పై `argmax` పిలిచి అత్యధిక probability ఉన్న వర్గ సంఖ్యను కనుగొంటాం.\n", + "* పొందిన ఫలితం [ఒక `ImageNet` వర్గం సంఖ్య](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). ఈ ఫలితాన్ని అర్థం చేసుకోవడానికి, మేము కూడా `decode_predictions` ఫంక్షన్‌ను ఉపయోగించవచ్చు, ఇది టాప్ n వర్గాలను వారి పేర్లతో పాటు ఇస్తుంది.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "మనం VGG-16 నెట్‌వర్క్ నిర్మాణం కూడా చూద్దాం:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"vgg16\"\n", + "_________________________________________________________________\n", + "Layer (type) Output Shape Param # \n", + "=================================================================\n", + "input_1 (InputLayer) [(None, 224, 224, 3)] 0 \n", + "_________________________________________________________________\n", + "block1_conv1 (Conv2D) (None, 224, 224, 64) 1792 \n", + "_________________________________________________________________\n", + "block1_conv2 (Conv2D) (None, 224, 224, 64) 36928 \n", + "_________________________________________________________________\n", + "block1_pool (MaxPooling2D) (None, 112, 112, 64) 0 \n", + "_________________________________________________________________\n", + "block2_conv1 (Conv2D) (None, 112, 112, 128) 73856 \n", + "_________________________________________________________________\n", + "block2_conv2 (Conv2D) (None, 112, 112, 128) 147584 \n", + "_________________________________________________________________\n", + "block2_pool (MaxPooling2D) (None, 56, 56, 128) 0 \n", + "_________________________________________________________________\n", + "block3_conv1 (Conv2D) (None, 56, 56, 256) 295168 \n", + "_________________________________________________________________\n", + "block3_conv2 (Conv2D) (None, 56, 56, 256) 590080 \n", + "_________________________________________________________________\n", + "block3_conv3 (Conv2D) (None, 56, 56, 256) 590080 \n", + "_________________________________________________________________\n", + "block3_pool (MaxPooling2D) (None, 28, 28, 256) 0 \n", + "_________________________________________________________________\n", + "block4_conv1 (Conv2D) (None, 28, 28, 512) 1180160 \n", + "_________________________________________________________________\n", + "block4_conv2 (Conv2D) (None, 28, 28, 512) 2359808 \n", + "_________________________________________________________________\n", + "block4_conv3 (Conv2D) (None, 28, 28, 512) 2359808 \n", + "_________________________________________________________________\n", + "block4_pool (MaxPooling2D) (None, 14, 14, 512) 0 \n", + "_________________________________________________________________\n", + "block5_conv1 (Conv2D) (None, 14, 14, 512) 2359808 \n", + "_________________________________________________________________\n", + "block5_conv2 (Conv2D) (None, 14, 14, 512) 2359808 \n", + "_________________________________________________________________\n", + "block5_conv3 (Conv2D) (None, 14, 14, 512) 2359808 \n", + "_________________________________________________________________\n", + "block5_pool (MaxPooling2D) (None, 7, 7, 512) 0 \n", + "_________________________________________________________________\n", + "flatten (Flatten) (None, 25088) 0 \n", + "_________________________________________________________________\n", + "fc1 (Dense) (None, 4096) 102764544 \n", + "_________________________________________________________________\n", + "fc2 (Dense) (None, 4096) 16781312 \n", + "_________________________________________________________________\n", + "predictions (Dense) (None, 1000) 4097000 \n", + "=================================================================\n", + "Total params: 138,357,544\n", + "Trainable params: 138,357,544\n", + "Non-trainable params: 0\n", + "_________________________________________________________________\n" + ] + } + ], + "source": [ + "vgg.summary()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## GPU గణనాలు\n", + "\n", + "VGG-16 మరియు ఇతర ఆధునిక معماريات వంటి లోతైన న్యూరల్ నెట్‌వర్క్లు పనిచేయడానికి చాలా గణన శక్తిని అవసరం చేస్తాయి. అందుబాటులో ఉంటే GPU వేగవంతీకరణను ఉపయోగించడం అవగాహననీది. సంతోషకరంగా, Keras అందుబాటులో ఉంటే GPU పై గణనలను స్వయంచాలకంగా వేగవంతం చేస్తుంది. దిగువ కోడ్ ఉపయోగించి Tensorflow GPU ను ఉపయోగించగలదో పరీక్షించవచ్చు:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tf.config.list_physical_devices('GPU')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## VGG లక్షణాలను తీయడం\n", + "\n", + "మనం మా చిత్రాల నుండి లక్షణాలను తీయేందుకు VGG-16 ఉపయోగించాలనుకుంటే, మనకు తుది వర్గీకరణ పొరలు లేకుండా మోడల్ అవసరం. మేము ఈ కోడ్ ఉపయోగించి టాప్ లేయర్లు లేకుండా VGG-16 మోడల్‌ను సృష్టించవచ్చు:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Shape after applying VGG-16: (7, 7, 512)\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "vgg = keras.applications.VGG16(include_top=False)\n", + "\n", + "inp = keras.applications.vgg16.preprocess_input(x_sample[:1])\n", + "res = vgg(inp)\n", + "print(f\"Shape after applying VGG-16: {res[0].shape}\")\n", + "plt.figure(figsize=(15,3))\n", + "plt.imshow(res[0].numpy().reshape(-1,512))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "ఫీచర్ టెన్సర్ యొక్క పరిమాణం 7x7x512, కానీ దానిని వీక్షించడానికి మేము దాన్ని 2డి రూపానికి మార్చవలసిన అవసరం వచ్చింది.\n", + "\n", + "ఇప్పుడు ఆ ఫీచర్స్‌ను చిత్రాలను వర్గీకరించడానికి ఉపయోగించవచ్చో లేదో చూద్దాం. మనం కొంత భాగం చిత్రాలను (మా కేసులో 50 మినీబ్యాచ్‌లు) చేతితో తీసుకుండా, వారి ఫీచర్ వెక్టర్లను ముందస్తుగా గణించుకుందాం. దీని కోసం మేము Tensorflow **dataset** API ని ఉపయోగించవచ్చు. `map` ఫంక్షన్ డేటాసెట్‌ను తీసుకుని ఒక నిర్దిష్ట లాంబ్డా-ఫంక్షన్‌ను వర్తింపజేస్తుంది. మేము ఈ విధానాన్ని ఉపయోగించి, అసలైన చిత్రాల బదులు VGG ద్వారా పొందిన ఫీచర్లను కలిగిన కొత్త డేటాసెట్లను, `ds_features_train` మరియు `ds_features_test` తయారుచేస్తాము.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(64, 7, 7, 512) (64,)\n" + ] + } + ], + "source": [ + "num = batch_size*50\n", + "ds_features_train = ds_train.take(50).map(lambda x,y : (vgg(x),y))\n", + "ds_features_test = ds_test.take(10).map(lambda x,y : (vgg(x),y))\n", + "\n", + "for x,y in ds_features_train:\n", + " print(x.shape,y.shape)\n", + " break" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "మా ప్రదర్శనను వేగవంతం చేయడానికి, మేము డేటాసెట్ పరిమాణాన్ని పరిమితం చేయడానికి`.take(50)` నిర్మాణాన్ని ఉపయోగించాము. మీరు ఖచ్చితంగా పూర్తి డేటాసెట్‌పై ఈ ప్రయోగం చేయవచ్చు.\n", + "\n", + "ఇప్పుడు మాకు ఫీచర్లతో కూడిన డేటాసెట్ ఉంటే, పిల్లులు మరియు కుక్కల మధ్య భేదం చేయడానికి సరళమైన డెన్స్ క్లాసిఫయర్‌ను శిక్షణ ఇస్తాము. ఈ నెట్‌వర్క్ (7,7,512) ఆకారంలో ఫీచర్ వెక్టార్‌ను ఇన్‌పుట్‌గా తీసుకొని, ఒక అవుట్పుట్‌ను ఉత్పత్తి చేస్తుంది, అది కుక్క లేదా పిల్లి అనే దానిని సూచిస్తుంది. ఇది ద్విముఖీ వర్గీకరణ కావడంతో, మేము `sigmoid` యాక్టివేషన్ ఫంక్షన్ మరియు `binary_crossentropy` నష్టం ఉపయోగిస్తాము.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "50/50 [==============================] - 1896s 38s/step - loss: 1.4845 - acc: 0.9144 - val_loss: 0.7220 - val_acc: 0.9516\n" + ] + } + ], + "source": [ + "model = keras.models.Sequential([\n", + " keras.layers.Flatten(input_shape=(7,7,512)),\n", + " keras.layers.Dense(1,activation='sigmoid')\n", + "])\n", + "model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc'])\n", + "hist = model.fit(ds_features_train, validation_data=ds_features_test)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "ఫలితం చాలా మంచిది, మేము ఒక పిల్లి మరియు కుక్క మధ్య సుమారు 95% సంభావ్యతతో తేడా చేయగలము! అయితే, మాన్యువల్ ఫీచర్ ఎక్స్‌ట్రాక్షన్ చాలా సమయం తీసుకుంటుందని అనిపించడంతో, మేము ఈ పద్ధతిని అన్ని చిత్రాల ఉపసమూహంలో పరీక్షించలేదు.\n", + "\n", + "## ఒక VGG నెట్‌వర్క్ ఉపయోగించి ట్రాన్స్‌ఫర్ లెర్నింగ్\n", + "\n", + "ట్రైనింగ్ సమయంలో ఫీచర్ ఎక్స్‌ట్రాక్టర్‌ను మా నెట్‌వర్క్‌లో మొదటి లేయర్‌గా చేర్చడం ద్వారా మేము మాన్యువల్‌గా ఫీచర్లను ముందుగా గణించకుండా ఉండవచ్చు.\n", + "\n", + "కెరాస్స్థాపన యొక్క అందమైన విషయం ఏమిటంటే, మేము పైగా నిర్వచించిన VGG-16 మోడల్‌ను ఇతర న్యూరల్ నెట్‌వర్క్‌లో ఒక లేయర్‌గా కూడా ఉపయోగించవచ్చు! మేము దాని పై డెన్స్ క్లాసిఫైయర్‌తో కూడిన నెట్‌వర్క్‌ను నిర్మించి, ఆ తరువాత బ్యాక్ ప్రొపగేషన్ ఉపయోగించి మొత్తం నెట్‌వర్క్‌ను ట్రైన్ చేయాలి.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"sequential\"\n", + "_________________________________________________________________\n", + "Layer (type) Output Shape Param # \n", + "=================================================================\n", + "vgg16 (Functional) (None, 7, 7, 512) 14714688 \n", + "_________________________________________________________________\n", + "flatten (Flatten) (None, 25088) 0 \n", + "_________________________________________________________________\n", + "dense (Dense) (None, 1) 25089 \n", + "=================================================================\n", + "Total params: 14,739,777\n", + "Trainable params: 25,089\n", + "Non-trainable params: 14,714,688\n", + "_________________________________________________________________\n" + ] + } + ], + "source": [ + "model = keras.models.Sequential()\n", + "model.add(keras.applications.VGG16(include_top=False,input_shape=(224,224,3)))\n", + "model.add(keras.layers.Flatten())\n", + "model.add(keras.layers.Dense(1,activation='sigmoid'))\n", + "\n", + "model.layers[0].trainable = False\n", + "\n", + "model.summary()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "ఈ మోడల్ చివరకి దాకా క్లాసిఫికేషన్ నెట్‌వర్క్‌లాగా కనిపిస్తుంది, ఇది ఒక చిత్రం తీసుకుని తరగతిని తిరిగి ఇస్తుంది. కానీ, చిక్కు విషయం ఏమిటంటే, VGG16ని ఫీచర్ ఎక్స్ట్రాక్టర్‌లాగా ఉపయోగించాలనుకుంటున్నాం, మరియు దీన్ని మళ్ళీ శిక్షణ కలపదలచలేదు. కాబట్టి, మనasu **కన్వల్యూషనల్ ఫీచర్ ఎక్స్ట్రాక్టర్ యొక్క وزنాలు నిశ్చలీకరించాలి**. మేము నెట్‌వర్క్ యొక్క మొదటి స్థరాన్ని `model.layers[0]`ని పిలిచి పొందవచ్చు, మరియు కేవలం `trainable` ప్రాపర్టీని `False`గా సెట్ చేయాల్సి ఉంటుంది.\n", + "\n", + "> **గమనిక**: ఫీచర్ ఎక్స్ట్రాక్టర్ రేట్లు నిశ్చలీకరించడం అవసరం, ఎందుకంటే కాకపోతే, శిక్షణ అందుకోని క్లాసిఫయర్ లేయర్ ఒరిజినల్ ప్రీ-ట్రెయిన్ చేసిన కన్వల్యూషనల్ ఎక్స్ట్రాక్టర్ వాటిని నాశనం చేయవచ్చు.\n", + "\n", + "మన నెట్‌వర్క్ లో మొత్తం పరిమాణాలు సుమారుగా 15 మిలియన్ల ఉంటే, మేము కేవలం 25k పరిమాణాలను మాత్రమే శిక్షణ పెడుతున్నాము. మిగతా అన్ని టాప్-లెవల్ కన్వల్యూషనల్ ఫిల్టర్లు ప్రీ-ట్రెయిన్ అయ్యాయి. ఇది మంచిది, ఎందుకంటే మేము తక్కువ సంక్షిప్త ఉదాహరణలతో తక్కువ మొత్తం పరిమాణాలను ఫైన్-ట్యూన్ చేయగలమని.\n", + "\n", + "ఇప్పుడు మనం నెట్‌వర్క్‌ని శిక్షణ పెడతాము మరియు మనం ఎంత మంచి ఫలితాలు పొందగలమో చూద్దాం. కొంత కాలం నడిచే వ్యవధి ఎక్కువగా ఉంటుంది అని భావించండి, మరియు ఎగ్జిక్యూషన్ కొంత కాలం నిలిచిపోయినట్లు అనిపించినా ఆందోళన చెందకండి.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "310/310 [==============================] - 265s 716ms/step - loss: 0.9917 - acc: 0.9512 - val_loss: 0.8156 - val_acc: 0.9671\n" + ] + } + ], + "source": [ + "model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc'])\n", + "hist = model.fit(ds_train, validation_data=ds_test)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "మనకు అనుకూలంగా కాపులు మరియు కుక్కల విభజకాన్ని సరిగ్గా పొందినట్లు కనిపిస్తోంది! \n", + "\n", + "## మోడల్ సేవ్ మరియు లోడ్ చేయడం\n", + "\n", + "మేము మోడల్‌ను శిక్షణ ఇచ్చాక, మోడల్ నిర్మాణం మరియు శిక్షణ పొందిన బరువులను భవిష్యత్తులో ఉపయోగానికి ఒక ఫైల్‌గా సేవ్ చేయవచ్చు:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "INFO:tensorflow:Assets written to: data/cats_dogs.tf/assets\n" + ] + } + ], + "source": [ + "model.save('data/cats_dogs.tf')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "తర్వాత మనం ఎప్పుడైనా ఫైలుండి మోడల్‌ను లోడ్ చేయవచ్చు. తదుపరి ప్రయోగం మోడల్‌ను ధ్వంసం చేస్తే ఇది మీకు ఉపయోగకరంగా ఉండవచ్చు - మీరు మొదుడుగా మళ్లీ ప్రారంభించాల్సిన అవసరం ఉండదు.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "model = keras.models.load_model('data/cats_dogs.tf')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## ఫైన్-ట్యూనింగ్ ట్రాన్స్ఫర్ లెర్నింగ్\n", + "\n", + "గత సెక్షన్‌లో, మనం చివరి క్లాసిఫైయర్ లేయర్‌ను మన డేటాసెట్లో ఉన్న చిత్రాలను వర్గీకరించడానికి శిక్షణ ఇచ్చాము. అయితే, మనం ఫీచర్ ఎక్స్‌ట్రాక్టర్‌ను మళ్లీ శిక్షణ ఇవ్వలేదు, మరియు మన మోడల్ ImageNet డేటా పై నేర్చుకున్న ఫీచర్లపై ఆధారపడి ఉంది. మీ వస్తువులు సాధారణ ImageNet చిత్రాలు నుండి దృశ్యంగా భిన్నంగా ఉంటే, ఈ ఫీచర్ల సమ్మేళనం ఉత్తమంగా పనిచేయకపోవచ్చు. అందువల్ల, కన్వల్యూషనల్ లేయర్లను కూడా శిక్షణ మొదలుపెట్టడం తోుకవది.\n", + "\n", + "అలా చేయడానికి, మనం ముందుగా ఫ్రీజ్ చేసిన కన్వల్యూషనల్ ఫిల్టర్ పరామితులను అన్‌ఫ్రీజ్ చేసుకోవచ్చు. \n", + "\n", + "> **గమనిక:** మొదట మీరు పరామితులను ఫ్రీజ్ చేసి, తరగతి లేయర్‌లో బరువులను స్థిరపరచడానికి కొన్ని epochs శిక్షణ చేయడం ముఖ్యం. మీరు వెంటనే అన్‌ఫ్రీజ్ చేసిన పరామితులతో ఎండ్-టు-ఎండ్ నెట్‌వర్క్‌ను శిక్షణ మొదలెడితే, పెద్ద లోపాలు కన్వల్యూషనల్ లేయర్లలో ప్రీ-ట్రెయిన్ అయ్యిన బరువులను ధ్వంసం చేసేవి.\n", + "\n", + "మన కన్వల్యూషనల్ VGG-16 మోడల్ మొదటి లేయర్ లో ఉంది, మరియు అది చాలా లేయర్లను కలిగి ఉంటుంది. మనం దాని నిర్మాణంపై ఒక చూపు వేయవచ్చు: \n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"vgg16\"\n", + "_________________________________________________________________\n", + "Layer (type) Output Shape Param # \n", + "=================================================================\n", + "input_1 (InputLayer) [(None, 224, 224, 3)] 0 \n", + "_________________________________________________________________\n", + "block1_conv1 (Conv2D) (None, 224, 224, 64) 1792 \n", + "_________________________________________________________________\n", + "block1_conv2 (Conv2D) (None, 224, 224, 64) 36928 \n", + "_________________________________________________________________\n", + "block1_pool (MaxPooling2D) (None, 112, 112, 64) 0 \n", + "_________________________________________________________________\n", + "block2_conv1 (Conv2D) (None, 112, 112, 128) 73856 \n", + "_________________________________________________________________\n", + "block2_conv2 (Conv2D) (None, 112, 112, 128) 147584 \n", + "_________________________________________________________________\n", + "block2_pool (MaxPooling2D) (None, 56, 56, 128) 0 \n", + "_________________________________________________________________\n", + "block3_conv1 (Conv2D) (None, 56, 56, 256) 295168 \n", + "_________________________________________________________________\n", + "block3_conv2 (Conv2D) (None, 56, 56, 256) 590080 \n", + "_________________________________________________________________\n", + "block3_conv3 (Conv2D) (None, 56, 56, 256) 590080 \n", + "_________________________________________________________________\n", + "block3_pool (MaxPooling2D) (None, 28, 28, 256) 0 \n", + "_________________________________________________________________\n", + "block4_conv1 (Conv2D) (None, 28, 28, 512) 1180160 \n", + "_________________________________________________________________\n", + "block4_conv2 (Conv2D) (None, 28, 28, 512) 2359808 \n", + "_________________________________________________________________\n", + "block4_conv3 (Conv2D) (None, 28, 28, 512) 2359808 \n", + "_________________________________________________________________\n", + "block4_pool (MaxPooling2D) (None, 14, 14, 512) 0 \n", + "_________________________________________________________________\n", + "block5_conv1 (Conv2D) (None, 14, 14, 512) 2359808 \n", + "_________________________________________________________________\n", + "block5_conv2 (Conv2D) (None, 14, 14, 512) 2359808 \n", + "_________________________________________________________________\n", + "block5_conv3 (Conv2D) (None, 14, 14, 512) 2359808 \n", + "_________________________________________________________________\n", + "block5_pool (MaxPooling2D) (None, 7, 7, 512) 0 \n", + "=================================================================\n", + "Total params: 14,714,688\n", + "Trainable params: 0\n", + "Non-trainable params: 14,714,688\n", + "_________________________________________________________________\n" + ] + } + ], + "source": [ + "model.layers[0].summary()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "మేము కన్వల్యూషనల్ బేస్ యొక్క అన్ని లేయర్లను అన్ఫ్రీజ్ చేయవచ్చు:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "model.layers[0].trainable = True" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "అయితే, అవన్నీ ఒకేసారి unfreeze చేయడం ఉత్తమమైన ఆలోచన కాదు. మొదట, కేవలం కొన్ని చివరి కాంభాల్యూషన్ లేయర్లు మాత్రమే unfreeze చేయవచ్చు, ఎందుకంటే అవి మా చిత్రాలకు సంబంధించి ఉన్న ఉన్నత స్థాయి నమూనాలను కలిగి ఉంటాయి. ఉదాహరణకు, మొదలు పెడితే, చివరి 4 లేయర్లు తప్ప అన్ని లేయర్లను freeze చేయవచ్చు: \n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"sequential\"\n", + "_________________________________________________________________\n", + "Layer (type) Output Shape Param # \n", + "=================================================================\n", + "vgg16 (Functional) (None, 7, 7, 512) 14714688 \n", + "_________________________________________________________________\n", + "flatten (Flatten) (None, 25088) 0 \n", + "_________________________________________________________________\n", + "dense (Dense) (None, 1) 25089 \n", + "=================================================================\n", + "Total params: 14,739,777\n", + "Trainable params: 7,104,513\n", + "Non-trainable params: 7,635,264\n", + "_________________________________________________________________\n" + ] + } + ], + "source": [ + "for i in range(len(model.layers[0].layers)-4):\n", + " model.layers[0].layers[i].trainable = False\n", + "model.summary()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "శిక్షణీయమైన పారామితుల సంఖ్య గణనీయంగా పెరిగిందని గమనించండి, కానీ ఇది ఇంకా మొత్తం పారామితుల సుమారు 50%కి సమీపంగా ఉంటుంది.\n", + "\n", + "అన్‌ఫ్రీజ్ చేసిన తర్వాత, కొన్ని మరిన్ని epochs శిక్షణ నిర్వహించవచ్చు (మా ఉదాహరణలో, మనం ఒక్కటి మాత్రమే చేయబోతున్నాము). ప్రీ-ట్రెయిన్డ్ వెయిట్లపై ప్రభావాన్ని తగ్గించేందుకు మీరు తక్కువ లెర్నింగ్ రేట్ ని కూడా ఎంచుకోవచ్చు. అయితే, తక్కువ లెర్నింగ్ రేట్ ఉన్నప్పటికీ, శిక్షణ ప్రారంభంలో ఖచ్చితత్వం తగ్గిపోవడం అనుకుంటే తప్పదు, చివరికి స్థిరమైన వెయిట్‌లకి కాపలీగా స్వల్పంగా ఎక్కువ స్థాయికి చేరుకోవచ్చు.\n", + "\n", + "> **గమనిక:** ఈ శిక్షణ చాలా మెల్లగా జరుగుతుంది, ఎందుకంటే మేము నెట్‌వర్క్ యొక్క అనేక పొరల ద్వారా గ్రాడియెంట్లను వెనుకకి ప్రసారం చేయాలి!\n" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "310/310 [==============================] - 201s 645ms/step - loss: 0.5270 - acc: 0.9776 - val_loss: 1.4132 - val_acc: 0.9653\n" + ] + } + ], + "source": [ + "hist = model.fit(ds_train, validation_data=ds_test)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "మనం ఎక్కువ పరిమితులతో మరింత శక్తివంతమైన నెట్‌వర్క్‌ను ఉపయోగిస్తున్నందున మేము ఎక్కువ శిక్షణ ఖచ్చితత్వం సాధించడానికి సాధ్యంగా ఉన్నాం, కానీ ధృవపత్ర ఖచ్చితత్వం అంతగా పెరగకపోవచ్చు.\n", + "\n", + "మీరు ఎక్కువ ఖచ్చితత్వాన్ని సాధించగలరా అని చూడటానికి నెట్‌వర్క్ యొక్క మరికొన్ని పొరలను అన ఫ్రీజ్ చేసి మరింత శిక్షణ పొందటానికి సంకోచించకండి!\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## ఇతర కంప్యూటర్ విజన్ మోడళ్లు\n", + "\n", + "VGG-16 అనేది అత్యంత సులభమైన కంప్యూటర్ విజన్ ఆర్కిటెక్చర్లలో ఒకటి. కేరాస్ అనేక ప్రీ-ట్రెయిన్డ్ నెట్‌వర్క్‌లను అందిస్తుంది. వాటిలో ఎక్కువగా ఉపయోగించే వంటివి మైక్రోసాఫ్ట్ అభివృద్ధి చేసిన **ResNet** ఆర్కిటెక్చర్లు మరియు గూగుల్ రూపొందించిన **Inception**. ఉదాహరణకు, అత్యంత సులభమైన ResNet-50 మోడల్ ఆర్కిటెక్చర్‌ని పరిశీలిద్దాం (ResNet అనేది వివిధ లోతులున్న మోడల్స్ కుటుంబం, మీరు నిజంగా లోతైన మోడల్ ఏలా ఉంటుందన్నదాన్ని చూడాలనుకుంటే ResNet-152 తో ప్రయోగించవచ్చు):\n" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"resnet50\"\n", + "__________________________________________________________________________________________________\n", + "Layer (type) Output Shape Param # Connected to \n", + "==================================================================================================\n", + "input_3 (InputLayer) [(None, 224, 224, 3) 0 \n", + "__________________________________________________________________________________________________\n", + "conv1_pad (ZeroPadding2D) (None, 230, 230, 3) 0 input_3[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv1_conv (Conv2D) (None, 112, 112, 64) 9472 conv1_pad[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv1_bn (BatchNormalization) (None, 112, 112, 64) 256 conv1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv1_relu (Activation) (None, 112, 112, 64) 0 conv1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "pool1_pad (ZeroPadding2D) (None, 114, 114, 64) 0 conv1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "pool1_pool (MaxPooling2D) (None, 56, 56, 64) 0 pool1_pad[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block1_1_conv (Conv2D) (None, 56, 56, 64) 4160 pool1_pool[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block1_1_bn (BatchNormali (None, 56, 56, 64) 256 conv2_block1_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block1_1_relu (Activation (None, 56, 56, 64) 0 conv2_block1_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block1_2_conv (Conv2D) (None, 56, 56, 64) 36928 conv2_block1_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block1_2_bn (BatchNormali (None, 56, 56, 64) 256 conv2_block1_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block1_2_relu (Activation (None, 56, 56, 64) 0 conv2_block1_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block1_0_conv (Conv2D) (None, 56, 56, 256) 16640 pool1_pool[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block1_3_conv (Conv2D) (None, 56, 56, 256) 16640 conv2_block1_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block1_0_bn (BatchNormali (None, 56, 56, 256) 1024 conv2_block1_0_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block1_3_bn (BatchNormali (None, 56, 56, 256) 1024 conv2_block1_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block1_add (Add) (None, 56, 56, 256) 0 conv2_block1_0_bn[0][0] \n", + " conv2_block1_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block1_out (Activation) (None, 56, 56, 256) 0 conv2_block1_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block2_1_conv (Conv2D) (None, 56, 56, 64) 16448 conv2_block1_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block2_1_bn (BatchNormali (None, 56, 56, 64) 256 conv2_block2_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block2_1_relu (Activation (None, 56, 56, 64) 0 conv2_block2_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block2_2_conv (Conv2D) (None, 56, 56, 64) 36928 conv2_block2_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block2_2_bn (BatchNormali (None, 56, 56, 64) 256 conv2_block2_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block2_2_relu (Activation (None, 56, 56, 64) 0 conv2_block2_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block2_3_conv (Conv2D) (None, 56, 56, 256) 16640 conv2_block2_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block2_3_bn (BatchNormali (None, 56, 56, 256) 1024 conv2_block2_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block2_add (Add) (None, 56, 56, 256) 0 conv2_block1_out[0][0] \n", + " conv2_block2_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block2_out (Activation) (None, 56, 56, 256) 0 conv2_block2_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block3_1_conv (Conv2D) (None, 56, 56, 64) 16448 conv2_block2_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block3_1_bn (BatchNormali (None, 56, 56, 64) 256 conv2_block3_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block3_1_relu (Activation (None, 56, 56, 64) 0 conv2_block3_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block3_2_conv (Conv2D) (None, 56, 56, 64) 36928 conv2_block3_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block3_2_bn (BatchNormali (None, 56, 56, 64) 256 conv2_block3_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block3_2_relu (Activation (None, 56, 56, 64) 0 conv2_block3_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block3_3_conv (Conv2D) (None, 56, 56, 256) 16640 conv2_block3_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block3_3_bn (BatchNormali (None, 56, 56, 256) 1024 conv2_block3_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block3_add (Add) (None, 56, 56, 256) 0 conv2_block2_out[0][0] \n", + " conv2_block3_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2_block3_out (Activation) (None, 56, 56, 256) 0 conv2_block3_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block1_1_conv (Conv2D) (None, 28, 28, 128) 32896 conv2_block3_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block1_1_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block1_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block1_1_relu (Activation (None, 28, 28, 128) 0 conv3_block1_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block1_2_conv (Conv2D) (None, 28, 28, 128) 147584 conv3_block1_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block1_2_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block1_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block1_2_relu (Activation (None, 28, 28, 128) 0 conv3_block1_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block1_0_conv (Conv2D) (None, 28, 28, 512) 131584 conv2_block3_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block1_3_conv (Conv2D) (None, 28, 28, 512) 66048 conv3_block1_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block1_0_bn (BatchNormali (None, 28, 28, 512) 2048 conv3_block1_0_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block1_3_bn (BatchNormali (None, 28, 28, 512) 2048 conv3_block1_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block1_add (Add) (None, 28, 28, 512) 0 conv3_block1_0_bn[0][0] \n", + " conv3_block1_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block1_out (Activation) (None, 28, 28, 512) 0 conv3_block1_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block2_1_conv (Conv2D) (None, 28, 28, 128) 65664 conv3_block1_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block2_1_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block2_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block2_1_relu (Activation (None, 28, 28, 128) 0 conv3_block2_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block2_2_conv (Conv2D) (None, 28, 28, 128) 147584 conv3_block2_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block2_2_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block2_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block2_2_relu (Activation (None, 28, 28, 128) 0 conv3_block2_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block2_3_conv (Conv2D) (None, 28, 28, 512) 66048 conv3_block2_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block2_3_bn (BatchNormali (None, 28, 28, 512) 2048 conv3_block2_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block2_add (Add) (None, 28, 28, 512) 0 conv3_block1_out[0][0] \n", + " conv3_block2_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block2_out (Activation) (None, 28, 28, 512) 0 conv3_block2_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block3_1_conv (Conv2D) (None, 28, 28, 128) 65664 conv3_block2_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block3_1_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block3_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block3_1_relu (Activation (None, 28, 28, 128) 0 conv3_block3_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block3_2_conv (Conv2D) (None, 28, 28, 128) 147584 conv3_block3_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block3_2_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block3_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block3_2_relu (Activation (None, 28, 28, 128) 0 conv3_block3_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block3_3_conv (Conv2D) (None, 28, 28, 512) 66048 conv3_block3_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block3_3_bn (BatchNormali (None, 28, 28, 512) 2048 conv3_block3_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block3_add (Add) (None, 28, 28, 512) 0 conv3_block2_out[0][0] \n", + " conv3_block3_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block3_out (Activation) (None, 28, 28, 512) 0 conv3_block3_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block4_1_conv (Conv2D) (None, 28, 28, 128) 65664 conv3_block3_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block4_1_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block4_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block4_1_relu (Activation (None, 28, 28, 128) 0 conv3_block4_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block4_2_conv (Conv2D) (None, 28, 28, 128) 147584 conv3_block4_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block4_2_bn (BatchNormali (None, 28, 28, 128) 512 conv3_block4_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block4_2_relu (Activation (None, 28, 28, 128) 0 conv3_block4_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block4_3_conv (Conv2D) (None, 28, 28, 512) 66048 conv3_block4_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block4_3_bn (BatchNormali (None, 28, 28, 512) 2048 conv3_block4_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block4_add (Add) (None, 28, 28, 512) 0 conv3_block3_out[0][0] \n", + " conv3_block4_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv3_block4_out (Activation) (None, 28, 28, 512) 0 conv3_block4_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block1_1_conv (Conv2D) (None, 14, 14, 256) 131328 conv3_block4_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block1_1_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block1_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block1_1_relu (Activation (None, 14, 14, 256) 0 conv4_block1_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block1_2_conv (Conv2D) (None, 14, 14, 256) 590080 conv4_block1_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block1_2_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block1_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block1_2_relu (Activation (None, 14, 14, 256) 0 conv4_block1_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block1_0_conv (Conv2D) (None, 14, 14, 1024) 525312 conv3_block4_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block1_3_conv (Conv2D) (None, 14, 14, 1024) 263168 conv4_block1_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block1_0_bn (BatchNormali (None, 14, 14, 1024) 4096 conv4_block1_0_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block1_3_bn (BatchNormali (None, 14, 14, 1024) 4096 conv4_block1_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block1_add (Add) (None, 14, 14, 1024) 0 conv4_block1_0_bn[0][0] \n", + " conv4_block1_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block1_out (Activation) (None, 14, 14, 1024) 0 conv4_block1_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block2_1_conv (Conv2D) (None, 14, 14, 256) 262400 conv4_block1_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block2_1_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block2_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block2_1_relu (Activation (None, 14, 14, 256) 0 conv4_block2_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block2_2_conv (Conv2D) (None, 14, 14, 256) 590080 conv4_block2_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block2_2_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block2_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block2_2_relu (Activation (None, 14, 14, 256) 0 conv4_block2_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block2_3_conv (Conv2D) (None, 14, 14, 1024) 263168 conv4_block2_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block2_3_bn (BatchNormali (None, 14, 14, 1024) 4096 conv4_block2_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block2_add (Add) (None, 14, 14, 1024) 0 conv4_block1_out[0][0] \n", + " conv4_block2_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block2_out (Activation) (None, 14, 14, 1024) 0 conv4_block2_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block3_1_conv (Conv2D) (None, 14, 14, 256) 262400 conv4_block2_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block3_1_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block3_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block3_1_relu (Activation (None, 14, 14, 256) 0 conv4_block3_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block3_2_conv (Conv2D) (None, 14, 14, 256) 590080 conv4_block3_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block3_2_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block3_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block3_2_relu (Activation (None, 14, 14, 256) 0 conv4_block3_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block3_3_conv (Conv2D) (None, 14, 14, 1024) 263168 conv4_block3_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block3_3_bn (BatchNormali (None, 14, 14, 1024) 4096 conv4_block3_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block3_add (Add) (None, 14, 14, 1024) 0 conv4_block2_out[0][0] \n", + " conv4_block3_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block3_out (Activation) (None, 14, 14, 1024) 0 conv4_block3_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block4_1_conv (Conv2D) (None, 14, 14, 256) 262400 conv4_block3_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block4_1_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block4_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block4_1_relu (Activation (None, 14, 14, 256) 0 conv4_block4_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block4_2_conv (Conv2D) (None, 14, 14, 256) 590080 conv4_block4_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block4_2_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block4_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block4_2_relu (Activation (None, 14, 14, 256) 0 conv4_block4_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block4_3_conv (Conv2D) (None, 14, 14, 1024) 263168 conv4_block4_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block4_3_bn (BatchNormali (None, 14, 14, 1024) 4096 conv4_block4_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block4_add (Add) (None, 14, 14, 1024) 0 conv4_block3_out[0][0] \n", + " conv4_block4_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block4_out (Activation) (None, 14, 14, 1024) 0 conv4_block4_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block5_1_conv (Conv2D) (None, 14, 14, 256) 262400 conv4_block4_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block5_1_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block5_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block5_1_relu (Activation (None, 14, 14, 256) 0 conv4_block5_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block5_2_conv (Conv2D) (None, 14, 14, 256) 590080 conv4_block5_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block5_2_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block5_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block5_2_relu (Activation (None, 14, 14, 256) 0 conv4_block5_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block5_3_conv (Conv2D) (None, 14, 14, 1024) 263168 conv4_block5_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block5_3_bn (BatchNormali (None, 14, 14, 1024) 4096 conv4_block5_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block5_add (Add) (None, 14, 14, 1024) 0 conv4_block4_out[0][0] \n", + " conv4_block5_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block5_out (Activation) (None, 14, 14, 1024) 0 conv4_block5_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block6_1_conv (Conv2D) (None, 14, 14, 256) 262400 conv4_block5_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block6_1_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block6_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block6_1_relu (Activation (None, 14, 14, 256) 0 conv4_block6_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block6_2_conv (Conv2D) (None, 14, 14, 256) 590080 conv4_block6_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block6_2_bn (BatchNormali (None, 14, 14, 256) 1024 conv4_block6_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block6_2_relu (Activation (None, 14, 14, 256) 0 conv4_block6_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block6_3_conv (Conv2D) (None, 14, 14, 1024) 263168 conv4_block6_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block6_3_bn (BatchNormali (None, 14, 14, 1024) 4096 conv4_block6_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block6_add (Add) (None, 14, 14, 1024) 0 conv4_block5_out[0][0] \n", + " conv4_block6_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv4_block6_out (Activation) (None, 14, 14, 1024) 0 conv4_block6_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block1_1_conv (Conv2D) (None, 7, 7, 512) 524800 conv4_block6_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block1_1_bn (BatchNormali (None, 7, 7, 512) 2048 conv5_block1_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block1_1_relu (Activation (None, 7, 7, 512) 0 conv5_block1_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block1_2_conv (Conv2D) (None, 7, 7, 512) 2359808 conv5_block1_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block1_2_bn (BatchNormali (None, 7, 7, 512) 2048 conv5_block1_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block1_2_relu (Activation (None, 7, 7, 512) 0 conv5_block1_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block1_0_conv (Conv2D) (None, 7, 7, 2048) 2099200 conv4_block6_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block1_3_conv (Conv2D) (None, 7, 7, 2048) 1050624 conv5_block1_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block1_0_bn (BatchNormali (None, 7, 7, 2048) 8192 conv5_block1_0_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block1_3_bn (BatchNormali (None, 7, 7, 2048) 8192 conv5_block1_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block1_add (Add) (None, 7, 7, 2048) 0 conv5_block1_0_bn[0][0] \n", + " conv5_block1_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block1_out (Activation) (None, 7, 7, 2048) 0 conv5_block1_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block2_1_conv (Conv2D) (None, 7, 7, 512) 1049088 conv5_block1_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block2_1_bn (BatchNormali (None, 7, 7, 512) 2048 conv5_block2_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block2_1_relu (Activation (None, 7, 7, 512) 0 conv5_block2_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block2_2_conv (Conv2D) (None, 7, 7, 512) 2359808 conv5_block2_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block2_2_bn (BatchNormali (None, 7, 7, 512) 2048 conv5_block2_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block2_2_relu (Activation (None, 7, 7, 512) 0 conv5_block2_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block2_3_conv (Conv2D) (None, 7, 7, 2048) 1050624 conv5_block2_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block2_3_bn (BatchNormali (None, 7, 7, 2048) 8192 conv5_block2_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block2_add (Add) (None, 7, 7, 2048) 0 conv5_block1_out[0][0] \n", + " conv5_block2_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block2_out (Activation) (None, 7, 7, 2048) 0 conv5_block2_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block3_1_conv (Conv2D) (None, 7, 7, 512) 1049088 conv5_block2_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block3_1_bn (BatchNormali (None, 7, 7, 512) 2048 conv5_block3_1_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block3_1_relu (Activation (None, 7, 7, 512) 0 conv5_block3_1_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block3_2_conv (Conv2D) (None, 7, 7, 512) 2359808 conv5_block3_1_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block3_2_bn (BatchNormali (None, 7, 7, 512) 2048 conv5_block3_2_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block3_2_relu (Activation (None, 7, 7, 512) 0 conv5_block3_2_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block3_3_conv (Conv2D) (None, 7, 7, 2048) 1050624 conv5_block3_2_relu[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block3_3_bn (BatchNormali (None, 7, 7, 2048) 8192 conv5_block3_3_conv[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block3_add (Add) (None, 7, 7, 2048) 0 conv5_block2_out[0][0] \n", + " conv5_block3_3_bn[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv5_block3_out (Activation) (None, 7, 7, 2048) 0 conv5_block3_add[0][0] \n", + "__________________________________________________________________________________________________\n", + "avg_pool (GlobalAveragePooling2 (None, 2048) 0 conv5_block3_out[0][0] \n", + "__________________________________________________________________________________________________\n", + "predictions (Dense) (None, 1000) 2049000 avg_pool[0][0] \n", + "==================================================================================================\n", + "Total params: 25,636,712\n", + "Trainable params: 25,583,592\n", + "Non-trainable params: 53,120\n", + "__________________________________________________________________________________________________\n" + ] + } + ], + "source": [ + "resnet = keras.applications.ResNet50()\n", + "resnet.summary()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "మీరు చూడగలిగినట్లుగా, ఈ మోడల్ ఒకే పర్యాయ కట్టడం భాగాల్నీ కలిగి ఉంది: కన్వల్యూషనల్ లేయర్లు, పూలింగ్ లేయర్లు మరియు చివరి డెన్స్ క్లాసిఫైయర్. మేము VGG-16 ను ట్రాన్స్‌ఫర్ లెర్నింగ్ కోసం ఉపయోగిస్తునట్లే ఈ మోడల్‌ను ఖచ్చితంగా అదే విధంగా ఉపయోగించుకోవచ్చు. పై కోడ్ తో ప్రయోగం చేసి, వేరే ResNet మోడల్స్‌ని బేస్ మోడల్‌గా ఉపయోగించి, ఖచ్చితత్వం ఎలా మార్చబడుతుందో చూడు.\n", + "\n", + "## బ్యాచ్ నార్మలైజేషన్\n", + "\n", + "ఈ నెట్‌వర్క్ మరో రకమైన లేయర్‌ను కలిగి ఉంది: **బ్యాచ్ నార్మలైజేషన్**. బ్యాచ్ నార్మలైజేషన్ యొక్క ఆలోచన ఏమిటంటే, న్యూయరల్ నెట్‌వర్క్ ద్వారా ప్రవహించే విలువలను సరైన పరిధిలోకి తీసుకువెళ్లడం. సాధారణంగా న్యూయరల్ నెట్‌వర్క్‌లు అన్ని విలువలూ [-1,1] లేదా [0,1] పరిధిలో ఉన్నప్పుడు అత్యుత్తమంగా పనిచేస్తాయి, అందుకే మనం ఇన్‌పుట్ డేటాను అనుగుణంగా స్కేలింగ్/నార్మలైజ్ చేస్తాము. అయితే, లోతైన నెట్‌వర్క్ శిక్షణ సమయంలో, విలువలు ఈ పరిధికి ఎక్కువగా దాటి పోవచ్చు, ఇది శిక్షణను కష్టతరం చేస్తుంది. బ్యాచ్ నార్మలైజేషన్ లేయర్ ప్రస్తుత మినీ బ్యాచ్ లోని అన్ని విలువల సగటు మరియు స్టాండర్డ్ డివియేషన్‌ను లెక్కించి, న్యూయరల్ నెట్‌వర్క్ లేయర్‌కి పంపించే ముందు సిగ్నల్‌ను నార్మలైజ్ చేస్తుంది. ఇది లోతైన నెట్‌వర్క్‌ల స్థిరత్వాన్ని గణనీయంగా మెరుగుపరుస్తుంది.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## సారాంశం\n", + "\n", + "ట్రాన్స్‌ఫర్ లెర్నింగ్‌ని ఉపయోగిస్తూ, మన కస్టమ్ ఆబ్జెక్ట్ వర్గీకరణ పనికి త్వరగా క్లాసిఫయర్ తయారు చేసి, అధిక ఖచ్చితత్వం సాధించగలిగాము. అయితే, ఈ ఉదాహరణ పూర్తిగా న్యాయమైనది కాదు, ఎందుకంటే అసలు VGG-16 నెట్‌వర్క్ పిల్లులు మరియు కుక్కలను గుర్తించడానికి ముందుగా శిక్షణ పొందింది, కాబట్టి మనకు ఇప్పటికే నెట్‌వర్క్‌లో ఉన్న చాలా నమూనాలను మళ్లీ ఉపయోగించే అవకాశం కలిగింది. ప్రొడక్షన్ లైన్‌లోని వివరాలు లేదా వివిధ చెట్టు ఆకులు వంటి మరింత విదేశీ డొమైన్-నిర్దిష్ట వస్తువులపై తక్కువ ఖచ్చితత్వం సాధించవచ్చు.\n", + "\n", + "మనము ఇప్పుడు పరిష్కరించగలిగే క్లిష్టమైన పనులు ఎక్కువ కంప్యూటేషనల్ శక్తిని అవసరం చేస్తాయని మీరు చూడవచ్చు, మరియు CPU పై సులభంగా పరిష్కరించలేవు. తరువాతి యూనిట్‌లో, తక్కువ కంప్యూట్ వనరులను ఉపయోగించి అదే మodel్‌ను శిక్షణ ఇచ్చేందుకు మరింత తేలికపాటి అమలు ప్రయత్నిస్తాము, దీనివల్ల సగటు ఖచ్చితత్వం కొద్దిగా తక్కువ అవుతుంది.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**అస్వీకరణ**:\nఈ పత్రం AI అనువాద సేవ [Co-op Translator](https://github.com/Azure/co-op-translator) ఉపయోగించి అనువదించబడింది. మేము ఖచ్చితత్వానికి ప్రయత్నిస్తున్నప్పటికీ, ఆటోమేటెడ్ అనువాదాలు తప్పులు లేదా అసమగ్రతలను కలిగి ఉండవచ్చు. దాని స్వదేశ భాషలో ఉన్న అసలు పత్రాన్ని అధికారం కలిగిన మూలంగా పరిగణించాలి. కీలకమైన సమాచారం కోసం, ప్రొఫెషనల్ మానవ అనువాదాన్ని సిఫారసు చేస్తాము. ఈ అనువాదం ఉపయోగం వల్ల కలిగే ఏవైనా అపార్థాలు లేదా తప్పుదారులు కోసం మేము బాధ్యత వహించము.\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "py38_tensorflow", + "language": "python", + "name": "conda-env-py38_tensorflow-py" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 4 } \ No newline at end of file diff --git a/translations/te/lessons/5-NLP/README.md b/translations/te/lessons/5-NLP/README.md index c28fde4620..5c295de664 100644 --- a/translations/te/lessons/5-NLP/README.md +++ b/translations/te/lessons/5-NLP/README.md @@ -1,51 +1,51 @@ # సహజ భాషా ప్రాసెసింగ్ -![NLP పనుల సారాంశం ఒక డ్రాయింగ్‌లో](../../../../translated_images/te/ai-nlp.b22dcb8ca4707cea.webp) +![ఎన్‌ఎల్పీ పనుల సారాంశం ఒక డ్రాయింగ్‌లో](../../../../translated_images/te/ai-nlp.b22dcb8ca4707cea.webp) -ఈ విభాగంలో, మనం సహజ భాషా ప్రాసెసింగ్ (NLP) సంబంధిత పనులను నిర్వహించడానికి న్యూరల్ నెట్‌వర్క్‌లను ఉపయోగించడంపై దృష్టి పెట్టబోతున్నాము. కంప్యూటర్లు పరిష్కరించగలిగే అనేక NLP సమస్యలు ఉన్నాయి: +ఈ ప్రథాయంలో, మనం **సహజ భాషా ప్రాసెసింగ్ (NLP)** కు సంబంధించిన పనులను చూసే న్యూరల్ నెట్‌వర్క్స్ ఉపయోగంపై ధ్యాస పెట్టుకుందని ఉంటాం. కంప్యూటర్లు పరిష్కరించగలిగే అనేక NLP సమస్యలు ఉన్నాయి: -* **పాఠ్య వర్గీకరణ** అనేది పాఠ్య శ్రేణులకి సంబంధించిన సాధారణ వర్గీకరణ సమస్య. ఉదాహరణకు, ఇమెయిల్ సందేశాలను స్పామ్ లేదా నాన్-స్పామ్‌గా వర్గీకరించడం, లేదా వ్యాసాలను క్రీడలు, వ్యాపారం, రాజకీయాలు వంటి వర్గాలుగా వర్గీకరించడం. చాట్ బాట్లను అభివృద్ధి చేస్తున్నప్పుడు, వినియోగదారు ఏమి చెప్పాలనుకున్నాడో అర్థం చేసుకోవడం అవసరం అవుతుంది -- ఈ సందర్భంలో మనం **ఇరాదా వర్గీకరణ**తో వ్యవహరిస్తున్నాము. ఇరాదా వర్గీకరణలో తరచుగా అనేక వర్గాలతో వ్యవహరించాల్సి ఉంటుంది. -* **భావ విశ్లేషణ** అనేది సాధారణ రిగ్రెషన్ సమస్య, ఇందులో వాక్య అర్థం ఎంత సానుకూలం/నెగటివ్ అనేదానికి సంబంధించిన సంఖ్య (భావం) ఇవ్వాలి. భావ విశ్లేషణ యొక్క అభివృద్ధి చెందిన రూపం **అంశాల ఆధారిత భావ విశ్లేషణ** (ABSA), ఇందులో భావాన్ని మొత్తం వాక్యం కాకుండా వాక్యంలోని వివిధ భాగాలకు (అంశాలకు) కేటాయిస్తారు, ఉదా. *ఈ రెస్టారెంట్‌లో నాకు వంటకం నచ్చింది, కానీ వాతావరణం భయంకరంగా ఉంది*. -* **పేరు గుర్తింపు** (NER) అనేది పాఠ్యంలోని నిర్దిష్ట అంశాలను తీసుకోవడం. ఉదాహరణకు, *నేను రేపు పారిస్‌కు ప్రయాణించాలి* అనే వాక్యంలో *రేపు* అనేది తేదీకి (DATE) సూచిస్తుందని, *పారిస్* అనేది స్థలానికి (LOCATION) సంబంధించినదని అర్థం చేసుకోవాలి. -* **కీవర్డ్ ఎక్స్‌ట్రాక్షన్** NERకి సమానంగా ఉంటుంది, కానీ ఇందులో నిర్దిష్ట అంశ రకాల కోసం ముందుగా శిక్షణ లేకుండా వాక్య అర్థానికి ముఖ్యమైన పదాలను ఆటోమేటిక్‌గా తీసుకోవాలి. -* **పాఠ్య క్లస్టరింగ్** అనేది సారూప్యమైన వాక్యాలను ఒకటిగా సమూహీకరించడానికి ఉపయోగపడుతుంది, ఉదాహరణకు, సాంకేతిక మద్దతు సంభాషణలలో సారూప్యమైన అభ్యర్థనలు. -* **ప్రశ్నోత్తరం** అనేది ఒక నమూనా నిర్దిష్ట ప్రశ్నకు సమాధానం ఇవ్వగల సామర్థ్యం. నమూనా ఒక పాఠ్య భాగం మరియు ప్రశ్నను ఇన్‌పుట్‌గా తీసుకుని, ప్రశ్నకు సమాధానం ఉన్న పాఠ్య భాగాన్ని అందించాలి (లేదా, కొన్నిసార్లు సమాధానాన్ని సృష్టించాలి). -* **పాఠ్య ఉత్పత్తి** అనేది ఒక నమూనా కొత్త పాఠ్యాన్ని సృష్టించగల సామర్థ్యం. ఇది ఒక వర్గీకరణ పనిగా పరిగణించవచ్చు, ఇది కొన్ని *పాఠ్య ప్రాంప్ట్* ఆధారంగా తదుపరి అక్షరం/పదాన్ని అంచనా వేస్తుంది. GPT-3 వంటి అభివృద్ధి చెందిన పాఠ్య ఉత్పత్తి నమూనాలు, [prompt programming](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) లేదా [prompt engineering](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29) అనే సాంకేతికత ఉపయోగించి వర్గీకరణ వంటి ఇతర NLP పనులను కూడా పరిష్కరించగలవు. -* **పాఠ్య సారాంశం** అనేది కంప్యూటర్‌ను పొడవైన పాఠ్యాన్ని "చదవించి" దాన్ని కొన్ని వాక్యాలలో సారాంశం చేయించడానికి ఉపయోగించే సాంకేతికత. -* **యంత్ర అనువాదం** అనేది ఒక భాషలో పాఠ్యాన్ని అర్థం చేసుకోవడం మరియు మరొక భాషలో పాఠ్యాన్ని ఉత్పత్తి చేయడం కలయికగా చూడవచ్చు. +* **టెక్స్ట్ వర్గీకరణ** అనేది ఒక సాధారణ వర్గీకరణ సమస్య, ఇది వచన సలుపులతో సంబంధం కలిగినది. ఉదాహరణకు, ఇమెయిల్ సందేశాలను స్పామ్ లేదా నాన్-స్పామ్‌గా వర్గీకరించడం, లేదా వ్యాసాలను క్రీడలు, వ్యాపారం, రాజకీయాలు వంటివిగా వర్గీకరించడం. అలాగే, చాట్ బాట్ల అభివృద్ధిలో యూజర్ ఏమి చెప్పాలని భావిస్తున్నాడో అర్థం చేసుకోవాలి -- ఈ సందర్భంలో మనం **ఉద్దేశ వర్గీకరణ**తో వ్యవహరిస్తున్నాం. చాలా సందర్భాల్లో, ఉద్దేశ వర్గీకరణలో అనేక వర్గాలతో జోరుల ప్రయోజనం ఉంటుంది. +* **భావ విశ్లేషణ** ఒక సాధారణ రిగ్రెషన్ సమస్య, ఇందులో వాక్యం యొక్క అర్థం ఎంత అభినందనాత్మక లేదా ప్రతికూలమో సూచించే సంఖ్య (భావం)ని కేటాయించాలి. భావ విశ్లేషణ యొక్క మరింత అభివృద్ధి చెందిన సంస్కరణ **అంశాభిప్రాయ ఆధారిత భావ విశ్లేషణ** (ABSA) అంటే భావం పూర్తి వాక్యం కాకుండా వాక్యం భాగాలకు (అంశాలు) కేటాయించడం, ఉదా. *ఈ రెస్టారెంట్‌లో, నేను వంటకాన్ని ఇష్టపడ్డాను, కానీ వాతావరణం భయంకరంగా ఉంది*. +* **పేరు సాధారణ గుర్తింపు** (NER) అంటే వచనం నుండి కొన్ని నిర్దిష్ట ఏకకాల ప్రసంగాలను తీయడమే. ఉదాహరణకు, *నేను రేపు పారిస్‌కు ఫ్లై చేయాలి* అన్న పదంలో *రేపు* అంటే తేదీ మరియు *పారిస్* అంటే స్థలం అనేది అర్థం చేసుకోవాలి. +* **కీవర్డ్ ఎక్స్ట్రాక్షన్** NER కి సమానంగా ఉంటుంది, కానీ ప్రత్యేక ఏకకాలప్రకారాల కోసం ముందుగా శిక్షణ చేయకుండా వాక్యం అర్థానికి ముఖ్యమైన పదాలను స్వయంచాలకంగా తీసుకోవాలి. +* **వచన సమూహీకరణ** అనగా దాదాపు సమానమైన వాక్యాలను ఒకదానితో మరొకటి సమూహీకరించడంలో ఉపయోగపడుతుంది, ఉదా., సాంకేతిక మద్దతు సంభాషణలలో ఇలాంటి సమానమైన అభ్యర్థనలు. +* **ప్రశ్నోత్తరము** అంటే ఒక మోడల్ నిర్దిష్టమైన ప్రశ్నకు సమాధానం ఇవ్వగల సామర్థ్యం. మోడల్ ఒక వచన భాగం మరియు ప్రశ్నను ఇన్‌పుట్‌గా తీసుకుంటుంది, ప్రశ్నకు సమాధానం ఉన్న వచన భాగాన్ని ఇవ్వాలి (లేదా కొన్ని సందర్భాల్లో సమాధాన వచనం ఉత్పత్తి చేయాలి). +* **వచన సృష్టి** అంటే ఒక మోడల్ కొత్త వచనం సృష్టించగల సామర్థ్యం. ఇది ఒక వర్గీకరణగా పరిగణించవచ్చు, ఇది కొంత *వచన సూచన* ఆధారంగా తదుపరి అక్షరం/పదాన్ని ఊహిస్తుంది. GPT-3 వంటి ఆధునిక వచన సృష్టి మోడళ్లు [prompt programming](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) లేదా [prompt engineering](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29) అనే సాంకేతికత ఉపయోగించి వేరే NLP పనులను కూడా పరిష్కరిస్తాయి. +* **వచన సారాంశీకరణ** అంటే కంప్యూటర్ చాలా వడిగా వచనం చదవటం, మరియు కొన్ని వాక్యాలలో దాని సారాంశాన్ని ఇవ్వడం. +* **మిషన్ అనువాదం** అనగా ఒక భాషలో వచనం అర్ధం చేసుకుని, మరొక భాషలో వచనం సృష్టించడం. -ప్రారంభంలో, చాలా NLP పనులు వ్యాకరణాలు వంటి సాంప్రదాయ పద్ధతులతో పరిష్కరించబడ్డాయి. ఉదాహరణకు, యంత్ర అనువాదంలో మొదటి వాక్యాన్ని సింటాక్స్ ట్రీగా మార్చడానికి పార్సర్లు ఉపయోగించబడ్డాయి, ఆపై వాక్య అర్థాన్ని సూచించే ఉన్నత స్థాయి సేమాంటిక్ నిర్మాణాలు తీసుకున్నారు, ఆ అర్థం మరియు లక్ష్య భాష వ్యాకరణం ఆధారంగా ఫలితాన్ని ఉత్పత్తి చేశారు. ఈ రోజుల్లో, అనేక NLP పనులు న్యూరల్ నెట్‌వర్క్‌లను ఉపయోగించి మరింత సమర్థవంతంగా పరిష్కరించబడుతున్నాయి. +మొదట్లో, చాలామంది NLP పనులను సంప్రదాయ విధానాలతో జరిపేవారు, ఉదా. వ్యాకరణాలు. ఉదాహరణకు మిషన్ అనువాదంలో పార్సర్లు మూల వాక్యాన్ని సింటాక్స్ చెట్టు గా మార్చేవి, తరువాతపై స్థాయి సారాంశ నిర్మాణాలను తీసుకుని వాక్యం అర్థాన్ని సృష్టించేవి, ఆర్థం మరియు లక్ష్య భాష వ్యాకరణంతో ఫలితాన్ని జనరేట్ చేసేవి. ప్రస్తుతం, అనేక NLP పనులు అధిక సమర్థతతో న్యూరల్ నెట్‌వర్క్స్ ద్వారా పరిష్కరించబడుతున్నాయి. -> అనేక సాంప్రదాయ NLP పద్ధతులు [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org) పైథాన్ లైబ్రరీలో అమలు చేయబడ్డాయి. వివిధ NLP పనులను NLTK ఉపయోగించి ఎలా పరిష్కరించాలో వివరించే గొప్ప [NLTK పుస్తకం](https://www.nltk.org/book/) ఆన్‌లైన్‌లో అందుబాటులో ఉంది. +> [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org) పైథాన్ లైబ్రరీలో చాలా సంప్రదాయ NLP పద్ధతులు అమలవుతాయి. అంతేకాకుండా, ఎలా NLTK ఉపయోగించి వివిధ NLP పనులు పరిష్కరించవచ్చో చెప్తున్న గొప్ప [NLTK పుస్తకం](https://www.nltk.org/book/) ఆన్లైన్ లో అందుబాటులో ఉంది. -మన కోర్సులో, మనం ప్రధానంగా NLP కోసం న్యూరల్ నెట్‌వర్క్‌లను ఉపయోగించడంపై దృష్టి పెట్టబోతున్నాము, అవసరమైతే NLTKని ఉపయోగిస్తాము. +మన కోర్సులో, ఎక్కువగా న్యూరల్ నెట్‌వర్క్స్‌ని NLP కోసం ఉపయోగించేటట్టు తీసుకువస్తాం, అవసరమైతే NLTK ని ఉపయోగిస్తాం. -మనం ఇప్పటికే పట్టిక డేటా మరియు చిత్రాలతో వ్యవహరించడానికి న్యూరల్ నెట్‌వర్క్‌లను ఉపయోగించడం గురించి నేర్చుకున్నాము. ఆ డేటా రకాలతో పాఠ్యం మధ్య ప్రధాన తేడా ఏమిటంటే, పాఠ్యం అనేది మార్పిడి పొడవు కలిగిన శ్రేణి, కానీ చిత్రాల ఇన్‌పుట్ పరిమాణం ముందే తెలుసు. కన్వల్యూషనల్ నెట్‌వర్క్‌లు ఇన్‌పుట్ డేటా నుండి నమూనాలను తీసుకోవచ్చు, కానీ పాఠ్యంలో నమూనాలు మరింత సంక్లిష్టంగా ఉంటాయి. ఉదా., నెగేషన్ (నాక ఇష్టం లేదు) మరియు విషయం మధ్య అనేక పదాల దూరం ఉండొచ్చు (ఉదా. *I do not like oranges*, vs. *I do not like those big colorful tasty oranges*), కానీ అది ఒకే నమూనాగా భావించాలి. కాబట్టి, భాషను నిర్వహించడానికి మనం కొత్త న్యూరల్ నెట్‌వర్క్ రకాలు, ఉదా. *రెకరెంట్ నెట్‌వర్క్‌లు* మరియు *ట్రాన్స్‌ఫార్మర్స్* పరిచయం చేయాలి. +మేము ఇప్పటికే పట్టికా డేటా మరియు చిత్రాలతో పని చేసే న్యూరల్ నెట్‌వర్క్‌లు గురించి నేర్చుకున్నాము. ఆ డేటా రకాలతో మరియు వచనంతో ప్రధాన వ్యత్యాసం ఏమిటంటే, వచనం వరుసగా ఉంటే, చిత్రాల ఇన్‌పుట్ పరిమాణం ముందుగా తెలిసి ఉంటుంది. కాంలోవల్యూషనల్ నెట్‌వర్క్‌లు ఇన్‌పుట్ డేటా నుండి నమూనాలను వెలువరించగలవు కానీ వచన నమూనాలు మరింత క్లిష్టమైనవి. ఉదా., వాక్యం లో నెగేషన్ విషయం నుండి వేరుగా ఉండొచ్చు (ఉదా. *I do not like oranges* మరియు *I do not like those big colorful tasty oranges*), అయినా అది ఒక్కటేనైన నమూనాగా అర్థం చేసుకోవాలి. కాబట్టి భాషను నిర్వహించడానికి మనం కొత్త న్యూరల్ నెట్‌వర్క్ రకాలు అవసరం, ఉదా., *రీకరెంట్ నెట్‌వర్క్‌లు* మరియు *ట్రాన్స్‌ఫార్మర్స్*. -## లైబ్రరీలు ఇన్‌స్టాల్ చేయండి +## లైబ్రరీల ఇన్‌స్టాల్ చేయండి -మీరు ఈ కోర్సును స్థానిక Python ఇన్‌స్టాలేషన్‌లో నడుపుతున్నట్లయితే, NLPకి అవసరమైన అన్ని లైబ్రరీలను క్రింది కమాండ్లతో ఇన్‌స్టాల్ చేయవచ్చు: +మీరు ఈ కోర్సు కోసం స్థానికంగా పైథాన్ ఇన్‌స్టాలేషన్ ఉపయోగిస్తుంటే, క్రింద పేర్కొన్న ఆదేశాలను ఉపయోగించి NLP కి అవసరమైన అన్ని లైబ్రరీలను ఇన్‌స్టాల్ చేసుకోవాలి: **PyTorch కోసం** ```bash -pip install -r requirements-torch.txt +pip install -r requirements-pytorch.txt ``` **TensorFlow కోసం** ```bash pip install -r requirements-tf.txt ``` -> మీరు TensorFlowతో NLPని [Microsoft Learn](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste)లో ప్రయత్నించవచ్చు +> [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 సంస్కరణలు ఒకే Python కర్నెల్‌లో అనేక నమూనాలను శిక్షణ ఇస్తున్నప్పుడు GPU మెమరీని సరిగ్గా విడుదల చేయకపోవచ్చు. GPU మెమరీ వినియోగాన్ని సమర్థవంతంగా నిర్వహించడానికి, TensorFlowని అవసరమైనప్పుడు మాత్రమే GPU మెమరీ కేటాయించేలా సెట్ చేయవచ్చు. -* **కోడ్ చేర్చడం**: TensorFlow GPU మెమరీ కేటాయింపును అవసరమైనప్పుడు మాత్రమే పెంచేలా సెట్ చేయడానికి, మీ నోట్‌బుక్స్‌లో క్రింది కోడ్ చేర్చండి: +ఈ భాగంలో, కొన్ని ఉదాహరణలలో మనం చాలా పెద్ద మోడళ్లను శిక్షణ ఇస్తామన్నది ఉంది. +* **GPU-సమర్థ కంప్యూటర్ ఉపయోగించండి**: పెద్ద మోడళ్లతో పనిచేసేటప్పుడు వేచి ఉండే సమయాలను తగ్గించడానికి GPU-సమర్థ కంప్యూటర్‌లో నోట్బుక్స్ నడపడం సలహా. +* **GPU మెమరీ పరిమితులు**: పెద్ద మోడళ్ల శిక్షణలో GPU మెమరీ కొరతగా ఉండొచ్చు. +* **GPU మెమరీ వినియోగం**: శిక్షణ సమయంలో GPU మెమరీ వినియోగం వివిధ అంశాలపై ఆధారపడి ఉంటుంది, వాటిలోని ఒకటి మినిబ్యాచ్ పరిమాణం. +* **మినిబ్యాచ్ పరిమాణం తగ్గించండి**: GPU మెమరీ సమస్యలు ఎదురైతే, కోడ్లో మినిబ్యాచ్ పరిమాణం తగ్గించడం ఒక పరిష్కారంగా ఉపయోగపడి ఉంటుంది. +* **TensorFlow GPU మెమరీ విడుదల**: పాత TensorFlow సంకలనాలు ఒకే పైథాన్ కర్నెల్‌లో అనేక మోడళ్లను శిక్షణ ఇస్తూ GPU మెమరీను సరిగా విడుదల చేయకపోవచ్చు. GPU మెమరీ వినియోగాన్ని సమర్థవంతంగా నిర్వహించేందుకు TensorFlowని అవసరమైన వెంటనే GPU మెమరీ కేటాయించ하도록 సెట్ చేయవచ్చు. +* **కోడ్ చేర్పు**: GPU మెమరీ కేటాయింపును అవసరానికి మాత్రమే పెరుగుదల చేసే విధంగా TensorFlowని సెట్ చేయడానికి మీ నోట్బుక్స్‌లో క్రింది కోడ్ చేర్చండి: ```python physical_devices = tf.config.list_physical_devices('GPU') @@ -53,21 +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) +* [పదాలను టెన్సర్స్ రూపంలో ప్రాతినిధ్యం](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) --- -**అస్పష్టత**: -ఈ పత్రాన్ని AI అనువాద సేవ [Co-op Translator](https://github.com/Azure/co-op-translator) ఉపయోగించి అనువదించబడింది. మేము ఖచ్చితత్వానికి ప్రయత్నించినప్పటికీ, ఆటోమేటెడ్ అనువాదాల్లో పొరపాట్లు లేదా తప్పిదాలు ఉండవచ్చు. మూల పత్రం దాని స్వదేశీ భాషలో అధికారిక మూలంగా పరిగణించాలి. ముఖ్యమైన సమాచారానికి, ప్రొఫెషనల్ మానవ అనువాదం సిఫార్సు చేయబడుతుంది. ఈ అనువాదం వాడకం వల్ల కలిగే ఏవైనా అపార్థాలు లేదా తప్పుదారితీసే అర్థాలు కోసం మేము బాధ్యత వహించము. +**అస్వీకరణ**: +ఈ పత్రం AI అనువాద సేవ [Co-op Translator](https://github.com/Azure/co-op-translator) ఉపయోగించి అనువదించబడింది. మేము ఖచ్చితత్వానికి ప్రయత్నిస్తున్నప్పటికీ, ఆటోమేటెడ్ అనువాదాలు తప్పులు లేదా అసమగ్రతలను కలిగి ఉండవచ్చు. దాని స్వదేశ భాషలో ఉన్న అసలు పత్రాన్ని అధికారం కలిగిన మూలంగా పరిగణించాలి. కీలకమైన సమాచారం కోసం, ప్రొఫెషనల్ మానవ అనువాదాన్ని సిఫారసు చేస్తాము. ఈ అనువాదం ఉపయోగం వల్ల కలిగే ఏవైనా అపార్థాలు లేదా తప్పుదారులు కోసం మేము బాధ్యత వహించము. \ No newline at end of file diff --git a/translations/th/.co-op-translator.json b/translations/th/.co-op-translator.json index 2a69e14b42..fa3d8af8aa 100644 --- a/translations/th/.co-op-translator.json +++ b/translations/th/.co-op-translator.json @@ -5,6 +5,12 @@ "source_file": "AGENTS.md", "language_code": "th" }, + "CONTRIBUTING.md": { + "original_hash": "c6fd7e781b67111a90abd166d0ce4aa0", + "translation_date": "2026-07-08T18:03:52+00:00", + "source_file": "CONTRIBUTING.md", + "language_code": "th" + }, "README.md": { "original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b", "translation_date": "2026-04-06T16:20:53+00:00", @@ -17,6 +23,19 @@ "source_file": "SECURITY.md", "language_code": "th" }, + "__translation_failures__": { + "lessons/sketchnotes/LICENSE.md": { + "original_hash": "45ab63a2cd8f5faef6c9b150618837a4", + "source_file": "lessons/sketchnotes/LICENSE.md", + "language_code": "th", + "failure_date": "2026-07-08T17:52: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-29T09:31:47+00:00", @@ -54,8 +73,8 @@ "language_code": "th" }, "examples/README.md": { - "original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7", - "translation_date": "2025-10-03T11:30:59+00:00", + "original_hash": "7883d52c2e2a221e0b07a7b112a149b9", + "translation_date": "2026-07-08T17:46:30+00:00", "source_file": "examples/README.md", "language_code": "th" }, @@ -66,8 +85,8 @@ "language_code": "th" }, "lessons/0-course-setup/how-to-run.md": { - "original_hash": "a4717bd9103b9f6cd84d534b83534689", - "translation_date": "2026-01-16T02:18:09+00:00", + "original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1", + "translation_date": "2026-07-08T17:46:53+00:00", "source_file": "lessons/0-course-setup/how-to-run.md", "language_code": "th" }, @@ -191,6 +210,12 @@ "source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md", "language_code": "th" }, + "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": { + "original_hash": "99b816b6a4957ef4100cee4c4221dff9", + "translation_date": "2026-07-08T17:42:52+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", + "language_code": "th" + }, "lessons/4-ComputerVision/08-TransferLearning/lab/README.md": { "original_hash": "7765935c35fcee69b9fe2d0cfd6963e2", "translation_date": "2025-08-29T08:50:50+00:00", @@ -330,8 +355,8 @@ "language_code": "th" }, "lessons/5-NLP/README.md": { - "original_hash": "8ef02a9318257ea140ed3ed74442096d", - "translation_date": "2025-08-29T09:16:38+00:00", + "original_hash": "038df6f1a73e49f6430740da083bfd6d", + "translation_date": "2026-07-08T17:47:26+00:00", "source_file": "lessons/5-NLP/README.md", "language_code": "th" }, diff --git a/translations/th/CONTRIBUTING.md b/translations/th/CONTRIBUTING.md new file mode 100644 index 0000000000..866c968df5 --- /dev/null +++ b/translations/th/CONTRIBUTING.md @@ -0,0 +1,29 @@ +# การมีส่วนร่วมกับ AI-For-Beginners + +ขอบคุณที่คุณสนใจมีส่วนร่วมกับ AI-For-Beginners! เราต้อนรับการแปล การแก้ไขบทเรียน และการแก้ไขรูปแบบ + +## สัญญาอนุญาตผู้ร่วมพัฒนา (CLA) ของ Microsoft + +โครงการนี้เปิดรับการมีส่วนร่วมและข้อเสนอแนะ การมีส่วนร่วมส่วนใหญ่ต้องการให้คุณยอมรับสัญญาอนุญาตผู้ร่วมพัฒนา (CLA) ที่ระบุว่าคุณมีสิทธิ์และได้มอบสิทธิ์แก่เราสำหรับการใช้เนื้อหาที่คุณมีส่วนร่วม สำหรับรายละเอียดเพิ่มเติม โปรดเยี่ยมชม [https://cla.microsoft.com](https://cla.microsoft.com) + +เมื่อคุณส่งคำขอดึงข้อมูล (pull request) CLA-bot จะตรวจสอบโดยอัตโนมัติว่าคุณจำเป็นต้องจัดเตรียม CLA หรือไม่ และจะประดับ PR ตามที่เหมาะสม (เช่น ป้ายชื่อ ความคิดเห็น) เพียงทำตามคำแนะนำที่บอทให้มา คุณจะต้องทำครั้งเดียวเท่านั้นสำหรับทุกที่เก็บข้อมูลที่ใช้ CLA ของเรา + +## วิธีมีส่วนร่วม + +### 1. การแก้ไขตัวสะกด / ข้อผิดพลาดของโค้ด +หากคุณพบตัวสะกดผิดหรือบั๊กในสมุดบันทึก Jupyter หรือไฟล์บทเรียน markdown ใด ๆ: +1. ทำการแยก (fork) ที่เก็บข้อมูล +2. แก้ไขตัวสะกดผิดหรือลิงก์เสีย +3. ส่งคำขอดึงข้อมูล (Pull Request) พร้อมคำอธิบายที่ชัดเจนเกี่ยวกับการแก้ไข + +### 2. การส่งการแปล +เราต้อนรับการแปลบทเรียนเป็นภาษาต่าง ๆ กรุณาวางไฟล์แปลไว้ในไดเรกทอรี `translations/` โดยใช้ชื่อโฟลเดอร์ที่มีอยู่ (ตัวอย่างเช่น `translations/es/`, `translations/pt-BR/`, `translations/zh-CN/`) + +สำหรับรายละเอียดเพิ่มเติม ดูได้ที่ [etc/CONTRIBUTING.md](etc/CONTRIBUTING.md) + +--- + + +**ปฏิเสธความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) ขณะที่เราพยายามให้ความถูกต้อง โปรดทราบว่าการแปลโดยอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาต้นทางควรถูกพิจารณาเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ แนะนำให้ใช้การแปลโดยมนุษย์มืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดที่เกิดขึ้นจากการใช้การแปลนี้ + \ No newline at end of file diff --git a/translations/th/examples/README.md b/translations/th/examples/README.md index d6046b10bf..08251e960d 100644 --- a/translations/th/examples/README.md +++ b/translations/th/examples/README.md @@ -1,27 +1,27 @@ -# ตัวอย่าง 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 | +| Example | Description | Difficulty | Prerequisites | +|---------|-------------|------------|---------------| +| [Hello AI World](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/01-hello-ai-world.py) | โปรแกรม AI แรกของคุณ - การจดจำรูปแบบง่ายๆ | ⭐ Beginner | พื้นฐาน Python | +| [Simple Neural Network](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/02-simple-neural-network.py) | สร้างโครงข่ายประสาทเทียมจากศูนย์ | ⭐⭐ Beginner+ | Python, คณิตศาสตร์พื้นฐาน | +| [Image Classifier](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/03-image-classifier.ipynb) | จัดหมวดหมู่ภาพด้วยโมเดลที่ผ่านการฝึกมาแล้ว | ⭐⭐ Beginner+ | Python, numpy | +| [Text Sentiment](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/04-text-sentiment.py) | วิเคราะห์อารมณ์ข้อความ (บวก/ลบ) | ⭐⭐ Beginner+ | 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 ``` @@ -34,12 +34,12 @@ conda activate ai4beg ### การรันตัวอย่าง -**สำหรับไฟล์ Python (.py):** +**สำหรับสคริปต์ Python (.py files):** ```bash python 01-hello-ai-world.py ``` -**สำหรับ Jupyter notebooks (.ipynb):** +**สำหรับโน้ตบุ๊ก Jupyter (.ipynb files):** ```bash jupyter notebook 03-image-classifier.ipynb ``` @@ -48,38 +48,40 @@ jupyter notebook 03-image-classifier.ipynb เราแนะนำให้ทำตามตัวอย่างตามลำดับ: -1. **เริ่มต้นด้วย "Hello AI World"** - เรียนรู้พื้นฐานของการจดจำรูปแบบ -2. **สร้างเครือข่ายประสาทเทียมแบบง่าย** - เข้าใจการทำงานของเครือข่ายประสาทเทียม -3. **ลองใช้ Image Classifier** - ดูการทำงานของ AI กับภาพจริง -4. **วิเคราะห์ความรู้สึกในข้อความ** - สำรวจการประมวลผลภาษาธรรมชาติ +1. **เริ่มต้นด้วย "Hello AI World"** - เรียนรู้พื้นฐานการจดจำรูปแบบ +2. **สร้างโครงข่ายประสาทเทียมง่ายๆ** - เข้าใจว่าโครงข่ายประสาททำงานอย่างไร +3. **ลองใช้ Image Classifier** - ดู AI ทำงานกับภาพจริง +4. **วิเคราะห์อารมณ์ข้อความ** - สำรวจการประมวลผลภาษาธรรมชาติ ## 💡 เคล็ดลับสำหรับผู้เริ่มต้น -- **อ่านคำอธิบายในโค้ดอย่างละเอียด** - มันอธิบายว่าทุกบรรทัดทำอะไร -- **ทดลอง!** - ลองเปลี่ยนค่าและดูผลลัพธ์ -- **อย่ากังวลหากยังไม่เข้าใจทุกอย่าง** - การเรียนรู้ต้องใช้เวลา +- **อ่านคำอธิบายโค้ดอย่างละเอียด** - เพื่ออธิบายแต่ละบรรทัดว่าทำอะไร +- **ทดลอง!** - ลองเปลี่ยนค่าแล้วดูผลลัพธ์ +- **อย่ากังวลถ้าไม่เข้าใจทุกอย่าง** - การเรียนรู้ต้องใช้เวลา - **ถามคำถาม** - ใช้ [กระดานสนทนา](https://github.com/microsoft/AI-For-Beginners/discussions) ## 🔗 ขั้นตอนถัดไป -หลังจากทำตัวอย่างเหล่านี้เสร็จแล้ว ลองสำรวจหลักสูตรเต็ม: +หลังจากทำตัวอย่างเหล่านี้เสร็จแล้ว ให้สำรวจหลักสูตรเต็ม: - [แนะนำ AI](../lessons/1-Intro/README.md) -- [เครือข่ายประสาทเทียม](../lessons/3-NeuralNetworks/README.md) -- [การมองเห็นด้วยคอมพิวเตอร์](../lessons/4-ComputerVision/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) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาต้นทางควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ แนะนำให้ใช้บริการแปลภาษามนุษย์ที่เป็นมืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความผิดที่เกิดจากการใช้การแปลนี้ \ No newline at end of file + +**ปฏิเสธความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) ขณะที่เราพยายามให้ความถูกต้อง โปรดทราบว่าการแปลโดยอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาต้นทางควรถูกพิจารณาเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ แนะนำให้ใช้การแปลโดยมนุษย์มืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดที่เกิดขึ้นจากการใช้การแปลนี้ + \ No newline at end of file diff --git a/translations/th/lessons/0-course-setup/how-to-run.md b/translations/th/lessons/0-course-setup/how-to-run.md index 991fc0e276..a07050ab86 100644 --- a/translations/th/lessons/0-course-setup/how-to-run.md +++ b/translations/th/lessons/0-course-setup/how-to-run.md @@ -1,12 +1,12 @@ # วิธีการรันโค้ด -หลักสูตรนี้ประกอบด้วยตัวอย่างที่สามารถรันได้และแลปมากมายที่คุณต้องการรัน ในการที่จะทำเช่นนี้ คุณจะต้องมีความสามารถในการรันโค้ด 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 แล้ว ให้โคลนรีโพสและสร้างสภาพแวดล้อมจำลองที่จะใช้สำหรับคอร์สนี้: +หลังจากติดตั้ง miniconda แล้ว ให้โคลนรีโพสิตอรีและสร้างสภาพแวดล้อมเสมือนเพื่อใช้ในหลักสูตรนี้: ```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 พร้อม Python Extension +### การใช้ 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 Code มันจะเสนอให้ติดตั้งส่วนขยายของ Python โดยอัตโนมัติ คุณต้องติดตั้ง miniconda ตามที่ได้กล่าวไว้ข้างต้นด้วย -> **หมายเหตุ**: หาก VS Code แนะนำให้เปิดรีโพสในคอนเทนเนอร์ใหม่ คุณควรปฏิเสธเพื่อใช้การติดตั้ง Python ในเครื่องของคุณ +> **หมายเหตุ**: หาก VS Code เสนอให้เปิดรีโพสิตอรีใน container คุณควรปฏิเสธเพื่อใช้การติดตั้ง Python บนเครื่องของคุณเอง -### การใช้ Jupyter ในเบราว์เซอร์ +### การใช้ Jupyter ผ่านเบราว์เซอร์ -คุณสามารถใช้สภาพแวดล้อม Jupyter ผ่านเบราว์เซอร์ในเครื่องคอมพิวเตอร์ของคุณเองได้ ทั้ง Jupyter แบบคลาสสิกและ JupyterHub ให้สภาพแวดล้อมการพัฒนาที่สะดวกสบายพร้อมการเติมข้อความอัตโนมัติ การเน้นโค้ด ฯลฯ +คุณสามารถใช้สภาพแวดล้อม Jupyter ผ่านเบราว์เซอร์บนเครื่องของคุณเองได้ Jupyter แบบคลาสสิกและ JupyterHub ต่างก็ให้สภาพแวดล้อมการพัฒนาที่สะดวกพร้อมฟีเจอร์ช่วยเติมโค้ดและไฮไลต์โค้ด -เพื่อเริ่มต้น Jupyter ในเครื่อง ให้ไปที่ไดเรกทอรีของคอร์ส และรันคำสั่ง: +ในการเริ่ม Jupyter บนเครื่องของคุณ ให้ไปที่ไดเรกทอรีของหลักสูตร และรันคำสั่ง: ```bash jupyter notebook @@ -36,37 +36,36 @@ jupyter notebook ```bash jupyterhub ``` -จากนั้นคุณสามารถไปที่ไฟล์ `.ipynb` ใดๆ เปิดและเริ่มทำงานได้เลย +คุณก็สามารถไปยังไฟล์ `.ipynb` ใดก็ได้ เปิดไฟล์และเริ่มทำงานได้ทันที -### การรันในคอนเทนเนอร์ +### การรันใน container -ทางเลือกหนึ่งแทนการติดตั้ง Python คือการรันโค้ดในคอนเทนเนอร์ เนื่องจากรีโพสของเรามีโฟลเดอร์ `.devcontainer` พิเศษที่แนะนำวิธีการสร้างคอนเทนเนอร์สำหรับรีโพสนี้ VS Code จึงมีตัวเลือกให้เปิดโค้ดใหม่ในคอนเทนเนอร์ การนี้จำเป็นต้องติดตั้ง Docker และมีความซับซ้อนมากขึ้น เราจึงแนะนำสำหรับผู้ใช้ที่มีประสบการณ์มากกว่า +ทางเลือกหนึ่งแทนการติดตั้ง Python คือการรันโค้ดใน container เนื่องจากรีโพสิตอรีของเรามีโฟลเดอร์ `.devcontainer` พิเศษที่แนะนำวิธีสร้าง container สำหรับรีโปนี้ VS Code จึงมีโอกาสให้เปิดโค้ดใน container ได้ทันที ซึ่งต้องติดตั้ง Docker และเป็นขั้นตอนที่ซับซ้อนกว่า ดังนั้นจึงแนะนำสำหรับผู้ใช้ที่มีประสบการณ์มากกว่า -## การรันในคลาวด์ +## การรันบนคลาวด์ -หากคุณไม่ต้องการติดตั้ง Python ในเครื่อง และมีการเข้าถึงทรัพยากรคลาวด์ บางทางเลือกที่ดีคือการรันโค้ดในคลาวด์ คุณมีหลายวิธีในการทำเช่นนี้: +หากคุณไม่ต้องการติดตั้ง Python บนเครื่องและเข้าถึงทรัพยากรคลาวด์ได้ ทางเลือกที่ดีคือรันโค้ดบนคลาวด์ มีหลายวิธีที่คุณสามารถทำได้: -* ใช้ **[GitHub Codespaces](https://github.com/features/codespaces)** ซึ่งเป็นสภาพแวดล้อมจำลองที่สร้างขึ้นให้คุณบน GitHub สามารถเข้าถึงผ่านอินเทอร์เฟซ VS Code บนเบราว์เซอร์ หากคุณเข้าถึง Codespaces ได้ คุณสามารถคลิกปุ่ม **Code** ในรีโพส เริ่มต้น codespace และเริ่มรันได้ทันที +* ใช้ **[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 ซึ่งจะสร้าง container เบื้องหลังและเริ่มเว็บอินเทอร์เฟซ Jupyter ให้คุณอย่างราบรื่น -* ใช้ **[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 for Students](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) หรือผ่านสถาบันของคุณ: +* สร้าง [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 VMs สนับสนุน 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 จากนั้นคุณสามารถโคลนรีโพสบนเครื่องนั้นและเริ่มเรียนรู้ VM สาย 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/) แสดงวิธีโคลนรีโพสิตอรีเข้าโน้ตบุ๊ก 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/) แสดงวิธีโคลนรีโพสเข้า Azure ML notebook และเริ่มใช้งาน - -คุณยังสามารถใช้ Google Colab ซึ่งมาพร้อม GPU ฟรีบางส่วน และอัปโหลด Jupyter Notebooks ไปรันทีละไฟล์ได้อีกด้วย +คุณยังสามารถใช้ Google Colab ซึ่งมี GPU ฟรีให้ใช้งานบ้าง และอัปโหลด Jupyter Notebooks ไปที่นั่นเพื่อรันทีละไฟล์ได้ --- -**ข้อจำกัดความรับผิดชอบ**: -เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษาอัตโนมัติ [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้ความถูกต้องสูงสุด แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาต้นฉบับจะถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ การแปลโดยมนุษย์มืออาชีพจึงเป็นที่แนะนำ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดใด ๆ ที่เกิดจากการใช้การแปลนี้ +**ปฏิเสธความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) ขณะที่เราพยายามให้ความถูกต้อง โปรดทราบว่าการแปลโดยอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาต้นทางควรถูกพิจารณาเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ แนะนำให้ใช้การแปลโดยมนุษย์มืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดที่เกิดขึ้นจากการใช้การแปลนี้ \ No newline at end of file diff --git a/translations/th/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/th/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index 8c9996039b..adea9ad9e9 100644 --- a/translations/th/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/th/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -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", + "## ชุดข้อมูล แมว vs สุนัข\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 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", - "ในชีวิตจริง ขนาดของชุดข้อมูลภาพอาจมีขนาดใหญ่มาก และเราไม่สามารถพึ่งพาการโหลดข้อมูลทั้งหมดเข้าไปในหน่วยความจำได้ ดังนั้น ชุดข้อมูลมักจะถูกแสดงผลในรูปแบบของ **generators** ที่สามารถคืนค่าข้อมูลเป็นชุดย่อย (minibatches) ที่เหมาะสมสำหรับการฝึกโมเดล\n", + "ในชีวิตจริง ขนาดของชุดข้อมูลภาพอาจมีขนาดใหญ่ และเราไม่สามารถมั่นใจได้ว่าข้อมูลทั้งหมดจะพอดีกับหน่วยความจำ ดังนั้น ชุดข้อมูลจึงมักจะแสดงเป็น **ตัวสร้างข้อมูล (generators)** ที่สามารถส่งคืนข้อมูลเป็นมินิบัทช์ที่เหมาะกับการฝึกสอนได้\n", "\n", - "สำหรับการจัดการกับการจำแนกประเภทของภาพ Keras มีฟังก์ชันพิเศษชื่อ `image_dataset_from_directory` ซึ่งสามารถโหลดภาพจากไดเรกทอรีย่อยที่สอดคล้องกับคลาสต่าง ๆ ฟังก์ชันนี้ยังช่วยจัดการการปรับขนาดของภาพ และยังสามารถแบ่งชุดข้อมูลออกเป็นชุดฝึก (train) และชุดทดสอบ (test) ได้อีกด้วย:\n" + "ในการจัดการกับการจำแนกประเภทภาพ Keras มีฟังก์ชันพิเศษชื่อ `image_dataset_from_directory` ซึ่งสามารถโหลดภาพจากไดเรกทอรีย่อยที่สอดคล้องกับคลาสต่างๆ ฟังก์ชันนี้ยังดูแลการปรับขนาดภาพ และยังสามารถแบ่งชุดข้อมูลเป็นชุดฝึกและชุดทดสอบได้อีกด้วย:\n" ] }, { @@ -383,9 +383,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "สิ่งสำคัญคือต้องตั้งค่า `seed` ให้เหมือนกันสำหรับการเรียกใช้งานทั้งสองครั้ง เพราะมันมีผลต่อการแบ่งภาพระหว่างชุดข้อมูลการฝึก (train) และชุดข้อมูลการทดสอบ (test)\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" + "สำหรับงานจำแนกรูปภาพหลาย ๆ งาน เราสามารถค้นหาแบบจำลองเครือข่ายประสาทที่ผ่านการฝึกฝนล่วงหน้าได้ แบบจำลองหลายแบบเหล่านั้นมีให้ใช้งานภายใน 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,17 +520,17 @@ "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" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "มาดูสถาปัตยกรรมของเครือข่าย VGG-16 กันด้วย:\n" + "มาดูสถาปัตยกรรมของเครือข่าย VGG-16 กันด้วย: \n" ] }, { @@ -599,7 +609,7 @@ "source": [ "## การคำนวณด้วย GPU\n", "\n", - "เครือข่ายประสาทเทียมเชิงลึก เช่น VGG-16 และสถาปัตยกรรมที่ทันสมัยอื่น ๆ ต้องการพลังการประมวลผลค่อนข้างมากในการทำงาน การใช้การเร่งความเร็วด้วย GPU จึงเป็นทางเลือกที่สมเหตุสมผลหากมีให้ใช้งาน โชคดีที่ Keras จะเพิ่มความเร็วในการคำนวณบน GPU โดยอัตโนมัติหากมี 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 แต่เพื่อให้เห็นภาพ เราต้องปรับรูปร่างให้เป็นรูปแบบ 2 มิติ\n", "\n", - "ตอนนี้ลองมาดูกันว่าคุณลักษณะเหล่านี้สามารถนำมาใช้ในการจำแนกภาพได้หรือไม่ เราจะเลือกภาพบางส่วนด้วยตนเอง (50 minibatches ในกรณีนี้) และคำนวณเวกเตอร์คุณลักษณะล่วงหน้า เราสามารถใช้ API **dataset** ของ Tensorflow เพื่อทำสิ่งนี้ ฟังก์ชัน `map` จะรับ dataset และใช้ lambda-function ที่กำหนดเพื่อแปลงข้อมูล เราใช้กลไกนี้เพื่อสร้าง dataset ใหม่ `ds_features_train` และ `ds_features_test` ซึ่งมีคุณลักษณะที่สกัดจาก VGG แทนที่จะเป็นภาพต้นฉบับ\n" + "ตอนนี้ลองดูว่าฟีเจอร์เหล่านั้นสามารถใช้จัดประเภทภาพได้หรือไม่ เรามาดึงส่วนหนึ่งของภาพ (50 มินิแบตช์ ในกรณีของเรา) และคำนวณเวกเตอร์ฟีเจอร์ของพวกมันล่วงหน้า เราสามารถใช้ Tensorflow **dataset** API เพื่อทำเช่นนั้น ฟังก์ชัน `map` จะรับ dataset และใช้ฟังก์ชันแลมบ์ดาที่กำหนดเพื่อแปลงมัน เราใช้กลไกนี้เพื่อสร้าง datasets ใหม่ คือ `ds_features_train` และ `ds_features_test` ที่ประกอบด้วยฟีเจอร์ที่สกัดโดย VGG แทนภาพต้นฉบับ\n" ] }, { @@ -712,9 +723,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "เราใช้คำสั่ง `.take(50)` เพื่อจำกัดขนาดของชุดข้อมูล เพื่อเพิ่มความเร็วในการสาธิต แน่นอนว่าคุณสามารถทดลองทำการทดลองนี้กับชุดข้อมูลทั้งหมดได้\n", + "เราใช้การก่อสร้าง `.take(50)` เพื่อจำกัดขนาดชุดข้อมูล เพื่อเร่งความเร็วในการสาธิตของเรา แน่นอนว่าคุณสามารถทดลองนี้กับชุดข้อมูลทั้งหมดได้\n", "\n", - "ตอนนี้เรามีชุดข้อมูลที่มีคุณลักษณะที่ถูกดึงออกมาแล้ว เราสามารถฝึกตัวจำแนกแบบ dense อย่างง่ายเพื่อแยกแยะระหว่างแมวและสุนัขได้ เครือข่ายนี้จะรับเวกเตอร์คุณลักษณะที่มีรูปร่าง (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", - "## การใช้ Transfer Learning ด้วยเครือข่าย VGG หนึ่งตัว\n", + "## การเรียนรู้แบบถ่ายโอนโดยใช้เครือข่าย VGG หนึ่งชุด\n", "\n", - "เรายังสามารถหลีกเลี่ยงการคำนวณคุณสมบัติด้วยมือได้ โดยใช้เครือข่าย VGG-16 ดั้งเดิมทั้งตัวในระหว่างการฝึก โดยเพิ่มตัวสกัดคุณสมบัติเป็นเลเยอร์แรกในเครือข่ายของเรา\n", + "เรายังสามารถหลีกเลี่ยงการคำนวณคุณลักษณะล่วงหน้าแบบแมนนวลโดยใช้เครือข่าย VGG-16 ดั้งเดิมเป็นองค์รวมในระหว่างการฝึก โดยการเพิ่มตัวสกัดคุณลักษณะให้กับเครือข่ายของเราเป็นเลเยอร์แรก\n", "\n", - "ความพิเศษของสถาปัตยกรรม Keras คือโมเดล VGG-16 ที่เราได้กำหนดไว้ข้างต้นสามารถนำมาใช้เป็นเลเยอร์ในเครือข่ายประสาทเทียมอื่นได้ด้วย! เราเพียงแค่สร้างเครือข่ายที่มีตัวจัดประเภทแบบ dense อยู่ด้านบน และฝึกเครือข่ายทั้งหมดโดยใช้ back propagation\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 ทำหน้าที่เป็นตัวสกัดคุณลักษณะ ไม่ใช่ถูกฝึกซ้ำ ดังนั้นเราจำเป็นต้อง **แช่น้ำหนักของตัวสกัดคุณลักษณะ convolutional** เราสามารถเข้าถึงเลเยอร์แรกของเครือข่ายโดยเรียก `model.layers[0]` และเราจำเป็นเพียงตั้งค่าคุณสมบัติ `trainable` เป็น `False`\n", "\n", - "> **Note**: การล็อกน้ำหนักของตัวดึงคุณลักษณะเป็นสิ่งจำเป็น เพราะหากไม่ทำเช่นนั้น เลเยอร์ตัวจำแนกที่ยังไม่ได้รับการฝึกอาจทำลายน้ำหนักที่ได้รับการฝึกไว้ล่วงหน้าของตัวดึงคุณลักษณะคอนโวลูชันได้\n", + "> **หมายเหตุ**: การแช่น้ำหนักของตัวสกัดคุณลักษณะเป็นสิ่งจำเป็น เพราะถ้าไม่ทำ เลเยอร์ตัวจำแนกที่ยังไม่ได้ฝึกอาจทำลายน้ำหนักต้นฉบับที่ถูกฝึกล่วงหน้าของตัวสกัด convolutional\n", "\n", - "คุณจะสังเกตได้ว่าในขณะที่จำนวนพารามิเตอร์ทั้งหมดในเครือข่ายของเรามีประมาณ 15 ล้าน แต่เราฝึกเพียง 25,000 พารามิเตอร์เท่านั้น พารามิเตอร์อื่น ๆ ทั้งหมดของตัวกรองคอนโวลูชันระดับบนสุดได้รับการฝึกไว้ล่วงหน้าแล้ว ซึ่งเป็นเรื่องดี เพราะเราสามารถปรับแต่งพารามิเตอร์จำนวนน้อยลงได้ด้วยตัวอย่างที่น้อยลง\n", + "คุณจะสังเกตได้ว่าในขณะที่จำนวนพารามิเตอร์ทั้งหมดในเครือข่ายของเราประมาณ 15 ล้าน เรากำลังฝึกเพียง 25k พารามิเตอร์เท่านั้น พารามิเตอร์อื่นๆ ของตัวกรอง convolutional ชั้นบนสุดถูกฝึกล่วงหน้าไว้แล้ว นั่นเป็นผลดี เพราะเราสามารถปรับแต่งพารามิเตอร์จำนวนน้อยลงด้วยตัวอย่างจำนวนน้อยลง\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", - "> **Note:** สิ่งสำคัญคือคุณต้องล็อกพารามิเตอร์ก่อนและทำการฝึกฝนหลายรอบเพื่อทำให้น้ำหนักในเลเยอร์การจำแนกมีความเสถียร หากคุณเริ่มฝึกฝนเครือข่ายแบบ end-to-end โดยที่พารามิเตอร์ไม่ได้ถูกล็อกไว้ตั้งแต่แรก ข้อผิดพลาดขนาดใหญ่อาจทำลายน้ำหนักที่ได้รับการฝึกฝนไว้ในเลเยอร์คอนโวลูชันได้\n", + "> **หมายเหตุ:** สิ่งสำคัญคือต้องแช่แข็งพารามิเตอร์ก่อน และทำการฝึกหลายยุคเพื่อให้ค่าน้ำหนักในเลเยอร์จำแนกมีความเสถียร หากคุณเริ่มฝึกเครือข่ายแบบ end-to-end โดยไม่แช่แข็งพารามิเตอร์ทันที ข้อผิดพลาดขนาดใหญ่อาจทำลายน้ำหนักที่ฝึกไว้ล่วงหน้าในเลเยอร์คอนโวลูชันได้\n", "\n", - "โมเดล VGG-16 แบบคอนโวลูชันของเราอยู่ในเลเยอร์แรก และมันประกอบด้วยหลายเลเยอร์ในตัวเอง เราสามารถดูโครงสร้างของมันได้:\n" + "โมเดล VGG-16 แบบคอนโวลูชันของเราอยู่ภายในเลเยอร์แรก และประกอบด้วยเลเยอร์หลายเลเยอร์ด้วยตัวเอง เราสามารถดูโครงสร้างของมันได้:\n" ] }, { @@ -944,7 +955,9 @@ { "cell_type": "markdown", "metadata": {}, - "source": [] + "source": [ + "เราสามารถปลดล็อกทุกชั้นของฐานคอนโวลูชันได้:\n" + ] }, { "cell_type": "code", @@ -959,7 +972,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "อย่างไรก็ตาม การปลดล็อกทั้งหมดในครั้งเดียวไม่ใช่ความคิดที่ดีที่สุด เราสามารถเริ่มต้นด้วยการปลดล็อกเพียงไม่กี่ชั้นสุดท้ายของการคอนโวลูชันก่อน เพราะชั้นเหล่านี้มีรูปแบบระดับสูงที่เกี่ยวข้องกับภาพของเรา ตัวอย่างเช่น ในการเริ่มต้น เราสามารถล็อกชั้นทั้งหมดไว้ ยกเว้น 4 ชั้นสุดท้าย:\n" + "อย่างไรก็ตาม การปลดล็อกทั้งหมดในครั้งเดียวไม่ใช่ไอเดียที่ดีที่สุด เราสามารถเริ่มปลดล็อกเฉพาะเลเยอร์คอนโวลูชันสุดท้ายเพียงบางส่วนก่อน เพราะเลเยอร์เหล่านั้นมีรูปแบบในระดับสูงที่เกี่ยวข้องกับภาพของเราได้ เช่น เป็นจุดเริ่มต้น เราสามารถแช่แข็งเลเยอร์ทั้งหมด ยกเว้น 4 เลเยอร์สุดท้าย: \n" ] }, { @@ -998,11 +1011,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "สังเกตว่าจำนวนพารามิเตอร์ที่สามารถฝึกได้เพิ่มขึ้นอย่างมาก แต่ยังคงอยู่ที่ประมาณ 50% ของพารามิเตอร์ทั้งหมด\n", + "สังเกตว่าจำนวนพารามิเตอร์ที่สามารถฝึกได้เพิ่มขึ้นอย่างมาก แต่ก็ยังคงอยู่ที่ประมาณ 50% ของพารามิเตอร์ทั้งหมด\n", "\n", - "หลังจากปลดล็อกการแช่แข็ง เราสามารถฝึกเพิ่มอีกไม่กี่รอบ (ในตัวอย่างของเรา เราจะทำเพียงหนึ่งรอบ) คุณยังสามารถเลือกอัตราการเรียนรู้ที่ต่ำลงเพื่อช่วยลดผลกระทบต่อค่าถ่วงน้ำหนักที่ถูกฝึกมาก่อน อย่างไรก็ตาม แม้จะใช้อัตราการเรียนรู้ต่ำ คุณก็อาจคาดหวังได้ว่าความแม่นยำจะลดลงในช่วงเริ่มต้นของการฝึก จนกระทั่งในที่สุดจะเพิ่มขึ้นเล็กน้อยเมื่อเทียบกับกรณีที่ค่าถ่วงน้ำหนักถูกล็อกไว้\n", + "หลังจากปลดล็อก เราสามารถทำการฝึกเพิ่มอีกไม่กี่รอบ (ในตัวอย่างของเรา เราจะทำแค่หนึ่งรอบ) คุณยังสามารถเลือกระดับอัตราการเรียนรู้ที่ต่ำกว่า เพื่อช่วยลดผลกระทบต่อค่าน้ำหนักที่ถูกฝึกมาก่อนแล้ว อย่างไรก็ตาม แม้อัตราการเรียนรู้จะต่ำ คุณก็สามารถคาดหวังได้ว่า ความแม่นยำจะลดลงในช่วงเริ่มต้นของการฝึก จนในที่สุดจะถึงระดับที่สูงกว่าเล็กน้อยเมื่อเทียบกับกรณีที่ค่าน้ำหนักถูกตั้งค่าไว้คงที่\n", "\n", - "> **Note:** การฝึกในขั้นตอนนี้จะช้าลงมาก เพราะเราต้องส่งต่อค่ากราดิเอนต์กลับผ่านหลายชั้นของเครือข่าย!\n" + "> **หมายเหตุ:** การฝึกนี้จะช้ากว่ามาก เพราะเราจำเป็นต้องส่งต่อเกรเดียนต์ย้อนกลับผ่านชั้นของเครือข่ายหลายชั้น!\n" ] }, { @@ -1026,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** ที่พัฒนาโดย Microsoft และ **Inception** โดย Google ตัวอย่างเช่น เรามาสำรวจสถาปัตยกรรมของโมเดล ResNet-50 ที่ง่ายที่สุด (ResNet เป็นกลุ่มโมเดลที่มีความลึกต่างกัน คุณสามารถลองทดลองกับ ResNet-152 หากคุณต้องการดูว่าโมเดลที่ลึกจริงๆ มีลักษณะอย่างไร):\n" ] }, { @@ -1439,29 +1452,29 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "โมเดลนี้ประกอบด้วยองค์ประกอบที่คุ้นเคย เช่น ชั้นคอนโวลูชัน ชั้นพูลลิ่ง และตัวจำแนกแบบ Dense ในตอนท้าย เราสามารถใช้โมเดลนี้ในลักษณะเดียวกับที่เราใช้ VGG-16 สำหรับการเรียนรู้แบบถ่ายโอน คุณสามารถลองทดลองกับโค้ดด้านบนโดยใช้โมเดล ResNet ต่าง ๆ เป็นโมเดลฐาน และดูว่าอัตราความแม่นยำเปลี่ยนแปลงไปอย่างไร\n", + "อย่างที่คุณเห็น โมเดลประกอบไปด้วยบล็อกที่คุ้นเคยเหมือนเดิม: เลเยอร์คอนโวลูชัน, เลเยอร์พูลลิ่ง และตัวจำแนกแบบหนาแน่นสุดท้าย เราสามารถใช้โมเดลนี้ในลักษณะเดียวกับที่เราเคยใช้ VGG-16 สำหรับการเรียนรู้แบบถ่ายโอน คุณสามารถลองทดลองกับโค้ดด้านบนนี้ โดยใช้โมเดล ResNet ที่แตกต่างกันเป็นโมเดลฐาน และดูว่าแม่นยำเปลี่ยนแปลงอย่างไร\n", "\n", - "## การปรับค่าปกติของแบตช์\n", + "## การทำให้นอร์มัลแบบแบตช์ (Batch Normalization)\n", "\n", - "เครือข่ายนี้มีอีกหนึ่งประเภทของชั้น: **การปรับค่าปกติของแบตช์** แนวคิดของการปรับค่าปกติของแบตช์คือการปรับค่าให้เหมาะสมในช่วงที่เหมาะสมเมื่อผ่านเครือข่ายประสาท โดยปกติแล้วเครือข่ายประสาทจะทำงานได้ดีที่สุดเมื่อค่าทั้งหมดอยู่ในช่วง [-1,1] หรือ [0,1] และนี่คือเหตุผลที่เราปรับขนาด/ปรับค่าข้อมูลอินพุตให้เหมาะสม อย่างไรก็ตาม ในระหว่างการฝึกเครือข่ายลึก อาจเกิดกรณีที่ค่าหลุดออกจากช่วงนี้อย่างมาก ซึ่งทำให้การฝึกมีปัญหา ชั้นการปรับค่าปกติของแบตช์จะคำนวณค่าเฉลี่ยและค่าเบี่ยงเบนมาตรฐานสำหรับค่าทั้งหมดในมินิแบตช์ปัจจุบัน และใช้ค่าดังกล่าวในการปรับสัญญาณให้เหมาะสมก่อนที่จะส่งผ่านชั้นเครือข่ายประสาท สิ่งนี้ช่วยปรับปรุงความเสถียรของเครือข่ายลึกได้อย่างมาก\n" + "เครือข่ายนี้ประกอบด้วยเลเยอร์ประเภทใหม่อีกชนิดหนึ่ง: **การทำให้นอร์มัลแบบแบตช์ (Batch Normalization)** แนวคิดของการทำให้นอร์มัลแบบแบตช์คือการนำค่าต่าง ๆ ที่ไหลผ่านเครือข่ายประสาทกลับมาอยู่ในช่วงที่เหมาะสม โดยปกติเครือข่ายประสาททำงานได้ดีที่สุดเมื่อค่าทั้งหมดอยู่ในช่วง [-1,1] หรือ [0,1] และนั่นคือเหตุผลที่เราปรับขนาด/นอร์มัลข้อมูลนำเข้าของเราให้เหมาะสม อย่างไรก็ตาม ระหว่างการฝึกเครือข่ายเชิงลึก อาจเกิดเหตุการณ์ที่ค่าต่าง ๆ ออกนอกช่วงนี้อย่างมาก ซึ่งทำให้การฝึกฝนเป็นปัญหา เลเยอร์การทำให้นอร์มัลแบบแบตช์คำนวณค่าเฉลี่ยและส่วนเบี่ยงเบนมาตรฐานสำหรับค่าทั้งหมดในมินิแบตช์ปัจจุบัน แล้วใช้ค่านั้นเพื่อทำให้นอร์มัลสัญญาณก่อนส่งผ่านเลเยอร์เครือข่ายประสาท ซึ่งช่วยปรับปรุงความเสถียรของเครือข่ายเชิงลึกอย่างมีนัยสำคัญ\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## ข้อสรุป\n", + "## สรุป\n", "\n", - "ด้วยการใช้การเรียนรู้แบบถ่ายโอน (transfer learning) เราสามารถสร้างตัวจำแนกสำหรับงานการจำแนกวัตถุเฉพาะของเราได้อย่างรวดเร็ว และได้ผลลัพธ์ที่มีความแม่นยำสูง อย่างไรก็ตาม ตัวอย่างนี้ไม่ได้เป็นการเปรียบเทียบที่ยุติธรรมทั้งหมด เนื่องจากเครือข่าย VGG-16 ดั้งเดิมถูกฝึกมาเพื่อจดจำแมวและสุนัข ดังนั้นเราจึงเพียงแค่นำรูปแบบที่มีอยู่ในเครือข่ายมาใช้ใหม่ คุณสามารถคาดหวังความแม่นยำที่ต่ำลงเมื่อทำงานกับวัตถุที่เฉพาะเจาะจงมากขึ้น เช่น รายละเอียดในสายการผลิตในโรงงาน หรือใบไม้ของต้นไม้ที่แตกต่างกัน\n", + "ด้วยการใช้ transfer learning เราสามารถสร้างตัวจำแนกสำหรับงานจำแนกวัตถุที่กำหนดเองได้อย่างรวดเร็วและได้ความแม่นยำสูง อย่างไรก็ตาม ตัวอย่างนี้ไม่ยุติธรรมโดยสมบูรณ์ เพราะเครือข่าย 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\n**ปฏิเสธความรับผิดชอบ**:\nเอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) ขณะที่เราพยายามให้ความถูกต้อง โปรดทราบว่าการแปลโดยอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาต้นทางควรถูกพิจารณาเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ แนะนำให้ใช้การแปลโดยมนุษย์มืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดที่เกิดขึ้นจากการใช้การแปลนี้\n\n" ] } ], @@ -1482,12 +1495,6 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" - }, - "coopTranslator": { - "original_hash": "c189abc107848f96051085cc30945129", - "translation_date": "2025-08-29T09:51:53+00:00", - "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", - "language_code": "th" } }, "nbformat": 4, diff --git a/translations/th/lessons/5-NLP/README.md b/translations/th/lessons/5-NLP/README.md index c2d4b0b86a..b23f93d0a6 100644 --- a/translations/th/lessons/5-NLP/README.md +++ b/translations/th/lessons/5-NLP/README.md @@ -1,51 +1,51 @@ # การประมวลผลภาษาธรรมชาติ -![ภาพสรุปงาน NLP ในรูปวาด](../../../../translated_images/th/ai-nlp.b22dcb8ca4707cea.webp) +![สรุปงานของ NLP ในสเก็ตช์](../../../../translated_images/th/ai-nlp.b22dcb8ca4707cea.webp) -ในส่วนนี้ เราจะมุ่งเน้นการใช้เครือข่ายประสาทเทียม (Neural Networks) เพื่อจัดการกับงานที่เกี่ยวข้องกับ **การประมวลผลภาษาธรรมชาติ (Natural Language Processing - NLP)** มีปัญหาหลายประเภทใน NLP ที่เราต้องการให้คอมพิวเตอร์สามารถแก้ไขได้: +ในส่วนนี้ เราจะเน้นการใช้โครงข่ายประสาทเทียมเพื่อจัดการกับงานที่เกี่ยวข้องกับ **การประมวลผลภาษาธรรมชาติ (NLP)** มีปัญหา NLP มากมายที่เราต้องการให้คอมพิวเตอร์สามารถแก้ไขได้: -* **การจัดประเภทข้อความ** เป็นปัญหาการจัดประเภททั่วไปที่เกี่ยวข้องกับลำดับข้อความ ตัวอย่างเช่น การจัดประเภทอีเมลว่าเป็นสแปมหรือไม่ใช่สแปม หรือการจัดหมวดหมู่บทความเป็นกีฬา ธุรกิจ การเมือง เป็นต้น นอกจากนี้ ในการพัฒนาช่องสนทนา (chat bots) เรามักต้องเข้าใจสิ่งที่ผู้ใช้ต้องการจะพูด -- ในกรณีนี้เรากำลังจัดการกับ **การจัดประเภทเจตนา (intent classification)** ซึ่งมักต้องจัดการกับหมวดหมู่จำนวนมาก -* **การวิเคราะห์ความรู้สึก (Sentiment analysis)** เป็นปัญหาการถดถอยทั่วไป ที่เราต้องกำหนดตัวเลข (ความรู้สึก) ที่สอดคล้องกับความหมายที่เป็นบวก/ลบของประโยค เวอร์ชันที่ซับซ้อนกว่าของการวิเคราะห์ความรู้สึกคือ **การวิเคราะห์ความรู้สึกตามแง่มุม (Aspect-Based Sentiment Analysis - ABSA)** ซึ่งเรากำหนดความรู้สึกไม่ใช่กับทั้งประโยค แต่กับส่วนต่าง ๆ ของมัน (แง่มุม) เช่น *ในร้านอาหารนี้ ฉันชอบอาหาร แต่บรรยากาศแย่มาก* -* **การจดจำชื่อหน่วยงาน (Named Entity Recognition - NER)** หมายถึงปัญหาในการดึงข้อมูลหน่วยงานบางอย่างจากข้อความ ตัวอย่างเช่น เราอาจต้องเข้าใจว่าในวลี *ฉันต้องบินไปปารีสพรุ่งนี้* คำว่า *พรุ่งนี้* หมายถึงวันที่ และ *ปารีส* เป็นสถานที่ -* **การดึงคำสำคัญ (Keyword extraction)** คล้ายกับ NER แต่เราต้องดึงคำที่สำคัญต่อความหมายของประโยคโดยอัตโนมัติ โดยไม่ต้องฝึกฝนล่วงหน้าสำหรับประเภทหน่วยงานเฉพาะ -* **การจัดกลุ่มข้อความ (Text clustering)** มีประโยชน์เมื่อเราต้องการจัดกลุ่มประโยคที่คล้ายกันเข้าด้วยกัน เช่น คำขอที่คล้ายกันในบทสนทนาการสนับสนุนทางเทคนิค -* **การตอบคำถาม (Question answering)** หมายถึงความสามารถของโมเดลในการตอบคำถามเฉพาะ โมเดลจะได้รับข้อความและคำถามเป็นข้อมูลนำเข้า และต้องระบุตำแหน่งในข้อความที่มีคำตอบของคำถาม (หรือบางครั้งสร้างข้อความคำตอบ) -* **การสร้างข้อความ (Text Generation)** คือความสามารถของโมเดลในการสร้างข้อความใหม่ สามารถพิจารณาเป็นงานการจัดประเภทที่ทำนายตัวอักษร/คำถัดไปตาม *ข้อความนำ* โมเดลการสร้างข้อความขั้นสูง เช่น 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) -* **การสรุปข้อความ (Text summarization)** เป็นเทคนิคที่เราต้องการให้คอมพิวเตอร์ "อ่าน" ข้อความยาว ๆ และสรุปในไม่กี่ประโยค -* **การแปลภาษา (Machine translation)** สามารถมองว่าเป็นการรวมกันของการเข้าใจข้อความในภาษาหนึ่ง และการสร้างข้อความในอีกภาษาหนึ่ง +* **การจัดหมวดหมู่ข้อความ** เป็นปัญหาการจัดหมวดหมู่ทั่วไปที่เกี่ยวข้องกับลำดับข้อความ ตัวอย่างเช่น การจัดอีเมลเป็นสแปมหรือไม่ใช่สแปม หรือจัดหมวดหมู่บทความเป็นกีฬา ธุรกิจ การเมือง ฯลฯ นอกจากนี้ เมื่อพัฒนาแชทบอท เรามักจะต้องเข้าใจว่าสิ่งที่ผู้ใช้ต้องการจะสื่อคืออะไร — ในกรณีนี้เรากำลังจัดการกับ **การจัดหมวดหมู่เจตนา** บ่อยครั้งในการจัดหมวดหมู่เจตนา เราต้องจัดการกับหลายหมวดหมู่ +* **การวิเคราะห์ความรู้สึก** เป็นปัญหาการถดถอยทั่วไป ที่เราต้องกำหนดตัวเลข (ความรู้สึก) ที่สอดคล้องกับว่าประโยคนั้นมีความหมายเชิงบวกหรือลบมากน้อยเพียงใด เวอร์ชันขั้นสูงของการวิเคราะห์ความรู้สึกคือ **การวิเคราะห์ความรู้สึกตามแง่มุม** (ABSA) ที่เรากำหนดความรู้สึกไม่ใช่กับทั้งประโยค แต่ให้กับส่วนต่าง ๆ ของประโยค (แง่มุม) เช่น *ในร้านอาหารแห่งนี้ ฉันชอบอาหาร แต่บรรยากาศแย่มาก* +* **การจดจำเอนทิตีเฉพาะ** (NER) หมายถึงปัญหาการดึงเอนทิตีบางอย่างออกจากข้อความ เช่น เราอาจต้องเข้าใจว่าในวลี *ฉันต้องการบินไปปารีสวันพรุ่งนี้* คำว่า *วันพรุ่งนี้* หมายถึง DATE และ *ปารีส* คือ 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 ส่วนใหญ่ถูกแก้ไขด้วยวิธีการแบบดั้งเดิม เช่น ไวยากรณ์ ตัวอย่างเช่น ในการแปลภาษา เครื่องมือวิเคราะห์ (parsers) ถูกใช้เพื่อแปลงประโยคเริ่มต้นเป็นต้นไม้ไวยากรณ์ จากนั้นโครงสร้างเชิงความหมายระดับสูงจะถูกดึงออกมาเพื่อแสดงความหมายของประโยค และจากความหมายนี้และไวยากรณ์ของภาษาปลายทาง ผลลัพธ์จะถูกสร้างขึ้น ปัจจุบัน งาน NLP หลายงานถูกแก้ไขได้อย่างมีประสิทธิภาพมากขึ้นด้วยเครือข่ายประสาทเทียม +ในตอนแรก งาน NLP ส่วนใหญ่ถูกแก้โดยใช้วิธีดั้งเดิม เช่น ไวยากรณ์ ตัวอย่างเช่น ในการแปลภาษาใช้การวิเคราะห์ประโยคเพื่อแปลงประโยคเริ่มต้นเป็นต้นไม้ไวยากรณ์ จากนั้นดึงโครงสร้างความหมายระดับสูงเพื่อแทนความหมายของประโยค และอิงจากความหมายนั้นและไวยากรณ์ของภาษาเป้าหมายก็จะสร้างผลลัพธ์ ในปัจจุบัน งาน NLP จำนวนมากได้รับการแก้ไขอย่างมีประสิทธิภาพมากขึ้นด้วยโครงข่ายประสาทเทียม -> วิธีการ NLP แบบดั้งเดิมหลายวิธีถูกนำไปใช้ใน [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org) ซึ่งเป็นไลบรารี Python มี [หนังสือ 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 เมื่อจำเป็น -เราได้เรียนรู้เกี่ยวกับการใช้เครือข่ายประสาทเทียมในการจัดการข้อมูลแบบตารางและภาพแล้ว ความแตกต่างหลักระหว่างประเภทข้อมูลเหล่านั้นกับข้อความคือ ข้อความเป็นลำดับที่มีความยาวแปรผัน ในขณะที่ขนาดข้อมูลนำเข้าในกรณีของภาพเป็นที่ทราบล่วงหน้า แม้ว่าเครือข่ายแบบคอนโวลูชันสามารถดึงรูปแบบจากข้อมูลนำเข้าได้ แต่รูปแบบในข้อความมีความซับซ้อนมากกว่า เช่น เราอาจมีการปฏิเสธที่แยกจากหัวเรื่องด้วยคำจำนวนมาก (เช่น *ฉันไม่ชอบส้ม* กับ *ฉันไม่ชอบส้มที่ใหญ่ สีสันสดใส และอร่อย*) และนั่นยังคงต้องตีความว่าเป็นรูปแบบเดียว ดังนั้น เพื่อจัดการกับภาษา เราจำเป็นต้องแนะนำประเภทเครือข่ายประสาทเทียมใหม่ เช่น *เครือข่ายแบบวนซ้ำ (recurrent networks)* และ *ตัวแปลง (transformers)* +เราได้เรียนรู้การใช้โครงข่ายประสาทเทียมสำหรับจัดการข้อมูลตารางและภาพแล้ว ความแตกต่างหลักระหว่างข้อมูลเหล่านั้นกับข้อความคือ ข้อความเป็นลำดับความยาวที่เปลี่ยนแปลงได้ ขณะที่ขนาดอินพุตของภาพเป็นค่าคงที่ล่วงหน้า ขณะที่โครงข่ายคอนโวลูชันสามารถดึงรูปแบบจากข้อมูลอินพุต รูปแบบในข้อความมีความซับซ้อนกว่า เช่น เราอาจมีการปฏิเสธซึ่งห่างจากประธานได้โดยไม่จำกัดจำนวนคำ (เช่น *ฉันไม่ชอบส้ม* เทียบกับ *ฉันไม่ชอบส้มใหญ่สีสันสดใสนั้น*) และควรถูกตีความเป็นรูปแบบเดียว ดังนั้น เพื่อจัดการกับภาษา เราต้องนำเสนอประเภทโครงข่ายประสาทเทียมใหม่ เช่น *เครือข่ายวนซ้ำ* และ *ทรานส์ฟอร์มเมอร์* -## ติดตั้งไลบรารี +## การติดตั้งไลบรารี -หากคุณใช้การติดตั้ง 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 ที่ใช้ระหว่างการฝึกขึ้นอยู่กับหลายปัจจัย รวมถึงขนาดของ minibatch -* **ลดขนาด Minibatch**: หากคุณพบปัญหาหน่วยความจำ GPU ให้พิจารณาลดขนาด minibatch ในโค้ดของคุณเป็นวิธีแก้ไขปัญหา -* **การปล่อยหน่วยความจำ GPU ใน TensorFlow**: เวอร์ชันเก่าของ TensorFlow อาจไม่ปล่อยหน่วยความจำ GPU อย่างถูกต้องเมื่อฝึกโมเดลหลายตัวในหนึ่งเคอร์เนล Python เพื่อจัดการการใช้หน่วยความจำ GPU อย่างมีประสิทธิภาพ คุณสามารถกำหนดค่า TensorFlow ให้จัดสรรหน่วยความจำ GPU เฉพาะเมื่อจำเป็น -* **การเพิ่มโค้ด**: เพื่อกำหนดให้ TensorFlow เพิ่มการจัดสรรหน่วยความจำ GPU เฉพาะเมื่อจำเป็น ให้เพิ่มโค้ดต่อไปนี้ในโน้ตบุ๊กของคุณ: +ในส่วนนี้ ในบางตัวอย่างเราจะฝึกฝนแบบจำลองขนาดใหญ่มาก +* **ใช้คอมพิวเตอร์ที่รองรับ GPU**: แนะนำให้รันโน้ตบุ๊กของคุณบนคอมพิวเตอร์ที่มี GPU เพื่อช่วยลดเวลารอเมื่อทำงานกับแบบจำลองขนาดใหญ่ +* **ข้อจำกัดหน่วยความจำ GPU**: การรันบน GPU อาจทำให้เกิดสถานการณ์ที่หน่วยความจำ GPU หมดโดยเฉพาะเมื่อฝึกแบบจำลองขนาดใหญ่ +* **การใช้หน่วยความจำ GPU**: ปริมาณหน่วยความจำ GPU ที่ใช้ during การฝึกขึ้นอยู่กับหลายปัจจัย รวมถึงขนาดมินิบแซต +* **ลดขนาดมินิบแซต**: หากพบปัญหาหน่วยความจำ GPU ให้ลดขนาดมินิบแซตในโค้ดของคุณเป็นแนวทางแก้ไขที่เป็นไปได้ +* **การปล่อยหน่วยความจำ 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 จากมุมมองคลาสสิกของ ML ให้ไปที่ [ชุดบทเรียนนี้](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP) ## ในส่วนนี้ ในส่วนนี้เราจะเรียนรู้เกี่ยวกับ: * [การแทนข้อความเป็นเทนเซอร์](13-TextRep/README.md) -* [Word Embeddings](14-Emdeddings/README.md) -* [การสร้างแบบจำลองภาษา](15-LanguageModeling/README.md) -* [เครือข่ายประสาทเทียมแบบวนซ้ำ](16-RNN/README.md) -* [เครือข่ายการสร้าง](17-GenerativeNetworks/README.md) -* [Transformers](18-Transformers/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) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาต้นทางควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษาจากผู้เชี่ยวชาญที่เป็นมนุษย์ เราจะไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้ \ No newline at end of file + +**ปฏิเสธความรับผิดชอบ**: +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) ขณะที่เราพยายามให้ความถูกต้อง โปรดทราบว่าการแปลโดยอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาต้นทางควรถูกพิจารณาเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ แนะนำให้ใช้การแปลโดยมนุษย์มืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดที่เกิดขึ้นจากการใช้การแปลนี้ + \ No newline at end of file diff --git a/translations/tl/.co-op-translator.json b/translations/tl/.co-op-translator.json index 3594d8b6af..1005fe931a 100644 --- a/translations/tl/.co-op-translator.json +++ b/translations/tl/.co-op-translator.json @@ -5,6 +5,12 @@ "source_file": "AGENTS.md", "language_code": "tl" }, + "CONTRIBUTING.md": { + "original_hash": "c6fd7e781b67111a90abd166d0ce4aa0", + "translation_date": "2026-07-08T16:44:57+00:00", + "source_file": "CONTRIBUTING.md", + "language_code": "tl" + }, "README.md": { "original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b", "translation_date": "2026-04-06T16:15:01+00:00", @@ -54,8 +60,8 @@ "language_code": "tl" }, "examples/README.md": { - "original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7", - "translation_date": "2025-10-03T11:32:56+00:00", + "original_hash": "7883d52c2e2a221e0b07a7b112a149b9", + "translation_date": "2026-07-08T16:31:24+00:00", "source_file": "examples/README.md", "language_code": "tl" }, @@ -66,8 +72,8 @@ "language_code": "tl" }, "lessons/0-course-setup/how-to-run.md": { - "original_hash": "a4717bd9103b9f6cd84d534b83534689", - "translation_date": "2026-01-16T04:17:01+00:00", + "original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1", + "translation_date": "2026-07-08T16:31:48+00:00", "source_file": "lessons/0-course-setup/how-to-run.md", "language_code": "tl" }, @@ -191,6 +197,12 @@ "source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md", "language_code": "tl" }, + "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": { + "original_hash": "99b816b6a4957ef4100cee4c4221dff9", + "translation_date": "2026-07-08T16:23:55+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", + "language_code": "tl" + }, "lessons/4-ComputerVision/08-TransferLearning/lab/README.md": { "original_hash": "7765935c35fcee69b9fe2d0cfd6963e2", "translation_date": "2025-08-28T02:31:15+00:00", @@ -330,8 +342,8 @@ "language_code": "tl" }, "lessons/5-NLP/README.md": { - "original_hash": "8ef02a9318257ea140ed3ed74442096d", - "translation_date": "2025-08-28T02:41:08+00:00", + "original_hash": "038df6f1a73e49f6430740da083bfd6d", + "translation_date": "2026-07-08T16:32:21+00:00", "source_file": "lessons/5-NLP/README.md", "language_code": "tl" }, @@ -385,7 +397,7 @@ }, "lessons/sketchnotes/LICENSE.md": { "original_hash": "45ab63a2cd8f5faef6c9b150618837a4", - "translation_date": "2025-08-28T02:40:23+00:00", + "translation_date": "2026-07-08T16:38:57+00:00", "source_file": "lessons/sketchnotes/LICENSE.md", "language_code": "tl" }, diff --git a/translations/tl/CONTRIBUTING.md b/translations/tl/CONTRIBUTING.md new file mode 100644 index 0000000000..ed53bf3475 --- /dev/null +++ b/translations/tl/CONTRIBUTING.md @@ -0,0 +1,29 @@ +# Pagtutulungan sa AI-For-Beginners + +Salamat sa iyong interes sa pagtutulungan sa AI-For-Beginners! Tinatanggap namin ang mga pagsasalin, pag-aayos ng mga leksyon, at mga pagwawasto sa format. + +## Kasunduan sa Lisensya ng Nag-aambag ng Microsoft (CLA) + +Tinatanggap ng proyektong ito ang mga kontribusyon at mungkahi. Karamihan sa mga kontribusyon ay nangangailangan na sumang-ayon ka sa isang Kasunduan sa Lisensya ng Nag-aambag (CLA) na nagsasaad na mayroon kang karapatan, at talaga namang ibinibigay mo, ang mga karapatan sa amin upang magamit ang iyong kontribusyon. Para sa mga detalye, bisitahin ang [https://cla.microsoft.com](https://cla.microsoft.com). + +Kapag nagsumite ka ng pull request, awtomatikong malalaman ng CLA-bot kung kailangan mong magbigay ng CLA at bibigyan ng angkop na tanda ang PR (hal., label, komento). Sundin lamang ang mga tagubilin na ibinigay ng bot. Kailangan mo lamang gawin ito nang isang beses sa lahat ng mga repositoryo na gumagamit ng aming CLA. + +## Paano Mag-ambag + +### 1. Pag-aayos ng mga Typo / Error sa Code +Kung makakita ka ng typo o bug sa anumang Jupyter notebook o file ng leksyon sa markdown: +1. I-fork ang repositoryo. +2. Ayusin ang typo o sirang link. +3. Mag-submit ng Pull Request na may malinaw na paglalarawan ng pag-aayos. + +### 2. Pagsusumite ng mga Pagsasalin +Tinatanggap namin ang mga pagsasalin ng mga leksyon sa ibang mga wika! Mangyaring ilagay ang mga pagsasalin sa ilalim ng direktoryo na `translations/` gamit ang mga umiiral na pangalan ng folder doon (halimbawa `translations/es/`, `translations/pt-BR/`, `translations/zh-CN/`). + +Para sa karagdagang detalye, tingnan ang [etc/CONTRIBUTING.md](etc/CONTRIBUTING.md). + +--- + + +**Pagtatanggi**: +Ang dokumentong ito ay isinalin gamit ang serbisyo ng AI translation na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't nagsusumikap kami para sa katumpakan, pakatandaan na ang awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa orihinal nitong wika ang dapat ituring na pangunahing sanggunian. Para sa mahahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang maling pagkakaintindi o maling interpretasyon na nagmula sa paggamit ng pagsasaling ito. + \ No newline at end of file diff --git a/translations/tl/examples/README.md b/translations/tl/examples/README.md index ae91299ecd..01a4810590 100644 --- a/translations/tl/examples/README.md +++ b/translations/tl/examples/README.md @@ -1,27 +1,27 @@ -# Mga Halimbawa ng AI para sa Baguhan +# Mga Halimbawa na Madaling Intindihin Para sa mga Nagsisimula sa AI -Maligayang pagdating! Ang direktoryong ito ay naglalaman ng mga simpleng halimbawa na standalone upang matulungan kang magsimula sa AI at machine learning. Ang bawat halimbawa ay idinisenyo para sa mga baguhan na may detalyadong mga komento at hakbang-hakbang na paliwanag. +Maligayang pagdating! Ang direktoryong ito ay naglalaman ng mga simpleng halimbawa na standalone upang matulungan kang magsimula sa AI at machine learning. Bawat halimbawa ay idinisenyo upang maging madali para sa mga nagsisimula na may detalyadong mga komento at paliwanag nang hakbang-hakbang. ## 📚 Pangkalahatang-ideya ng mga Halimbawa | Halimbawa | Paglalarawan | Antas ng Hirap | Mga Kinakailangan | -|-----------|--------------|----------------|-------------------| -| [Hello AI World](../../../examples/01-hello-ai-world.py) | Ang iyong unang AI program - simpleng pagkilala ng pattern | ⭐ Baguhan | Mga batayan ng Python | -| [Simple Neural Network](../../../examples/02-simple-neural-network.py) | Gumawa ng neural network mula sa simula | ⭐⭐ Baguhan+ | Python, batayang matematika | -| [Image Classifier](./03-image-classifier.ipynb) | Mag-uri ng mga larawan gamit ang pre-trained na modelo | ⭐⭐ Baguhan+ | Python, numpy | -| [Text Sentiment](../../../examples/04-text-sentiment.py) | Suriin ang damdamin ng teksto (positibo/negatibo) | ⭐⭐ Baguhan+ | Python | +|---------|-------------|------------|---------------| +| [Hello AI World](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/01-hello-ai-world.py) | Ang iyong unang programang AI - simpleng pagkilala ng pattern | ⭐ Beginner | Mga batayang kaalaman sa Python | +| [Simple Neural Network](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/02-simple-neural-network.py) | Gumawa ng neural network mula sa simula | ⭐⭐ Beginner+ | Python, batayang matematika | +| [Image Classifier](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/03-image-classifier.ipynb) | Magklasipika ng mga larawan gamit ang pre-trained na modelo | ⭐⭐ Beginner+ | Python, numpy | +| [Text Sentiment](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/04-text-sentiment.py) | Suriin ang damdamin ng teksto (positibo/negatibo) | ⭐⭐ Beginner+ | Python | ## 🚀 Pagsisimula ### Mga Kinakailangan -Siguraduhing naka-install ang Python (inirerekomenda ang bersyong 3.8 o mas bago). I-install ang mga kinakailangang package: +Siguraduhing naka-install ang Python (inirerekomenda ang bersyon 3.8 o mas mataas). I-install ang mga kinakailangang pakete: ```bash -# For Python scripts +# Para sa mga Python script pip install numpy -# For Jupyter notebooks (image classifier) +# Para sa mga Jupyter notebook (tagapag-uri ng larawan) pip install jupyter numpy pillow tensorflow ``` @@ -46,18 +46,18 @@ jupyter notebook 03-image-classifier.ipynb ## 📖 Landas ng Pagkatuto -Inirerekomenda naming sundin ang mga halimbawa ayon sa pagkakasunod-sunod: +Inirerekomenda naming sundan ang mga halimbawa ayon sa pagkakasunod: -1. **Simulan sa "Hello AI World"** - Alamin ang mga batayan ng pagkilala ng pattern -2. **Gumawa ng Simple Neural Network** - Unawain kung paano gumagana ang mga neural network -3. **Subukan ang Image Classifier** - Tingnan ang AI sa aksyon gamit ang mga totoong larawan -4. **Suriin ang Damdamin ng Teksto** - Tuklasin ang natural language processing +1. **Magsimula sa "Hello AI World"** - Matutunan ang mga batayan ng pagkilala ng pattern +2. **Gumawa ng Simpleng Neural Network** - Unawain kung paano gumagana ang mga neural network +3. **Subukan ang Image Classifier** - Masdan ang AI na kumikilos gamit ang totoong mga larawan +4. **Suriin ang Text Sentiment** - Tuklasin ang natural language processing -## 💡 Mga Tip para sa mga Baguhan +## 💡 Mga Tip Para sa mga Nagsisimula -- **Basahing mabuti ang mga komento sa code** - Ipinaliwanag nito kung ano ang ginagawa ng bawat linya -- **Mag-eksperimento!** - Subukang baguhin ang mga halaga at tingnan ang resulta -- **Huwag mag-alala kung hindi mo agad maiintindihan ang lahat** - Ang pagkatuto ay nangangailangan ng oras +- **Basahin nang maigi ang mga komento sa code** - Ipinaliwanag nito kung ano ang ginagawa ng bawat linya +- **Magsanay!** - Subukang palitan ang mga halaga at tingnan ang resulta +- **Huwag mag-alala kung hindi mo agad maintindihan ang lahat** - Ang pagkatuto ay nangangailangan ng panahon - **Magtanong** - Gamitin ang [Discussion board](https://github.com/microsoft/AI-For-Beginners/discussions) ## 🔗 Mga Susunod na Hakbang @@ -68,18 +68,20 @@ Pagkatapos makumpleto ang mga halimbawang ito, tuklasin ang buong kurikulum: - [Computer Vision](../lessons/4-ComputerVision/README.md) - [Natural Language Processing](../lessons/5-NLP/README.md) -## 🤝 Pag-aambag +## 🤝 Pagsusulong -Nakita mo bang kapaki-pakinabang ang mga halimbawang ito? Tulungan kaming pagandahin pa ang mga ito: -- Mag-ulat ng mga isyu o magmungkahi ng mga pagpapabuti -- Magdagdag ng higit pang mga halimbawa para sa mga baguhan -- Pagandahin ang dokumentasyon at mga komento +Nakita mo ba na kapaki-pakinabang ang mga halimbawang ito? Tumulong upang mapaunlad ang mga ito: +- Iulat ang mga problema o magmungkahi ng mga pagpapabuti +- Magdagdag ng higit pang mga halimbawa para sa mga nagsisimula +- Pahusayin ang dokumentasyon at mga komento --- -*Tandaan: Ang bawat eksperto ay minsang naging baguhan. Maligayang pag-aaral! 🎓* +*Tandaan: Ang bawat eksperto ay minsang isang nagsisimula. Maligayang pagkatuto! 🎓* --- -**Paunawa**: -Ang dokumentong ito ay isinalin gamit ang AI translation service na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't sinisikap naming maging tumpak, mangyaring tandaan na ang mga awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa kanyang katutubong wika ang dapat ituring na opisyal na sanggunian. Para sa mahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang hindi pagkakaunawaan o maling interpretasyon na dulot ng paggamit ng pagsasaling ito. \ No newline at end of file + +**Pagtatanggi**: +Ang dokumentong ito ay isinalin gamit ang serbisyo ng AI translation na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't nagsusumikap kami para sa katumpakan, pakatandaan na ang awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa orihinal nitong wika ang dapat ituring na pangunahing sanggunian. Para sa mahahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang maling pagkakaintindi o maling interpretasyon na nagmula sa paggamit ng pagsasaling ito. + \ No newline at end of file diff --git a/translations/tl/lessons/0-course-setup/how-to-run.md b/translations/tl/lessons/0-course-setup/how-to-run.md index 8f409c026d..8797685ab9 100644 --- a/translations/tl/lessons/0-course-setup/how-to-run.md +++ b/translations/tl/lessons/0-course-setup/how-to-run.md @@ -1,12 +1,12 @@ -# Paano Patakbuhin ang Code +# Paano Patakbuhin ang Kodigo -Ang kurikulum na ito ay naglalaman ng maraming mga executable na halimbawa at mga lab na nais mong patakbuhin. Upang magawa ito, kailangan mong magkaroon ng kakayahang magpatakbo ng Python code sa Jupyter Notebooks na ibinigay bilang bahagi ng kurikulum na ito. Mayroon kang ilang mga pagpipilian para mapatakbo ang code: +Ang kurikulum na ito ay naglalaman ng maraming maisasagawang halimbawa at mga laboratoryo na nais mong patakbuhin. Upang magawa ito, kailangan mong magkaroon ng kakayahang magpatakbo ng Python code sa Jupyter Notebooks na ibinigay bilang bahagi ng kurikulum na ito. Mayroon kang ilang mga opsyon para patakbuhin ang kodigo: -## Patakbuhin nang lokal sa iyong kompyuter +## Patakbuhin nang lokal sa iyong computer -Upang patakbuhin ang code nang lokal sa iyong kompyuter, kinakailangan ang isang Python installation. Isang rekomendasyon ay ang pag-install ng **[miniconda](https://conda.io/en/latest/miniconda.html)** - ito ay isang medyo magaan na installation na sumusuporta sa `conda` package manager para sa iba't ibang Python **virtual environments**. +Upang patakbuhin ang kodigo nang lokal sa iyong computer, kinakailangan ang isang pag-install ng Python. Isang rekomendasyon ay mag-install ng **[miniconda](https://conda.io/en/latest/miniconda.html)** - ito ay isang magaan na pag-install na sumusuporta sa `conda` package manager para sa iba't ibang mga Python **virtual environment**. -Pagkatapos mong i-install ang miniconda, i-clone ang repository at gumawa ng virtual environment na gagamitin para sa kurso na ito: +Pagkatapos mong mag-install ng miniconda, i-clone ang repositoryo at gumawa ng virtual environment na gagamitin para sa kursong ito: ```bash git clone http://github.com/microsoft/ai-for-beginners @@ -17,17 +17,17 @@ conda activate ai4beg ### Paggamit ng Visual Studio Code na may Python Extension -Ang kurikulum na ito ay pinakamahusay gamitin kapag binuksan ito sa [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) kasama ang [Python Extension](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste). +Ang kurikulum na ito ay pinakamainam gamitin kapag binuksan ito sa [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) na may [Python Extension](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste). -> **Note**: Kapag na-clone mo at na-open ang direktoryo sa VS Code, awtomatiko nitong ire-rekomenda sa iyo na i-install ang Python extensions. Kailangan mo ring i-install ang miniconda gaya ng ipinaliwanag sa itaas. +> **Tandaan**: Kapag na-clone mo na at binuksan ang direktoryo sa VS Code, awtomatiko nitong mungkahiang mag-install ka ng mga Python extension. Kailangan mo ring mag-install ng miniconda gaya ng ipinaliwanag sa itaas. -> **Note**: Kung ire-rekomenda ng VS Code na i-reopen ang repository sa isang container, dapat mong tanggihan ito upang gamitin ang lokal na Python installation. +> **Tandaan**: Kung iminumungkahi ng VS Code na muling buksan ang repositoryo sa isang container, dapat mong tanggihan ito upang magamit ang lokal na Python installation. ### Paggamit ng Jupyter sa Browser -Maaari ka ring gumamit ng Jupyter environment mula sa browser sa iyong sariling kompyuter. Parehong ang klasikong Jupyter at JupyterHub ay nagbibigay ng maginhawang development environment na may auto-completion, pagkulay ng code, atbp. +Maaari mo ring gamitin ang isang Jupyter environment mula sa browser sa iyong sariling computer. Parehong ang klasikong Jupyter at JupyterHub ay nag-aalok ng maginhawang kapaligiran sa pag-develop na may auto-completion, pag-highlight ng code, atbp. -Upang simulan ang Jupyter nang lokal, pumunta sa direktoryo ng kurso, at i-execute: +Upang simulan ang Jupyter nang lokal, pumunta sa direktoryo ng kurso, at patakbuhin ang: ```bash jupyter notebook @@ -36,36 +36,36 @@ o ```bash jupyterhub ``` -Pagkatapos ay maaari kang mag-navigate sa alinmang `.ipynb` na file, buksan ito at simulan ang pagtatrabaho. +Maaari ka nang mag-navigate sa kahit anong `.ipynb` na mga file, buksan ang mga ito at simulan ang pag-trabaho. ### Pagpapatakbo sa container -Isang alternatibo sa pag-install ng Python ay ang pagpapatakbo ng code sa isang container. Dahil ang aming repository ay nagbibigay ng isang espesyal na `.devcontainer` na folder na nagsasaad kung paano bumuo ng isang container para sa repo na ito, nag-aalok ang VS Code ng pagkakataong i-reopen ang code sa loob ng isang container. Kakailanganin nito ang Docker installation, at mas kumplikado ito kaya inirerekomenda namin ito sa mga mas may karanasang gumagamit. +Isang alternatibo sa pag-install ng Python ay ang pagpapatakbo ng kodigo sa isang container. Dahil ang aming repositoryo ay nagbibigay ng isang espesyal na `.devcontainer` folder na nagtuturo kung paano bumuo ng isang container para sa repo na ito, inaalok ng VS Code ang pagkakataong muling buksan ang kodigo sa isang container. Kakailanganin nito ang pag-install ng Docker, at magiging mas kumplikado, kaya inirerekomenda namin ito para sa mga mas bihasang gumagamit. ## Pagpapatakbo sa Cloud -Kung ayaw mong mag-install ng Python nang lokal, at may access ka sa ilang cloud resources - isang magandang alternatibo ay ang pagpapatakbo ng code sa cloud. May ilang paraan upang magawa ito: +Kung ayaw mong mag-install ng Python nang lokal, at may access ka sa ilang mga cloud resources - isang magandang alternatibo ang pagpapatakbo ng kodigo sa cloud. May ilang paraan upang gawin ito: -* Paggamit ng **[GitHub Codespaces](https://github.com/features/codespaces)**, na isang virtual environment na nilikha para sa iyo sa GitHub, na maa-access sa pamamagitan ng VS Code browser interface. Kung may access ka sa Codespaces, maaari mong i-click lang ang **Code** button sa repo, simulan ang codespace, at agad na makapagtatrabaho. -* Paggamit ng **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. Nagbibigay ang [Binder](https://mybinder.org) ng libreng computing resources sa cloud para sa mga taong tulad mo upang subukan ang ilang code mula sa GitHub. Mayroong button sa front page upang buksan ang repository sa Binder - ito ay mabilis na magdadala sa iyo sa binder site, kung saan bubuuin ang underlying container at magsisimula ang Jupyter web interface nang walang patid. +* Paggamit ng **[GitHub Codespaces](https://github.com/features/codespaces)**, na isang virtual environment na nilikha para sa iyo sa GitHub, na ma-access sa pamamagitan ng interface ng browser ng VS Code. Kung may access ka sa Codespaces, maaari mo lang i-click ang **Code** button sa repo, magsimula ng codespace, at agad na magsimula. +* Paggamit ng **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. Nag-aalok ang [Binder](https://mybinder.org) ng mga libreng computing na resources na ibinibigay sa cloud para sa mga taong kagaya mo upang subukan ang ilang kodigo sa GitHub. May button sa front page para buksan ang repositoryo sa Binder - dadalhin ka nito agad sa binder site, na bubuo ng isang underlying container at magsisimula ng isang Jupyter web interface para sa iyo nang walang abala. -> **Note**: Upang maiwasan ang maling paggamit, may mga web resources na hindi naa-access ng Binder. Maaaring pigilan nito ang ilang bahagi ng code na gumana na kumukuha ng mga modelo at/o dataset mula sa pampublikong Internet. Kailangan mong humanap ng mga alternatibong paraan. Gayundin, ang computing resources na ibinibigay ng Binder ay medyo basic lamang, kaya magiging mabagal ang training, lalong-lalo na sa mga huling aralin na mas kumplikado. +> **Tandaan**: Upang maiwasan ang maling paggamit, may akses ang Binder sa ilang mga web resource na naka-block. Maaaring hadlangan nito ang ilang bahagi ng kodigo na gumagana, lalo na yung humihingi ng mga modelo at/o datasets mula sa pampublikong Internet. Maaaring kailanganin mong humanap ng ibang paraan. Gayundin, ang computing resources na ibinibigay ng Binder ay medyo basic lang, kaya mabagal ang training, lalo na sa mga huling leksyon na mas kumplikado. ## Pagpapatakbo sa Cloud na may GPU -Ang ilang mga huling aralin sa kurikulum na ito ay lubos na makikinabang sa suporta ng GPU. Ang pagsasanay ng mga modelo, halimbawa, ay maaaring maging napakabagal kung wala ito. May ilang mga opsyon na maaari mong sundin, lalo na kung may access ka sa cloud sa pamamagitan ng [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste), o sa pamamagitan ng iyong institusyon: +Ang ilan sa mga huling leksyon sa kurikulum na ito ay malaki ang mapapakinabangan mula sa suporta ng GPU. Halimbawa, ang pagte-train ng modelo ay maaaring maging napakabagal kung wala ito. May ilang mga opsyon na maaari mong sundan, lalo na kung may access ka sa cloud sa pamamagitan ng [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste), o mula sa iyong institusyon: -* Gumawa ng [Data Science Virtual Machine](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) at kumonekta dito gamit ang Jupyter. Maaari mong i-clone ang repo direkta sa makina, at simulan ang pag-aaral. Ang NC-series VMs ay may suporta para sa GPU. +* Gumawa ng [Data Science Virtual Machine](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) at kumonekta dito gamit ang Jupyter. Maaari mong i-clone ang repo diretso sa makina, at simulan ang pag-aaral. Ang NC-series na mga VM ay may suporta sa GPU. -> **Note**: Ang ilang subscription, kabilang ang Azure for Students, ay hindi awtomatikong nagbibigay ng suporta para sa GPU. Maaaring kailanganin mong humiling ng karagdagang GPU cores sa pamamagitan ng technical support request. +> **Tandaan**: Ang ilang mga subscription, kabilang ang Azure for Students, ay hindi agad nagbibigay ng suporta sa GPU. Maaaring kailanganin mong humiling ng karagdagang mga GPU core sa pamamagitan ng technical support request. -* Gumawa ng [Azure Machine Learning Workspace](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) at gamitin ang Notebook feature doon. [Itong video](https://azure-for-academics.github.io/quickstart/azureml-papers/) ay nagpapakita kung paano i-clone ang repository papunta sa Azure ML notebook at simulan ang paggamit nito. +* Gumawa ng [Azure Machine Learning Workspace](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) at pagkatapos ay gamitin ang Notebook feature doon. [Ang video na ito](https://azure-for-academics.github.io/quickstart/azureml-papers/) ay nagpapakita kung paano i-clone ang repository sa Azure ML notebook at simulan itong gamitin. -Maaari mo ring gamitin ang Google Colab, na may kasamang libreng GPU support, at i-upload ang Jupyter Notebooks doon upang isa-isang patakbuhin. +Maaari mo ring gamitin ang Google Colab, na may kasamang libreng suporta sa GPU, at i-upload ang mga Jupyter Notebooks doon upang patakbuhin ang mga ito isa-isa. --- -**Paliwanag**: -Ang dokumentong ito ay isinalin gamit ang AI translation service na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't nagsusumikap kaming maging tumpak, pakatandaan na maaaring may mga pagkakamali o hindi pagkakatugma ang mga awtomatikong pagsasalin. Ang orihinal na dokumento sa sariling wika nito ang dapat ituring na opisyal na sanggunian. Para sa mahahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang hindi pagkakaunawaan o maling interpretasyon na maaaring manggaling sa paggamit ng pagsasaling ito. +**Pagtatanggi**: +Ang dokumentong ito ay isinalin gamit ang serbisyo ng AI translation na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't nagsusumikap kami para sa katumpakan, pakatandaan na ang awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa orihinal nitong wika ang dapat ituring na pangunahing sanggunian. Para sa mahahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang maling pagkakaintindi o maling interpretasyon na nagmula sa paggamit ng pagsasaling ito. \ No newline at end of file diff --git a/translations/tl/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/tl/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index f7da63689c..7743f320cd 100644 --- a/translations/tl/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/tl/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -4,11 +4,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Mga Pre-trained na Modelo at Transfer Learning\n", + "# Mga pre-trained na modelo at transfer learning\n", "\n", - "Ang pagsasanay ng CNNs ay maaaring tumagal ng maraming oras, at nangangailangan ito ng malaking dami ng datos. Gayunpaman, karamihan sa oras ay ginugugol sa pag-aaral ng pinakamahusay na mga low-level filter na ginagamit ng network upang kumuha ng mga pattern mula sa mga imahe. Isang natural na tanong ang lumalabas - maaari ba nating gamitin ang isang neural network na sinanay na sa isang dataset at iangkop ito upang makapagklasipika ng ibang mga imahe nang hindi dumadaan sa buong proseso ng pagsasanay?\n", + "Ang pagsasanay ng mga CNN ay maaaring tumagal ng maraming oras, at maraming datos ang kinakailangan para sa gawaing iyon. Gayunpaman, malaking bahagi ng oras ay ginugugol upang matutunan ang pinakamahusay na mga mabababang-level na filter na ginagamit ng network upang kunin ang mga pattern mula sa mga larawan. Isang natural na tanong ang lumilitaw - maaari ba tayong gumamit ng neural network na na-train sa isang dataset at iakma ito sa pag-uuri ng ibang mga larawan nang hindi na kailangan ang buong proseso ng training?\n", "\n", - "Ang pamamaraang ito ay tinatawag na **transfer learning**, dahil inililipat natin ang ilang kaalaman mula sa isang neural network model patungo sa iba. Sa transfer learning, karaniwang nagsisimula tayo sa isang pre-trained na modelo, na sinanay na sa isang malaking dataset ng imahe, tulad ng **ImageNet**. Ang mga modelong ito ay mahusay na sa pagkuha ng iba't ibang mga tampok mula sa mga pangkalahatang imahe, at sa maraming pagkakataon, ang simpleng paggawa ng isang classifier sa ibabaw ng mga nakuha nang tampok na ito ay maaaring magbigay ng magandang resulta.\n" + "Ang pamamaraang ito ay tinatawag na **transfer learning**, dahil inilipat natin ang ilang kaalaman mula sa isang neural network model papunta sa iba. Sa transfer learning, karaniwan tayong nagsisimula sa isang pre-trained na modelo, na na-train na sa isang malaking image dataset, gaya ng **ImageNet**. Ang mga modelong iyon ay kaya nang mahusay kumuha ng iba't ibang mga tampok mula sa mga generic na larawan, at sa maraming pagkakataon, ang paggawa lamang ng classifier sa ibabaw ng mga nakuhang tampok na iyon ay maaaring magbigay ng magandang resulta.\n" ] }, { @@ -29,11 +29,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Dataset ng Pusa vs. Aso\n", + "## Cats vs. Dogs Dataset\n", "\n", - "Sa yunit na ito, susubukan nating lutasin ang isang totoong problema ng pag-uuri ng mga larawan ng pusa at aso. Para sa layuning ito, gagamitin natin ang [Kaggle Cats vs. Dogs Dataset](https://www.kaggle.com/c/dogs-vs-cats), na maaari ring ma-download [mula sa Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n", + "Sa yunit na ito, lulutasin natin ang isang tunay na problema sa pag-uuri ng mga larawan ng mga pusa at aso. Para dito, gagamit tayo ng [Kaggle Cats vs. Dogs Dataset](https://www.kaggle.com/c/dogs-vs-cats), na maaari ring i-download [mula sa Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n", "\n", - "I-download natin ang dataset na ito at i-extract ito sa direktoryong `data` (ang prosesong ito ay maaaring tumagal ng kaunting oras!):\n" + "I-download natin ang dataset na ito at i-extract ito sa `data` na direktoryo (maaaring tumagal ang prosesong ito ng ilang sandali!):\n" ] }, { @@ -64,7 +64,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Sa kasamaang-palad, may ilang sirang mga file ng imahe sa dataset. Kailangan nating magsagawa ng mabilisang paglilinis upang suriin ang mga sirang file. Upang hindi maapektuhan ang tutorial na ito, inilipat namin ang code para sa pag-verify ng dataset sa isang module.\n" + "Sa kasamaang palad, may ilang sirang mga file ng larawan sa dataset. Kailangan nating mabilisang linisin upang suriin ang mga sirang file. Upang hindi masira ang tutorial na ito, inilagay namin ang code para i-verify ang dataset sa isang module.\n" ] }, { @@ -333,13 +333,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Paglo-load ng Dataset\n", + "## Pag-load ng Dataset\n", "\n", - "Sa mga naunang halimbawa, naglo-load tayo ng mga dataset na naka-built-in sa Keras. Ngayon, haharapin natin ang sarili nating dataset, na kailangang i-load mula sa isang direktoryo ng mga larawan.\n", + "Sa mga naunang halimbawa, naglo-load tayo ng mga dataset na naka-built-in sa Keras. Ngayon, haharapin natin ang sarili nating dataset, na kailangan nating i-load mula sa isang direktoryo ng mga larawan.\n", "\n", - "Sa totoong buhay, ang laki ng mga dataset ng larawan ay maaaring napakalaki, at hindi maaasahan na ang lahat ng data ay magkakasya sa memorya. Kaya, ang mga dataset ay madalas na kinakatawan bilang **generators** na maaaring magbalik ng data sa maliliit na batch na angkop para sa training.\n", + "Sa totoong buhay, ang laki ng mga image dataset ay maaaring maging napakalaki, at hindi maaaring asahan na lahat ng data ay maaaring magkasya sa memorya. Kaya, ang mga dataset ay kadalasang kinakatawan bilang **generators** na maaaring magbalik ng data sa mga minibatch na angkop para sa training.\n", "\n", - "Upang harapin ang image classification, ang Keras ay may espesyal na function na `image_dataset_from_directory`, na maaaring mag-load ng mga larawan mula sa mga subdirectory na tumutukoy sa iba't ibang klase. Ang function na ito ay nag-aalaga rin ng pag-scale ng mga larawan, at maaari rin nitong hatiin ang dataset sa train at test subsets:\n" + "Para sa pag-handle ng image classification, kasama sa Keras ang espesyal na function na `image_dataset_from_directory`, na maaaring mag-load ng mga larawan mula sa mga subdirectory na tumutugma sa iba't ibang klase. Ang function na ito ay inaalagaan din ang pag-scale ng mga larawan, at maaari rin nitong hatiin ang dataset sa train at test na mga subset:\n" ] }, { @@ -383,7 +383,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Mahalagang itakda ang parehong halaga ng `seed` para sa parehong tawag, dahil naaapektuhan nito ang paghahati ng mga imahe sa pagitan ng train at test dataset.\n", + "Mahalaga na itakda ang parehong `seed` na halaga para sa parehong tawag, dahil ito ay nakakaapekto sa paghahati ng mga imahe sa pagitan ng train at test na dataset.\n", "\n", "Awtomatikong kinukuha ng Dataset ang mga pangalan ng klase mula sa mga direktoryo, at maaari mo itong ma-access kung kinakailangan sa pamamagitan ng pagtawag:\n" ] @@ -412,7 +412,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Ang mga dataset na nakuha namin ay maaaring direktang ipasa sa `fit` na function upang sanayin ang modelo. Naglalaman ang mga ito ng parehong kaukulang mga imahe at label, na maaaring i-loop gamit ang sumusunod na konstruksyon:\n" + "Ang mga nakuha nating datasets ay maaaring direktang ipasa sa `fit` function para sanayin ang modelo. Naglalaman ang mga ito ng parehong kaukulang mga imahe at label, na maaaring i-loop gamit ang sumusunod na konstruksyon:\n" ] }, { @@ -453,7 +453,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "> **Tandaan**: Ang lahat ng mga imahe sa dataset ay kinakatawan bilang floating point tensors na may saklaw na 0-255. Bago ito ipasa sa neural network, kailangan nating i-scale ang mga halagang iyon sa saklaw na 0-1. Kapag nag-plot ng mga imahe, kailangan din nating gawin ang pareho, o i-convert ang mga halaga sa uri na `int` (na ginagawa natin sa code sa itaas), upang ipakita sa `matplotlib` na nais nating i-plot ang orihinal na hindi naka-scale na imahe.\n" + "> **Tandaan**: Lahat ng mga larawan sa dataset ay kinakatawan bilang mga floatint point tensor na may saklaw na 0-255. Bago ito ipasa sa neural network, kailangan nating iskalang muli ang mga halagang iyon sa saklaw na 0-1. Kapag nag-plot ng mga larawan, kailangan din nating gawin ang parehong bagay, o i-convert ang mga halaga sa uri ng `int` (na ginawa natin sa code sa itaas), upang ipakita sa `matplotlib` na nais nating i-plot ang orihinal na hindi naka-scale na larawan.\n" ] }, { @@ -462,7 +462,7 @@ "source": [ "## Mga Pre-trained na Modelo\n", "\n", - "Para sa maraming gawain sa pag-uuri ng imahe, makakahanap ka ng mga pre-trained na modelo ng neural network. Marami sa mga modelong ito ay makikita sa loob ng `keras.applications` namespace, at mas marami pang modelo ang maaaring matagpuan sa Internet. Tingnan natin kung paano ma-load at magamit ang pinakasimpleng VGG-16 na modelo:\n" + "Para sa maraming mga gawain sa klasipikasyon ng larawan, maaaring makahanap ng mga pre-trained na modelo ng neural network. Marami sa mga modelong iyon ay available sa loob ng `keras.applications` namespace, at marami pang iba ang maaaring matagpuan sa Internet. Tingnan natin kung paano mai-load at magamit ang pinakasimpleng modelo ng 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": [ - "Mayroong ilang mahahalagang bagay dito:\n", - "* Bago ipasa ang isang input sa anumang pre-trained network, kailangang i-preprocess ito sa isang tiyak na paraan. Ginagawa ito sa pamamagitan ng pagtawag sa kaukulang `preprocess_input` function, na tumatanggap ng batch ng mga imahe at ibinabalik ang kanilang naprosesong anyo. Sa kaso ng VGG-16, ang mga imahe ay na-normalize, at ang ilang pre-defined na average value para sa bawat channel ay ibinabawas. Ito ay dahil ang VGG-16 ay orihinal na na-train gamit ang ganitong pre-processing.\n", - "* Ang neural network ay ina-apply sa input batch, at bilang resulta, makakakuha tayo ng batch ng 1000-element tensors na nagpapakita ng probabilidad ng bawat klase. Maaari nating hanapin ang pinaka-probable na numero ng klase sa pamamagitan ng pagtawag sa `argmax` sa tensor na ito.\n", - "* Ang nakuha na resulta ay isang [numero ng klase ng `ImageNet`](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Upang maunawaan ang resulta, maaari rin nating gamitin ang `decode_predictions` function, na nagbabalik ng top n na klase kasama ang kanilang mga pangalan.\n" + "May ilang mahahalagang bagay dito:\n", + "* Bago ipasa ang input sa anumang pre-trained na network, kailangang i-pre-process ito sa isang tiyak na paraan. Ginagawa ito sa pamamagitan ng pagtawag sa katumbas na `preprocess_input` function, na tumatanggap ng batch ng mga imahe, at ibinabalik ang kanilang na-prosesong anyo. Sa kaso ng VGG-16, ang mga imahe ay nino-normalize, at ang ilang pre-defined na average value para sa bawat channel ay ibinabawas. Ito ay dahil orihinal na tinraining ang VGG-16 gamit ang ganitong pre-processing.\n", + "* Ang neural network ay ina-apply sa input batch, at bilang resulta nakakakuha tayo ng batch ng 1000-element tensors na nagpapakita ng posibilidad ng bawat klase. Maaari nating hanapin ang pinaka-malamang na numero ng klase sa pamamagitan ng pagtawag ng `argmax` sa tensor na ito.\n", + "* Ang nakuhang resulta ay isang [numero ng isang `ImageNet` na klase](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Upang maunawaan ang resulta na ito, maaari rin nating gamitin ang `decode_predictions` function, na nagbabalik ng nangungunang n mga klase kasama ang kanilang mga pangalan.\n" ] }, { @@ -597,9 +607,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Mga kalkulasyon gamit ang GPU\n", + "## GPU computations\n", "\n", - "Ang mga deep neural networks, tulad ng VGG-16 at iba pang mas modernong arkitektura, ay nangangailangan ng malaking computational power upang gumana. Makatuwiran na gamitin ang GPU acceleration kung ito ay magagamit. Sa kabutihang-palad, awtomatikong pinapabilis ng Keras ang mga kalkulasyon sa GPU kung ito ay magagamit. Maaari nating suriin kung magagamit ng Tensorflow ang GPU gamit ang sumusunod na code:\n" + "Malalim na neural network, tulad ng VGG-16 at iba pang mas modernong arkitektura ay nangangailangan ng maraming computational power upang tumakbo. Makatuwiran na gamitin ang GPU acceleration, kung ito ay magagamit. Sa kabutihang palad, awtomatikong pinapabilis ng Keras ang mga kalkulasyon sa GPU kung ito ay magagamit. Maaari nating suriin kung kaya ng Tensorflow na gamitin ang GPU gamit ang sumusunod na code:\n" ] }, { @@ -626,9 +636,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Pagkuha ng mga VGG Feature\n", "\n", - "Kung nais nating gamitin ang VGG-16 upang kumuha ng mga feature mula sa ating mga larawan, kailangan natin ang modelo na walang huling mga layer para sa klasipikasyon. Maaari nating i-instantiate ang VGG-16 na modelo nang walang mga top layer gamit ang code na ito:\n" + "## Pagkuha ng mga tampok ng VGG\n", + "\n", + "Kung gusto nating gamitin ang VGG-16 upang kumuha ng mga tampok mula sa ating mga larawan, kailangan natin ang modelo na walang mga huling layer ng klasipikasyon. Maaari nating gawin ang VGG-16 na modelo na walang mga top layer gamit ang code na ito:\n" ] }, { @@ -680,9 +691,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Ang sukat ng feature tensor ay 7x7x512, ngunit upang maipakita ito, kinailangan nating i-reshape ito sa 2D na anyo.\n", + "Ang dimensyon ng feature tensor ay 7x7x512, ngunit upang ito ay ma-visualize, kinailangan naming i-reshape ito sa 2D na anyo.\n", "\n", - "Ngayon, subukan nating tingnan kung magagamit ang mga feature na ito para sa pag-uuri ng mga larawan. Manu-mano nating kunin ang ilang bahagi ng mga larawan (50 minibatches, sa ating kaso), at i-pre-compute ang kanilang mga feature vector. Maaari nating gamitin ang Tensorflow **dataset** API para gawin ito. Ang `map` function ay kumukuha ng isang dataset at nag-aaplay ng ibinigay na lambda-function upang baguhin ito. Ginagamit natin ang mekanismong ito upang makabuo ng mga bagong dataset, `ds_features_train` at `ds_features_test`, na naglalaman ng mga feature na nakuha mula sa VGG sa halip na mga orihinal na larawan.\n" + "Ngayon, subukan nating tingnan kung ang mga feature na iyon ay maaaring gamitin upang i-klasipika ang mga larawan. Manwal nating kukunin ang ilang bahagi ng mga larawan (50 minibatches, sa aming kaso), at i-pre-compute ang kanilang mga feature vector. Maaari nating gamitin ang Tensorflow **dataset** API para dito. Ang `map` function ay kumukuha ng isang dataset at ina-apply ang isang ibinigay na lambda-function upang ito ay mabago. Ginagamit namin ang mekanismong ito upang bumuo ng mga bagong dataset, `ds_features_train` at `ds_features_test`, na naglalaman ng mga VGG-extracted features imbes na orihinal na mga larawan.\n" ] }, { @@ -712,9 +723,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Ginamit namin ang konstruksyon na `.take(50)` upang limitahan ang laki ng dataset, para mapabilis ang aming demonstrasyon. Siyempre, maaari mong isagawa ang eksperimentong ito sa buong dataset.\n", + "Ginamit namin ang konstruksyon na `.take(50)` upang limitahan ang laki ng dataset, para pabilisin ang aming demonstrasyon. Maaari mo naman siyempre gawin ang eksperimento na ito sa buong dataset.\n", "\n", - "Ngayon na mayroon na tayong dataset na may mga na-extract na feature, maaari na tayong mag-train ng isang simpleng dense classifier upang makilala ang mga pusa at aso. Ang network na ito ay tatanggap ng feature vector na may hugis na (7,7,512), at magbibigay ng isang output na tumutukoy kung aso o pusa. Dahil ito ay binary classification, gagamit tayo ng `sigmoid` activation function at `binary_crossentropy` loss.\n" + "Ngayon na mayroon na tayong dataset na may mga na-extract na feature, maaari na tayong magsanay ng simpleng dense classifier upang makilala ang pagitan ng pusa at aso. Ang network na ito ay tatanggap ng feature vector na may hugis na (7,7,512), at magbibigay ng isang output na tumutukoy alinman sa aso o pusa. Dahil ito ay binary classification, gagamit tayo ng `sigmoid` activation function at `binary_crossentropy` loss.\n" ] }, { @@ -743,13 +754,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Ang resulta ay maganda, kaya nating makilala ang pagkakaiba ng pusa at aso na may halos 95% na posibilidad! Gayunpaman, nasubukan lang natin ang pamamaraang ito sa isang subset ng lahat ng mga larawan, dahil ang manu-manong pagkuha ng mga katangian ay tila kumakain ng maraming oras.\n", + "Maganda ang resulta, kaya nating makilala ang pagitan ng pusa at aso na may halos 95% na posibilidad! Gayunpaman, nasubukan lamang namin ang pamamaraang ito sa isang subset ng lahat ng mga larawan, dahil ang manu-manong pagkuha ng mga tampok ay tila tumatagal ng maraming oras.\n", "\n", "## Transfer learning gamit ang isang VGG network\n", "\n", - "Maaari rin nating iwasan ang manu-manong pag-precompute ng mga katangian sa pamamagitan ng paggamit ng orihinal na VGG-16 network nang buo habang nagsasanay, sa pamamagitan ng pagdaragdag ng feature extractor sa ating network bilang unang layer.\n", + "Maaari rin nating iwasan ang manu-manong pag-compute ng mga tampok sa pamamagitan ng paggamit ng orihinal na VGG-16 network bilang kabuuan habang nagsasanay, sa pamamagitan ng pagdagdag ng feature extractor sa ating network bilang unang layer.\n", "\n", - "Ang kagandahan ng Keras architecture ay ang VGG-16 model na na-define natin sa itaas ay maaari ring gamitin bilang isang layer sa isa pang neural network! Kailangan lang nating bumuo ng isang network na may dense classifier sa ibabaw nito, at pagkatapos ay sanayin ang buong network gamit ang back propagation.\n" + "Ang kagandahan ng arkitektura ng Keras ay ang modelong VGG-16 na ating naipaliwanag sa itaas ay maaari ring gamitin bilang isang layer sa ibang neural network! Kailangan lang nating bumuo ng network na may dense classifier sa ibabaw nito, at pagkatapos ay sanayin ang buong network gamit ang back propagation.\n" ] }, { @@ -793,13 +804,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Ang modelong ito ay parang isang end-to-end classification network na tumatanggap ng isang imahe at nagbabalik ng klase. Gayunpaman, ang hamon dito ay gusto nating gamitin ang VGG16 bilang isang feature extractor, at hindi ito muling i-train. Kaya, kailangan nating **i-freeze ang mga weights ng convolutional feature extractor**. Maaari nating ma-access ang unang layer ng network sa pamamagitan ng pagtawag sa `model.layers[0]`, at kailangan lang nating itakda ang property na `trainable` sa `False`.\n", + "Ang modelong ito ay parang end-to-end na classification network, na kumukuha ng isang larawan at nagbabalik ng klase. Gayunpaman, ang kumplikadong bagay ay gusto nating ang VGG16 ay gumanap bilang isang feature extractor, at hindi na muling itrain. Kaya, kailangan nating **i-freeze ang mga timbang ng convolutional feature extractor**. Maaari nating ma-access ang unang layer ng network sa pamamagitan ng pagtawag sa `model.layers[0]`, at kailangan lang nating itakda ang property na `trainable` sa `False`.\n", "\n", - "> **Note**: Ang pag-freeze ng weights ng feature extractor ay kinakailangan, dahil kung hindi, maaaring masira ng untrained classifier layer ang orihinal na pre-trained weights ng convolutional extractor.\n", + "> **Tandaan**: Kailangan i-freeze ang mga timbang ng feature extractor, dahil kung hindi, ang untrained na classifier layer ay maaaring sirain ang orihinal na pre-trained na mga timbang ng convolutional extractor.\n", "\n", - "Mapapansin mo na habang ang kabuuang bilang ng mga parameter sa ating network ay nasa 15 milyon, 25k na parameter lamang ang ating tina-train. Ang lahat ng iba pang mga parameter ng top-level convolutional filters ay pre-trained. Maganda ito, dahil kaya nating i-fine-tune ang mas maliit na bilang ng mga parameter gamit ang mas kaunting bilang ng mga halimbawa.\n", + "Mapapansin mo na habang ang kabuuang bilang ng mga parameter sa ating network ay humigit-kumulang 15 milyon, tayo ay nagtetrain lamang ng 25k na mga parameter. Ang lahat ng iba pang mga parameter ng top-level na convolutional filters ay pre-trained na. Maganda iyon, dahil kaya nating i-fine-tune ang mas maliit na bilang ng mga parameter gamit ang mas maliit na bilang ng mga halimbawa.\n", "\n", - "Ngayon, itetrain natin ang ating network at tingnan kung gaano ito kagaling. Asahan ang medyo mahabang oras ng pagtakbo, at huwag mag-alala kung mukhang nakatigil ang execution sa ilang sandali.\n" + "Ngayon ay itetrain natin ang ating network at titingnan kung gaano ito kagaling. Asahan ang medyo mahabang oras ng pagpapatakbo, at huwag mag-alala kung tila humihinto ang execution nang ilang sandali.\n" ] }, { @@ -824,11 +835,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Mukhang nakakuha tayo ng medyo tumpak na classifier para sa mga pusa laban sa mga aso!\n", + "Mukhang nakakuha tayo ng medyo tumpak na classifier para sa pusa laban sa aso! \n", "\n", - "## Pag-save at Pag-load ng Modelo\n", + "## Pagse-save at Paglo-load ng Modelo\n", "\n", - "Kapag natapos na nating sanayin ang modelo, maaari nating i-save ang arkitektura ng modelo at ang mga na-train na timbang sa isang file para magamit sa hinaharap:\n" + "Kapag natapos na nating sanayin ang modelo, maaari nating i-save ang arkitektura ng modelo at mga na-train na timbang sa isang file para sa hinaharap na paggamit:\n" ] }, { @@ -852,7 +863,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Maaari nating i-load ang modelo mula sa file anumang oras. Maaaring maging kapaki-pakinabang ito kung sakaling masira ng susunod na eksperimento ang modelo - hindi mo na kailangang magsimula muli mula sa simula.\n" + "Maaari nating i-load ang modelo mula sa file anumang oras. Maaari mo itong magamit kung sakaling masira ang modelo sa susunod na eksperimento - hindi mo na kailangang magsimula muli mula sa simula.\n" ] }, { @@ -870,13 +881,13 @@ "source": [ "## Fine-tuning transfer learning\n", "\n", - "Sa nakaraang seksyon, sinanay natin ang huling classifier layer upang i-klasipika ang mga imahe sa sarili nating dataset. Gayunpaman, hindi natin muling sinanay ang feature extractor, at ang ating modelo ay umasa sa mga feature na natutunan nito mula sa ImageNet data. Kung ang iyong mga bagay ay mukhang iba sa karaniwang mga imahe ng ImageNet, maaaring hindi gumana nang maayos ang kombinasyon ng mga feature na ito. Kaya't may saysay na simulan ang pagsasanay sa mga convolutional layer din.\n", + "Sa nakaraang seksyon, na-train natin ang huling classifier layer para i-classify ang mga larawan sa sarili nating dataset. Gayunpaman, hindi natin na-retrain ang feature extractor, at umaasa ang modelo natin sa mga feature na natutunan mula sa ImageNet data. Kung ang mga bagay na gusto mong i-classify ay iba sa karaniwang mga larawan ng ImageNet, maaaring hindi ito ang pinakamahusay na kombinasyon ng mga feature. Kaya makatwiran na simulan din ang pag-train ng mga convolutional layers.\n", "\n", - "Upang gawin ito, maaari nating i-unfreeze ang mga parameter ng convolutional filter na dati nating na-freeze.\n", + "Para magawa ito, maaari nating i-unfreeze ang mga convolutional filter parameters na dati nating pinatigil. \n", "\n", - "> **Note:** Mahalagang i-freeze muna ang mga parameter at magsagawa ng ilang epochs ng pagsasanay upang mapatatag ang mga weights sa classification layer. Kung agad kang magsisimula ng pagsasanay sa end-to-end network na may mga naka-unfreeze na parameter, malamang na masira ng malalaking error ang mga pre-trained weights sa convolutional layers.\n", + "> **Note:** Mahalagang i-freeze muna ang mga parameters at magsagawa ng ilang epochs ng training upang maging stable ang mga weights sa classification layer. Kung agad mong sisimulang i-train ang buong network nang unfrozen ang mga parameters, malaki ang posibilidad na sira ang mga pre-trained weights sa convolutional layers dahil sa malalaking errors.\n", "\n", - "Ang ating convolutional VGG-16 model ay matatagpuan sa loob ng unang layer, at ito mismo ay binubuo ng maraming layer. Maaari nating tingnan ang istruktura nito:\n" + "Ang ating convolutional VGG-16 model ay nasa loob ng unang layer, at ito ay binubuo ng maraming layers. Maaari nating tingnan ang estruktura nito: \n" ] }, { @@ -944,7 +955,9 @@ { "cell_type": "markdown", "metadata": {}, - "source": [] + "source": [ + "Maaari nating i-unfreeze ang lahat ng mga layer ng convolutional base:\n" + ] }, { "cell_type": "code", @@ -959,7 +972,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Gayunpaman, hindi pinakamahusay na ideya ang i-unfreeze ang lahat ng sabay-sabay. Maaari muna nating i-unfreeze ang ilang huling layer ng convolutions, dahil naglalaman ang mga ito ng mas mataas na antas ng mga pattern na may kaugnayan sa ating mga imahe. Halimbawa, sa simula, maaari nating i-freeze ang lahat ng layer maliban sa huling 4:\n" + "Gayunpaman, ang pag-unfreeze ng lahat nang sabay-sabay ay hindi ang pinakamahusay na ideya. Maaari nating unfreeze-in muna lamang ang ilang huling mga layer ng convolution, dahil naglalaman ang mga ito ng mas mataas na antas ng mga pattern na may kaugnayan sa ating mga larawan. Halimbawa, upang magsimula, maaari nating i-freeze lahat ng mga layer maliban sa huling 4: \n" ] }, { @@ -998,11 +1011,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Pansinin na ang bilang ng mga trainable na parameter ay lumaki nang malaki, ngunit nasa paligid pa rin ito ng 50% ng lahat ng mga parameter.\n", + "Pansinin na ang bilang ng mga trainable na parametro ay tumaas nang malaki, ngunit ito ay nasa paligid pa rin ng 50% ng lahat ng parametro.\n", "\n", - "Pagkatapos ng pag-unfreeze, maaari tayong magsagawa ng ilang karagdagang epochs ng training (sa ating halimbawa, isa lang ang gagawin natin). Maaari ka ring pumili ng mas mababang learning rate upang mabawasan ang epekto sa pre-trained weights. Gayunpaman, kahit na may mababang learning rate, maaari mong asahan na bababa ang accuracy sa simula ng training, hanggang sa tuluyang maabot ang bahagyang mas mataas na antas kumpara sa kaso ng fixed weights.\n", + "Pagkatapos buksan ang pag-freeze, maaari tayong magsagawa ng ilang karagdagang epochs ng pagsasanay (sa aming halimbawa, gagawa lang kami ng isa). Maaari mo ring piliin ang mas mababang learning rate, upang mabawasan ang epekto sa mga pre-trained na weights. Gayunpaman, kahit na may mababang learning rate, maaari mong asahan na bababa ang accuracy sa simula ng pagsasanay, hanggang sa maabot nito ang bahagyang mas mataas na antas kaysa sa kaso ng fixed na mga weights.\n", "\n", - "> **Note:** Ang training na ito ay mas mabagal, dahil kailangan nating i-propagate ang gradients pabalik sa maraming layers ng network!\n" + "> **Tandaan:** Ang pagsasanay na ito ay nangyayari nang mas mabagal, dahil kailangan nating ipasa pabalik ang mga gradients sa maraming layer ng network!\n" ] }, { @@ -1026,9 +1039,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Mas malamang na makamit natin ang mas mataas na training accuracy dahil gumagamit tayo ng mas makapangyarihang network na may mas maraming parameters, ngunit ang validation accuracy ay hindi gaanong tataas.\n", + "Malamang na makakamit natin ang mas mataas na training accuracy, dahil gumagamit tayo ng mas makapangyarihang network na may mas maraming parameters, ngunit hindi ganoon kalaki ang pagtaas ng validation accuracy.\n", "\n", - "Huwag mag-atubiling i-unfreeze ang ilang karagdagang layers ng network at magpatuloy sa pag-train upang makita kung kaya mong makamit ang mas mataas na accuracy!\n" + "Malayang i-unfreeze ang ilan pang mga layer ng network at mag-train pa, upang makita kung makakamit mo ang mas mataas na accuracy!\n" ] }, { @@ -1037,7 +1050,7 @@ "source": [ "## Iba pang mga modelo ng computer vision\n", "\n", - "Ang VGG-16 ay isa sa mga pinakasimpleng arkitektura ng computer vision. Nagbibigay ang Keras ng mas marami pang pre-trained na mga network. Ang mga madalas gamitin sa mga ito ay ang mga arkitektura ng **ResNet**, na binuo ng Microsoft, at **Inception** ng Google. Halimbawa, tuklasin natin ang arkitektura ng pinakasimpleng modelo ng ResNet-50 (Ang ResNet ay isang pamilya ng mga modelo na may iba't ibang lalim, maaari mong subukang mag-eksperimento sa ResNet-152 kung nais mong makita kung ano ang hitsura ng isang talagang malalim na modelo):\n" + "Ang VGG-16 ay isa sa mga pinakasimpleng arkitektura ng computer vision. Nagbibigay ang Keras ng marami pang mga pre-trained na network. Ang mga pinaka-madalas gamitin dito ay ang mga arkitektura ng **ResNet**, na binuo ng Microsoft, at **Inception** ng Google. Halimbawa, tuklasin natin ang arkitektura ng pinakasimpleng ResNet-50 na modelo (ang ResNet ay isang pamilya ng mga modelo na may iba't ibang lalim, maaari mong subukang eksperimentuhin ang ResNet-152 kung nais mong makita kung ano ang hitsura ng isang talagang malalim na modelo):\n" ] }, { @@ -1439,29 +1452,29 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Tulad ng nakikita mo, ang modelong ito ay binubuo ng parehong mga pamilyar na bahagi: convolutional layers, pooling layers, at ang huling dense classifier. Maaari nating gamitin ang modelong ito sa eksaktong parehong paraan tulad ng paggamit natin sa VGG-16 para sa transfer learning. Maaari mong subukang mag-eksperimento gamit ang code sa itaas, gamit ang iba't ibang ResNet models bilang base model, at tingnan kung paano nagbabago ang accuracy.\n", + "Tulad ng nakikita mo, ang modelo ay naglalaman ng parehong mga pamilyar na bahagi: convolutional layers, pooling layers, at panghuling dense classifier. Maaari nating gamitin ang modelong ito sa eksaktong kaparehong paraan tulad ng paggamit natin ng VGG-16 para sa transfer learning. Maaari kang mag-eksperimento sa code sa itaas, gamit ang iba't ibang ResNet models bilang base model, at tingnan kung paano nagbabago ang accuracy.\n", "\n", "## Batch Normalization\n", "\n", - "Ang network na ito ay naglalaman ng isa pang uri ng layer: **Batch Normalization**. Ang ideya ng batch normalization ay dalhin ang mga halaga na dumadaloy sa neural network sa tamang saklaw. Karaniwan, ang mga neural network ay mas mahusay gumagana kapag ang lahat ng mga halaga ay nasa saklaw na [-1,1] o [0,1], at ito ang dahilan kung bakit natin ini-scale o ini-normalize ang ating input data nang naaayon. Gayunpaman, sa panahon ng training ng isang deep network, maaaring mangyari na ang mga halaga ay lumayo nang husto sa saklaw na ito, na nagiging sanhi ng problema sa training. Ang batch normalization layer ay nagko-compute ng average at standard deviation para sa lahat ng mga halaga ng kasalukuyang minibatch, at ginagamit ang mga ito upang i-normalize ang signal bago ito dumaan sa isang neural network layer. Malaki ang naitutulong nito sa pagpapabuti ng stability ng mga deep networks.\n" + "Ang network na ito ay naglalaman ng isa pang uri ng layer: **Batch Normalization**. Ang ideya ng batch normalization ay dalhin ang mga values na dumadaloy sa neural network sa tamang saklaw. Karaniwang pinakamahusay ang neural networks kapag lahat ng values ay nasa saklaw na [-1,1] o [0,1], at iyon ang dahilan kung bakit sinusukat/nino-normalize natin ang ating input data nang naaayon. Gayunpaman, sa panahon ng training ng isang malalim na network, maaari mangyari na ang mga values ay lumabas nang malaki sa saklaw na ito, na nagiging problema sa training. Ang batch normalization layer ay kinukwenta ang average at standard deviation para sa lahat ng values ng kasalukuyang minibatch, at ginagamit ito upang i-normalize ang signal bago ito ipasa sa isang neural network layer. Ito ay lubos na nagpapabuti sa katatagan ng mga malalim na network.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Pangunahing Punto\n", + "## Pangunahing Aral\n", "\n", - "Gamit ang transfer learning, nagawa nating mabilis na makabuo ng isang classifier para sa ating custom na gawain sa object classification, at nakamit ang mataas na accuracy. Gayunpaman, hindi ganap na patas ang halimbawang ito, dahil ang orihinal na VGG-16 network ay pre-trained na upang makilala ang mga pusa at aso, kaya't karamihan sa mga pattern na ginamit natin ay dati nang nasa network. Maaari mong asahan ang mas mababang accuracy sa mas kakaibang mga domain-specific na bagay, tulad ng mga detalye sa production line sa isang planta, o iba't ibang dahon ng puno.\n", + "Sa paggamit ng transfer learning, nagawa naming mabilis na makabuo ng isang classifier para sa aming pasadyang gawain sa klasipikasyon ng bagay, at makamit ang mataas na katumpakan. Gayunpaman, ang halimbawa na ito ay hindi ganap na patas, dahil ang orihinal na VGG-16 network ay naunang sinanay upang kilalanin ang mga pusa at aso, kaya't nire-reuse lang namin ang karamihan sa mga pattern na naroroon na sa network. Maaari mong asahan ang mas mababang katumpakan sa mas kakaibang espesipikong mga bagay, tulad ng mga detalye sa linya ng produksyon sa isang planta, o sa iba't ibang mga dahon ng puno.\n", "\n", - "Makikita mo na ang mas komplikadong mga gawain na sinusubukan nating lutasin ngayon ay nangangailangan ng mas mataas na computational power, at hindi madaling malutas gamit lamang ang CPU. Sa susunod na unit, susubukan nating gumamit ng mas magaan na implementasyon upang sanayin ang parehong modelo gamit ang mas mababang compute resources, na magreresulta sa bahagyang mas mababang accuracy.\n" + "Makikita mo na ang mas kumplikadong mga gawain na kasalukuyang tinutugunan natin ay nangangailangan ng mas mataas na kapangyarihan sa kompyutasyon, at hindi madaling malutas sa CPU. Sa susunod na yunit, susubukan naming gumamit ng mas magaan na implementasyon upang sanayin ang parehong modelo gamit ang mas mababang mga mapagkukunan sa kompyutasyon, na nagreresulta lamang sa bahagyang mas mababang katumpakan.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**Paunawa**: \nAng dokumentong ito ay isinalin gamit ang AI translation service na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't sinisikap naming maging tumpak, pakitandaan na ang mga awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa kanyang katutubong wika ang dapat ituring na opisyal na sanggunian. Para sa mahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang hindi pagkakaunawaan o maling interpretasyon na maaaring magmula sa paggamit ng pagsasaling ito.\n" + "---\n\n\n**Pagtatanggi**:\nAng dokumentong ito ay isinalin gamit ang serbisyo ng AI translation na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't nagsusumikap kami para sa katumpakan, pakatandaan na ang awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa orihinal nitong wika ang dapat ituring na pangunahing sanggunian. Para sa mahahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang maling pagkakaintindi o maling interpretasyon na nagmula sa paggamit ng pagsasaling ito.\n\n" ] } ], @@ -1482,12 +1495,6 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" - }, - "coopTranslator": { - "original_hash": "c189abc107848f96051085cc30945129", - "translation_date": "2025-08-28T03:11:20+00:00", - "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", - "language_code": "tl" } }, "nbformat": 4, diff --git a/translations/tl/lessons/5-NLP/README.md b/translations/tl/lessons/5-NLP/README.md index ce80ac6f7f..310e11bfad 100644 --- a/translations/tl/lessons/5-NLP/README.md +++ b/translations/tl/lessons/5-NLP/README.md @@ -1,34 +1,34 @@ -# Natural Language Processing +# Pagproseso ng Likas na Wika ![Buod ng mga gawain sa NLP sa isang doodle](../../../../translated_images/tl/ai-nlp.b22dcb8ca4707cea.webp) -Sa seksyong ito, magtutuon tayo sa paggamit ng Neural Networks upang harapin ang mga gawain na may kaugnayan sa **Natural Language Processing (NLP)**. Maraming mga problema sa NLP na nais nating masolusyunan ng mga computer: +Sa seksyong ito, magtutuon tayo sa paggamit ng Neural Networks upang hawakan ang mga gawain na may kaugnayan sa **Pagproseso ng Likas na Wika (NLP)**. Maraming mga suliranin sa NLP na nais nating kaya ng mga computer na lutasin: -* **Text classification** ay isang karaniwang problema ng klasipikasyon na may kinalaman sa mga text sequence. Halimbawa nito ay ang pag-uuri ng mga e-mail bilang spam o hindi-spam, o ang pag-kategorya ng mga artikulo bilang sports, negosyo, politika, atbp. Gayundin, kapag gumagawa ng chat bots, madalas nating kailangang maunawaan kung ano ang nais sabihin ng isang user -- sa kasong ito, tinutukoy natin ang **intent classification**. Kadalasan, sa intent classification, kailangang harapin ang maraming kategorya. -* **Sentiment analysis** ay isang karaniwang problema ng regression, kung saan kailangan nating magtalaga ng numero (isang damdamin) na tumutukoy kung gaano ka-positibo/negatibo ang kahulugan ng isang pangungusap. Isang mas advanced na bersyon ng sentiment analysis ay ang **aspect-based sentiment analysis** (ABSA), kung saan itinatakda ang damdamin hindi sa buong pangungusap, kundi sa iba't ibang bahagi nito (mga aspeto), halimbawa: *Sa restawran na ito, nagustuhan ko ang pagkain, ngunit ang atmospera ay kakila-kilabot*. -* **Named Entity Recognition** (NER) ay tumutukoy sa problema ng pagkuha ng ilang mga entidad mula sa teksto. Halimbawa, maaaring kailangan nating maunawaan na sa pariralang *Kailangan kong lumipad papuntang Paris bukas* ang salitang *bukas* ay tumutukoy sa DATE, at ang *Paris* ay isang LOCATION. -* **Keyword extraction** ay katulad ng NER, ngunit kailangan nating awtomatikong kunin ang mga salitang mahalaga sa kahulugan ng pangungusap, nang hindi pre-training para sa mga partikular na uri ng entidad. -* **Text clustering** ay maaaring maging kapaki-pakinabang kapag nais nating pagsama-samahin ang mga magkatulad na pangungusap, halimbawa, mga magkatulad na kahilingan sa mga teknikal na suporta. -* **Question answering** ay tumutukoy sa kakayahan ng isang modelo na sagutin ang isang partikular na tanong. Ang modelo ay tumatanggap ng isang text passage at isang tanong bilang input, at kailangang magbigay ng lugar sa teksto kung saan matatagpuan ang sagot sa tanong (o, minsan, bumuo ng sagot na teksto). -* **Text Generation** ay ang kakayahan ng isang modelo na bumuo ng bagong teksto. Maaari itong ituring bilang isang problema ng klasipikasyon na hinuhulaan ang susunod na letra/salita batay sa isang *text prompt*. Ang mga advanced na modelo ng text generation, tulad ng GPT-3, ay kayang lutasin ang iba pang mga gawain sa NLP tulad ng klasipikasyon gamit ang isang teknik na tinatawag na [prompt programming](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) o [prompt engineering](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29). -* **Text summarization** ay isang teknik kung saan nais nating "basahin" ng computer ang mahabang teksto at ibuod ito sa ilang pangungusap. -* **Machine translation** ay maaaring tingnan bilang kombinasyon ng pag-unawa sa teksto sa isang wika, at pagbuo ng teksto sa isa pang wika. +* **Pagsusuri ng teksto** ay isang karaniwang problema sa klasipikasyon na may kaugnayan sa mga sekwensya ng teksto. Halimbawa nito ay ang pagklasipika ng mga mensahe sa e-mail bilang spam vs. hindi spam, o pag-uuri ng mga artikulo bilang sports, negosyo, politika, atbp. Kapag nagde-develop ng mga chat bots, madalas kailangan nating maunawaan kung ano ang nais sabihin ng gumagamit -- sa kasong ito ay tinutukoy natin ang **klasipikasyon ng intensyon**. Madalas, sa klasipikasyon ng intensyon kailangan nating harapin ang maraming kategorya. +* **Pagsusuri ng damdamin** ay isang karaniwang problema sa regresyon, kung saan kailangan nating bigyan ng numero (isang damdamin) na tumutukoy kung gaano positibo/negatibo ang kahulugan ng isang pangungusap. Ang mas advanced na bersyon ng pagsusuri ng damdamin ay ang **aspect-based sentiment analysis** (ABSA), kung saan hindi natin binibigyan ng damdamin ang buong pangungusap, kundi ang iba't ibang bahagi nito (mga aspekto), hal. *Sa restawran na ito, nagustuhan ko ang pagkain, pero ang atmospera ay kakila-kilabot*. +* **Pagkilala sa Pangalan na Entidad** (NER) ay tumutukoy sa suliranin ng pagkuha ng ilang mga entidad mula sa teksto. Halimbawa, kailangan nating maunawaan na sa pariralang *Kailangan kong lumipad papuntang Paris bukas* ang salitang *bukas* ay tumutukoy sa PETSA, at ang *Paris* ay isang LUGAR. +* **Pagkuha ng mga pangunahing salita** ay kahawig ng NER, ngunit kailangan nating awtomatikong kunin ang mga salitang mahalaga sa kahulugan ng pangungusap, nang walang paunang pagsasanay para sa tiyak na mga uri ng entidad. +* **Pagpangkat-pangkat ng teksto** ay maaaring maging kapaki-pakinabang kapag nais nating pagsamahin ang mga magkatulad na pangungusap, halimbawa, mga magkatulad na kahilingan sa mga usapan sa suporta sa teknikal. +* **Pagsagot sa mga tanong** ay tumutukoy sa kakayahan ng isang modelo na sagutin ang isang partikular na tanong. Tumatanggap ang modelo ng isang teksto at isang tanong bilang mga input, at kailangan nitong ibigay ang lugar sa teksto kung saan nakapaloob ang sagot sa tanong (o, minsan, lumikha ng sagot na teksto). +* **Pagbuo ng Teksto** ay ang kakayahan ng isang modelo na bumuo ng bagong teksto. Maaari itong ituring bilang isang gawain sa klasipikasyon na nagpapredict ng susunod na titik/salita base sa ilang *text prompt*. Ang mga advanced na modelo ng pagbuo ng teksto, tulad ng GPT-3, ay kaya ring lutasin ang ibang mga gawain sa NLP tulad ng klasipikasyon gamit ang teknik na tinatawag na [prompt programming](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) o [prompt engineering](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29) +* **Pagbubuod ng teksto** ay isang teknik kung kailan nais nating ang computer na "basahin" ang mahabang teksto at ibuod ito sa ilang pangungusap. +* **Pagsasalin ng makina** ay maaaring tingnan bilang kumbinasyon ng pag-unawa sa teksto sa isang wika, at pagbuo ng teksto sa ibang wika. -Noong una, karamihan sa mga gawain sa NLP ay nalulutas gamit ang mga tradisyunal na pamamaraan tulad ng mga grammar. Halimbawa, sa machine translation, ginagamit ang mga parser upang gawing syntax tree ang orihinal na pangungusap, pagkatapos ay kinukuha ang mas mataas na antas ng mga semantikong istruktura upang kumatawan sa kahulugan ng pangungusap, at batay sa kahulugang ito at grammar ng target na wika, nabubuo ang resulta. Sa kasalukuyan, maraming gawain sa NLP ang mas epektibong nalulutas gamit ang neural networks. +Noong una, karamihan sa mga gawain sa NLP ay nilulutas gamit ang mga tradisyunal na pamamaraan gaya ng gramatika. Halimbawa, sa pagsasalin ng makina ginagamit ang mga parser upang i-transform ang unang pangungusap sa isang syntax tree, pagkatapos ay ini-extract ang mga mas mataas na antas ng semantikong istruktura upang kumatawan sa kahulugan ng pangungusap, at base sa kahulugang ito at sa gramatika ng target na wika, ginagawa ang resulta. Ngayon, marami nang mga gawain sa NLP ang mas epektibong nalulutas gamit ang mga neural networks. -> Maraming mga klasikong pamamaraan sa NLP ang naipatupad sa [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org) Python library. Mayroong mahusay na [NLTK Book](https://www.nltk.org/book/) na makukuha online na tumatalakay kung paano malulutas ang iba't ibang gawain sa NLP gamit ang NLTK. +> Maraming klasikal na pamamaraan ng NLP ang ipinatupad sa [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org) na Python library. Mayroong mahusay na [NLTK Book](https://www.nltk.org/book/) na libre at online na nagpapakita kung paano malulutas ang iba't ibang gawain sa NLP gamit ang NLTK. -Sa ating kurso, magtutuon tayo sa paggamit ng Neural Networks para sa NLP, at gagamitin ang NLTK kung kinakailangan. +Sa aming kurso, karamihan ay magtutuon kami sa paggamit ng Neural Networks para sa NLP, at gagamit kami ng NLTK kung kinakailangan. -Natuto na tayo tungkol sa paggamit ng neural networks para sa pagproseso ng tabular data at mga imahe. Ang pangunahing pagkakaiba sa pagitan ng mga uri ng data na iyon at ng teksto ay ang teksto ay isang sequence na may variable na haba, habang ang laki ng input sa kaso ng mga imahe ay alam na sa simula pa lang. Habang ang convolutional networks ay kayang kumuha ng mga pattern mula sa input data, ang mga pattern sa teksto ay mas kumplikado. Halimbawa, maaaring may negasyon na hiwalay sa paksa ng maraming salita (hal. *Hindi ko gusto ang mga dalandan*, kumpara sa *Hindi ko gusto ang mga malalaki, makukulay, at masarap na dalandan*), at dapat pa rin itong ma-interpret bilang isang pattern. Kaya, upang ma-handle ang wika, kailangan nating magpakilala ng mga bagong uri ng neural network, tulad ng *recurrent networks* at *transformers*. +Natutunan na natin ang paggamit ng neural networks para sa paghawak ng mga tabular na datos at mga imahe. Ang pangunahing pagkakaiba sa pagitan ng mga uri ng datos na iyon at teksto ay ang teksto ay isang sekwensya na may pabago-bagong haba, samantalang ang sukat ng input sa kaso ng mga imahe ay alam na agad. Habang kayang mag-extract ng mga pattern mula sa input data ang mga convolutional network, mas kumplikado ang mga pattern sa teksto. Halimbawa, maaaring malayo sa paksa ang negation kahit ilang salita ang pagitan nito (hal. *Hindi ko gusto ang mga orange*, vs. *Hindi ko gusto ang mga malalaki, makukulay, at masarap na orange*), at ito ay dapat ituring pa rin bilang isang pattern. Kaya, upang hawakan ang wika, kailangan nating ipakilala ang mga bagong uri ng neural network, gaya ng *recurrent networks* at *transformers*. -## Pag-install ng mga Library +## Mag-install ng mga Library -Kung gumagamit ka ng lokal na Python installation para patakbuhin ang kursong ito, maaaring kailangan mong i-install ang lahat ng kinakailangang library para sa NLP gamit ang mga sumusunod na command: +Kung gumagamit ka ng lokal na Python na pag-install para patakbuhin ang kursong ito, maaaring kailanganin mong i-install ang lahat ng kinakailangang mga library para sa NLP gamit ang mga sumusunod na utos: **Para sa PyTorch** ```bash -pip install -r requirements-torch.txt +pip install -r requirements-pytorch.txt ``` **Para sa TensorFlow** ```bash @@ -39,13 +39,13 @@ pip install -r requirements-tf.txt ## Babala sa GPU -Sa seksyong ito, sa ilang mga halimbawa ay magte-train tayo ng medyo malalaking modelo. -* **Gumamit ng Computer na May GPU**: Inirerekomenda na patakbuhin ang iyong mga notebook sa isang computer na may GPU upang mabawasan ang oras ng paghihintay kapag nagtatrabaho sa malalaking modelo. -* **Mga Limitasyon sa GPU Memory**: Ang paggamit ng GPU ay maaaring magdulot ng mga sitwasyon kung saan nauubusan ka ng GPU memory, lalo na kapag nagtetrain ng malalaking modelo. -* **Konsumo ng GPU Memory**: Ang dami ng GPU memory na nagagamit sa panahon ng training ay nakadepende sa iba't ibang salik, kabilang ang laki ng minibatch. -* **Bawasan ang Laki ng Minibatch**: Kung makakaranas ka ng mga isyu sa GPU memory, isaalang-alang ang pagbabawas ng laki ng minibatch sa iyong code bilang posibleng solusyon. -* **Paglabas ng GPU Memory sa TensorFlow**: Ang mga mas lumang bersyon ng TensorFlow ay maaaring hindi maglabas ng GPU memory nang tama kapag nagtetrain ng maraming modelo sa loob ng isang Python kernel. Upang epektibong pamahalaan ang paggamit ng GPU memory, maaari mong i-configure ang TensorFlow upang maglaan lamang ng GPU memory kung kinakailangan. -* **Pagdaragdag ng Code**: Upang itakda ang TensorFlow na palakihin ang GPU memory allocation lamang kung kinakailangan, idagdag ang sumusunod na code sa iyong mga notebook: +Sa seksyong ito, sa ilang mga halimbawa ay magta-train tayo ng medyo malalaking modelo. +* **Gumamit ng Computer na may GPU**: Inirerekomenda na patakbuhin ang iyong mga notebook sa computer na may GPU upang mabawasan ang paghihintay kapag nagtatrabaho sa malalaking modelo. +* **Mga Limitasyon sa GPU Memory**: Ang pagpapatakbo sa GPU ay maaaring magdulot ng kakulangan sa GPU memory, lalo na kapag nagtatrabaho sa malalaking modelo. +* **Pagkonsumo ng GPU Memory**: Ang dami ng GPU memory na nagagamit habang nagtatrabaho ay depende sa iba't ibang salik, kabilang ang laki ng minibatch. +* **Bawasan ang Laki ng Minibatch**: Kung makakaranas ka ng mga isyu sa GPU memory, subukang bawasan ang laki ng minibatch sa iyong code bilang posibleng solusyon. +* **Pagpapalabas ng TensorFlow GPU Memory**: Ang mga mas lumang bersyon ng TensorFlow ay maaaring hindi maayos na maglabas ng GPU memory kapag nagtatrabaho sa maraming modelo sa loob ng isang Python kernel. Upang maayos na pamahalaan ang paggamit ng GPU memory, maaari mong i-configure ang TensorFlow upang maglaan lamang ng GPU memory kung kinakailangan. +* **Pagsasama ng Code**: Para maiset ang TensorFlow na unti-unting dagdagan lamang ang alokasyon ng GPU memory kung kinakailangan, isama ang sumusunod na code sa iyong mga notebook: ```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) ``` -Kung interesado kang matuto tungkol sa NLP mula sa klasikong ML na perspektibo, bisitahin ang [suite ng mga araling ito](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP) +Kung interesado kang matuto tungkol sa NLP mula sa klasikal na pananaw ng ML, bisitahin ang [suite ng mga leksyon na ito](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP) ## Sa Seksiyong Ito -Sa seksyong ito, matututo tayo tungkol sa: +Sa seksyong ito ay matututuhan natin ang tungkol sa: -* [Pagre-representa ng teksto bilang tensors](13-TextRep/README.md) -* [Word Embeddings](14-Emdeddings/README.md) -* [Language Modeling](15-LanguageModeling/README.md) -* [Recurrent Neural Networks](16-RNN/README.md) -* [Generative Networks](17-GenerativeNetworks/README.md) -* [Transformers](18-Transformers/README.md) +* [Pagre-representa ng teksto bilang mga tensor](13-TextRep/README.md) +* [Mga Word Embeddings](14-Emdeddings/README.md) +* [Pagmomodelo ng Wika](15-LanguageModeling/README.md) +* [Mga Recurrent Neural Network](16-RNN/README.md) +* [Mga Generative Network](17-GenerativeNetworks/README.md) +* [Mga Transformer](18-Transformers/README.md) --- -**Paunawa**: -Ang dokumentong ito ay isinalin gamit ang AI translation service na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't sinisikap naming maging tumpak, tandaan na ang mga awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa kanyang katutubong wika ang dapat ituring na opisyal na sanggunian. Para sa mahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang hindi pagkakaunawaan o maling interpretasyon na maaaring magmula sa paggamit ng pagsasaling ito. \ No newline at end of file + +**Pagtatanggi**: +Ang dokumentong ito ay isinalin gamit ang serbisyo ng AI translation na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't nagsusumikap kami para sa katumpakan, pakatandaan na ang awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa orihinal nitong wika ang dapat ituring na pangunahing sanggunian. Para sa mahahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang maling pagkakaintindi o maling interpretasyon na nagmula sa paggamit ng pagsasaling ito. + \ No newline at end of file diff --git a/translations/tl/lessons/sketchnotes/LICENSE.md b/translations/tl/lessons/sketchnotes/LICENSE.md index 49a306d707..e4d0696216 100644 --- a/translations/tl/lessons/sketchnotes/LICENSE.md +++ b/translations/tl/lessons/sketchnotes/LICENSE.md @@ -2,117 +2,437 @@ Attribution-ShareAlike 4.0 International ======================================================================= -Ang Creative Commons Corporation ("Creative Commons") ay hindi isang law firm at hindi nagbibigay ng legal na serbisyo o payo. Ang pamamahagi ng mga pampublikong lisensya ng Creative Commons ay hindi lumilikha ng relasyon sa pagitan ng abogado at kliyente o anumang iba pang relasyon. Ginagawa ng Creative Commons na magagamit ang mga lisensya nito at kaugnay na impormasyon sa isang "as-is" na batayan. Walang garantiya ang Creative Commons tungkol sa mga lisensya nito, anumang materyal na lisensyado sa ilalim ng kanilang mga tuntunin at kundisyon, o anumang kaugnay na impormasyon. Tinatanggihan ng Creative Commons ang lahat ng pananagutan para sa mga pinsalang dulot ng paggamit ng mga ito sa pinakamalawak na saklaw na posible. - -Paggamit ng mga Pampublikong Lisensya ng Creative Commons - -Ang mga pampublikong lisensya ng Creative Commons ay nagbibigay ng karaniwang hanay ng mga tuntunin at kundisyon na maaaring gamitin ng mga tagalikha at iba pang may hawak ng karapatan upang ibahagi ang mga orihinal na gawa ng may-akda at iba pang materyal na sakop ng copyright at ilang iba pang karapatan na tinukoy sa pampublikong lisensya sa ibaba. Ang mga sumusunod na konsiderasyon ay para lamang sa layuning pang-impormasyon, hindi kumpleto, at hindi bahagi ng aming mga lisensya. - - Mga konsiderasyon para sa mga tagapaglisensya: Ang aming mga pampublikong lisensya ay nilalayon para sa paggamit ng mga may awtoridad na magbigay ng pahintulot sa publiko na gamitin ang materyal sa mga paraang kung hindi man ay pinaghihigpitan ng copyright at ilang iba pang karapatan. Ang aming mga lisensya ay hindi mababawi. Dapat basahin at unawain ng mga tagapaglisensya ang mga tuntunin at kundisyon ng lisensyang kanilang pinili bago ito ilapat. Dapat din nilang tiyakin ang lahat ng kinakailangang karapatan bago ilapat ang aming mga lisensya upang magamit ng publiko ang materyal ayon sa inaasahan. Dapat malinaw na markahan ng mga tagapaglisensya ang anumang materyal na hindi sakop ng lisensya. Kasama rito ang iba pang materyal na lisensyado ng CC, o materyal na ginamit sa ilalim ng isang eksepsyon o limitasyon sa copyright. Higit pang mga konsiderasyon para sa mga tagapaglisensya: +Ang Creative Commons Corporation ("Creative Commons") ay hindi isang firmang legal at +hindi nagbibigay ng mga serbisyong legal o payong legal. Ang pamamahagi ng +mga pampublikong lisensya ng Creative Commons ay hindi lumilikha ng relasyon sa pagitan ng abogado at kliyente o +iba pang relasyon. Ginagawa ng Creative Commons ang mga lisensya nito at kaugnay na +impormasyon na available sa "as-is" na kondisyon. Walang ibinibigay na +garantiya ang Creative Commons tungkol sa mga lisensya nito, anumang materyal na lisensyado sa ilalim ng kanilang +mga termino at kundisyon, o anumang kaugnay na impormasyon. Tinatanggihan ng Creative Commons +ang lahat ng pananagutan para sa mga pinsala na nagreresulta mula sa paggamit ng mga ito sa pinaka-malawak na posibleng lawak. + + +Paggamit ng Creative Commons Public Licenses + +Ang mga pampublikong lisensya ng Creative Commons ay nagbibigay ng isang standard na set ng mga termino at +kundisyon na maaaring gamitin ng mga tagalikha at iba pang may hawak ng karapatan upang ibahagi +ang orihinal na mga gawa ng pagsulat at iba pang materyal na sakop ng copyright +at ilang iba pang mga karapatan na tinukoy sa pampublikong lisensya sa ibaba. Ang +mga sumusunod na konsiderasyon ay para lamang sa layuning pang-impormasyon, hindi +kompleto, at hindi bahagi ng aming mga lisensya. + + Mga konsiderasyon para sa mga nagbibigay ng lisensya: Ang aming mga pampublikong lisensya ay + nilalayong gamitin ng mga awtorisadong magbigay sa publiko ng + pahintulot upang gamitin ang materyal sa mga paraang karaniwang ipinagbabawal ng + copyright at ilang ibang karapatan. Ang aming mga lisensya ay + hindi na mababawi. Dapat basahin at unawain ng mga nagbigay ng lisensya ang mga termino + at kundisyon ng lisensya na kanilang pipiliin bago ito ilapat. + Dapat ding tiyakin ng mga nagbigay ng lisensya na makuha nila ang lahat ng kinakailangang karapatan bago + ilapat ang aming mga lisensya upang ang publiko ay maaaring muling gamitin ang + materyal ayon sa inaasahan. Dapat malinaw na markahan ng mga nagbigay ng lisensya ang anumang + materyal na hindi sakop ng lisensya. Kabilang dito ang iba pang mga materyal na may lisensya mula sa CC, + o materyal na ginamit sa ilalim ng isang eksepsyon o + limitasyon sa copyright. Karagdagang mga konsiderasyon para sa mga nagbigay ng lisensya: wiki.creativecommons.org/Considerations_for_licensors - Mga konsiderasyon para sa publiko: Sa paggamit ng isa sa aming mga pampublikong lisensya, binibigyan ng tagapaglisensya ang publiko ng pahintulot na gamitin ang lisensyadong materyal sa ilalim ng mga tinukoy na tuntunin at kundisyon. Kung ang pahintulot ng tagapaglisensya ay hindi kinakailangan para sa anumang dahilan—halimbawa, dahil sa anumang naaangkop na eksepsyon o limitasyon sa copyright—ang paggamit na iyon ay hindi sakop ng lisensya. Ang aming mga lisensya ay nagbibigay lamang ng mga pahintulot sa ilalim ng copyright at ilang iba pang karapatan na may awtoridad ang tagapaglisensya na ipagkaloob. Ang paggamit ng lisensyadong materyal ay maaari pa ring mapigilan dahil sa iba pang mga dahilan, kabilang ang dahil sa may hawak ng copyright o iba pang karapatan sa materyal. Maaaring magbigay ang isang tagapaglisensya ng mga espesyal na kahilingan, tulad ng pagmamarka o paglalarawan ng lahat ng pagbabago. Bagama't hindi kinakailangan ng aming mga lisensya, hinihikayat kang igalang ang mga kahilingang iyon kung makatwiran. Higit pang mga konsiderasyon para sa publiko: + Mga konsiderasyon para sa publiko: Sa paggamit ng isa sa aming mga pampublikong + lisensya, nagbibigay ang nagbigay ng lisensya ng pahintulot sa publiko na gamitin ang + lisensyadong materyal sa ilalim ng tinukoy na mga termino at kundisyon. Kung + ang pahintulot ng nagbigay ng lisensya ay hindi kailangan para sa anumang dahilan--halimbawa, + dahil sa anumang naaangkop na eksepsyon o limitasyon sa + copyright--hindi nasasaklawan ng lisensya ang paggamit na iyon. Ang aming mga + lisensya ay nagbigay lamang ng mga pahintulot sa ilalim ng copyright at ilang + iba pang mga karapatan na may awtoridad ang nagbigay ng lisensya na ipagkaloob. + Ang paggamit ng lisensyadong materyal ay maaaring pa ring limitado dahil sa + iba pang mga dahilan, kabilang ang pagkakaroon ng ibang tao ng copyright o iba pang + karapatan sa materyal na iyon. Maaaring magkaroon ng mga espesyal na kahilingan ang nagbigay ng lisensya, + tulad ng paghingi na lahat ng pagbabago ay markahan o ilarawan. + Bagamat hindi kinakailangan sa aming mga lisensya, hinihikayat ka naming + respetuhin ang mga kahilingang iyon kung makatwiran. Karagdagang_konsiderasyon + para sa publiko: wiki.creativecommons.org/Considerations_for_licensees ======================================================================= -Creative Commons Attribution-ShareAlike 4.0 International Public License +Creative Commons Attribution-ShareAlike 4.0 International Public +License + +Sa pamamagitan ng paggamit ng mga Lisensyadong Karapatan (na tinukoy sa ibaba), Tinatanggap mo at sumasang-ayon +kang masunod ang mga termino at kundisyon ng Creative Commons na ito +Attribution-ShareAlike 4.0 International Public License ("Pampublikong +Lisensya"). Kung ang Pampublikong Lisensya na ito ay maaari ngang bigyan-kahulugan bilang isang +kontrata, ipinagkakaloob sa iyo ang mga Lisensyadong Karapatan bilang kapalit ng iyong +pagtanggap sa mga termini at kundisyong ito, at ang Nagbigay ng Lisensya ay pinagkakalooban ka ng +ganoong mga karapatan bilang kapalit ng mga benepisyo na natatanggap ng Nagbigay ng Lisensya mula +sa pagbibigay ng Lisensyadong Materyal sa ilalim ng mga terminong ito at mga +kundisyon. -Sa paggamit ng Lisensyadong Karapatan (na tinukoy sa ibaba), Tinatanggap Mo at sumasang-ayon Kang sumunod sa mga tuntunin at kundisyon ng Creative Commons Attribution-ShareAlike 4.0 International Public License ("Pampublikong Lisensya"). Sa lawak na maaaring ipakahulugan ang Pampublikong Lisensyang ito bilang isang kontrata, Ikaw ay binibigyan ng Lisensyadong Karapatan bilang kapalit ng Iyong pagtanggap sa mga tuntunin at kundisyon na ito, at binibigyan Ka ng Tagapaglisensya ng mga karapatang iyon bilang kapalit ng mga benepisyong natatanggap ng Tagapaglisensya mula sa paggawa ng Lisensyadong Materyal na magagamit sa ilalim ng mga tuntunin at kundisyon na ito. Seksyon 1 -- Mga Depinisyon. - a. Ang Adapted Material ay tumutukoy sa materyal na sakop ng Copyright at Katulad na Karapatan na hinango mula o batay sa Lisensyadong Materyal at kung saan ang Lisensyadong Materyal ay isinalin, binago, inayos, binago, o kung hindi man ay inedit sa paraang nangangailangan ng pahintulot sa ilalim ng Copyright at Katulad na Karapatan na hawak ng Tagapaglisensya. Para sa layunin ng Pampublikong Lisensyang ito, kung ang Lisensyadong Materyal ay isang musikal na gawa, pagtatanghal, o pag-record ng tunog, ang Adapted Material ay palaging ginagawa kung ang Lisensyadong Materyal ay naka-synchronize sa tamang oras na may kaugnayan sa isang gumagalaw na imahe. + a. Ang Adapted Material ay tumutukoy sa materyal na saklaw ng Copyright at Mga Katulad na + Karapatan na nagmula o batay sa Lisensyadong Materyal + at kung saan ang Lisensyadong Materyal ay isinalin, binago, + inayos, inilipat, o kung hindi man binago sa paraang nangangailangan ng + pahintulot sa ilalim ng Copyright at Mga Katulad na Karapatang hawak ng + Nagbigay ng Lisensya. Para sa layunin ng Pampublikong Lisensyang ito, kung ang Lisensyadong + Materyal ay isang gawa sa musika, pagtatanghal, o recording ng tunog, + ang Adapted Material ay palaging nalilikha kapag ang Lisensyadong Materyal ay + isinakto sa timing kasama ng gumagalaw na imahe. - b. Ang Adapter's License ay tumutukoy sa lisensyang inilalapat Mo sa Iyong Copyright at Katulad na Karapatan sa Iyong mga kontribusyon sa Adapted Material alinsunod sa mga tuntunin at kundisyon ng Pampublikong Lisensyang ito. + b. Ang Adapter's License ay tumutukoy sa lisensya na iyong inilalapat sa iyong Copyright + at Mga Katulad na Karapatan sa iyong mga kontribusyon sa Adapted Material + alinsunod sa mga termino at kundisyon ng Pampublikong Lisensyang ito. - c. Ang BY-SA Compatible License ay tumutukoy sa lisensyang nakalista sa - creativecommons.org/compatiblelicenses, na inaprubahan ng Creative Commons bilang mahalagang katumbas ng Pampublikong Lisensyang ito. + c. Ang BY-SA Compatible License ay isang lisensya na nakalista sa + creativecommons.org/compatiblelicenses, na inaprobahan ng Creative + Commons bilang halos katumbas ng Pampublikong Lisensyang ito. - d. Ang Copyright at Katulad na Karapatan ay tumutukoy sa copyright at/o mga karapatang katulad ng copyright kabilang, ngunit hindi limitado sa, pagtatanghal, pag-broadcast, pag-record ng tunog, at Sui Generis Database Rights, anuman ang label o kategorya ng mga karapatan. Para sa layunin ng Pampublikong Lisensyang ito, ang mga karapatang tinukoy sa Seksyon 2(b)(1)-(2) ay hindi sakop ng Copyright at Katulad na Karapatan. + d. Ang Copyright at Mga Katulad na Karapatan ay tumutukoy sa copyright at/o mga karapatang + malapit na kaugnay ng copyright kabilang, ngunit hindi limitado sa, + pagtatanghal, pagbroadcast, recording ng tunog, at mga Sui Generis Database + Karapatan, nang walang pagsasaalang-alang kung paano tinatawag o + kinategorya ang mga karapatan. Para sa layunin ng Pampublikong Lisensyang ito, ang mga karapatan + na tinukoy sa Seksyon 2(b)(1)-(2) ay hindi Copyright at Mga Katulad na + Karapatan. - e. Ang Effective Technological Measures ay tumutukoy sa mga hakbang na, sa kawalan ng wastong awtoridad, ay hindi maaaring lampasan sa ilalim ng mga batas na tumutupad sa mga obligasyon sa ilalim ng Artikulo 11 ng WIPO Copyright Treaty na pinagtibay noong Disyembre 20, 1996, at/o mga katulad na internasyonal na kasunduan. + e. Ang Effective Technological Measures ay tumutukoy sa mga hakbang na, sa + kawalan ng wastong awtoridad, ay hindi maaaring lusutan alinsunod sa mga batas + na nagtatakda ng obligasyon sa ilalim ng Artikulo 11 ng WIPO Copyright + Treaty na inaprobahan noong Disyembre 20, 1996, at/o mga katulad na + pandaigdigang kasunduan. - f. Ang Exceptions and Limitations ay tumutukoy sa patas na paggamit, patas na pakikitungo, at/o anumang iba pang eksepsyon o limitasyon sa Copyright at Katulad na Karapatan na naaangkop sa Iyong paggamit ng Lisensyadong Materyal. + f. Ang Exceptions and Limitations ay tumutukoy sa fair use, fair dealing, at/o + anumang iba pang eksepsyon o limitasyon sa Copyright at Mga Katulad na Karapatan + na nalalapat sa iyong paggamit ng Lisensyadong Materyal. - g. Ang License Elements ay tumutukoy sa mga katangian ng lisensya na nakalista sa pangalan ng isang Pampublikong Lisensya ng Creative Commons. Ang mga Elemento ng Lisensya ng Pampublikong Lisensyang ito ay Attribution at ShareAlike. + g. License Elements ay tumutukoy sa mga attribute ng lisensya na nakalista sa pangalan + ng isang Creative Commons Public License. Ang mga License Elements ng + Pampublikong Lisensyang ito ay Attribution at ShareAlike. - h. Ang Licensed Material ay tumutukoy sa artistikong o pampanitikang gawa, database, o iba pang materyal kung saan inilapat ng Tagapaglisensya ang Pampublikong Lisensyang ito. + h. Ang Lisensyadong Materyal ay tumutukoy sa artistiko o panitikan na gawa, database, + o iba pang materyal kung saan inilapat ng Nagbigay ng Lisensya ang Pampublikong + Lisensyang ito. - i. Ang Licensed Rights ay tumutukoy sa mga karapatang ipinagkaloob sa Iyo na sakop ng mga tuntunin at kundisyon ng Pampublikong Lisensyang ito, na limitado sa lahat ng Copyright at Katulad na Karapatan na naaangkop sa Iyong paggamit ng Lisensyadong Materyal at na may awtoridad ang Tagapaglisensya na lisensyahan. + i. Ang Lisensyadong Karapatan ay tumutukoy sa mga karapatang ipinagkaloob sa iyo alinsunod sa + mga termino at kundisyon ng Pampublikong Lisensyang ito, na limitado sa + lahat ng Copyright at Mga Katulad na Karapatan na nalalapat sa iyong paggamit ng + Lisensyadong Materyal at na may awtoridad ang Nagbigay ng Lisensya na ipagkaloob. - j. Ang Licensor ay tumutukoy sa indibidwal o entidad na nagbibigay ng mga karapatan sa ilalim ng Pampublikong Lisensyang ito. + j. Ang Nagbigay ng Lisensya ay tumutukoy sa mga indibidwal o entidad na nagbibigay ng mga karapatan + sa ilalim ng Pampublikong Lisensyang ito. - k. Ang Share ay tumutukoy sa pagbibigay ng materyal sa publiko sa anumang paraan o proseso na nangangailangan ng pahintulot sa ilalim ng Lisensyadong Karapatan, tulad ng reproduksyon, pampublikong pagpapakita, pampublikong pagtatanghal, pamamahagi, pagpapalaganap, komunikasyon, o pag-import, at paggawa ng materyal na magagamit sa publiko kabilang ang sa mga paraang maaaring ma-access ng mga miyembro ng publiko ang materyal mula sa isang lugar at sa oras na indibidwal nilang pinili. + k. Ang Share ay tumutukoy sa pagbibigay ng materyal sa publiko sa anumang paraan o + proseso na nangangailangan ng pahintulot sa ilalim ng mga Lisensyadong Karapatan, tulad ng + reproduksyon, pampublikong pagpapakita, pampublikong pagtatanghal, pamamahagi, + pagkalat, komunikasyon, o pag-angkat, at paggawa ng materyal na + available sa publiko kabilang ang paraang maaaring ma-access ng mga miyembro ng + publiko ang materyal mula sa isang lugar at sa isang oras na + pinili nila nang paisa-isa. - l. Ang Sui Generis Database Rights ay tumutukoy sa mga karapatan maliban sa copyright na nagmumula sa Directive 96/9/EC ng European Parliament at ng Council noong Marso 11, 1996 sa legal na proteksyon ng mga database, na binago at/o pinalitan, pati na rin ang iba pang mahalagang katumbas na karapatan saanman sa mundo. + l. Ang Sui Generis Database Rights ay tumutukoy sa mga karapatan bukod sa copyright + na nagreresulta mula sa Directive 96/9/EC ng European Parliament at ng + Council noong 11 Marso 1996 sa legal na proteksyon ng mga database, + na inamyendahan at/o pinalitan, pati na rin ang iba pang + halos katumbas na karapatan kahit saan sa mundo. - m. Ang You ay tumutukoy sa indibidwal o entidad na gumagamit ng Lisensyadong Karapatan sa ilalim ng Pampublikong Lisensyang ito. Ang Your ay may kaukulang kahulugan. + m. Ikaw ay tumutukoy sa indibidwal o entidad na gumagamit ng mga Lisensyadong Karapatan + sa ilalim ng Pampublikong Lisensyang ito. Ang iyong ay may kaukulang kahulugan. -Mga Karapatan, pagkatapos ang database kung saan mayroon kang Sui Generis Database Rights (ngunit hindi ang mga indibidwal na nilalaman nito) ay Adapted Material, +Seksyon 2 -- Saklaw. -kasama para sa mga layunin ng Seksyon 3(b); at -c. Dapat kang sumunod sa mga kundisyon sa Seksyon 3(a) kung ibabahagi mo ang lahat o isang malaking bahagi ng nilalaman ng database. -Para sa kalinawan, ang Seksyon 4 na ito ay nagdaragdag at hindi pumapalit sa iyong mga obligasyon sa ilalim ng Pampublikong Lisensyang ito kung saan ang Lisensyadong Mga Karapatan ay kinabibilangan ng iba pang Copyright at Katulad na Mga Karapatan. + a. Pagbibigay ng lisensya. ---- + 1. Alinsunod sa mga tuntunin at kundisyon ng Pampublikong Lisensyang ito, + ipinagkakaloob ng Nagbibigay ng Lisensya sa Iyo ang isang pandaigdigan, + walang-royalty, hindi maaaring ipasa sa iba, hindi-eksklusibo, at hindi na + maaaring bawiing lisensya upang maisakatuparan ang mga Lisensyadong Karapatan sa -Seksyon 5 -- Pagtanggi sa Mga Warranty at Limitasyon ng Pananagutan. -a. MALIBAN KUNG HIWALAY NA INILAHAD NG TAGAPAGLISENSYA, SA ABOT NG POSIBLE, INIHAHANDOG NG TAGAPAGLISENSYA ANG LISENSYADONG MATERYAL NA "AS-IS" AT "AS-AVAILABLE," AT WALANG ANUMANG REPRESENTASYON O WARRANTY TUNGKOL SA LISENSYADONG MATERYAL, KUNG ITO MAN AY HAYAG, IPINAHIWATIG, STATUTORY, O IBA PA. KASAMA DITO, WALANG LIMITASYON, ANG MGA WARRANTY NG TITULO, KAKAYAHANG MAIBENTA, ANGKOP PARA SA ISANG PARTIKULAR NA LAYUNIN, HINDI PAGLABAG, KAWALAN NG LATENT O IBA PANG DEPEKTO, KATUMPAKAN, O ANG PRESENSYA O KAWALAN NG MGA ERROR, KUNG ALAM O NATUKLASAN MAN. KUNG SAAN ANG MGA PAGTANGGI SA MGA WARRANTY AY HINDI PINAPAYAGAN NG BUO O BAHAGI, ANG PAGTANGGI NA ITO AY MAARING HINDI MAG-APLAY SA IYO. + a. kopyahin at Ibahagi ang Lisensyadong Materyal, buo man o -b. SA ABOT NG POSIBLE, SA ANUMANG PANGYAYARI, ANG TAGAPAGLISENSYA AY HINDI MANANAGOT SA IYO SA ANUMANG LEGAL NA TEORYA (KASAMA, WALANG LIMITASYON, ANG KAPABAYAAN) O IBA PA PARA SA ANUMANG DIREKTA, ESPESYAL, HINDI DIREKTA, INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLAR, O IBA PANG PAGKAWALA, GASTOS, GASTUSIN, O PINSALA NA NAGMULA SA PAMPUBLIKONG LISENSYANG ITO O PAGGAMIT NG LISENSYADONG MATERYAL, KAHIT NA ANG TAGAPAGLISENSYA AY NAABISUHAN TUNGKOL SA POSIBILIDAD NG GANITONG PAGKAWALA, GASTOS, GASTUSIN, O PINSALA. KUNG SAAN ANG LIMITASYON NG PANANAGUTAN AY HINDI PINAPAYAGAN NG BUO O BAHAGI, ANG LIMITASYON NA ITO AY MAARING HINDI MAG-APLAY SA IYO. -c. Ang pagtanggi sa mga warranty at limitasyon ng pananagutan na ibinigay sa itaas ay dapat ipakahulugan sa paraang, sa abot ng posibleng paraan, pinakamalapit na nagtatantya sa isang ganap na pagtanggi at pagwawaksi ng lahat ng pananagutan. ---- -Seksyon 6 -- Tagal at Pagwawakas. + 2. Mga Pagbubukod at Limitasyon. Upang maiwasan ang pagdududa, kung saan + naaangkop ang Mga Pagbubukod at Limitasyon sa Iyong paggamit, ang Pampublikong + Lisensyang ito ay hindi nalalapat, at hindi mo kailangang sumunod sa -a. Ang Pampublikong Lisensyang ito ay nalalapat sa tagal ng Copyright at Katulad na Mga Karapatan na lisensyado dito. Gayunpaman, kung hindi ka sumunod sa Pampublikong Lisensyang ito, ang iyong mga karapatan sa ilalim ng Pampublikong Lisensyang ito ay awtomatikong magwawakas. -b. Kung saan ang iyong karapatan na gamitin ang Lisensyadong Materyal ay natapos sa ilalim ng Seksyon 6(a), ito ay muling ibinabalik: + 3. Panahon. Ang panahon ng Pampublikong Lisensyang ito ay tinutukoy sa Seksyon -1. awtomatiko mula sa petsa ng pagwawasto ng paglabag, basta't ito ay naitama sa loob ng 30 araw mula sa iyong pagkakatuklas ng paglabag; o -2. sa pamamagitan ng hayagang muling pagbibigay ng karapatan ng Tagapaglisensya. -Para sa kalinawan, ang Seksyon 6(b) na ito ay hindi nakakaapekto sa anumang karapatan ng Tagapaglisensya na maghanap ng remedyo para sa iyong mga paglabag sa Pampublikong Lisensyang ito. + 4. Mga media at format; pinapayagan ang teknikal na mga pagbabago. Pinahihintulutan + ng Nagbibigay ng Lisensya na gamitin Mo ang mga Lisensyadong Karapatan sa + lahat ng media at format maging ang mga kilala na o gagawin pa lamang, + at gumawa ng teknikal na mga pagbabago na kinakailangan upang magawa ito. Tinatanggihan + at/o pumapayag ang Nagbibigay ng Lisensya na huwag ipatupad ang anumang karapatan o + awtoridad upang ipagbawal sa Iyo ang paggawa ng mga teknikal na pagbabago + na kinakailangan upang maisakatuparan ang mga Lisensyadong Karapatan, kabilang na + ang mga teknikal na pagbabago na kinakailangan upang talunin ang Epektibong + Makatolohikal na Pamamaraan. Para sa layunin ng Pampublikong Lisensyang ito, + ang simpleng paggawa ng mga pagbabago na pinahihintulutan ng Seksyon 2(a) -c. Para sa kalinawan, ang Tagapaglisensya ay maaari ring mag-alok ng Lisensyadong Materyal sa ilalim ng hiwalay na mga termino o kundisyon o itigil ang pamamahagi ng Lisensyadong Materyal anumang oras; gayunpaman, ang paggawa nito ay hindi magwawakas sa Pampublikong Lisensyang ito. -d. Ang mga Seksyon 1, 5, 6, 7, at 8 ay nananatili pagkatapos ng pagwawakas ng Pampublikong Lisensyang ito. ---- -Seksyon 7 -- Iba Pang Mga Tuntunin at Kundisyon. + a. Alok mula sa Nagbibigay ng Lisensya -- Lisensyadong Materyal. Bawat + tumatanggap ng Lisensyadong Materyal ay awtomatikong + tumatanggap ng alok mula sa Nagbibigay ng Lisensya na gamitin ang + mga Lisensyadong Karapatan alinsunod sa mga tuntunin at kundisyon ng -a. Ang Tagapaglisensya ay hindi obligado sa anumang karagdagang o magkaibang mga tuntunin o kundisyon na ipinahayag ng Iyo maliban kung hayagang sinang-ayunan. -b. Anumang mga kaayusan, pag-unawa, o kasunduan tungkol sa Lisensyadong Materyal na hindi nakasaad dito ay hiwalay at independyente sa mga tuntunin at kundisyon ng Pampublikong Lisensyang ito. + b. Karagdagang alok mula sa Nagbibigay ng Lisensya -- Inangkop na Materyal. + Bawat tumatanggap ng Inangkop na Materyal mula sa Iyo + ay awtomatikong tumatanggap ng alok mula sa Nagbibigay ng Lisensya na + gamitin ang mga Lisensyadong Karapatan sa Inangkop na Materyal ---- -Seksyon 8 -- Interpretasyon. + c. Walang mga paghihigpit sa ibaba. Hindi Mo maaaring ialok o ipataw + ang anumang karagdagang o ibang mga tuntunin o kundisyon, o + magpataw ng anumang Epektibong Makatolohikal na Pamamaraan sa, + Lisensyadong Materyal kung ginagawa ito ay nagpapahirap sa paggamit ng + mga Lisensyadong Karapatan ng sinumang tumatanggap ng Lisensyadong -a. Para sa kalinawan, ang Pampublikong Lisensyang ito ay hindi, at hindi dapat ipakahulugan na, binabawasan, nililimitahan, pinipigilan, o nagtatakda ng mga kundisyon sa anumang paggamit ng Lisensyadong Materyal na maaaring legal na gawin nang walang pahintulot sa ilalim ng Pampublikong Lisensyang ito. -b. Sa abot ng posibleng paraan, kung ang anumang probisyon ng Pampublikong Lisensyang ito ay itinuturing na hindi maipapatupad, ito ay awtomatikong binabago sa pinakamababang lawak na kinakailangan upang ito ay maipatupad. Kung ang probisyon ay hindi maaaring baguhin, ito ay aalisin mula sa Pampublikong Lisensyang ito nang hindi naaapektuhan ang pagiging maipapatupad ng natitirang mga tuntunin at kundisyon. + 6. Walang pagpapatibay. Walang bagay sa Pampublikong Lisensyang ito ang bumubuo o + maaaring bigyang-kahulugan bilang pahintulot na ipahayag o ipahiwatig na Ikaw + ay, o na ang Iyong paggamit ng Lisensyadong Materyal ay, konektado, + sinusuportahan, inendorso, o binigyan ng opisyal na katayuan ng, + ang Nagbibigay ng Lisensya o iba pang itinalagang tumanggap ng pagkilala tulad ng -c. Walang tuntunin o kundisyon ng Pampublikong Lisensyang ito ang iwawaksi at walang kabiguan na sumunod ang pahihintulutan maliban kung hayagang sinang-ayunan ng Tagapaglisensya. -d. Walang anuman sa Pampublikong Lisensyang ito ang bumubuo o maaaring ipakahulugan bilang isang limitasyon sa, o pagwawaksi ng, anumang pribilehiyo at kaligtasan na nalalapat sa Tagapaglisensya o sa Iyo, kabilang ang mula sa mga legal na proseso ng anumang hurisdiksyon o awtoridad. ---- -======================================================================= + 1. Ang mga moral na karapatan, tulad ng karapatan sa integridad, ay hindi + ipinagkakaloob sa ilalim ng Pampublikong Lisensyang ito, gayundin ang karapatan sa + publicity, privacy, at/o iba pang katulad na karapatan sa personalidad; gayunpaman, + sa pinakamalawak na posibleng lawak, tinatanggihan at/o pumapayag ang Nagbibigay ng Lisensya na + huwag ipatupad ang anumang ganitong mga karapatan na hawak ng Nagbibigay ng Lisensya + sa limitadong lawak na kinakailangan upang pahintulutan Ka na gamitin ang mga Lisensyadong + + + 2. Ang mga karapatan sa patent at trademark ay hindi ipinagkakaloob sa ilalim ng + + + 3. Hangga't maaari, isinusuko ng Nagbibigay ng Lisensya ang anumang karapatan na + mangolekta ng mga royalty mula sa Iyo para sa paggamit ng mga Lisensyang + Karapatan, maging direkta man o sa pamamagitan ng isang collecting society + sa ilalim ng anumang boluntaryo o maaring ipawalang bisa na batasan o sapilitang + lisensyang iskema. Sa lahat ng ibang kaso, tahasang pinananatili ng Nagbibigay ng Lisensya + ang anumang karapatan na kolektahin ang nasabing mga royalty. + + +Seksyon 3 -- Mga Kondisyon sa Lisensya. + +Ang iyong paggamit sa mga Lisensyang Karapatan ay tahasang naipapailalim sa mga +sumusunod na kondisyon. + + a. Pagkilala. + + 1. Kung Ibinahagi Mo ang Lisensyang Materyal (kasama na ang nabagong + anyo), Dapat mong: + + a. panatilihin ang mga sumusunod kung ito ay ibinigay ng Nagbibigay ng Lisensya + kasama ng Lisensyang Materyal: + + i. pagkakakilanlan ng tagalikha ng Lisensyang + Materyal at ng iba pang itinalagang makatanggap ng + pagkilala, sa anumang makatwirang paraan na hinihiling ng + Nagbibigay ng Lisensya (kasama ang paggamit ng sagisag kung + tinukoy); + + ii. isang paunawa ng copyright; + + iii. isang paunawa na tumutukoy sa Pampublikong Lisensyang ito; + + iv. isang paunawa na tumutukoy sa pagtatanggi ng + mga warranty; + + v. isang URI o hyperlink sa Lisensyang Materyal hangga't makatwirang + magagawa; + + b. ipahiwatig kung binago Mo ang Lisensyang Materyal at + panatilihin ang pahiwatig ng anumang mga dating pagbabago; at + + c. ipahiwatig na ang Lisensyang Materyal ay nilisensyahan sa ilalim ng + Pampublikong Lisensyang ito, at isama ang teksto ng, o ang URI o + hyperlink sa, Pampublikong Lisensyang ito. + + 2. Maaari mong tuparin ang mga kondisyon sa Seksyon 3(a)(1) sa anumang + makatwirang paraan batay sa media, pamamaraan, at konteksto kung saan + Ibinabahagi Mo ang Lisensyang Materyal. Halimbawa, maaaring makatwiran + ang pagtupad sa mga kondisyon sa pamamagitan ng pagbibigay ng URI o + hyperlink sa isang mapagkukunan na naglalaman ng kinakailangang + impormasyon. + + 3. Kung hinihiling ng Nagbibigay ng Lisensya, Dapat mong alisin ang alinman sa + mga impormasyong kinakailangan sa Seksyon 3(a)(1)(A) hangga't + makatwirang magagawa. + + b. ShareAlike. + + Bilang karagdagan sa mga kondisyon sa Seksyon 3(a), kung Ibinahagi Mo ang + Nabagong Materyal na Iyong ginawa, ang sumusunod na mga kondisyon ay nalalapat din. + + 1. Ang Lisensya ng Tagagawa ng Adaptasyon na Iyong inilalapat ay dapat na isang Creative Commons + lisensya na may parehong mga Elemento ng Lisensya, sa bersyong ito o + mas bago, o isang BY-SA Compatible License. + + 2. Dapat mong isama ang teksto ng, o ang URI o hyperlink sa, + Lisensya ng Tagagawa ng Adaptasyon na Iyong inilalapat. Maaari mong + tuparin ang kondisyong ito sa anumang makatwirang paraan batay sa media, pamamaraan, at + konteksto kung saan Ibinabahagi Mo ang Nabagong Materyal. + + 3. Hindi Mo maaaring ialok o ipataw ang anumang karagdagang o iba pang mga termino + o kondisyon sa, o ilapat ang anumang Epektibong Teknolohikal na + Mga Hakbang sa, Nabagong Materyal na naglilimita sa paggamit ng mga + karapatan na ipinagkaloob sa ilalim ng Lisensya ng Tagagawa ng Adaptasyon na Iyong inilalapat. + + +Seksyon 4 -- Sui Generis na Mga Karapatan sa Database. + +Kung ang mga Lisensyang Karapatan ay kasama ang Sui Generis na Mga Karapatan sa Database na +nalalapat sa Iyong paggamit ng Lisensyang Materyal: -Ang Creative Commons ay hindi isang partido sa mga pampublikong lisensya nito. Gayunpaman, maaaring piliin ng Creative Commons na ilapat ang isa sa mga pampublikong lisensya nito sa materyal na inilalathala nito at sa mga pagkakataong iyon ay ituturing na "Tagapaglisensya." Ang teksto ng mga pampublikong lisensya ng Creative Commons ay nakatuon sa pampublikong domain sa ilalim ng CC0 Public Domain Dedication. Maliban sa limitadong layunin ng pagpapahiwatig na ang materyal ay ibinabahagi sa ilalim ng isang pampublikong lisensya ng Creative Commons o ayon sa iba pang pinahihintulutan ng mga patakaran ng Creative Commons na inilathala sa creativecommons.org/policies, ang Creative Commons ay hindi pinahihintulutan ang paggamit ng trademark na "Creative Commons" o anumang iba pang trademark o logo ng Creative Commons nang walang paunang nakasulat na pahintulot, kabilang, walang limitasyon, kaugnay sa anumang hindi awtorisadong pagbabago sa alinman sa mga pampublikong lisensya nito o anumang iba pang kaayusan, pag-unawa, o kasunduan tungkol sa paggamit ng lisensyadong materyal. Para sa kalinawan, ang talatang ito ay hindi bahagi ng mga pampublikong lisensya. + a. para sa kalinawan, ang Seksyon 2(a)(1) ay nagbibigay sa Iyo ng karapatan + na kunin, muling gamitin, gumawa ng kopya, at Ibahagi ang lahat o isang malaking bahagi + ng nilalaman ng database; + + b. kung Isasama Mo ang lahat o isang malaking bahagi ng nilalaman ng database + sa isang database kung saan Meron Kang Sui Generis na Mga Karapatan sa Database + + Mga Karapatan, pagkatapos ay ang database kung saan mayroon Ka ng Sui Generis Database + Mga Karapatan (ngunit hindi ang mga indibidwal na nilalaman nito) ay Adapted Material, + + kasama na para sa mga layunin ng Seksyon 3(b); at + + c. Dapat kang sumunod sa mga kundisyon sa Seksyon 3(a) kung Ibinabahagi Mo + ang lahat o isang malaking bahagi ng nilalaman ng database. + +Para sa pagkakalinaw, ang Seksyon 4 na ito ay nagsisilbing karagdagan at hindi +pumapalit sa Iyong mga obligasyon sa ilalim ng Pampublikong Lisensyang ito kung saan ang mga Lisensyadong +Karapatan ay kasama ang iba pang Copyright at Katulad na mga Karapatan. + + +Seksyon 5 -- Pagtanggi sa Mga Garantiya at Limitasyon ng Pananagutan. + + a. MALIBAN KUNG NAISAGAWA ANGIBA NANG HIWALAY NG LICENSOR, SA + KAKAYAHAN, ANG LICENSOR AY NAG-AALOK NG LISENSYADONG MATERYAL NA "AS-IS" + AT "AS-AVAILABLE," AT HINDI NAGGAGAWA NG ANUMANG PAGPAPAHAYAG O GARANTIYA + NG ANUMANG URI TUNGKOL SA LISENSYADONG MATERYAL, MAPAEXPRESS, + IMPLISITO, BATAY SA BATAS, O IBA PA. KASAMA DITO, NG WALANG LIMITASYON, + MGA GARANTIYA NG PAGKAMAY-ARI, PAGKAKATUGMA SA PANG-NEGOSYO, KAKAYAHAN + PARA SA ISANG TIYAK NA LAYUNIN, HINDI PAGLABAG, KAWALANG-SALA NG MGA TAGO + O IBA PANG DEFEKTO, KATUMPATAN, O PRESENSIYA O KAWALANG-PRESENSIYA NG MGA + ERROR, KAHIT ALAM MAN O MAHULI. KUNG SAAN ANG PAGTANGGI SA MGA GARANTIYA AY + HINDI PINAPAHINTULUTAN NA BUO O SA BAHAGI, ANG PAGTANGGING ITO AY MAAARING + + + b. SA KAKAYAHAN, SA ANUMANG PANAHON AY HINDI MANANAGUTAN ANG LICENSOR SA IYO + SA ANUMANG TEORYANG PANG-BATAS (KASAMA, NG WALANG LIMITASYON, + KAWALANG-PANSIN) O SA IBA PA PARA SA ANUMANG DIREKTA, ESPESYAL, DI-TUWIRAN, + PAMINSAN-MINSANG, PANGKONSEKWENSIYA, PUNITIBO, HALIMBAWA, O IBA PANG + PAGKAWALA, GASTOS, KAGASTUSAN, O PINSALA NA NAGMULA SA PAMPUBLIKONG LISENSYA O + PAGGAMIT NG LISENSYADONG MATERYAL, KAHIT IPINAALAM SA LICENSOR ANG + POSIBILIDAD NG MGA GANITONG PAGKAWALA, GASTOS, KAGASTUSAN, O PINSALA. KUNG + SAAN ANG LIMITASYON NG PANANAGUTAN AY HINDI PINAPAHINTULUTAN NA BUO O SA + + + c. Ang pagtanggi ng mga garantiya at limitasyon ng pananagutan na ibinigay + sa itaas ay dapat bigyang-kahulugan sa paraang, sa abot ng + makakaya, ay pinakamalapit sa isang ganap na pagtanggi at + + + + + + a. Ang Pampublikong Lisensyang ito ay nalalapat sa panahon ng Copyright at + Katulad na Mga Karapatang nilisensyahan dito. Gayunpaman, kung nabigo kang sumunod sa + Pampublikong Lisensyang ito, awtomatikong matatapos ang iyong mga karapatan sa ilalim ng Pampublikong Lisensyang ito. + + b. Kung saan ang iyong karapatang gamitin ang Lisensyadong Materyal ay natapos sa ilalim ng + Seksyon 6(a), ito ay maibabalik: + + 1. awtomatiko mula sa petsa kung kailan naayos ang paglabag, kung ito ay naayos + sa loob ng 30 araw mula nang matuklasan mo ang + paglabag; o + + 2. sa pamamagitan ng tahasang muling pagpapatibay ng Licensor. + + Para sa pag-iwas ng pagdududa, ang Seksyon 6(b) na ito ay hindi nakakaapekto sa anumang + karapatan na maaaring mayroon ang Licensor upang maghanap ng mga lunas para sa iyong mga paglabag + sa Pampublikong Lisensyang ito. + + c. Para sa pag-iwas ng pagdududa, ang Licensor ay maaari ding mag-alok ng + Lisensyadong Materyal sa ilalim ng hiwalay na mga termino o kundisyon o ihinto + ang pamamahagi ng Lisensyadong Materyal anumang oras; gayunpaman, ang paggawa nito + ay hindi magtatapos sa Pampublikong Lisensyang ito. + + d. Ang mga Seksyon 1, 5, 6, 7, at 8 ay nananatili pagkatapos ng pagtatapos ng Pampublikong + Lisensya. + + +Seksyon 7 -- Iba Pang Mga Termino at Kundisyon. + + a. Ang Licensor ay hindi mapipilitan ng anumang karagdagang o ibang + mga termino o kundisyon na ipinabatid sa Iyo maliban kung tahasang napagkasunduan. + + b. Anumang mga kasunduan, pagkakaunawaan, o mga kasunduan tungkol sa + Lisensyadong Materyal na hindi nakasaad dito ay hiwalay sa at + independent mula sa mga termino at kundisyon ng Pampublikong Lisensyang ito. + + +Seksyon 8 -- Pagsasalin ng Kahulugan. + + a. Para sa pagkakalinaw, ang Pampublikong Lisensyang ito ay hindi, at + hindi dapat bigyang-kahulugan na, binabawasan, nililimitahan, nililimitahan, + o naglalagay ng mga kondisyon sa anumang paggamit ng Lisensyadong Materyal na maaaring + gawin ng legal nang walang pahintulot sa ilalim ng Pampublikong Lisensyang ito. + + b. Sa abot ng makakaya, kung ang anumang probisyon ng Pampublikong Lisensyang ito ay + itinuturing na hindi mapatupad, ito ay awtomatikong aayusin sa + pinakamababang antas na kinakailangan upang maging mapatupad. Kung ang probisyon + ay hindi maaaring ayusin, ito ay aalisin mula sa Pampublikong Lisensyang ito + nang hindi naapektuhan ang pagpapatupad ng natitirang mga termino at + kundisyon. + + c. Walang termino o kundisyon ng Pampublikong Lisensyang ito ang bawiin at walang + kabiguan sa pagsunod ang papayagan maliban kung tahasang napagkasunduan ng + Licensor. + + d. Wala sa Pampublikong Lisensyang ito ang bumubuo o maaaring bigyang-kahulugan + bilang isang limitasyon sa, o pagbawi ng, anumang pribilehiyo at mga imyunidad + na nalalapat sa Licensor o sa Iyo, kabilang mula sa mga prosesong legal ng anumang hurisdiksyon o awtoridad. + + + +======================================================================= -Maaaring makontak ang Creative Commons sa creativecommons.org. +Ang Creative Commons ay hindi bahagi sa mga pampublikong +lisensya nito. Gayunpaman, maaaring piliin ng Creative Commons na i-apply ang isa sa +mga pampublikong lisensya nito sa materyal na inilalathala nito at sa mga pagkakataong iyon +ay ituturing na "Licensor." Ang teksto ng mga pampublikong lisensya ng Creative Commons +ay inilaan sa pampublikong domain sa ilalim ng CC0 Public +Domain Dedication. Maliban sa limitadong layunin ng pagpapahiwatig na +ang materyal ay ibinabahagi sa ilalim ng pampublikong lisensya ng Creative Commons o bilang +pinapayagan ng mga patakaran ng Creative Commons na nalathala sa +creativecommons.org/policies, hindi pinahihintulutan ng Creative Commons ang +paggamit ng trademark na "Creative Commons" o anumang iba pang trademark o logo +ng Creative Commons nang walang paunang nakasulat na pahintulot kabilang, +nang walang limitasyon, sa koneksyon sa anumang hindi awtorisadong pagbabago +sa alinman sa mga pampublikong lisensya nito o anumang iba pang mga kasunduan, +pagkakaunawaan, o mga kasunduan tungkol sa paggamit ng lisensyadong materyal. Para sa +kalinawan, ang talatang ito ay hindi bahagi ng +mga pampublikong lisensya. + +Ang Creative Commons ay maaaring kontakin sa creativecommons.org. --- -**Paunawa**: -Ang dokumentong ito ay isinalin gamit ang AI translation service na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't sinisikap naming maging tumpak, tandaan na ang mga awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa kanyang katutubong wika ang dapat ituring na opisyal na sanggunian. Para sa mahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang hindi pagkakaunawaan o maling interpretasyon na maaaring magmula sa paggamit ng pagsasaling ito. \ No newline at end of file + +**Pagtatanggi**: +Ang dokumentong ito ay isinalin gamit ang serbisyo ng AI translation na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't nagsusumikap kami para sa katumpakan, pakatandaan na ang awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa orihinal nitong wika ang dapat ituring na pangunahing sanggunian. Para sa mahahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang maling pagkakaintindi o maling interpretasyon na nagmula sa paggamit ng pagsasaling ito. + \ No newline at end of file diff --git a/translations/tr/.co-op-translator.json b/translations/tr/.co-op-translator.json index 341c8a1854..1ab5c54bbe 100644 --- a/translations/tr/.co-op-translator.json +++ b/translations/tr/.co-op-translator.json @@ -5,6 +5,12 @@ "source_file": "AGENTS.md", "language_code": "tr" }, + "CONTRIBUTING.md": { + "original_hash": "c6fd7e781b67111a90abd166d0ce4aa0", + "translation_date": "2026-07-08T15:26:08+00:00", + "source_file": "CONTRIBUTING.md", + "language_code": "tr" + }, "README.md": { "original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b", "translation_date": "2026-04-06T15:41:18+00:00", @@ -17,6 +23,19 @@ "source_file": "SECURITY.md", "language_code": "tr" }, + "__translation_failures__": { + "lessons/sketchnotes/LICENSE.md": { + "original_hash": "45ab63a2cd8f5faef6c9b150618837a4", + "source_file": "lessons/sketchnotes/LICENSE.md", + "language_code": "tr", + "failure_date": "2026-07-08T15:19:17+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-26T07:40:40+00:00", @@ -54,8 +73,8 @@ "language_code": "tr" }, "examples/README.md": { - "original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7", - "translation_date": "2025-10-03T11:30:39+00:00", + "original_hash": "7883d52c2e2a221e0b07a7b112a149b9", + "translation_date": "2026-07-08T15:15:13+00:00", "source_file": "examples/README.md", "language_code": "tr" }, @@ -66,8 +85,8 @@ "language_code": "tr" }, "lessons/0-course-setup/how-to-run.md": { - "original_hash": "a4717bd9103b9f6cd84d534b83534689", - "translation_date": "2026-01-15T14:33:23+00:00", + "original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1", + "translation_date": "2026-07-08T15:15:34+00:00", "source_file": "lessons/0-course-setup/how-to-run.md", "language_code": "tr" }, @@ -191,6 +210,12 @@ "source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md", "language_code": "tr" }, + "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": { + "original_hash": "99b816b6a4957ef4100cee4c4221dff9", + "translation_date": "2026-07-08T15:06:34+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", + "language_code": "tr" + }, "lessons/4-ComputerVision/08-TransferLearning/lab/README.md": { "original_hash": "7765935c35fcee69b9fe2d0cfd6963e2", "translation_date": "2025-08-26T07:31:24+00:00", @@ -330,8 +355,8 @@ "language_code": "tr" }, "lessons/5-NLP/README.md": { - "original_hash": "8ef02a9318257ea140ed3ed74442096d", - "translation_date": "2025-08-26T07:19:03+00:00", + "original_hash": "038df6f1a73e49f6430740da083bfd6d", + "translation_date": "2026-07-08T15:15:59+00:00", "source_file": "lessons/5-NLP/README.md", "language_code": "tr" }, diff --git a/translations/tr/CONTRIBUTING.md b/translations/tr/CONTRIBUTING.md new file mode 100644 index 0000000000..ac7605a8e6 --- /dev/null +++ b/translations/tr/CONTRIBUTING.md @@ -0,0 +1,29 @@ +# AI-For-Beginners'a Katkıda Bulunma + +AI-For-Beginners'a katkıda bulunma ilginiz için teşekkürler! Çevirilere, ders düzeltmelerine ve biçimlendirme düzeltmelerine açığız. + +## Microsoft Katkı Sağlayıcı Lisans Sözleşmesi (CLA) + +Bu proje katkılarınızı ve önerilerinizi kabul eder. Çoğu katkı, haklarınızı bize verdiğinizi beyan eden bir Katkı Sağlayıcı Lisans Sözleşmesi (CLA) imzalamanızı gerektirir. Detaylar için [https://cla.microsoft.com](https://cla.microsoft.com) adresini ziyaret edin. + +Bir pull request gönderdiğinizde, CLA-bot otomatik olarak CLA sağlamanız gerekip gerekmediğini belirler ve PR'ı uygun şekilde (örneğin, etiket, yorum) işaretler. Botun verdiği talimatları takip edin. CLA'yı kullanan tüm depolarda bu işlemi yalnızca bir kez yapmanız yeterlidir. + +## Nasıl Katkıda Bulunulur + +### 1. Yazım Hatalarını / Kod Hatalarını Düzeltme +Herhangi bir Jupyter defterinde veya ders markdown dosyasında yazım hatası veya hata bulursanız: +1. Depoyu çatallayın. +2. Yazım hatasını veya bozuk bağlantıyı düzeltin. +3. Düzeltmenin açıklamasıyla birlikte bir Pull Request gönderin. + +### 2. Çeviri Gönderme +Derslerin diğer dillere çevirilerini memnuniyetle karşılıyoruz! Lütfen çevirileri mevcut klasör isimlerini kullanarak `translations/` dizinine yerleştirin (örneğin `translations/es/`, `translations/pt-BR/`, `translations/zh-CN/`). + +Daha fazla detay için [etc/CONTRIBUTING.md](etc/CONTRIBUTING.md) dosyasına bakınız. + +--- + + +**Feragatname**: +Bu belge, AI çeviri hizmeti [Co-op Translator](https://github.com/Azure/co-op-translator) kullanılarak çevrilmiştir. Doğruluk için çaba sarf etsek de, otomatik çevirilerin hata veya yanlışlık içerebileceğini lütfen unutmayınız. Orijinal belge, kendi dilinde yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi önerilir. Bu çevirinin kullanımı sonucu ortaya çıkabilecek yanlış anlamalardan veya yanlış yorumlamalardan sorumlu değiliz. + \ No newline at end of file diff --git a/translations/tr/examples/README.md b/translations/tr/examples/README.md index 32a52f5384..007bf80803 100644 --- a/translations/tr/examples/README.md +++ b/translations/tr/examples/README.md @@ -1,45 +1,45 @@ -# Yeni Başlayanlar İçin AI Örnekleri +# Yeni Başlayanlar İçin Yapay Zeka Örnekleri -Hoş geldiniz! Bu dizin, yapay zeka ve makine öğrenimine başlamak için basit, bağımsız örnekler içerir. Her örnek, ayrıntılı yorumlar ve adım adım açıklamalarla yeni başlayanlar için uygun şekilde tasarlanmıştır. +Hoş geldiniz! Bu dizin, yapay zeka ve makine öğrenimine başlamanıza yardımcı olacak basit, bağımsız örnekler içerir. Her örnek, ayrıntılı yorumlar ve adım adım açıklamalarla yeni başlayan dostu olacak şekilde tasarlanmıştır. -## 📚 Örneklerin Genel Görünümü +## 📚 Örneklerin Genel Bakışı -| Örnek | Açıklama | Zorluk | Ön Koşullar | -|-------|----------|--------|-------------| -| [Merhaba AI Dünyası](../../../examples/01-hello-ai-world.py) | İlk yapay zeka programınız - basit desen tanıma | ⭐ Başlangıç | Python temelleri | -| [Basit Sinir Ağı](../../../examples/02-simple-neural-network.py) | Sıfırdan bir sinir ağı oluşturun | ⭐⭐ Başlangıç+ | Python, temel matematik | -| [Görüntü Sınıflandırıcı](./03-image-classifier.ipynb) | Önceden eğitilmiş bir modelle görüntüleri sınıflandırın | ⭐⭐ Başlangıç+ | Python, numpy | -| [Metin Duygusu](../../../examples/04-text-sentiment.py) | Metin duygu analizini yapın (pozitif/negatif) | ⭐⭐ Başlangıç+ | Python | +| Örnek | Açıklama | Zorluk | Önkoşullar | +|---------|-------------|------------|---------------| +| [Hello AI World](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/01-hello-ai-world.py) | İlk yapay zeka programınız - basit desen tanıma | ⭐ Yeni Başlayan | Python temelleri | +| [Basit Sinir Ağı](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/02-simple-neural-network.py) | Baştan bir sinir ağı inşa edin | ⭐⭐ Yeni Başlayan+ | Python, temel matematik | +| [Görüntü Sınıflandırıcı](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/03-image-classifier.ipynb) | Önceden eğitilmiş modelle görüntü sınıflandırma | ⭐⭐ Yeni Başlayan+ | Python, numpy | +| [Metin Duygu Analizi](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/04-text-sentiment.py) | Metin duygu analizi (pozitif/negatif) | ⭐⭐ Yeni Başlayan+ | Python | ## 🚀 Başlarken -### Ön Koşullar +### Önkoşullar -Python'un yüklü olduğundan emin olun (3.8 veya daha yüksek sürüm önerilir). Gerekli paketleri yükleyin: +Python'un yüklü olduğundan emin olun (3.8 veya daha üstü önerilir). Gerekli paketleri kurun: ```bash -# For Python scripts +# Python betikleri için pip install numpy -# For Jupyter notebooks (image classifier) +# Jupyter not defterleri için (görüntü sınıflandırıcı) pip install jupyter numpy pillow tensorflow ``` -Ya da ana müfredattan conda ortamını kullanın: +Veya ana ders programından conda ortamını kullanın: ```bash conda env create --name ai4beg --file ../environment.yml conda activate ai4beg ``` -### Örnekleri Çalıştırma +### Örnekleri Çalıştırmak -**Python dosyaları (.py):** +**Python scriptleri (.py dosyaları) için:** ```bash python 01-hello-ai-world.py ``` -**Jupyter defterleri (.ipynb):** +**Jupyter not defterleri (.ipynb dosyaları) için:** ```bash jupyter notebook 03-image-classifier.ipynb ``` @@ -48,38 +48,40 @@ jupyter notebook 03-image-classifier.ipynb Örnekleri sırasıyla takip etmenizi öneririz: -1. **"Merhaba AI Dünyası" ile başlayın** - Desen tanımanın temellerini öğrenin -2. **Basit bir Sinir Ağı oluşturun** - Sinir ağlarının nasıl çalıştığını anlayın -3. **Görüntü Sınıflandırıcıyı deneyin** - Gerçek görüntülerle yapay zekayı görün -4. **Metin Duygusu Analizi yapın** - Doğal dil işleme dünyasını keşfedin +1. **"Hello AI World" ile başlayın** - Desen tanımanın temellerini öğrenin +2. **Basit Bir Sinir Ağı Kurun** - Sinir ağlarının nasıl çalıştığını anlayın +3. **Görüntü Sınıflandırıcıyı Deneyin** - Gerçek görüntülerle yapay zekayı görün +4. **Metin Duygu Analizini Yapın** - Doğal dil işlemede keşfedin ## 💡 Yeni Başlayanlar İçin İpuçları -- **Kod yorumlarını dikkatlice okuyun** - Her satırın ne yaptığını açıklar -- **Deneyin!** - Değerleri değiştirin ve sonuçları görün -- **Her şeyi anlamaya çalışmayın** - Öğrenmek zaman alır +- **Kod yorumlarını dikkatle okuyun** - Her satırın ne yaptığını açıklar +- **Deney yapın!** - Değerleri değiştirip ne olduğunu görün +- **Her şeyi anlamaya çalışırken endişelenmeyin** - Öğrenmek zaman alır - **Sorular sorun** - [Tartışma panosunu](https://github.com/microsoft/AI-For-Beginners/discussions) kullanın ## 🔗 Sonraki Adımlar -Bu örnekleri tamamladıktan sonra tam müfredatı keşfedin: -- [AI'ye Giriş](../lessons/1-Intro/README.md) +Bu örnekleri tamamladıktan sonra tam ders programını keşfedin: +- [Yapay Zekaya Giriş](../lessons/1-Intro/README.md) - [Sinir Ağları](../lessons/3-NeuralNetworks/README.md) -- [Bilgisayarlı Görü](../lessons/4-ComputerVision/README.md) +- [Bilgisayarla Görme](../lessons/4-ComputerVision/README.md) - [Doğal Dil İşleme](../lessons/5-NLP/README.md) ## 🤝 Katkıda Bulunma Bu örnekleri faydalı buldunuz mu? Geliştirmemize yardımcı olun: -- Sorunları bildirin veya iyileştirme önerilerinde bulunun +- Sorunları bildirin veya geliştirme önerin - Yeni başlayanlar için daha fazla örnek ekleyin -- Belgeleri ve yorumları geliştirin +- Dokümantasyon ve yorumları iyileştirin --- -*Unutmayın: Her uzman bir zamanlar yeni başkandı. İyi öğrenmeler! 🎓* +*Unutmayın: Her uzman bir zamanlar acemiydi. İyi öğrenmeler! 🎓* --- -**Feragatname**: -Bu belge, AI çeviri hizmeti [Co-op Translator](https://github.com/Azure/co-op-translator) kullanılarak çevrilmiştir. Doğruluk için çaba göstersek de, otomatik çevirilerin hata veya yanlışlıklar içerebileceğini lütfen unutmayın. Belgenin orijinal dili, yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi önerilir. Bu çevirinin kullanımından kaynaklanan yanlış anlamalar veya yanlış yorumlamalar için sorumluluk kabul edilmez. \ No newline at end of file + +**Feragatname**: +Bu belge, AI çeviri hizmeti [Co-op Translator](https://github.com/Azure/co-op-translator) kullanılarak çevrilmiştir. Doğruluk için çaba sarf etsek de, otomatik çevirilerin hata veya yanlışlık içerebileceğini lütfen unutmayınız. Orijinal belge, kendi dilinde yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi önerilir. Bu çevirinin kullanımı sonucu ortaya çıkabilecek yanlış anlamalardan veya yanlış yorumlamalardan sorumlu değiliz. + \ No newline at end of file diff --git a/translations/tr/lessons/0-course-setup/how-to-run.md b/translations/tr/lessons/0-course-setup/how-to-run.md index c0e33cd553..154220c6a3 100644 --- a/translations/tr/lessons/0-course-setup/how-to-run.md +++ b/translations/tr/lessons/0-course-setup/how-to-run.md @@ -1,12 +1,12 @@ -# Kodu Çalıştırma +# Kodu Nasıl Çalıştırılır -Bu müfredat, çalıştırmak isteyebileceğiniz birçok yürütülebilir örnek ve laboratuvar içerir. Bunu yapmak için, bu müfredatın parçası olarak sağlanan Jupyter Not defterlerinde Python kodu çalıştırma yeteneğine ihtiyacınız vardır. Kodu çalıştırmak için birkaç seçeneğiniz vardır: +Bu müfredat, çalıştırmak isteyeceğiniz birçok yürütülebilir örnek ve laboratuvar içermektedir. Bunu yapabilmek için, bu müfredatın bir parçası olarak sağlanan Jupyter Notebooks içinde Python kodu çalıştırma yeteneğine sahip olmanız gerekir. Kodu çalıştırmak için birkaç seçeneğiniz vardır: ## Bilgisayarınızda Yerel Olarak Çalıştırma -Kodu bilgisayarınızda yerel olarak çalıştırmak için Python kurulumu gereklidir. Tavsiye edilenlerden biri **[miniconda](https://conda.io/en/latest/miniconda.html)** yüklemektir - bu, farklı Python **sanal ortamları** için `conda` paket yöneticisini destekleyen oldukça hafif bir kurulumdur. +Kodu bilgisayarınızda yerel olarak çalıştırmak için, bir Python kurulumu gereklidir. Bir öneri **[miniconda](https://conda.io/en/latest/miniconda.html)** kurmaktır - bu, farklı Python **sanal ortamları** için `conda` paket yöneticisini destekleyen oldukça hafif bir kurulumdur. -Miniconda'yı yükledikten sonra, depoyu klonlayın ve bu ders için kullanılacak bir sanal ortam oluşturun: +Miniconda'yı kurduktan sonra, depo klonlayın ve bu kurs için kullanılacak bir sanal ortam oluşturun: ```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 ile Python Eklentisi Kullanımı +### Visual Studio Code ve Python Eklentisi ile Kullanma -Bu müfredat, en iyi şekilde [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) içindeki [Python Eklentisi](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste) ile açıldığında kullanılır. +Bu müfredat, [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) ve [Python Eklentisi](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste) ile açıldığında en iyi şekilde kullanılır. -> **Not**: Depoyu klonlayıp VS Code’da dizini açtıktan sonra, Python eklentilerini yüklemenizi otomatik olarak önerecektir. Ayrıca yukarıda anlatıldığı gibi miniconda'yı da yüklemeniz gerekecektir. +> **Not**: Depoyu klonlayıp dizini VS Code'da açtığınızda, Python uzantılarını yüklemenizi otomatik olarak önerir. Ayrıca yukarıda açıklandığı gibi miniconda'yı da kurmanız gerekir. > **Not**: VS Code, depoyu bir konteyner içinde yeniden açmanızı önerirse, yerel Python kurulumunu kullanmak için bunu reddetmelisiniz. -### Tarayıcıda Jupyter Kullanımı +### Tarayıcıda Jupyter Kullanma -Ayrıca kendi bilgisayarınızda tarayıcıdan Jupyter ortamı kullanabilirsiniz. Hem klasik Jupyter hem de JupyterHub, otomatik tamamlama, kod vurgulama gibi özelliklerle kullanışlı bir geliştirme ortamı sağlar. +Kendi bilgisayarınızda tarayıcı üzerinden Jupyter ortamı da kullanabilirsiniz. Klasik Jupyter ve JupyterHub, otomatik tamamlama, kod vurgulama vb. özelliklerle kullanışlı bir geliştirme ortamı sunar. -Jupyter'ı yerel olarak başlatmak için ders dizinine gidin ve şunu yürütün: +Jupyter'ı yerel olarak başlatmak için, kurs dizinine gidin ve şunu çalıştırın: ```bash jupyter notebook @@ -36,36 +36,36 @@ jupyter notebook ```bash jupyterhub ``` - Daha sonra herhangi bir `.ipynb` dosyasına gidip açabilir ve çalışmaya başlayabilirsiniz. + Ardından `.ipynb` dosyalarından herhangi birine gidip açabilir ve çalışmaya başlayabilirsiniz. -### Konteynerde Çalıştırma +### Konteyner İçinde Çalıştırma -Python kurulumu yapmak yerine, kodu bir konteynerde çalıştırmak bir alternatiftir. Depomuz, bu depo için nasıl bir konteyner oluşturulacağını gösteren özel bir `.devcontainer` klasörü sağlar ve VS Code, kodu bir konteynerde yeniden açma fırsatı sunar. Bunun için Docker kurulumu gerekir ve biraz daha karmaşıktır, bu yüzden daha deneyimli kullanıcılara tavsiye edilir. +Python kurulumu yerine kodu bir konteyner içinde çalıştırmak da bir alternatiftir. Depomuz, bu depo için bir konteyner nasıl oluşturulacağını belirten özel bir `.devcontainer` klasörü sağladığından, VS Code kodu bir konteyner içinde yeniden açma olanağı sunar. Bu Docker kurulumu gerektirir ve daha karmaşık olabilir, bu yüzden daha deneyimli kullanıcılar için tavsiye ederiz. ## Bulutta Çalıştırma -Python'u yerel olarak kurmak istemiyorsanız ve bazı bulut kaynaklarına erişiminiz varsa - kodu bulutta çalıştırmak iyi bir alternatif olabilir. Bunu yapmanın birkaç yolu vardır: +Python'ı yerel olarak kurmak istemiyorsanız ve bazı bulut kaynaklarına erişiminiz varsa, kodu bulutta çalıştırmak iyi bir alternatif olacaktır. Bunu yapabileceğiniz birkaç yol vardır: -* **[GitHub Codespaces](https://github.com/features/codespaces)** kullanmak, GitHub üzerinde sizin için oluşturulan, VS Code tarayıcı arayüzü ile erişilebilen sanal bir ortamdır. Eğer Codespaces erişiminiz varsa, depoda **Code** düğmesine tıklayabilir, bir codespace başlatabilir ve kısa sürede çalışmaya başlayabilirsiniz. -* **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)** kullanmak. [Binder](https://mybinder.org), GitHub’daki bazı kodları denemeniz için bulutta ücretsiz hesaplama kaynakları sunar. Ana sayfada depoyu Binder'da açmak için bir düğme vardır - bu sizi hızla binder sitesine götürür, alt yapısında bir konteyner oluşturur ve sorunsuzca Jupyter web arayüzünü başlatır. +* GitHub üzerinde sizin için oluşturulan ve VS Code tarayıcı arayüzüyle erişilen bir sanal ortam olan **[GitHub Codespaces](https://github.com/features/codespaces)** kullanmak. Eğer Codespaces erişiminiz varsa, depoda **Code** butonuna tıklayıp bir codespace başlatarak hemen çalışmaya başlayabilirsiniz. +* **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)** kullanmak. [Binder](https://mybinder.org), GitHub'daki bazı kodları test etmek isteyenler için bulut üzerinden ücretsiz hesaplama kaynakları sunar. Ana sayfada depoyu Binder'da açmak için bir buton vardır – bu sizi hızla binder sitesine götürür, arka planda bir konteyner oluşturur ve sorunsuz bir Jupyter web arayüzü başlatır. -> **Not**: Kötüye kullanımı önlemek için, Binder bazı web kaynaklarına erişimi engellemiştir. Bu, modelleri ve/veya veri setlerini genel İnternetten çeken bazı kodların çalışmasını engelleyebilir. Bazı çözümler bulmanız gerekebilir. Ayrıca, Binder tarafından sağlanan hesaplama kaynakları oldukça temel seviyededir, bu nedenle eğitim özellikle daha karmaşık sonraki derslerde yavaş olacaktır. +> **Not**: Kötüye kullanımı engellemek için, Binder bazı web kaynaklarına erişimi engeller. Bu, modelleri ve/veya veri setlerini genel Internet'ten alan bazı kodların çalışmasını engelleyebilir. Bazı çözümler bulmanız gerekebilir. Ayrıca, Binder tarafından sağlanan hesaplama kaynakları oldukça basit olduğundan, özellikle sonraki daha karmaşık derslerde eğitim yavaş olacaktır. ## GPU ile Bulutta Çalıştırma -Bu müfredattaki bazı ileri dersler GPU desteğinden çok fayda sağlar. Örneğin model eğitimi aksi halde çok yavaş olabilir. Özellikle [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) veya kurumunuz aracılığıyla buluta erişiminiz varsa, takip edebileceğiniz birkaç seçenek vardır: +Bu müfredattaki bazı ileri dersler GPU desteğinden büyük ölçüde faydalanacaktır. Örneğin model eğitimi, aksi takdirde çok yavaş olabilir. Özellikle [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) veya kurumunuz vasıtasıyla buluta erişiminiz varsa, takip edebileceğiniz birkaç seçenek vardır: -* [Data Science Virtual Machine](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) oluşturun ve Jupyter üzerinden bağlanın. Depoyu doğrudan bu makineye klonlayabilir ve öğrenmeye başlayabilirsiniz. NC-serisi VM’ler GPU desteğine sahiptir. +* [Data Science Virtual Machine](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) oluşturup Jupyter aracılığıyla bağlanmak. Ardından depoyu makineye klonlayıp öğrenmeye başlayabilirsiniz. NC-serisi VM'ler GPU desteğine sahiptir. -> **Not**: Azure for Students dahil bazı abonelikler kutudan çıktığı gibi GPU desteği sağlamaz. Ek GPU çekirdeği için teknik destek talebi yapmanız gerekebilir. +> **Not**: Azure for Students dahil bazı abonelikler kutudan çıkar çıkmaz GPU desteği sağlamaz. Ek GPU çekirdeği talebinde bulunmak için teknik destek isteğinde bulunmanız gerekebilir. -* [Azure Machine Learning Workspace](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) oluşturun ve oradaki Notebook özelliğini kullanın. [Bu video](https://azure-for-academics.github.io/quickstart/azureml-papers/) bir depoyu Azure ML dizinine nasıl klonlayacağınızı ve kullanmaya başlayacağınızı gösterir. +* [Azure Machine Learning Workspace](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) oluşturup oradaki Notebook özelliğini kullanmak. [Bu video](https://azure-for-academics.github.io/quickstart/azureml-papers/) Azure ML notebook içine depo klonlama ve kullanmaya başlama gösterir. -Ayrıca Google Colab kullanabilirsiniz; ücretsiz GPU desteğiyle gelir ve Jupyter Not defterlerini oraya yükleyip tek tek çalıştırabilirsiniz. +Ayrıca, biraz ücretsiz GPU desteği ile gelen Google Colab'i kullanabilir ve Jupyter Notebooks'ları oraya yükleyip tek tek çalıştırabilirsiniz. --- -**Feragatname**: -Bu belge, AI çeviri hizmeti [Co-op Translator](https://github.com/Azure/co-op-translator) kullanılarak çevrilmiştir. Doğruluk için çaba gösterilse de, otomatik çevirilerin hatalar veya yanlışlıklar içerebileceğini lütfen unutmayınız. Orijinal belge, kendi ana dilinde yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi önerilir. Bu çeviri kullanımı sonucunda oluşabilecek herhangi bir yanlış anlama veya yorumlama için sorumluluk kabul edilmemektedir. +**Feragatname**: +Bu belge, AI çeviri hizmeti [Co-op Translator](https://github.com/Azure/co-op-translator) kullanılarak çevrilmiştir. Doğruluk için çaba sarf etsek de, otomatik çevirilerin hata veya yanlışlık içerebileceğini lütfen unutmayınız. Orijinal belge, kendi dilinde yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi önerilir. Bu çevirinin kullanımı sonucu ortaya çıkabilecek yanlış anlamalardan veya yanlış yorumlamalardan sorumlu değiliz. \ No newline at end of file diff --git a/translations/tr/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/tr/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index 91578b4098..a41e5c5780 100644 --- a/translations/tr/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/tr/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -4,11 +4,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Önceden Eğitilmiş Modeller ve Transfer Öğrenimi\n", + "# Önceden eğitilmiş modeller ve transfer öğrenme\n", "\n", - "CNN'leri (Convolutional Neural Networks) eğitmek çok zaman alabilir ve bu görev için çok fazla veri gereklidir. Ancak, bu sürenin büyük bir kısmı, bir ağın görüntülerden desenler çıkarmak için kullandığı en iyi düşük seviyeli filtreleri öğrenmekle harcanır. Doğal bir soru ortaya çıkar - bir veri kümesi üzerinde eğitilmiş bir sinir ağını alıp, tamamen yeniden eğitmeden farklı görüntüleri sınıflandırmak için adapte edebilir miyiz?\n", + "CNN'leri eğitmek çok zaman alabilir ve bu görev için çok fazla veri gereklidir. Ancak çoğu zaman, bir ağın görüntülerden desenler çıkarmak için kullandığı en iyi düşük seviyeli filtreleri öğrenmekle geçer. Doğal bir soru ortaya çıkar - bir veri seti üzerinde eğitilmiş bir sinir ağını kullanıp, tam eğitim süreci olmadan farklı görüntüleri sınıflandırmaya uyarlayabilir miyiz?\n", "\n", - "Bu yaklaşım **transfer öğrenimi** olarak adlandırılır, çünkü bir sinir ağı modelinden diğerine bir miktar bilgi transfer ederiz. Transfer öğreniminde genellikle büyük bir görüntü veri kümesi, örneğin **ImageNet**, üzerinde eğitilmiş bir önceden eğitilmiş modelle başlarız. Bu modeller, genel görüntülerden farklı özellikler çıkarmada zaten iyi bir iş çıkarabilir ve çoğu durumda, bu çıkarılan özelliklerin üzerine bir sınıflandırıcı inşa etmek iyi bir sonuç verebilir.\n" + "Bu yaklaşıma **transfer öğrenme** denir, çünkü bazı bilgileri bir sinir ağı modelinden diğerine aktarırız. Transfer öğrenmede, genellikle önceden eğitilmiş bir modelle başlarız; bu model, örneğin **ImageNet** gibi büyük bir görüntü veri seti üzerinde eğitilmiştir. Bu modeller, genel görüntülerden farklı özellikleri çıkarmada zaten iyi iş çıkarabilir ve birçok durumda bu çıkarılan özelliklerin üzerine bir sınıflandırıcı inşa etmek iyi bir sonuç verebilir.\n" ] }, { @@ -31,9 +31,9 @@ "source": [ "## Kediler ve Köpekler Veri Seti\n", "\n", - "Bu bölümde, kediler ve köpeklerin görüntülerini sınıflandırma gibi gerçek bir problemi çözeceğiz. Bu amaçla, [Kaggle Kediler ve Köpekler Veri Seti](https://www.kaggle.com/c/dogs-vs-cats) kullanacağız, ayrıca [Microsoft'tan](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste) indirilebilir.\n", + "Bu ünitede, kediler ve köpeklerin görüntülerini sınıflandırma gibi gerçek bir hayat problemini çözeceğiz. Bu nedenle, [Kaggle Kediler ve Köpekler Veri Seti](https://www.kaggle.com/c/dogs-vs-cats) kullanacağız, bu set aynı zamanda [Microsoft'tan da indirilebilir](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n", "\n", - "Hadi bu veri setini indirip `data` dizinine çıkaralım (bu işlem biraz zaman alabilir!):\n" + "Bu veri setini indirip `data` dizinine çıkaralım (bu işlem biraz zaman alabilir!):\n" ] }, { @@ -64,7 +64,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Ne yazık ki, veri kümesinde bazı bozuk görüntü dosyaları var. Bozuk dosyaları kontrol etmek için hızlı bir temizlik yapmamız gerekiyor. Bu eğitimi bozmamak için veri kümesini doğrulama kodunu bir modüle taşıdık.\n" + "Ne yazık ki, veri kümesinde bazı bozuk görüntü dosyaları var. Bozuk dosyaları kontrol etmek için hızlı bir temizlik yapmamız gerekiyor. Bu öğreticiyi bozmamak için, veri kümesini doğrulama kodunu bir modüle taşıdık.\n" ] }, { @@ -333,13 +333,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Veri Setini Yükleme\n", + "## Veri Kümesini Yükleme\n", "\n", - "Önceki örneklerde, Keras'a dahil edilmiş veri setlerini yüklüyorduk. Şimdi ise kendi veri setimizle çalışacağız ve bunu bir görüntü dizininden yüklememiz gerekiyor.\n", + "Önceki örneklerde, Keras'a yerleşik veri kümelerini yüklüyorduk. Şimdi ise görüntülerden oluşan bir dizinden yüklememiz gereken kendi veri kümemizle ilgileneceğiz.\n", "\n", - "Gerçek hayatta, görüntü veri setlerinin boyutu oldukça büyük olabilir ve tüm verilerin belleğe sığabileceğine güvenilemez. Bu nedenle, veri setleri genellikle eğitim için uygun minibatch'ler halinde veri döndürebilen **jeneratörler** olarak temsil edilir.\n", + "Gerçek hayatta, görüntü veri kümelerinin boyutu oldukça büyük olabilir ve tüm verilerin belleğe sığacağına güvenilemez. Bu nedenle, veri kümeleri genellikle eğitim için uygun minibatch'ler halinde veri döndürebilen **üreteçler** olarak temsil edilir.\n", "\n", - "Görüntü sınıflandırmasıyla başa çıkmak için Keras, farklı sınıflara karşılık gelen alt dizinlerden görüntüleri yükleyebilen özel bir `image_dataset_from_directory` fonksiyonunu içerir. Bu fonksiyon ayrıca görüntüleri ölçeklendirme işlemini de gerçekleştirir ve veri setini eğitim ve test alt kümelerine bölebilir:\n" + "Görüntü sınıflandırmasıyla ilgilenmek için, Keras farklı sınıflara karşılık gelen alt dizinlerden görüntüleri yükleyebilen özel `image_dataset_from_directory` işlevini içerir. Bu işlev ayrıca görüntüleri ölçeklendirme işlemini de yapar ve veri kümesini eğitim ve test alt kümelerine bölebilir:\n" ] }, { @@ -383,9 +383,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Aynı `seed` değerini her iki çağrı için de ayarlamak önemlidir, çünkü bu, görüntülerin eğitim ve test veri seti arasında nasıl bölüneceğini etkiler.\n", + "İki çağrı için de aynı `seed` değerini ayarlamak önemlidir, çünkü bu değer görüntülerin eğitim ve test veri kümeleri arasında bölünmesini etkiler.\n", "\n", - "Veri seti, sınıf adlarını otomatik olarak dizinlerden alır ve gerekirse bunlara şu şekilde erişebilirsiniz:\n" + "Veri kümesi sınıf isimlerini otomatik olarak dizinlerden alır ve gerekirse şu şekilde erişebilirsiniz:\n" ] }, { @@ -412,7 +412,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Elde ettiğimiz veri setleri, modeli eğitmek için doğrudan `fit` fonksiyonuna geçirilebilir. Bunlar, hem ilgili görüntüleri hem de etiketleri içerir ve aşağıdaki yapı kullanılarak döngüye alınabilir:\n" + "Elde ettiğimiz veri setleri, modeli eğitmek için doğrudan `fit` fonksiyonuna iletilebilir. Bunlar, aşağıdaki yapı kullanılarak döngü ile gezilebilen ilgili resimler ve etiketler içerir:\n" ] }, { @@ -453,16 +453,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "> **Not**: Veri kümesindeki tüm görüntüler, 0-255 aralığında kayan nokta tensörleri olarak temsil edilir. Bu değerleri sinir ağına geçirmeden önce 0-1 aralığına ölçeklendirmemiz gerekir. Görüntüleri çizerken, aynı işlemi yapmamız veya değerleri `int` türüne dönüştürmemiz gerekir (yukarıdaki kodda yaptığımız gibi), böylece `matplotlib`'e orijinal ölçeklenmemiş görüntüyü çizmek istediğimizi gösterebiliriz.\n" + "> **Not**: Veri kümesindeki tüm görüntüler, 0-255 aralığında kayan nokta tensörleri olarak temsil edilir. Sinir ağına geçirmeden önce, bu değerleri 0-1 aralığına ölçeklendirmemiz gerekir. Görüntüleri çizerken, ya aynı işlemi yapmamız ya da değerleri `int` türüne dönüştürmemiz gerekir (yukarıdaki kodda yaptığımız gibi), böylece `matplotlib`'e orijinal ölçeklenmemiş görüntüyü çizmek istediğimizi gösterebiliriz.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Önceden Eğitilmiş Modeller\n", + "## Önceden eğitilmiş modeller\n", "\n", - "Birçok görüntü sınıflandırma görevi için önceden eğitilmiş sinir ağı modelleri bulunabilir. Bu modellerin birçoğu `keras.applications` alanında mevcuttur ve daha fazla modele İnternet üzerinden ulaşılabilir. Şimdi en basit VGG-16 modelinin nasıl yüklendiğini ve kullanıldığını görelim:\n" + "Birçok görüntü sınıflandırma görevi için önceden eğitilmiş sinir ağı modelleri bulunabilir. Bu modellerin birçoğu `keras.applications` isim alanı içinde mevcuttur ve daha fazla model İnternette bulunabilir. En basit VGG-16 modelinin nasıl yükleneceğine ve kullanılacağına bakalım:\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": [ "Burada birkaç önemli nokta var:\n", - "* Herhangi bir önceden eğitilmiş ağın girişine bir veri göndermeden önce, belirli bir şekilde ön işleme yapılması gerekir. Bu işlem, ilgili `preprocess_input` fonksiyonunu çağırarak gerçekleştirilir. Bu fonksiyon, bir görüntü grubunu alır ve onların işlenmiş halini geri döndürür. VGG-16 durumunda, görüntüler normalize edilir ve her kanal için önceden tanımlanmış bir ortalama değer çıkarılır. Bunun nedeni, VGG-16'nın başlangıçta bu ön işleme ile eğitilmiş olmasıdır.\n", - "* Sinir ağı, giriş grubuna uygulanır ve sonuç olarak her sınıfın olasılığını gösteren 1000 öğeli tensörlerden oluşan bir grup elde ederiz. Bu tensör üzerinde `argmax` çağrılarak en olası sınıf numarasını bulabiliriz.\n", - "* Elde edilen sonuç bir [`ImageNet` sınıf numarasıdır](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Bu sonucu anlamlandırmak için, `decode_predictions` fonksiyonunu kullanabiliriz. Bu fonksiyon, en üst n sınıfı ve onların isimlerini birlikte döndürür.\n" + "* Önceden eğitilmiş herhangi bir ağa girdi vermeden önce, belirli bir şekilde ön işleme tabi tutulması gerekir. Bu, bir dizi görüntüyü alan ve işlenmiş biçimlerini döndüren ilgili `preprocess_input` fonksiyonunun çağrılmasıyla yapılır. VGG-16 durumu için, görüntüler normalize edilir ve her kanal için önceden tanımlanmış ortalama bir değer çıkarılır. Bunun sebebi, VGG-16'nın orijinal olarak bu ön işleme ile eğitilmiş olmasıdır.\n", + "* Sinir ağı girdi dizisine uygulanır ve sonuç olarak her sınıfın olasılığını gösteren 1000 öğeli tensörler dizisi elde edilir. Bu tensör üzerinde `argmax` çağrısı yaparak en olası sınıf numarasını bulabiliriz.\n", + "* Elde edilen sonuç bir [ImageNet sınıfının numarasıdır](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Bu sonucu anlamlandırmak için, en üst n sınıfı ve isimlerini döndüren `decode_predictions` fonksiyonunu da kullanabiliriz.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Haydi VGG-16 ağının mimarisini de görelim:\n" + "VGG-16 ağının mimarisine de bakalım:\n" ] }, { @@ -599,7 +609,7 @@ "source": [ "## GPU hesaplamaları\n", "\n", - "VGG-16 ve diğer daha modern mimariler gibi derin sinir ağları, çalıştırılmak için oldukça fazla hesaplama gücü gerektirir. Eğer mevcutsa, GPU hızlandırmasını kullanmak mantıklıdır. Neyse ki, Keras, GPU mevcut olduğunda hesaplamaları otomatik olarak hızlandırır. Tensorflow'un GPU kullanıp kullanamadığını aşağıdaki kod ile kontrol edebiliriz:\n" + "VGG-16 gibi derin sinir ağları ve diğer daha modern mimariler çalıştırmak için oldukça fazla hesaplama gücü gerektirir. Mümkünse GPU hızlandırması kullanmak mantıklıdır. Neyse ki, Keras eğer varsa GPU üzerinde hesaplamaları otomatik olarak hızlandırır. Tensorflow'un GPU kullanıp kullanamadığını aşağıdaki kod ile kontrol edebiliriz:\n" ] }, { @@ -626,9 +636,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## VGG Özelliklerini Çıkarmak\n", "\n", - "Eğer VGG-16'yı görüntülerimizden özellik çıkarmak için kullanmak istiyorsak, son sınıflandırma katmanları olmadan modele ihtiyacımız var. Üst katmanlar olmadan VGG-16 modelini şu kodla oluşturabiliriz:\n" + "## VGG özelliklerini çıkarma\n", + "\n", + "Görüntülerimizden özellik çıkarmak için VGG-16 modelini kullanmak istiyorsak, son sınıflandırma katmanları olmayan modele ihtiyacımız var. VGG-16 modelini üst katmanlar olmadan bu kodu kullanarak oluşturabiliriz:\n" ] }, { @@ -680,9 +691,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Özellik tensörünün boyutu 7x7x512, ancak bunu görselleştirebilmek için 2D forma dönüştürmemiz gerekti.\n", + "Özellik tensörünün boyutu 7x7x512, ancak bunu görselleştirmek için yeniden şekillendirerek 2B forma getirmemiz gerekti.\n", "\n", - "Şimdi bu özelliklerin görüntüleri sınıflandırmak için kullanılıp kullanılamayacağını görelim. Manuel olarak bazı görüntüleri (bizim durumumuzda 50 minibatch) alıp, bunların özellik vektörlerini önceden hesaplayalım. Bunun için Tensorflow **dataset** API'sini kullanabiliriz. `map` fonksiyonu bir veri kümesini alır ve verilen lambda fonksiyonunu uygulayarak onu dönüştürür. Bu mekanizmayı kullanarak, orijinal görüntüler yerine VGG tarafından çıkarılan özellikleri içeren yeni veri kümeleri, `ds_features_train` ve `ds_features_test`, oluşturuyoruz.\n" + "Şimdi bu özelliklerin görüntü sınıflandırmak için kullanılıp kullanılamayacağını görelim. Görüntülerin bir bölümünü (bizim örneğimizde 50 mini parti) manuel olarak alıp, özellik vektörlerini önceden hesaplayacağız. Bunu yapmak için Tensorflow **dataset** API'sini kullanabiliriz. `map` fonksiyonu, bir veri setini alır ve onu dönüştürmek için verilen lambda fonksiyonunu uygular. Bu mekanizmayı, orijinal görüntüler yerine VGG tarafından çıkarılmış özellikleri içeren yeni veri setleri `ds_features_train` ve `ds_features_test` oluşturmak için kullanıyoruz.\n" ] }, { @@ -712,9 +723,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Veri kümesini sınırlamak ve gösterimizi hızlandırmak için `.take(50)` yapısını kullandık. Elbette bu deneyi tam veri kümesi üzerinde gerçekleştirebilirsiniz.\n", + "Hızlı bir gösterim yapmak için veri seti boyutunu sınırlamak adına `.take(50)` yapısını kullandık. Elbette bu deneyi tam veri seti üzerinde gerçekleştirebilirsiniz.\n", "\n", - "Artık çıkarılmış özelliklere sahip bir veri kümesine sahibiz, kediler ve köpekler arasında ayrım yapmak için basit bir yoğun sınıflandırıcı eğitebiliriz. Bu ağ, (7,7,512) şeklindeki özellik vektörünü alacak ve bir köpeğe veya bir kediye karşılık gelen bir çıktı üretecek. Bu bir ikili sınıflandırma olduğu için `sigmoid` aktivasyon fonksiyonunu ve `binary_crossentropy` kaybını kullanıyoruz.\n" + "Artık çıkarılmış özelliklere sahip bir veri setimiz olduğuna göre, kediler ve köpekler arasında ayırt yapacak basit bir yoğun sınıflandırıcı eğitebiliriz. Bu ağ, şekli (7,7,512) olan özellik vektörünü alacak ve köpek ya da kediye karşılık gelen tek bir çıktı üretecektir. İkili sınıflandırma olduğu için `sigmoid` aktivasyon fonksiyonu ile `binary_crossentropy` kaybını kullanıyoruz.\n" ] }, { @@ -743,13 +754,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Sonuç harika, bir kedi ile köpeği neredeyse %95 olasılıkla ayırt edebiliyoruz! Ancak, bu yaklaşımı yalnızca tüm görüntülerin bir alt kümesinde test ettik, çünkü manuel özellik çıkarımı oldukça zaman alıyor gibi görünüyor.\n", + "Sonuç mükemmel, neredeyse %95 olasılıkla bir kediyi ve köpeği ayırt edebiliyoruz! Ancak, bu yaklaşımı tüm görüntülerin yalnızca bir alt kümesi üzerinde test ettik, çünkü manuel özellik çıkarımı çok zaman alıyor gibi görünüyor.\n", "\n", - "## Bir VGG ağı kullanarak transfer öğrenimi\n", + "## Bir VGG ağı kullanarak transfer öğrenme\n", "\n", - "Manuel olarak özellikleri önceden hesaplamaktan kaçınmak için, eğitim sırasında orijinal VGG-16 ağını bir bütün olarak kullanabiliriz. Bunun için ağımıza bir özellik çıkarıcıyı ilk katman olarak ekleyebiliriz.\n", + "Eğitim sırasında özellik çıkarıcıyı ağımızın ilk katmanı olarak ekleyerek, orijinal VGG-16 ağını bütünüyle kullanarak özellikleri manuel olarak önceden hesaplamaktan da kaçınabiliriz.\n", "\n", - "Keras mimarisinin güzelliği, yukarıda tanımladığımız VGG-16 modelinin başka bir sinir ağı içinde bir katman olarak da kullanılabilmesidir! Tek yapmamız gereken, üzerine yoğun bir sınıflandırıcı ekleyerek bir ağ oluşturmak ve ardından tüm ağı geri yayılım kullanarak eğitmek.\n" + "Keras mimarisinin güzelliği, yukarıda tanımladığımız VGG-16 modelinin başka bir sinir ağında bir katman olarak da kullanılabilmesidir! Üstüne yoğun bir sınıflandırıcı olan bir ağ oluşturup ardından tüm ağı geri yayılım kullanarak eğitmemiz yeterlidir.\n" ] }, { @@ -793,13 +804,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Bu model, bir görüntüyü alıp sınıfını döndüren uçtan uca bir sınıflandırma ağı gibi görünüyor. Ancak, burada zor olan şey, VGG16'nın bir özellik çıkarıcı olarak çalışmasını istememiz ve yeniden eğitilmemesi gerektiğidir. Bu nedenle, **konvolüsyonel özellik çıkarıcının ağırlıklarını dondurmamız** gerekiyor. Ağın ilk katmanına `model.layers[0]` çağrısıyla erişebiliriz ve sadece `trainable` özelliğini `False` olarak ayarlamamız yeterlidir.\n", + "Bu model, bir resmi alıp sınıfını döndüren uçtan uca bir sınıflandırma ağı gibi görünüyor. Ancak, işin püf noktası, VGG16'nın bir özellik çıkarıcı olarak çalışmasını istememiz ve yeniden eğitilmemesi gerektiğidir. Bu nedenle, **evrişimsel özellik çıkarıcının ağırlıklarını dondurmamız** gerekiyor. Ağa ilk katmana `model.layers[0]` çağrısıyla erişebiliriz ve sadece `trainable` özelliğini `False` olarak ayarlamamız yeterlidir. \n", "\n", - "> **Not**: Özellik çıkarıcının ağırlıklarının dondurulması gereklidir, çünkü aksi takdirde eğitilmemiş sınıflandırıcı katmanı, konvolüsyonel çıkarıcının önceden eğitilmiş ağırlıklarını bozabilir.\n", + "> **Not**: Özellik çıkarıcının ağırlıklarının dondurulması gereklidir çünkü aksi halde eğitilmemiş sınıflandırıcı katmanı, önceden eğitilmiş evrişimsel çıkarıcının orijinal ağırlıklarını bozabilir. \n", "\n", - "Ağımızdaki toplam parametre sayısının yaklaşık 15 milyon olduğunu fark edebilirsiniz, ancak yalnızca 25 bin parametreyi eğitiyoruz. Üst düzey konvolüsyonel filtrelerin diğer tüm parametreleri önceden eğitilmiştir. Bu iyi bir şey, çünkü daha az sayıda parametreyi daha az sayıda örnekle ince ayar yapabiliyoruz.\n", + "Ağımızdaki toplam parametre sayısının yaklaşık 15 milyon civarında olduğunu fark edebilirsiniz, ancak sadece 25 bin parametreyi eğitiyoruz. Üst düzey evrişimsel filtrelerin diğer tüm parametreleri önceden eğitilmiştir. Bu iyidir çünkü daha az sayıda parametreyi daha az sayıda örnekle ince ayar yapabiliyoruz. \n", "\n", - "Şimdi ağımızı eğiteceğiz ve ne kadar iyi sonuç alabileceğimizi göreceğiz. Oldukça uzun bir çalışma süresi bekleyin ve yürütme bir süre donmuş gibi görünüyorsa endişelenmeyin.\n" + "Şimdi ağımızı eğiteceğiz ve ne kadar iyi sonuç alabileceğimize bakacağız. Oldukça uzun bir çalışma süresi bekleyin ve yürütmenin bir süre donmuş gibi görünmesi sizi endişelendirmesin. \n" ] }, { @@ -824,7 +835,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Görünüşe göre oldukça doğru bir kedi ve köpek sınıflandırıcısı elde ettik!\n", + "Görünüşe göre oldukça doğru bir kedi ve köpek sınıflandırıcı elde ettik! \n", "\n", "## Modeli Kaydetme ve Yükleme\n", "\n", @@ -852,7 +863,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Modeli dosyadan istediğiniz zaman yükleyebiliriz. Bir sonraki deneyin modeli bozması durumunda faydalı bulabilirsiniz - baştan başlamanız gerekmez.\n" + "Modeli istediğiniz zaman dosyadan yükleyebilirsiniz. Sonraki deneyi model bozarsa bunu faydalı bulabilirsiniz - sıfırdan yeniden başlamanız gerekmez.\n" ] }, { @@ -868,15 +879,15 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Transfer öğrenimini ince ayar yapma\n", + "## İnce Ayar Transfer Öğrenimi\n", "\n", - "Önceki bölümde, kendi veri setimizdeki görüntüleri sınıflandırmak için son sınıflandırıcı katmanını eğittik. Ancak, özellik çıkarıcıyı yeniden eğitmedik ve modelimiz ImageNet verilerinde öğrendiği özelliklere güvendi. Eğer nesneleriniz sıradan ImageNet görüntülerinden görsel olarak farklıysa, bu özellik kombinasyonu en iyi şekilde çalışmayabilir. Bu nedenle, evrişimli katmanları da eğitmeye başlamak mantıklı olacaktır.\n", + "Önceki bölümde, kendi veri setimizdeki görüntüleri sınıflandırmak için son sınıflandırıcı katmanı eğittik. Ancak, özellik çıkarıcıyı yeniden eğitmedik ve modelimiz, ImageNet verisinde öğrenilen özelliklere dayanıyordu. Nesneleriniz sıradan ImageNet görüntülerinden görsel olarak farklıysa, bu özellik kombinasyonu en iyi sonuç vermeyebilir. Bu nedenle, konvolüsyonel katmanların da eğitilmeye başlanması mantıklıdır.\n", "\n", - "Bunu yapmak için, daha önce dondurduğumuz evrişimli filtre parametrelerini serbest bırakabiliriz.\n", + "Bunu yapmak için, daha önce dondurduğumuz konvolüsyonel filtre parametrelerini çözebiliriz.\n", "\n", - "> **Not:** Öncelikle parametreleri dondurmanız ve sınıflandırma katmanındaki ağırlıkları stabilize etmek için birkaç eğitim döngüsü gerçekleştirmeniz önemlidir. Eğer parametreleri serbest bırakılmış bir şekilde uçtan uca ağ eğitimine hemen başlarsanız, büyük hatalar evrişimli katmanlardaki önceden eğitilmiş ağırlıkları bozabilir.\n", + "> **Not:** Öncelikle parametreleri dondurmak ve sınıflandırma katmanında ağırlıkları dengelemek için birkaç epoch eğitim yapmak önemlidir. Parametreleri dondurmadan uçtan uca ağın hemen eğitilmesine başlanırsa, büyük hatalar konvolüsyonel katmanlardaki önceden eğitilmiş ağırlıkları bozabilir.\n", "\n", - "Evrişimli VGG-16 modelimiz ilk katmanın içinde yer alıyor ve kendi içinde birçok katmandan oluşuyor. Yapısına bir göz atabiliriz:\n" + "Konvolüsyonel VGG-16 modelimiz ilk katmanın içinde yer almakta ve kendi içerisinde birçok katmandan oluşmaktadır. Yapısına bir göz atabiliriz:\n" ] }, { @@ -945,7 +956,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Konvolüsyonel tabanın tüm katmanlarını çözebiliriz:\n" + "Konvolüsyon tabanının tüm katmanlarını çözebiliriz:\n" ] }, { @@ -961,7 +972,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Ancak, hepsini birden çözmek en iyi fikir değildir. Öncelikle sadece birkaç son konvolüsyon katmanını çözebiliriz, çünkü bunlar görüntülerimiz için ilgili olan daha yüksek seviyeli desenleri içerir. Örneğin, başlangıç olarak, son 4 katman hariç tüm katmanları dondurabiliriz:\n" + "Ancak, hepsini birden çözmek en iyi fikir değil. Öncelikle, görüntülerimizle ilgili daha yüksek seviyedeki desenleri içeren sadece birkaç son katmanı çözebiliriz. Örneğin, işe başlamak için, son 4 katman hariç tüm katmanları dondurabiliriz: \n" ] }, { @@ -1000,11 +1011,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Eğitilebilir parametrelerin sayısının önemli ölçüde arttığını gözlemleyin, ancak yine de tüm parametrelerin yaklaşık %50'si civarında.\n", + "Eğitilebilir parametre sayısının önemli ölçüde arttığını gözlemleyin, ancak hala tüm parametrelerin yaklaşık %50'si civarındadır.\n", "\n", - "Dondurma işlemini kaldırdıktan sonra, birkaç dönem daha eğitim yapabiliriz (örneğimizde sadece bir dönem yapacağız). Ayrıca, önceden eğitilmiş ağırlıklar üzerindeki etkileri en aza indirmek için daha düşük bir öğrenme oranı seçebilirsiniz. Ancak, düşük öğrenme oranıyla bile, eğitimin başlangıcında doğruluğun düşmesini bekleyebilirsiniz; bu durum, sabit ağırlıklar durumuna kıyasla biraz daha yüksek bir seviyeye ulaşana kadar devam eder.\n", + "Dondurmayı kaldırdıktan sonra, birkaç epoch daha eğitim yapabiliriz (örneğimizde sadece bir tane yapacağız). Önceden eğitilmiş ağırlıklar üzerindeki etkisini en aza indirmek için daha düşük öğrenme oranı da seçebilirsiniz. Ancak, düşük öğrenme oranıyla bile, eğitim başladığında doğruluğun düşmesini bekleyebilirsiniz; sonunda sabit ağırlıklar durumundan biraz daha yüksek bir seviyeye ulaşır.\n", "\n", - "> **Not:** Bu eğitim çok daha yavaş gerçekleşir, çünkü ağın birçok katmanı boyunca gradyanları geri yaymamız gerekir!\n" + "> **Not:** Bu eğitim çok daha yavaş gerçekleşir, çünkü ağırlıkları birçok katman boyunca geriye doğru yaymamız gerekir!\n" ] }, { @@ -1028,18 +1039,18 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Daha güçlü bir ağ ve daha fazla parametre kullandığımız için muhtemelen daha yüksek bir eğitim doğruluğu elde edeceğiz, ancak doğrulama doğruluğu bu kadar artmayabilir.\n", + "Daha fazla parametreye sahip daha güçlü bir ağ kullandığımız için muhtemelen daha yüksek eğitim doğruluğuna ulaşacağız, ancak doğrulama doğruluğu o kadar artmayacaktır.\n", "\n", - "Ağın birkaç katmanını daha serbest bırakıp daha fazla eğiterek daha yüksek bir doğruluk elde edip edemeyeceğinizi görmekten çekinmeyin!\n" + "Daha yüksek doğruluk elde edip edemeyeceğinizi görmek için ağın birkaç katmanını daha serbest bırakıp daha fazla eğitmekten çekinmeyin!\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Diğer bilgisayarlı görü modelleri\n", + "## Diğer bilgisayarla görme modelleri\n", "\n", - "VGG-16, en basit bilgisayarlı görü mimarilerinden biridir. Keras, birçok başka önceden eğitilmiş ağ sunar. Bunlar arasında en sık kullanılanlar, Microsoft tarafından geliştirilen **ResNet** mimarileri ve Google tarafından geliştirilen **Inception** modelidir. Örneğin, en basit ResNet-50 modelinin mimarisini inceleyelim (ResNet, farklı derinliklere sahip bir model ailesidir; gerçekten derin bir modelin nasıl göründüğünü görmek isterseniz ResNet-152 ile denemeler yapabilirsiniz):\n" + "VGG-16, en basit bilgisayarla görme mimarilerinden biridir. Keras birçok daha fazla önceden eğitilmiş ağ sağlar. Bunlar arasında en sık kullanılanlar Microsoft tarafından geliştirilen **ResNet** mimarileri ve Google tarafından geliştirilen **Inception**dır. Örneğin, en basit ResNet-50 modelinin mimarisini keşfedelim (ResNet, farklı derinlikte modellere sahip bir aile olup, gerçekten derin bir modelin nasıl göründüğünü görmek isterseniz ResNet-152 ile deneme yapabilirsiniz):\n" ] }, { @@ -1441,29 +1452,29 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Modelin, aynı tanıdık yapı taşlarını içerdiğini görebilirsiniz: evrişim katmanları, havuzlama katmanları ve son yoğun sınıflandırıcı. Bu modeli, transfer öğrenimi için VGG-16'yı kullandığımız şekilde tam olarak aynı şekilde kullanabiliriz. Yukarıdaki kodla farklı ResNet modellerini temel model olarak kullanarak denemeler yapabilir ve doğruluğun nasıl değiştiğini görebilirsiniz.\n", + "Gördüğünüz gibi, model aynı tanıdık yapı taşlarını içeriyor: konvolüsyon katmanları, havuzlama katmanları ve son yoğun sınıflandırıcı. Bu modeli tam olarak VGG-16'yı transfer öğrenimi için kullandığımız şekilde kullanabiliriz. Yukarıdaki kodla farklı ResNet modellerini temel model olarak kullanarak denemeler yapabilir ve doğruluğun nasıl değiştiğini görebilirsiniz.\n", "\n", - "## Batch Normalization (Toplu Normalizasyon)\n", + "## Batch Normalization\n", "\n", - "Bu ağ, başka bir katman türü daha içerir: **Batch Normalization (Toplu Normalizasyon)**. Toplu normalizasyon fikri, sinir ağı boyunca akan değerleri doğru aralığa getirmektir. Genellikle sinir ağları, tüm değerler [-1,1] veya [0,1] aralığında olduğunda en iyi şekilde çalışır ve bu nedenle giriş verilerimizi buna göre ölçeklendirir/normallaştiririz. Ancak, derin bir ağın eğitimi sırasında, değerlerin bu aralıktan önemli ölçüde çıkması durumu oluşabilir ve bu da eğitimi sorunlu hale getirir. Toplu normalizasyon katmanı, mevcut minibatch'teki tüm değerler için ortalama ve standart sapmayı hesaplar ve sinyali bir sinir ağı katmanından geçirmeden önce normalleştirmek için bunları kullanır. Bu, derin ağların kararlılığını önemli ölçüde artırır.\n" + "Bu ağ ayrıca başka bir tür katman içeriyor: **Batch Normalization** (Toplu Normalizasyon). Batch normalization’ın amacı, sinir ağı boyunca akan değerleri doğru aralığa getirmektir. Genellikle sinir ağları en iyi performansı, tüm değerler [-1,1] veya [0,1] aralığında olduğunda gösterir ve bu yüzden giriş verilerimizi uygun şekilde ölçeklendirir/normalleştiririz. Ancak derin bir ağın eğitimi sırasında, değerlerin bu aralığın çok dışına çıkması olabilir ki bu da eğitimi problematik hale getirir. Batch normalization katmanı tüm mevcut minibatch’in ortalamasını ve standart sapmasını hesaplar ve sinyali bir sinir ağı katmanından geçirmeden önce bunları kullanarak normalleştirir. Bu, derin ağların kararlılığını önemli ölçüde artırır.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Özet\n", + "## Çıkarım\n", "\n", - "Transfer öğrenimini kullanarak, özel nesne sınıflandırma görevimiz için hızlı bir şekilde bir sınıflandırıcı oluşturmayı başardık ve yüksek doğruluk elde ettik. Ancak, bu örnek tamamen adil değildi çünkü orijinal VGG-16 ağı, kedileri ve köpekleri tanımak için önceden eğitilmişti ve bu nedenle ağda zaten mevcut olan desenlerin çoğunu yeniden kullanıyorduk. Bir fabrikadaki üretim hattındaki detaylar veya farklı ağaç yaprakları gibi daha egzotik ve alanına özgü nesnelerde daha düşük doğruluk bekleyebilirsiniz.\n", + "Transfer öğrenmeyi kullanarak, özel nesne sınıflandırma görevimiz için hızlıca bir sınıflandırıcı oluşturduk ve yüksek doğruluk elde ettik. Ancak, bu örnek tamamen adil değildi çünkü orijinal VGG-16 ağı, kedileri ve köpekleri tanımak için önceden eğitilmişti; dolayısıyla ağda zaten bulunan çoğu kalıbı tekrar kullanmış olduk. Bir tesisin üretim hattındaki detaylar veya farklı ağaç yaprakları gibi daha egzotik, alan-spesifik nesnelerde daha düşük doğruluk bekleyebilirsiniz.\n", "\n", - "Gördüğünüz gibi, şu anda çözdüğümüz daha karmaşık görevler daha yüksek hesaplama gücü gerektiriyor ve CPU üzerinde kolayca çözülemiyor. Bir sonraki bölümde, aynı modeli daha düşük hesaplama kaynakları kullanarak eğitmek için daha hafif bir uygulama kullanmayı deneyeceğiz ve bu, yalnızca biraz daha düşük doğrulukla sonuçlanacak.\n" + "Şu anda çözdüğümüz daha karmaşık görevlerin daha yüksek hesaplama gücü gerektirdiğini ve CPU üzerinde kolayca çözülemeyeceğini görebilirsiniz. Bir sonraki bölümde, biraz daha düşük doğrulukla sonuçlanan aynı modeli daha az hesaplama kaynağı kullanarak eğitmek için daha hafif bir uygulama kullanmayı deneyeceğiz.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**Feragatname**: \nBu belge, AI çeviri hizmeti [Co-op Translator](https://github.com/Azure/co-op-translator) kullanılarak çevrilmiştir. Doğruluk için çaba göstersek de, otomatik çevirilerin hata veya yanlışlıklar içerebileceğini lütfen unutmayın. Belgenin orijinal dili, yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi önerilir. Bu çevirinin kullanımından kaynaklanan yanlış anlamalar veya yanlış yorumlamalar için sorumluluk kabul etmiyoruz.\n" + "---\n\n\n**Feragatname**:\nBu belge, AI çeviri hizmeti [Co-op Translator](https://github.com/Azure/co-op-translator) kullanılarak çevrilmiştir. Doğruluk için çaba sarf etsek de, otomatik çevirilerin hata veya yanlışlık içerebileceğini lütfen unutmayınız. Orijinal belge, kendi dilinde yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi önerilir. Bu çevirinin kullanımı sonucu ortaya çıkabilecek yanlış anlamalardan veya yanlış yorumlamalardan sorumlu değiliz.\n\n" ] } ], @@ -1484,12 +1495,6 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" - }, - "coopTranslator": { - "original_hash": "c189abc107848f96051085cc30945129", - "translation_date": "2025-08-28T13:06:11+00:00", - "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", - "language_code": "tr" } }, "nbformat": 4, diff --git a/translations/tr/lessons/5-NLP/README.md b/translations/tr/lessons/5-NLP/README.md index e57ff4c9d9..accaf3383f 100644 --- a/translations/tr/lessons/5-NLP/README.md +++ b/translations/tr/lessons/5-NLP/README.md @@ -1,51 +1,51 @@ # Doğal Dil İşleme -![NLP görevlerinin bir çizimi](../../../../translated_images/tr/ai-nlp.b22dcb8ca4707cea.webp) +![Bir çizimdeki NLP görevlerinin özeti](../../../../translated_images/tr/ai-nlp.b22dcb8ca4707cea.webp) -Bu bölümde, **Doğal Dil İşleme (NLP)** ile ilgili görevleri çözmek için Sinir Ağlarını kullanmaya odaklanacağız. Bilgisayarların çözmesini istediğimiz birçok NLP problemi bulunmaktadır: +Bu bölümde, **Doğal Dil İşleme (NLP)** ile ilgili görevleri ele almak için Sinir Ağları kullanmaya odaklanacağız. Bilgisayarların çözebilmesini istediğimiz birçok NLP problemi vardır: -* **Metin sınıflandırma**, metin dizileriyle ilgili tipik bir sınıflandırma problemidir. Örnekler arasında e-posta mesajlarını spam veya spam değil olarak sınıflandırmak ya da makaleleri spor, iş, politika gibi kategorilere ayırmak yer alır. Ayrıca, sohbet botları geliştirirken, genellikle bir kullanıcının ne söylemek istediğini anlamamız gerekir -- bu durumda **niyet sınıflandırması** ile ilgileniyoruz. Niyet sınıflandırmasında genellikle birçok kategoriyle uğraşmamız gerekir. -* **Duygu analizi**, bir cümlenin anlamının ne kadar olumlu/olumsuz olduğunu belirten bir sayı (duygu) atamamız gereken tipik bir regresyon problemidir. Duygu analizinin daha gelişmiş bir versiyonu olan **özellik tabanlı duygu analizi** (ABSA), duygu durumunu tüm cümleye değil, farklı bölümlerine (özelliklere) atar, örneğin: *Bu restoranda mutfağı beğendim, ama atmosfer berbattı*. -* **Adlandırılmış Varlık Tanıma** (NER), metinden belirli varlıkları çıkarmakla ilgilidir. Örneğin, *Yarın Paris'e uçmam gerekiyor* cümlesinde *yarın* kelimesinin TARİH'e, *Paris* kelimesinin ise KONUM'a atıfta bulunduğunu anlamamız gerekebilir. -* **Anahtar kelime çıkarımı**, NER'e benzer, ancak belirli varlık türleri için önceden eğitim yapmadan, cümlenin anlamı için önemli olan kelimeleri otomatik olarak çıkarmamız gerekir. -* **Metin kümeleme**, benzer cümleleri bir araya getirmek istediğimizde faydalı olabilir, örneğin teknik destek konuşmalarında benzer talepleri gruplamak. -* **Soru yanıtlama**, bir modelin belirli bir soruya yanıt verebilme yeteneğini ifade eder. Model, bir metin parçası ve bir soruyu giriş olarak alır ve sorunun cevabının metinde bulunduğu yeri sağlaması (veya bazen cevap metnini oluşturması) gerekir. -* **Metin oluşturma**, bir modelin yeni metin oluşturma yeteneğidir. Bu, bir *metin ipucu* temelinde bir sonraki harf/kelimeyi tahmin eden bir sınıflandırma görevi olarak düşünülebilir. GPT-3 gibi gelişmiş metin oluşturma modelleri, [ipucu programlama](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) veya [ipucu mühendisliği](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29) adı verilen bir teknik kullanarak sınıflandırma gibi diğer NLP görevlerini çözebilir. -* **Metin özetleme**, bir bilgisayarın uzun bir metni "okuyup" birkaç cümleyle özetlemesini istediğimiz bir tekniktir. -* **Makine çevirisi**, bir dildeki metni anlamayı ve başka bir dilde metin oluşturmayı birleştiren bir görev olarak görülebilir. +* **Metin sınıflandırması**, metin dizileriyle ilgili tipik bir sınıflandırma problemidir. Örnekler arasında e-posta mesajlarını spam ve spam olmayan olarak sınıflandırmak ya da makaleleri spor, iş, politika gibi kategorilere ayırmak vardır. Ayrıca, sohbet botları geliştirirken, bir kullanıcının ne söylemek istediğini anlamamız gerekir - bu durumda **niyet sınıflandırması** ile ilgileniyoruz. Niyet sınıflandırmasında genellikle birçok kategoriyle başa çıkmamız gerekir. +* **Duygu analizi**, tipik bir regresyon problemidir; burada bir cümlenin anlamının ne kadar olumlu/olumsuz olduğunu ifade eden bir sayı (duygu) atamamız gerekir. Duygu analizinin daha gelişmiş bir versiyonu, tüm cümleye değil, cümlenin farklı bölümlerine (yönlere) duygu atadığımız **yönebazlı duygu analizi** (ABSA)dır, örneğin *Bu restoranda mutfağı sevdim, ama atmosfer berbattı*. +* **Adlandırılmış Varlık Tanıma** (NER), metinden belirli varlıkları çıkarmakla ilgilidir. Örneğin, *Yarın Paris'e uçmam gerekiyor* ifadesinde *yarın* kelimesinin TARİH, *Paris* kelimesinin KONUM olduğunu anlamamız gerekebilir. +* **Anahtar kelime çıkarımı** NER'e benzer, ancak belirli varlık türleri için önceden eğitim almadan, cümlenin anlamı için önemli kelimeleri otomatik olarak çıkarmamız gerekir. +* **Metin kümeleme**, benzer cümleleri bir araya getirmek istediğimizde faydalı olabilir; örneğin, teknik destek konuşmalarındaki benzer talepler. +* **Soru yanıtlama**, bir modelin belirli bir soruya cevap verme yeteneğine denir. Model bir metin parçası ve bir soru alır, ardından sorunun cevabının bulunduğu metin yerini sağlaması (veya bazen cevap metnini üretmesi) gerekir. +* **Metin üretimi**, bir modelin yeni metin oluşturma yeteneğidir. Bu, bir *metin istemi* temelinde bir sonraki harfi/kelimeyi tahmin eden bir sınıflandırma görevi olarak düşünülebilir. GPT-3 gibi gelişmiş metin üretim modelleri, [prompt programlama](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) veya [prompt mühendisliği](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29) olarak adlandırılan bir teknik kullanarak sınıflandırma gibi diğer NLP görevlerini de çözebilir. +* **Metin özetleme**, uzun bir metni "okuyup" birkaç cümleye özetlemek istediğimiz bir tekniktir. +* **Makine çevirisi**, bir dildeki metni anlama ve başka bir dilde metin üretme birleşimi olarak görülebilir. -Başlangıçta, çoğu NLP görevi dilbilgisi gibi geleneksel yöntemlerle çözülüyordu. Örneğin, makine çevirisinde, başlangıç cümlesi bir sözdizimi ağacına dönüştürmek için ayrıştırıcılar kullanılıyor, ardından cümlenin anlamını temsil etmek için daha yüksek seviyeli anlamsal yapılar çıkarılıyor ve bu anlam ve hedef dilin dilbilgisine dayanarak sonuç oluşturuluyordu. Günümüzde, birçok NLP görevi sinir ağları kullanılarak daha etkili bir şekilde çözülmektedir. +Başlangıçta, çoğu NLP görevi dil bilgisi gibi geleneksel yöntemlerle çözülüyordu. Örneğin makine çevirisinde parsers, ilk cümleyi sözdizimi ağacına dönüştürmek için kullanılır, sonra cümlenin anlamını temsil eden daha yüksek düzeyde anlamsal yapılar çıkarılırdı ve bu anlama ile hedef dilin dil bilgisi temel alınarak sonuç oluşturulurdu. Günümüzde birçok NLP görevi sinir ağları kullanılarak daha etkili şekilde çözülmektedir. -> Birçok klasik NLP yöntemi, [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org) Python kütüphanesinde uygulanmıştır. Farklı NLP görevlerinin NLTK kullanılarak nasıl çözülebileceğini kapsayan harika bir [NLTK Kitabı](https://www.nltk.org/book/) çevrimiçi olarak mevcuttur. +> Birçok klasik NLP yöntemi, [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org) Python kitaplığında uygulanmıştır. Çevrimiçi erişilebilen harika bir [NLTK Kitabı](https://www.nltk.org/book/) vardır ve kitap NLTK ile farklı NLP görevlerinin nasıl çözülebileceğini kapsar. -Kursumuzda, çoğunlukla NLP için Sinir Ağlarını kullanmaya odaklanacağız ve gerektiğinde NLTK kullanacağız. +Kursumuzda çoğunlukla NLP için Sinir Ağları kullanmaya odaklanacağız ve gerektiğinde NLTK kullanacağız. -Tablo verileri ve görüntülerle çalışmak için sinir ağlarını kullanmayı zaten öğrendik. Bu veri türleri ile metin arasındaki temel fark, metnin değişken uzunlukta bir dizi olmasıdır, oysa görüntülerde giriş boyutu önceden bilinir. Konvolüsyonel ağlar giriş verilerinden desenler çıkarabilirken, metindeki desenler daha karmaşıktır. Örneğin, olumsuzluk, özneyle birçok kelime arasında ayrılabilir (örneğin: *Portakalları sevmiyorum* ile *O büyük renkli lezzetli portakalları sevmiyorum*), ve bu yine de tek bir desen olarak yorumlanmalıdır. Bu nedenle, dili işlemek için *tekrarlayan ağlar* ve *dönüştürücüler* gibi yeni sinir ağı türlerini tanıtmamız gerekir. +Daha önce tablolarla ve görüntülerle çalışmak için sinir ağlarını kullanmayı öğrendik. Bu tür veriler ile metin arasındaki temel fark, metnin değişken uzunlukta bir dizi olmasıdır, oysa görüntülerde giriş boyutu önceden bellidir. Konvolüsyonel ağlar giriş verisinden desenler çıkarabilirken, metindeki desenler daha karmaşıktır. Örneğin, olumsuzlama çok kelimeden ayrılarak gelebilir (örn. *Portakalları sevmiyorum* vs. *O büyük renkli lezzetli portakalları sevmiyorum*), ama bu hala tek bir desen olarak yorumlanmalıdır. Bu yüzden dil işlemek için *geri dönüşümlü ağlar* ve *transformerlar* gibi yeni sinir ağı türleri getirmeliyiz. ## Kütüphaneleri Yükleme -Bu kursu yerel bir Python kurulumunda çalıştırıyorsanız, NLP için gerekli tüm kütüphaneleri aşağıdaki komutlarla yüklemeniz gerekebilir: +Bu kursu yerel Python kurulumuyla çalıştırıyorsanız, NLP için gereken tüm kütüphaneleri aşağıdaki komutlarla yüklemeniz gerekebilir: **PyTorch için** ```bash -pip install -r requirements-torch.txt +pip install -r requirements-pytorch.txt ``` **TensorFlow için** ```bash pip install -r requirements-tf.txt ``` -> TensorFlow ile NLP'yi [Microsoft Learn](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste) üzerinde deneyebilirsiniz. +> TensorFlow ile NLP’yi [Microsoft Learn](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste) üzerinde deneyebilirsiniz. ## GPU Uyarısı -Bu bölümde, bazı örneklerde oldukça büyük modelleri eğiteceğiz. -* **GPU Destekli Bilgisayar Kullanın**: Büyük modellerle çalışırken bekleme sürelerini azaltmak için not defterlerinizi GPU destekli bir bilgisayarda çalıştırmanız önerilir. -* **GPU Bellek Sınırlamaları**: GPU'da çalışmak, özellikle büyük modelleri eğitirken GPU belleğinizin tükenmesine neden olabilir. -* **GPU Bellek Tüketimi**: Eğitim sırasında tüketilen GPU belleği, minibatch boyutu gibi çeşitli faktörlere bağlıdır. -* **Minibatch Boyutunu Azaltın**: GPU bellek sorunlarıyla karşılaşırsanız, kodunuzdaki minibatch boyutunu azaltmayı düşünebilirsiniz. -* **TensorFlow GPU Bellek Serbest Bırakma**: TensorFlow'un eski sürümleri, bir Python çekirdeğinde birden fazla model eğitildiğinde GPU belleğini doğru şekilde serbest bırakmayabilir. GPU bellek kullanımını etkili bir şekilde yönetmek için TensorFlow'u yalnızca gerektiğinde GPU belleği tahsis edecek şekilde yapılandırabilirsiniz. -* **Kod Ekleme**: TensorFlow'un GPU belleği tahsisini yalnızca gerektiğinde büyütmesini sağlamak için not defterlerinize aşağıdaki kodu ekleyin: +Bu bölümde bazı örneklerde oldukça büyük modelleri eğiteceğiz. +* **GPU Destekli Bilgisayar Kullanın**: Büyük modellerle çalışırken bekleme sürelerini azaltmak için defterlerinizi GPU destekli bir bilgisayarda çalıştırmanız önerilir. +* **GPU Bellek Sınırlamaları**: GPU üzerinde çalıştırmak, özellikle büyük modeller eğitildiğinde GPU bellek tükenmesine yol açabilir. +* **GPU Bellek Tüketimi**: Eğitim sırasında tüketilen GPU belleği; minibatch boyutu gibi çeşitli faktörlere bağlıdır. +* **Minibatch Boyutunu Azaltın**: GPU bellek sorunlarıyla karşılaşırsanız, kodunuzdaki minibatch boyutunu azaltmayı çözüm olarak düşünebilirsiniz. +* **TensorFlow GPU Bellek Serbest Bırakma**: TensorFlow’un eski sürümleri, bir Python kernelinde birden fazla model eğitirken GPU belleğini doğru şekilde serbest bırakmayabilir. GPU bellek kullanımını etkili şekilde yönetmek için TensorFlow’u yalnızca ihtiyaç duyulduğunda GPU belleğini tahsis edecek şekilde yapılandırabilirsiniz. +* **Kod Ekleme**: TensorFlow’un GPU bellek tahsisini sadece gerektiğinde artıracak şekilde ayarlamak için defterlerinize aşağıdaki kodu ekleyin: ```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) ``` -Klasik ML perspektifinden NLP öğrenmekle ilgileniyorsanız, [bu dersler dizisini](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP) ziyaret edin. +Klasik ML bakış açısından NLP öğrenmek isterseniz, [bu ders setini](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP) ziyaret edin. ## Bu Bölümde Bu bölümde şunları öğreneceğiz: * [Metni tensörler olarak temsil etme](13-TextRep/README.md) -* [Kelime Gömüleri](14-Emdeddings/README.md) -* [Dil Modelleme](15-LanguageModeling/README.md) -* [Tekrarlayan Sinir Ağları](16-RNN/README.md) -* [Üretken Ağlar](17-GenerativeNetworks/README.md) -* [Dönüştürücüler](18-Transformers/README.md) - -**Feragatname**: -Bu belge, AI çeviri hizmeti [Co-op Translator](https://github.com/Azure/co-op-translator) kullanılarak çevrilmiştir. Doğruluk için çaba göstersek de, otomatik çevirilerin hata veya yanlışlıklar içerebileceğini lütfen unutmayın. Belgenin orijinal dili, yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi önerilir. Bu çevirinin kullanımından kaynaklanan yanlış anlamalar veya yanlış yorumlamalardan sorumlu değiliz. \ No newline at end of file +* [Kelime Gömme](14-Emdeddings/README.md) +* [Dil Modellemesi](15-LanguageModeling/README.md) +* [Geri Dönüşümlü Sinir Ağları](16-RNN/README.md) +* [Üretici Ağlar](17-GenerativeNetworks/README.md) +* [Transformerlar](18-Transformers/README.md) + +--- + + +**Feragatname**: +Bu belge, AI çeviri hizmeti [Co-op Translator](https://github.com/Azure/co-op-translator) kullanılarak çevrilmiştir. Doğruluk için çaba sarf etsek de, otomatik çevirilerin hata veya yanlışlık içerebileceğini lütfen unutmayınız. Orijinal belge, kendi dilinde yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi önerilir. Bu çevirinin kullanımı sonucu ortaya çıkabilecek yanlış anlamalardan veya yanlış yorumlamalardan sorumlu değiliz. + \ No newline at end of file diff --git a/translations/uk/.co-op-translator.json b/translations/uk/.co-op-translator.json index b6a465586d..188eb37a44 100644 --- a/translations/uk/.co-op-translator.json +++ b/translations/uk/.co-op-translator.json @@ -5,6 +5,12 @@ "source_file": "AGENTS.md", "language_code": "uk" }, + "CONTRIBUTING.md": { + "original_hash": "c6fd7e781b67111a90abd166d0ce4aa0", + "translation_date": "2026-07-08T15:00:51+00:00", + "source_file": "CONTRIBUTING.md", + "language_code": "uk" + }, "README.md": { "original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b", "translation_date": "2026-04-06T20:32:03+00:00", @@ -17,6 +23,19 @@ "source_file": "SECURITY.md", "language_code": "uk" }, + "__translation_failures__": { + "lessons/sketchnotes/LICENSE.md": { + "original_hash": "45ab63a2cd8f5faef6c9b150618837a4", + "source_file": "lessons/sketchnotes/LICENSE.md", + "language_code": "uk", + "failure_date": "2026-07-08T14:47:15+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:45:10+00:00", @@ -54,8 +73,8 @@ "language_code": "uk" }, "examples/README.md": { - "original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7", - "translation_date": "2025-10-03T11:35:28+00:00", + "original_hash": "7883d52c2e2a221e0b07a7b112a149b9", + "translation_date": "2026-07-08T14:42:16+00:00", "source_file": "examples/README.md", "language_code": "uk" }, @@ -66,8 +85,8 @@ "language_code": "uk" }, "lessons/0-course-setup/how-to-run.md": { - "original_hash": "a4717bd9103b9f6cd84d534b83534689", - "translation_date": "2026-01-16T06:44:10+00:00", + "original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1", + "translation_date": "2026-07-08T14:42:34+00:00", "source_file": "lessons/0-course-setup/how-to-run.md", "language_code": "uk" }, @@ -191,6 +210,12 @@ "source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md", "language_code": "uk" }, + "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": { + "original_hash": "99b816b6a4957ef4100cee4c4221dff9", + "translation_date": "2026-07-08T14:33:05+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", + "language_code": "uk" + }, "lessons/4-ComputerVision/08-TransferLearning/lab/README.md": { "original_hash": "7765935c35fcee69b9fe2d0cfd6963e2", "translation_date": "2025-08-25T23:17:23+00:00", @@ -330,8 +355,8 @@ "language_code": "uk" }, "lessons/5-NLP/README.md": { - "original_hash": "8ef02a9318257ea140ed3ed74442096d", - "translation_date": "2025-08-25T21:30:36+00:00", + "original_hash": "038df6f1a73e49f6430740da083bfd6d", + "translation_date": "2026-07-08T14:43:00+00:00", "source_file": "lessons/5-NLP/README.md", "language_code": "uk" }, diff --git a/translations/uk/CONTRIBUTING.md b/translations/uk/CONTRIBUTING.md new file mode 100644 index 0000000000..c86e2f83be --- /dev/null +++ b/translations/uk/CONTRIBUTING.md @@ -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](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, будь ласка, майте на увазі, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ рідною мовою слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. + \ No newline at end of file diff --git a/translations/uk/examples/README.md b/translations/uk/examples/README.md index d6d1d57b51..0e5a42c33b 100644 --- a/translations/uk/examples/README.md +++ b/translations/uk/examples/README.md @@ -1,85 +1,87 @@ -# Приклади штучного інтелекту для початківців +# Приклади Штучного Інтелекту для Початківців -Ласкаво просимо! Цей каталог містить прості, автономні приклади, які допоможуть вам розпочати роботу зі штучним інтелектом та машинним навчанням. Кожен приклад розроблений для початківців із детальними коментарями та покроковими поясненнями. +Ласкаво просимо! Цей каталог містить прості автономні приклади, які допоможуть вам почати працювати зі ШІ та машинним навчанням. Кожен приклад розроблений для початківців із детальними коментарями та покроковими поясненнями. -## 📚 Огляд прикладів +## 📚 Огляд Прикладів -| Приклад | Опис | Складність | Попередні знання | +| Приклад | Опис | Рівень складності | Передумови | |---------|-------------|------------|---------------| -| [Hello AI World](../../../examples/01-hello-ai-world.py) | Ваша перша програма зі штучним інтелектом - просте розпізнавання шаблонів | ⭐ Початківець | Основи Python | -| [Проста нейронна мережа](../../../examples/02-simple-neural-network.py) | Створення нейронної мережі з нуля | ⭐⭐ Початківець+ | Python, базова математика | -| [Класифікатор зображень](./03-image-classifier.ipynb) | Класифікація зображень за допомогою попередньо навченої моделі | ⭐⭐ Початківець+ | Python, numpy | -| [Аналіз текстових настроїв](../../../examples/04-text-sentiment.py) | Аналіз настрою тексту (позитивний/негативний) | ⭐⭐ Початківець+ | Python | +| [Hello AI World](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/01-hello-ai-world.py) | Ваша перша програма ШІ - проста розпізнавальна модель | ⭐ Початковий | Основи Python | +| [Simple Neural Network](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/02-simple-neural-network.py) | Побудова нейронної мережі з нуля | ⭐⭐ Початковий+ | Python, базова математика | +| [Image Classifier](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/03-image-classifier.ipynb) | Класифікація зображень за допомогою попередньо натренованої моделі | ⭐⭐ Початковий+ | Python, numpy | +| [Text Sentiment](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/04-text-sentiment.py) | Аналіз тональності тексту (позитивний/негативний) | ⭐⭐ Початковий+ | Python | ## 🚀 Початок роботи -### Попередні вимоги +### Передумови Переконайтеся, що у вас встановлений Python (рекомендується версія 3.8 або новіша). Встановіть необхідні пакети: ```bash -# For Python scripts +# Для скриптів на Python pip install numpy -# For Jupyter notebooks (image classifier) +# Для Jupyter ноутбуків (класифікатор зображень) pip install jupyter numpy pillow tensorflow ``` -Або скористайтеся середовищем conda з основного курсу: +Або використайте conda середовище з основної навчальної програми: ```bash conda env create --name ai4beg --file ../environment.yml conda activate ai4beg ``` -### Запуск прикладів +### Запуск Прикладів -**Для скриптів Python (.py файли):** +**Для Python скриптів (.py файлів):** ```bash python 01-hello-ai-world.py ``` -**Для Jupyter ноутбуків (.ipynb файли):** +**Для Jupyter ноутбуків (.ipynb файлів):** ```bash jupyter notebook 03-image-classifier.ipynb ``` -## 📖 Навчальний шлях +## 📖 Маршрут Навчання -Рекомендуємо проходити приклади у такому порядку: +Радимо виконувати приклади у такому порядку: -1. **Почніть з "Hello AI World"** - Вивчіть основи розпізнавання шаблонів -2. **Створіть просту нейронну мережу** - Зрозумійте, як працюють нейронні мережі -3. **Спробуйте класифікатор зображень** - Побачте штучний інтелект у дії з реальними зображеннями -4. **Аналізуйте текстові настрої** - Досліджуйте обробку природної мови +1. **Почніть з "Hello AI World"** - Вивчіть основи розпізнавання патернів +2. **Побудуйте просту нейронну мережу** - Зрозумійте, як працюють нейронні мережі +3. **Спробуйте класифікатор зображень** - Побачте ШІ в дії з реальними зображеннями +4. **Аналіз тональності тексту** - Дослідіть обробку природної мови -## 💡 Поради для початківців +## 💡 Поради для Початківців -- **Уважно читайте коментарі до коду** - Вони пояснюють, що робить кожен рядок -- **Експериментуйте!** - Спробуйте змінювати значення і дивіться, що відбувається -- **Не хвилюйтеся, якщо щось не зрозуміло** - Навчання потребує часу -- **Ставте запитання** - Скористайтеся [дошкою обговорень](https://github.com/microsoft/AI-For-Beginners/discussions) +- **Уважно читайте коментарі у коді** - Вони пояснюють, що робить кожен рядок +- **Експериментуйте!** - Спробуйте змінювати значення і спостерігайте що станеться +- **Не хвилюйтеся, якщо не все зрозуміло одразу** - Навчання потребує часу +- **Задавайте питання** - Використовуйте [Дискусійний форум](https://github.com/microsoft/AI-For-Beginners/discussions) -## 🔗 Наступні кроки +## 🔗 Наступні Кроки Після завершення цих прикладів досліджуйте повний курс: -- [Вступ до штучного інтелекту](../lessons/1-Intro/README.md) -- [Нейронні мережі](../lessons/3-NeuralNetworks/README.md) -- [Комп'ютерне бачення](../lessons/4-ComputerVision/README.md) -- [Обробка природної мови](../lessons/5-NLP/README.md) +- [Вступ до ШІ](../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). Хоча ми прагнемо до точності, будь ласка, майте на увазі, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ на його рідній мові слід вважати авторитетним джерелом. Для критичної інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникають внаслідок використання цього перекладу. \ No newline at end of file + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу штучного інтелекту для перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, будь ласка, майте на увазі, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ рідною мовою слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. + \ No newline at end of file diff --git a/translations/uk/lessons/0-course-setup/how-to-run.md b/translations/uk/lessons/0-course-setup/how-to-run.md index 99bc1f2656..083d8cbdde 100644 --- a/translations/uk/lessons/0-course-setup/how-to-run.md +++ b/translations/uk/lessons/0-course-setup/how-to-run.md @@ -1,12 +1,12 @@ -# Як запустити код +# Як Запустити Код -Цей навчальний курс містить багато виконуваних прикладів і лабораторних робіт, які ви захочете запустити. Для цього вам потрібна можливість виконувати код Python у Jupyter Notebook, які є частиною цього курсу. Ви маєте кілька варіантів запуску коду: +Ця навчальна програма містить багато виконуваних прикладів і лабораторних робіт, які ви захочете запустити. Для цього вам потрібна можливість виконувати код Python у Jupyter Notebook, наданих як частина цієї програми. У вас є кілька варіантів запуску коду: -## Запуск локально на вашому комп'ютері +## Запуск локально на вашому комп’ютері -Щоб запустити код локально на вашому комп'ютері, потрібна установка Python. Однією з рекомендацій є встановлення **[miniconda](https://conda.io/en/latest/miniconda.html)** - це досить легка установка, яка підтримує пакетний менеджер `conda` для різних **віртуальних середовищ** Python. +Щоб запускати код локально на вашому комп’ютері, потрібна установка Python. Одним із варіантів є встановлення **[miniconda](https://conda.io/en/latest/miniconda.html)** — це досить легка установка, яка підтримує менеджер пакетів `conda` для різних Python **віртуальних середовищ**. -Після встановлення miniconda склонуйте репозиторій і створіть віртуальне середовище для використання в цьому курсі: +Після встановлення miniconda, клонувати репозиторій і створити віртуальне середовище, яке буде використовуватися для цього курсу: ```bash git clone http://github.com/microsoft/ai-for-beginners @@ -17,17 +17,17 @@ conda activate ai4beg ### Використання Visual Studio Code з розширенням Python -Цей курс найкраще використовувати, відкриваючи його у [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) з [розширенням Python](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 локально, перейдіть у каталог курсу і виконайте: +Щоб запустити Jupyter локально, перейдіть у каталог курсу та виконайте: ```bash jupyter notebook @@ -36,36 +36,36 @@ jupyter notebook ```bash jupyterhub ``` -Після цього ви можете перейти до будь-якого з файлів `.ipynb`, відкрити їх і почати роботу. +Ви можете потім перейти до будь-якого з файлів `.ipynb`, відкрити їх і почати працювати. ### Запуск у контейнері -Однією з альтернатив встановленню Python є запуск коду у контейнері. Оскільки наш репозиторій містить спеціальну папку `.devcontainer`, що інструктує, як збудувати контейнер для цього репозиторію, VS Code пропонує можливість заново відкрити код у контейнері. Це вимагає встановлення Docker і є більш складним, тому ми рекомендуємо це більш досвідченим користувачам. +Однією з альтернатив установці Python є запуск коду у контейнері. Оскільки наш репозиторій містить спеціальну папку `.devcontainer`, яка вказує, як зібрати контейнер для цього репо, VS Code пропонує можливість повторно відкрити код у контейнері. Для цього потрібно встановити Docker, і це буде складніше, тому ми рекомендуємо це більш досвідченим користувачам. ## Запуск у хмарі -Якщо ви не хочете встановлювати Python локально і маєте доступ до хмарних ресурсів — гарною альтернативою буде запуск коду у хмарі. Існує кілька способів зробити це: +Якщо ви не хочете встановлювати Python локально і маєте доступ до хмарних ресурсів, гарною альтернативою буде запуск коду у хмарі. Є кілька способів це зробити: -* Використання **[GitHub Codespaces](https://github.com/features/codespaces)**, який є віртуальним середовищем, створеним для вас на GitHub і доступним через інтерфейс VS Code у браузері. Якщо у вас є доступ до Codespaces, ви можете просто натиснути кнопку **Code** у репозиторії, стартувати codespace і почати роботу без зволікань. -* Використання **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) пропонує безкоштовні обчислювальні ресурси у хмарі, щоб ви могли випробувати код на GitHub. На головній сторінці є кнопка для відкриття репозиторію в Binder — вона швидко перекине вас на сайт Binder, який побудує базовий контейнер і плавно запустить веб-інтерфейс Jupyter. +* Використання **[GitHub Codespaces](https://github.com/features/codespaces)** — це віртуальне середовище, створене для вас на GitHub, доступне через веб-інтерфейс VS Code. Якщо у вас є доступ до Codespaces, ви можете просто натиснути кнопку **Code** у репозиторії, запустити codespace і почати працювати миттєво. +* Використання **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) надає безкоштовні обчислювальні ресурси у хмарі для людей, які хочуть спробувати код на GitHub. На головній сторінці є кнопка для відкриття репозиторію у Binder — це швидко направить вас на сайт binder, який створить контейнер і безшовно запустить Jupyter у веб-інтерфейсі для вас. -> **Примітка**: Щоб запобігти зловживанням, до деяких веб-ресурсів доступ від Binder обмежений. Це може перешкодити роботі деяких частин коду, що завантажують моделі і/або набори даних з публічного Інтернету. Вам можливо доведеться шукати обхідні шляхи. Також обчислювальні ресурси в Binder досить базові, тому навчання буде повільним, особливо у пізніших, більш складних уроках. +> **Примітка**: Щоб запобігти зловживанню, Binder має заблокований доступ до деяких веб-ресурсів. Це може завадити роботі деякого коду, який завантажує моделі та/або набори даних з публічного Інтернету. Можливо, доведеться шукати обхідні шляхи. Також обчислювальні ресурси Binder досить базові, отже навчання буде повільним, особливо на пізніших, більш складних уроках. ## Запуск у хмарі з GPU -Деякі пізніші уроки цього курсу значно виграють від підтримки GPU. Наприклад, тренування моделей може бути вкрай повільним без GPU. Є кілька варіантів, особливо якщо у вас є доступ до хмари через [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) або через ваш навчальний заклад: +Деякі пізніші уроки цієї програми значно виграють від підтримки GPU. Навчання моделей, наприклад, інакше може бути дуже повільним. Існує кілька варіантів, якщо ви маєте доступ до хмари через [Azure 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. Ви можете клонувати репозиторій безпосередньо на машину і почати навчання. VM серії NC підтримують 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 підтримують 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 notebook і почати працювати. +* Створіть [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 і почати його використовувати. -Ви також можете скористатися Google Colab, який має часткову безкоштовну підтримку GPU, і завантажити туди Jupyter Notebooks для поетапного виконання. +Ви також можете використовувати Google Colab, який має безкоштовну підтримку GPU, і завантажувати туди Jupyter Notebook для поступового виконання. --- -**Застереження**: -Цей документ був перекладений з використанням сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ рідною мовою слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується звертатись до професійного людського перекладу. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу штучного інтелекту для перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, будь ласка, майте на увазі, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ рідною мовою слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file diff --git a/translations/uk/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/uk/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index d3a2a5b016..df64da7e77 100644 --- a/translations/uk/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/uk/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -4,11 +4,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Попередньо натреновані моделі та перенесення навчання\n", + "# Попередньо навчені моделі та передачі навчання\n", "\n", - "Навчання CNN може займати багато часу, і для цього завдання потрібна велика кількість даних. Однак значна частина часу витрачається на те, щоб навчити найкращі низькорівневі фільтри, які мережа використовує для вилучення шаблонів із зображень. Виникає природне питання - чи можемо ми використати нейронну мережу, натреновану на одному наборі даних, і адаптувати її для класифікації інших зображень без повного процесу навчання?\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 Cats vs. Dogs](https://www.kaggle.com/c/dogs-vs-cats), який також можна завантажити [з Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n", "\n", - "Давайте завантажимо цей набір даних і розпакуємо його в директорію `data` (цей процес може зайняти деякий час!):\n" + "Давайте завантажимо цей набір даних і розпакуємо його у директорію `data` (цей процес може зайняти деякий час!):\n" ] }, { @@ -64,7 +64,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "На жаль, у наборі даних є деякі пошкоджені файли зображень. Нам потрібно швидко очистити дані, щоб перевірити пошкоджені файли. Щоб не перевантажувати цей підручник, ми перенесли код для перевірки набору даних у модуль.\n" + "На жаль, у наборі даних є деякі пошкоджені файли зображень. Нам потрібно швидко очистити дані, щоб перевірити на наявність пошкоджених файлів. Щоб не псувати цей підручник, ми перемістили код для перевірки набору даних у модуль.\n" ] }, { @@ -335,11 +335,11 @@ "source": [ "## Завантаження набору даних\n", "\n", - "У попередніх прикладах ми завантажували набори даних, які вбудовані в Keras. Тепер ми працюватимемо з власним набором даних, який потрібно завантажити з каталогу зображень.\n", + "У попередніх прикладах ми завантажували набори даних, які вбудовані в Keras. Тепер ми будемо працювати з нашим власним набором даних, який потрібно завантажити з каталогу зображень.\n", "\n", - "У реальному житті розмір наборів даних із зображеннями може бути досить великим, і не можна розраховувати, що всі дані помістяться в пам'ять. Тому набори даних часто представляються у вигляді **генераторів**, які можуть повертати дані невеликими партіями, придатними для навчання.\n", + "У реальному житті розмір наборів зображень може бути досить великим, і не можна розраховувати на те, що всі дані помістяться в пам’ять. Тому набори даних часто представлені як **генератори**, які можуть повертати дані невеликими пакетами, що підходять для навчання.\n", "\n", - "Для роботи з класифікацією зображень Keras включає спеціальну функцію `image_dataset_from_directory`, яка може завантажувати зображення з підкаталогів, що відповідають різним класам. Ця функція також автоматично масштабує зображення і може розділяти набір даних на навчальну та тестову підмножини:\n" + "Для роботи з класифікацією зображень Keras містить спеціальну функцію `image_dataset_from_directory`, яка може завантажувати зображення з підкаталогів, що відповідають різним класам. Ця функція також автоматично масштабує зображення і може розділяти набір даних на навчальну та тестову підмножини:\n" ] }, { @@ -385,7 +385,7 @@ "source": [ "Важливо встановити однакове значення `seed` для обох викликів, оскільки це впливає на розподіл зображень між навчальним і тестовим наборами даних.\n", "\n", - "Набір даних автоматично визначає назви класів із директорій, і ви можете отримати до них доступ, якщо потрібно, викликавши:\n" + "Dataset автоматично отримує імена класів з директорій, і ви можете отримати до них доступ, якщо потрібно, викликавши:\n" ] }, { @@ -412,7 +412,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Набори даних, які ми отримали, можуть бути безпосередньо передані до функції `fit` для навчання моделі. Вони містять як відповідні зображення, так і мітки, які можна перебирати за допомогою наступної конструкції:\n" + "Набори даних, які ми отримали, можна безпосередньо передати у функцію `fit` для навчання моделі. Вони містять як відповідні зображення, так і мітки, по яких можна пройтися в циклі за допомогою наступної конструкції:\n" ] }, { @@ -453,16 +453,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "> **Примітка**: Усі зображення в наборі даних представлені як тензори з плаваючою точкою в діапазоні 0-255. Перед передачею їх до нейронної мережі, нам потрібно масштабувати ці значення до діапазону 0-1. При відображенні зображень ми також повинні зробити те саме або конвертувати значення в тип `int` (що ми робимо в коді вище), щоб показати `matplotlib`, що ми хочемо відобразити оригінальне немасштабоване зображення.\n" + "> **Примітка**: Усі зображення в наборі даних представлені у вигляді тензорів з плаваючою комою в діапазоні 0–255. Перед передачею їх у нейронну мережу необхідно масштабувати ці значення в діапазон 0–1. При відображенні зображень ми повинні зробити те ж саме або конвертувати значення у тип `int` (що ми й робимо у наведеному вище коді), щоб показати `matplotlib`, що ми хочемо відобразити оригінальне немасштабоване зображення.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Попередньо навчені моделі\n", + "## Попередньо натреновані моделі\n", "\n", - "Для багатьох завдань класифікації зображень можна знайти попередньо навчені моделі нейронних мереж. Багато з цих моделей доступні в просторі імен `keras.applications`, а ще більше моделей можна знайти в Інтернеті. Давайте подивимося, як можна завантажити та використати найпростішу модель VGG-16:\n" + "Для багатьох завдань класифікації зображень можна знайти попередньо навчені моделі нейронних мереж. Багато з цих моделей доступні в просторі імен `keras.applications`, і ще більше моделей можна знайти в Інтернеті. Давайте подивимось, як можна завантажити та використати найпростішу модель VGG-16:\n" ] }, { @@ -497,7 +497,17 @@ } ], "source": [ - "vgg = keras.applications.VGG16()\n", + "# SHA-256 of VGG16 weights (with top)\n", + "VGG16_WEIGHTS_SHA256 = '64373286793e3c8b2b4e3219cbf3544bce2f55ab4682710a29f5e7af8f5e4f61'\n", + "\n", + "_weights_path = keras.utils.get_file(\n", + " 'vgg16_weights_tf_dim_ordering_tf_kernels.h5',\n", + " 'https://storage.googleapis.com/tensorflow/keras-applications/vgg16/vgg16_weights_tf_dim_ordering_tf_kernels.h5',\n", + " file_hash=VGG16_WEIGHTS_SHA256,\n", + " hash_algorithm='sha256',\n", + ")\n", + "\n", + "vgg = keras.applications.VGG16(weights=_weights_path)\n", "inp = keras.applications.vgg16.preprocess_input(x_sample[:1])\n", "\n", "res = vgg(inp)\n", @@ -511,10 +521,9 @@ "metadata": {}, "source": [ "Є кілька важливих моментів:\n", - "\n", - "* Перед тим, як передати вхідні дані до будь-якої попередньо навченої мережі, їх необхідно попередньо обробити певним чином. Це здійснюється шляхом виклику відповідної функції `preprocess_input`, яка отримує пакет зображень і повертає їх оброблену форму. У випадку VGG-16 зображення нормалізуються, і від кожного каналу віднімається певне заздалегідь визначене середнє значення. Це пов’язано з тим, що VGG-16 спочатку була навчена з таким попереднім обробленням.\n", - "* Нейронна мережа застосовується до вхідного пакета, і як результат ми отримуємо пакет тензорів із 1000 елементів, які показують ймовірність кожного класу. Найбільш ймовірний номер класу можна знайти, викликавши `argmax` для цього тензора.\n", - "* Отриманий результат — це [номер класу `ImageNet`](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Щоб зрозуміти цей результат, можна також скористатися функцією `decode_predictions`, яка повертає топ n класів разом із їхніми назвами.\n" + "* Перед тим, як передавати вхідні дані у будь-яку попередньо натреновану мережу, їх потрібно певним чином попередньо обробити. Це робиться викликом відповідної функції `preprocess_input`, яка приймає пакет зображень і повертає їх оброблену форму. У випадку VGG-16, зображення нормалізуються, і від кожного каналу віднімається певне заздалегідь визначене середнє значення. Це тому, що VGG-16 спочатку була натренована з таким попереднім обробленням.\n", + "* Нейронна мережа застосовується до вхідного пакету, і в результаті ми отримуємо пакет тензорів розміром 1000 елементів, які показують ймовірність кожного класу. Ми можемо знайти найбільш ймовірний номер класу, викликавши `argmax` на цьому тензорі.\n", + "* Отриманий результат — це [номер класу `ImageNet`](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Щоб зрозуміти цей результат, ми також можемо використати функцію `decode_predictions`, яка повертає топ n класів разом з їхніми назвами.\n" ] }, { @@ -600,7 +609,7 @@ "source": [ "## Обчислення на GPU\n", "\n", - "Глибокі нейронні мережі, такі як VGG-16 та інші сучасні архітектури, потребують значної обчислювальної потужності для виконання. Логічно використовувати прискорення на GPU, якщо воно доступне. На щастя, Keras автоматично прискорює обчислення на GPU, якщо він доступний. Ми можемо перевірити, чи Tensorflow здатний використовувати GPU, за допомогою наступного коду:\n" + "Глибокі нейронні мережі, такі як VGG-16 та інші більш сучасні архітектури, потребують досить багато обчислювальних ресурсів для роботи. Має сенс використовувати прискорення на GPU, якщо воно доступне. На щастя, Keras автоматично прискорює обчислення на GPU, якщо він доступний. Ми можемо перевірити, чи Tensorflow може використовувати GPU за допомогою наступного коду:\n" ] }, { @@ -627,9 +636,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ + "\n", "## Витягування ознак VGG\n", "\n", - "Якщо ми хочемо використовувати VGG-16 для витягування ознак з наших зображень, нам потрібна модель без фінальних шарів класифікації. Ми можемо створити модель VGG-16 без верхніх шарів за допомогою цього коду:\n" + "Якщо ми хочемо використовувати VGG-16 для витягування ознак із наших зображень, нам потрібна модель без фінальних шарів класифікації. Ми можемо створити екземпляр моделі VGG-16 без верхніх шарів, використовуючи цей код:\n" ] }, { @@ -681,9 +691,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Розмір тензора ознак становить 7x7x512, але для його візуалізації нам довелося перетворити його у двовимірну форму.\n", + "Розмір тензора ознак становить 7x7x512, але для візуалізації ми мусили перетворити його у 2D форму.\n", "\n", - "Тепер спробуємо перевірити, чи можна використовувати ці ознаки для класифікації зображень. Давайте вручну візьмемо частину зображень (у нашому випадку 50 мініпакетів) і попередньо обчислимо їхні векторні ознаки. Для цього ми можемо скористатися API **dataset** у Tensorflow. Функція `map` бере набір даних і застосовує задану лямбда-функцію для його трансформації. Ми використовуємо цей механізм для створення нових наборів даних, `ds_features_train` і `ds_features_test`, які містять ознаки, отримані за допомогою VGG, замість оригінальних зображень.\n" + "Тепер спробуємо визначити, чи можна використовувати ці ознаки для класифікації зображень. Візьмемо вручну деяку частину зображень (50 мініпакетів, у нашому випадку) і попередньо обчислимо їхні вектори ознак. Для цього можемо використати API **dataset** Tensorflow. Функція `map` приймає датасет і застосовує задану лямбда-функцію для його трансформації. Ми використовуємо цей механізм, щоб створити нові датасети, `ds_features_train` і `ds_features_test`, які містять ознаки, витягнуті за допомогою VGG, замість оригінальних зображень.\n" ] }, { @@ -713,9 +723,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Ми використали конструкцію `.take(50)` для обмеження розміру набору даних, щоб прискорити нашу демонстрацію. Звісно, ви можете виконати цей експеримент на повному наборі даних.\n", + "Ми використали конструкцію `.take(50)`, щоб обмежити розмір набору даних, щоб прискорити нашу демонстрацію. Звісно, ви можете виконати цей експеримент на повному наборі даних.\n", "\n", - "Тепер, коли у нас є набір даних із витягнутими ознаками, ми можемо навчити простий щільний класифікатор для розрізнення між котами та собаками. Ця мережа прийматиме вектор ознак форми (7,7,512) і генеруватиме один вихід, який відповідає або собаці, або коту. Оскільки це бінарна класифікація, ми використовуємо функцію активації `sigmoid` і втрату `binary_crossentropy`.\n" + "Тепер, коли у нас є набір даних з витягнутими ознаками, ми можемо навчити простий щільний класифікатор для розрізнення котів і собак. Ця мережа прийматиме вхідний вектор ознак форми (7,7,512) і вироблятиме один вихід, що відповідатиме або собаці, або коту. Оскільки це бінарна класифікація, ми використовуємо функцію активації `sigmoid` та втрати `binary_crossentropy`.\n" ] }, { @@ -744,13 +754,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Результат чудовий, ми можемо розрізняти кота і собаку з майже 95% ймовірністю! Однак, ми протестували цей підхід лише на підмножині всіх зображень, оскільки ручне вилучення ознак займає багато часу.\n", + "Результат чудовий, ми можемо відрізнити кота від собаки з ймовірністю майже 95%! Однак ми протестували цей підхід лише на підмножині всіх зображень, тому що ручне вилучення ознак, здається, займає багато часу.\n", "\n", - "## Трансферне навчання за допомогою однієї мережі VGG\n", + "## Трансферне навчання з використанням однієї мережі VGG\n", "\n", - "Ми також можемо уникнути ручного попереднього обчислення ознак, використовуючи оригінальну мережу VGG-16 повністю під час навчання, додаючи витягувач ознак до нашої мережі як перший шар.\n", + "Ми також можемо уникнути ручного попереднього обчислення ознак, використовуючи оригінальну мережу VGG-16 як єдине ціле під час навчання, додавши витягувач ознак до нашої мережі як перший шар.\n", "\n", - "Перевага архітектури Keras полягає в тому, що модель VGG-16, яку ми визначили вище, також може бути використана як шар в іншій нейронній мережі! Нам просто потрібно побудувати мережу з щільним класифікатором поверх неї, а потім навчити всю мережу за допомогою зворотного поширення.\n" + "Красота архітектури Keras полягає в тому, що модель VGG-16, яку ми визначили вище, також може використовуватися як шар в іншій нейронній мережі! Нам просто потрібно побудувати мережу з щільним класифікатором зверху, а потім навчити всю мережу за допомогою зворотного поширення.\n" ] }, { @@ -794,13 +804,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Ця модель виглядає як мережа для класифікації \"від початку до кінця\", яка приймає зображення і повертає клас. Однак складність полягає в тому, що ми хочемо, щоб VGG16 працювала як екстрактор ознак, а не була перенавчена. Тому нам потрібно **заморозити ваги конволюційного екстрактора ознак**. Ми можемо отримати доступ до першого шару мережі, викликавши `model.layers[0]`, і нам просто потрібно встановити властивість `trainable` у значення `False`.\n", + "Ця модель виглядає як мережа для кінцевої класифікації, яка приймає зображення і повертає клас. Однак, складність полягає в тому, що ми хочемо, щоб VGG16 виступав як екстрактор ознак і не проходив повторного навчання. Отже, нам потрібно **заморозити ваги згорткового екстрактора ознак**. Ми можемо отримати доступ до першого шару мережі, викликавши `model.layers[0]`, і нам просто потрібно встановити властивість `trainable` в `False`.\n", "\n", - "> **Note**: Заморожування ваг екстрактора ознак необхідне, тому що в іншому випадку ненавчений класифікаційний шар може зруйнувати початкові попередньо навчені ваги конволюційного екстрактора.\n", + "> **Примітка**: Заморожування ваг екстрактора ознак необхідне, тому що інакше немаринований шар класифікатора може зруйнувати оригінальні попередньо навчені ваги згорткового екстрактора.\n", "\n", - "Ви можете помітити, що хоча загальна кількість параметрів у нашій мережі становить близько 15 мільйонів, ми навчаємо лише 25 тисяч параметрів. Усі інші параметри верхнього рівня конволюційних фільтрів є попередньо навченими. Це добре, тому що ми можемо налаштувати меншу кількість параметрів за допомогою меншої кількості прикладів.\n", + "Ви можете помітити, що хоча загальна кількість параметрів у нашій мережі становить близько 15 мільйонів, ми навчаємося лише 25 тисяч параметрів. Всі інші параметри верхньорівневих згорткових фільтрів є попередньо навченими. Це добре, тому що ми можемо тонко налаштовувати меншу кількість параметрів з меншою кількістю прикладів.\n", "\n", - "Тепер ми будемо навчати нашу мережу і подивимося, наскільки хороших результатів ми можемо досягти. Очікуйте досить тривалого часу виконання, і не хвилюйтеся, якщо здається, що виконання \"зависло\" на деякий час.\n" + "Тепер ми навчимо нашу мережу і подивимось, наскільки добре вийде. Очікуйте досить тривалий час роботи, і не хвилюйтеся, якщо виконання здається замороженим деякий час.\n" ] }, { @@ -825,11 +835,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Здається, ми отримали досить точний класифікатор для котів і собак!\n", + "Схоже, що ми отримали досить точний класифікатор котів проти собак! \n", "\n", - "## Збереження та завантаження моделі\n", + "## Збереження і завантаження моделі\n", "\n", - "Після того, як ми натренували модель, ми можемо зберегти архітектуру моделі та натреновані ваги у файл для подальшого використання:\n" + "Після тренування моделі ми можемо зберегти архітектуру моделі та навчені ваги у файл для майбутнього використання:\n" ] }, { @@ -853,7 +863,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Ми можемо завантажити модель з файлу в будь-який час. Це може бути корисним у випадку, якщо наступний експеримент знищить модель - вам не доведеться починати з нуля.\n" + "Потім ми можемо завантажити модель з файлу в будь-який момент. Це може бути корисно, якщо наступний експеримент зіпсує модель — вам не доведеться починати спочатку.\n" ] }, { @@ -869,15 +879,15 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Тонке налаштування перенесення навчання\n", + "## Тонке налаштування трансферного навчання\n", "\n", - "У попередньому розділі ми навчили фінальний шар класифікатора для класифікації зображень у нашому власному наборі даних. Однак ми не перенавчали екстрактор ознак, і наша модель покладалася на ознаки, які вона навчилася на даних ImageNet. Якщо ваші об'єкти візуально відрізняються від звичайних зображень ImageNet, така комбінація ознак може працювати не найкращим чином. Тому має сенс почати навчання і згорткових шарів.\n", + "У попередньому розділі ми навчили кінцевий шар класифікатора класифікувати зображення у нашому власному наборі даних. Однак ми не перенавчали екстрактор ознак, і наша модель покладалася на ознаки, які вона навчилася на даних ImageNet. Якщо ваші об’єкти візуально відрізняються від звичайних зображень ImageNet, це поєднання ознак може працювати не найкраще. Тож має сенс почати тренування й згорткових шарів.\n", "\n", - "Для цього ми можемо розморозити параметри згорткових фільтрів, які раніше були заморожені.\n", + "Для цього ми можемо розморозити параметри згорткових фільтрів, які попередньо були заморожені.\n", "\n", - "> **Примітка:** Важливо спочатку заморозити параметри та виконати кілька епох навчання, щоб стабілізувати ваги у шарі класифікації. Якщо одразу почати навчання мережі від початку до кінця з розмороженими параметрами, великі помилки можуть зруйнувати попередньо навчені ваги у згорткових шарах.\n", + "> **Примітка:** Важливо спочатку заморозити параметри та виконати декілька епох навчання, щоб стабілізувати ваги в шарі класифікації. Якщо відразу почати навчання мережі «від краю до краю» з розмороженими параметрами, великі помилки можуть зруйнувати попередньо навчені ваги в згорткових шарах.\n", "\n", - "Наша згорткова модель VGG-16 знаходиться всередині першого шару і сама складається з багатьох шарів. Ми можемо переглянути її структуру:\n" + "Наша згорткова модель VGG-16 розташована в межах першого шару і складається з багатьох шарів. Ми можемо поглянути на її структуру:\n" ] }, { @@ -945,7 +955,9 @@ { "cell_type": "markdown", "metadata": {}, - "source": [] + "source": [ + "Ми можемо розморозити всі шари згорткової бази:\n" + ] }, { "cell_type": "code", @@ -960,7 +972,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Однак розморожування всіх шарів одночасно — не найкраща ідея. Спочатку ми можемо розморозити лише кілька останніх шарів згорток, оскільки вони містять високорівневі шаблони, які є релевантними для наших зображень. Наприклад, для початку ми можемо заморозити всі шари, окрім останніх 4:\n" + "Однак розморозити їх усі одразу — не найкраща ідея. Спочатку ми можемо розморозити лише кілька останніх шарів згорток, оскільки вони містять вищого рівня патерни, релевантні для наших зображень. Наприклад, спочатку ми можемо заморозити всі шари, крім останніх 4: \n" ] }, { @@ -999,9 +1011,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Зверніть увагу, що кількість параметрів, які можна навчати, значно зросла, але все ще становить близько 50% від усіх параметрів.\n", + "Зверніть увагу, що кількість навчаємих параметрів значно зросла, але все ще становить близько 50% від усіх параметрів.\n", "\n", - "Після розморожування ми можемо провести ще кілька епох навчання (у нашому прикладі ми виконаємо лише одну). Ви також можете вибрати нижчу швидкість навчання, щоб мінімізувати вплив на попередньо навчені ваги. Однак, навіть із низькою швидкістю навчання, можна очікувати, що точність спочатку знизиться на початку навчання, а потім поступово досягне трохи вищого рівня, ніж у випадку з фіксованими вагами.\n", + "Після розморожування ми можемо провести ще кілька епох навчання (у нашому прикладі ми проведемо лише одну). Ви також можете обрати нижчу швидкість навчання, щоб мінімізувати вплив на попередньо навчені ваги. Однак навіть при низькій швидкості навчання можна очікувати, що точність спочатку впаде, поки зрештою не досягне трохи вищого рівня, ніж у випадку фіксованих ваг.\n", "\n", "> **Примітка:** Це навчання відбувається значно повільніше, оскільки нам потрібно поширювати градієнти назад через багато шарів мережі!\n" ] @@ -1027,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**, розроблені Microsoft, і **Inception** від Google. Наприклад, давайте розглянемо архітектуру найпростішьої моделі ResNet-50 (ResNet — це сімейство моделей з різною глибиною, ви можете спробувати експериментувати з ResNet-152, якщо хочете побачити, як виглядає справді глибока модель):\n" ] }, { @@ -1440,29 +1452,29 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Як ви бачите, модель містить ті ж самі знайомі будівельні блоки: шари згортки, шари підвибірки та фінальний щільний класифікатор. Ми можемо використовувати цю модель точно так само, як ми використовували VGG-16 для перенесення навчання. Ви можете спробувати експериментувати з кодом вище, використовуючи різні моделі ResNet як базову модель, і подивитися, як змінюється точність.\n", + "Як ви бачите, модель містить ті ж знайомі будівельні блоки: згорткові шари, шари підвибірки та фінальний щільний класифікатор. Ми можемо використовувати цю модель точно так само, як ми використовували VGG-16 для перенесеного навчання. Ви можете спробувати виконати експерименти з наведеним вище кодом, використовуючи різні моделі ResNet як базову модель, і подивитися, як змінюється точність.\n", "\n", - "## Нормалізація пакетів\n", + "## Нормалізація за пакетами\n", "\n", - "Ця мережа містить ще один тип шару: **Нормалізація пакетів**. Ідея нормалізації пакетів полягає в тому, щоб привести значення, які проходять через нейронну мережу, до правильного інтервалу. Зазвичай нейронні мережі працюють найкраще, коли всі значення знаходяться в діапазоні [-1,1] або [0,1], і саме тому ми масштабуємо/нормалізуємо наші вхідні дані відповідно. Однак під час навчання глибокої мережі може статися так, що значення значно виходять за межі цього діапазону, що ускладнює навчання. Шар нормалізації пакетів обчислює середнє значення та стандартне відхилення для всіх значень поточного мініпакету і використовує їх для нормалізації сигналу перед його передачею через шар нейронної мережі. Це значно покращує стабільність глибоких мереж.\n" + "Ця мережа містить ще один тип шару: **нормалізація за пакетами (Batch Normalization)**. Ідея нормалізації за пакетами полягає в тому, щоб привести значення, що проходять через нейронну мережу, до правильного інтервалу. Зазвичай нейронні мережі працюють найкраще, коли всі значення знаходяться в діапазоні [-1,1] або [0,1], і саме тому ми відповідним чином масштабуємо/нормалізуємо вхідні дані. Однак під час тренування глибокої мережі може трапитися, що значення значно виходять за цей діапазон, що ускладнює навчання. Шар нормалізації за пакетами обчислює середнє значення та стандартне відхилення для всіх значень поточного мініпакета і використовує їх для нормалізації сигналу перед передачею через шар нейронної мережі. Це значно покращує стабільність глибоких мереж.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Основні висновки\n", + "## Висновок\n", "\n", - "Використовуючи трансферне навчання, ми змогли швидко створити класифікатор для нашого завдання класифікації об'єктів і досягти високої точності. Однак цей приклад не був повністю справедливим, оскільки оригінальна мережа VGG-16 була попередньо навчена розпізнавати котів і собак, і ми просто повторно використовували більшість шаблонів, які вже були присутні в мережі. Ви можете очікувати нижчої точності для більш екзотичних об'єктів, специфічних для певної галузі, наприклад, деталей на виробничій лінії на заводі або різних листків дерев.\n", + "Використовуючи трансферне навчання, ми змогли швидко створити класифікатор для нашого завдання класифікації користувацьких об’єктів і досягти високої точності. Проте цей приклад було не зовсім справедливим, тому що початкова мережа VGG-16 була попередньо навчена розпізнавати котів і собак, і тому ми просто повторно використовували більшість шаблонів, які вже були в мережі. Ви можете очікувати нижчу точність на більш екзотичних предметах, специфічних для конкретної сфери, таких як деталі на виробничій лінії на заводі або різні листя дерев.\n", "\n", - "Як ви бачите, більш складні завдання, які ми вирішуємо зараз, вимагають більшої обчислювальної потужності і не можуть бути легко виконані на процесорі. У наступному розділі ми спробуємо використати більш легковагову реалізацію для навчання тієї ж моделі з меншими обчислювальними ресурсами, що призведе до лише незначного зниження точності.\n" + "Ви можете побачити, що більш складні завдання, які ми розв’язуємо зараз, вимагають більшої обчислювальної потужності і не можуть бути легко розв’язані на ЦПУ. У наступному розділі ми спробуємо використати більш легку реалізацію для навчання тієї самої моделі з меншими обчислювальними ресурсами, що призведе лише до трохи нижчої точності.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**Відмова від відповідальності**: \nЦей документ був перекладений за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, будь ласка, майте на увазі, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ на його рідній мові слід вважати авторитетним джерелом. Для критичної інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникають внаслідок використання цього перекладу.\n" + "---\n\n\n**Відмова від відповідальності**:\nЦей документ було перекладено за допомогою сервісу штучного інтелекту для перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, будь ласка, майте на увазі, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ рідною мовою слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу.\n\n" ] } ], @@ -1483,12 +1495,6 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" - }, - "coopTranslator": { - "original_hash": "c189abc107848f96051085cc30945129", - "translation_date": "2025-08-30T09:10:54+00:00", - "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", - "language_code": "uk" } }, "nbformat": 4, diff --git a/translations/uk/lessons/5-NLP/README.md b/translations/uk/lessons/5-NLP/README.md index 8213ef3c41..2d00ff5b0a 100644 --- a/translations/uk/lessons/5-NLP/README.md +++ b/translations/uk/lessons/5-NLP/README.md @@ -1,34 +1,34 @@ # Обробка природної мови -![Резюме задач NLP у вигляді малюнка](../../../../translated_images/uk/ai-nlp.b22dcb8ca4707cea.webp) +![Підсумок завдань NLP у малюнку](../../../../translated_images/uk/ai-nlp.b22dcb8ca4707cea.webp) -У цьому розділі ми зосередимося на використанні нейронних мереж для вирішення задач, пов'язаних із **обробкою природної мови (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) стосується проблеми вилучення певних сутностей із тексту. Наприклад, потрібно зрозуміти, що у фразі *I need to fly to Paris tomorrow* слово *tomorrow* позначає ДАТУ, а *Paris* — МІСЦЕ. +* **Виділення ключових слів** схоже на 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](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*), і все це має інтерпретуватись як один патерн. Тому для роботи з мовою потрібно вводити нові типи нейронних мереж, такі як *рекурентні мережі* і *трансформери*. ## Встановлення бібліотек -Якщо ви використовуєте локальну установку 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, що споживається під час навчання, залежить від різних факторів, включаючи розмір мініпакету. -* **Мінімізуйте розмір мініпакету**: Якщо ви стикаєтеся з проблемами пам'яті GPU, розгляньте можливість зменшення розміру мініпакету у вашому коді як потенційне рішення. -* **Вивільнення пам'яті GPU у TensorFlow**: Старі версії TensorFlow можуть некоректно вивільняти пам'ять GPU при навчанні кількох моделей в одному ядрі Python. Щоб ефективно керувати використанням пам'яті GPU, ви можете налаштувати TensorFlow на виділення пам'яті GPU лише за потреби. -* **Включення коду**: Щоб налаштувати TensorFlow на зростання виділення пам'яті GPU лише за потреби, включіть наступний код у ваші ноутбуки: +У цьому розділі в деяких прикладах ми тренуватимемо досить великі моделі. +* **Використовуйте комп’ютер із підтримкою GPU**: рекомендовано запускати ваші ноутбуки на комп’ютері з підтримкою GPU, щоб зменшити час очікування при роботі з великими моделями. +* **Обмеження пам’яті GPU**: запуск на GPU може призводити до ситуацій, коли пам’яті GPU не вистачає, особливо при тренуванні великих моделей. +* **Використання пам’яті GPU**: обсяг пам’яті GPU, що використовується під час тренування, залежить від різних факторів, зокрема від розміру міні-пакету. +* **Зменшення розміру міні-пакету**: якщо ви стикаєтеся з проблемами пам’яті GPU, спробуйте зменшити розмір міні-пакету у вашому коді як потенційне рішення. +* **Звільнення пам’яті GPU в TensorFlow**: старі версії TensorFlow можуть некоректно звільняти пам’ять GPU під час тренування кількох моделей у одному ядрі Python. Щоб ефективно управляти використанням пам’яті GPU, можна налаштувати TensorFlow так, щоб він виділяв пам’ять GPU тільки за потребою. +* **Включення коду**: щоб налаштувати TensorFlow на поступове виділення пам’яті GPU, додайте в свої ноутбуки наступний код: ```python physical_devices = tf.config.list_physical_devices('GPU') @@ -53,17 +53,21 @@ if len(physical_devices)>0: tf.config.experimental.set_memory_growth(physical_devices[0], True) ``` -Якщо вас цікавить вивчення NLP з точки зору класичного 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) +* [Подання тексту у вигляді тензорів](13-TextRep/README.md) +* [Векторне подання слів (Word Embeddings)](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). Хоча ми прагнемо до точності, звертаємо вашу увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file +--- + + +**Відмова від відповідальності**: +Цей документ було перекладено за допомогою сервісу штучного інтелекту для перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, будь ласка, майте на увазі, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ рідною мовою слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. + \ No newline at end of file diff --git a/translations/ur/.co-op-translator.json b/translations/ur/.co-op-translator.json index 6ffc41e6e3..79c440cf9b 100644 --- a/translations/ur/.co-op-translator.json +++ b/translations/ur/.co-op-translator.json @@ -5,6 +5,12 @@ "source_file": "AGENTS.md", "language_code": "ur" }, + "CONTRIBUTING.md": { + "original_hash": "c6fd7e781b67111a90abd166d0ce4aa0", + "translation_date": "2026-07-08T18:45:10+00:00", + "source_file": "CONTRIBUTING.md", + "language_code": "ur" + }, "README.md": { "original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b", "translation_date": "2026-04-06T15:55:21+00:00", @@ -17,6 +23,19 @@ "source_file": "SECURITY.md", "language_code": "ur" }, + "__translation_failures__": { + "lessons/sketchnotes/LICENSE.md": { + "original_hash": "45ab63a2cd8f5faef6c9b150618837a4", + "source_file": "lessons/sketchnotes/LICENSE.md", + "language_code": "ur", + "failure_date": "2026-07-08T18:36: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:16:56+00:00", @@ -54,8 +73,8 @@ "language_code": "ur" }, "examples/README.md": { - "original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7", - "translation_date": "2025-10-03T11:27:17+00:00", + "original_hash": "7883d52c2e2a221e0b07a7b112a149b9", + "translation_date": "2026-07-08T18:32:06+00:00", "source_file": "examples/README.md", "language_code": "ur" }, @@ -66,8 +85,8 @@ "language_code": "ur" }, "lessons/0-course-setup/how-to-run.md": { - "original_hash": "a4717bd9103b9f6cd84d534b83534689", - "translation_date": "2026-01-15T11:48:29+00:00", + "original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1", + "translation_date": "2026-07-08T18:32:29+00:00", "source_file": "lessons/0-course-setup/how-to-run.md", "language_code": "ur" }, @@ -191,6 +210,12 @@ "source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md", "language_code": "ur" }, + "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": { + "original_hash": "99b816b6a4957ef4100cee4c4221dff9", + "translation_date": "2026-07-08T18:28:35+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", + "language_code": "ur" + }, "lessons/4-ComputerVision/08-TransferLearning/lab/README.md": { "original_hash": "7765935c35fcee69b9fe2d0cfd6963e2", "translation_date": "2025-08-26T09:52:38+00:00", @@ -330,8 +355,8 @@ "language_code": "ur" }, "lessons/5-NLP/README.md": { - "original_hash": "8ef02a9318257ea140ed3ed74442096d", - "translation_date": "2025-08-26T08:02:19+00:00", + "original_hash": "038df6f1a73e49f6430740da083bfd6d", + "translation_date": "2026-07-08T18:32:57+00:00", "source_file": "lessons/5-NLP/README.md", "language_code": "ur" }, diff --git a/translations/ur/CONTRIBUTING.md b/translations/ur/CONTRIBUTING.md new file mode 100644 index 0000000000..2e3c66b173 --- /dev/null +++ b/translations/ur/CONTRIBUTING.md @@ -0,0 +1,29 @@ +# AI-For-Beginners میں شراکت + +AI-For-Beginners میں شراکت کے لیے آپ کی دلچسپی کا شکریہ! ہم ترجمے، اسباق کی اصلاحات، اور فارمیٹنگ کی تصحیحات کا خیرمقدم کرتے ہیں۔ + +## مائیکروسافٹ کنٹریبیوٹر لائسنس ایگریمنٹ (CLA) + +یہ پروجیکٹ تعاون اور تجاویز کا خیرمقدم کرتا ہے۔ زیادہ تر تعاون کے لیے آپ کو کنٹریبیوٹر لائسنس ایگریمنٹ (CLA) پر راضی ہونے کی ضرورت ہوتی ہے جس میں یہ اعلان کریں کہ آپ کے پاس حق ہے، اور آپ واقعی، ہمیں آپ کی شراکت کے استعمال کے حقوق دیتے ہیں۔ تفصیلات کے لیے یہاں جائیں: [https://cla.microsoft.com](https://cla.microsoft.com)۔ + +جب آپ پول ریکویسٹ جمع کرواتے ہیں، ایک CLA-بوٹ خودکار طریقے سے طے کرے گا کہ آیا آپ کو CLA فراہم کرنا ضروری ہے اور PR کو مناسب طریقے سے نشان زد کرے گا (جیسے لیبل، تبصرہ)۔ بس بوٹ کی ہدایات پر عمل کریں۔ آپ کو یہ کام ہمارے تمام ریپوزٹریز میں صرف ایک بار کرنا ہوگا جو ہمارے CLA استعمال کرتے ہیں۔ + +## تعاون کیسے کریں + +### 1. املا کی غلطیاں / کوڈ کی غلطیاں درست کرنا +اگر آپ کو کسی Jupyter نوٹ بک یا سبق کی مارک ڈاؤن فائل میں املا یا بگ نظر آئے: +1. ریپوزٹری کو فورک کریں۔ +2. املا یا ٹوٹے ہوئے لنک کو درست کریں۔ +3. اصلاحات کی واضح وضاحت کے ساتھ پول ریکویسٹ جمع کروائیں۔ + +### 2. ترجمے جمع کرانا +ہم اسباق کے دوسرے زبانوں میں ترجمے خوش آمدید کہتے ہیں! برائے مہربانی ترجمے کو `translations/` ڈائریکٹری کے تحت موجودہ فولڈر ناموں کے مطابق رکھیں (مثلاً `translations/es/`, `translations/pt-BR/`, `translations/zh-CN/`)۔ + +مزید تفصیلات کے لیے دیکھیں [etc/CONTRIBUTING.md](etc/CONTRIBUTING.md)۔ + +--- + + +**ڈس کلیمر**: +یہ دستاویز AI ترجمہ سروس [Co-op Translator](https://github.com/Azure/co-op-translator) کے ذریعے ترجمہ کی گئی ہے۔ جبکہ ہم درستگی کے لیے کوشاں ہیں، براہ کرم اس بات سے آگاہ رہیں کہ خودکار ترجمے میں غلطیاں یا عدم درستیاں ہو سکتی ہیں۔ اصل دستاویز اپنے مادری زبان میں مستند ماخذ سمجھی جائے گی۔ حساس معلومات کے لیے پیشہ ور انسانی ترجمہ کی سفارش کی جاتی ہے۔ اس ترجمے کے استعمال سے پیدا ہونے والی کسی بھی غلط فہمی یا غلط تشریح کی ذمہ داری ہم قبول نہیں کرتے۔ + \ No newline at end of file diff --git a/translations/ur/examples/README.md b/translations/ur/examples/README.md index 144ee55ed4..58c5ddd24f 100644 --- a/translations/ur/examples/README.md +++ b/translations/ur/examples/README.md @@ -1,27 +1,27 @@ -# ابتدائی افراد کے لیے AI کی مثالیں +# ابتدائی افراد کے لئے دوستانہ AI مثالیں -خوش آمدید! یہ ڈائریکٹری سادہ اور خود مختار مثالیں فراہم کرتی ہے تاکہ آپ AI اور مشین لرننگ کے ساتھ شروعات کر سکیں۔ ہر مثال کو ابتدائی افراد کے لیے آسان بنایا گیا ہے، جس میں تفصیلی تبصرے اور مرحلہ وار وضاحت شامل ہے۔ +خوش آمدید! یہ ڈائریکٹری آسان، خود مختار مثالیں رکھتی ہے جو آپ کو AI اور مشین لرننگ کے ساتھ شروعات کرنے میں مدد دیتی ہیں۔ ہر مثال کو ابتدائی افراد کے لئے آسان اور تفصیلی تبصروں اور مرحلہ وار وضاحتوں کے ساتھ ڈیزائن کیا گیا ہے۔ ## 📚 مثالوں کا جائزہ -| مثال | وضاحت | مشکل | ضروریات | -|------|-------|-------|----------| -| [ہیلو AI ورلڈ](../../../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 کی بنیادی باتیں | +| [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 ``` @@ -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. **"ہیلو AI ورلڈ" سے شروع کریں** - پیٹرن کی پہچان کی بنیادی باتیں سیکھیں -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) -- [قدرتی زبان کی پروسیسنگ](../lessons/5-NLP/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) کا استعمال کرتے ہوئے ترجمہ کی گئی ہے۔ ہم درستگی کے لیے کوشش کرتے ہیں، لیکن براہ کرم آگاہ رہیں کہ خودکار ترجمے میں غلطیاں یا غیر درستیاں ہو سکتی ہیں۔ اصل دستاویز کو اس کی اصل زبان میں مستند ذریعہ سمجھا جانا چاہیے۔ اہم معلومات کے لیے، پیشہ ور انسانی ترجمہ کی سفارش کی جاتی ہے۔ ہم اس ترجمے کے استعمال سے پیدا ہونے والی کسی بھی غلط فہمی یا غلط تشریح کے ذمہ دار نہیں ہیں۔ \ No newline at end of file + +**ڈس کلیمر**: +یہ دستاویز AI ترجمہ سروس [Co-op Translator](https://github.com/Azure/co-op-translator) کے ذریعے ترجمہ کی گئی ہے۔ جبکہ ہم درستگی کے لیے کوشاں ہیں، براہ کرم اس بات سے آگاہ رہیں کہ خودکار ترجمے میں غلطیاں یا عدم درستیاں ہو سکتی ہیں۔ اصل دستاویز اپنے مادری زبان میں مستند ماخذ سمجھی جائے گی۔ حساس معلومات کے لیے پیشہ ور انسانی ترجمہ کی سفارش کی جاتی ہے۔ اس ترجمے کے استعمال سے پیدا ہونے والی کسی بھی غلط فہمی یا غلط تشریح کی ذمہ داری ہم قبول نہیں کرتے۔ + \ No newline at end of file diff --git a/translations/ur/lessons/0-course-setup/how-to-run.md b/translations/ur/lessons/0-course-setup/how-to-run.md index 9b1ca5e4fd..50033dc8b6 100644 --- a/translations/ur/lessons/0-course-setup/how-to-run.md +++ b/translations/ur/lessons/0-course-setup/how-to-run.md @@ -1,10 +1,10 @@ -# کوڈ کیسے چلائیں +# کوڈ کو کیسے چلائیں -اس نصاب میں بہت سے قابل عمل مثالیں اور لیب شامل ہیں جنہیں آپ چلانا چاہیں گے۔ ایسا کرنے کے لیے، آپ کو اس نصاب کے حصے کے طور پر فراہم کردہ Jupyter نوٹ بکس میں Python کوڈ چلانے کی صلاحیت کی ضرورت ہے۔ کوڈ چلانے کے کئی اختیارات موجود ہیں: +اس نصاب میں بہت سے قابل عمل مثالیں اور لیبز شامل ہیں جنہیں آپ چلانا چاہیں گے۔ ایسا کرنے کے لیے، آپ کو اس نصاب کے حصے کے طور پر فراہم کردہ Jupyter Notebooks میں Python کوڈ چلانے کی صلاحیت کی ضرورت ہے۔ کوڈ چلانے کے لیے آپ کے پاس کئی اختیارات ہیں: -## اپنے کمپیوٹر پر مقامی طور پر چلانا +## اپنے کمپیوٹر پر مقامی طور پر چلائیں -اپنے کمپیوٹر پر کوڈ چلانے کے لیے، Python کی تنصیب ضروری ہے۔ ایک تجویز یہ ہے کہ **[miniconda](https://conda.io/en/latest/miniconda.html)** انسٹال کریں - یہ ایک نسبتاً ہلکی تنصیب ہے جو مختلف Python **ورچوئل ماحولیات** کے لیے `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 میں Python Extension کے ساتھ استعمال +### Python ایکسٹینشن کے ساتھ 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) میں [Python Extension](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste) کے ساتھ کھولیں۔ -> **نوٹ**: جب آپ ریپوزٹری کلون کر کے اسے VS Code میں کھولیں گے، تو یہ خود بخود Python کی توسیعات انسٹال کرنے کی تجویز دے گا۔ آپ کو منیکونڈا بھی انسٹال کرنا ہوگا جیسا کہ اوپر بیان کیا گیا ہے۔ +> **نوٹ**: جب آپ ریپوزٹری کلون کریں اور VS Code میں ڈائریکٹری کھولیں، تو یہ خود بخود آپ کو Python ایکسٹینشنز انسٹال کرنے کی تجویز دے گا۔ آپ کو اوپر بیان کردہ طریقے سے miniconda بھی انسٹال کرنا ہوگا۔ -> **نوٹ**: اگر VS Code آپ کو ریپوزٹری کو کنٹینر میں دوبارہ کھولنے کا مشورہ دے تو آپ کو یہ رد کر دینا چاہیے تاکہ مقامی Python تنصیب استعمال کی جا سکے۔ +> **نوٹ**: اگر VS Code آپ کو ریپوزٹری کو کنٹینر میں دوبارہ کھولنے کی تجویز دیتا ہے، تو آپ کو لوکل Python انسٹالیشن استعمال کرنے کے لیے اسے مسترد کرنا چاہیے۔ -### براؤزر میں Jupyter استعمال کرنا +### براؤزر میں Jupyter کا استعمال -آپ اپنے کمپیوٹر کے براؤزر سے Jupyter ماحول بھی استعمال کر سکتے ہیں۔ کلاسیکی Jupyter اور JupyterHub دونوں آٹو مکمل کرنے، کوڈ ہائلائٹنگ، وغیرہ کے ساتھ سہولت بخش ترقیاتی ماحول فراہم کرتے ہیں۔ +آپ اپنے کمپیوٹر میں براؤزر سے Jupyter ماحول بھی استعمال کر سکتے ہیں۔ کلاسیکل Jupyter اور JupyterHub دونوں آسان ترقیاتی ماحول فراہم کرتے ہیں جن میں آٹو کمپلیشن، کوڈ ہائلائٹنگ وغیرہ شامل ہیں۔ -مقامی Jupyter شروع کرنے کے لیے، کورس کی ڈائریکٹری میں جائیں، اور یہ کمانڈ چلائیں: +Jupyter کو مقامی طور پر شروع کرنے کے لیے، کورس کی ڈائریکٹری میں جائیں، اور درج ذیل کو چلائیں: ```bash jupyter notebook @@ -40,32 +40,32 @@ jupyterhub ### کنٹینر میں چلانا -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 میں کھولتا ہے - یہ آپ کو جلدی سے بائنڈر سائٹ پر لے جائے گا، جو ایک بنیادی کنٹینر کو تعمیر کرے گا اور آپ کے لیے 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 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) بنائیں اور 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 Notebooks اپ لوڈ کر کے انہیں ایک ایک کر کے چلا سکتے ہیں۔ --- -**انتباہ**: -یہ دستاویز AI ترجمہ سروس [Co-op Translator](https://github.com/Azure/co-op-translator) کے ذریعے ترجمہ کی گئی ہے۔ اگرچہ ہم درستگی کی کوشش کرتے ہیں، براہ کرم اس بات سے آگاہ رہیں کہ خودکار ترجمے میں غلطیاں یا عدم مطابقت ہو سکتی ہے۔ اصل دستاویز اپنی مادری زبان میں ماخذ کا معتبر ذریعہ سمجھا جانا چاہیے۔ اہم معلومات کے لیے پیشہ ور انسانی ترجمہ کی سفارش کی جاتی ہے۔ ہم اس ترجمے کے استعمال سے پیدا ہونے والی کسی بھی غلط فہمی یا غلط تشریح کے ذمہ دار نہیں ہیں۔ +**ڈس کلیمر**: +یہ دستاویز AI ترجمہ سروس [Co-op Translator](https://github.com/Azure/co-op-translator) کے ذریعے ترجمہ کی گئی ہے۔ جبکہ ہم درستگی کے لیے کوشاں ہیں، براہ کرم اس بات سے آگاہ رہیں کہ خودکار ترجمے میں غلطیاں یا عدم درستیاں ہو سکتی ہیں۔ اصل دستاویز اپنے مادری زبان میں مستند ماخذ سمجھی جائے گی۔ حساس معلومات کے لیے پیشہ ور انسانی ترجمہ کی سفارش کی جاتی ہے۔ اس ترجمے کے استعمال سے پیدا ہونے والی کسی بھی غلط فہمی یا غلط تشریح کی ذمہ داری ہم قبول نہیں کرتے۔ \ No newline at end of file diff --git a/translations/ur/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/ur/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index 88f9809596..161db3742c 100644 --- a/translations/ur/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/ur/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -4,11 +4,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# پہلے سے تربیت یافتہ ماڈلز اور ٹرانسفر لرننگ\n", + "# پہلے سے تربیت یافتہ ماڈل اور منتقلی سیکھنا\n", "\n", - "سی این اینز کی تربیت میں کافی وقت لگ سکتا ہے، اور اس کام کے لیے بہت زیادہ ڈیٹا کی ضرورت ہوتی ہے۔ تاہم، زیادہ تر وقت نیٹ ورک کے بہترین کم سطحی فلٹرز سیکھنے میں صرف ہوتا ہے جو تصاویر سے پیٹرنز نکالنے کے لیے استعمال ہوتے ہیں۔ ایک قدرتی سوال پیدا ہوتا ہے - کیا ہم ایک ڈیٹاسیٹ پر تربیت یافتہ نیورل نیٹ ورک کو استعمال کر سکتے ہیں اور اسے مختلف تصاویر کی درجہ بندی کے لیے بغیر مکمل تربیتی عمل کے ڈھال سکتے ہیں؟\n", + "CNNs کی تربیت میں بہت وقت لگ سکتا ہے، اور اس کام کے لیے بہت سا ڈیٹا درکار ہوتا ہے۔ تاہم، زیادہ تر وقت بہترین کم سطحی فلٹرز سیکھنے میں صرف ہوتا ہے جو نیٹ ورک تصویر سے پیٹرن نکالنے کے لیے استعمال کر رہا ہوتا ہے۔ ایک قدرتی سوال پیدا ہوتا ہے - کیا ہم کسی ایک ڈیٹا سیٹ پر تربیت یافتہ نیورل نیٹ ورک کو استعمال کر کے بغیر مکمل تربیتی عمل کے مختلف تصاویر کی درجہ بندی کے لیے ڈھال سکتے ہیں؟\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) استعمال کریں گے، جسے [مایکروسافٹ سے بھی ڈاؤن لوڈ کیا جا سکتا ہے](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", + "حقیقی زندگی میں، تصویری ڈیٹاسیٹس کا سائز کافی بڑا ہو سکتا ہے، اور یہ ممکن نہیں کہ سارا ڈیٹا میموری میں ایک ساتھ سما جائے۔ لہٰذا، ڈیٹاسیٹس کو اکثر **جنریٹرز** کی صورت میں پیش کیا جاتا ہے جو تربیت کے لئے مناسب چھوٹے گروپوں میں ڈیٹا واپس کر سکتے ہیں۔\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", @@ -510,20 +520,17 @@ "cell_type": "markdown", "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" + "یہاں چند اہم باتیں ہیں:\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": [ - "## جی پی یو پر حساب کتاب\n", + "## جی پی یو کمپیوٹیشنز\n", "\n", - "ڈیپ نیورل نیٹ ورکس، جیسے کہ VGG-16 اور دیگر جدید آرکیٹیکچرز، کو چلانے کے لیے کافی زیادہ کمپیوٹیشنل پاور کی ضرورت ہوتی ہے۔ اگر جی پی یو ایکسیلیریشن دستیاب ہو تو اسے استعمال کرنا سمجھداری کی بات ہے۔ خوش قسمتی سے، اگر جی پی یو دستیاب ہو تو کیراس خود بخود جی پی یو پر حساب کتاب کو تیز کر دیتا ہے۔ ہم درج ذیل کوڈ کے ذریعے چیک کر سکتے ہیں کہ آیا ٹینسر فلو جی پی یو استعمال کرنے کے قابل ہے یا نہیں:\n" + "ڈیپ نیورل نیٹ ورکس، جیسے کہ VGG-16 اور دیگر زیادہ جدید آرکیٹیکچرز کو چلانے کے لیے کافی زیادہ کمپیوٹیشنل طاقت کی ضرورت ہوتی ہے۔ اگر جی پی یو دستیاب ہو تو اسے استعمال کرنا منطقی ہے۔ خوش قسمتی سے، Keras خود بخود جی پی یو پر کمپیوٹیشنز کو تیز کرتا ہے اگر وہ دستیاب ہو۔ ہم یہ چیک کر سکتے ہیں کہ Tensorflow جی پی یو استعمال کرنے کے قابل ہے یا نہیں، درج ذیل کوڈ کے ذریعے:\n" ] }, { @@ -629,9 +636,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## وی جی جی فیچرز نکالنا\n", "\n", - "اگر ہم اپنی تصاویر سے فیچرز نکالنے کے لیے وی جی جی-16 استعمال کرنا چاہتے ہیں، تو ہمیں ماڈل کی آخری درجہ بندی کی تہوں کے بغیر ضرورت ہوگی۔ ہم وی جی جی-16 ماڈل کو بغیر اوپر کی تہوں کے اس کوڈ کے ذریعے انسٹیٹیوٹ کر سکتے ہیں:\n" + "## VGG خصوصیات نکالنا\n", + "\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", + "## ایک 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 بطور فیچر ایکسٹریکٹر کام کرے، اور دوبارہ ٹرین نہ ہو۔ اس لیے، ہمیں **convolutional feature extractor کے وزنوں کو فریز کرنا** ہوگا۔ ہم نیٹ ورک کی پہلی پرت تک `model.layers[0]` کال کرکے رسائی حاصل کر سکتے ہیں، اور ہمیں صرف `trainable` پراپرٹی کو `False` پر سیٹ کرنا ہے۔\n", "\n", - "> **نوٹ**: فیچر ایکسٹریکٹر کے ویٹس کو فریز کرنا ضروری ہے، کیونکہ بصورت دیگر غیر تربیت یافتہ کلاسیفائر لئیر کنوولوشنل ایکسٹریکٹر کے اصل پری ٹرینڈ ویٹس کو خراب کر سکتی ہے۔\n", + "> **نوٹ**: فیچر ایکسٹریکٹر کے وزنوں کو فریز کرنا ضروری ہے، کیونکہ ورنہ بغیر تربیت کی گئی کلاسیفائر پرت convolutional extractor کے اصل پری ٹرینڈ وزنوں کو خراب کر سکتی ہے۔\n", "\n", - "آپ دیکھ سکتے ہیں کہ اگرچہ ہمارے نیٹ ورک میں کل پیرامیٹرز کی تعداد تقریباً 15 ملین ہے، ہم صرف 25 ہزار پیرامیٹرز کو تربیت دے رہے ہیں۔ باقی تمام ٹاپ لیول کنوولوشنل فلٹرز کے پیرامیٹرز پہلے سے تربیت یافتہ ہیں۔ یہ اچھی بات ہے، کیونکہ ہم کم تعداد میں مثالوں کے ساتھ کم تعداد میں پیرامیٹرز کو بہتر طریقے سے ٹرین کر سکتے ہیں۔\n", + "آپ نوٹ کر سکتے ہیں کہ اگرچہ ہمارے نیٹ ورک میں کل پیرامیٹرز کی تعداد تقریباً 15 ملین ہے، ہم صرف 25 ہزار پیرامیٹرز کو ٹرین کر رہے ہیں۔ باقی تمام ٹاپ لیول convolutional فلٹرز کے پیرامیٹرز پری ٹرینڈ ہیں۔ یہ اچھا ہے، کیونکہ ہم کم تعداد کے پیرامیٹرز کو کم تعداد کی مثالوں کے ساتھ فائن ٹیون کر سکتے ہیں۔\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", - "> **نوٹ:** یہ ضروری ہے کہ آپ پہلے پیرامیٹرز کو فریز کریں اور کئی ایپوکز کی تربیت کریں تاکہ کلاسفیکیشن لیئر میں ویٹس کو مستحکم کیا جا سکے۔ اگر آپ فوراً ان فریز پیرامیٹرز کے ساتھ اینڈ ٹو اینڈ نیٹ ورک کی تربیت شروع کر دیں، تو بڑے ایررز ممکنہ طور پر کنوولوشنل لیئرز میں پری ٹرینڈ ویٹس کو خراب کر سکتے ہیں۔\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" + "تاہم، ایک ساتھ سب کو ان فریز کرنا بہترین خیال نہیں ہے۔ ہم پہلے صرف چند آخری کنولوشنز کی تہوں کو ان فریز کر سکتے ہیں، کیونکہ ان میں اعلیٰ سطح کے پیٹرنز ہوتے ہیں جو ہماری تصاویر کے لئے متعلقہ ہیں۔ مثال کے طور پر، شروع کرنے کے لئے، ہم آخری 4 کے علاوہ سب تہوں کو فریز کر سکتے ہیں: \n" ] }, { @@ -1003,11 +1011,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "مشاہدہ کریں کہ تربیت کے قابل پیرامیٹرز کی تعداد میں نمایاں اضافہ ہوا ہے، لیکن یہ اب بھی تمام پیرامیٹرز کا تقریباً 50% ہے۔\n", + "نوٹ کریں کہ تربیت پذیر پیرامیٹرز کی تعداد میں نمایاں اضافہ ہوا ہے، لیکن یہ اب بھی تمام پیرامیٹرز کا تقریباً 50٪ ہے۔\n", "\n", - "انجماد ختم کرنے کے بعد، ہم تربیت کے کچھ مزید دور کر سکتے ہیں (ہمارے مثال میں، ہم صرف ایک دور کریں گے)۔ آپ کم سیکھنے کی شرح بھی منتخب کر سکتے ہیں تاکہ پہلے سے تربیت شدہ وزن پر اثر کو کم کیا جا سکے۔ تاہم، کم سیکھنے کی شرح کے باوجود، آپ توقع کر سکتے ہیں کہ تربیت کے آغاز میں درستگی کم ہو جائے گی، اور آخر کار وہ سطح حاصل کرے گی جو مقررہ وزن کے معاملے میں تھوڑی زیادہ ہو۔\n", + "ان فریزنگ کے بعد، ہم کچھ مزید ادوار کی تربیت کر سکتے ہیں (ہمارے مثال میں، ہم صرف ایک کریں گے)۔ آپ کم سیکھنے کی شرح بھی منتخب کر سکتے ہیں، تاکہ پری ٹرینڈ وزنوں پر اثر کو کم سے کم کیا جا سکے۔ تاہم، کم سیکھنے کی شرح کے ساتھ بھی، آپ توقع کر سکتے ہیں کہ تربیت کے آغاز میں درستگی کم ہو جائے، جب تک کہ آخر کار یہ ٹرینڈ وزنوں کے معاملے سے تھوڑا زیادہ سطح تک پہنچ نہ جائے۔\n", "\n", - "> **نوٹ:** یہ تربیت بہت زیادہ سست ہوتی ہے، کیونکہ ہمیں نیٹ ورک کی کئی تہوں کے ذریعے گریڈینٹس واپس بھیجنے کی ضرورت ہوتی ہے!\n" + "> **نوٹ:** یہ تربیت بہت سست ہوتی ہے، کیونکہ ہمیں نیٹ ورک کی بہت سی پرتوں کے ذریعے گریڈینٹس کو واپس پھیلانا ہوتا ہے!\n" ] }, { @@ -1031,9 +1039,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "ہم ممکنہ طور پر زیادہ تربیتی درستگی حاصل کریں گے، کیونکہ ہم زیادہ طاقتور نیٹ ورک استعمال کر رہے ہیں جس میں زیادہ پیرامیٹرز ہیں، لیکن توثیقی درستگی اتنی زیادہ نہیں بڑھے گی۔\n", + "چونکہ ہم زیادہ طاقتور نیٹ ورک استعمال کر رہے ہیں جس میں زیادہ پیرا میٹرز ہیں، اس لیے ممکن ہے کہ ہم زیادہ تربیتی درستگی حاصل کریں، لیکن توثیقی درستگی اتنی زیادہ نہیں بڑھے گی۔\n", "\n", - "مزید تہوں کو غیر منجمد کرنے اور مزید تربیت کرنے میں ہچکچاہٹ محسوس نہ کریں، تاکہ یہ دیکھ سکیں کہ کیا آپ زیادہ درستگی حاصل کر سکتے ہیں!\n" + "نیٹ ورک کی چند مزید تہوں کو غیر منجمد کرنے اور مزید تربیت دینے کے لیے بلا جھجھک کوشش کریں، تاکہ دیکھ سکیں کہ کیا آپ زیادہ درستگی حاصل کر سکتے ہیں!\n" ] }, { @@ -1042,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** گوگل کی طرف سے ہے۔ مثال کے طور پر، آئیے سب سے آسان ResNet-50 ماڈل کی آرکیٹیکچر کو دریافت کرتے ہیں (ResNet مختلف گہرائیوں کے ماڈلز کا ایک خاندان ہے، اگر آپ واقعی گہرے ماڈل کو دیکھنا چاہتے ہیں تو ResNet-152 کے ساتھ تجربہ کر سکتے ہیں):\n" ] }, { @@ -1444,11 +1452,11 @@ "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" ] }, { @@ -1457,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\n**ڈس کلیمر**:\nیہ دستاویز AI ترجمہ سروس [Co-op Translator](https://github.com/Azure/co-op-translator) کے ذریعے ترجمہ کی گئی ہے۔ جبکہ ہم درستگی کے لیے کوشاں ہیں، براہ کرم اس بات سے آگاہ رہیں کہ خودکار ترجمے میں غلطیاں یا عدم درستیاں ہو سکتی ہیں۔ اصل دستاویز اپنے مادری زبان میں مستند ماخذ سمجھی جائے گی۔ حساس معلومات کے لیے پیشہ ور انسانی ترجمہ کی سفارش کی جاتی ہے۔ اس ترجمے کے استعمال سے پیدا ہونے والی کسی بھی غلط فہمی یا غلط تشریح کی ذمہ داری ہم قبول نہیں کرتے۔\n\n" ] } ], @@ -1487,12 +1495,6 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" - }, - "coopTranslator": { - "original_hash": "c189abc107848f96051085cc30945129", - "translation_date": "2025-08-28T03:09:57+00:00", - "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", - "language_code": "ur" } }, "nbformat": 4, diff --git a/translations/ur/lessons/5-NLP/README.md b/translations/ur/lessons/5-NLP/README.md index 3a80f0fb77..40f0a6783e 100644 --- a/translations/ur/lessons/5-NLP/README.md +++ b/translations/ur/lessons/5-NLP/README.md @@ -2,76 +2,72 @@ ![NLP کے کاموں کا خلاصہ ایک خاکے میں](../../../../translated_images/ur/ai-nlp.b22dcb8ca4707cea.webp) -اس حصے میں، ہم نیورل نیٹ ورکس کا استعمال کرتے ہوئے **قدرتی زبان کی پروسیسنگ (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 کام روایتی طریقوں جیسے قواعد سے حل کیے جاتے تھے۔ مثال کے طور پر، مشین ترجمہ میں جملے کو ترتیب درخت میں تبدیل کرنے کے لیے پارسر استعمال کیے جاتے تھے، پھر جملے کے مطلب کی نمائندگی کے لیے اعلیٰ سطحی معنوی ڈھانچے نکالے جاتے تھے، اور اس مطلب اور ہدف زبان کے قواعد کی بنیاد پر نتیجہ تیار کیا جاتا تھا۔ آج کل، بہت سے 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 کام نیورل نیٹ ورکس کا استعمال کرتے ہوئے زیادہ مؤثر طریقے سے حل کیے جاتے ہیں۔ - -> بہت سے کلاسیکی NLP طریقے [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org) پائتھون لائبریری میں نافذ کیے گئے ہیں۔ ایک شاندار [NLTK کتاب](https://www.nltk.org/book/) آن لائن دستیاب ہے جو یہ بتاتی ہے کہ مختلف NLP کاموں کو NLTK کا استعمال کرتے ہوئے کیسے حل کیا جا سکتا ہے۔ - -ہمارے کورس میں، ہم زیادہ تر NLP کے لیے نیورل نیٹ ورکس کے استعمال پر توجہ مرکوز کریں گے، اور جہاں ضرورت ہو NLTK کا استعمال کریں گے۔ - -ہم نے پہلے ہی نیورل نیٹ ورکس کو ٹیبلر ڈیٹا اور تصاویر کے ساتھ کام کرنے کے لیے استعمال کرنے کے بارے میں سیکھا ہے۔ ان ڈیٹا کی اقسام اور متن کے درمیان بنیادی فرق یہ ہے کہ متن متغیر لمبائی کا ایک سلسلہ ہے، جبکہ تصاویر کے معاملے میں ان پٹ سائز پہلے سے معلوم ہوتا ہے۔ اگرچہ کنوولوشنل نیٹ ورکس ان پٹ ڈیٹا سے پیٹرن نکال سکتے ہیں، متن میں پیٹرن زیادہ پیچیدہ ہوتے ہیں۔ مثال کے طور پر، ہم یہ دیکھ سکتے ہیں کہ نفی کسی موضوع سے کئی الفاظ کے فاصلے پر ہو سکتی ہے (جیسے: *مجھے نارنگیاں پسند نہیں ہیں*، بمقابلہ *مجھے وہ بڑی رنگین مزیدار نارنگیاں پسند نہیں ہیں*)، اور اسے اب بھی ایک ہی پیٹرن کے طور پر سمجھا جانا چاہیے۔ لہذا، زبان کو سنبھالنے کے لیے ہمیں نیورل نیٹ ورکس کی نئی اقسام متعارف کرانے کی ضرورت ہے، جیسے *ریکررنٹ نیٹ ورکس* اور *ٹرانسفارمرز*۔ - -## لائبریریاں انسٹال کریں - -اگر آپ اس کورس کو چلانے کے لیے مقامی پائتھون انسٹالیشن استعمال کر رہے ہیں، تو آپ کو NLP کے لیے تمام مطلوبہ لائبریریاں درج ذیل کمانڈز کے ذریعے انسٹال کرنے کی ضرورت ہو سکتی ہے: - -**PyTorch کے لیے** +**پائٹورش کے لیے** ```bash -pip install -r requirements-torch.txt -``` -**TensorFlow کے لیے** +pip install -r requirements-pytorch.txt +``` +**ٹینسر فلو کے لیے** ```bash pip install -r requirements-tf.txt -``` +``` -> آپ TensorFlow کے ساتھ NLP کو [Microsoft Learn](https://docs.microsoft.com/learn/modules/intro-natural-language-processing-tensorflow/?WT.mc_id=academic-77998-cacaste) پر آزما سکتے ہیں۔ +> آپ [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') 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) +--- -**ڈسکلیمر**: -یہ دستاویز AI ترجمہ سروس [Co-op Translator](https://github.com/Azure/co-op-translator) کا استعمال کرتے ہوئے ترجمہ کی گئی ہے۔ ہم درستگی کے لیے کوشش کرتے ہیں، لیکن براہ کرم آگاہ رہیں کہ خودکار ترجمے میں غلطیاں یا غیر درستیاں ہو سکتی ہیں۔ اصل دستاویز کو اس کی اصل زبان میں مستند ذریعہ سمجھا جانا چاہیے۔ اہم معلومات کے لیے، پیشہ ور انسانی ترجمہ کی سفارش کی جاتی ہے۔ ہم اس ترجمے کے استعمال سے پیدا ہونے والی کسی بھی غلط فہمی یا غلط تشریح کے ذمہ دار نہیں ہیں۔ \ No newline at end of file + +**ڈس کلیمر**: +یہ دستاویز AI ترجمہ سروس [Co-op Translator](https://github.com/Azure/co-op-translator) کے ذریعے ترجمہ کی گئی ہے۔ جبکہ ہم درستگی کے لیے کوشاں ہیں، براہ کرم اس بات سے آگاہ رہیں کہ خودکار ترجمے میں غلطیاں یا عدم درستیاں ہو سکتی ہیں۔ اصل دستاویز اپنے مادری زبان میں مستند ماخذ سمجھی جائے گی۔ حساس معلومات کے لیے پیشہ ور انسانی ترجمہ کی سفارش کی جاتی ہے۔ اس ترجمے کے استعمال سے پیدا ہونے والی کسی بھی غلط فہمی یا غلط تشریح کی ذمہ داری ہم قبول نہیں کرتے۔ + \ No newline at end of file diff --git a/translations/vi/.co-op-translator.json b/translations/vi/.co-op-translator.json index edae883888..1ba7155b4d 100644 --- a/translations/vi/.co-op-translator.json +++ b/translations/vi/.co-op-translator.json @@ -5,6 +5,12 @@ "source_file": "AGENTS.md", "language_code": "vi" }, + "CONTRIBUTING.md": { + "original_hash": "c6fd7e781b67111a90abd166d0ce4aa0", + "translation_date": "2026-07-08T16:18:37+00:00", + "source_file": "CONTRIBUTING.md", + "language_code": "vi" + }, "README.md": { "original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b", "translation_date": "2026-04-06T20:26:37+00:00", @@ -17,6 +23,19 @@ "source_file": "SECURITY.md", "language_code": "vi" }, + "__translation_failures__": { + "lessons/sketchnotes/LICENSE.md": { + "original_hash": "45ab63a2cd8f5faef6c9b150618837a4", + "source_file": "lessons/sketchnotes/LICENSE.md", + "language_code": "vi", + "failure_date": "2026-07-08T16:13:31+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:22+00:00", @@ -54,8 +73,8 @@ "language_code": "vi" }, "examples/README.md": { - "original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7", - "translation_date": "2025-10-03T11:32:24+00:00", + "original_hash": "7883d52c2e2a221e0b07a7b112a149b9", + "translation_date": "2026-07-08T16:07:59+00:00", "source_file": "examples/README.md", "language_code": "vi" }, @@ -66,8 +85,8 @@ "language_code": "vi" }, "lessons/0-course-setup/how-to-run.md": { - "original_hash": "a4717bd9103b9f6cd84d534b83534689", - "translation_date": "2026-01-16T03:40:24+00:00", + "original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1", + "translation_date": "2026-07-08T16:08:24+00:00", "source_file": "lessons/0-course-setup/how-to-run.md", "language_code": "vi" }, @@ -191,6 +210,12 @@ "source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md", "language_code": "vi" }, + "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": { + "original_hash": "99b816b6a4957ef4100cee4c4221dff9", + "translation_date": "2026-07-08T15:59:02+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", + "language_code": "vi" + }, "lessons/4-ComputerVision/08-TransferLearning/lab/README.md": { "original_hash": "7765935c35fcee69b9fe2d0cfd6963e2", "translation_date": "2025-08-29T12:22:30+00:00", @@ -330,8 +355,8 @@ "language_code": "vi" }, "lessons/5-NLP/README.md": { - "original_hash": "8ef02a9318257ea140ed3ed74442096d", - "translation_date": "2025-08-29T12:41:19+00:00", + "original_hash": "038df6f1a73e49f6430740da083bfd6d", + "translation_date": "2026-07-08T16:08:57+00:00", "source_file": "lessons/5-NLP/README.md", "language_code": "vi" }, diff --git a/translations/vi/CONTRIBUTING.md b/translations/vi/CONTRIBUTING.md new file mode 100644 index 0000000000..a2c76c6c8a --- /dev/null +++ b/translations/vi/CONTRIBUTING.md @@ -0,0 +1,29 @@ +# Đóng góp cho AI-For-Beginners + +Cảm ơn bạn đã quan tâm đến việc đóng góp cho AI-For-Beginners! Chúng tôi hoan nghênh các bản dịch, sửa bài học, và chỉnh sửa định dạng. + +## Thỏa thuận Giấy phép Đóng góp viên của Microsoft (CLA) + +Dự án này hoan nghênh các đóng góp và đề xuất. Hầu hết các đóng góp đòi hỏi bạn phải đồng ý với Thỏa thuận Giấy phép Đóng góp viên (CLA) tuyên bố rằng bạn có quyền và thực sự cấp cho chúng tôi quyền sử dụng đóng góp của bạn. Chi tiết vui lòng xem tại [https://cla.microsoft.com](https://cla.microsoft.com). + +Khi bạn gửi yêu cầu kéo, một bot CLA sẽ tự động xác định xem bạn có cần cung cấp CLA hay không và trang trí PR phù hợp (ví dụ: nhãn, bình luận). Chỉ cần làm theo hướng dẫn do bot cung cấp. Bạn chỉ cần làm việc này một lần cho tất cả các kho lưu trữ sử dụng CLA của chúng tôi. + +## Cách Đóng góp + +### 1. Sửa lỗi chính tả / lỗi mã +Nếu bạn tìm thấy lỗi chính tả hoặc lỗi trong bất kỳ sổ tay Jupyter hoặc tập tin markdown bài học nào: +1. Fork kho lưu trữ. +2. Sửa lỗi chính tả hoặc liên kết hỏng. +3. Gửi Yêu cầu Kéo với mô tả rõ ràng về sửa chữa. + +### 2. Gửi Bản dịch +Chúng tôi hoan nghênh các bản dịch bài học sang các ngôn ngữ khác! Vui lòng đặt các bản dịch dưới thư mục `translations/` sử dụng các tên thư mục hiện có ở đó (ví dụ `translations/es/`, `translations/pt-BR/`, `translations/zh-CN/`). + +Để biết thêm chi tiết, xem [etc/CONTRIBUTING.md](etc/CONTRIBUTING.md). + +--- + + +**Tuyên bố miễn trừ trách nhiệm**: +Tài liệu này đã được dịch bằng dịch vụ dịch thuật AI [Co-op Translator](https://github.com/Azure/co-op-translator). Mặc dù chúng tôi cố gắng đảm bảo độ chính xác, xin lưu ý rằng bản dịch tự động có thể chứa lỗi hoặc sai sót. Tài liệu gốc bằng ngôn ngữ gốc nên được coi là nguồn tin chính thức. Đối với thông tin quan trọng, nên sử dụng dịch vụ dịch thuật chuyên nghiệp bởi con người. Chúng tôi không chịu trách nhiệm về bất kỳ hiểu lầm hoặc giải thích sai nào phát sinh từ việc sử dụng bản dịch này. + \ No newline at end of file diff --git a/translations/vi/examples/README.md b/translations/vi/examples/README.md index 61e5f2cd4b..4976dd1ef4 100644 --- a/translations/vi/examples/README.md +++ b/translations/vi/examples/README.md @@ -1,85 +1,87 @@ -# Các Ví dụ AI Dễ Hiểu +# Ví dụ AI thân thiện cho người mới bắt đầu -Chào mừng bạn! Thư mục này chứa các ví dụ đơn giản, độc lập để giúp bạn bắt đầu với AI và học máy. Mỗi ví dụ được thiết kế thân thiện với người mới bắt đầu, kèm theo các bình luận chi tiết và hướng dẫn từng bước. +Chào mừng! Thư mục này chứa các ví dụ đơn giản, độc lập để giúp bạn bắt đầu với AI và học máy. Mỗi ví dụ được thiết kế thân thiện với người mới bắt đầu với các chú thích chi tiết và giải thích từng bước. -## 📚 Tổng Quan Các Ví Dụ +## 📚 Tổng quan về các ví dụ -| Ví dụ | Mô tả | Mức độ khó | Yêu cầu trước | -|-------|-------|------------|---------------| -| [Hello AI World](../../../examples/01-hello-ai-world.py) | Chương trình AI đầu tiên của bạn - nhận diện mẫu đơn giản | ⭐ Dễ | Kiến thức cơ bản về Python | -| [Simple Neural Network](../../../examples/02-simple-neural-network.py) | Tạo một mạng nơ-ron từ đầu | ⭐⭐ Dễ+ | Python, toán học cơ bản | -| [Image Classifier](./03-image-classifier.ipynb) | Phân loại hình ảnh với mô hình đã được huấn luyện trước | ⭐⭐ Dễ+ | Python, numpy | -| [Text Sentiment](../../../examples/04-text-sentiment.py) | Phân tích cảm xúc văn bản (tích cực/tiêu cực) | ⭐⭐ Dễ+ | Python | +| Ví dụ | Mô tả | Độ khó | Yêu cầu trước | +|---------|-------------|------------|---------------| +| [Hello AI World](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/01-hello-ai-world.py) | Chương trình AI đầu tiên của bạn - nhận dạng mẫu đơn giản | ⭐ Người mới bắt đầu | Kiến thức cơ bản Python | +| [Simple Neural Network](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/02-simple-neural-network.py) | Xây dựng mạng nơ-ron từ đầu | ⭐⭐ Người mới bắt đầu+ | Python, toán cơ bản | +| [Image Classifier](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/03-image-classifier.ipynb) | Phân loại hình ảnh với mô hình đã được huấn luyện sẵn | ⭐⭐ Người mới bắt đầu+ | Python, numpy | +| [Text Sentiment](https://github.com/microsoft/AI-For-Beginners/blob/main/examples/04-text-sentiment.py) | Phân tích cảm xúc văn bản (tích cực/tiêu cực) | ⭐⭐ Người mới bắt đầu+ | Python | -## 🚀 Bắt Đầu +## 🚀 Bắt đầu -### Yêu Cầu Trước +### Yêu cầu trước -Hãy đảm bảo bạn đã cài đặt Python (khuyến nghị phiên bản 3.8 hoặc cao hơn). Cài đặt các gói cần thiết: +Đảm bảo bạn đã cài đặt Python (khuyến nghị phiên bản 3.8 trở lên). Cài đặt các gói cần thiết: ```bash -# For Python scripts +# Cho các script Python pip install numpy -# For Jupyter notebooks (image classifier) +# Cho các notebook Jupyter (bộ phân loại hình ảnh) pip install jupyter numpy pillow tensorflow ``` -Hoặc sử dụng môi trường conda từ chương trình học chính: +Hoặc sử dụng môi trường conda từ chương trình chính: ```bash conda env create --name ai4beg --file ../environment.yml conda activate ai4beg ``` -### Chạy Các Ví Dụ +### Chạy các ví dụ -**Đối với các tập tin Python (.py):** +**Đối với các tập lệnh Python (.py):** ```bash python 01-hello-ai-world.py ``` -**Đối với các notebook Jupyter (.ipynb):** +**Đối với sổ tay Jupyter (.ipynb):** ```bash jupyter notebook 03-image-classifier.ipynb ``` -## 📖 Lộ Trình Học Tập +## 📖 Lộ trình học tập -Chúng tôi khuyến nghị bạn làm theo thứ tự các ví dụ: +Chúng tôi khuyên bạn nên làm theo thứ tự các ví dụ: -1. **Bắt đầu với "Hello AI World"** - Tìm hiểu cơ bản về nhận diện mẫu -2. **Xây dựng Mạng Nơ-ron Đơn Giản** - Hiểu cách hoạt động của mạng nơ-ron -3. **Thử Phân Loại Hình Ảnh** - Xem AI hoạt động với hình ảnh thực tế -4. **Phân Tích Cảm Xúc Văn Bản** - Khám phá xử lý ngôn ngữ tự nhiên +1. **Bắt đầu với "Hello AI World"** - Học cơ bản về nhận dạng mẫu +2. **Xây dựng Mạng Nơ-ron Đơn giản** - Hiểu cách mạng nơ-ron hoạt động +3. **Thử nghiệm Bộ phân loại hình ảnh** - Xem AI hoạt động với hình ảnh thực +4. **Phân tích cảm xúc văn bản** - Khám phá xử lý ngôn ngữ tự nhiên -## 💡 Mẹo Cho Người Mới Bắt Đầu +## 💡 Mẹo cho người mới bắt đầu -- **Đọc kỹ các bình luận trong mã** - Chúng giải thích từng dòng mã -- **Thử nghiệm!** - Thay đổi các giá trị và xem điều gì xảy ra -- **Đừng lo lắng nếu chưa hiểu hết** - Học tập cần thời gian -- **Đặt câu hỏi** - Sử dụng [Diễn đàn thảo luận](https://github.com/microsoft/AI-For-Beginners/discussions) +- **Đọc kỹ các chú thích trong mã** - Chúng giải thích mỗi dòng làm gì +- **Thử nghiệm!** - Thử thay đổi các giá trị và xem kết quả +- **Đừng lo lắng nếu không hiểu hết mọi thứ** - Học là cả một quá trình +- **Hỏi khi có thắc mắc** - Sử dụng [Bảng thảo luận](https://github.com/microsoft/AI-For-Beginners/discussions) -## 🔗 Bước Tiếp Theo +## 🔗 Bước tiếp theo -Sau khi hoàn thành các ví dụ này, hãy khám phá chương trình học đầy đủ: +Sau khi hoàn thành các ví dụ này, hãy khám phá toàn bộ chương trình: - [Giới thiệu về AI](../lessons/1-Intro/README.md) - [Mạng Nơ-ron](../lessons/3-NeuralNetworks/README.md) -- [Thị Giác Máy Tính](../lessons/4-ComputerVision/README.md) -- [Xử Lý Ngôn Ngữ Tự Nhiên](../lessons/5-NLP/README.md) +- [Thị giác máy tính](../lessons/4-ComputerVision/README.md) +- [Xử lý ngôn ngữ tự nhiên](../lessons/5-NLP/README.md) -## 🤝 Đóng Góp +## 🤝 Đóng góp -Thấy các ví dụ này hữu ích? Hãy giúp chúng tôi cải thiện: +Bạn thấy các ví dụ này hữu ích? Giúp chúng tôi cải thiện chúng: - Báo cáo lỗi hoặc đề xuất cải tiến -- Thêm nhiều ví dụ hơn cho người mới bắt đầu -- Cải thiện tài liệu và các bình luận +- Thêm nhiều ví dụ cho người mới bắt đầu +- Cải thiện tài liệu và chú thích --- -*Hãy nhớ: Mọi chuyên gia đều từng là người mới bắt đầu. Chúc bạn học tập vui vẻ! 🎓* +*Hãy nhớ: Mỗi chuyên gia đều từng là người mới bắt đầu. Chúc bạn học vui vẻ! 🎓* --- -**Tuyên bố miễn trừ trách nhiệm**: -Tài liệu này đã được dịch bằng dịch vụ dịch thuật AI [Co-op Translator](https://github.com/Azure/co-op-translator). Mặc dù chúng tôi cố gắng đảm bảo độ chính xác, xin lưu ý rằng các bản dịch tự động có thể chứa lỗi hoặc không chính xác. Tài liệu gốc bằng ngôn ngữ bản địa nên được coi là nguồn thông tin chính thức. Đối với các thông tin quan trọng, khuyến nghị sử dụng dịch vụ dịch thuật chuyên nghiệp bởi con người. Chúng tôi không chịu trách nhiệm cho bất kỳ sự hiểu lầm hoặc diễn giải sai nào phát sinh từ việc sử dụng bản dịch này. \ No newline at end of file + +**Tuyên bố miễn trừ trách nhiệm**: +Tài liệu này đã được dịch bằng dịch vụ dịch thuật AI [Co-op Translator](https://github.com/Azure/co-op-translator). Mặc dù chúng tôi cố gắng đảm bảo độ chính xác, xin lưu ý rằng bản dịch tự động có thể chứa lỗi hoặc sai sót. Tài liệu gốc bằng ngôn ngữ gốc nên được coi là nguồn tin chính thức. Đối với thông tin quan trọng, nên sử dụng dịch vụ dịch thuật chuyên nghiệp bởi con người. Chúng tôi không chịu trách nhiệm về bất kỳ hiểu lầm hoặc giải thích sai nào phát sinh từ việc sử dụng bản dịch này. + \ No newline at end of file diff --git a/translations/vi/lessons/0-course-setup/how-to-run.md b/translations/vi/lessons/0-course-setup/how-to-run.md index 881bdbf693..81a22109c8 100644 --- a/translations/vi/lessons/0-course-setup/how-to-run.md +++ b/translations/vi/lessons/0-course-setup/how-to-run.md @@ -1,12 +1,12 @@ -# Cách Chạy Mã Lệnh +# Cách Chạy Mã -Chương trình học này chứa nhiều ví dụ và bài thực hành có thể chạy được mà bạn sẽ muốn thử. Để làm điều này, bạn cần khả năng thực thi mã Python trong Jupyter Notebooks được cung cấp như một phần của chương trình học này. Bạn có một số lựa chọn để chạy mã: +Khóa học này bao gồm nhiều ví dụ và bài lab có thể thực thi mà bạn sẽ muốn chạy. Để làm được điều này, bạn cần khả năng thực thi mã Python trong các Jupyter Notebooks được cung cấp như một phần của khóa học này. Bạn có một số lựa chọn để chạy mã: -## Chạy trên máy tính cá nhân +## Chạy cục bộ trên máy tính của bạn -Để chạy mã trên máy tính cá nhân, bạn cần cài đặt Python. Một gợi ý là cài **[miniconda](https://conda.io/en/latest/miniconda.html)** - đây là một bản cài đặt nhẹ hỗ trợ trình quản lý gói `conda` cho các **môi trường ảo** Python khác nhau. +Để chạy mã cục bộ trên máy tính của bạn, cần phải cài đặt Python. Một khuyến nghị là cài đặt **[miniconda](https://conda.io/en/latest/miniconda.html)** - đây là một bản cài đặt nhẹ hỗ trợ trình quản lý gói `conda` cho các **môi trường ảo** Python khác nhau. -Sau khi cài miniconda, bạn clone kho và tạo môi trường ảo để dùng cho khóa học này: +Sau khi bạn cài đặt miniconda, sao chép repository và tạo một môi trường ảo để sử dụng cho khóa học này: ```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 ``` -### Sử dụng Visual Studio Code với Phần mở rộng Python +### Sử dụng Visual Studio Code với Extension Python -Chương trình học này sẽ sử dụng hiệu quả nhất khi mở trong [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) với [Phần mở rộng Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste). +Khóa học này hoạt động tốt nhất khi mở trong [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-77998-cacaste) với [Extension Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-77998-cacaste). -> **Lưu ý**: Khi bạn clone và mở thư mục trong VS Code, nó sẽ tự động gợi ý bạn cài đặt phần mở rộng Python. Bạn cũng cần phải cài miniconda như mô tả ở trên. +> **Lưu ý**: Khi bạn sao chép và mở thư mục trong VS Code, nó sẽ tự động đề xuất bạn cài đặt mở rộng Python. Bạn cũng cần cài miniconda như mô tả ở trên. -> **Lưu ý**: Nếu VS Code gợi ý bạn mở lại kho trong container, bạn nên từ chối để sử dụng cài đặt Python cục bộ. +> **Lưu ý**: Nếu VS Code đề xuất bạn mở lại repository trong container, bạn nên từ chối để sử dụng cài đặt Python cục bộ. ### Sử dụng Jupyter trên trình duyệt -Bạn cũng có thể sử dụng môi trường Jupyter từ trình duyệt trên máy cá nhân. Cả Jupyter truyền thống và JupyterHub đều cung cấp môi trường phát triển tiện lợi với tự động hoàn thành, tô sáng mã, v.v. +Bạn cũng có thể sử dụng môi trường Jupyter trên trình duyệt ngay trên máy tính của mình. Cả Jupyter cổ điển và JupyterHub đều cung cấp môi trường phát triển tiện lợi với tính năng tự động hoàn thành, tô sáng mã, v.v. -Để khởi động Jupyter trên máy, hãy chuyển đến thư mục của khóa học, và chạy: +Để khởi động Jupyter cục bộ, hãy vào thư mục khóa học và thực thi: ```bash jupyter notebook ``` -hoặc + hoặc ```bash jupyterhub ``` -Bạn sau đó có thể mở bất kỳ tập tin `.ipynb` nào để bắt đầu làm việc. +Sau đó bạn có thể điều hướng đến bất kỳ tệp `.ipynb` nào, mở chúng và bắt đầu làm việc. ### Chạy trong container -Một lựa chọn thay thế cho việc cài đặt Python là chạy mã trong container. Vì kho của chúng tôi cung cấp thư mục `.devcontainer` đặc biệt hướng dẫn cách xây dựng container cho kho này, VS Code sẽ cung cấp tùy chọn mở lại mã trong container. Điều này yêu cầu cài Docker, và cũng phức tạp hơn, nên chúng tôi khuyến nghị cho người dùng có kinh nghiệm hơn. +Một lựa chọn thay thế cho việc cài đặt Python là chạy mã trong container. Vì repository của chúng tôi cung cấp một thư mục `.devcontainer` đặc biệt hướng dẫn cách xây dựng container cho repo này, VS Code cung cấp cơ hội mở lại mã trong container. Điều này yêu cầu cài đặt Docker và cũng phức tạp hơn, nên chúng tôi khuyến nghị cách này cho người dùng có kinh nghiệm hơn. -## Chạy trên điện toán đám mây +## Chạy trên đám mây -Nếu bạn không muốn cài Python trên máy và có quyền truy cập một số tài nguyên đám mây - lựa chọn tốt là chạy mã trên đám mây. Có một số cách bạn có thể làm điều này: +Nếu bạn không muốn cài đặt Python cục bộ và có quyền truy cập vào một số tài nguyên đám mây - một lựa chọn tốt là chạy mã trên đám mây. Có một số cách bạn có thể làm điều này: -* Sử dụng **[GitHub Codespaces](https://github.com/features/codespaces)**, một môi trường ảo được tạo trên GitHub cho bạn, truy cập qua giao diện trình duyệt VS Code. Nếu bạn có quyền truy cập Codespaces, bạn chỉ cần bấm nút **Code** trong repo, khởi tạo một codespace và bắt đầu ngay lập tức. -* Sử dụng **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) cung cấp tài nguyên tính toán miễn phí trên đám mây cho người dùng như bạn để thử mã trên GitHub. Có một nút ở trang đầu để mở kho trong Binder - điều này sẽ nhanh chóng đưa bạn đến trang Binder, nơi xây dựng một container bên dưới và khởi động giao diện web Jupyter cho bạn một cách liền mạch. +* Sử dụng **[GitHub Codespaces](https://github.com/features/codespaces)**, một môi trường ảo được tạo cho bạn trên GitHub, có thể truy cập qua giao diện trình duyệt VS Code. Nếu bạn có quyền truy cập vào Codespaces, bạn chỉ cần nhấn nút **Code** trong repo, bắt đầu một codespace và chạy ngay trong tích tắc. +* Sử dụng **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**. [Binder](https://mybinder.org) cung cấp tài nguyên tính toán miễn phí trên đám mây cho bạn thử nghiệm mã trên GitHub. Có một nút ở trang chính để mở repository trong Binder - điều này sẽ nhanh chóng đưa bạn đến trang binder, nơi xây dựng một container nền và khởi động giao diện web Jupyter cho bạn một cách liền mạch. -> **Lưu ý**: Để ngăn ngừa sử dụng sai mục đích, Binder chặn truy cập một số tài nguyên web. Điều này có thể làm một số mã không hoạt động vì phải lấy mô hình và/hoặc bộ dữ liệu từ Internet công cộng. Bạn có thể cần tìm cách giải quyết. Ngoài ra, tài nguyên tính toán do Binder cung cấp khá cơ bản, nên việc huấn luyện sẽ chậm, đặc biệt trong các bài học phức tạp hơn sau này. +> **Lưu ý**: Để ngăn chặn việc sử dụng sai mục đích, Binder chặn truy cập một số tài nguyên web. Điều này có thể khiến một số đoạn mã không hoạt động, đặc biệt là những đoạn lấy mô hình và/hoặc bộ dữ liệu từ Internet công cộng. Bạn có thể cần tìm các giải pháp thay thế. Ngoài ra, tài nguyên tính toán do Binder cung cấp khá cơ bản, nên việc huấn luyện sẽ chậm, đặc biệt trong các bài học phức tạp hơn. ## Chạy trên đám mây với GPU -Một số bài học sau trong chương trình sẽ rất cần GPU. Việc huấn luyện mô hình, ví dụ, có thể rất chậm nếu không có GPU. Có vài tùy chọn bạn có thể theo, nhất là nếu bạn có quyền truy cập đám mây thông qua [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste), hoặc qua tổ chức của bạn: +Một số bài học sau trong khóa học này sẽ hưởng lợi rất nhiều từ việc hỗ trợ GPU. Việc huấn luyện mô hình, ví dụ, sẽ cực kỳ chậm nếu không có GPU. Có một vài lựa chọn bạn có thể theo, đặc biệt nếu bạn có quyền truy cập đám mây thông qua [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste), hoặc qua tổ chức của bạn: -* Tạo [Máy ảo Khoa học Dữ liệu](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) và kết nối đến nó qua Jupyter. Bạn có thể clone repo ngay lên máy và bắt đầu học. Máy ảo dòng NC có hỗ trợ GPU. +* Tạo [Máy ảo Khoa học Dữ liệu](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste) và kết nối với nó qua Jupyter. Bạn có thể sao chép repository trực tiếp lên máy ảo và bắt đầu học. Máy ảo dòng NC hỗ trợ GPU. -> **Lưu ý**: Một số gói đăng ký, bao gồm Azure for Students, không cung cấp GPU mặc định. Bạn có thể cần gửi yêu cầu hỗ trợ kỹ thuật để nhận thêm lõi GPU. +> **Lưu ý**: Một số đăng ký, gồm Azure for Students, không hỗ trợ GPU ngay khi mới mở. Bạn có thể cần yêu cầu thêm lõi GPU thông qua yêu cầu hỗ trợ kỹ thuật. -* Tạo [Azure Machine Learning Workspace](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) và sử dụng tính năng Notebook ở đó. [Video này](https://azure-for-academics.github.io/quickstart/azureml-papers/) hướng dẫn cách clone repo vào notebook Azure ML và bắt đầu sử dụng. +* Tạo [Azure Machine Learning Workspace](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste) và sử dụng tính năng Notebook tại đó. [Video này](https://azure-for-academics.github.io/quickstart/azureml-papers/) hướng dẫn cách sao chép repository vào notebook Azure ML và bắt đầu sử dụng. -Bạn cũng có thể sử dụng Google Colab, có hỗ trợ GPU miễn phí, và tải các Jupyter Notebooks lên đó để thực thi từng notebook một. +Bạn cũng có thể dùng Google Colab, nơi có hỗ trợ GPU miễn phí, và tải Jupyter Notebooks lên đó để thực thi từng cái một. --- -**Tuyên bố từ chối trách nhiệm**: -Tài liệu này đã được dịch bằng dịch vụ dịch thuật AI [Co-op Translator](https://github.com/Azure/co-op-translator). Mặc dù chúng tôi cố gắng đảm bảo độ chính xác, xin lưu ý rằng các bản dịch tự động có thể chứa lỗi hoặc không chính xác. Tài liệu gốc bằng ngôn ngữ gốc nên được xem là nguồn tham khảo chính thức. Đối với những thông tin quan trọng, nên sử dụng dịch vụ dịch thuật chuyên nghiệp do con người thực hiện. Chúng tôi không chịu trách nhiệm về bất kỳ sự hiểu lầm hay giải thích sai nào phát sinh từ việc sử dụng bản dịch này. +**Tuyên bố miễn trừ trách nhiệm**: +Tài liệu này đã được dịch bằng dịch vụ dịch thuật AI [Co-op Translator](https://github.com/Azure/co-op-translator). Mặc dù chúng tôi cố gắng đảm bảo độ chính xác, xin lưu ý rằng bản dịch tự động có thể chứa lỗi hoặc sai sót. Tài liệu gốc bằng ngôn ngữ gốc nên được coi là nguồn tin chính thức. Đối với thông tin quan trọng, nên sử dụng dịch vụ dịch thuật chuyên nghiệp bởi con người. Chúng tôi không chịu trách nhiệm về bất kỳ hiểu lầm hoặc giải thích sai nào phát sinh từ việc sử dụng bản dịch này. \ No newline at end of file diff --git a/translations/vi/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/vi/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index bca706a90d..cf2afec533 100644 --- a/translations/vi/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/vi/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -4,11 +4,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Các mô hình đã được huấn luyện trước và học chuyển giao\n", + "# Mô hình tiền huấn luyện và học chuyển giao\n", "\n", - "Huấn luyện CNN có thể mất rất nhiều thời gian, và cần một lượng lớn dữ liệu cho nhiệm vụ này. Tuy nhiên, phần lớn thời gian được dành để học các bộ lọc cấp thấp tốt nhất mà mạng sử dụng để trích xuất các mẫu từ hình ảnh. Một câu hỏi tự nhiên được đặt ra - liệu chúng ta có thể sử dụng một mạng nơ-ron đã được huấn luyện trên một tập dữ liệu và điều chỉnh nó để phân loại các hình ảnh khác nhau mà không cần quá trình huấn luyện đầy đủ?\n", + "Việc huấn luyện CNN có thể mất nhiều thời gian và yêu cầu nhiều dữ liệu cho nhiệm vụ đó. Tuy nhiên, phần lớn thời gian được dành để học các bộ lọc cấp thấp tốt nhất mà mạng sử dụng để trích xuất các mẫu từ hình ảnh. Một câu hỏi tự nhiên đặt ra - liệu chúng ta có thể sử dụng một mạng nơ-ron đã được huấn luyện trên một bộ dữ liệu và điều chỉnh nó để phân loại các hình ảnh khác mà không cần quá trình huấn luyện đầy đủ?\n", "\n", - "Phương pháp này được gọi là **học chuyển giao**, bởi vì chúng ta chuyển một phần kiến thức từ một mô hình mạng nơ-ron sang một mô hình khác. Trong học chuyển giao, chúng ta thường bắt đầu với một mô hình đã được huấn luyện trước, mô hình này đã được huấn luyện trên một tập dữ liệu hình ảnh lớn, chẳng hạn như **ImageNet**. Những mô hình này đã có khả năng tốt trong việc trích xuất các đặc điểm khác nhau từ hình ảnh tổng quát, và trong nhiều trường hợp, chỉ cần xây dựng một bộ phân loại dựa trên những đặc điểm đã được trích xuất đó cũng có thể mang lại kết quả tốt.\n" + "Cách tiếp cận này được gọi là **học chuyển giao**, vì chúng ta chuyển giao một số kiến thức từ một mô hình mạng nơ-ron này sang một mô hình khác. Trong học chuyển giao, chúng ta thường bắt đầu với một mô hình tiền huấn luyện, vốn đã được huấn luyện trên một bộ dữ liệu hình ảnh lớn nào đó, như **ImageNet**. Những mô hình này đã có thể làm tốt việc trích xuất các đặc trưng khác nhau từ các hình ảnh tổng quát, và trong nhiều trường hợp chỉ cần xây dựng một bộ phân loại dựa trên các đặc trưng đã trích xuất đó có thể mang lại kết quả tốt.\n" ] }, { @@ -29,11 +29,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Bộ dữ liệu Cats vs. Dogs\n", + "## Bộ dữ liệu Mèo vs. Chó\n", "\n", - "Trong bài học này, chúng ta sẽ giải quyết một vấn đề thực tế về phân loại hình ảnh của mèo và chó. Vì lý do này, chúng ta sẽ sử dụng [Bộ dữ liệu Cats vs. Dogs trên Kaggle](https://www.kaggle.com/c/dogs-vs-cats), bộ dữ liệu này cũng có thể được tải xuống [từ Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n", + "Trong đơn vị này, chúng ta sẽ giải quyết một vấn đề thực tế về phân loại hình ảnh mèo và chó. Vì lý do này, chúng ta sẽ sử dụng [Bộ dữ liệu Mèo vs. Chó Kaggle](https://www.kaggle.com/c/dogs-vs-cats), cũng có thể được tải xuống [từ Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste).\n", "\n", - "Hãy tải xuống bộ dữ liệu này và giải nén nó vào thư mục `data` (quá trình này có thể mất một chút thời gian!):\n" + "Hãy tải bộ dữ liệu này và giải nén vào thư mục `data` (quá trình này có thể mất một chút thời gian!):\n" ] }, { @@ -64,7 +64,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Thật không may, có một số tệp hình ảnh bị hỏng trong tập dữ liệu. Chúng ta cần thực hiện việc làm sạch nhanh để kiểm tra các tệp bị hỏng. Để không làm rối hướng dẫn này, chúng tôi đã chuyển mã kiểm tra tập dữ liệu vào một mô-đun.\n" + "Thật không may, có một số tệp hình ảnh bị hỏng trong bộ dữ liệu. Chúng ta cần làm sạch nhanh để kiểm tra các tệp bị hỏng. Để không làm hỏng hướng dẫn này, chúng tôi đã chuyển mã kiểm tra bộ dữ liệu sang một mô-đun.\n" ] }, { @@ -333,13 +333,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Tải Dữ Liệu\n", + "## Tải Bộ Dữ Liệu\n", "\n", - "Trong các ví dụ trước, chúng ta đã tải các tập dữ liệu được tích hợp sẵn trong Keras. Bây giờ, chúng ta sẽ làm việc với tập dữ liệu của riêng mình, cần được tải từ một thư mục chứa các hình ảnh.\n", + "Trong các ví dụ trước, chúng ta đã tải các bộ dữ liệu được tích hợp trong Keras. Bây giờ chúng ta sẽ làm việc với bộ dữ liệu của riêng mình, mà ta cần tải từ một thư mục chứa hình ảnh.\n", "\n", - "Trong thực tế, kích thước của các tập dữ liệu hình ảnh có thể khá lớn, và không thể dựa vào việc tất cả dữ liệu có thể được lưu trữ trong bộ nhớ. Do đó, các tập dữ liệu thường được biểu diễn dưới dạng **generators** có thể trả về dữ liệu theo từng minibatch phù hợp để huấn luyện.\n", + "Trong thực tế, kích thước của các bộ dữ liệu hình ảnh có thể rất lớn, và không thể đảm bảo tất cả dữ liệu đều vừa trong bộ nhớ. Do đó, các bộ dữ liệu thường được biểu diễn dưới dạng **bộ sinh** có thể trả về dữ liệu theo các lô nhỏ phù hợp để huấn luyện.\n", "\n", - "Để xử lý phân loại hình ảnh, Keras bao gồm một hàm đặc biệt `image_dataset_from_directory`, có thể tải hình ảnh từ các thư mục con tương ứng với các lớp khác nhau. Hàm này cũng tự động xử lý việc chuẩn hóa hình ảnh và có thể chia tập dữ liệu thành các tập con huấn luyện và kiểm tra:\n" + "Để xử lý phân loại hình ảnh, Keras bao gồm hàm đặc biệt `image_dataset_from_directory`, có khả năng tải hình ảnh từ các thư mục con tương ứng với các lớp khác nhau. Hàm này cũng đảm nhận việc chuẩn hóa kích thước ảnh, và còn có thể chia bộ dữ liệu thành các tập huấn luyện và kiểm tra:\n" ] }, { @@ -383,9 +383,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Điều quan trọng là phải đặt cùng một giá trị `seed` cho cả hai lần gọi, vì nó ảnh hưởng đến việc phân chia hình ảnh giữa tập dữ liệu huấn luyện và kiểm tra.\n", + "Việc đặt cùng giá trị `seed` cho cả hai lần gọi là quan trọng, vì nó ảnh hưởng đến sự phân chia hình ảnh giữa tập train và test.\n", "\n", - "Tập dữ liệu tự động lấy tên lớp từ các thư mục, và bạn có thể truy cập chúng nếu cần bằng cách gọi:\n" + "Dataset tự động lấy tên lớp từ các thư mục, và bạn có thể truy cập chúng nếu cần bằng cách gọi:\n" ] }, { @@ -412,7 +412,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Các tập dữ liệu mà chúng tôi đã thu thập có thể được truyền trực tiếp vào hàm `fit` để huấn luyện mô hình. Chúng chứa cả hình ảnh và nhãn tương ứng, có thể được lặp qua bằng cách sử dụng cấu trúc sau:\n" + "Các bộ dữ liệu mà chúng tôi đã thu thập có thể được truyền trực tiếp cho hàm `fit` để huấn luyện mô hình. Chúng bao gồm cả hình ảnh tương ứng và nhãn, có thể được duyệt qua bằng cách sử dụng cấu trúc sau:\n" ] }, { @@ -453,16 +453,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "> **Lưu ý**: Tất cả các hình ảnh trong tập dữ liệu được biểu diễn dưới dạng tensor điểm nổi với phạm vi 0-255. Trước khi đưa chúng vào mạng nơ-ron, chúng ta cần thu nhỏ các giá trị đó vào phạm vi 0-1. Khi vẽ hình ảnh, chúng ta cũng cần làm tương tự, hoặc chuyển đổi các giá trị sang kiểu `int` (như chúng ta đã làm trong đoạn mã trên), để hiển thị cho `matplotlib` rằng chúng ta muốn vẽ hình ảnh gốc chưa được thu nhỏ.\n" + "> **Lưu ý**: Tất cả các hình ảnh trong bộ dữ liệu được biểu diễn dưới dạng tensor số thực với phạm vi 0-255. Trước khi truyền chúng vào mạng nơ-ron, chúng ta cần chuyển đổi các giá trị này về phạm vi 0-1. Khi vẽ các hình ảnh, ta cần làm điều tương tự, hoặc chuyển giá trị sang kiểu `int` (như trong đoạn mã trên), để cho `matplotlib` biết rằng chúng ta muốn vẽ hình ảnh gốc chưa được chuẩn hóa.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Các mô hình đã được huấn luyện trước\n", + "## Mô hình đã được huấn luyện trước\n", "\n", - "Đối với nhiều tác vụ phân loại hình ảnh, bạn có thể tìm thấy các mô hình mạng nơ-ron đã được huấn luyện trước. Nhiều mô hình trong số đó có sẵn trong không gian tên `keras.applications`, và còn nhiều mô hình khác có thể được tìm thấy trên Internet. Hãy cùng xem cách tải và sử dụng mô hình VGG-16 đơn giản nhất:\n" + "Đối với nhiều tác vụ phân loại hình ảnh, người ta có thể tìm thấy các mô hình mạng nơ-ron đã được huấn luyện trước. Nhiều trong số các mô hình này có sẵn trong không gian tên `keras.applications`, và còn nhiều mô hình hơn nữa có thể được tìm thấy trên Internet. Hãy cùng xem cách tải và sử dụng mô hình VGG-16 đơn giản nhất:\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,20 +520,17 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Có một vài điều quan trọng ở đây:\n", - "\n", - "* Trước khi đưa một đầu vào vào bất kỳ mạng nơ-ron đã được huấn luyện nào, nó cần được tiền xử lý theo một cách nhất định. Điều này được thực hiện bằng cách gọi hàm `preprocess_input` tương ứng, hàm này nhận một lô hình ảnh và trả về dạng đã được xử lý của chúng. Trong trường hợp của VGG-16, các hình ảnh được chuẩn hóa và một giá trị trung bình được định nghĩa trước cho mỗi kênh sẽ được trừ đi. Điều này là do VGG-16 ban đầu được huấn luyện với cách tiền xử lý này.\n", - "\n", - "* Mạng nơ-ron được áp dụng cho lô đầu vào, và kết quả chúng ta nhận được là một lô các tensor 1000 phần tử, thể hiện xác suất của mỗi lớp. Chúng ta có thể tìm số lớp có xác suất cao nhất bằng cách gọi `argmax` trên tensor này.\n", - "\n", - "* Kết quả thu được là [số của một lớp `ImageNet`](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Để hiểu ý nghĩa của kết quả này, chúng ta cũng có thể sử dụng hàm `decode_predictions`, hàm này trả về n lớp hàng đầu cùng với tên của chúng.\n" + "Có vài điều quan trọng ở đây:\n", + "* Trước khi đưa đầu vào vào bất kỳ mạng đã được huấn luyện trước nào, nó cần được tiền xử lý theo một cách nhất định. Điều này được thực hiện bằng cách gọi hàm `preprocess_input` tương ứng, nhận một loạt các ảnh, và trả lại dạng đã được xử lý của chúng. Trong trường hợp VGG-16, các ảnh được chuẩn hóa, và một giá trị trung bình được định sẵn cho mỗi kênh được trừ đi. Điều đó là vì VGG-16 ban đầu được huấn luyện với việc tiền xử lý này.\n", + "* Mạng nơ-ron được áp dụng cho lô đầu vào, và chúng ta nhận được kết quả là một lô tensor 1000 phần tử biểu thị xác suất của mỗi lớp. Chúng ta có thể tìm số lớp có xác suất lớn nhất bằng cách gọi `argmax` trên tensor này.\n", + "* Kết quả thu được là [số của một lớp `ImageNet`](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a). Để hiểu kết quả này, chúng ta cũng có thể sử dụng hàm `decode_predictions`, hàm này trả về n lớp hàng đầu cùng với tên của chúng.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Hãy cùng xem kiến trúc của mạng VGG-16:\n" + "Chúng ta cũng hãy xem kiến trúc của mạng VGG-16:\n" ] }, { @@ -602,7 +609,7 @@ "source": [ "## Tính toán GPU\n", "\n", - "Các mạng nơ-ron sâu, chẳng hạn như VGG-16 và các kiến trúc hiện đại hơn, yêu cầu khá nhiều sức mạnh tính toán để chạy. Việc sử dụng tăng tốc GPU là hợp lý nếu nó khả dụng. May mắn thay, Keras tự động tăng tốc các tính toán trên GPU nếu nó có sẵn. Chúng ta có thể kiểm tra xem Tensorflow có thể sử dụng GPU hay không bằng cách sử dụng đoạn mã sau:\n" + "Mạng nơ-ron sâu, như VGG-16 và các kiến trúc hiện đại khác, cần rất nhiều sức mạnh tính toán để chạy. Việc sử dụng tăng tốc GPU là hợp lý nếu có sẵn. May mắn thay, Keras tự động tăng tốc tính toán trên GPU nếu có sẵn. Chúng ta có thể kiểm tra xem Tensorflow có thể sử dụng GPU hay không bằng đoạn mã sau: \n" ] }, { @@ -629,9 +636,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ + "\n", "## Trích xuất đặc trưng từ VGG\n", "\n", - "Nếu chúng ta muốn sử dụng VGG-16 để trích xuất đặc trưng từ các hình ảnh, chúng ta cần mô hình không có các lớp phân loại cuối cùng. Chúng ta có thể khởi tạo mô hình VGG-16 mà không có các lớp trên cùng bằng đoạn mã sau:\n" + "Nếu chúng ta muốn sử dụng VGG-16 để trích xuất các đặc trưng từ hình ảnh của mình, chúng ta cần mô hình không có các lớp phân loại cuối cùng. Chúng ta có thể khởi tạo mô hình VGG-16 mà không có các lớp trên cùng bằng đoạn mã sau: \n" ] }, { @@ -683,9 +691,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Kích thước của tensor đặc trưng là 7x7x512, nhưng để trực quan hóa, chúng ta cần chuyển đổi nó sang dạng 2D.\n", + "Kích thước tensor đặc trưng là 7x7x512, nhưng để trực quan hóa nó, chúng tôi phải đổi dạng thành 2 chiều.\n", "\n", - "Bây giờ, hãy thử xem liệu những đặc trưng này có thể được sử dụng để phân loại hình ảnh hay không. Chúng ta sẽ tự tay lấy một phần hình ảnh (50 minibatch trong trường hợp này) và tính trước các vector đặc trưng của chúng. Chúng ta có thể sử dụng API **dataset** của Tensorflow để thực hiện điều này. Hàm `map` nhận một dataset và áp dụng một lambda-function được chỉ định để biến đổi nó. Chúng ta sử dụng cơ chế này để tạo ra các dataset mới, `ds_features_train` và `ds_features_test`, chứa các đặc trưng được trích xuất từ VGG thay vì hình ảnh gốc.\n" + "Bây giờ hãy thử xem liệu các đặc trưng đó có thể được sử dụng để phân loại hình ảnh không. Hãy tự tay lấy một phần hình ảnh (50 minibatches, trong trường hợp của chúng ta), và tính trước các vector đặc trưng của chúng. Chúng ta có thể sử dụng API **dataset** của Tensorflow để làm điều đó. Hàm `map` lấy một dataset và áp dụng một hàm lambda cho trước để biến đổi nó. Chúng tôi sử dụng cơ chế này để tạo các dataset mới, `ds_features_train` và `ds_features_test`, chứa các đặc trưng được trích xuất từ VGG thay vì các hình ảnh gốc.\n" ] }, { @@ -715,9 +723,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Chúng tôi đã sử dụng cấu trúc `.take(50)` để giới hạn kích thước tập dữ liệu, nhằm tăng tốc độ cho phần minh họa. Tất nhiên, bạn có thể thực hiện thí nghiệm này trên toàn bộ tập dữ liệu.\n", + "Chúng tôi đã sử dụng cú pháp `.take(50)` để giới hạn kích thước bộ dữ liệu, nhằm tăng tốc cho phần trình diễn của mình. Tất nhiên bạn có thể thực hiện thử nghiệm này trên bộ dữ liệu đầy đủ.\n", "\n", - "Bây giờ, khi chúng ta đã có một tập dữ liệu với các đặc trưng được trích xuất, chúng ta có thể huấn luyện một bộ phân loại dày đặc đơn giản để phân biệt giữa mèo và chó. Mạng này sẽ nhận một vector đặc trưng có dạng (7,7,512) và tạo ra một đầu ra tương ứng với chó hoặc mèo. Vì đây là bài toán phân loại nhị phân, chúng ta sử dụng hàm kích hoạt `sigmoid` và hàm mất mát `binary_crossentropy`.\n" + "Bây giờ chúng ta đã có bộ dữ liệu với các đặc trưng đã trích xuất, ta có thể huấn luyện một bộ phân loại dày đơn giản để phân biệt giữa mèo và chó. Mạng này sẽ nhận vector đặc trưng có dạng (7,7,512), và tạo ra một đầu ra tương ứng với chó hoặc mèo. Vì đây là bài toán phân loại nhị phân, ta sử dụng hàm kích hoạt `sigmoid` và hàm mất mát `binary_crossentropy`.\n" ] }, { @@ -746,13 +754,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Kết quả thật tuyệt vời, chúng ta có thể phân biệt giữa mèo và chó với xác suất gần 95%! Tuy nhiên, chúng ta chỉ mới thử nghiệm phương pháp này trên một phần nhỏ của tất cả các hình ảnh, vì việc trích xuất đặc trưng thủ công dường như mất rất nhiều thời gian.\n", + "Kết quả rất tuyệt, chúng ta có thể phân biệt giữa mèo và chó với xác suất gần 95%! Tuy nhiên, chúng tôi chỉ mới thử nghiệm phương pháp này trên một tập con của tất cả các hình ảnh, vì việc trích xuất đặc trưng thủ công có vẻ mất nhiều thời gian.\n", "\n", "## Học chuyển giao sử dụng một mạng VGG\n", "\n", - "Chúng ta cũng có thể tránh việc tính toán đặc trưng thủ công bằng cách sử dụng toàn bộ mạng VGG-16 gốc trong quá trình huấn luyện, bằng cách thêm bộ trích xuất đặc trưng vào mạng của chúng ta như một lớp đầu tiên.\n", + "Chúng ta cũng có thể tránh việc tính toán trước các đặc trưng thủ công bằng cách sử dụng toàn bộ mạng VGG-16 gốc trong quá trình huấn luyện, bằng cách thêm bộ trích xuất đặc trưng vào mạng của chúng ta như một lớp đầu tiên.\n", "\n", - "Điều tuyệt vời của kiến trúc Keras là mô hình VGG-16 mà chúng ta đã định nghĩa ở trên cũng có thể được sử dụng như một lớp trong một mạng nơ-ron khác! Chúng ta chỉ cần xây dựng một mạng với bộ phân loại dày đặc ở trên cùng, sau đó huấn luyện toàn bộ mạng bằng cách sử dụng lan truyền ngược.\n" + "Ưu điểm của kiến trúc Keras là mô hình VGG-16 mà chúng ta đã định nghĩa ở trên cũng có thể được sử dụng như một lớp trong một mạng nơ-ron khác! Chúng ta chỉ cần xây dựng một mạng với bộ phân loại dày đặc phía trên nó, rồi huấn luyện toàn bộ mạng bằng cách lan truyền ngược.\n" ] }, { @@ -796,13 +804,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Mô hình này trông giống như một mạng phân loại đầu-cuối, nhận một hình ảnh và trả về lớp tương ứng. Tuy nhiên, điều phức tạp ở đây là chúng ta muốn VGG16 hoạt động như một bộ trích xuất đặc trưng, chứ không phải để được huấn luyện lại. Do đó, chúng ta cần **đóng băng trọng số của bộ trích xuất đặc trưng tích chập**. Chúng ta có thể truy cập lớp đầu tiên của mạng bằng cách gọi `model.layers[0]`, và chỉ cần đặt thuộc tính `trainable` thành `False`.\n", + "Mô hình này trông giống như một mạng phân loại đầu-cuối, lấy một hình ảnh và trả về lớp. Tuy nhiên, điều khó là chúng ta muốn VGG16 hoạt động như một bộ trích xuất đặc trưng, và không được đào tạo lại. Do đó, chúng ta cần **đóng băng trọng số của bộ trích xuất đặc trưng tích chập**. Chúng ta có thể truy cập lớp đầu tiên của mạng bằng cách gọi `model.layers[0]`, và chỉ cần đặt thuộc tính `trainable` thành `False`.\n", "\n", - "> **Lưu ý**: Việc đóng băng trọng số của bộ trích xuất đặc trưng là cần thiết, bởi vì nếu không, lớp phân loại chưa được huấn luyện có thể làm hỏng các trọng số đã được huấn luyện trước của bộ trích xuất tích chập.\n", + "> **Lưu ý**: Việc đóng băng trọng số của bộ trích xuất đặc trưng là cần thiết, bởi vì nếu không lớp phân loại chưa được đào tạo có thể phá hủy trọng số đã được đào tạo trước của bộ trích xuất tích chập.\n", "\n", - "Bạn có thể nhận thấy rằng mặc dù tổng số tham số trong mạng của chúng ta vào khoảng 15 triệu, nhưng chúng ta chỉ huấn luyện 25 nghìn tham số. Tất cả các tham số khác của các bộ lọc tích chập cấp cao đã được huấn luyện trước. Điều này rất tốt, vì chúng ta có thể tinh chỉnh một số lượng nhỏ tham số với một số lượng nhỏ ví dụ.\n", + "Bạn có thể nhận thấy rằng trong khi tổng số tham số trong mạng của chúng ta khoảng 15 triệu, chúng ta chỉ đang đào tạo 25k tham số. Tất cả các tham số khác của bộ lọc tích chập cấp cao nhất đã được đào tạo trước. Điều đó là tốt, vì chúng ta có thể tinh chỉnh số lượng tham số nhỏ hơn với số lượng ví dụ nhỏ hơn.\n", "\n", - "Bây giờ chúng ta sẽ huấn luyện mạng và xem kết quả đạt được tốt đến mức nào. Hãy chuẩn bị cho thời gian chạy khá lâu, và đừng lo lắng nếu quá trình thực thi có vẻ như bị \"đóng băng\" trong một khoảng thời gian.\n" + "Bây giờ chúng ta sẽ đào tạo mạng và xem nó tốt đến mức nào. Hãy mong đợi thời gian chạy khá lâu, và đừng lo nếu quá trình thực thi có vẻ bị đứng trong một thời gian.\n" ] }, { @@ -827,11 +835,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Có vẻ như chúng ta đã có một bộ phân loại mèo và chó khá chính xác!\n", + "Có vẻ như chúng ta đã có được một bộ phân loại mèo và chó với độ chính xác khá tốt!\n", "\n", "## Lưu và Tải Mô Hình\n", "\n", - "Sau khi chúng ta đã huấn luyện mô hình, chúng ta có thể lưu kiến trúc mô hình và các trọng số đã được huấn luyện vào một tệp để sử dụng sau này:\n" + "Khi đã huấn luyện xong mô hình, chúng ta có thể lưu kiến trúc mô hình và trọng số đã được huấn luyện vào một tập tin để sử dụng sau này:\n" ] }, { @@ -855,7 +863,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Chúng ta có thể tải mô hình từ tệp bất kỳ lúc nào. Bạn có thể thấy điều này hữu ích trong trường hợp thí nghiệm tiếp theo làm hỏng mô hình - bạn sẽ không phải bắt đầu lại từ đầu.\n" + "Sau đó, chúng ta có thể tải mô hình từ tệp bất cứ lúc nào. Bạn có thể thấy điều này hữu ích trong trường hợp thí nghiệm tiếp theo làm hỏng mô hình - bạn sẽ không phải bắt đầu lại từ đầu.\n" ] }, { @@ -873,13 +881,13 @@ "source": [ "## Tinh chỉnh học chuyển giao\n", "\n", - "Trong phần trước, chúng ta đã huấn luyện lớp phân loại cuối cùng để phân loại hình ảnh trong tập dữ liệu của riêng mình. Tuy nhiên, chúng ta chưa huấn luyện lại bộ trích xuất đặc trưng, và mô hình của chúng ta dựa vào các đặc trưng mà mô hình đã học được từ dữ liệu ImageNet. Nếu các đối tượng của bạn có sự khác biệt về mặt hình ảnh so với các hình ảnh thông thường trong ImageNet, sự kết hợp các đặc trưng này có thể không hoạt động tốt nhất. Vì vậy, việc bắt đầu huấn luyện các lớp tích chập cũng là điều hợp lý.\n", + "Trong phần trước, chúng ta đã huấn luyện lớp phân loại cuối cùng để phân loại hình ảnh trong bộ dữ liệu của riêng mình. Tuy nhiên, chúng ta không huấn luyện lại bộ trích xuất đặc trưng, và mô hình của chúng ta dựa trên các đặc trưng mà mô hình đã học trên dữ liệu ImageNet. Nếu các đối tượng của bạn khác biệt về hình ảnh so với các hình ảnh thông thường của ImageNet, sự kết hợp các đặc trưng này có thể không hoạt động tốt nhất. Do đó, việc bắt đầu huấn luyện các lớp convolution cũng là hợp lý.\n", "\n", - "Để làm điều đó, chúng ta có thể mở khóa các tham số bộ lọc tích chập mà trước đó đã bị khóa.\n", + "Để làm điều đó, chúng ta có thể mở khóa các tham số bộ lọc convolution mà trước đó chúng ta đã đóng băng.\n", "\n", - "> **Note:** Điều quan trọng là bạn phải khóa các tham số trước và thực hiện vài epoch huấn luyện để ổn định trọng số trong lớp phân loại. Nếu bạn ngay lập tức bắt đầu huấn luyện mạng từ đầu với các tham số được mở khóa, các lỗi lớn có thể làm hỏng các trọng số đã được huấn luyện trước trong các lớp tích chập.\n", + "> **Lưu ý:** Điều quan trọng là bạn phải đóng băng các tham số trước và thực hiện một vài epoch huấn luyện để ổn định trọng số trong lớp phân loại. Nếu bạn ngay lập tức bắt đầu huấn luyện toàn bộ mạng với các tham số mở khóa, các lỗi lớn có thể phá hủy các trọng số đã được huấn luyện trước trong các lớp convolution.\n", "\n", - "Mô hình VGG-16 tích chập của chúng ta nằm trong lớp đầu tiên, và nó bao gồm nhiều lớp bên trong. Chúng ta có thể xem cấu trúc của nó:\n" + "Mô hình VGG-16 convolution của chúng ta nằm bên trong lớp đầu tiên, và nó bao gồm nhiều lớp con. Chúng ta có thể xem qua cấu trúc của nó:\n" ] }, { @@ -947,7 +955,9 @@ { "cell_type": "markdown", "metadata": {}, - "source": [] + "source": [ + "Chúng ta có thể mở khóa tất cả các lớp của cơ sở tích chập:\n" + ] }, { "cell_type": "code", @@ -962,7 +972,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Tuy nhiên, việc mở khóa tất cả chúng cùng một lúc không phải là ý tưởng tốt nhất. Chúng ta có thể bắt đầu bằng cách chỉ mở khóa một vài lớp cuối cùng của các lớp tích chập, vì chúng chứa các mẫu cấp cao hơn liên quan đến hình ảnh của chúng ta. Ví dụ, để bắt đầu, chúng ta có thể đóng băng tất cả các lớp ngoại trừ 4 lớp cuối cùng:\n" + "Tuy nhiên, bỏ đóng băng tất cả cùng lúc không phải là ý tưởng tốt nhất. Chúng ta có thể bắt đầu bằng cách chỉ bỏ đóng băng một vài lớp cuối cùng của các lớp tích chập, vì chúng chứa các mẫu ở cấp độ cao hơn liên quan đến hình ảnh của chúng ta. Ví dụ, để bắt đầu, chúng ta có thể giữ nguyên đóng băng tất cả các lớp ngoại trừ 4 lớp cuối cùng:\n" ] }, { @@ -1001,11 +1011,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Quan sát rằng số lượng tham số có thể huấn luyện đã tăng lên đáng kể, nhưng vẫn chỉ khoảng 50% tổng số tham số.\n", + "Quan sát thấy số lượng tham số có thể huấn luyện đã tăng đáng kể, nhưng vẫn chỉ khoảng 50% tổng số tham số.\n", "\n", - "Sau khi mở khóa, chúng ta có thể thực hiện thêm một vài epoch huấn luyện nữa (trong ví dụ này, chúng ta chỉ thực hiện một epoch). Bạn cũng có thể chọn tốc độ học thấp hơn để giảm thiểu ảnh hưởng lên các trọng số đã được huấn luyện trước. Tuy nhiên, ngay cả với tốc độ học thấp, bạn có thể mong đợi độ chính xác giảm xuống ở giai đoạn đầu của quá trình huấn luyện, cho đến khi cuối cùng đạt mức cao hơn một chút so với trường hợp giữ nguyên trọng số.\n", + "Sau khi mở khóa, chúng ta có thể thực hiện thêm vài epoch huấn luyện nữa (trong ví dụ của chúng tôi, chúng tôi sẽ chỉ làm một). Bạn cũng có thể chọn tỉ lệ học thấp hơn để giảm thiểu tác động lên các trọng số đã được huấn luyện trước. Tuy nhiên, ngay cả với tỉ lệ học thấp, bạn cũng có thể mong đợi độ chính xác giảm trong giai đoạn đầu của quá trình huấn luyện, cho đến khi cuối cùng đạt mức cao hơn một chút so với trường hợp trọng số cố định.\n", "\n", - "> **Note:** Quá trình huấn luyện này diễn ra chậm hơn nhiều, vì chúng ta cần truyền ngược gradient qua nhiều lớp của mạng!\n" + "> **Lưu ý:** Quá trình huấn luyện này diễn ra chậm hơn nhiều, vì chúng ta cần truyền ngược gradient qua nhiều lớp của mạng!\n" ] }, { @@ -1029,9 +1039,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Chúng ta có khả năng đạt được độ chính xác cao hơn trong quá trình huấn luyện, vì chúng ta đang sử dụng một mạng mạnh mẽ hơn với nhiều tham số hơn, nhưng độ chính xác khi kiểm định có thể không tăng nhiều như vậy.\n", + "Chúng ta có khả năng đạt được độ chính xác huấn luyện cao hơn, bởi vì chúng ta đang sử dụng mạng mạnh hơn với nhiều tham số hơn, nhưng độ chính xác xác thực sẽ không tăng nhiều như vậy.\n", "\n", - "Hãy thoải mái mở khóa thêm một vài lớp của mạng và huấn luyện thêm, để xem liệu bạn có thể đạt được độ chính xác cao hơn không!\n" + "Hãy thoải mái mở khóa thêm một vài lớp của mạng và huấn luyện thêm, để xem bạn có thể đạt được độ chính xác cao hơn không!\n" ] }, { @@ -1040,7 +1050,7 @@ "source": [ "## Các mô hình thị giác máy tính khác\n", "\n", - "VGG-16 là một trong những kiến trúc thị giác máy tính đơn giản nhất. Keras cung cấp nhiều mạng đã được huấn luyện trước khác. Những mạng được sử dụng phổ biến nhất trong số đó là các kiến trúc **ResNet**, được phát triển bởi Microsoft, và **Inception** của Google. Ví dụ, hãy cùng khám phá kiến trúc của mô hình ResNet-50 đơn giản nhất (ResNet là một họ các mô hình với độ sâu khác nhau, bạn có thể thử nghiệm với ResNet-152 nếu muốn xem một mô hình thực sự sâu trông như thế nào):\n" + "VGG-16 là một trong những kiến trúc thị giác máy tính đơn giản nhất. Keras cung cấp nhiều mạng đã được huấn luyện trước hơn nữa. Những kiến trúc được sử dụng thường xuyên nhất trong số đó là **ResNet**, được phát triển bởi Microsoft, và **Inception** của Google. Ví dụ, hãy cùng khám phá kiến trúc của mô hình ResNet-50 đơn giản nhất (ResNet là một họ các mô hình với độ sâu khác nhau, bạn có thể thử nghiệm với ResNet-152 nếu muốn xem một mô hình thực sự sâu trông như thế nào):\n" ] }, { @@ -1442,11 +1452,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Như bạn thấy, mô hình này chứa các thành phần quen thuộc: các lớp tích chập, các lớp pooling và lớp phân loại cuối cùng dạng dense. Chúng ta có thể sử dụng mô hình này theo cách tương tự như đã sử dụng VGG-16 cho học chuyển giao. Bạn có thể thử nghiệm với đoạn mã trên, sử dụng các mô hình ResNet khác nhau làm mô hình cơ sở, và xem độ chính xác thay đổi như thế nào.\n", + "Như bạn có thể thấy, mô hình chứa các khối xây dựng quen thuộc: các lớp convolution, lớp pooling và phân loại cuối cùng dày đặc. Chúng ta có thể sử dụng mô hình này hoàn toàn giống như cách chúng ta đã sử dụng VGG-16 cho học chuyển giao. Bạn có thể thử nghiệm với mã trên, sử dụng các mô hình ResNet khác nhau làm mô hình cơ sở, và xem độ chính xác thay đổi như thế nào.\n", "\n", - "## Batch Normalization\n", + "## Chuẩn hóa theo lô\n", "\n", - "Mạng này chứa một loại lớp khác: **Batch Normalization**. Ý tưởng của batch normalization là đưa các giá trị chảy qua mạng nơ-ron về khoảng phù hợp. Thông thường, mạng nơ-ron hoạt động tốt nhất khi tất cả các giá trị nằm trong khoảng [-1,1] hoặc [0,1], và đó là lý do chúng ta điều chỉnh/chuẩn hóa dữ liệu đầu vào tương ứng. Tuy nhiên, trong quá trình huấn luyện mạng sâu, có thể xảy ra trường hợp các giá trị vượt ra khỏi khoảng này một cách đáng kể, điều này làm cho việc huấn luyện trở nên khó khăn. Lớp batch normalization tính toán giá trị trung bình và độ lệch chuẩn cho tất cả các giá trị của minibatch hiện tại, và sử dụng chúng để chuẩn hóa tín hiệu trước khi truyền qua một lớp mạng nơ-ron. Điều này cải thiện đáng kể sự ổn định của các mạng sâu.\n" + "Mạng này chứa thêm một loại lớp nữa: **Chuẩn hóa theo lô (Batch Normalization)**. Ý tưởng của chuẩn hóa theo lô là đưa các giá trị truyền qua mạng nơ-ron về khoảng giá trị thích hợp. Thông thường, mạng nơ-ron hoạt động tốt nhất khi tất cả các giá trị nằm trong phạm vi [-1,1] hoặc [0,1], và đó là lý do chúng ta tỉ lệ hóa/chuẩn hóa dữ liệu đầu vào tương ứng. Tuy nhiên, trong quá trình huấn luyện mạng sâu, có thể xảy ra tình trạng giá trị vượt ra ngoài phạm vi này đáng kể, điều này làm cho việc huấn luyện gặp vấn đề. Lớp chuẩn hóa theo lô tính toán trung bình và độ lệch chuẩn cho tất cả các giá trị trong minibatch hiện tại và sử dụng chúng để chuẩn hóa tín hiệu trước khi truyền qua lớp mạng nơ-ron. Điều này cải thiện đáng kể độ ổn định của các mạng sâu.\n" ] }, { @@ -1455,16 +1465,16 @@ "source": [ "## Kết luận\n", "\n", - "Sử dụng học chuyển giao, chúng ta đã có thể nhanh chóng tạo ra một bộ phân loại cho nhiệm vụ phân loại đối tượng tùy chỉnh của mình và đạt được độ chính xác cao. Tuy nhiên, ví dụ này không hoàn toàn công bằng, vì mạng VGG-16 ban đầu đã được huấn luyện trước để nhận diện mèo và chó, do đó chúng ta chỉ tái sử dụng hầu hết các mẫu đã có sẵn trong mạng. Bạn có thể mong đợi độ chính xác thấp hơn đối với các đối tượng đặc thù thuộc lĩnh vực ít phổ biến hơn, chẳng hạn như chi tiết trên dây chuyền sản xuất trong nhà máy, hoặc các loại lá cây khác nhau.\n", + "Sử dụng học chuyển giao, chúng tôi có thể nhanh chóng xây dựng một bộ phân loại cho nhiệm vụ phân loại đối tượng tùy chỉnh của mình và đạt được độ chính xác cao. Tuy nhiên, ví dụ này không hoàn toàn công bằng, vì mạng VGG-16 ban đầu đã được huấn luyện trước để nhận diện mèo và chó, do đó chúng tôi chỉ tái sử dụng hầu hết các mẫu đã có trong mạng. Bạn có thể mong đợi độ chính xác thấp hơn với những đối tượng đặc thù hơn trong các lĩnh vực khác, chẳng hạn như chi tiết trên dây chuyền sản xuất trong nhà máy, hoặc các loại lá cây khác nhau.\n", "\n", - "Bạn có thể thấy rằng các nhiệm vụ phức tạp hơn mà chúng ta đang giải quyết hiện nay đòi hỏi sức mạnh tính toán cao hơn và không thể dễ dàng thực hiện trên CPU. Trong bài học tiếp theo, chúng ta sẽ thử sử dụng một cách triển khai nhẹ hơn để huấn luyện cùng một mô hình với tài nguyên tính toán thấp hơn, điều này chỉ dẫn đến độ chính xác giảm nhẹ.\n" + "Bạn có thể thấy rằng các nhiệm vụ phức tạp hơn mà chúng ta đang giải quyết hiện nay đòi hỏi công suất tính toán cao hơn, và không thể dễ dàng giải quyết trên CPU. Ở đơn vị tiếp theo, chúng ta sẽ cố gắng sử dụng triển khai nhẹ hơn để đào tạo cùng một mô hình sử dụng tài nguyên tính toán thấp hơn, điều này dẫn đến độ chính xác chỉ giảm nhẹ.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n---\n\n**Tuyên bố miễn trừ trách nhiệm**: \nTài liệu này đã được dịch bằng dịch vụ dịch thuật AI [Co-op Translator](https://github.com/Azure/co-op-translator). Mặc dù chúng tôi cố gắng đảm bảo độ chính xác, xin lưu ý rằng các bản dịch tự động có thể chứa lỗi hoặc không chính xác. Tài liệu gốc bằng ngôn ngữ bản địa nên được coi là nguồn tham khảo chính thức. Đối với các thông tin quan trọng, chúng tôi khuyến nghị sử dụng dịch vụ dịch thuật chuyên nghiệp từ con người. Chúng tôi không chịu trách nhiệm cho bất kỳ sự hiểu lầm hoặc diễn giải sai nào phát sinh từ việc sử dụng bản dịch này.\n" + "---\n\n\n**Tuyên bố miễn trừ trách nhiệm**:\nTài liệu này đã được dịch bằng dịch vụ dịch thuật AI [Co-op Translator](https://github.com/Azure/co-op-translator). Mặc dù chúng tôi cố gắng đảm bảo độ chính xác, xin lưu ý rằng bản dịch tự động có thể chứa lỗi hoặc sai sót. Tài liệu gốc bằng ngôn ngữ gốc nên được coi là nguồn tin chính thức. Đối với thông tin quan trọng, nên sử dụng dịch vụ dịch thuật chuyên nghiệp bởi con người. Chúng tôi không chịu trách nhiệm về bất kỳ hiểu lầm hoặc giải thích sai nào phát sinh từ việc sử dụng bản dịch này.\n\n" ] } ], @@ -1485,12 +1495,6 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" - }, - "coopTranslator": { - "original_hash": "c189abc107848f96051085cc30945129", - "translation_date": "2025-08-29T13:35:15+00:00", - "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", - "language_code": "vi" } }, "nbformat": 4, diff --git a/translations/vi/lessons/5-NLP/README.md b/translations/vi/lessons/5-NLP/README.md index 3d527d48d4..855a72fdbc 100644 --- a/translations/vi/lessons/5-NLP/README.md +++ b/translations/vi/lessons/5-NLP/README.md @@ -1,36 +1,36 @@ # Xử lý Ngôn ngữ Tự nhiên -![Tóm tắt các nhiệm vụ NLP trong một hình vẽ](../../../../translated_images/vi/ai-nlp.b22dcb8ca4707cea.webp) +![Tóm tắt các nhiệm vụ NLP bằng hình vẽ phác thảo](../../../../translated_images/vi/ai-nlp.b22dcb8ca4707cea.webp) -Trong phần này, chúng ta sẽ tập trung vào việc sử dụng Mạng Nơ-ron để xử lý các nhiệm vụ liên quan đến **Xử lý Ngôn ngữ Tự nhiên (NLP)**. Có rất nhiều vấn đề NLP mà chúng ta muốn máy tính có thể giải quyết: +Trong phần này, chúng ta sẽ tập trung vào việc sử dụng Mạng Nơ-ron để xử lý các nhiệm vụ liên quan đến **Xử lý Ngôn ngữ Tự nhiên (NLP)**. Có nhiều vấn đề NLP mà chúng ta muốn máy tính có thể giải quyết: -* **Phân loại văn bản** là một vấn đề phân loại điển hình liên quan đến các chuỗi văn bản. Ví dụ bao gồm phân loại email thành spam và không spam, hoặc phân loại bài viết thành các chủ đề như thể thao, kinh doanh, chính trị, v.v. Ngoài ra, khi phát triển chatbot, chúng ta thường cần hiểu người dùng muốn nói gì -- trong trường hợp này, chúng ta đang xử lý **phân loại ý định**. Thường thì, trong phân loại ý định, chúng ta cần xử lý nhiều danh mục khác nhau. -* **Phân tích cảm xúc** là một vấn đề hồi quy điển hình, nơi chúng ta cần gán một con số (cảm xúc) tương ứng với mức độ tích cực/tiêu cực của ý nghĩa câu. Một phiên bản nâng cao hơn của phân tích cảm xúc là **phân tích cảm xúc theo khía cạnh** (ABSA), nơi chúng ta gán cảm xúc không phải cho toàn bộ câu, mà cho các phần khác nhau của nó (các khía cạnh), ví dụ: *Ở nhà hàng này, tôi thích món ăn, nhưng không khí thì thật tệ*. -* **Nhận diện thực thể có tên** (NER) đề cập đến vấn đề trích xuất các thực thể nhất định từ văn bản. Ví dụ, chúng ta cần hiểu rằng trong câu *Tôi cần bay đến Paris vào ngày mai* từ *ngày mai* là DATE, và *Paris* là LOCATION. -* **Trích xuất từ khóa** tương tự như NER, nhưng chúng ta cần tự động trích xuất các từ quan trọng đối với ý nghĩa của câu mà không cần huấn luyện trước cho các loại thực thể cụ thể. -* **Phân cụm văn bản** có thể hữu ích khi chúng ta muốn nhóm các câu tương tự lại với nhau, ví dụ, các yêu cầu tương tự trong các cuộc trò chuyện hỗ trợ kỹ thuật. -* **Trả lời câu hỏi** đề cập đến khả năng của mô hình trả lời một câu hỏi cụ thể. Mô hình nhận một đoạn văn bản và một câu hỏi làm đầu vào, và nó cần cung cấp vị trí trong văn bản nơi chứa câu trả lời cho câu hỏi (hoặc đôi khi, tạo ra văn bản câu trả lời). -* **Tạo văn bản** là khả năng của mô hình tạo ra văn bản mới. Nó có thể được xem như một nhiệm vụ phân loại dự đoán chữ/từ tiếp theo dựa trên một *gợi ý văn bản*. Các mô hình tạo văn bản tiên tiến, như GPT-3, có thể giải quyết các nhiệm vụ NLP khác như phân loại bằng cách sử dụng kỹ thuật gọi là [lập trình gợi ý](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) hoặc [kỹ thuật gợi ý](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29). -* **Tóm tắt văn bản** là một kỹ thuật khi chúng ta muốn máy tính "đọc" văn bản dài và tóm tắt nó trong vài câu. -* **Dịch máy** có thể được xem như sự kết hợp giữa việc hiểu văn bản ở một ngôn ngữ và tạo văn bản ở ngôn ngữ khác. +* **Phân loại văn bản** là một bài toán phân loại điển hình liên quan đến các chuỗi văn bản. Ví dụ bao gồm phân loại email thành spam hoặc không spam, hoặc phân loại các bài viết thành thể thao, kinh doanh, chính trị, v.v. Ngoài ra, khi phát triển chatbot, chúng ta thường cần hiểu người dùng muốn nói gì — trong trường hợp này chúng ta xử lý **phân loại ý định**. Thường thì, trong phân loại ý định chúng ta cần xử lý nhiều loại khác nhau. +* **Phân tích đánh giá cảm xúc** là một bài toán hồi quy điển hình, trong đó chúng ta cần gán một số (một điểm cảm xúc) tương ứng với mức độ tích cực/tiêu cực của ý nghĩa câu. Phiên bản nâng cao hơn của phân tích cảm xúc là **phân tích cảm xúc dựa trên khía cạnh** (ABSA), trong đó chúng ta gán cảm xúc không phải cho toàn bộ câu mà cho các phần khác nhau của nó (các khía cạnh), ví dụ *Ở nhà hàng này, tôi thích ẩm thực, nhưng không khí lại tồi tệ*. +* **Nhận diện Thực thể Có tên** (NER) đề cập đến bài toán trích xuất các thực thể nhất định từ văn bản. Ví dụ, chúng ta có thể cần hiểu rằng trong câu *Tôi cần bay đến Paris vào ngày mai* thì từ *ngày mai* đề cập đến NGÀY THÁNG, và *Paris* là một ĐỊA ĐIỂM. +* **Trích xuất từ khóa** tương tự như NER, nhưng chúng ta cần trích xuất tự động các từ quan trọng với ý nghĩa của câu, không sử dụng đào tạo trước cho các loại thực thể cụ thể. +* **Phân cụm văn bản** có thể hữu ích khi chúng ta muốn nhóm các câu tương tự lại với nhau, ví dụ như các yêu cầu giống nhau trong cuộc trò chuyện hỗ trợ kỹ thuật. +* **Trả lời câu hỏi** đề cập đến khả năng của mô hình trả lời một câu hỏi cụ thể. Mô hình nhận đầu vào là đoạn văn bản và câu hỏi, và cần cung cấp vị trí trong văn bản chứa câu trả lời cho câu hỏi (hoặc, đôi khi, tạo ra văn bản câu trả lời). +* **Tạo văn bản** là khả năng của mô hình tạo ra văn bản mới. Nó có thể được coi là bài toán phân loại dự đoán ký tự/từ tiếp theo dựa trên một *đoạn kích thích văn bản*. Các mô hình tạo văn bản tiên tiến, như GPT-3, có thể giải các nhiệm vụ NLP khác như phân loại bằng kỹ thuật gọi là [lập trình kích thích](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) hoặc [kỹ thuật kích thích](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29) +* **Tóm tắt văn bản** là kỹ thuật khi bạn muốn máy tính "đọc" văn bản dài và tóm tắt nó trong vài câu. +* **Dịch máy** có thể được xem như sự kết hợp của việc hiểu văn bản trong một ngôn ngữ, và tạo văn bản trong một ngôn ngữ khác. -Ban đầu, hầu hết các nhiệm vụ NLP được giải quyết bằng các phương pháp truyền thống như ngữ pháp. Ví dụ, trong dịch máy, các bộ phân tích cú pháp được sử dụng để chuyển đổi câu ban đầu thành cây cú pháp, sau đó các cấu trúc ngữ nghĩa cấp cao hơn được trích xuất để đại diện cho ý nghĩa của câu, và dựa trên ý nghĩa này và ngữ pháp của ngôn ngữ đích, kết quả được tạo ra. Ngày nay, nhiều nhiệm vụ NLP được giải quyết hiệu quả hơn bằng cách sử dụng mạng nơ-ron. +Ban đầu, hầu hết các nhiệm vụ NLP được giải quyết bằng các phương pháp truyền thống như ngữ pháp. Ví dụ, trong dịch máy người ta dùng bộ phân tích cú pháp để chuyển câu ban đầu thành cây cú pháp, rồi trích xuất các cấu trúc ngữ nghĩa cấp cao hơn để biểu diễn ý nghĩa câu, và dựa trên ý nghĩa này và ngữ pháp ngôn ngữ đích kết quả được tạo ra. Ngày nay, nhiều nhiệm vụ NLP được giải quyết hiệu quả hơn bằng cách sử dụng mạng nơ-ron. -> Nhiều phương pháp NLP cổ điển được triển khai trong thư viện Python [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org). Có một [Sách NLTK](https://www.nltk.org/book/) tuyệt vời có sẵn trực tuyến, cung cấp cách giải quyết các nhiệm vụ NLP khác nhau bằng NLTK. +> Nhiều phương pháp NLP cổ điển được cài đặt trong thư viện Python [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org). Có một cuốn [Sách NLTK](https://www.nltk.org/book/) tuyệt vời trực tuyến hướng dẫn cách giải quyết các nhiệm vụ NLP khác nhau bằng NLTK. -Trong khóa học của chúng ta, chúng ta sẽ chủ yếu tập trung vào việc sử dụng Mạng Nơ-ron cho NLP, và sẽ sử dụng NLTK khi cần thiết. +Trong khóa học này, chúng ta sẽ chủ yếu tập trung vào việc sử dụng Mạng Nơ-ron cho NLP, và sử dụng NLTK khi cần. -Chúng ta đã học về việc sử dụng mạng nơ-ron để xử lý dữ liệu dạng bảng và hình ảnh. Sự khác biệt chính giữa các loại dữ liệu đó và văn bản là văn bản là một chuỗi có độ dài thay đổi, trong khi kích thước đầu vào trong trường hợp hình ảnh được biết trước. Mặc dù mạng tích chập có thể trích xuất các mẫu từ dữ liệu đầu vào, các mẫu trong văn bản phức tạp hơn. Ví dụ, chúng ta có thể có sự phủ định được tách khỏi chủ ngữ bởi nhiều từ (ví dụ: *Tôi không thích cam*, so với *Tôi không thích những quả cam lớn, đầy màu sắc, ngon*), và điều đó vẫn cần được hiểu là một mẫu. Do đó, để xử lý ngôn ngữ, chúng ta cần giới thiệu các loại mạng nơ-ron mới, như *mạng hồi quy* và *transformers*. +Chúng ta đã học về việc sử dụng mạng nơ-ron để xử lý dữ liệu bảng và hình ảnh. Sự khác biệt chính giữa các loại dữ liệu đó và văn bản là văn bản là một chuỗi có độ dài thay đổi, trong khi kích thước đầu vào trong trường hợp hình ảnh đã biết trước. Trong khi mạng tích chập có thể trích xuất mẫu từ dữ liệu đầu vào, các mẫu trong văn bản phức tạp hơn. Ví dụ, chúng ta có thể có sự phủ định tách rời ra khỏi chủ ngữ với khoảng cách bất kỳ bao nhiêu từ (ví dụ *Tôi không thích cam*, vs. *Tôi không thích những quả cam to nhiều màu sắc và ngon*), và điều đó vẫn phải được hiểu là một mẫu duy nhất. Do đó, để xử lý ngôn ngữ chúng ta cần giới thiệu các loại mạng nơ-ron mới, như *mạng hồi tiếp* và *transformers*. ## Cài đặt Thư viện -Nếu bạn đang sử dụng cài đặt Python cục bộ để chạy khóa học này, bạn có thể cần cài đặt tất cả các thư viện cần thiết cho NLP bằng các lệnh sau: +Nếu bạn sử dụng cài đặt Python cục bộ để chạy khóa học này, bạn có thể cần cài đặt tất cả các thư viện cần thiết cho NLP bằng các lệnh sau: -**Đối với PyTorch** +**Dành cho PyTorch** ```bash -pip install -r requirements-torch.txt +pip install -r requirements-pytorch.txt ``` -**Đối với TensorFlow** +**Dành cho TensorFlow** ```bash pip install -r requirements-tf.txt ``` @@ -39,13 +39,13 @@ pip install -r requirements-tf.txt ## Cảnh báo GPU -Trong phần này, trong một số ví dụ, chúng ta sẽ huấn luyện các mô hình khá lớn. -* **Sử dụng Máy tính Có GPU**: Nên chạy các notebook của bạn trên một máy tính có GPU để giảm thời gian chờ khi làm việc với các mô hình lớn. -* **Hạn chế Bộ nhớ GPU**: Chạy trên GPU có thể dẫn đến tình trạng hết bộ nhớ GPU, đặc biệt khi huấn luyện các mô hình lớn. -* **Tiêu thụ Bộ nhớ GPU**: Lượng bộ nhớ GPU tiêu thụ trong quá trình huấn luyện phụ thuộc vào nhiều yếu tố, bao gồm kích thước minibatch. -* **Giảm Kích thước Minibatch**: Nếu bạn gặp vấn đề về bộ nhớ GPU, hãy cân nhắc giảm kích thước minibatch trong mã của bạn như một giải pháp tiềm năng. -* **Giải phóng Bộ nhớ GPU của TensorFlow**: Các phiên bản cũ của TensorFlow có thể không giải phóng bộ nhớ GPU đúng cách khi huấn luyện nhiều mô hình trong một kernel Python. Để quản lý việc sử dụng bộ nhớ GPU hiệu quả, bạn có thể cấu hình TensorFlow để chỉ phân bổ bộ nhớ GPU khi cần thiết. -* **Bao gồm Mã**: Để thiết lập TensorFlow chỉ phân bổ bộ nhớ GPU khi cần, hãy thêm mã sau vào các notebook của bạn: +Trong phần này, trong một số ví dụ chúng ta sẽ huấn luyện các mô hình khá lớn. +* **Sử dụng máy tính có GPU**: Nên chạy notebook của bạn trên máy tính có GPU để giảm thời gian chờ khi làm việc với các mô hình lớn. +* **Hạn chế bộ nhớ GPU**: Chạy trên GPU có thể dẫn đến tình trạng hết bộ nhớ GPU, đặc biệt khi huấn luyện các mô hình lớn. +* **Tiêu thụ bộ nhớ GPU**: Lượng bộ nhớ GPU sử dụng trong quá trình huấn luyện phụ thuộc vào nhiều yếu tố, bao gồm kích thước minibatch. +* **Giảm kích thước Minibatch**: Nếu gặp vấn đề về bộ nhớ GPU, hãy cân nhắc giảm kích thước minibatch trong code của bạn như một giải pháp tiềm năng. +* **Giải phóng bộ nhớ GPU của TensorFlow**: Các phiên bản TensorFlow cũ có thể không giải phóng bộ nhớ GPU đúng cách khi huấn luyện nhiều mô hình trong một kernel Python. Để quản lý hiệu quả bộ nhớ GPU, bạn có thể cấu hình TensorFlow để cấp phát bộ nhớ GPU chỉ khi cần. +* **Bao gồm mã code**: Để đặt TensorFlow chỉ tăng bộ nhớ GPU khi cần, hãy bao gồm đoạn mã sau trong notebook của bạn: ```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) ``` -Nếu bạn quan tâm đến việc học về NLP từ góc độ ML cổ điển, hãy truy cập [bộ bài học này](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP). +Nếu bạn quan tâm đến việc học NLP từ góc nhìn ML cổ điển, hãy truy cập [bộ bài học này](https://github.com/microsoft/ML-For-Beginners/tree/main/6-NLP) ## Trong Phần này -Trong phần này, chúng ta sẽ học về: +Trong phần này chúng ta sẽ học về: * [Biểu diễn văn bản dưới dạng tensor](13-TextRep/README.md) * [Word Embeddings](14-Emdeddings/README.md) -* [Mô hình ngôn ngữ](15-LanguageModeling/README.md) -* [Mạng Nơ-ron Hồi quy](16-RNN/README.md) -* [Mạng Tạo sinh](17-GenerativeNetworks/README.md) +* [Mô hình Ngôn ngữ](15-LanguageModeling/README.md) +* [Mạng Nơ-ron Hồi tiếp](16-RNN/README.md) +* [Mạng Sinh tạo](17-GenerativeNetworks/README.md) * [Transformers](18-Transformers/README.md) --- -**Tuyên bố miễn trừ trách nhiệm**: -Tài liệu này đã được dịch bằng dịch vụ dịch thuật AI [Co-op Translator](https://github.com/Azure/co-op-translator). Mặc dù chúng tôi cố gắng đảm bảo độ chính xác, xin lưu ý rằng các bản dịch tự động có thể chứa lỗi hoặc không chính xác. Tài liệu gốc bằng ngôn ngữ bản địa nên được coi là nguồn thông tin chính thức. Đối với các thông tin quan trọng, khuyến nghị sử dụng dịch vụ dịch thuật chuyên nghiệp từ con người. Chúng tôi không chịu trách nhiệm cho bất kỳ sự hiểu lầm hoặc diễn giải sai nào phát sinh từ việc sử dụng bản dịch này. \ No newline at end of file + +**Tuyên bố miễn trừ trách nhiệm**: +Tài liệu này đã được dịch bằng dịch vụ dịch thuật AI [Co-op Translator](https://github.com/Azure/co-op-translator). Mặc dù chúng tôi cố gắng đảm bảo độ chính xác, xin lưu ý rằng bản dịch tự động có thể chứa lỗi hoặc sai sót. Tài liệu gốc bằng ngôn ngữ gốc nên được coi là nguồn tin chính thức. Đối với thông tin quan trọng, nên sử dụng dịch vụ dịch thuật chuyên nghiệp bởi con người. Chúng tôi không chịu trách nhiệm về bất kỳ hiểu lầm hoặc giải thích sai nào phát sinh từ việc sử dụng bản dịch này. + \ No newline at end of file diff --git a/translations/zh-CN/.co-op-translator.json b/translations/zh-CN/.co-op-translator.json index d012fd5e48..28b182e8dd 100644 --- a/translations/zh-CN/.co-op-translator.json +++ b/translations/zh-CN/.co-op-translator.json @@ -5,6 +5,12 @@ "source_file": "AGENTS.md", "language_code": "zh-CN" }, + "CONTRIBUTING.md": { + "original_hash": "c6fd7e781b67111a90abd166d0ce4aa0", + "translation_date": "2026-07-08T18:45:17+00:00", + "source_file": "CONTRIBUTING.md", + "language_code": "zh-CN" + }, "README.md": { "original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b", "translation_date": "2026-04-06T15:57:19+00:00", @@ -17,6 +23,19 @@ "source_file": "SECURITY.md", "language_code": "zh-CN" }, + "__translation_failures__": { + "lessons/sketchnotes/LICENSE.md": { + "original_hash": "45ab63a2cd8f5faef6c9b150618837a4", + "source_file": "lessons/sketchnotes/LICENSE.md", + "language_code": "zh-CN", + "failure_date": "2026-07-08T18:40:20+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-24T20:42:43+00:00", @@ -54,8 +73,8 @@ "language_code": "zh-CN" }, "examples/README.md": { - "original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7", - "translation_date": "2025-10-03T11:27:26+00:00", + "original_hash": "7883d52c2e2a221e0b07a7b112a149b9", + "translation_date": "2026-07-08T18:36:57+00:00", "source_file": "examples/README.md", "language_code": "zh-CN" }, @@ -66,8 +85,8 @@ "language_code": "zh-CN" }, "lessons/0-course-setup/how-to-run.md": { - "original_hash": "a4717bd9103b9f6cd84d534b83534689", - "translation_date": "2026-01-15T11:52:39+00:00", + "original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1", + "translation_date": "2026-07-08T18:37:16+00:00", "source_file": "lessons/0-course-setup/how-to-run.md", "language_code": "zh-CN" }, @@ -191,6 +210,12 @@ "source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md", "language_code": "zh-CN" }, + "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": { + "original_hash": "99b816b6a4957ef4100cee4c4221dff9", + "translation_date": "2026-07-08T18:30:04+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", + "language_code": "zh-CN" + }, "lessons/4-ComputerVision/08-TransferLearning/lab/README.md": { "original_hash": "7765935c35fcee69b9fe2d0cfd6963e2", "translation_date": "2025-08-24T20:35:55+00:00", @@ -330,8 +355,8 @@ "language_code": "zh-CN" }, "lessons/5-NLP/README.md": { - "original_hash": "8ef02a9318257ea140ed3ed74442096d", - "translation_date": "2025-08-24T20:28:41+00:00", + "original_hash": "038df6f1a73e49f6430740da083bfd6d", + "translation_date": "2026-07-08T18:37:38+00:00", "source_file": "lessons/5-NLP/README.md", "language_code": "zh-CN" }, diff --git a/translations/zh-CN/CONTRIBUTING.md b/translations/zh-CN/CONTRIBUTING.md new file mode 100644 index 0000000000..05e2dbf701 --- /dev/null +++ b/translations/zh-CN/CONTRIBUTING.md @@ -0,0 +1,29 @@ +# 贡献给 AI-For-Beginners + +感谢您对贡献 AI-For-Beginners 的兴趣!我们欢迎翻译、课程修正和格式更正。 + +## Microsoft 贡献者许可协议 (CLA) + +本项目欢迎贡献和建议。大多数贡献需要您同意贡献者许可协议 (CLA),声明您有权利且确实授予我们使用您贡献的权利。详情请访问 [https://cla.microsoft.com](https://cla.microsoft.com)。 + +当您提交拉取请求时,CLA 机器人会自动判断您是否需要提供 CLA 并相应地修饰 PR(例如标签、评论)。只需按照机器人提供的说明操作。您仅需在所有使用我们 CLA 的仓库中完成一次此操作。 + +## 如何贡献 + +### 1. 修正拼写错误 / 代码错误 +如果您在任何 Jupyter 笔记本或课程 markdown 文件中发现拼写错误或 bug: +1. 分叉仓库。 +2. 修正拼写错误或损坏的链接。 +3. 提交带有明确修正说明的拉取请求。 + +### 2. 提交翻译 +我们欢迎将课程翻译成其他语言!请将翻译放置在 `translations/` 目录下,使用已有的文件夹名称(例如 `translations/es/`、`translations/pt-BR/`、`translations/zh-CN/`)。 + +更多详情,请参见 [etc/CONTRIBUTING.md](etc/CONTRIBUTING.md)。 + +--- + + +**免责声明**: +本文件由 AI 翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 翻译完成。尽管我们力求准确,但请注意,自动翻译可能包含错误或不准确之处。原始语言版文件应视为权威来源。对于重要信息,建议使用专业人工翻译。我们对因使用本翻译而产生的任何误解或误释不承担责任。 + \ No newline at end of file diff --git a/translations/zh-CN/examples/README.md b/translations/zh-CN/examples/README.md index 0ceddb429f..305edf9378 100644 --- a/translations/zh-CN/examples/README.md +++ b/translations/zh-CN/examples/README.md @@ -1,27 +1,27 @@ -# 初学者友好的 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 基础 | +| [简单神经网络](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 或更高版本)。安装所需的包: +请确保安装了 Python(推荐版本 3.8 及以上)。安装所需的包: ```bash -# For Python scripts +# 用于Python脚本 pip install numpy -# For Jupyter notebooks (image classifier) +# 用于Jupyter笔记本(图像分类器) pip install jupyter numpy pillow tensorflow ``` @@ -34,52 +34,54 @@ conda activate ai4beg ### 运行示例 -**对于 Python 脚本 (.py 文件):** +**对于 Python 脚本(.py 文件):** ```bash python 01-hello-ai-world.py ``` -**对于 Jupyter 笔记本 (.ipynb 文件):** +**对于 Jupyter 笔记本(.ipynb 文件):** ```bash jupyter notebook 03-image-classifier.ipynb ``` ## 📖 学习路径 -我们建议按顺序学习以下示例: +我们建议按顺序完成以下示例: -1. **从“Hello AI World”开始** - 学习模式识别的基础知识 -2. **构建一个简单的神经网络** - 理解神经网络的工作原理 -3. **尝试图像分类器** - 使用真实图像体验 AI 的实际应用 -4. **分析文本情感** - 探索自然语言处理 +1. **从 “Hello AI World” 开始** - 学习模式识别基础 +2. 构建一个简单神经网络 - 理解神经网络的工作原理 +3. 尝试图像分类器 - 体验 AI 在真实图像中的应用 +4. 分析文本情感 - 探索自然语言处理 ## 💡 初学者提示 -- **仔细阅读代码注释** - 它们解释了每一行代码的作用 -- **大胆尝试!** - 尝试修改参数,观察结果 -- **不要担心无法完全理解** - 学习是一个循序渐进的过程 -- **提出问题** - 使用 [讨论板](https://github.com/microsoft/AI-For-Beginners/discussions) +- 仔细阅读代码注释 - 它们解释了每行代码的作用 +- **多多实验!** - 尝试修改数值,观察结果 +- 不用担心一开始理解全部内容 - 学习需要时间 +- 有问题就问 - 使用[讨论区](https://github.com/microsoft/AI-For-Beginners/discussions) -## 🔗 下一步 +## 🔗 后续步骤 -完成这些示例后,可以探索完整课程: -- [AI 简介](../lessons/1-Intro/README.md) +完成这些示例后,继续探索完整课程: +- [AI 入门介绍](../lessons/1-Intro/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)进行翻译。尽管我们努力确保准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言的文档为权威来源。对于关键信息,建议使用专业人工翻译。因使用本翻译而引起的任何误解或误读,我们概不负责。 \ No newline at end of file + +**免责声明**: +本文件由 AI 翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 翻译完成。尽管我们力求准确,但请注意,自动翻译可能包含错误或不准确之处。原始语言版文件应视为权威来源。对于重要信息,建议使用专业人工翻译。我们对因使用本翻译而产生的任何误解或误释不承担责任。 + \ No newline at end of file diff --git a/translations/zh-CN/lessons/0-course-setup/how-to-run.md b/translations/zh-CN/lessons/0-course-setup/how-to-run.md index fae8f86d0f..6f349d7cbc 100644 --- a/translations/zh-CN/lessons/0-course-setup/how-to-run.md +++ b/translations/zh-CN/lessons/0-course-setup/how-to-run.md @@ -1,12 +1,12 @@ # 如何运行代码 -本课程包含许多可执行的示例和实验,您可能希望运行这些内容。为此,您需要能够在本课程提供的 Jupyter 笔记本中执行 Python 代码。运行代码时,您有以下几种选择: +本课程包含许多可执行示例和实验,您可能想运行它们。为此,您需要能够在本课程提供的 Jupyter Notebook 中执行 Python 代码。您有几种运行代码的选择: -## 在您电脑上本地运行 +## 在您的计算机上本地运行 -要在本地电脑上运行代码,您需要安装 Python。推荐安装 **[miniconda](https://conda.io/en/latest/miniconda.html)** ——这是一种相对轻量级的安装方式,支持不同 Python **虚拟环境** 的 `conda` 包管理器。 +若要在您的计算机上本地运行代码,需要安装 Python。推荐安装 **[miniconda](https://conda.io/en/latest/miniconda.html)** —— 它是较轻量的安装,支持使用 `conda` 包管理器管理不同的 Python 虚拟环境。 -安装 miniconda 后,克隆本仓库并创建一个虚拟环境来用于本课程: +安装 miniconda 后,克隆仓库并创建一个本课程用的虚拟环境: ```bash git clone http://github.com/microsoft/ai-for-beginners @@ -17,17 +17,17 @@ conda activate ai4beg ### 使用带 Python 扩展的 Visual Studio Code -本课程建议使用带有 [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) 打开学习。 +在 [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 环境。无论是经典 Jupyter 还是 JupyterHub,都提供了自动补全、代码高亮等便利的开发环境。 +您也可以在自己计算机上的浏览器中使用 Jupyter 环境。无论是经典 Jupyter 还是 JupyterHub,都提供自动补全、代码高亮等便捷的开发环境。 -要在本地启动 Jupyter,进入课程目录,然后执行: +要在本地启动 Jupyter,请进入课程目录,执行以下命令: ```bash jupyter notebook @@ -36,36 +36,36 @@ jupyter notebook ```bash jupyterhub ``` -然后您可以导航到任何 `.ipynb` 文件,打开并开始操作。 +然后,您可以导航到任何 `.ipynb` 文件,打开它们并开始工作。 -### 在容器中运行 +### 容器中运行 -另一种替代 Python 安装的方法是运行容器。由于本仓库提供了专门的 `.devcontainer` 文件夹,指导如何为本仓库构建容器,VS Code 支持重新在容器中打开代码。这需要安装 Docker,并且稍微复杂些,因此建议更有经验的用户使用。 +安装 Python 的另一种方式是通过容器运行代码。由于我们的仓库提供了一个专门的 `.devcontainer` 文件夹,指导如何为此仓库构建容器,VS Code 提供重新在容器中打开代码的选项。这需要安装 Docker,且更复杂,因此我们建议经验丰富的用户使用。 -## 在云端运行 +## 云端运行 -如果您不想在本地安装 Python,并且可以访问一些云资源,另一个不错的选择是云端运行代码。您可以通过以下几种方式实现: +如果您不想本地安装 Python,且拥有某些云资源,另一种选择是云端运行代码。您可以通过几种方式实现这一点: -* 使用 **[GitHub Codespaces](https://github.com/features/codespaces)**,这是 GitHub 为您创建的虚拟环境,可以通过 VS Code 浏览器界面访问。如果您有 Codespaces 权限,只需点击仓库中的 **Code** 按钮,启动 codespace,马上即可运行。 -* 使用 **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**。[Binder](https://mybinder.org) 提供免费的云计算资源,方便用户在线测试 GitHub 上的代码。主页上有按钮可一键打开仓库到 Binder——您将进入 Binder 网站,它会构建基础容器,并无缝启动 Jupyter 网页界面。 +* 使用 **[GitHub Codespaces](https://github.com/features/codespaces)**,这是 GitHub 为您创建的虚拟环境,可通过 VS Code 浏览器界面访问。如果您能使用 Codespaces,只需点击仓库中的 **Code** 按钮,启动 codespace,马上就能运行。 +* 使用 **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**。[Binder](https://mybinder.org) 为像您这样的用户提供免费的云端计算资源,可以用来测试 GitHub 上的代码。主页上有一个按钮可以在 Binder 中打开仓库,这会迅速带您到 Binder 网站,它会构建底层容器,并无缝启动 Jupyter 网页界面。 -> **注意**:为防止滥用,Binder 屏蔽了部分网络资源访问。这可能导致部分依赖于互联网获取模型和/或数据集的代码无法运行,您可能需要寻找变通方案。此外,Binder 提供的计算资源较为基础,因此训练速度较慢,特别是在后期较复杂的课程中。 +> 注意:为防止滥用,Binder 对某些网络资源有限制。这可能导致部分代码无法运行(尤其是那些从公共互联网获取模型和/或数据集的代码)。您可能需要找到一些解决方法。另外,Binder 提供的计算资源相当基础,训练过程会很慢,尤其是在后面更复杂的课程中。 -## 在带 GPU 的云端运行 +## 云端 GPU 运行 -本课程后期一些课程如果支持 GPU 会大大加快速度。例如,模型训练在没有 GPU 的情况下会非常缓慢。您可以考虑以下几种方案,尤其是如果您通过 [Azure for Students](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。 +* 创建 [数据科学虚拟机(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。 -> **注意**:部分订阅,包括 Azure for Students,开箱即用并不支持 GPU,您可能需要通过技术支持请求申请额外 GPU 核心。 +> 注意:某些订阅(包括 Azure for Students)默认不提供 GPU 支持。您可能需要通过技术支持请求额外申请 GPU 核心。 -* 创建 [Azure 机器学习工作区](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 机器学习工作区](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste),使用其中的 Notebook 功能。[此视频](https://azure-for-academics.github.io/quickstart/azureml-papers/)展示了如何将仓库克隆到 Azure ML Notebook 并开始使用。 -您还可以使用 Google Colab,其免费提供部分 GPU 支持,并上传 Jupyter 笔记本逐个执行。 +您也可以使用 Google Colab,它提供部分免费 GPU 支持,您可以上传 Jupyter Notebook 并逐个执行。 --- -**免责声明**: -本文档使用 AI 翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 翻译而成。尽管我们力求准确,但请注意,自动翻译可能包含错误或不准确之处。原始文档的母语版本应被视为权威来源。对于重要信息,建议采用专业人工翻译。我们不对因使用此翻译所引起的任何误解或错误解读承担责任。 +**免责声明**: +本文件由 AI 翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 翻译完成。尽管我们力求准确,但请注意,自动翻译可能包含错误或不准确之处。原始语言版文件应视为权威来源。对于重要信息,建议使用专业人工翻译。我们对因使用本翻译而产生的任何误解或误释不承担责任。 \ No newline at end of file diff --git a/translations/zh-CN/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/zh-CN/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index 403f5ffe60..40f5e3aa87 100644 --- a/translations/zh-CN/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/zh-CN/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -6,9 +6,9 @@ "source": [ "# 预训练模型与迁移学习\n", "\n", - "训练卷积神经网络(CNN)可能需要耗费大量时间,并且需要大量数据。然而,大部分时间实际上是用来学习网络用来从图像中提取模式的最佳低级滤波器。这时,一个自然的问题就出现了——我们是否可以使用在一个数据集上训练好的神经网络,并将其适配到对不同图像的分类任务,而无需完整的训练过程?\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),也可以从[微软](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", @@ -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加速可用,使用它是很合理的。幸运的是,如果GPU可用,Keras会自动加速计算。我们可以使用以下代码检查Tensorflow是否能够使用GPU:\n" + "深度神经网络,比如 VGG-16 以及其他更现代的架构,需要相当多的计算能力来运行。如果有可用的 GPU 加速,那使用它是很有意义的。幸运的是,Keras 会自动加速在 GPU 上的计算(如果 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": [ - "特征张量的维度是 7x7x512,但为了可视化,我们需要将其重塑为二维形式。\n", + "特征张量的维度是7x7x512,但为了可视化,我们必须将其重塑为二维形式。\n", "\n", - "现在让我们尝试看看这些特征是否可以用于图像分类。我们手动选取一部分图像(在我们的例子中是 50 个小批量),并预先计算它们的特征向量。我们可以使用 Tensorflow 的 **dataset** API 来完成这项工作。`map` 函数会接收一个数据集,并应用给定的 lambda 函数来对其进行转换。我们利用这一机制构建了新的数据集 `ds_features_train` 和 `ds_features_test`,这些数据集包含的是通过 VGG 提取的特征,而不是原始图像。\n" + "现在让我们尝试看看这些特征是否可以用来分类图像。让我们手动取一部分图像(在我们的例子中是50个小批次),并预先计算它们的特征向量。我们可以使用Tensorflow的dataset API来完成这项工作。`map`函数接受一个数据集并应用给定的lambda函数进行转换。我们利用这个机制构建了新的数据集,`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": [ - "这个模型看起来像一个端到端的分类网络,它接收一张图片并返回类别。然而,关键点在于我们希望 VGG16 充当特征提取器,而不是重新训练。因此,我们需要**冻结卷积特征提取器的权重**。我们可以通过调用 `model.layers[0]` 访问网络的第一层,然后只需将 `trainable` 属性设置为 `False`。\n", + "这个模型看起来像一个端到端的分类网络,它接收一张图片并返回类别。然而,棘手的是我们希望VGG16作为特征提取器,而不进行重新训练。因此,我们需要冻结卷积特征提取器的权重。我们可以通过调用`model.layers[0]`访问网络的第一层,只需将`trainable`属性设置为`False`即可。\n", "\n", - "> **注意**:冻结特征提取器的权重是必要的,因为否则未训练的分类器层可能会破坏卷积提取器的原始预训练权重。\n", + "> 注意:需要冻结特征提取器的权重,否则未经训练的分类器层可能会破坏卷积提取器原本的预训练权重。\n", "\n", - "你会注意到,虽然我们网络的总参数数量大约是 1500 万,但我们只训练了 2.5 万个参数。所有顶层卷积滤波器的其他参数都是预训练的。这是好事,因为我们可以用较少的样本微调较少的参数。\n", + "你可以注意到,虽然我们网络中的参数总数约为1500万,但我们实际上只训练了2.5万个参数。所有其他顶层卷积滤波器的参数都是预训练的。这是好事,因为我们能够用更少的样本微调更少的参数。\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" ] }, { @@ -870,13 +881,13 @@ "source": [ "## 微调迁移学习\n", "\n", - "在上一节中,我们训练了最终的分类器层来对我们自己的数据集中的图像进行分类。然而,我们并没有重新训练特征提取器,模型依赖于它在 ImageNet 数据上学到的特征。如果你的目标对象在视觉上与普通的 ImageNet 图像有很大不同,这种特征组合可能无法达到最佳效果。因此,开始训练卷积层也是有意义的。\n", + "在上一节中,我们训练了最终的分类器层来对我们自己的数据集中的图像进行分类。然而,我们没有重新训练特征提取器,模型依赖于在 ImageNet 数据上学到的特征。如果你的对象在视觉上与普通的 ImageNet 图像不同,这种特征组合可能效果不佳。因此,开始训练卷积层也是有意义的。\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": [ - "然而,一次解冻所有层并不是最好的主意。我们可以首先只解冻最后几层卷积层,因为它们包含与我们的图像相关的高级模式。例如,首先我们可以冻结所有层,除了最后4层:\n" + "但是,一次性解冻所有层并不是最好的主意。我们可以先只解冻几个最后的卷积层,因为它们包含与我们的图像相关的更高级别的模式。例如,开始时,我们可以冻结所有层,除了最后4层:\n" ] }, { @@ -1000,11 +1011,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "注意到可训练参数的数量显著增加,但仍然只占所有参数的大约50%。\n", + "注意,可训练参数数量显著增加,但仍约占所有参数的50%。\n", "\n", - "解冻后,我们可以再进行几个训练周期(在我们的例子中,我们只进行一个)。你也可以选择较低的学习率,以尽量减少对预训练权重的影响。然而,即使使用较低的学习率,你也可以预期在训练开始时准确率会有所下降,直到最终达到比固定权重情况下稍高的水平。\n", + "解冻后,我们可以进行更多轮的训练(在我们的示例中,我们只进行一轮)。你也可以选择较低的学习率,以尽量减少对预训练权重的影响。然而,即使学习率较低,你也可以预期训练开始时准确率会下降,直到最终达到比固定权重时略高的水平。\n", "\n", - "> **注意:** 这种训练速度会慢得多,因为我们需要将梯度反向传播通过网络的许多层!\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** 架构和谷歌的 **Inception**。例如,让我们来探索最简单的 ResNet-50 模型的架构(ResNet 是一个具有不同深度的模型家族,如果你想看看真正深度的模型,可以尝试 ResNet-152):\n" + "VGG-16 是最简单的计算机视觉架构之一。Keras 提供了更多预训练网络。其中最常用的是微软开发的 **ResNet** 架构和谷歌的 **Inception**。例如,让我们探索最简单的 ResNet-50 模型的架构(ResNet 是一系列不同深度的模型,如果你想看看真正深层模型的样子,可以尝试 ResNet-152):\n" ] }, { @@ -1441,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" ] }, { @@ -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\n**免责声明**:\n本文件由 AI 翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 翻译完成。尽管我们力求准确,但请注意,自动翻译可能包含错误或不准确之处。原始语言版文件应视为权威来源。对于重要信息,建议使用专业人工翻译。我们对因使用本翻译而产生的任何误解或误释不承担责任。\n\n" ] } ], @@ -1484,12 +1495,6 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" - }, - "coopTranslator": { - "original_hash": "c189abc107848f96051085cc30945129", - "translation_date": "2025-08-31T09:40:27+00:00", - "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", - "language_code": "zh" } }, "nbformat": 4, diff --git a/translations/zh-CN/lessons/5-NLP/README.md b/translations/zh-CN/lessons/5-NLP/README.md index c95ec62820..75a76a3f36 100644 --- a/translations/zh-CN/lessons/5-NLP/README.md +++ b/translations/zh-CN/lessons/5-NLP/README.md @@ -1,51 +1,51 @@ # 自然语言处理 -![NLP任务总结图](../../../../translated_images/zh-CN/ai-nlp.b22dcb8ca4707cea.webp) +![自然语言处理任务概览草图](../../../../translated_images/zh-CN/ai-nlp.b22dcb8ca4707cea.webp) -在本节中,我们将重点使用神经网络来处理与**自然语言处理 (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)指的是从文本中提取特定实体的问题。例如,我们需要理解短语 我明天需要飞往巴黎 中,明天 指的是日期,巴黎* 是位置。 +* 关键词提取与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任务如分类。 +* 文本摘要是一种技术,我们希望计算机“阅读”长文本并将其总结成几句话。 +* 机器翻译可以视为一种在一种语言上理解文本,在另一种语言上生成文本的结合。 -最初,大多数NLP任务是通过传统方法(如语法)解决的。例如,在机器翻译中,解析器用于将初始句子转换为语法树,然后提取高级语义结构以表示句子的意义,基于这种意义和目标语言的语法生成结果。如今,许多NLP任务通过神经网络更有效地解决。 +最初,大多数NLP任务是用传统方法如文法来解决的。例如,在机器翻译中,解析器用于将初始句子转换为语法树,然后提取更高层次的语义结构来表示句子的含义,基于这个含义和目标语言的文法生成结果。如今,许多NLP任务更有效的解决方法是使用神经网络。 -> 许多经典的NLP方法在[自然语言处理工具包 (NLTK)](https://www.nltk.org) Python库中实现。在线有一本很棒的[NLTK书籍](https://www.nltk.org/book/),涵盖了如何使用NLTK解决不同的NLP任务。 +> 许多经典的NLP方法在[自然语言处理工具包(NLTK)](https://www.nltk.org) Python库中实现。网上有一本很棒的[NLTK书籍](https://www.nltk.org/book/),介绍了如何使用NLTK解决不同的NLP任务。 -在我们的课程中,我们将主要关注使用神经网络进行NLP,并在需要时使用NLTK。 +在我们的课程中,我们将主要关注使用神经网络处理NLP,并在需要时使用NLTK。 -我们已经学习了如何使用神经网络处理表格数据和图像。这些数据类型与文本的主要区别在于,文本是一个可变长度的序列,而图像的输入大小是预先确定的。虽然卷积网络可以从输入数据中提取模式,但文本中的模式更复杂。例如,否定可能与主语分隔许多单词(例如:*我不喜欢橙子*,与*我不喜欢那些又大又多彩又美味的橙子*),但仍应被解释为一个模式。因此,为了处理语言,我们需要引入新的神经网络类型,例如*循环网络*和*Transformer*。 +我们已经学习过如何使用神经网络处理表格数据和图像。这些数据与文本的主要区别在于,文本是可变长度的序列,而图像的输入大小是预先已知的。虽然卷积网络可从输入数据中提取模式,但文本中的模式更为复杂。例如,否定词与主语之间可以隔开任意多个词(如 我不喜欢橙子,和 我不喜欢那些又大又好吃的彩色橙子),但仍然应被视为一个模式。因此,为了处理语言,我们需要引入新的神经网络类型,如循环网络transformer。 ## 安装库 -如果您使用本地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 ``` -> 您可以在[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内存量取决于多个因素,包括小批量大小。 -* **最小化小批量大小**:如果遇到GPU内存问题,可以考虑减少代码中的小批量大小作为解决方案。 -* **TensorFlow GPU内存释放**:旧版本的TensorFlow可能无法正确释放GPU内存,尤其是在一个Python内核中训练多个模型时。为了有效管理GPU内存使用,可以配置TensorFlow仅在需要时分配GPU内存。 -* **代码包含**:要设置TensorFlow仅在需要时增长GPU内存分配,请在笔记本中包含以下代码: +本节中,在一些示例里我们将训练相当大型的模型。 +* **使用支持GPU的电脑**:建议在支持GPU的计算机上运行笔记本,以减少使用大型模型时等待的时间。 +* **GPU内存限制**:使用GPU时,训练大型模型可能会导致GPU内存不足。 +* **GPU内存消耗**:训练时消耗的GPU内存量取决于多个因素,包括小批量大小。 +* 尽可能减小小批量大小:遇到GPU内存问题时,可以尝试通过减小代码中的小批量大小来解决。 +* **TensorFlow GPU内存释放**:较旧版本的TensorFlow在同一Python内核中训练多个模型时可能无法正确释放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) ``` -如果您对从经典机器学习角度学习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) +* [语言模型](15-LanguageModeling/README.md) * [循环神经网络](16-RNN/README.md) * [生成网络](17-GenerativeNetworks/README.md) * [Transformer](18-Transformers/README.md) -**免责声明**: -本文档使用AI翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原文档的原始语言版本为权威来源。对于关键信息,建议使用专业人工翻译。我们对因使用此翻译而引起的任何误解或误读不承担责任。 \ No newline at end of file +--- + + +**免责声明**: +本文件由 AI 翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 翻译完成。尽管我们力求准确,但请注意,自动翻译可能包含错误或不准确之处。原始语言版文件应视为权威来源。对于重要信息,建议使用专业人工翻译。我们对因使用本翻译而产生的任何误解或误释不承担责任。 + \ No newline at end of file diff --git a/translations/zh-HK/.co-op-translator.json b/translations/zh-HK/.co-op-translator.json index a3f9ab06bc..2b70448e3d 100644 --- a/translations/zh-HK/.co-op-translator.json +++ b/translations/zh-HK/.co-op-translator.json @@ -5,6 +5,12 @@ "source_file": "AGENTS.md", "language_code": "zh-HK" }, + "CONTRIBUTING.md": { + "original_hash": "c6fd7e781b67111a90abd166d0ce4aa0", + "translation_date": "2026-07-08T19:30:26+00:00", + "source_file": "CONTRIBUTING.md", + "language_code": "zh-HK" + }, "README.md": { "original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b", "translation_date": "2026-04-06T15:47:30+00:00", @@ -17,6 +23,19 @@ "source_file": "SECURITY.md", "language_code": "zh-HK" }, + "__translation_failures__": { + "lessons/sketchnotes/LICENSE.md": { + "original_hash": "45ab63a2cd8f5faef6c9b150618837a4", + "source_file": "lessons/sketchnotes/LICENSE.md", + "language_code": "zh-HK", + "failure_date": "2026-07-08T19:20: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-24T22:17:55+00:00", @@ -54,8 +73,8 @@ "language_code": "zh-HK" }, "examples/README.md": { - "original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7", - "translation_date": "2025-10-03T11:27:49+00:00", + "original_hash": "7883d52c2e2a221e0b07a7b112a149b9", + "translation_date": "2026-07-08T19:15:45+00:00", "source_file": "examples/README.md", "language_code": "zh-HK" }, @@ -66,8 +85,8 @@ "language_code": "zh-HK" }, "lessons/0-course-setup/how-to-run.md": { - "original_hash": "a4717bd9103b9f6cd84d534b83534689", - "translation_date": "2026-01-15T11:59:59+00:00", + "original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1", + "translation_date": "2026-07-08T19:16:09+00:00", "source_file": "lessons/0-course-setup/how-to-run.md", "language_code": "zh-HK" }, @@ -191,6 +210,12 @@ "source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md", "language_code": "zh-HK" }, + "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": { + "original_hash": "99b816b6a4957ef4100cee4c4221dff9", + "translation_date": "2026-07-08T19:11:32+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", + "language_code": "zh-HK" + }, "lessons/4-ComputerVision/08-TransferLearning/lab/README.md": { "original_hash": "7765935c35fcee69b9fe2d0cfd6963e2", "translation_date": "2025-08-24T22:03:37+00:00", @@ -330,8 +355,8 @@ "language_code": "zh-HK" }, "lessons/5-NLP/README.md": { - "original_hash": "8ef02a9318257ea140ed3ed74442096d", - "translation_date": "2025-08-24T21:43:23+00:00", + "original_hash": "038df6f1a73e49f6430740da083bfd6d", + "translation_date": "2026-07-08T19:16:35+00:00", "source_file": "lessons/5-NLP/README.md", "language_code": "zh-HK" }, diff --git a/translations/zh-HK/CONTRIBUTING.md b/translations/zh-HK/CONTRIBUTING.md new file mode 100644 index 0000000000..ad44e186f7 --- /dev/null +++ b/translations/zh-HK/CONTRIBUTING.md @@ -0,0 +1,29 @@ +# 為 AI 初學者 貢獻 + +感謝您有興趣為 AI-For-Beginners 貢獻!我們歡迎翻譯、課程修正及格式更正。 + +## 微軟貢獻者授權協議 (CLA) + +本專案歡迎貢獻和建議。大多數貢獻者必須同意貢獻者授權協議(CLA),聲明您有權利並確實授權我們使用您的貢獻。詳情請參閱 [https://cla.microsoft.com](https://cla.microsoft.com)。 + +當您提交拉取請求時,CLA 機器人會自動判斷您是否需要提供 CLA 並對 PR 做出適當標記(如標籤、評論)。只需依照機器人指示操作。您在所有使用我們 CLA 的倉庫中只需執行一次此操作。 + +## 如何貢獻 + +### 1. 修正拼字錯誤/程式碼錯誤 +如果您發現任何 Jupyter 筆記本或課程 markdown 檔案裡有拼字或錯誤: +1. 分叉該倉庫。 +2. 修正拼字錯誤或損壞連結。 +3. 提交拉取請求時附上明確的修正說明。 + +### 2. 提交翻譯 +我們歡迎將課程翻譯成其他語言!請將翻譯放置於 `translations/` 目錄下,使用現有的資料夾名稱(例如 `translations/es/`、`translations/pt-BR/`、`translations/zh-CN/`)。 + +更多詳情,請參考 [etc/CONTRIBUTING.md](etc/CONTRIBUTING.md)。 + +--- + + +**免責聲明**: +本文件由 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 翻譯而成。雖然我們致力於確保準確性,但請注意,機器自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於重要資訊,建議進行專業人工翻譯。我們不對因使用本翻譯而產生的任何誤解或誤釋承擔責任。 + \ No newline at end of file diff --git a/translations/zh-HK/examples/README.md b/translations/zh-HK/examples/README.md index 12eedce647..5deeed2712 100644 --- a/translations/zh-HK/examples/README.md +++ b/translations/zh-HK/examples/README.md @@ -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 +# 適用於 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,35 +34,35 @@ 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. 嘗試影像分類器 - 見識 AI 實際應用於真實影像 +4. 分析文本情緒 - 探索自然語言處理 -## 💡 初學者提示 +## 💡 初學者小提示 -- **仔細閱讀程式碼註解** - 它們解釋了每一行的作用 -- **多嘗試!** - 嘗試更改數值並觀察結果 -- **不用擔心完全理解** - 學習是需要時間的 -- **提出問題** - 使用 [討論板](https://github.com/microsoft/AI-For-Beginners/discussions) +- 仔細閱讀程式註解 - 這些會說明每行程式碼的作用 +- **多做實驗!** - 嘗試更改數值,觀察結果變化 +- 不用擔心一下子全部都懂 - 學習需要時間 +- 勇於提問 - 使用 [討論區](https://github.com/microsoft/AI-For-Beginners/discussions) -## 🔗 下一步 +## 🔗 後續步驟 -完成這些範例後,探索完整課程: +完成這些範例後,可探索完整課程: - [AI 簡介](../lessons/1-Intro/README.md) - [神經網絡](../lessons/3-NeuralNetworks/README.md) - [電腦視覺](../lessons/4-ComputerVision/README.md) @@ -70,16 +70,18 @@ jupyter notebook 03-image-classifier.ipynb ## 🤝 貢獻 -覺得這些範例有幫助嗎?幫助我們改進: -- 回報問題或提出改進建議 -- 添加更多適合初學者的範例 -- 改善文件和註解 +覺得這些範例有幫助嗎?歡迎幫助我們改進: +- 回報問題或建議改進 +- 新增更多適合初學者的範例 +- 改善文件與註解 --- -*記住:每位專家都曾是初學者。祝學習愉快! 🎓* +*記住:每位專家都曾是初學者。祝你學習愉快!🎓* --- -**免責聲明**: -本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於重要資訊,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋概不負責。 \ No newline at end of file + +**免責聲明**: +本文件由 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 翻譯而成。雖然我們致力於確保準確性,但請注意,機器自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於重要資訊,建議進行專業人工翻譯。我們不對因使用本翻譯而產生的任何誤解或誤釋承擔責任。 + \ No newline at end of file diff --git a/translations/zh-HK/lessons/0-course-setup/how-to-run.md b/translations/zh-HK/lessons/0-course-setup/how-to-run.md index fcc139979e..1f9a284a64 100644 --- a/translations/zh-HK/lessons/0-course-setup/how-to-run.md +++ b/translations/zh-HK/lessons/0-course-setup/how-to-run.md @@ -1,12 +1,12 @@ -# 如何執行程式碼 +# 如何執行代碼 -本課程包含了很多可執行的範例和實驗室,你會想要運行它們。為此,你需要能在本課程提供的 Jupyter 筆記本中執行 Python 程式碼。你有幾種選擇來執行程式碼: +本課程包含許多可執行的範例和實驗室,您會想要運行它們。要做到這一點,您需要能夠在本課程附帶的 Jupyter 筆記本中執行 Python 代碼。您有幾種運行代碼的選項: -## 在你的電腦本地執行 +## 在您的電腦本地運行 -要在你的電腦本地執行程式碼,需要安裝 Python。推薦安裝 **[miniconda](https://conda.io/en/latest/miniconda.html)** —— 它是個相當輕量的安裝,支援 `conda` 套件管理器來處理不同的 Python **虛擬環境**。 +為了在您的電腦本地運行代碼,需要安裝 Python。建議安裝 **[miniconda](https://conda.io/en/latest/miniconda.html)** —— 它是一個相當輕量的安裝包,支援使用 `conda` 套件管理器來管理不同的 Python 虛擬環境。 -安裝 miniconda 後,請複製這個資料庫並建立一個虛擬環境,用於本課程: +安裝 miniconda 後,請克隆此倉庫並創建一個該課程使用的虛擬環境: ```bash git clone http://github.com/microsoft/ai-for-beginners @@ -15,61 +15,57 @@ conda env create --name ai4beg --file .devcontainer/environment.yml conda activate ai4beg ``` +### 使用 Visual Studio Code 搭配 Python 擴展 -### 使用含 Python 擴充功能的 Visual Studio Code +本課程最佳使用方式是打開 [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,前往課程目錄並執行: +若要在本地啟動 Jupyter,請進入課程目錄並執行: ```bash jupyter notebook ``` - 或 +或 ```bash jupyterhub ``` +然後您可以導航至任何 `.ipynb` 文件,打開並開始使用。 +### 容器中運行 -之後,你可以導航到任意 `.ipynb` 檔案,開啟它們並開始工作。 - -### 在容器中運行 - -另一種選擇是不安裝 Python,而是在容器中運行程式碼。由於我們的資料庫包含一個特殊的 `.devcontainer` 資料夾,說明如何為此倉庫建置容器,VS Code 提供在容器中重新開啟程式碼的選項。這需要安裝 Docker,且過程較複雜,因此建議有經驗的使用者使用。 - -## 在雲端執行 +不安裝 Python 的另一個方案是將代碼在容器中運行。由於本倉庫提供了一個特殊的 `.devcontainer` 資料夾,指示如何為此倉庫構建容器,VS Code 可提供重新在容器中打開代碼的機會。這需要安裝 Docker,且操作較複雜,我們建議較有經驗的使用者使用。 -如果你不想在本地安裝 Python,且能存取一些雲端資源,另一個好選擇是在雲端運行程式碼。你有幾種方式可以做到: +## 在雲端運行 -* 使用 **[GitHub Codespaces](https://github.com/features/codespaces)**,這是在 GitHub 上為你建立的虛擬環境,通過 VS Code 瀏覽器介面存取。如果你有 Codespaces 權限,只需點選倉庫內的 **Code** 按鈕,啟動 codespace,即可快速開始。 +如果您不想在本地安裝 Python,且能使用某些雲端資源,一個很好的替代方案是將代碼放到雲端運行。您可以用以下幾種方式: -* 使用 **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**。 [Binder](https://mybinder.org) 為用戶提供免費的雲端運算資源,方便你測試 GitHub 上的程式碼。首頁有個按鈕可在 Binder 中開啟該倉庫——它會快速帶你進入 Binder 網站,建立底層容器並無縫啟動 Jupyter 網頁介面。 +* 使用 **[GitHub Codespaces](https://github.com/features/codespaces)**,這是一個在 GitHub 上為您創建的虛擬環境,通過 VS Code 的瀏覽器界面存取。只要您能使用 Codespaces,點擊倉庫中的 **Code** 按鈕,啟動一個 codespace,即可迅速開始工作。 +* 使用 **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**。[Binder](https://mybinder.org) 為像您這樣的用戶免費提供雲端計算資源,可讓您測試 GitHub 上的部分代碼。首頁有按鈕可在 Binder 中打開此倉庫 —— 它會迅速帶您進入 Binder 網站,該網站會構建底層容器並無縫啟動 Jupyter 網頁介面。 -> **注意**:為防止濫用,Binder 有些網路資源的訪問被阻擋,這可能會導致部分從公共網際網路抓取模型和/或資料集的程式碼無法運作。你可能需要尋找替代方案。此外,Binder 提供的運算資源相當基礎,訓練速度會慢,尤其是在後面較複雜的課程中。 +> 注意: 為防止濫用,Binder 對部分網路資源設有限制。這可能導致某些代碼無法正常執行(尤其是從公開網路下載模型和/或數據集時)。您可能需要尋找替代方案。此外,Binder 提供的計算資源較為基礎,因此訓練過程會較慢,特別是在後期較複雜的課程中。 -## 在雲端使用 GPU 執行 +## 在雲端使用 GPU 運行 -本課程後期的某些課程會從 GPU 支援中大幅獲益。例如模型訓練否則會非常緩慢。若你透過 [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) 或你的學校取得雲端資源,可參考以下選項: +本課程後期的部分課程將大大受惠於 GPU 支持。例如模型訓練,若無 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 系列虛擬機支援 GPU。 +* 建立 [資料科學虛擬機器](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste),並透過 Jupyter 連線到該機器,然後您可以直接在該機器克隆倉庫開始學習。NC 系列虛擬機器支援 GPU。 -> **注意**:部分訂閱方案(包括 Azure for Students)預設不提供 GPU 支援,你可能需透過技術支援請求額外核配 GPU 核心。 +> 注意: 某些訂閱(包括 Azure for Students)預設不提供 GPU 支持。您可能需要透過技術支援申請額外的 GPU 核心。 -* 建立 [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 筆記本並開始使用。 +* 建立 [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 支持,並上傳 Jupyter 筆記本逐個執行。 --- -**免責聲明**: -本文件由 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們盡力確保準確性,但請注意,自動翻譯可能存在錯誤或不準確之處。原始文件的母語版本應視為權威來源。對於重要資訊,建議採用專業人工翻譯。我們不對因使用本翻譯所引起的任何誤解或誤釋承擔責任。 +**免責聲明**: +本文件由 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 翻譯而成。雖然我們致力於確保準確性,但請注意,機器自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於重要資訊,建議進行專業人工翻譯。我們不對因使用本翻譯而產生的任何誤解或誤釋承擔責任。 \ No newline at end of file diff --git a/translations/zh-HK/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/zh-HK/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index 785ee9e533..997d8af8c4 100644 --- a/translations/zh-HK/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/zh-HK/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -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 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", - "在之前的例子中,我們使用的是 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", @@ -510,20 +520,17 @@ "cell_type": "markdown", "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" + "有幾個重要的事情需要說明:\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" ] }, { @@ -602,7 +609,7 @@ "source": [ "## 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` 函數會接收一個數據集,並應用指定的 lambda 函數來進行轉換。我們利用這個機制來構建新的數據集,`ds_features_train` 和 `ds_features_test`,這些數據集包含的是 VGG 提取的特徵,而不是原始圖片。\n" + "現在讓我們嘗試看看這些特徵是否可以用於分類圖像。讓我們手動取出部分圖像(在我們的例子中是 50 個小批次),並預先計算它們的特徵向量。我們可以使用 Tensorflow 的 **dataset** API 來完成這件事。`map` 函數接收一個資料集,並套用給定的 lambda 函數來轉換它。我們利用這個機制來構造新的資料集 `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 模型也可以作為另一個神經網絡中的一層使用!我們只需要構建一個在其上方添加密集分類器的網絡,然後通過反向傳播訓練整個網絡即可。\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", - "> **注意**: 凍結特徵提取器的權重是必要的,因為如果不這樣做,未訓練的分類層可能會破壞卷積提取器原本的預訓練權重。\n", + "> 注意:需要凍結特徵提取器權重,因為否則未經訓練的分類層可能會破壞卷積提取器原本的預訓練權重。\n", "\n", - "你會注意到,雖然我們的網絡總參數數量大約是 1500 萬,但我們只訓練了 2.5 萬個參數。所有其他頂層卷積濾波器的參數都是預訓練的。這是好的,因為我們能夠用較少的樣本微調較少的參數。\n", + "你會注意到,雖然我們網絡的參數總數約有 1500 萬,但我們只訓練了 2.5 萬個參數。所有其他頂層卷積濾波器的參數都是預訓練的。這很好,因為我們可以用較少的範例微調較少的參數。\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" ] }, { @@ -873,13 +881,13 @@ "source": [ "## 微調遷移學習\n", "\n", - "在上一節中,我們已經訓練了最終的分類器層,用於分類我們自己的數據集中的圖像。然而,我們並未重新訓練特徵提取器,模型依賴於它在 ImageNet 數據中學到的特徵。如果你的物件在視覺上與普通的 ImageNet 圖像有所不同,這種特徵組合可能未必是最佳的。因此,開始訓練卷積層是合理的。\n", + "在上一節中,我們已經訓練了最終的分類器層,以便在我們自己的數據集中分類圖像。然而,我們沒有重新訓練特徵提取器,模型依賴於在 ImageNet 數據上學習到的特徵。如果你的物體在視覺上與普通的 ImageNet 圖像不同,這組合的特徵可能不會是最佳的。因此,開始訓練卷積層也是有意義的。\n", "\n", - "為了做到這一點,我們可以解凍之前已凍結的卷積濾波器參數。\n", + "為此,我們可以解凍之前凍結的卷積濾波器參數。\n", "\n", - "> **注意:** 首先凍結參數並進行幾個訓練週期以穩定分類層的權重是非常重要的。如果你直接開始訓練未凍結參數的端到端網絡,可能會因為大的錯誤而破壞卷積層中的預訓練權重。\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" + "不過,一次過解凍全部層不是最佳方案。我們可以先只解凍最後幾層卷積,因為它們包含對我們圖像有關的較高層次模式。例如,起初我們可以凍結除最後 4 層之外的所有層: \n" ] }, { @@ -1003,11 +1011,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "觀察到可訓練參數的數量顯著增加,但仍然只佔所有參數的大約50%。\n", + "注意可訓練參數的數量顯著增加,但仍約為所有參數的50%。\n", "\n", - "解凍後,我們可以進行多幾個訓練週期(在我們的例子中,我們只進行一個)。你也可以選擇較低的學習率,以減少對預訓練權重的影響。然而,即使使用低學習率,你仍然可以預期在訓練初期準確度會下降,直到最終達到比固定權重情況稍高的水平。\n", + "解凍後,我們可以再進行幾個訓練周期(在我們的例子中,我們只做了一個)。你也可以選擇較低的學習率,以盡量減少對預訓練權重的影響。不過,即使學習率很低,你仍可以預期訓練開始時準確率會下降,直到最終達到略高於固定權重情況的水平。\n", "\n", - "> **注意:** 這種訓練速度會慢得多,因為我們需要將梯度反向傳播到網絡的多層!\n" + "> **注意:** 這種訓練會慢得多,因為我們需要將梯度反向傳播通過網絡的多層!\n" ] }, { @@ -1031,9 +1039,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "我們可能會達到更高的訓練準確率,因為我們使用了更強大的網絡並且擁有更多的參數,但驗證準確率的提升可能不會那麼明顯。\n", + "我們很可能會達到較高的訓練準確率,因為我們使用了更多參數的更強大網絡,但驗證準確率的提升不會那麼多。 \n", "\n", - "可以嘗試解鎖網絡中的更多層並進行更多訓練,看看是否能夠達到更高的準確率!\n" + "歡迎您解凍更多網絡層並進行更多訓練,看看是否能達成更高的準確率! \n" ] }, { @@ -1042,7 +1050,7 @@ "source": [ "## 其他電腦視覺模型\n", "\n", - "VGG-16 是其中一個最簡單的電腦視覺架構。Keras 提供了更多預訓練的網絡。其中最常用的包括由 Microsoft 開發的 **ResNet** 架構,以及 Google 的 **Inception**。例如,我們可以探索最簡單的 ResNet-50 模型的架構(ResNet 是一個擁有不同深度的模型系列,如果你想看看真正深度的模型,可以嘗試 ResNet-152):\n" + "VGG-16 是最簡單的電腦視覺架構之一。Keras 提供了更多預訓練的網絡。其中最常用的是由微軟開發的 **ResNet** 架構,以及 Google 的 **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", "\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\n**免責聲明**:\n本文件由 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 翻譯而成。雖然我們致力於確保準確性,但請注意,機器自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於重要資訊,建議進行專業人工翻譯。我們不對因使用本翻譯而產生的任何誤解或誤釋承擔責任。\n\n" ] } ], @@ -1487,12 +1495,6 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" - }, - "coopTranslator": { - "original_hash": "c189abc107848f96051085cc30945129", - "translation_date": "2025-08-31T09:41:41+00:00", - "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", - "language_code": "hk" } }, "nbformat": 4, diff --git a/translations/zh-HK/lessons/5-NLP/README.md b/translations/zh-HK/lessons/5-NLP/README.md index efaa188263..e314e279a5 100644 --- a/translations/zh-HK/lessons/5-NLP/README.md +++ b/translations/zh-HK/lessons/5-NLP/README.md @@ -1,51 +1,51 @@ # 自然語言處理 -![NLP 任務的手繪圖概述](../../../../translated_images/zh-HK/ai-nlp.b22dcb8ca4707cea.webp) +![以塗鴉方式總結的NLP任務](../../../../translated_images/zh-HK/ai-nlp.b22dcb8ca4707cea.webp) -在本節中,我們將專注於使用神經網絡來處理與**自然語言處理 (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)指的是從文本中提取特定實體的問題。例如,我們可能需要理解在短語 我明天需要飛往巴黎 中,明天 指的是日期,巴黎* 是地點。 +* 關鍵詞抽取 與NER相似,但我們需要自動抽取對句子意義重要的詞,且無需針對特定實體類型預先訓練。 +* 文本聚類 在我們想將相似句子歸類在一起時非常有用,例如技術支援對話中相似的請求。 +* 問答系統 指模型回應特定問題的能力。模型接收一段文本和一個問題作為輸入,並需要指出文本中包含該問題答案的位置(有時也可能直接生成答案文本)。 + 文本生成 是模型生成新文本的能力。這可以被視為一種分類任務,根據某段文本提示*預測下一個字母/詞。先進的文本生成模型,如GPT-3,能使用稱為 [prompt programming](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) 或 [prompt engineering](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29) 的技巧來解決其它NLP任務如分類。 +* 文本摘要 是一種技術,當我們希望電腦「閱讀」長文本並用幾句話來總結時使用。 +* 機器翻譯 可以被視為一種將一種語言的文本理解與另一種語言文本生成相結合的任務。 -最初,大多數 NLP 任務是通過傳統方法(如語法)解決的。例如,在機器翻譯中,解析器被用來將初始句子轉換為語法樹,然後提取高層語義結構來表示句子的含義,基於這些含義和目標語言的語法生成結果。如今,許多 NLP 任務使用神經網絡更有效地解決。 +最初,大多數NLP任務是使用傳統方法如文法來解決的。例如,在機器翻譯中,使用解析器將初始句子轉換成語法樹,然後提取更高層次的語義結構以表達句子含義,並基於這個含義和目標語言的文法產生結果。現今,很多NLP任務都能更有效地使用神經網絡來解決。 -> 許多經典的 NLP 方法已在 [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org) Python 庫中實現。網上有一本很棒的 [NLTK 書](https://www.nltk.org/book/),涵蓋了如何使用 NLTK 解決不同的 NLP 任務。 +> 許多經典的NLP方法都實現在 [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org) Python庫中。線上有一本很棒的 [NLTK Book](https://www.nltk.org/book/),介紹了如何使用NLTK解決不同的NLP任務。 -在我們的課程中,我們將主要專注於使用神經網絡進行 NLP,並在需要時使用 NLTK。 +在本課程中,我們將主要專注於使用神經網絡進行NLP,並在需要時使用NLTK。 -我們已經學習了如何使用神經網絡處理表格數據和圖像。這些數據類型與文本的主要區別在於,文本是可變長度的序列,而圖像的輸入大小是事先已知的。雖然卷積網絡可以從輸入數據中提取模式,但文本中的模式更為複雜。例如,否定可能與主語分隔許多單詞(例如:*我不喜歡橙子*,與 *我不喜歡那些又大又多彩又美味的橙子*),但仍應被解釋為一個模式。因此,為了處理語言,我們需要引入新的神經網絡類型,例如*循環網絡*和*變壓器*。 +我們已經學過用神經網絡處理表格數據和圖像。這些數據類型與文本的主要區別在於,文本是可變長度的序列,而圖像的輸入大小是預先已知的。雖然卷積網絡可以從輸入數據中提取模式,但文本中的模式更為複雜。例如,我們可能有否定詞與主語被許多詞隔開的情況(例如 我不喜歡橙子我不喜歡那些又大又鮮艷又好吃的橙子),但這兩者仍應該解釋為一種模式。因此,為了處理語言,我們需要引入新型的神經網絡類型,如循環網絡變壓器。 -## 安裝庫 +## 安裝函式庫 -如果您使用本地 Python 安裝來運行本課程,您可能需要使用以下命令安裝 NLP 所需的所有庫: +如果你使用本地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 ``` -> 您可以在 [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 在一個 Python 內核中訓練多個模型時可能無法正確釋放 GPU 記憶體。為了有效管理 GPU 記憶體使用,您可以配置 TensorFlow 僅在需要時分配 GPU 記憶體。 -* **代碼包含**:要設置 TensorFlow 僅在需要時增長 GPU 記憶體分配,請在筆記本中包含以下代碼: +本節中某些範例將會訓練相當大型的模型。 +* **使用支援GPU的電腦**:建議在支援GPU的電腦上運行你的筆記本,以減少處理大型模型時的等待時間。 +* **GPU 記憶體限制**:在GPU上運行時可能會遇到GPU記憶體不足的情況,尤其是訓練大型模型時。 +* **GPU 記憶體使用量**:訓練時的GPU記憶體消耗取決於多種因素,包括小批次的大小。 +* 盡量縮小小批次大小:若遇到GPU記憶體問題,考慮在程式碼中減少小批次大小作為解決辦法。 +* **TensorFlow GPU 記憶體釋放**:舊版本TensorFlow在同一Python內核訓練多個模型時可能無法正確釋放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) ``` -如果您對從經典機器學習角度學習 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) +* [語言模型](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) 進行翻譯。我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。應以原文文件作為權威來源。對於關鍵資訊,建議尋求專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋概不負責。 \ No newline at end of file +--- + + +**免責聲明**: +本文件由 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 翻譯而成。雖然我們致力於確保準確性,但請注意,機器自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於重要資訊,建議進行專業人工翻譯。我們不對因使用本翻譯而產生的任何誤解或誤釋承擔責任。 + \ No newline at end of file diff --git a/translations/zh-MO/.co-op-translator.json b/translations/zh-MO/.co-op-translator.json index 80b8f4b683..7435448034 100644 --- a/translations/zh-MO/.co-op-translator.json +++ b/translations/zh-MO/.co-op-translator.json @@ -5,6 +5,12 @@ "source_file": "AGENTS.md", "language_code": "zh-MO" }, + "CONTRIBUTING.md": { + "original_hash": "c6fd7e781b67111a90abd166d0ce4aa0", + "translation_date": "2026-07-08T18:45:24+00:00", + "source_file": "CONTRIBUTING.md", + "language_code": "zh-MO" + }, "README.md": { "original_hash": "12c8eb6bf0867d2f1c32daf613ac5b8b", "translation_date": "2026-04-06T15:59:55+00:00", @@ -17,6 +23,19 @@ "source_file": "SECURITY.md", "language_code": "zh-MO" }, + "__translation_failures__": { + "lessons/sketchnotes/LICENSE.md": { + "original_hash": "45ab63a2cd8f5faef6c9b150618837a4", + "source_file": "lessons/sketchnotes/LICENSE.md", + "language_code": "zh-MO", + "failure_date": "2026-07-08T18:44: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-26T11:17:02+00:00", @@ -54,8 +73,8 @@ "language_code": "zh-MO" }, "examples/README.md": { - "original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7", - "translation_date": "2025-10-03T11:27:40+00:00", + "original_hash": "7883d52c2e2a221e0b07a7b112a149b9", + "translation_date": "2026-07-08T18:40:54+00:00", "source_file": "examples/README.md", "language_code": "zh-MO" }, @@ -66,8 +85,8 @@ "language_code": "zh-MO" }, "lessons/0-course-setup/how-to-run.md": { - "original_hash": "a4717bd9103b9f6cd84d534b83534689", - "translation_date": "2026-01-15T11:56:17+00:00", + "original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1", + "translation_date": "2026-07-08T18:41:17+00:00", "source_file": "lessons/0-course-setup/how-to-run.md", "language_code": "zh-MO" }, @@ -191,6 +210,12 @@ "source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md", "language_code": "zh-MO" }, + "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": { + "original_hash": "99b816b6a4957ef4100cee4c4221dff9", + "translation_date": "2026-07-08T18:31:48+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", + "language_code": "zh-MO" + }, "lessons/4-ComputerVision/08-TransferLearning/lab/README.md": { "original_hash": "7765935c35fcee69b9fe2d0cfd6963e2", "translation_date": "2025-08-26T09:52:46+00:00", @@ -330,8 +355,8 @@ "language_code": "zh-MO" }, "lessons/5-NLP/README.md": { - "original_hash": "8ef02a9318257ea140ed3ed74442096d", - "translation_date": "2025-08-26T08:02:59+00:00", + "original_hash": "038df6f1a73e49f6430740da083bfd6d", + "translation_date": "2026-07-08T18:41:44+00:00", "source_file": "lessons/5-NLP/README.md", "language_code": "zh-MO" }, diff --git a/translations/zh-MO/CONTRIBUTING.md b/translations/zh-MO/CONTRIBUTING.md new file mode 100644 index 0000000000..bdbd52d0cc --- /dev/null +++ b/translations/zh-MO/CONTRIBUTING.md @@ -0,0 +1,29 @@ +# 為初學者貢獻AI + +感謝您有興趣為 AI-For-Beginners 貢獻!我們歡迎翻譯、課程修正和格式修正。 + +## 微軟貢獻者授權協議 (CLA) + +本專案歡迎貢獻和建議。大多數貢獻需要您同意一份貢獻者授權協議 (CLA),宣告您有權利,並確實授予我們使用您的貢獻的權利。詳情請參閱 [https://cla.microsoft.com](https://cla.microsoft.com)。 + +當您提交拉取請求時,CLA-bot 會自動判斷您是否需要提供 CLA 並適當標記該 PR(例如標籤、評論)。請按照機器人提供的指示操作。您只需在使用我們 CLA 的所有存儲庫中做一次此操作。 + +## 如何貢獻 + +### 1. 修正錯字 / 程式碼錯誤 +如果您在任何 Jupyter 筆記本或課程 markdown 檔中發現錯字或錯誤: +1. 分叉該存儲庫。 +2. 修正錯字或損壞的連結。 +3. 提交拉取請求並清楚描述修正內容。 + +### 2. 提交翻譯 +我們歡迎將課程翻譯成其他語言!請將翻譯內容放置於 `translations/` 目錄下,使用現有的資料夾名稱(例如 `translations/es/`、`translations/pt-BR/`、`translations/zh-CN/`)。 + +詳細資訊請參見 [etc/CONTRIBUTING.md](etc/CONTRIBUTING.md)。 + +--- + + +**免責聲明**: +本文件使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們力求準確,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於重要資訊,建議尋求專業人工翻譯。我們不對因使用本翻譯而引起的任何誤解或曲解承擔責任。 + \ No newline at end of file diff --git a/translations/zh-MO/examples/README.md b/translations/zh-MO/examples/README.md index 2fe4aa6abe..28e55eec06 100644 --- a/translations/zh-MO/examples/README.md +++ b/translations/zh-MO/examples/README.md @@ -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 +# 適用於 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,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. 嘗試圖像分類器 - 見識 AI 的真實應用 +4. 分析文字情緒 - 探索自然語言處理 -## 💡 初學者提示 +## 💡 初學者小貼士 -- **仔細閱讀程式碼註解** - 它們解釋了每行程式碼的作用 -- **多嘗試!** - 嘗試更改數值並觀察結果 -- **不用擔心完全理解** - 學習需要時間 -- **提出問題** - 使用 [討論板](https://github.com/microsoft/AI-For-Beginners/discussions) +- 仔細閱讀程式註解 - 它們說明每行程式碼的作用 +- **多做實驗!** - 嘗試改變數值,看看結果如何 +- 不用擔心一次就懂 - 學習需要時間 +- 提出問題 - 使用 [討論板](https://github.com/microsoft/AI-For-Beginners/discussions) -## 🔗 下一步 +## 🔗 後續步驟 完成這些範例後,探索完整課程: -- [AI 簡介](../lessons/1-Intro/README.md) +- [AI 入門](../lessons/1-Intro/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) 進行翻譯。雖然我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵資訊,建議使用專業人工翻譯。我們對因使用此翻譯而產生的任何誤解或錯誤解釋不承擔責任。 \ No newline at end of file + +**免責聲明**: +本文件使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們力求準確,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於重要資訊,建議尋求專業人工翻譯。我們不對因使用本翻譯而引起的任何誤解或曲解承擔責任。 + \ No newline at end of file diff --git a/translations/zh-MO/lessons/0-course-setup/how-to-run.md b/translations/zh-MO/lessons/0-course-setup/how-to-run.md index 2a960f4d49..12dc8efe26 100644 --- a/translations/zh-MO/lessons/0-course-setup/how-to-run.md +++ b/translations/zh-MO/lessons/0-course-setup/how-to-run.md @@ -1,12 +1,12 @@ # 如何執行程式碼 -本課程包含許多可執行的範例和實驗室,您會想要執行它們。為此,您需要能夠在本課程所提供的 Jupyter 筆記本中執行 Python 程式碼。您有幾種選擇可以執行程式碼: +本課程包含許多可執行的範例和實驗室,您會想要執行它們。為此,您需要能夠在此課程提供的 Jupyter 筆記本中執行 Python 程式碼。有幾種方式可以執行程式碼: -## 在您電腦本地執行 +## 在您的電腦本地執行 -要在您電腦本地執行程式碼,需要安裝 Python。建議安裝 **[miniconda](https://conda.io/en/latest/miniconda.html)** — 這是一個相對輕量的安裝,支援使用 `conda` 套件管理器管理不同的 Python **虛擬環境**。 +若要在您的電腦本地執行程式碼,需要安裝 Python。建議安裝 **[miniconda](https://conda.io/en/latest/miniconda.html)** — 這是一個輕量級安裝,支援使用 `conda` 套件管理器管理不同的 Python 虛擬環境。 -安裝 miniconda 後,克隆此倉庫並建立一個虛擬環境供本課程使用: +安裝 miniconda 後,複製本儲存庫並建立一個用於此課程的虛擬環境: ```bash git clone http://github.com/microsoft/ai-for-beginners @@ -15,19 +15,19 @@ conda env create --name ai4beg --file .devcontainer/environment.yml conda activate ai4beg ``` -### 使用安裝了 Python 擴充功能的 Visual Studio Code +### 使用 Visual Studio Code 與 Python 擴充套件 -本課程最適合在安裝了 [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) 中開啟進行使用。 +此課程建議在 [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,請前往課程目錄並執行: +若要在本地啟動 Jupyter,請移至課程目錄並執行: ```bash jupyter notebook @@ -36,36 +36,36 @@ jupyter notebook ```bash jupyterhub ``` -然後您可以導航到任何 `.ipynb` 檔案,開啟並開始操作。 +接著您即可瀏覽任何 `.ipynb` 檔案,打開並開始使用。 ### 在容器中執行 -另一種替代安裝 Python 的方法是使用容器來執行程式碼。由於我們的倉庫提供了一個特殊的 `.devcontainer` 資料夾,說明了如何為此倉庫建置容器,VS Code 提供機會讓您在容器中重新打開程式碼。這需要安裝 Docker,且流程較複雜,因此我們建議較有經驗的使用者採用此方式。 +另一種替代本地 Python 安裝的方法是使用容器執行程式碼。由於本儲存庫提供了一個特殊的 `.devcontainer` 資料夾,說明如何為此儲存庫建構容器,VS Code 提供了以容器重新打開程式碼的功能。這需要安裝 Docker,且操作較為複雜,因此我們建議具備經驗的使用者使用。 ## 在雲端執行 -如果您不想在本地安裝 Python,且能使用某些雲端資源,一個不錯的選擇是直接在雲端執行程式碼。您可以用以下幾種方法: +如果您不想在本地安裝 Python,且有雲端資源可用,另一個很好的選擇是在雲端執行程式碼。您可以用以下幾種方法: -* 使用 **[GitHub Codespaces](https://github.com/features/codespaces)**,這是在 GitHub 上為您建立的虛擬環境,可透過 VS Code 瀏覽器介面存取。如果您有 Codespaces 的使用權,您只需點選倉庫中的 **Code** 按鈕,啟動 codespace,即可迅速開始。 -* 使用 **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**。[Binder](https://mybinder.org) 免費提供雲端計算資源,方便您測試 GitHub 上的程式碼。在首頁有個按鈕可在 Binder 中開啟此倉庫 — 這會快速導向 Binder 網站,並自動建構一個底層容器,順暢啟動 Jupyter 網頁介面。 +* 使用 **[GitHub Codespaces](https://github.com/features/codespaces)**,這是在 GitHub 上為您建立的虛擬環境,可透過瀏覽器中的 VS Code 介面存取。如果您能使用 Codespaces,只需點擊儲存庫中的 **Code** 按鈕,啟動 codespace,即可立刻開始執行。 +* 使用 **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**。 [Binder](https://mybinder.org) 提供免費的雲端運算資源,方便您測試 GitHub 上的程式碼。首頁有一個按鈕可直接在 Binder 中開啟儲存庫 — 它會快速帶您進入 Binder 網站,背後會建構容器並順利啟動 Jupyter 網頁介面。 -> **注意**:為防止濫用,Binder 對部分網絡資源有限制,有時會阻擋某些從公共網際網路下載模型或資料集的程式碼,可能導致部分程式無法正常運行,您可能需要尋找替代方案。此外,Binder 提供的計算資源較基本,訓練過程會比較慢,尤其在後續較複雜課程中。 +> 注意:因預防濫用,Binder 對某些網路資源設有限制,這可能導致部分需從公開網路下載模型或資料集的程式碼無法運作。您可能需要尋找替代方法。此外,Binder 提供的運算資源相當基本,訓練速度會很慢,尤其是後面較複雜的課程。 -## 在雲端使用 GPU 執行 +## 在有 GPU 的雲端執行 -本課程後面的一些章節會大大受益於 GPU 支援。例如模型訓練,否則會非常緩慢。您可以選擇以下幾種方法,特別是您有透過 [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) 或您的機構取得雲端資源: +本課程後期的部分課程非常需要 GPU 支援。否則模型訓練可能非常緩慢。若您有雲端存取權限,特別是透過[Azure 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 系列虛擬機支援 GPU。 +* 建立 [資料科學虛擬機器](https://docs.microsoft.com/learn/modules/intro-to-azure-data-science-virtual-machine/?WT.mc_id=academic-77998-cacaste),並透過 Jupyter 連線。您可直接在該虛擬機器中複製儲存庫並開始學習。NC 系列虛擬機支援 GPU。 -> **注意**:部分訂閱服務,包括 Azure for Students 預設不提供 GPU 支援,您可能需要透過技術支援申請額外 GPU 核心。 +> 注意:部分訂閱方案(包含 Azure 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 Notebook 並開始使用。 +* 建立 [Azure 機器學習工作區](https://azure.microsoft.com/services/machine-learning/?WT.mc_id=academic-77998-cacaste),然後使用其內建的 Notebook 功能。[這段影片](https://azure-for-academics.github.io/quickstart/azureml-papers/)展示如何將儲存庫複製到 Azure ML Notebook 並開始使用。 -您亦可使用 Google Colab,它提供部分免費 GPU 支援,並能上傳 Jupyter 筆記本,一個一個地執行。 +您也可以使用 Google Colab,其提供部分免費的 GPU 支援,並在那裡上傳 Jupyter 筆記本逐一執行。 --- -**免責聲明**: -本文件經由 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們力求準確,請注意自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於重要資訊,建議使用專業人工翻譯。本公司不對使用本翻譯所引致的任何誤解或誤釋承擔責任。 +**免責聲明**: +本文件使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們力求準確,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於重要資訊,建議尋求專業人工翻譯。我們不對因使用本翻譯而引起的任何誤解或曲解承擔責任。 \ No newline at end of file diff --git a/translations/zh-MO/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/zh-MO/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index e544285231..39296f0c88 100644 --- a/translations/zh-MO/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/zh-MO/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -4,11 +4,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# 預訓練模型與遷移學習\n", + "# 預訓練模型和遷移學習\n", "\n", - "訓練卷積神經網絡(CNN)可能需要花費大量時間,並且需要大量數據。然而,大部分時間其實是用來學習網絡用於從圖像中提取模式的最佳低階濾波器。這時自然會產生一個問題——我們是否可以使用在某個數據集上訓練好的神經網絡,並將其適應於分類不同的圖像,而不需要完整的訓練過程?\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", + "在現實中,影像資料集的大小可能相當龐大,無法全部載入記憶體。因此,資料集通常會表示為產生器,能以適合訓練的小批量方式回傳資料。\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", @@ -510,20 +520,17 @@ "cell_type": "markdown", "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" + "這裡有幾個重要的事情:\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" ] }, { @@ -602,7 +609,7 @@ "source": [ "## 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": [ - "## 提取 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,但為了可視化,我們必須將其重塑為 2D 形式。\n", "\n", - "現在讓我們嘗試看看這些特徵是否可以用來分類圖像。我們手動選取部分圖像(在此例中為 50 個小批次),並預先計算它們的特徵向量。我們可以使用 Tensorflow 的 **dataset** API 來完成這項工作。`map` 函數會接收一個數據集並應用指定的 lambda 函數來進行轉換。我們利用這個機制來構建新的數據集,`ds_features_train` 和 `ds_features_test`,這些數據集包含的是 VGG 提取的特徵,而不是原始圖像。\n" + "現在讓我們嘗試看看這些特徵是否可以用來分類圖片。讓我們手動取出部分圖片(在我們的例子中是 50 個小批次),並預先計算它們的特徵向量。我們可以使用 Tensorflow **dataset** API 來做到這點。`map` 函數接收一個數據集並應用給定的 lambda 函數來轉換它。我們使用這個機制來構造新的數據集 `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 模型也可以作為另一個神經網路中的一層使用!我們只需要在其上構建一個密集分類器,然後通過反向傳播訓練整個網路即可。\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", - "> **注意**:凍結特徵提取器的權重是必要的,因為如果不這樣做,未訓練的分類層可能會破壞卷積提取器原本的預訓練權重。\n", + "> :需要凍結特徵擷取器嘅權重,因為如果唔係,未受訓嘅分類層會破壞卷積擷取器原本嘅預訓練權重。\n", "\n", - "你會注意到,儘管我們的網絡總參數數量約為 1500 萬,但我們只訓練了 2.5 萬個參數。所有其他頂層卷積濾波器的參數都是預訓練的。這是好的,因為我們能夠用較少的樣本微調較少的參數。\n", + "你會注意到,雖然我哋網絡嘅參數總數約有1500萬,但我哋只訓練緊25,000個參數。所有頂層嘅卷積濾波器嘅其他參數都係預先訓練好嘅。噉做係好嘅,因為我哋可以用較少嘅示例嚟微調較少嘅參數。\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", - "在解凍後,我們可以再進行幾個訓練週期(在我們的例子中,我們只進行一個)。您也可以選擇較低的學習率,以減少對預訓練權重的影響。然而,即使使用較低的學習率,您仍然可以預期在訓練開始時準確率會下降,直到最終達到略高於固定權重情況的水平。\n", + "解凍後,我們可以進行幾輪訓練(在我們的範例中,我們只做一輪)。你也可以選擇更低的學習率,以減少對預訓練權重的影響。然而,即使在低學習率的情況下,你也可以預期訓練初期準確度會下降,直到最終達到比固定權重情況下稍高的水平。\n", "\n", - "> **注意:** 這種訓練速度會慢得多,因為我們需要將梯度反向傳播通過網絡的多個層!\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 提供了更多預訓練的網路模型。其中最常用的是由 Microsoft 開發的 **ResNet** 架構,以及 Google 的 **Inception**。例如,我們來探討最簡單的 ResNet-50 模型的架構(ResNet 是一個具有不同深度的模型家族,如果你想了解真正深層的模型,可以嘗試 ResNet-152):\n" + "VGG-16 是最簡單的電腦視覺架構之一。Keras 提供更多預訓練網絡。在這些中最常用的是微軟開發的 **ResNet** 架構和谷歌的 **Inception**。例如,讓我們探索最簡單的 ResNet-50 模型架構(ResNet 是一個具有不同深度的模型家族,如果你想看看真正深的模型長什麼樣,可以嘗試 ResNet-152): \n" ] }, { @@ -1442,29 +1452,29 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "如你所見,這個模型包含了相同的熟悉構建模塊:卷積層、池化層以及最終的密集分類器。我們可以以完全相同的方式使用這個模型,就像我們之前使用 VGG-16 進行遷移學習一樣。你可以嘗試使用上述程式碼進行實驗,嘗試使用不同的 ResNet 模型作為基礎模型,並觀察準確率的變化。\n", + "如你所見,模型包含相同熟悉的構建模塊:卷積層、池化層和最終的密集分類器。我們可以以與使用 VGG-16 進行轉移學習完全相同的方式使用這個模型。你可以嘗試上面代碼的實驗,使用不同的 ResNet 模型作為基礎模型,看看準確度如何變化。\n", "\n", - "## 批量正規化\n", + "## 批次正規化\n", "\n", - "這個網路還包含另一種類型的層:**批量正規化**。批量正規化的概念是將流經神經網路的值調整到正確的範圍。通常,當所有值都在 [-1,1] 或 [0,1] 的範圍內時,神經網路的效果最好,這也是為什麼我們會相應地縮放/正規化輸入數據。然而,在深度網路的訓練過程中,可能會出現值顯著超出這個範圍的情況,這會導致訓練變得困難。批量正規化層會計算當前小批量數據的平均值和標準差,並在信號通過神經網路層之前使用這些值對其進行正規化。這顯著提高了深度網路的穩定性。\n" + "這個網絡還包含另一種類型的層:批次正規化。批次正規化的概念是將流經神經網絡的值帶到正確區間。通常神經網絡在所有值都在 [-1,1] 或 [0,1] 範圍內時表現最佳,這也是我們相應地縮放/正規化輸入數據的原因。然而,在深度網絡訓練過程中,有可能出現值顯著超出此範圍的情況,這會導致訓練出現問題。批次正規化層計算當前小批次的所有值的平均值和標準差,並使用它們在通過神經網絡層之前對信號進行正規化。這大大提高了深度網絡的穩定性。\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## 重點\n", + "## 摘要\n", "\n", - "透過遷移學習,我們能夠快速地建立一個自訂物件分類任務的分類器,並達到高準確率。然而,這個範例並不完全公平,因為原始的 VGG-16 網路已經被預先訓練來辨識貓和狗,因此我們只是重用了網路中已經存在的大部分模式。若是面對更為特殊的領域專屬物件(例如工廠生產線上的細節或不同種類的樹葉),準確率可能會較低。\n", + "使用轉移學習,我們能夠快速組合出一個分類器來完成我們的自訂物件分類任務,並達到高準確率。不過,這個範例並非完全公平,因為原本的 VGG-16 網絡是預先訓練來辨識貓和狗,因此我們只是重用網絡中已存在的多數模式。對於較為特殊的領域專用物件,例如工廠生產線上的細節或不同樹葉,你可預期準確率會較低。\n", "\n", - "你可以看到,我們現在正在解決的更複雜任務需要更高的計算能力,並且無法輕易地在 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\n**免責聲明**:\n本文件使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們力求準確,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於重要資訊,建議尋求專業人工翻譯。我們不對因使用本翻譯而引起的任何誤解或曲解承擔責任。\n\n" ] } ], @@ -1485,12 +1495,6 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" - }, - "coopTranslator": { - "original_hash": "c189abc107848f96051085cc30945129", - "translation_date": "2025-08-28T11:01:09+00:00", - "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", - "language_code": "mo" } }, "nbformat": 4, diff --git a/translations/zh-MO/lessons/5-NLP/README.md b/translations/zh-MO/lessons/5-NLP/README.md index 55d7820d89..d710064042 100644 --- a/translations/zh-MO/lessons/5-NLP/README.md +++ b/translations/zh-MO/lessons/5-NLP/README.md @@ -1,51 +1,51 @@ # 自然語言處理 -![NLP 任務的手繪摘要](../../../../translated_images/zh-MO/ai-nlp.b22dcb8ca4707cea.webp) +![自然語言處理任務摘要手繪圖](../../../../translated_images/zh-MO/ai-nlp.b22dcb8ca4707cea.webp) -在本節中,我們將專注於使用神經網絡來處理與**自然語言處理 (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)指的是從文本中提取特定實體的問題。例如,我們需要理解短語 我明天要飛到巴黎 中的 明天 指的是日期,巴黎* 是一個地點。 +* 關鍵詞提取 與命名實體識別類似,但我們需要自動提取對句子意義重要的詞,而無需針對特定實體類型進行預訓練。 +* 文本聚類 在我們想將相似的句子分組時非常有用,例如,技術支持對話中的類似請求。 +* 問答系統 指模型回答特定問題的能力。模型接收文本段落和問題作為輸入,並需要提供文本中包含問題答案的地方(或者有時生成答案文本)。 + 文本生成 是模型生成新文本的能力。可以將其視為一個分類任務,通過某些文本提示*來預測下一個字母/詞。先進的文本生成模型如GPT-3能使用稱為 [prompt programming](https://towardsdatascience.com/software-3-0-how-prompting-will-change-the-rules-of-the-game-a982fbfe1e0) 或 [prompt engineering](https://medium.com/swlh/openai-gpt-3-and-prompt-engineering-dcdc2c5fcd29) 的技術來解決其他NLP任務,例如分類。 +* 文本摘要 是一種技術,讓電腦「閱讀」長文本並用幾句話來總結。 +* 機器翻譯 可以被看作是將一種語言的文本理解與另一種語言的文本生成結合起來。 -最初,大多數 NLP 任務是通過傳統方法(如語法)解決的。例如,在機器翻譯中,解析器被用來將初始句子轉換為語法樹,然後提取高層語義結構來表示句子的含義,基於這些含義和目標語言的語法生成結果。如今,許多 NLP 任務使用神經網絡更有效地解決。 +最初,大多數NLP任務是使用傳統方法如語法規則來解決。例如,在機器翻譯中使用解析器將初始句子轉換為語法樹,然後提取高層次的語義結構來表徵句子的意義,並根據這個意義和目標語言的語法生成結果。如今,許多NLP任務使用神經網絡能更有效地解決。 -> 許多經典的 NLP 方法已在 [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org) Python 庫中實現。網上有一本很棒的 [NLTK 書](https://www.nltk.org/book/),涵蓋了如何使用 NLTK 解決不同的 NLP 任務。 +> 許多經典的NLP方法已實現在Python函式庫 [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org) 中。網上有一本很棒的 [NLTK書籍](https://www.nltk.org/book/) 介紹如何使用NLTK解決不同的NLP任務。 -在我們的課程中,我們將主要專注於使用神經網絡進行 NLP,並在需要時使用 NLTK。 +在本課程中,我們大部分時間會專注於使用神經網絡來處理NLP,並且會在需要時使用NLTK。 -我們已經學習了如何使用神經網絡處理表格數據和圖像。這些數據類型與文本的主要區別在於,文本是可變長度的序列,而圖像的輸入大小是預先確定的。雖然卷積網絡可以從輸入數據中提取模式,但文本中的模式更為複雜。例如,否定可能與主語之間隔著許多單詞(例如:*我不喜歡橙子*,與 *我不喜歡那些又大又多彩又美味的橙子*),但仍應被解釋為一種模式。因此,為了處理語言,我們需要引入新的神經網絡類型,例如*循環網絡*和*Transformer*。 +我們已經學習過用神經網絡處理表格數據和影像。這些數據類型和文本的主要區別在於,文本是可變長序列,而影像的輸入尺寸是事先已知的。雖然卷積網絡能從輸入數據中提取模式,但文本中的模式更為複雜。例如,否定詞與主語可能被多個詞語任意分開(如 我不喜歡橙子我不喜歡那些大顏色鮮豔且美味的橙子),這應該被解釋為同一種模式。因此,為了處理語言,我們需要引入新的神經網絡類型,如循環網絡變壓器。 -## 安裝庫 +## 安裝函式庫 -如果您使用本地 Python 安裝來運行本課程,您可能需要使用以下命令安裝 NLP 所需的所有庫: +如果你使用本地的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 ``` -> 您可以在 [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 在一個 Python 內核中訓練多個模型時可能無法正確釋放 GPU 記憶體。為了有效管理 GPU 記憶體使用,您可以配置 TensorFlow 僅在需要時分配 GPU 記憶體。 -* **代碼包含**:要設置 TensorFlow 僅在需要時增長 GPU 記憶體分配,請在筆記本中包含以下代碼: +在本節中,我們的一些範例將訓練相當大型的模型。 +* **使用支援GPU的電腦**:建議在支援GPU的電腦上運行筆記本,以減少處理大型模型時的等待時間。 +* **GPU 記憶體限制**:在GPU上運行可能會造成GPU記憶體不足的情況,特別是訓練大型模型時。 +* **GPU 記憶體使用量**:訓練時GPU記憶體的消耗取決於多種因素,包括小批量大小(minibatch size)。 +* 減小小批量大小:如果遇到GPU記憶體問題,可以嘗試減小程式碼中的小批量大小作為解決方案。 +* **TensorFlow GPU 記憶體釋放**:較舊版本的TensorFlow在一個Python內核中訓練多個模型時可能無法正確釋放GPU記憶體。為了有效管理GPU記憶體使用,可以設置TensorFlow僅在需要時分配GPU記憶體。 +* 代碼示範:要讓TensorFlow在需要時才增加GPU記憶體分配,在你的筆記本中加入以下代碼: ```python physical_devices = tf.config.list_physical_devices('GPU') @@ -53,7 +53,7 @@ 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) ## 本節內容 在本節中,我們將學習: @@ -63,7 +63,11 @@ if len(physical_devices)>0: * [語言建模](15-LanguageModeling/README.md) * [循環神經網絡](16-RNN/README.md) * [生成網絡](17-GenerativeNetworks/README.md) -* [Transformer](18-Transformers/README.md) +* [變壓器](18-Transformers/README.md) -**免責聲明**: -本文件使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。應以原始語言的文件作為權威來源。對於關鍵資訊,建議尋求專業人工翻譯。我們對因使用本翻譯而產生的任何誤解或錯誤解讀概不負責。 \ No newline at end of file +--- + + +**免責聲明**: +本文件使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們力求準確,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於重要資訊,建議尋求專業人工翻譯。我們不對因使用本翻譯而引起的任何誤解或曲解承擔責任。 + \ No newline at end of file diff --git a/translations/zh-TW/.co-op-translator.json b/translations/zh-TW/.co-op-translator.json index d49218d9e9..5ab7bc9e8d 100644 --- a/translations/zh-TW/.co-op-translator.json +++ b/translations/zh-TW/.co-op-translator.json @@ -17,6 +17,30 @@ "source_file": "SECURITY.md", "language_code": "zh-TW" }, + "__translation_failures__": { + "lessons/sketchnotes/LICENSE.md": { + "original_hash": "45ab63a2cd8f5faef6c9b150618837a4", + "source_file": "lessons/sketchnotes/LICENSE.md", + "language_code": "zh-TW", + "failure_date": "2026-07-08T19:24: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 + }, + "CONTRIBUTING.md": { + "original_hash": "c6fd7e781b67111a90abd166d0ce4aa0", + "source_file": "CONTRIBUTING.md", + "language_code": "zh-TW", + "failure_date": "2026-07-08T19:30:42+00:00", + "status": "failed", + "error_type": "TranslationIncompleteError", + "error_message": "Markdown translation remained incomplete for chunk 1 of 'CONTRIBUTING.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-24T22:17:50+00:00", @@ -54,8 +78,8 @@ "language_code": "zh-TW" }, "examples/README.md": { - "original_hash": "0d1babfdcbeb46525f2db3fbaaa54cd7", - "translation_date": "2025-10-03T11:28:01+00:00", + "original_hash": "7883d52c2e2a221e0b07a7b112a149b9", + "translation_date": "2026-07-08T19:20:24+00:00", "source_file": "examples/README.md", "language_code": "zh-TW" }, @@ -66,8 +90,8 @@ "language_code": "zh-TW" }, "lessons/0-course-setup/how-to-run.md": { - "original_hash": "a4717bd9103b9f6cd84d534b83534689", - "translation_date": "2026-01-15T12:04:06+00:00", + "original_hash": "7ad8c7d8604c53649b3d4d1e2f3a6fa1", + "translation_date": "2026-07-08T19:20:46+00:00", "source_file": "lessons/0-course-setup/how-to-run.md", "language_code": "zh-TW" }, @@ -191,6 +215,12 @@ "source_file": "lessons/4-ComputerVision/08-TransferLearning/TrainingTricks.md", "language_code": "zh-TW" }, + "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb": { + "original_hash": "99b816b6a4957ef4100cee4c4221dff9", + "translation_date": "2026-07-08T19:13:09+00:00", + "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", + "language_code": "zh-TW" + }, "lessons/4-ComputerVision/08-TransferLearning/lab/README.md": { "original_hash": "7765935c35fcee69b9fe2d0cfd6963e2", "translation_date": "2025-08-24T22:03:29+00:00", @@ -330,8 +360,8 @@ "language_code": "zh-TW" }, "lessons/5-NLP/README.md": { - "original_hash": "8ef02a9318257ea140ed3ed74442096d", - "translation_date": "2025-08-24T21:43:04+00:00", + "original_hash": "038df6f1a73e49f6430740da083bfd6d", + "translation_date": "2026-07-08T19:21:08+00:00", "source_file": "lessons/5-NLP/README.md", "language_code": "zh-TW" }, diff --git a/translations/zh-TW/examples/README.md b/translations/zh-TW/examples/README.md index fe7ebf00f0..3851fbf4f6 100644 --- a/translations/zh-TW/examples/README.md +++ b/translations/zh-TW/examples/README.md @@ -1,31 +1,31 @@ # 初學者友善的 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 +# 適用於 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,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. 嘗試影像分類器 - 觀察 AI 如何處理真實影像 +4. 分析文字情緒 - 探索自然語言處理 -## 💡 初學者提示 +## 💡 初學者技巧 -- **仔細閱讀程式碼註解** - 它們解釋了每行程式碼的作用 -- **嘗試實驗!** - 嘗試更改數值並觀察結果 -- **不用擔心完全理解** - 學習需要時間 -- **提出問題** - 使用 [討論板](https://github.com/microsoft/AI-For-Beginners/discussions) +- 仔細閱讀程式碼註解 - 解釋每行程式的作用 +- **多多嘗試!** - 改變數值,看看會發生什麼 +- 不必急著全部懂 - 學習需要時間 +- 勇於提問 - 利用 [討論區](https://github.com/microsoft/AI-For-Beginners/discussions) ## 🔗 下一步 完成這些範例後,探索完整課程: -- [AI 簡介](../lessons/1-Intro/README.md) +- [AI 入門](../lessons/1-Intro/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) 進行翻譯。雖然我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵資訊,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或誤釋不承擔責任。 \ No newline at end of file + +**免責聲明**: +此文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們努力追求準確性,但請注意自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應視為權威來源。對於關鍵資訊,建議採用專業人工翻譯。我們不對因使用此翻譯所產生的任何誤解或誤譯承擔責任。 + \ No newline at end of file diff --git a/translations/zh-TW/lessons/0-course-setup/how-to-run.md b/translations/zh-TW/lessons/0-course-setup/how-to-run.md index 7236eec7ac..91c5ad6985 100644 --- a/translations/zh-TW/lessons/0-course-setup/how-to-run.md +++ b/translations/zh-TW/lessons/0-course-setup/how-to-run.md @@ -1,12 +1,12 @@ # 如何執行程式碼 -本課程包含許多可執行的範例和實驗,你會想要運行這些範例。為此,你需要具備在本課程所提供的 Jupyter 筆記本中執行 Python 程式碼的能力。你有幾種選擇可以執行程式碼: +本課程包含許多可執行的範例和實驗,您可能想要執行它們。要做到這一點,您需要能夠在本課程提供的 Jupyter 筆記本中執行 Python 程式碼。您有幾種選擇來運行程式碼: -## 在你的電腦上本地執行 +## 在您的電腦上本地執行 -若要在你的電腦本地運行程式碼,需要安裝 Python。一個建議是安裝 **[miniconda](https://conda.io/en/latest/miniconda.html)** — 它是一個相當輕量的安裝,支援 `conda` 套件管理工具來管理不同的 Python **虛擬環境**。 +若要在您的電腦上本地執行程式碼,您需要安裝 Python。其中一個建議是安裝 **[miniconda](https://conda.io/en/latest/miniconda.html)** ——這是一個相當輕量的安裝,它支援使用 `conda` 套件管理器來管理不同的 Python 虛擬環境。 -安裝 miniconda 之後,複製本儲存庫並建立一個虛擬環境來使用這門課程: +安裝 miniconda 後,克隆本儲存庫並建立一個用於本課程的虛擬環境: ```bash git clone http://github.com/microsoft/ai-for-beginners @@ -17,17 +17,17 @@ conda activate ai4beg ### 使用帶有 Python 擴充功能的 Visual Studio Code -本課程在使用 [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,請前往課程目錄,並執行: +若要在本地啟動 Jupyter,請前往課程目錄並執行: ```bash jupyter notebook @@ -36,36 +36,36 @@ jupyter notebook ```bash jupyterhub ``` -然後你可以瀏覽任何 `.ipynb` 檔案,打開它們並開始工作。 +您即可導航至任一 `.ipynb` 檔案,打開並開始使用。 -### 在容器中執行 +### 在容器中運行 -另一個替代 Python 安裝的選項是直接在容器中執行程式碼。由於我們的儲存庫提供了一個特殊的 `.devcontainer` 資料夾,指示如何為本儲存庫建構容器,VS Code 提供重新在容器中打開程式碼的功能。這需要安裝 Docker,流程也會較複雜,因此建議較有經驗的使用者採用此方案。 +另一種替代 Python 安裝的方法是使用容器。由於我們的儲存庫包含一個特殊的 `.devcontainer` 資料夾,用來指示如何為此儲存庫建立容器,VS Code 提供了重新在容器中開啟程式碼的功能。這需要安裝 Docker,並且較為複雜,因此建議較有經驗的使用者使用此方法。 ## 在雲端運行 -如果你不想在本地安裝 Python,並且有雲端資源可用,另一個好選擇是直接在雲端執行程式碼。有幾種方式可以做到: +如果您不想在本地安裝 Python,且可以使用一些雲端資源,一個不錯的替代方案是將程式碼運行在雲端。有幾種方法: -* 使用 **[GitHub Codespaces](https://github.com/features/codespaces)**,這是在 GitHub 上為你建立的虛擬環境,可經由 VS Code 瀏覽器介面存取。如果你有 Codespaces 的權限,只需點擊儲存庫中的 **Code** 按鈕,啟動 codespace,馬上即可開始執行。 -* 使用 **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**。[Binder](https://mybinder.org) 提供免費的雲端運算資源,讓你可以測試 GitHub 上的程式碼。首頁有一個按鈕可直接開啟儲存庫於 Binder — 這會快速引導你到 Binder 網站,自動建構底層容器並啟動 Jupyter 網頁介面。 +* 使用 **[GitHub Codespaces](https://github.com/features/codespaces)**,這是一個由 GitHub 為您建立的虛擬環境,可以透過 VS Code 瀏覽器介面存取。如果您可以使用 Codespaces,只需在儲存庫中點擊 **Code** 按鈕,啟動 Codespace,即可快速開始。 +* 使用 **[Binder](https://mybinder.org/v2/gh/microsoft/ai-for-beginners/HEAD)**。 [Binder](https://mybinder.org) 提供免費的雲端運算資源,讓您能在 GitHub 上測試程式碼。首頁有個按鈕可以在 Binder 中開啟此儲存庫——它將快速帶您到 binder 網站,該網站會建立基礎容器並無縫啟動 Jupyter 網頁介面。 -> **注意**:為防止濫用,Binder 對部分網路資源進行封鎖,這可能導致部分從公共網路下載模型和/或資料集的程式碼無法正常運作,你可能需找尋替代方案。此外,Binder 提供的運算資源相當基礎,訓練過程會較慢,尤其是後期更複雜的課程。 +> 注意:為避免誤用,Binder 阻擋了部分網路資源的存取。這會導致部分從公共網路下載模型和/或資料集的程式碼無法正常運作。您可能需要找一些變通方法。此外,Binder 提供的運算資源相當基礎,因此訓練會很慢,尤其在較複雜的後期課程中更是如此。 -## 使用 GPU 雲端運行 +## 使用 GPU 在雲端運行 -在本課程後期,有些課程會非常受惠於 GPU 支援。例如,模型訓練否則會非常緩慢。以下是一些選項,特別是如果你透過 [Azure for Students](https://azure.microsoft.com/free/students/?WT.mc_id=academic-77998-cacaste) 或機構有雲端存取權: +本課程後期的部分課程非常需要 GPU 支援。例如模型訓練,否則將非常緩慢。您可以採用以下幾種方案,尤其是若您透過 [Azure 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。 +* 建立 [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。 -> **注意**:部分訂閱,包括 Azure for Students,預設不包含 GPU 支援。你可能需要透過技術支援申請額外的 GPU 核心。 +> 注意:某些訂閱,包括 Azure for Students,預設不提供 GPU 支援。您可能需要透過技術支援請求額外申請 GPU 核心。 -* 建立 [Azure 機器學習工作區](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),然後使用其中的 Notebook 功能。[這段影片](https://azure-for-academics.github.io/quickstart/azureml-papers/) 示範如何將儲存庫克隆到 Azure ML notebook 並開始使用。 -你也可以使用 Google Colab,該服務附帶部分免費的 GPU 支援,並上傳 Jupyter 筆記本,一筆一筆地執行。 +您也可以使用 Google Colab,它提供一些免費的 GPU 支援,且能逐一上傳與執行 Jupyter 筆記本。 --- -**免責聲明**: -本文件係使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們努力追求準確性,但請注意,自動翻譯可能包含錯誤或不精確之處。原始文件的母語版本應視為權威資料來源。對於重要資訊,建議採用專業人工翻譯。我們對因使用本翻譯所引起的任何誤解或誤譯不承擔任何責任。 +**免責聲明**: +此文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們努力追求準確性,但請注意自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應視為權威來源。對於關鍵資訊,建議採用專業人工翻譯。我們不對因使用此翻譯所產生的任何誤解或誤譯承擔責任。 \ No newline at end of file diff --git a/translations/zh-TW/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb b/translations/zh-TW/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb index fce8d9598d..c5e3addf00 100644 --- a/translations/zh-TW/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb +++ b/translations/zh-TW/lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb @@ -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", + "## 貓 vs. 狗 資料集\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 貓 vs. 狗資料集](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", - "在之前的範例中,我們使用的是 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", @@ -510,17 +520,17 @@ "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" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "讓我們也來看看 VGG-16 網路的架構:\n" + "我們來看看 VGG-16 網路的架構: \n" ] }, { @@ -599,7 +609,7 @@ "source": [ "## GPU 計算\n", "\n", - "深度神經網絡,例如 VGG-16 和其他更現代的架構,需要相當大的計算能力來運行。如果有 GPU 加速可用,使用它是合理的選擇。幸運的是,如果 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": [ - "特徵張量的維度是 7x7x512,但為了能夠進行可視化,我們需要將其重塑為 2D 形式。\n", + "特徵張量的維度是 7x7x512,但為了視覺化,我們必須將其重新塑形為 2D 形式。\n", "\n", - "現在讓我們嘗試看看這些特徵是否可以用來分類圖像。我們可以手動選取部分圖像(在我們的例子中是 50 個小批次),並預先計算它們的特徵向量。我們可以使用 Tensorflow 的 **dataset** API 來完成這項工作。`map` 函數會接收一個數據集,並應用給定的 lambda 函數來對其進行轉換。我們利用這個機制來構建新的數據集 `ds_features_train` 和 `ds_features_test`,這些數據集包含的是 VGG 提取的特徵,而不是原始圖像。\n" + "現在讓我們嘗試看看這些特徵是否能用來分類圖像。讓我們手動取一些圖像(在我們的例子中是 50 個小批次),並預先計算它們的特徵向量。我們可以使用 Tensorflow **dataset** API 來完成這件事。`map` 函數接受一個資料集並套用給定的 lambda 函式來做轉換。我們使用這個機制建構新的資料集 `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", - "> **注意**: 凍結特徵提取器的權重是必要的,因為如果不這樣做,未訓練的分類層可能會破壞卷積提取器原本的預訓練權重。\n", + "> 注意:需要凍結特徵擷取器權重,因為否則未訓練的分類層會破壞原本預訓練的卷積擷取器權重。\n", "\n", - "你會注意到,雖然我們網絡的參數總數大約是 1500 萬,但我們只訓練了 2.5 萬個參數。所有其他頂層卷積濾波器的參數都是預訓練的。這是一件好事,因為我們可以用較少的樣本微調較少的參數。\n", + "你可以注意到,雖然我們網路的參數總數約為 1500 萬,但我們只訓練了 2.5 萬參數。其他所有頂層卷積濾波器的參數都是預訓練好的。這是件好事,因為我們能以較少的範例微調較少數的參數。\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", + "> **注意:** 重要的是先凍結參數並進行數個 epoch 的訓練,以穩定分類層的權重。如果你馬上開始訓練整個端到端網路並解凍參數,錯誤很可能會破壞卷積層中的預訓練權重。\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" + "> **注意:** 這種訓練會慢很多,因為我們需要將梯度反向傳播通過網路的許多層!\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 提供了更多預訓練的網路。其中最常用的是由 Microsoft 開發的 **ResNet** 架構,以及 Google 的 **Inception**。例如,我們來探索最簡單的 ResNet-50 模型的架構(ResNet 是一個具有不同深度的模型家族,如果你想看看真正深層的模型,可以嘗試 ResNet-152):\n" + "VGG-16 是最簡單的電腦視覺架構之一。Keras 提供了更多預訓練的網路。其中最常用的是微軟開發的 **ResNet** 架構,和 Google 的 **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", + "## 批次正規化 (Batch Normalization)\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\n**免責聲明**:\n此文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們努力追求準確性,但請注意自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應視為權威來源。對於關鍵資訊,建議採用專業人工翻譯。我們不對因使用此翻譯所產生的任何誤解或誤譯承擔責任。\n\n" ] } ], @@ -1484,12 +1495,6 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" - }, - "coopTranslator": { - "original_hash": "c189abc107848f96051085cc30945129", - "translation_date": "2025-08-31T09:39:21+00:00", - "source_file": "lessons/4-ComputerVision/08-TransferLearning/TransferLearningTF.ipynb", - "language_code": "tw" } }, "nbformat": 4, diff --git a/translations/zh-TW/lessons/5-NLP/README.md b/translations/zh-TW/lessons/5-NLP/README.md index 322605cba2..b4556c6b54 100644 --- a/translations/zh-TW/lessons/5-NLP/README.md +++ b/translations/zh-TW/lessons/5-NLP/README.md @@ -1,51 +1,51 @@ # 自然語言處理 -![NLP任務摘要手繪圖](../../../../translated_images/zh-TW/ai-nlp.b22dcb8ca4707cea.webp) +![NLP 任務摘要手繪圖](../../../../translated_images/zh-TW/ai-nlp.b22dcb8ca4707cea.webp) -在本章節中,我們將專注於使用神經網絡來處理與**自然語言處理 (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)是指從文本中提取特定實體的問題。例如,我們可能需要了解在短語我明天需要飛往巴黎中,單詞明天指的是日期,巴黎*是地點。 +* 關鍵詞提取 與 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 任務,例如分類。 +* 文本摘要 是一種技術,讓電腦「閱讀」長文本並用幾句話進行摘要。 +* 機器翻譯 可以看作是對一種語言的文本理解和另一種語言的文本生成的組合。 -最初,大多數NLP任務是使用傳統方法(例如語法)來解決的。例如,在機器翻譯中,解析器被用來將初始句子轉換為語法樹,然後提取高層語義結構以表示句子的含義,基於這些含義和目標語言的語法生成結果。如今,許多NLP任務使用神經網絡更有效地解決。 +最初,大多數 NLP 任務是使用傳統方法如語法結構來解決的。例如,在機器翻譯中,解析器被用於將初始句子轉換為語法樹,然後提取更高層次的語義結構以表示句子意義,基於這個意義和目標語言的語法生成結果。如今,許多 NLP 任務更有效地使用神經網路來解決。 -> 許多經典的NLP方法已在[自然語言處理工具包 (NLTK)](https://www.nltk.org) Python庫中實現。線上有一本很棒的[NLTK書籍](https://www.nltk.org/book/),涵蓋了如何使用NLTK解決不同的NLP任務。 +> 許多經典 NLP 方法實現於 Python 庫 [Natural Language Processing Toolkit (NLTK)](https://www.nltk.org) 中。線上有一本很棒的 [NLTK 書籍](https://www.nltk.org/book/) 講解如何使用 NLTK 解決不同的 NLP 任務。 -在我們的課程中,我們將主要專注於使用神經網絡進行NLP,並在需要時使用NLTK。 +在本課程中,我們將主要專注於使用神經網路進行 NLP,並在需要時使用 NLTK。 -我們已經學習了如何使用神經網絡處理表格數據和圖像。這些數據類型與文本的主要區別在於,文本是一種可變長度的序列,而圖像的輸入大小是事先已知的。雖然卷積網絡可以從輸入數據中提取模式,但文本中的模式更為複雜。例如,否定可能與主語分隔許多詞語(例如:*我不喜歡橙子*,與*我不喜歡那些又大又多彩又美味的橙子*),但仍應被解釋為一個模式。因此,為了處理語言,我們需要引入新的神經網絡類型,例如*循環網絡*和*Transformer*。 +我們已經學過使用神經網路處理表格式資料和影像。這些資料型態與文本的主要差異在於文本是變長的序列,而影像的輸入大小事先已知。雖然卷積網路能夠從輸入資料中提取模式,但文本中的模式更複雜。例如,否定詞可能會在主詞與動詞之間與任意多詞分隔(如 我不喜歡橘子,對比 我不喜歡那些又大又彩色又美味的橘子),而這仍應該被視作一個模式。因此,處理語言需要引入新的神經網路類型,如循環網路變壓器。 -## 安裝庫 +## 安裝函式庫 -如果您使用本地Python環境運行本課程,可能需要使用以下命令安裝所有NLP所需的庫: +如果您使用本機 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 ``` -> 您可以在[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記憶體的消耗取決於多種因素,包括小批量大小。 -* **減少小批量大小**:如果遇到GPU記憶體問題,可以考慮減少代碼中的小批量大小作為解決方案。 -* **TensorFlow GPU記憶體釋放**:舊版本的TensorFlow可能無法正確釋放GPU記憶體,特別是在一個Python內核中訓練多個模型時。為了有效管理GPU記憶體使用,您可以配置TensorFlow僅在需要時分配GPU記憶體。 -* **代碼包含**:要設置TensorFlow僅在需要時增長GPU記憶體分配,請在您的筆記本中包含以下代碼: +本節中,有些範例會訓練相當大的模型。 +* **使用具 GPU 功能的電腦**:建議在具 GPU 功能的電腦上執行筆記本,以減少使用大型模型時的等待時間。 +* **GPU 記憶體限制**:在 GPU 上運行可能會遇到 GPU 記憶體不足的情況,尤其是在訓練大型模型時。 +* **GPU 記憶體消耗**:訓練過程中 GPU 記憶體的使用量取決於多種因素,包括小批量大小。 +* 最小化小批量大小:遇到 GPU 記憶體問題時,可以考慮降低程式中的小批量大小。 +* **TensorFlow GPU 記憶體釋放**:舊版本的 TensorFlow 可能無法在一個 Python 核心訓練多個模型時正確釋放 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) ``` -如果您對從經典機器學習角度學習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) -* [Transformer](18-Transformers/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) 進行翻譯。我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。應以原文文件作為權威來源。對於關鍵資訊,建議尋求專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋概不負責。 \ No newline at end of file +--- + + +**免責聲明**: +此文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們努力追求準確性,但請注意自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應視為權威來源。對於關鍵資訊,建議採用專業人工翻譯。我們不對因使用此翻譯所產生的任何誤解或誤譯承擔責任。 + \ No newline at end of file