Convolutional Neural Networks in TensorFlow

Машинне навчання для інженерів із систем керування

Convolutional Neural Networks in TensorFlow

Тиждень 1

16.04.2023

На днях почав другий курс зі Спеціалізації “DeepLearning.AI TensorFlow Developer” а саме “Convolutional Neural Networks in TensorFlow” https://www.coursera.org/learn/convolutional-neural-networks-tensorflow.

На лекціях першого тижня навчання було детальне розбирання готового прикладу з першого курсу про розпізнавання зображень. Однак тепер замість коней і людей розглядався приклад “коти проти собак”. Використовували набори даних зображень (датасети) з Kaggle. Порозбирали код детальніше, і подивилися як можна покращити розпізнавання на перевірочних моделях обрізаючи картинку до розмірів з шуканим об’єктом. Відверто кажучи, у мене на лабі ніяк не покращилося, а процент розпізнавання був просто жахливий. Але тут вже сказали прямим текстом, що модель явно перенавчена, так що буду очікувати позитивних результатів в майбутньому (бо якщо їх не буде, то це радше буде демотивуюче навчання :) ). Розглянули на графіку той момент коли модель почала перенавчатися, спостерігаючи за поведінкою точності розпізнавання на перевірочних моделях.

Практичне тестове завдання було вже цікавішим ніж на першому курсі циклу. Треба було трохи подумати над реалізацією оперуванням файлами, а саме копіюванням з одних папок в інші з вказаним відсотком пропорцій, перевіркою ненульової довжини і рандомізатором. Підказки були, але приклади такі не давали. Тут треба було трохи порозбиратися в Python, як завжди це робити швидше з Chatgpt. Ні, я не просив його зробити готову програму, а тільки допомоги в готових конструкціях та їх роз’ясненнях (круто, на скільки це зараз швидше робиться!) Модельку вже тренували на більших датасетах, а саме >20000 зображень котів та собак. 15 епох навчання тривало в мене більше 20 хв. Так що намагайтеся з першого разу робити все як треба :) , хоч у мене все взлетіло з першої спроби, друга б мене вже трохи напрягла. А по факту, перенавчання вже почалося після 3-ї епохи з 15. Кажуть далі буде все ок. Тому рухаюся далі.

Тиждень 2

22.04.2023

На другому тижні навчання курсу “Convolutional Neural Networks in TensorFlow” вивчали вбудовані методи бібліотеки keras із TensorFlow з групи обробки зображень preprocessing.image. Основна ідея поляагає в тому, щоб навчити модель на більшому наборі даних не збільшуючи при цьому набір існуючих зображень. Тобто у вас є фотки, наприклад з котами та собаками. Але вони в різних позах та орієнтаціях. Виходить що якщо їх трохи нахилити, змістити, відобразити відносно горизонтальної осі та збільшити, то це зрештою є додаткові набори даних, які варто подати при навчанні. На лабах саме цим і займалися, а на заліковій практичній по факту доповнили попередню роботу кількома параметрами. Поки нічого особливого не було. Але модельки чим далі, тим довше вчаться (моя вчилася по 3.5 хв на епоху, це десь вже близько до години). Страшно уявити що буде з цим далі.

Черговий раз почав задумуватися над словосполученнями “епоха навчання”, “розмір бетча” і т.п. Тут це все типу не обов’язково знати (поки що), але щось трохи вже хочеться заглянути під капот і зрозуміти що там твориться. Якщо в цьому чи інших курсах спеціалізації цього не буде, нічого страшного, все одно в планах пройти фундаментальний. Але мені здається що воно тут має бути.

Ну і на останок. Випадково завантажив програму з попереднього першого завдання замість другого і вибив 79 зі 100. Це не залік але приблизно показує на скільки ця лаба відрізняється від попередньої.

Тиждень 3

24.04.2023

Завершив третій тиждень навчання по “Convolutional Neural Networks in TensorFlow”. Тема була Transfer learning, це коли ти береш вже навчену модель на дуже і дуже великих наборах даних і донавчаєш її на своїх наборах. Як вже прийнято в даному курсі, під капот технології практично не заглядували. Був один лінк на лекцію Andrew Ng, але то було більше про пояснення прорідження нейронок “dropouts”, і черговий раз зловив себе на думці на скільки даний курс поверховий порівняно з тим, що пропонує Ендрю (в даному контексті це добра новина, бо саме такий я і шукав).

Так от, ідея в тому що вже є навчена модель і вона має дофігіще вже навчених слоїв. Ти викидуєш останні, добавляєш туди свої, щоб: по перше зробити кількість виходів (класів) відповідно до твоїх потреб класифікації (у наших прикладах це один порівняно з 1000 класами); по друге, - донавчити модель на своїй виборці. Таким чином, модель вже добре розпізнає характерні ознаки на зображеннях, а останній слой вже мепить ці ознаки для конкретного класу (це моя така хлопстка інтерпретація). В Тензорфлоу це вже все доступне на рівні готових методів, якими ти просто користуєшся.

