### 从未见过的深度学习模型中的类别

我有一个基本的问题。假设我正在训练一个猫狗图像分类器。但我需要一个额外的功能。如果一张图片不属于任何类别,我怎样才能知道呢?我考虑了一些选项:

  1. 在最后一层增加第三个神经元,而不是两个神经元。并将我的训练标签 y 设置为3个标签的一热编码,第三个标签用于表示既不属于猫也不属于狗的类别。我将为第三类使用一些随机示例。
  2. 我只使用两个神经元,并使用某个概率阈值来判断我的图像应该属于哪个类别。

然而,我认为这些方法都不太可行。

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


回答:

在进入解决方案之前,我将首先评论所提出的问题解决方案。与第二个解决方案相比,第一个解决方案会更好。这是因为解释神经网络输出的(概率)值非常困难。数值的接近可能由类别的相似性引起(在这种情况下,狗可能看起来像猫)。有时候,你可能会发现未见过的类别被分配到一个类别上,并且具有较高的概率。

大多数监督分类机器学习算法都是设计用来将输入映射到一些固定数量的类别中的一个。这种类型的分类被称为封闭世界分类
例如:

  • 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_outputclassification_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模型作为距离函数来对未见类别进行分组(聚类)。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注