Попередня тема закінчилась незручним фактом. Мережа зібрана, форми зійшлись, 24 774 параметри на місці — а навчальних прикладів у нас сто двадцять, по 784 пікселі кожен. Мережа з такою місткістю не мусить розуміти, що таке коло: їй значно дешевше запамʼятати сто двадцять картинок разом із відповідями. І вона це робить.
Даних більше не буде — розмітка коштує грошей, і її завжди менше, ніж хочеться. Але в зображення є властивість, якої немає в таблиці з цінами: його можна зсунути, повернути, притемнити — і предмет на ньому лишиться тим самим. Саме на цьому будується аугментація (augmentation).
Найпоширеніше пояснення аугментації звучить так: «беремо картинку, крутимо-вертимо, отримуємо більше даних». Це формулювання не просто неточне — воно шкідливе, бо з нього не випливає жодного правила, коли аугментацію застосовувати не можна. Тому вся тема тримається на іншому формулюванні:
МежаДаних скінченна кількість
Почнемо з того, щоб побачити проблему числом, а не на словах. Беремо мережу з теми 09 без жодних змін, беремо 120 навчальних зображень (по двадцять на кожен із шести класів) і навчаємо 250 кроків. Після кожних 25 кроків міряємо дві точності: на навчальній вибірці, яку мережа бачить, і на окремій перевірочній із 600 зображень, яку вона не бачила ніколи.
| крок | на навчальній | на перевірочній | розрив |
|---|---|---|---|
| 25 | 0.408 | 0.353 | 0.055 |
| 75 | 0.892 | 0.807 | 0.085 |
| 150 | 1.000 | 0.880 | 0.120 |
| 250 | 1.000 | 0.880 | 0.120 |
Читається це так. На навчальній вибірці точність доходить до 1.000 — мережа відповідає правильно на кожному зображенні, яке бачила, без винятку. На перевірочній вона зупиняється на 0.880 і далі не росте. Різниця між цими двома числами — 0.120 — і є ціна запамʼятовування: стільки мережа «знає» про конкретні картинки понад те, що вона знає про фігури взагалі.
Причина в співвідношенні. У 120 зображеннях 120 × 784 = 94 080 чисел, і більшість із них — однаковий фон; у мережі 24 774 параметри. Місткості цілком вистачає, щоб для кожного зображення завести кілька прикмет, які є тільки в ньому: пляма шуму отут, край фігури отам. На навчальній вибірці вони бездоганні, на новому зображенні не варті нічого.
ІдеяОдне зображення — багато прикладів
Візьмемо одне зображення кола й зсунемо його на три пікселі вправо. Це досі коло. Повернемо на десять градусів — досі коло. Притемнимо на чверть — досі коло. Мітка не змінилась, а числа в масиві змінились усі до єдиного.
Звідси прийом: перед тим як подати зображення в мережу, застосувати до нього випадкове перетворення. Мережа щоразу бачить ту саму фігуру трохи інакше й не може завчити конкретне розташування пікселів — бо конкретного розташування більше немає.
А тепер найважливіше уточнення теми, без якого все решта розсиплеться.
Різниця не термінологічна. Якби копії справді були даними, на тисячі копій одного зображення можна було б навчити мережу. Насправді ж усе впирається в те, скільки різних тверджень ти встиг зробити, а вони вичерпуються швидко.
Побутова аналогія. Дитині показують чашку й повертають її в руках: «дивись, це та сама чашка». Дитина не дізналась нічого нового про чашки — вона дізналась, що поворот не важить. Саме це ми й повідомляємо мережі, тільки єдиною зрозумілою їй мовою — парами «картинка, відповідь».
ЗаяваАугментація — це заява про інваріантність
Запишемо це точно. Нехай T — перетворення зображення: поворот,
дзеркало, зміна яскравості. Нехай y(x) — правильна мітка зображення
x. Додаючи T в аугментацію, ти стверджуєш:
Словами: що б перетворення не зробило з пікселями, правильна відповідь лишається
тією самою. Символ T(x) читається «перетворення, застосоване до
зображення»; y — це функція «яка тут насправді фігура». Слова «для всіх x
у цій задачі» — найважливіша частина запису: твердження мусить бути істинним не для однієї
вдалої картинки, а для кожної, яку мережа побачить.
Ця властивість зветься інваріантністю (invariance). Аугментація не робить мережу інваріантною чарами: вона показує стільки пар «до і після», що найдешевшим способом усі їх задовольнити стає справді ігнорувати перетворення.
І звідси головний наслідок. Якщо рівність y(T(x)) = y(x)
хибна, то ти показуєш мережі зображення з неправильною міткою. Не «слабко
корисний приклад», а буквально брехню: ось ромб, і написано, що це квадрат. Такі приклади
називаються шумом у мітках — і ти згенерував його власноруч, своїм же конвеєром.
Яке припущення ти щойно зробив
Одне перетворення, три різні задачі. Ліворуч — оригінал, посередині — після перетворення, праворуч — до чого це найближче. Мітка визначається не на око, а виміряним числом: для фігур і цифр — перекриттям із шаблоном класу (IoU; цифра вважається впізнаною від 0.70), для знімка — правилом «ущільнення є, якщо десь яскравість вища за 0.70».
Ось той самий список словами. Перетворення ліворуч, твердження, яке ти робиш, — праворуч. Останній стовпчик — де це твердження ламається.
| перетворення | твердження про світ | де воно хибне |
|---|---|---|
| Дзеркало по горизонталі | Клас не залежить від того, ліва це чи права версія | Текст, цифри, дорожні знаки з напрямком, «ліва / права рука», медична латеральність |
| Поворот на довільний кут | Клас не залежить від орієнтації предмета | Цифри 6 і 9, літери, наш квадрат і ромб, будь-яка задача, де «догори дриґом» — окремий клас |
| Зсув | Клас не залежить від того, де в кадрі предмет | Задачі, де важлива позиція: розмітка документа, положення дефекту на деталі |
| Масштаб і обрізка | Клас не залежить від розміру предмета в кадрі | Коли розмір і є ознакою: відрізнити монету від тарілки, дитину від дорослого |
| Яскравість і контраст | Клас не залежить від освітлення | Медичні знімки, де щільність тканини видно саме як яскравість; контроль якості за відтінком |
| Колірний тон | Клас не залежить від кольору | Стиглий чи зелений плід, колір світлофора, індикаторні смужки тестів |
| Шум і розмиття | Клас не залежить від якості знімка | Задача «оцінити різкість» або «виявити підробку за артефактами» |
Заучувати таблицю не треба — треба засвоїти спосіб: перш ніж додати перетворення в конвеєр, вимов уголос твердження, яке воно робить, і пошукай контрприклад. Знайшовся за півхвилини — перетворення або не піде туди зовсім, або піде з дуже малою силою.
ГеометріяГеометричні перетворення
Геометричні перетворення міняють, де що лежить, не чіпаючи яскравості. Це найстаріша й найдієвіша група — і водночас найнебезпечніша, бо саме форма зазвичай і визначає клас.
- Дзеркало по горизонталі (
RandomHorizontalFlip). Найдешевше перетворення взагалі: перестановка стовпців, жодної інтерполяції, жодного втраченого пікселя. Для наших фігур воно ідеальне — усі шість симетричні, і після дзеркала збіг із власним шаблоном дорівнює рівно 1.000. Для тексту й цифр — заборонене. - Дзеркало по вертикалі (
RandomVerticalFlip). Значно рідше істинне: світ має верх і низ. Небо зверху, тіні знизу, люди стоять ногами вниз. Вмикають хіба що для знімків згори — супутник, мікроскоп, вигляд з дрона. - Поворот (
RandomRotation). Найкорисніше перетворення там, де орієнтація випадкова, і найнебезпечніше там, де ні. Про це — окремий розділ 07. - Зсув (
RandomAffine(translate=…)). Здавалося б, зайвий: у темі 08 ми бачили, що згортка з пулінгом дають терпимість до зсуву. Але ключове слово там — часткова: у головному замірі блоку CNN на зсунутих предметах давала 0.607, а не одиницю. Зсув в аугментації доробляє те, чого архітектура не доробила. - Масштаб і обрізка (
RandomResizedCrop). Дуже сильне перетворення: воно одночасно міняє розмір предмета й показує його шматок. У класифікації ImageNet це головна робоча аугментація; у задачах, де предмет може виявитись цілком за межами обрізки, вона починає генерувати порожні картинки з міткою. - Перспектива (
RandomPerspective). Імітує зйомку під кутом. Істинна там, де камера справді може стояти збоку — фото документів, номерів, вивісок.
Дві деталі, про які згадують після першої поламаної моделі
Краї. Поверни квадратне зображення на 20° — і в кутах утворюється порожнеча,
якої в оригіналі не було. Чим її заповнити, вирішує аргумент fill: нулями (чорне),
середнім кольором, віддзеркаленням країв. Вибір не косметичний: якщо всі аугментовані зображення
мають чорні кути, а неаугментовані ні, мережа може навчитись розрізняти саме кути — і на
перевірочній вибірці все розсиплеться.
Інтерполяція. Поворот на не кратний 90° кут не переводить піксель у піксель: нове значення доводиться інтерполювати, і тонкі лінії від цього бліднуть. На фігурах завтовшки в три пікселі це помітно, на фото 512×512 — ні.
Конструктор аугментації
Вмикай перетворення, крути силу — і дивись на вісім випадкових варіантів того самого зображення. Під кожним написано, чи вцілила мітка: варіант класифікується найближчим шаблоном, як в інтерактиві 1.
ФотометріяФотометричні перетворення
Друга група нічого не рухає, а міняє самі значення пікселів: яскравість, контраст, насиченість,
тон, шум, розмиття. У torchvision перші чотири зібрані в один
ColorJitter, шум зазвичай додають руками, розмиття — GaussianBlur.
Ці перетворення зазвичай безпечніші за геометричні, і причина проста. У переважній більшості задач компʼютерного зору клас визначається формою, а яскравість і колір залежать від освітлення, камери й часу доби — тобто від обставин зйомки, а не від предмета. Кіт при свічці лишається котом; кіт, знятий дешевою камерою з шумом, теж кіт. Тому фотометрична аугментація потрапляє майже в кожен конвеєр і майже ніколи не шкодить.
«Майже» тут стоїть не для краси. Є цілі галузі, де яскравість і є сигнал:
- Медичні знімки. На рентгені й КТ яскравість пікселя — це фізична величина (щільність тканини, одиниці Гаунсфілда). Змінити яскравість означає змінити щільність, тобто змінити діагноз. Тут допустимі хіба що мікроскопічні зсуви, і те з обережністю.
- Задачі про колір. Стиглий помідор від зеленого відрізняється тільки
відтінком. Колір світлофора, колір індикаторної смужки тесту, сортування деталей за
маркуванням — скрізь
hueвColorJitterмає стояти в нулі. - Задачі про якість зображення. Якщо мережа оцінює різкість або шукає сліди перетиснутого JPEG, то розмиття й шум — не перешкода, а власне предмет. Аугментувати ними — стерти задачу.
torchvision.transforms.v2 це виходить само собою, якщо
Normalize стоїть останнім у Compose.СтиранняСтирання шматка
Третя група стоїть окремо, бо не імітує жодного явища зі зйомки. RandomErasing
(у літературі — cutout) просто затирає випадковий прямокутник зображення суцільним кольором або
шумом. Ніяка камера так не знімає. Навіщо тоді?
Затим, що мережа завжди шукає найкоротший шлях. Якщо всі собаки в датасеті зняті з нашийником, найдешевша ознака «собаки» — нашийник, і на собаці без нашийника мережа помилиться. Стирання ламає цю стратегію: коли вирішальна ділянка час від часу зникає, доводиться впізнавати предмет ще й по решті.
Формально це теж заява, тільки хитріша: «клас видно більш ніж з одного місця зображення». Для кота це правда — вуха, лапи, хвіст, шерсть. Для нашого кільця — ні: кільце відрізняється від кола рівно однією деталлю, дірою посередині. Затри її — і залишиться коло з міткою «кільце». Тому сила стирання добирається так, щоб прямокутник рідко накривав вирішальну частину предмета; типові значення — від 2 % до 15 % площі.
ШкодаКоли аугментація шкодить
Тепер найцікавіше. У нашому датасеті є пара класів, яка перетворює абстрактну обережність на конкретну катастрофу: квадрат і ромб. Ромб — це квадрат, повернутий на 45°. Не «схожий на», а буквально він: обидва класи задані формулами, і одна формула переходить в іншу поворотом.
Це означає, що перетворення «поворот на випадковий кут до 45°» у цьому датасеті гарантовано генерує зображення з чужою міткою. Не іноді, не в поганому випадку — кожного разу, коли кут наближається до 45°, а клас — квадрат або ромб.
Перевіримо це не на око. Візьмемо квадрат, повернемо його на кут θ і порівняємо з шаблонами всіх шести класів за мірою перекриття IoU (Intersection over Union — площа спільної частини, поділена на площу обʼєднання; ти зустрічав її в темі 02). Найближчий шаблон і є тим, чим фігура тепер виглядає. Перед порівнянням фігуру зсуваємо в центр і беремо шаблон із найближчою площею — інакше ми міряли б не форму, а положення й розмір.
Квадрат проти ромба
Крути кут повороту. Ліворуч — повернутий квадрат, праворуч — шаблони квадрата і ромба та збіг із кожним. Табло каже, чи мітка «квадрат» ще правильна.
Той самий рахунок для решти класів на 45° дає повну картину датасету:
| клас | після повороту на 45° найближчий | збіг | мітка |
|---|---|---|---|
| коло | коло | 0.987 | ціла |
| кільце | кільце | 0.978 | ціла |
| квадрат | ромб | 1.000 | зламана |
| ромб | квадрат | 0.980 | зламана |
| хрест | квадрат | 0.622 | зламана |
| трикутник | квадрат | 0.689 | зламана |
Чотири класи з шести псуються. Коло й кільце вціліли з очевидної причини — вони круглі, і поворот для них нічого не змінює (0.987 і 0.978 замість рівно одиниці — це слід пікселізації, а не зміна форми). Це, до речі, зручний спосіб дивитись на аугментацію: перетворення безпечне рівно для тих класів, які самі по собі щодо нього симетричні.
Для порівняння — дзеркало по горизонталі на тому самому датасеті дає збіг 1.000 для всіх шести класів. Усі наші фігури симетричні відносно вертикальної осі, тож твердження «клас не залежить від дзеркала» тут істинне без винятків. Одне перетворення бездоганне, інше — руйнівне, і різниця не в перетворенні, а в тому, які саме класи ти розрізняєш.
Скільки це коштує в точності
Геометрія показала, що мітка ламається. Тепер поміряймо, у що це обходиться мережі. Беремо той самий набір із 120 зображень і той самий конвеєр аугментації — дзеркало, зсув на 20 %, масштаб 0.85-1.15 — і міняємо в ньому рівно одне число: максимальний кут повороту.
| аугментація | мітка ціла | на навчальній | на перевірочній |
|---|---|---|---|
| немає | 100 % | 1.000 | 0.880 |
| поворот до 8° | 100 % | 0.942 | 0.965 |
| поворот до 20° | 84 % | 0.958 | 0.982 |
| поворот до 45° | 57 % | 0.692 | 0.688 |
Числа виявились не такими простими, як обіцяла геометрія, і це найцінніше місце теми. Слабкий поворот до 8°, де мітку зберігають усі приклади, підняв точність із 0.880 до 0.965. Поворот до 20°, де мітку зберігають лише 84 %, дав ще більше — 0.982. І тільки поворот до 45°, де брехнею стає майже половина прикладів, обвалив точність до 0.688 — нижче, ніж узагалі без аугментації.
Читається це так. Аугментація робить одночасно дві протилежні речі: додає різноманітності (корисно) і додає брехні (шкідливо). Поки брехні мало, різноманітність переважає — і мережа спокійно витримує шістнадцять відсотків неправильно підписаних прикладів. Коли брехнею стає більшість, переважає вона.
Сила перетворення
Повзунок — максимальний кут повороту в аугментації. Угорі: скільки прикладів зберігає мітку при такому куті (порахувано геометрією по всіх шести класах). Унизу: виміряна точність там, де ми її міряли.
Класичні випадки, які варто знати напамʼять
- Дзеркало для тексту й цифр. Віддзеркалена «5» не є жодною цифрою, а віддзеркалена «b» — це «d». Розпізнавання тексту дзеркалом не аугментують ніколи.
- Поворот на 180°, який плутає 6 і 9. Найвідоміший приклад у машинному навчанні. Для рукописних цифр максимальний безпечний кут — близько 10-15°, стільки, скільки людина природно нахиляє папір.
- Медична латеральність. Дзеркало на рентгені міняє місцями ліву й праву легеню. Якщо в задачі є висновок «ущільнення в правій легені», дзеркало генерує неправильні висновки — при тому що зображення виглядає бездоганно правдоподібно.
- Обрізка, що зрізає предмет.
RandomResizedCropзіscale=(0.08, 1.0)— типове значення для ImageNet, де предмет великий. На датасеті дрібних дефектів така обрізка регулярно дає порожній фон із міткою «дефект».
ВиграшСкільки це дає
Тепер найпрактичніше питання: наскільки взагалі варта заходу правильно підібрана аугментація. Дослід простий і чесний. Та сама мережа, той самий бюджет навчання — 250 кроків, — та сама перевірочна вибірка з 600 зображень. Міняється дві речі: розмір навчальної вибірки й наявність аугментації.
| навчальних | без аугментації | з аугментацією | виграш |
|---|---|---|---|
| 120 | 0.880 | 0.965 | +0.085 |
| 360 | 0.972 | 0.985 | +0.013 |
| 1200 | 0.990 | 0.970 | -0.020 |
Три числа й один чіткий висновок. На 120 прикладах аугментація дає +0.085 — це велика різниця, майже десята частка точності. На 360 лишається +0.013. На 1200 виграш не просто зникає, а стає відʼємним: -0.020.
Останнє число варто пояснити, бо на перший погляд воно суперечить усьому попередньому. Аугментований набір важче вивчити: мережа щоразу бачить нову картинку й за ті самі 250 кроків встигає менше — на навчальній вибірці 0.960 проти 1.000 без аугментації. Коли даних мало, ця ціна окупається з надлишком, бо альтернатива — завчити сто двадцять картинок напамʼять. Коли даних досить, окупати вже нема чого: мережа й так бачить достатньо різних фігур, а сповільнення нікуди не зникає.
Розрив між навчальною й перевірочною
Дві пари кривих для 120 навчальних зображень: суцільна — точність на навчальній вибірці, пунктирна — на перевірочній. Рожеві без аугментації, бірюзові з нею. Повзунок веде по кроках навчання.
Скільки даних, стільки й користі
Повзунок — розмір навчальної вибірки з трьох виміряних. Стовпчики: точність без аугментації й з нею; поруч — виграш і те, як він тане.
Звідси практичне правило, яке варто запамʼятати краще за список перетворень. Аугментація найцінніша там, де даних мало. Коли розмічених прикладів десятки чи сотні — це один із найдешевших способів витягти з них більше. Коли їх сотні тисяч, аугментація перетворюється на дрібне полірування, а часом і на гальмо: кожне перетворення коштує процесорного часу на кожному кроці навчання.
МежаТільки на навчальній вибірці
Тепер помилка, яку роблять частіше за всі інші разом узяті: аугментацію застосовують до перевірочної вибірки. Зазвичай випадково — тому що конвеєр перетворень описали один раз і підклали і в навчальний, і в перевірочний завантажувач.
Чому це руйнівно, найкраще видно, якщо згадати, навіщо взагалі потрібна перевірочна вибірка. Вона відповідає на одне питання: наскільки добре модель працюватиме на даних, які їй трапляться насправді. Аугментувавши її, ти міняєш питання на інше — «наскільки добре модель працює на випадково спотворених даних» — і робиш це мовчки.
Але є наслідок гірший за зміну питання. Аугментація випадкова, тож число, яке ти отримуєш, перестає бути числом і стає випадковою величиною.
Дослід поставимо так. Візьмемо дві моделі, які на чистій перевірочній вибірці показують майже однакову якість: А — навчена на 1200 прикладах без аугментації (0.990), Б — навчена на 360 прикладах із нею (0.985). Різниця між ними 0.005, і вона повторюється від запуску до запуску. Тепер поміряємо обидві вісім разів на аугментованій перевірочній вибірці, міняючи лише зерно.
Що стається, коли аугментувати перевірку
Модель А навчена на 1200 прикладах без аугментації, модель Б — на 360 з нею. Перемикач міняє спосіб перевірки: на чистій вибірці кожна дає одне число, на аугментованій — хмару з восьми прогонів із різними зернами.
Результат вийшов різкіший, ніж очікувалось. По-перше, число справді плаває: у моделі А воно гуляє в межах 0.085 від самого лише зерна, у моделі Б — 0.036. Одна модель, одна вибірка, різні відповіді.
По-друге — і це важливіше — аугментована перевірка не шумить нейтрально, вона міняє відповідь. На чистій вибірці кращою була модель А: 0.990 проти 0.985. На аугментованій виграє Б — у всіх вісьмох прогонах без винятку, і з відривом 0.134 замість 0.005. Моделі ті самі, дані ті самі; змінився лише спосіб перевірки — і відповідь на питання «яка модель краща» перевернулась.
Причина проста: модель Б навчали саме з цим перетворенням, тож вона до нього звикла, а модель А бачить його вперше. Аугментувавши перевірку, ти став міряти не якість моделі, а її знайомство з твоїм конвеєром перетворень.
TTAАугментація на прогнозі — це інше
Сказане вище не означає, що на етапі прогнозу перетворення заборонені взагалі. Існує окремий прийом, який називається TTA (test-time augmentation, аугментація під час перевірки), і він робить принципово інше.
Ідея: спитати мережу не про одне зображення, а про кілька його варіантів — оригінал, дзеркало, злегка зсунуту копію — і усереднити прогнози. Різниця з помилкою з розділу 09 в одному слові: усереднення. Там випадковий варіант заміняв оригінал, і число стрибало; тут усі варіанти враховуються разом, а результат детермінований, поки набір варіантів фіксований.
Але працює це не завжди, і наш дослід показує, коли саме. Ми взяли ті самі дві моделі з розділу 09 і дали кожній TTA з пʼяти варіантів — оригінал плюс чотири аугментовані копії:
| модель | звичайно | з TTA | різниця |
|---|---|---|---|
| А · 1200 без аугментації | 0.990 | 0.958 | -0.032 |
| Б · 360 з аугментацією | 0.985 | 0.990 | +0.005 |
Читається однозначно. Моделі А, яка під час навчання цих перетворень не бачила, TTA зашкодив: 0.990 впало до 0.958. Модель Б, навчена саме з ними, дістала невеликий, але справжній виграш: 0.985 → 0.990.
Один і той самий TTA двом моделям
Ліворуч — звичайний прогін на чистому зображенні, праворуч — середнє по пʼятьох варіантах. Набір варіантів однаковий для обох моделей; різне в них лише те, що вони бачили під час навчання.
Це не парадокс, а той самий принцип із іншого боку. TTA питає мережу про кілька перетворених копій і вірить середньому. Якщо мережа цих перетворень не терпить, кожна копія додає в середнє впевнену помилку — і середнє виходить гіршим за один чистий прогноз.
Ціна в обох випадках однакова: пʼять прогонів мережі замість одного на кожне зображення. У змаганнях, де важлива десята частка відсотка, це вигідно; у сервісі, який відповідає за 50 мілісекунд, — рідко.
КодЯк це виглядає в коді
У torchvision перетворення описуються списком, який застосовується до кожного
зображення на льоту — щоразу з новими випадковими параметрами. Сучасний варіант живе в модулі
transforms.v2.
from torchvision.transforms import v2
train_transform = v2.Compose([
v2.RandomHorizontalFlip(p=0.5), # геометрія
v2.RandomAffine(degrees=8, translate=(0.2, 0.2),
scale=(0.85, 1.15)),
v2.ColorJitter(brightness=0.2, contrast=0.2), # фотометрія
v2.Normalize(mean=[0.5], std=[0.5]), # нормалізація
v2.RandomErasing(p=0.25, scale=(0.02, 0.15)), # стирання — після неї
])
test_transform = v2.Compose([
v2.Normalize(mean=[0.5], std=[0.5]), # і більше нічого
])
Порядок у цьому списку не довільний, і кожен рядок стоїть саме там, де стоїть:
- Геометрія — першою. Вона працює з розташуванням пікселів, і чим менше до неї встигли змінити значення, тим передбачуваніший результат інтерполяції.
- Фотометрія — після геометрії, але до нормалізації. Причина в розділі 05:
після
Normalizeчисла вже не яскравість. - Нормалізація — передостання.
- Стирання — останнє.
RandomErasingуtorchvisionзатирає ділянку нулем, а нуль після нормалізації означає «середня яскравість», що якраз і потрібно. Постав його передNormalize— і затерта пляма стане чорною, тобто помітною ознакою.
Другий важливий вибір — на льоту чи заздалегідь. На льоту (як вище) перетворення робиться під час навчання, і кожна епоха бачить нові варіанти: різноманітність нескінченна, але процесорний час витрачається на кожному кроці. Заздалегідь означає один раз згенерований і збережений набір: швидше, зате варіантів скінченна кількість, і мережа з часом запамʼятає вже їх. За замовчуванням роблять на льоту.
albumentations: у ній більше перетворень, вона швидша й уміє синхронно перетворювати
зображення разом із масками та рамками. У середовищі цього курсу вона не працює:
встановлена версія тягне за собою scikit-image, зібраний під старий numpy, і будь-який
імпорт падає з ValueError: numpy.dtype size changed. Це типова, а не рідкісна ситуація:
пакет із скомпільованими розширеннями звʼязаний із версією numpy, під яку його збирали. Тому
перевіряй сумісність до того, як побудуєш на бібліотеці половину проєкту — одним
рядком import у чистому середовищі. Нам вистачає
torchvision.transforms.v2, і всі числа теми отримані на ньому.v2 беруть випадковість із
генератора PyTorch, тому torch.manual_seed(0) на початку програми робить усю аугментацію
повторюваною: другий запуск дає ті самі картинки й ті самі числа. Без зафіксованого зерна твої
результати не збіжаться ні з лекцією, ні з твоїм же вчорашнім прогоном.ПідсумокЩо винести з теми
- Аугментація — це не «більше картинок», а твердження
y(T(x)) = y(x). Кожне перетворення в конвеєрі — окрема заява про те, що в цій задачі не має значення. - Хибна заява — це шум у мітках, який ти зробив сам. У нашому датасеті поворот на 45° перетворює квадрат на ромб зі збігом 1.000, а мітка «квадрат» ламається вже на 16°.
- Геометрія небезпечніша за фотометрію, бо клас зазвичай визначається формою, а не освітленням. Виняток — задачі, де яскравість і є сигналом: медицина, колір, якість знімка.
- Виграш найбільший там, де даних мало. У нашому замірі на 120 зображеннях аугментація дала +0.085, на 1200 — -0.020, тобто вже програш.
- Перевірочну вибірку не аугментують ніколи. Інакше метрика стає випадковою величиною, і порівнювати моделі стає нічим — у нашому замірі різниця між моделями роздулася з 0.005 до 0.134 на порожньому місці. TTA — це інше: там прогнози усереднюються, але й він допомагає лише моделі, навченій із тими самими перетвореннями.
- Сила добирається замірами, а не зі стелі. Занадто сильне перетворення гірше за жодне: поворот до 45° дав 0.688 проти 0.880 без аугментації. Але й геометрія сама по собі не вирішує: найкращим виявився кут, при якому 16 % міток уже зіпсовані.
І місток далі. Дані ми підготували: тепер мережа бачить кожне зображення щоразу трохи інакше й не може його завчити. Але подивись іще раз на криві з інтерактиву 5 — навіть із аугментацією навчання виглядає нерівно, точність стрибає, і незрозуміло, коли зупинятись. Це вже не про дані, а про сам режим навчання: яку швидкість навчання брати, чи ставити батчнорм, коли вмикати дропаут, як зрозуміти, що далі вчити немає сенсу. Про це — наступна тема.