Другу фічу, яку ми розглянули - це механізм dropouts (типу прорідження). Ти виставляєш відсоток вузлів, які будуть тупо видалятися з навченої нейронки на кожному шарі (тобто ваги до них стануть нульовими). Не знаю хто це придумав, але цей метод дієво (як кажуть) працює з точки зору зменшення ефекту перенавчання.

Лаба була більше на подивитися, позапускати і подумати. Подумати було про що, бо по розмові з ChatGPT я вияснив що не до кінця зрозумів механізм роботи згорткових шарів (і зараз до кінця не розумію). Вони також навчаються, хоч це і не нейронка. Як я вже казав згорточні шари використовують фільтри, для підсилення характерних візуальних ознак (лінії переходів, тощо) з подальшим зменшенням зображень (якщо на цих етапах їх так можна ще називати). Те що я не вловив перед цим - це те, що по факту певні фільтри підсилюються таким чином, а певні послаблюються. Також мене здивувало те, що ми завантажуємо готову навчену модель, в якій скидаємо усі навчені ваги, а потім окремо завантажуємо ваги, які чіпляємо до цієї моделі. Це типу можна брати навчені ваги від різних “постачальників” використавши ту саму конфігурації моделі. Завантажена модель Inception така глибока, що її перегляд на екрані у вигляді текстового друку характеристики шарів потребує з десяток натискання PageDown. Вчилася вона на зображеннях ImageNet.

Тестове завдання було адаптувати програму для донавчання моделі для розпізнавання коней та людей. У мене модель навчилася за 2 епохи! Щось у мене є велика підозра, що донавчання потрібно виключно для адаптації під один клас. Відверто кажучи полінувався перевіряти (розпізнавання зображень мене не цікавить, мене взагалі цікавить 4-й курс в даній спеціалізації), але думаю шо оригінальна модель справляється з даним розпізнаванням не гірше ніж донавчена, хоча може там таких класів і не має. Темою наступного тижня є класифікація з кількома класами.

Підписуйтеся на мій телеграм канал, кому цікаво https://t.me/pupenasan

Тиждень 4

07.05.2023

Завершив четвертий тиждень і відповідно курс навчання по “Convolutional Neural Networks in TensorFlow”. Відверто кажучи цікавість до курсу у мене трохи падає, але треба добити ще два курси, бо саме четвертий курс циклу мені потрібен. Отже, цього тижня повернулися до множинної класифікації. Із цікавого черговий раз виділив для себе, що для створення великої кількості зображень повсякмісно використовують комп’ютерну графіку. Тобто підхід що в машинному навчанні моделі спочатку навчають за моделями, а потім вже довчають на даних з фізичних об’єктів є дуже популярним. Перший раз я це почув у колег з Агностікс, коли брав у них інтервю в Довкола автоматики. У якості лабораторних експериментів використовували розпізнавання по рукам “камень-ножиці-папір”. Ну і якби я нічого нового не помітив. враховуючи що множинна класифікація була на першому курсі, тут просто деталізували особливості використання методів в тензор флоу. Враховуючи що нічого нового не було, тести були узагальнюючі по двом курсам. Типу, а чи не забули ви основні тези? Тести досить легкі, але вони реально контрольні по найважливішим поняттям.

З практичною задачкою на оцінювання прийшлося трохи попотіти. По-перше, на прикладах і лабах завжди використовувався метод генерування даних за фотками, які лежать в різних папках з назвами класів: ти підсовуєш папки і він сам будує залежності між класами та даними (які також генерує). Тут же дані надавалися в форматі CSV, і ти повинен був файли перетворити в потрібний вигляд масивів бібліотеки np. Така собі задачка на пайтон (якщо буду адаптувати задачі під Node-RED, буде цікава підзадачка). По-друге, в прикладі чекала ще одна “підстава”, в якій треба було вибрати функцію втрат, яку ми раніше не вибирали. Це дуже підставна підстава, бо ніхто в курсі не розповідав як вибирати ту кляту функцію втрат, і взагалі ніхто не казав, що навіть пайтон помилки буде видавати. Він прямо кричав, що ти намагаєшся сумістити масиви різних розмірностей. Спочатку я пішов шляхом використання перетворення масиву у “one-hot” форматі (я потім дізнався що так це називається), бо так було в прикладі методу flow. Хоч все запрацювало, але проміжні результати не співпадали з моїми. Тоді я вирішив почитати форуми по курсу, і зрозумів що треба використовувати іншу функцію. Як завжди, ChatGpt тут значно допоміг. Без нього я б мабуть завис на задачці на кілька днів. Хоч по CSV думаю я б справився досить швидко, але щодо функції втрат - навіть не знаю скільки сил і часу би потратив.

По переду ще два курси. Перший - по використанню ML в задачах аналізу текстів, другий - по аналізу часових рядів. Часу правда геть немає, але буду якось виділяти. https://www.coursera.org/account/accomplishments/verify/QZLC2C3CKG3L?utm_source=ln&utm_medium=certificate&utm_content=cert_image&utm_campaign=sharing_cta&utm_product=course