Як додати нову категорію до моделі глибокого навчання?


15

Скажіть, я переклав навчання за попередньо підготовленою мережею, щоб розпізнати 10 об’єктів. Як додати 11-й елемент, який мережа може класифікувати, не втрачаючи всіх 10 категорій, які я вже навчив, а також інформацію з оригінальної попередньо підготовленої моделі? Друг сказав мені, що в цій галузі проводяться активні дослідження, але я не можу знайти жодних відповідних робіт або назви, за якими шукати?

Дякую.


Якщо ви тренуєтесь з набагато більшим класом, тоді є? це може допомогти? Наприклад, скажімо, ви знаєте, що буде не більше 1000 класів. Ви тренуєте з самого початку свій класифікатор з 1000 класу на 10 клас, який у вас зараз, і коли у вас є більше класів, просто тримаєте поїзд на них ... Це може бути хорошим рішенням? Чи існує документ щодо такого підходу?
Майкл

Відповіді:


13

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

Одноразовий випадок

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

Крайнім випадком буде лише тренувати нові ваги, а всі інші залишати зафіксованими. Але я не впевнений, чи добре це буде працювати - можливо, варто спробувати.

Пошук вмісту на основі вмісту

Розглянемо наступний приклад: ви працюєте в магазині компакт-дисків, який хоче, щоб їхні клієнти мали змогу сфотографувати обкладинку альбому, і додаток показує їм компакт-диск, який вони сканували у своєму інтернет-магазині. У такому випадку вам доведеться переучити мережу для кожного нового компакт-диска, який вони мають у магазині. Це може бути 5 нових компакт-дисків щодня, тому перепідготовка мережі таким чином не підходить.

Рішення полягає в підготовці мережі, яка відображає зображення в просторі зображень. Кожне зображення буде представлене дескриптором, який є, наприклад, 256-мірним вектором. Ви можете "класифікувати" зображення, обчисливши цей дескриптор і порівнявши його з вашою базою дескрипторів (тобто дескрипторами всіх компакт-дисків, які є у вашому магазині). Виграє найближчий дескриптор у базі даних.

Як ви навчаєте нейронну мережу вивчати такий вектор дескриптора? Це активне поле досліджень. Ви можете знайти останні роботи, шукаючи такі ключові слова, як "пошук зображень" або "метричне навчання".

Зараз люди зазвичай беруть заздалегідь підготовлену мережу, наприклад VGG-16, відрізають шари FC і використовують остаточну згортку як вектор вашого дескриптора. Ви можете далі тренувати цю мережу, наприклад, використовуючи сіамську мережу з втратою триплетів.


Я вивчав навчання в один кадр. Ви думаєте, що це може мені допомогти?
nnrales

Я насправді не знаю про навчання одним ударом. Але я знайшов одноразові глибокі навчальні документи, схожі на підхід CBIR, тож, безумовно, може бути корисним для вас
hbaderts

2

Ваша мережева топологія може виглядати інакше, але в самому кінці у вашої попередньо підготовленої мережі є шар, який обробляє розпізнавання 10 оригінальних класів. Найпростіший (і працюючий) трюк для введення 11-го, 12-го .. n-го класу - це використовувати всі шари до останнього, як надано, і додати додатковий шар (у новій моделі або як паралельний), який також буде сидіти З іншого боку, окрім останніх шарів, він буде схожий на шар 10 класу (який, швидше за все, є матулом щільного шару та матрицею форми [len(dense layer), 10]з необов'язковим зміщенням).

Вашим новим шаром буде матульний шар з формою [len(dense layer), len(new classes)].

Без доступу до оригінальних даних про навчання, у вас є два варіанти:

  1. Заморожуйте всі ваги в оригінальних шарах, дозволяючи "новій" моделі оптимізувати лише нові ваги. Це дасть вам точно таку саму силу передбачення для оригінальних 10 класів і може забезпечити нормальну продуктивність для нових.
  2. Навчіть одразу всю мережу (поширюючи помилку нових класів), яка може працювати для нового класу, але ви отримаєте неефективне оригінальне рішення для 10 класів (оскільки ваги будуть змінені для нижчих класів та остаточного шару) не буде оновлено відповідно до цих змін).

Хоча, маючи доступ до оригінальних даних про навчання, ви можете легко додати новий клас до початкової мережі та переучити його для підтримки 11 класів поза рамками.


2

Це можна зробити легко.

Спочатку побудуйте модель з цих 10 класів і збережіть модель як base_model.

Завантажте base_model, а також визначте нову модель під назвою new_model як-

new_model = Sequential()

Потім додайте шари base_model до new_model -

# getting all the layers except the last two layers
for layer in base_model.layers[:-2]: #just exclude the last two layers from base_model
    new_model.add(layer)

Тепер зробіть шари нової моделі непідвладними, оскільки ви не хочете, щоб ваша модель знову навчалася.

# prevent the already trained layers from being trained again
for layer in new_model.layers:
    layer.trainable = False

Тепер, коли ви переносите навчання, коли ви видаляєте останні шари, модель забуває про 10 класів, тому ми повинні зберігати ваги base_model до new_model -

weights_training = base_model.layers[-2].get_weights()
new_model.layers[-2].set_weights(weights_training) 

Тепер додайте щільний шар в кінці, і ми будемо тренувати цей щільний шар лише в цьому прикладі.

new_model.add(Dense(CLASSES, name = 'new_Dense', activation = 'softmax'))

Тепер тренуйте модель, і я сподіваюся, що вона дає правильний результат для всіх 11 класів.

Щасливе навчання.

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