深度学习模型中以前从未见过的课程

Nik*_*hra 2 classification machine-learning neural-network deep-learning keras

我有一个基本问题。据说我正在训练猫和狗的图像分类器。但我需要一个额外的功能。如果图像不属于任何类别,我如何才能知道它。我想到的一些选择是:

  1. 我在最后一层添加了第三个神经元,而不是 2 个神经元。并将我的训练标签 y 作为 3 个标签的一个热编码,第三个标签不属于猫类或狗类。我将在第三堂课中使用一些随机的例子。
  2. 我将只使用 2 个神经元,并使用一些概率阈值,我将用它来告诉我的图像应该属于哪个类。

但我认为任何方法都不可行。

谁能建议我一种好的技术来对不属于我的训练类别的图像进行分类?

Mit*_*iku 5

在讨论解决方案之前,我首先对问题的建议解决方案进行评论。与第二个解决方案相比,第一个解决方案效果更好。这是因为解释神经网络输出的(概率)值非常困难。值的接近可能是由涉及的类的相似性引起的(在这种情况下,狗可能看起来像猫)。有时,您可能最终会将看不见的类别分配给高概率的类别之一。

大多数监督分类机器学习算法旨在将输入映射到某些固定数量的类别之一。这种类型的分类称为封闭世界分类
例如

  • 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)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

PCN模型将被训练以减少相同类别之间的距离并增加不同类别之间的距离。

PCN 网络经过训练后,自动编码器将被训练以从未见过的类中学习有用的表示。然后利用PCN模型作为距离函数,使用聚类算法对未见过的类进行分组(聚类)。