Тренування нейронної мережі до регресії завжди передбачає середнє значення


9

Я треную просту конвертну нейронну мережу для регресії, де завдання передбачити (x, y) розташування коробки на зображенні, наприклад:

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

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

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

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

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

На виході мережі є два вузли, один для x і один для y. Решта мережі - це стандартна звивиста нейронна мережа. Втрата - це стандартна середня квадратична помилка між передбачуваною позицією коробки та основним положенням істини. Я тренуюсь на 10000 таких зображень, а валідую 2000 року.

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

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

Я запускав це ще багато епох, ніж показано на цьому графіку, і втрата все ще ніколи не зменшується. Цікаво, що тут втрати фактично збільшуються в один момент.

Таким чином, здається, що мережа просто прогнозує середнє значення навчальних даних, а не навчається добре. Будь-які ідеї, чому це може бути? Я використовую Адама в якості оптимізатора, з початковою швидкістю навчання 0,01, а реліз - як активація


Якщо вас цікавить якийсь мій код (Keras), це нижче:

# Create the model
model = Sequential()
model.add(Convolution2D(32, 5, 5, border_mode='same', subsample=(2, 2), activation='relu', input_shape=(3, image_width, image_height)))
model.add(Convolution2D(64, 5, 5, border_mode='same', subsample=(2, 2), activation='relu'))
model.add(Convolution2D(128, 5, 5, border_mode='same', subsample=(2, 2), activation='relu'))
model.add(Flatten())
model.add(Dense(100, activation='relu'))
model.add(Dense(2, activation='linear'))


# Compile the model
adam = Adam(lr=0.01, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)
model.compile(loss='mean_squared_error', optimizer=adam)


# Fit the model
model.fit(images, targets, batch_size=128, nb_epoch=1000, verbose=1, callbacks=[plot_callback], validation_split=0.2, shuffle=True)

Чи є зображення на головних прикладах ваших фактичних зразків? Це 5 окремих зразків? Здається, на зображеннях немає інформації, яка допомогла б узагальнити. Тобто вам не потрібна нейронна сітка, щоб знайти розташування білого квадрата x, y, ви можете просто проаналізувати зображення і шукати білий піксель. Поясніть трохи більше про своє бачення цієї моделі. Чи є якийсь часовий візерунок, за яким ви прогнозуєте наступне місце?
фотокс

Привіт, і так, зображення - це 5 окремих зразків. Я не впевнений, як вони надаються для вас, але вони повинні мати 5 окремих квадратних зображень (я трохи змінив макет, щоб допомогти ...). Так, я розумію, що вам не потрібна нейрональна мережа для цього завдання, але це лише тестовий експеримент, який допоможе мені навчитися робити регресію з нейронною мережею. Я не розумію, що ви маєте на увазі, не маючи інформації, яка допомогла б узагальнити .... Кожна тренувальна пара складається з квадратного зображення та двовимірного вектора (x, y) розташування квадрата. Дякую :)
Karnivaurus

1
1) Ваша форма введення на першому шарі conv використовує 3 (rbg) канали, але ваші дані мають відтінки сірого (1 канал) 2) Вам не потрібно стільки шарів conv і фільтрів, адже я думаю, що один шар жменька маленьких ядер буде добре.
фотокс

Ви впевнені, що зображення дійсно відповідають цілям?
user31264

1
Як говорить @photox, вам не потрібні шари conv. Додавання цих даних ускладнює оптимізатору пошук хорошого рішення. Якщо ви видалите 3 шари конвеєра, я підозрюю, що ваша "модель" буде працювати.
Пітер

Відповіді:


8

Оптимізатор не в змозі сходитись до (суб) оптимального рішення. Чому? Ваша проблема занадто проста і / або ваша модель занадто складна.

Занадто проста проблема

Як вже говорив @photox, цю проблему можна вирішити лише одним прихованим шаром. Я навіть підозрюю, що це можна зробити без прихованого шару. Це тому, що ця проблема є лінійно відокремленою .

Дозвольте мені проілюструвати це. Уявіть нейронну мережу без прихованих шарів та лінійної функції активації (можна також назвати її лінійною регресією). Для обчислення місця розташування квадрата x кожен піксель підключений до виходу x. Перший стовпчик пікселів пов'язаний з вагою1/width. Другий стовпчик пов'язаний з вагою2/width. Це триває до останнього стовпця (наприклад, стовпцяn) що пов'язано з вагою n/width. Оскільки деякі пікселі не нульові, активація виведення лінійна до x-координати квадрата. Отже, лінійна функція може обчислити розташування квадрата.

