CNN архітектури для регресії?


32

Я працював над проблемою регресії, де вводом є зображення, а мітка - це постійне значення між 80 і 350. Зображення містять деякі хімічні речовини після реакції. Колір, який виявляється, вказує на концентрацію іншого хімічного речовини, що залишився, і ось що виводить модель - концентрацію цієї хімічної речовини. Зображення можна обертати, перевертати, дзеркально відображати, а очікуваний вихід повинен бути однаковим. Такий аналіз проводиться в реальних лабораторіях (дуже спеціалізовані машини виводять концентрацію хімічних речовин за допомогою кольорового аналізу так само, як я навчаю цю модель робити).

Поки що я експериментував лише з моделями, орієнтованими приблизно на VGG (кілька послідовностей блоків conv-conv-conv-pool). Перш ніж експериментувати з більш новими архітектурами (Inception, ResNets тощо), я думав, що я би дослідив, чи є інші архітектури, які частіше використовуються для регресії з використанням зображень.

Набір даних виглядає приблизно так:

введіть тут опис зображення

Набір даних містить близько 5000 зразків 250х250, які я змінив до 64x64, тому навчання легше. Як тільки я знайду перспективну архітектуру, я експериментую із зображеннями більшої роздільної здатності.

Поки що у моїх найкращих моделей середня помилка в квадраті як для навчальних, так і для валідаційних програм - приблизно 0,3, що далеко не прийнятно в моєму випадку використання.

Моя найкраща модель поки що виглядає так:

// pseudo code
x = conv2d(x, filters=32, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=32, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=32, kernel=[3,3])->batch_norm()->relu()
x = maxpool(x, size=[2,2], stride=[2,2])

x = conv2d(x, filters=64, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=64, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=64, kernel=[3,3])->batch_norm()->relu()
x = maxpool(x, size=[2,2], stride=[2,2])

x = conv2d(x, filters=128, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=128, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=128, kernel=[3,3])->batch_norm()->relu()
x = maxpool(x, size=[2,2], stride=[2,2])

x = dropout()->conv2d(x, filters=128, kernel=[1, 1])->batch_norm()->relu()
x = dropout()->conv2d(x, filters=32, kernel=[1, 1])->batch_norm()->relu()

y = dense(x, units=1)

// loss = mean_squared_error(y, labels)

Питання

Яка підходяща архітектура для регресійного виведення з зображення?

Редагувати

Я перефразував своє пояснення і видалив згадки про точність.

Редагуйте 2

Я реструктуризував своє запитання, так що, сподіваюся, зрозуміло, що я хочу


4
Точність - це не міра, яку можна безпосередньо застосувати до проблем регресії. Що ти маєш на увазі, коли ти кажеш, що точність становить 30%? Точність дійсно стосується лише класифікаційних завдань, а не регресії.
Ядерна Ванга

1
Що ви маєте на увазі під "прогнозує правильно 30% часу" ? Ви справді робите регресію?
Firebug

1
Чому ви називаєте цю проблему регресом? Ви не намагаєтеся класифікувати їх на етикетках? чи є етикетки кардинальними?
Аксакал

2
Я не хочу точно такого ж, як vgg. Я роблю щось схоже на vgg, що означає серію переходів з поданням максимуму, після чого повністю пов'язане. Здається, загальний підхід до роботи із зображеннями. Але знову ж таки, в цьому і полягає вся суть мого початкового запитання. Схоже, що всі ці коментарі, хоча і проникливі для мене, в першу чергу повністю пропускають точку з того, про що я прошу.
rodrigo-silveira

1
y[80,350]θy

Відповіді:


42

Перш за все загальна пропозиція: проведіть пошук літератури, перш ніж починати експерименти з теми, з якою ви не знайомі. Ви заощадите багато часу.

