在讨论解决方案之前,我将首先对问题的建议解决方案发表评论。第一种解决方案比第二种解决方案效果更好。这是因为很难解释神经网络输出的(概率)值。值的接近可能是由涉及的类的相似性造成的(在本例中,狗可能看起来像猫)。有时,你可能最终会得到一些看不见的类被分配到其中一个概率很高的类中。
大多数监督分类机器学习算法的设计是为了将输入映射到一些固定数量的类中的一个。这种分类称为
封闭世界分类
.
例如。
当分类涉及一些未标记/未知的类时,这种方法称为开放世界分类。出版了各种各样的论文[
1
,
2
,
3
]
我将使用
三
.
有两个选项可以将开放世界分类(这里我将参考OWC)应用到问题中。
-
将所有新类分类为单个类
-
将所有新类分类为单个类,然后将相似的样本进一步分组为单个类,将不同的样本分组为不同的类。
1。将所有新类分类为单个类
尽管有许多类型的模型可以适合这种类型的分类(其中一个可能是问题提出的第一个解决方案),我将讨论
三
. 在这里,网络首先决定对输入进行分类或拒绝输入。理想情况下,如果样本来自可见类,那么网络将划分为一个可见类。另一方面,网络拒绝。作者
三
称此网络为开放分类网络(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。将所有新类分类为单个类,然后进一步分组相似的
作者
三
使用另一个网络来查找样本之间的相似性。他们称之为网络成对分类网络(PCN)。PCN对两个输入是来自同一类还是不同类进行分类。我们可以使用
embedding
第一个解决方案,并使用成对相似性度量来创建PCN网络。在PCN中,两个输入的权重是共享的。这可以通过使用KERA来实现。
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模型为距离函数,对未知类进行聚类。