Классы, никогда не встречавшиеся ранее на моделях глубокого обучения - PullRequest
0 голосов
/ 16 января 2019

У меня есть основной вопрос. Предположительно я тренирую классификатор изображений для кошек и собак. Но мне нужен дополнительный функционал. Если изображение не относится ни к одной из категорий, как мне его узнать. Вот некоторые варианты, о которых я думал:

  1. Вместо 2 нейронов я добавляю третий Нейрон к последнему слою. И получите мои тренировочные ярлыки y как одну горячую кодировку из 3 ярлыков, 3-й для того, чтобы не быть в классе кошки или собаки. Я буду использовать несколько случайных примеров для своего 3-го класса.
  2. Я буду использовать только 2 нейрона и используя некоторый порог вероятности, я буду использовать его, чтобы сказать, какому классу должен принадлежать мой образ.

Однако я не думаю, что какой-либо из методов является жизнеспособным.

Может кто-нибудь предложить мне хорошую технику для классификации изображений, которые не относятся к моей категории обучения?

1 Ответ

0 голосов
/ 16 января 2019

Прежде чем перейти к решению, которое я собираюсь предоставить, я сначала прокомментирую предлагаемое решение вопросов. Первое решение будет работать лучше, чем второе. Это потому, что очень трудно интерпретировать (вероятность) значения выходных данных нейронной сети. Близость значений может быть вызвана сходством участвующих классов (в этом случае собака может выглядеть как кошка). Иногда вы можете в конечном итоге получить невидимые классы, отнесенные к одному из классов с высокой вероятностью.

Большинство контролируемых алгоритмов машинного обучения классификации предназначены для отображения входных данных в одном из некоторого фиксированного числа классов. Этот тип классификации называется закрытая мировая классификация .
Например.

  • MNIST - классификация рукописных цифр
  • Кошка - Собака Классификация

Когда в классификации участвуют некоторые немаркированные / неизвестные классы, этот подход называется классификацией открытого мира. Опубликованы различные статьи [ 1 , 2 , 3 ].

Я объясню свое решение, используя решение, предложенное 3 . Существует два варианта применения классификации открытого мира (здесь я буду ссылаться на OWC) к рассматриваемой проблеме.

  1. Классификация всех новых классов как одного класса
  2. Классификация всех новых классов как одного класса, затем дальнейшая группировка похожих выборок в один класс и различные выборки в разные классы.

1. Классификация всех новых классов как одного класса

Хотя может быть много типов моделей, которые могли бы соответствовать этому типу классификации (Одним из них может быть первое решение, предложенное в этом вопросе.) Я бы обсудил модель 3 . Здесь сеть сначала решает классифицировать или отклонить ввод. В идеале, если образец взят из видимых классов, тогда сеть будет классифицироваться как один из видимых классов. В противном случае сеть отклоняет. Авторы 3 назвали эту сеть открытой классификационной сетью (OCN). Реализация OCN в Keras могла бы быть такой (я упростил сеть, чтобы сосредоточиться только на выводе модели.

inputs = keras.layers.Input(shape=(28, 28,1))
x = keras.layers.Conv2D(64, 3, activation="relu")(inputs)
x = keras.layers.Flatten()(x)

embedding = keras.layers.Dense(256, activation="linear", name="embedding_layer")(x)
reject_output = keras.layers.Dense(1, activaton="sigmoid", name="reject_layer")(embedding)

classification_output = keras.layers.Dense(num_of_classes, activaton="softmax", name="reject_layer")(embedding)

ocn_model = keras.models.Model(inputs=inputs, outputs=[reject_output, classification_output)

Модель обучена таким образом, что совместно оптимизирует потери reject_output и classification_output.

2. Классификация всех новых классов как одного класса, затем дальнейшая группировка аналогичных

Авторы 3 использовали другую сеть, чтобы найти сходство между образцами. Они называли сеть парной классификационной сети (PCN). PCN классифицирует, являются ли два входа от одного класса или разных классов. Мы можем использовать embedding первого решения и использовать попарные метрики подобия для создания сети PCN. В PCN веса делятся для обоих входов. Это может быть реализовано с использованием keras

embedding_model = keras.layers.Sequential([
    keras.layers.Conv2D(64, 3, activation="relu", input_shape=(28, 28,1))
    keras.layers.Flatten(),
    embedding = keras.layers.Dense(256, activation="linear", name="embedding_layer")
])

input1 = keras.layers.Input(shape=(28, 28, 1))
input2 = keras.layers.Input(shape=(28, 28, 1))

embedding1 = embedding_model(input1)
embedding2 = embedding_model(input2)

merged = keras.layers.Concatenate()([embedding1, embedding2])
output = keras.layers.Dense(1, activation="sigmoid")(merged)

pcn_model = keras.models.Model(inputs=[input1, input2], outputs=output)

Модель PCN будет обучена уменьшать расстояние от одного и того же и увеличивать расстояние между различными классами.

После того, как сеть PCN обучена, авто-кодировщик обучается изучать полезные представления из невидимых классов. Затем алгоритм кластеризации используется для группировки (кластеризации) невидимых классов с использованием модели PCN в качестве функции расстояния.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...