У цьому випадку, дивлячись на існуючі папери, ви, можливо, це помітили

  1. CNN використовувались неодноразово для регресії: це класика, але вона стара (так, у DL існує 3 роки). Більш сучасний папір не використовував би AlexNet для цього завдання. Це нещодавніше, але це набагато складніша проблема (3D обертання), і я все одно не знайомий з нею.
  2. Регресія з CNN не є тривіальною проблемою. Подивившись знову на перший документ, ви побачите, що у них є проблема, коли вони можуть в основному генерувати нескінченні дані. Їх мета - передбачити кут повороту, необхідний для випрямлення 2D-зображень. Це означає, що я в основному можу взяти свій тренувальний набір і збільшити його, обертаючи кожне зображення на довільні кути, і я отримаю дійсний, більший набір тренувань. Таким чином, проблема здається досить простою, наскільки йдеться про проблеми глибокого навчання. До речі, зверніть увагу на інші прийоми щодо збільшення даних, якими вони користуються:

    Ми використовуємо переклади (до 5% від ширини зображення), регулювання яскравості в діапазоні [−0,2, 0,2], регулювання гамми з γ ∈ [−0,5, 0,1] та гауссовий піксельний шум із стандартним відхиленням у діапазоні [0 , 0,02].

    k

    yxα=atan2(y,x)>11%максимально можливої ​​помилки. Вони зробили трохи краще, використовуючи дві мережі послідовно: перша виконала класифікацію (спрогнозуйте, чи буде кут у або класу), тоді зображення, повернене на величину, передбачену першою мережею, подається в іншу нейронну мережу (для регресії цього разу), що передбачає остаточне додаткове обертання в діапазон.[180°,90°],[90°,0°],[0°,90°][90°,180°][45°,45°]

    У набагато простішій проблемі (з поворотом MNIST) ви можете отримати щось краще , але все ж ви не опускаєтесь нижче помилки RMSE, яка становить від максимально можливої ​​помилки.2.6%

Отже, чого ми можемо навчитися з цього? Перш за все, що 5000 зображень - це невеликий набір даних для вашого завдання. У першому документі було використано мережу, яку попередньо досліджували на зображеннях, подібних до тих, для яких вони хотіли вивчити завдання регресії: не тільки вам потрібно навчитися іншим завданням, ніж те, для якого була розроблена архітектура (класифікація), але ваш навчальний набір не відповідає Не дивитись ні на що, як набір навчальних програм, на яких зазвичай навчаються ці мережі (CIFAR-10/100 або ImageNet). Тож ви, мабуть, не отримаєте жодної вигоди від трансферного навчання. Приклад MATLAB мав 5000 зображень, але вони були чорно-білими і семантично всі дуже схожі (ну, це може бути і ваш випадок).

Тоді, наскільки реалістично це краще, ніж 0,3? Насамперед ми повинні зрозуміти, що ви розумієте під середньою втратою 0,3. Ви маєте на увазі, що помилка RMSE становить 0,3,

1Ni=1N(h(xi)yi)2

де - розмір вашого навчального набору (таким чином, ), - вихід вашого CNN для зображення а - відповідна концентрація хімічної речовини? Оскільки , то припускаючи, що ви прогнози свого CNN між 80 і 350 (або ви просто використовуєте logit, щоб вони вписалися в цей інтервал), ви отримуєте помилку менше . Серйозно, чого ви очікуєте? мені це зовсім не здається великою помилкою.NN<5000h(xi)xiyiyi[80,350]0.12%

Крім того, просто спробуйте обчислити кількість параметрів у вашій мережі: я поспішаю, і я можу робити нерозумні помилки, тому обов'язково двічі перевіряйте мої обчислення якоюсь summaryфункцією з будь-якої структури, яку ви використовуєте. Однак, приблизно, я б сказав, що у вас є

9×(3×32+2×32×32+32×64+2×64×64+64×128+2×128×128)+128×128+128×32+32×32×32=533344

