Прежде чем перейти к решению, которое я собираюсь предоставить, я сначала прокомментирую предлагаемое решение вопросов. Первое решение будет работать лучше, чем второе. Это потому, что очень трудно интерпретировать (вероятность) значения выходных данных нейронной сети. Близость значений может быть вызвана сходством участвующих классов (в этом случае собака может выглядеть как кошка). Иногда вы можете в конечном итоге получить невидимые классы, отнесенные к одному из классов с высокой вероятностью.
Большинство контролируемых алгоритмов машинного обучения классификации предназначены для отображения входных данных в одном из некоторого фиксированного числа классов. Этот тип классификации называется закрытая мировая классификация .
Например.
- MNIST - классификация рукописных цифр
- Кошка - Собака Классификация
Когда в классификации участвуют некоторые немаркированные / неизвестные классы, этот подход называется классификацией открытого мира. Опубликованы различные статьи [ 1 , 2 , 3 ].
Я объясню свое решение, используя решение, предложенное 3 .
Существует два варианта применения классификации открытого мира (здесь я буду ссылаться на OWC) к рассматриваемой проблеме.
- Классификация всех новых классов как одного класса
- Классификация всех новых классов как одного класса, затем дальнейшая группировка похожих выборок в один класс и различные выборки в разные классы.
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 в качестве функции расстояния.