深度学习模型上从未见过的课程

Posted

技术标签:

【中文标题】深度学习模型上从未见过的课程【英文标题】:Classes never seen before on Deep Learning Models 【发布时间】:2019-06-10 04:16:57 【问题描述】:

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

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

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

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

【问题讨论】:

这取决于您的数据。如果你也可以为三等舱制作足够的数据集,它可以很方便地工作。 (bc它不需要调整阈值,但是对于后者,您应该。)当您没有足够的数据进行三等时,我建议使用后者而不是前者 你有没有得到 sol ? 【参考方案1】:

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

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

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_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 网络后,自动编码器被训练以从看不见的类中学习有用的表示。然后使用Clustering算法,以PCN模型作为距离函数,对不可见的类进行分组(聚类)。

【讨论】:

对于第一个选项,“将所有新类分类为单个类”,我有一个问题。我使用的数据是有标签的,在未知样本的情况下,我们也用这些进行训练吗?如果是这种情况,在 one-hot 编码的目标类中,我们是否在每个类中都有这些带有0 的样本以将它们设为未知,或者我们是否有一个新的“未知”类来标记这些样本作为? @rshah,要使用第一个解决方案,是的,您需要将看不见的图像标记为“未知”类。 @Mitiku 假设我有一个模型(猫狗)分类器。如果我在其中传递自行车的图像,它是否能够使用这种方法(第一个)将其归类为“未知”。有没有任何可行的例子,你能帮我吗?

以上是关于深度学习模型上从未见过的课程的主要内容,如果未能解决你的问题,请参考以下文章

为啥预训练的深度学习模型的性能会下降?

零样本图像识别综述论文

论文:利用深度强化学习模型定位新物体(VISUAL SEMANTIC NAVIGATION USING SCENE PRIORS)

Datawhale学习打卡课节1: Paddle开发深度学习模型快速入门 NCF

动手学深度学习v2 课程笔记 — 深度学习基础

动手学深度学习v2 课程笔记 — 深度学习基础