Є кілька рішень:

  • Виберіть складнішу проблему, наприклад класифікацію зображень
  • Додайте шум, наприклад, сіль-перець або білий шум
  • Складіть проблему складніше, наприклад, передбачивши розташування червоного квадрата, коли на задньому плані багато різних кольорів

Занадто складна модель

Ваша модель має кілька частин, які додають багато складності, не допомагаючи оптимізатору знайти солодкий оптимум.

Наприклад, згорткові шари. Перший шар має 32 згорткових фільтри розміром5×5. Що ви очікуєте, щоб ці фільтри дізналися? У класифікації зображень ці фільтри вчаться виявляти краї, кути, градієнти та задирки. Але в цьому випадку є лише кілька фільтрів, які мають сенс. Я думаю про край зліва направо і навпаки, і зверху вниз і навпаки. Таким чином, у вашому випадку є приблизно 28 фільтрів, які просто додають випадковий шум. Видалення цих (або просто всього шару) оптимізатору значно полегшує пошук оптимізатора, який працює.

Ще один приклад - оптимізатор Адама з великою кількістю додаткових параметрів. Оптимізатор Адама може добре працювати з цими параметрами, але чому б ви не почали з простого SGDоптимізатора зі значеннями за замовчуванням.

Таким чином, ви можете зробити кілька оптимізацій:

  • використання LinearRegressionвід scikit-learn. Гаразд, це не те, що ви хочете, але я просто хочу проілюструвати, наскільки надмірно складна ця модель.
  • Видаліть шари conv
  • Зменшити розмір прихованих Denseшарів
  • Використовуйте SGDоптимізатор за замовчуванням
  • Якщо ви використовуєте прихований шар, спробуйте sigmoidактивувати. Ви можете вважати кожен із вузлів прихованого шару таким, що визначає, чи є квадрат у певному місці.
  • Якщо все це не працює, експериментуйте зі швидкістю навчання, щоб дізнатись, чи вона занадто висока чи занадто низька.

Пс

Я думаю, що вам сподобається цей блоґпост від Адіт Дешпанде.


Повідомте мене, чи змінили ці рішення поведінку оптимізаторів.
Пітер

Дякую, це дуже корисно. Я працюю над тим, щоб спробувати ваші пропозиції. Однак я не розумію вашого першого моменту. Мене бентежить, чому, якщо проблема занадто проста, то її важче оптимізувати, ніж складнішу проблему. Чому для даної мережі чому простішу проблему важче оптимізувати, ніж складнішу проблему? У простій проблемі я би подумав, що будуть дуже сильні градієнти та сильний глобальний оптимум. Але ваш перший пункт говорить про те, що простота проблеми робить оптимізацію важкою, припускаючи, що більш складна проблема допоможе оптимізації ...
Karnivaurus

Я не купую жодне з них як причину цієї проблеми. "Складна" модель повинна бути більш спроможною і тому не повинна боротись, щоб відповідати навчальним даним. "Легка" проблема не повинна ускладнювати її вирішення ... "легко" - це відносно термін ... можливо, ви хочете сказати, що його архітектура нейронної мережі не здатна захопити сигнал у свої дані, навіть якщо «простіша», але принципово інша модель могла.
JacKeown

> "Мене бентежить, чому, якщо проблема занадто проста, то її важче оптимізувати, ніж складнішу проблему." Тому що складна модель має багато можливостей моделювання, які вона не використовує. Ця надмірна потужність вносить шум і ускладнює пошук реального сигналу.
Пітер

> "Я не купую жодного з них як причину цієї проблеми" - Озираючись на відповідь, вони написані з практичної точки зору. Якщо ваша складна модель не збігається належним чином, одним із способів її налагодження є використання більш простої моделі.
Пітер

0

Я зіткнувся з тією ж проблемою з моїм набором даних. Виявляється, в моєму випадку прогноктори сильно зосереджені з дуже невеликою дисперсією. Ви повинні перевірити дисперсію змінних ваших прогнозів і подивитися, як вона розподіляється.Розподіл змінної я намагаюся передбачити

