Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Machine learning 以前从未见过的深度学习模式课程_Machine Learning_Keras_Neural Network_Deep Learning_Classification - Fatal编程技术网

Machine learning 以前从未见过的深度学习模式课程

Machine learning 以前从未见过的深度学习模式课程,machine-learning,keras,neural-network,deep-learning,classification,Machine Learning,Keras,Neural Network,Deep Learning,Classification,我有一个基本问题。据说我正在为猫和狗训练一个图像分类器。但我需要一个额外的功能。如果图像不属于任何类别,我如何知道它。我考虑的一些选择是: 我在最后一层添加了第三个神经元,而不是两个神经元。把我的训练标签y作为3个标签的一个热编码,第三个是不在猫或狗类中。我将在我的第三节课上使用一些随机的例子 我将只使用2个神经元,并使用一些概率阈值,我将使用它来告诉我的图像应该属于哪个类 不过,我认为任何方法都不可行 有谁能给我推荐一种好的方法来对不属于我的培训类别的图像进行分类吗?在讨论解决方案之前,我首先

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

  • 我在最后一层添加了第三个神经元,而不是两个神经元。把我的训练标签y作为3个标签的一个热编码,第三个是不在猫或狗类中。我将在我的第三节课上使用一些随机的例子
  • 我将只使用2个神经元,并使用一些概率阈值,我将使用它来告诉我的图像应该属于哪个类 不过,我认为任何方法都不可行


    有谁能给我推荐一种好的方法来对不属于我的培训类别的图像进行分类吗?

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

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

    • MNIST-手写数字分类
    • 猫狗分类
    当分类涉及一些未标记/未知类时,这种方法称为开放世界分类。发表了各种论文[,]

    我将使用提出的解决方案解释我的解决方案。 有两种选择可以将开放世界分类(在这里我将参考OWC)应用于所讨论的问题

  • 将所有新类分类为单个类
  • 将所有新类分类为单个类,然后进一步将相似样本分组为单个类,将不同样本分组为不同类
  • 1.将所有新类分类为单个类 虽然可能有许多类型的模型可以适合这种类型的分类(其中一种可能是问题提出的第一个解决方案)。我将讨论的模型。在这里,网络首先决定分类或拒绝输入。理想情况下,如果样本来自SEED类,则网络将分类为一个SEED类。另一方面,网络拒绝。该网络的作者称之为开放分类网络(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)
    
    该模型以一种联合优化
    拒绝输出
    分类输出
    损失的方式进行训练

    2.将所有新类分类为单个类,然后进一步分组相似类 该研究的作者使用另一个网络来发现样本之间的相似性。他们称之为成对分类网络(PCN).PCN对两个输入是来自同一类还是不同类进行分类。我们可以使用第一个解决方案的
    嵌入
    ,并使用成对相似性度量来创建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模型作为距离函数,对看不见的类进行分组(聚类)。

    这取决于您的数据。如果您能为第三类制作足够的数据集,它可以方便地工作。(bc不需要调整阈值,但对于后一个,您应该调整。)当您没有足够的数据用于第三类时,我建议在第一个选项“将所有新类分类为单个类”中使用后一个,而不是前一个,我有一个问题。我正在使用的数据是有标签的,如果是未知样本,我们是否也使用这些样本进行训练?如果是这种情况,在一个热编码的目标类中,我们是否在每个类中都有
    0
    的样本以使它们成为未知的,或者我们是否有一个新的类“未知”要将这些图像标记为?@rshah,要使用第一个解决方案yes,您需要将未看到的图像标记为“未知”类。