Py学习  »  机器学习算法

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

Nikhil Mishra • 5 年前 • 561 次点击  

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

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

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

有人能建议我一个很好的技术来分类图像不属于我的培训类别吗?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/30543
 
561 次点击  
文章 [ 1 ]  |  最新文章 5 年前
Mitiku
Reply   •   1 楼
Mitiku    5 年前

在讨论解决方案之前,我将首先对问题的建议解决方案发表评论。第一种解决方案比第二种解决方案效果更好。这是因为很难解释神经网络输出的(概率)值。值的接近可能是由涉及的类的相似性造成的(在本例中,狗可能看起来像猫)。有时,你可能最终会得到一些看不见的类被分配到其中一个概率很高的类中。

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

  • MNIST -手写数字分类
  • 猫-狗 分类

当分类涉及一些未标记/未知的类时,这种方法称为开放世界分类。出版了各种各样的论文[ 1 , 2 , 3 ]

我将使用 . 有两个选项可以将开放世界分类(这里我将参考OWC)应用到问题中。

  1. 将所有新类分类为单个类
  2. 将所有新类分类为单个类,然后将相似的样本进一步分组为单个类,将不同的样本分组为不同的类。

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模型为距离函数,对未知类进行聚类。