From 28b0148a994f5789b13e1efe3f5cd9bb459ca2ac Mon Sep 17 00:00:00 2001 From: "localizeflow[bot]" Date: Wed, 8 Jul 2026 17:39:13 +0000 Subject: [PATCH] chore(i18n): sync translations with latest source changes (chunk 1/1, 18 changes) --- translations/bg/.co-op-translator.json | 37 ++++- translations/bg/CONTRIBUTING.md | 29 ++++ translations/bg/examples/README.md | 60 ++++---- .../bg/lessons/0-course-setup/how-to-run.md | 36 ++--- .../TransferLearningTF.ipynb | 133 +++++++++-------- translations/bg/lessons/5-NLP/README.md | 68 +++++---- translations/ro/.co-op-translator.json | 37 ++++- translations/ro/CONTRIBUTING.md | 29 ++++ translations/ro/examples/README.md | 52 +++---- .../ro/lessons/0-course-setup/how-to-run.md | 48 +++--- .../TransferLearningTF.ipynb | 131 +++++++++-------- translations/ro/lessons/5-NLP/README.md | 66 +++++---- translations/sr/.co-op-translator.json | 37 ++++- translations/sr/CONTRIBUTING.md | 29 ++++ translations/sr/examples/README.md | 74 +++++----- .../sr/lessons/0-course-setup/how-to-run.md | 44 +++--- .../TransferLearningTF.ipynb | 137 +++++++++--------- translations/sr/lessons/5-NLP/README.md | 78 +++++----- 18 files changed, 661 insertions(+), 464 deletions(-) create mode 100644 translations/bg/CONTRIBUTING.md create mode 100644 translations/ro/CONTRIBUTING.md create mode 100644 translations/sr/CONTRIBUTING.md diff --git a/translations/bg/.co-op-translator.json b/translations/bg/.co-op-translator.json index c00f496d..01f79b34 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 00000000..4b63fbec --- /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 db5ec1a3..d6aa4c04 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 8b230f89..159c50d5 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 b82795ca..9b269885 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 9231fdce..eb9efa32 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/ro/.co-op-translator.json b/translations/ro/.co-op-translator.json index 769e67d6..70f3bd2b 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 00000000..145393a2 --- /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 517bc9a1..ce40e3d7 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 b5804216..cb5cdd11 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 f8d4c8a8..2ba8602f 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 6295bf41..c55b45e9 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/sr/.co-op-translator.json b/translations/sr/.co-op-translator.json index d03e7d64..a03ab18c 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 00000000..5a12e377 --- /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 0fc1faad..d49d7ee8 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 7ebdf7c2..3c203277 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 b9f4a864..7d1957fc 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 a2e8fb66..f6d066a1 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