我有一个基本问题。据说我正在训练猫和狗的图像分类器。但是我需要一个额外的功能。如果图像不属于任何类别,我如何了解它。我想到的一些选项是:
但是我认为任何一种方法都不可行。
有人可以建议我对不属于我的训练类别的图像进行分类吗?
答案 0 :(得分:1)
在进入解决方案之前,我将首先提供对提出的问题解决方案的评论。与第二种解决方案相比,第一种解决方案将更好地工作。这是因为很难解释神经网络输出的(概率)值。值的接近性可能是由所涉及的类的相似性引起的(在这种情况下,狗可能看起来像猫)。有时,您可能最终会将看不见的课程分配给其中一个课程的可能性很高。
大多数监督分类机器学习算法旨在将输入映射到某些固定数量的类之一。这种分类称为封闭世界分类。
例如。
当分类涉及一些未标记/未知的类时,该方法称为开放世界分类。发表了各种论文[1,2,3]。
我将使用3提出的解决方案来说明我的解决方案。 有两种方法可以将开放世界分类(在此我将参考OWC)应用于有问题的问题。
尽管可能有许多类型的模型适合这种类型的分类(其中一个可能是该问题提出的第一个解决方案。)我将讨论3的模型。在这里,网络首先决定分类或拒绝输入。理想情况下,如果样本来自可见类别,则网络将分类为可见类别之一。否则,网络将拒绝。 3的作者将此网络称为开放分类网络(OCN)。 Keras的OCN实现可以是(我简化了网络,仅关注模型的输出。
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
的损失。
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模型为距离函数,采用聚类算法对看不见的类别进行分组(聚类)。