Однак деякі перетворення на вихідній змінній можуть бути виконані для зміни або зміни її масштабу. Це може призвести до більш рівномірного розподілу типів. Наприклад, у завданнях розпізнавання зображень вирівнювання гістограми або посилення контрасту іноді працює на користь правильного прийняття рішення.


-1

Це схоже на типову проблему надмірного обладнання. Ваші дані не дають достатньо інформації для кращого результату. Ви вибираєте складний НН, з яким ви поїдете, щоб запам'ятати всі нюанси даних поїздів . Втрата ніколи не може бути нулем, як це є на вашому графіку. BTW Здається, у вашій валідації є помилка або набір перевірки не є корисним для перевірки, оскільки втрата перевірки також отримує нуль.


5
Питання говорить, що мережа майже завжди видає нуль. Це був би випадок суворого недобору , а не надто пристосованого . Немає розриву між помилкою навчання та валідації на кривій навчання, що вказує на те, що неполадка не є проблемою (помилка не нульова, шкала логарифмічна)
користувач20160

-1

Я насправді працював над дуже подібною проблемою. В основному, у мене було купою крапок на білому тлі, і я навчав NN розпізнавати крапку, яка була розміщена на тлі спочатку. Я знайшов роботу лише використовувати один повністю пов'язаний шар нейронів (тобто 1-шаровий NN). Наприклад, для зображення розміром 100x100 я мав би 10000 вхідних нейронів (пікселів), безпосередньо пов'язаних з двома вихідними нейронами (координатами). У PyTorch, коли я перетворював значення пікселів у тензор, він нормалізував мої дані автоматично, віднімаючи середнє значення та ділячи на стандартне відхилення. У звичайних проблемах машинного навчання це нормально, але не для зображення, де може бути невідповідність кількості кольорових пікселів на зображенні (тобто ваших, де є лише кілька білих пікселів). Тому, Я вручну нормалізувався, розділивши всі значення інтенсивності пікселів на 255 (тому вони зараз знаходяться в діапазоні 0-1 без типової методики нормалізації, яка намагається пристосувати всі значення інтенсивності до нормального розподілу). Потім у мене все ще виникли проблеми, оскільки він передбачив середню координату пікселів у навчальному наборі. Отже, моє рішення полягало в тому, щоб встановити рівень навчання дуже високий, що суперечить майже всім інструкторам та навчальним програмам з МЛ. Замість використання 1e-3, 1e-4, 1e-5, як кажуть більшість людей, я використовував ступінь навчання 1 або 0,1 зі стохастичним градієнтом. Це вирішило мої проблеми, і моя мережа нарешті навчилася запам’ятовувати свій навчальний набір. Це не надто добре узагальнює тестовий набір, але, принаймні, дещо працює, що є кращим рішенням, ніж більшість усіх, хто запропонував у вашому питанні. тепер у діапазоні 0-1 без типової методики нормалізації, яка намагається пристосувати всі значення інтенсивності до нормального розподілу). Потім у мене все ще виникли проблеми, оскільки він передбачив середню координату пікселів у навчальному наборі. Отже, моє рішення полягало в тому, щоб встановити рівень навчання дуже високий, що суперечить майже всім інструкторам та навчальним програмам з МЛ. Замість використання 1e-3, 1e-4, 1e-5, як кажуть більшість людей, я використовував ступінь навчання 1 або 0,1 зі стохастичним градієнтом. Це вирішило мої проблеми, і моя мережа нарешті навчилася запам’ятовувати свій навчальний набір. Це не надто добре узагальнює тестовий набір, але, принаймні, дещо працює, що є кращим рішенням, ніж більшість усіх, хто запропонував у вашому питанні. тепер у діапазоні 0-1 без типової методики нормалізації, яка намагається пристосувати всі значення інтенсивності до нормального розподілу). Потім у мене все ще виникли проблеми, оскільки він передбачив середню координату пікселів у навчальному наборі. Отже, моє рішення полягало в тому, щоб встановити рівень навчання дуже високий, що суперечить майже всім інструкторам та навчальним програмам з МЛ. Замість використання 1e-3, 1e-4, 1e-5, як кажуть більшість людей, я використовував ступінь навчання 1 або 0,1 зі стохастичним градієнтом. Це вирішило мої проблеми, і моя мережа нарешті навчилася запам’ятовувати свій навчальний набір. Це не надто добре узагальнює тестовий набір, але, принаймні, дещо працює, що є кращим рішенням, ніж більшість усіх, хто запропонував у вашому питанні.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.