Скажем, я прошел обучение по обучению в предварительно обученной сети, чтобы распознать 10 объектов. Как добавить 11-й элемент, который сеть может классифицировать, не теряя при этом все 10 категорий, которые я уже обучил, или информацию из исходной предварительно обученной модели? Друг сказал мне, что в этой области ведутся активные исследования, но я не могу найти соответствующие документы или название, по которому можно искать?
Спасибо.
neural-network
deep-learning
nnrales
источник
источник
Ответы:
Если это всего лишь одноразовый случай, вы можете просто переобучить нейронную сеть. Если вам часто приходится добавлять новые классы, то это плохая идея. То, что вы хотите сделать в таких случаях, называется извлечением изображений на основе содержимого (CBIR), или просто извлечением изображений или визуальным поиском. Я объясню оба случая в моем ответе ниже.
Одноразовый кейс
Если это случится один раз - вы забыли 11-й класс или ваш клиент передумал - но это больше не повторится , тогда вы можете просто 11-й выходной узел перейти на последний уровень. Инициализируйте веса этому узлу случайным образом, но используйте веса, которые у вас уже есть, для других выходных данных. Тогда тренируйся как обычно. Может быть полезно исправить некоторые веса, т.е. не тренировать их.
Крайним случаем может быть только тренировка новых весов и оставление всех остальных исправленными. Но я не уверен, что это сработает так хорошо - возможно, стоит попробовать.
Контентный поиск изображений
Рассмотрим следующий пример: вы работаете в магазине компакт-дисков, который хочет, чтобы их клиенты могли сфотографировать обложку альбома, а приложение показывает им отсканированный компакт-диск в их интернет-магазине. В этом случае вам придется переподготовку сети для каждого нового компакт-диска, который они имеют в магазине. Это может быть 5 новых компакт-дисков каждый день, поэтому повторное обучение сети не подходит.
Решение состоит в том, чтобы обучить сеть, которая отображает изображение в пространство признаков. Каждое изображение будет представлено дескриптором, который является, например, 256-мерным вектором. Вы можете «классифицировать» изображение, рассчитав этот дескриптор и сравнив его с вашей базой данных дескрипторов (т.е. дескрипторов всех компакт-дисков, которые есть в вашем магазине). Ближайший дескриптор в базе данных побеждает.
Как вы обучаете нейронную сеть изучать такой дескрипторный вектор? Это активная область исследований. Вы можете найти недавнюю работу, выполнив поиск по таким ключевым словам, как «поиск изображений» или «обучение метрикам».
Прямо сейчас люди обычно берут предварительно обученную сеть, например VGG-16, отсекают слои FC и используют конечную сверточную в качестве вектора дескриптора. Вы можете дополнительно обучить эту сеть, например, используя сиамскую сеть с потерей триплета.
источник
Ваша топология сети может выглядеть иначе, но, в конце концов, ваша предварительно обученная сеть имеет слой, который обрабатывает распознавание 10 оригинальных классов. Самый простой (и работающий) трюк для введения 11-го, 12-го ... n-го класса - это использовать все слои до последнего как предоставленные и добавить дополнительный слой (в новой модели или в качестве параллельного), который также будет сидеть поверх всех слоев, кроме последних, будет выглядеть как слой 10-го класса (который, скорее всего, представляет собой матрицу плотного слоя и матрицу формы
[len(dense layer), 10]
с необязательным смещением).Ваш новый слой будет слоем matmul с формой
[len(dense layer), len(new classes)]
.Без доступа к исходным данным обучения у вас будет два варианта:
Хотя, имея доступ к исходным данным обучения, вы можете легко добавить новый класс в исходную сеть и переобучить его для поддержки 11 классов из коробки.
источник
Это можно сделать легко.
Сначала создайте модель с этими 10 классами и сохраните модель как base_model.
Загрузите base_model, а также определите новую модель с именем new_model как
Затем добавьте слои base_model в new_model -
Теперь сделайте слои новой модели не обучаемыми, так как вы не хотите, чтобы ваша модель снова тренировалась.
Теперь, когда вы переносите обучение, когда вы удаляете последние слои, модель забывает о 10 классах, поэтому мы должны сохранить веса base_model для new_model -
Теперь добавьте плотный слой в конце, и мы обучим этот плотный слой только в этом примере.
Теперь тренируйте модель, и я надеюсь, что она дает правильный результат для всех 11 классов.
Счастливого обучения.
источник