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

15

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

Спасибо.

nnrales
источник
Если вы тренируетесь с большим количеством классов, то есть? это может помочь? Например, допустим, вы знаете, что будет не более 1000 классов. Вы с самого начала тренируете свой классификатор с 1000 классами на 10 классах, которые у вас есть, а когда у вас больше классов, просто продолжайте тренироваться на них ... Это может быть хорошим решением? Есть ли бумага об этом подходе?
Майкл

Ответы:

13

Если это всего лишь одноразовый случай, вы можете просто переобучить нейронную сеть. Если вам часто приходится добавлять новые классы, то это плохая идея. То, что вы хотите сделать в таких случаях, называется извлечением изображений на основе содержимого (CBIR), или просто извлечением изображений или визуальным поиском. Я объясню оба случая в моем ответе ниже.

Одноразовый кейс

Если это случится один раз - вы забыли 11-й класс или ваш клиент передумал - но это больше не повторится , тогда вы можете просто 11-й выходной узел перейти на последний уровень. Инициализируйте веса этому узлу случайным образом, но используйте веса, которые у вас уже есть, для других выходных данных. Тогда тренируйся как обычно. Может быть полезно исправить некоторые веса, т.е. не тренировать их.

Крайним случаем может быть только тренировка новых весов и оставление всех остальных исправленными. Но я не уверен, что это сработает так хорошо - возможно, стоит попробовать.

Контентный поиск изображений

Рассмотрим следующий пример: вы работаете в магазине компакт-дисков, который хочет, чтобы их клиенты могли сфотографировать обложку альбома, а приложение показывает им отсканированный компакт-диск в их интернет-магазине. В этом случае вам придется переподготовку сети для каждого нового компакт-диска, который они имеют в магазине. Это может быть 5 новых компакт-дисков каждый день, поэтому повторное обучение сети не подходит.

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

Как вы обучаете нейронную сеть изучать такой дескрипторный вектор? Это активная область исследований. Вы можете найти недавнюю работу, выполнив поиск по таким ключевым словам, как «поиск изображений» или «обучение метрикам».

Прямо сейчас люди обычно берут предварительно обученную сеть, например VGG-16, отсекают слои FC и используют конечную сверточную в качестве вектора дескриптора. Вы можете дополнительно обучить эту сеть, например, используя сиамскую сеть с потерей триплета.

hbaderts
источник
Я изучал однократное обучение. Как вы думаете, это может помочь мне?
nnrales
Я действительно не знаю об однократном обучении. Но одноразовые документы глубокого обучения, которые я нашел, выглядят очень похоже на подход CBIR, поэтому он определенно может быть полезен для вас
hbaderts
2

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

Ваш новый слой будет слоем matmul с формой [len(dense layer), len(new classes)].

Без доступа к исходным данным обучения у вас будет два варианта:

  1. Заморозьте все веса в исходных слоях, позволив «новой» модели оптимизировать только новые веса. Это даст вам точно такую ​​же прогностическую силу для оригинальных 10 классов и может дать хорошую производительность для новых.
  2. Обучите всю сеть за один раз (распространяя ошибки новых классов), что может работать для новых классов, но в итоге вы получите неэффективное исходное решение для 10 классов (так как веса будут изменены для нижних классов и последнего уровня не будет обновляться в соответствии с этими изменениями).

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

chewpakabra
источник
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 классов.

Счастливого обучения.

Субхам Тивари
источник