(зауважте, я пропустив параметри шарів пакетної норми, але вони лише 4 параметри для шару, щоб вони не мали значення). У вас є півмільйона параметрів і 5000 прикладів ... чого б ви очікували? Звичайно, кількість параметрів не є хорошим показником для ємності нейронної мережі (це не ідентифікуюча модель), але все ж ... Я не думаю, що ви можете зробити набагато краще, ніж це, але ви можете спробувати кілька речей:

  • нормалізувати всі входи (наприклад, змінити масштаб інтенсивності RGB кожного пікселя між -1 і 1 або використовувати стандартизацію) та всі виходи. Це особливо допоможе, якщо у вас є проблеми конвергенції.
  • перейдіть до рівня сірого: це призведе до зменшення вхідних каналів з 3 до 1. Усі ваші зображення здаються (на моє дуже нетреноване око) такими, що мають схожі кольори. Ви впевнені, що це колір, який потрібно передбачити , а не існування більш темних або світлих областей? Можливо, ви впевнені (я не експерт): у цьому випадку пропустіть цю пропозицію.y
  • Дані доповнення: так як ви сказали , що перегортати, обертання на довільний кут або віддзеркалення ваші зображення повинні привести до однієї і тієї ж продукції, ви можете збільшити розмір набору даних багато . Зауважте, що з більшим набором даних помилка на навчальному наборі збільшиться: те, що ми шукаємо тут, - це менший розрив між втратою навчального набору та втратою тестового набору. Крім того, якщо втрата навчального набору сильно зростає, це може бути хорошою новиною: це може означати, що ви можете тренувати більш глибоку мережу на цьому великому навчальному наборі без ризику перенастроїти. Спробуйте додати більше шарів і подивіться, чи тепер ви отримаєте менший навчальний набір і втрату тестового набору. Нарешті, ви можете спробувати також інші трюки щодо збільшення даних, які я цитував вище, якщо вони мають сенс у контексті вашої заявки.
  • використовувати класифікації щось-регресійний трик: перша мережа визначає , тільки якщо має бути в одному з, скажімо, 10 бункерів, такі як , і т.д .. Потім друга мережа обчислює корекцію: центрування та нормалізація також може допомогти тут. Не можу сказати, не намагаючись.y[80,97],[97,124][0,27]
  • спробуйте використати сучасну архітектуру (Inception або ResNet) замість старовинної. ResNet має фактично менше параметрів, ніж VGG-net. Звичайно, ви хочете використовувати тут маленькі ResNets - я не думаю, що ResNet-101 може допомогти набору даних 5000 зображень. Ви можете збільшити набір даних багато, хоча ....
  • Оскільки ваш вихід інваріантний до обертання, ще однією чудовою ідеєю було б використовувати або групові еквівалентні CNN , вихід яких (коли вони використовуються як класифікатори) є інваріантними для дискретних обертів, або керовані CNNвихід якого інваріантний до безперервних обертів. Властивість інваріантності дозволить вам отримати хороші результати при набагато меншому збільшенні даних або в ідеалі взагалі жодних (для того, що це стосується ротацій: звичайно, вам все одно потрібні інші типи да). Групові еквівалентні CNN є більш зрілими, ніж керовані CNN з точки зору реалізації, тому я спробував би спочатку групові CNN. Ви можете спробувати класифікацію-потім-регресію, використовуючи G-CNN для класифікаційної частини, або ви можете експериментувати з підходом чистої регресії. Не забудьте відповідно змінити верхній шар.
  • експериментуйте з розміром партії (так, так, я знаю, що зловмисні параметри - це не круто, але це найкраще, з чим я міг би прийти за обмежений час та безкоштовно :-)
  • нарешті, є архітектури, які були спеціально розроблені для точного прогнозування з невеликими наборами даних. Більшість із них використовували розширені згортки : один відомий приклад - змішана щільна звивиста нейромережа . Однак реалізація не є тривіальною.

3
Дякую за детальну відповідь. Я вже робив значне збільшення даних. Спробували пару варіантів початкової моделі (де варіація означає, що кількість фільтрів масштабується однаково по всій моделі). Бачив неймовірні вдосконалення. Ще є шляхи. Я спробую кілька ваших пропозицій. Знову дякую.
rodrigo-silveira

@ rodrigo-silveira, ласкаво просимо, повідомте мені, як це відбувається. Можливо, ми зможемо поговорити у чаті, як тільки ви отримаєте результати.
DeltaIV

1
Чудова відповідь, заслуговує на більшу ^
Гіллі

1
Дуже добре складений!
Картік Тіагараджан

1
Я б дав тобі 10 тис. Балів за це, якби міг. Дивовижна відповідь
Boppity Bop
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.