如何使用张量流对一类数据进行分类?

时间:2018-08-05 17:13:13

标签: tensorflow deep-learning

我有一个用TensorFlow编写的引人入胜的代码。此代码适用于多个类。我想将代码更改为一个类,以便可以教零类并将与零类数据不同的任何数据标识为非零。我在最后一层使用了S型函数和一个神经元。我的模型训练很容易,但是在测试时,它只能为任何其他类型的数据识别同一类。 我把代码放在下面。 如何更改它以识别非班级?

    h_drop = tf.nn.dropout(h_pool_flat, keep_prob=self.keep_prob)
    # Softmax
    with tf.name_scope('softmax'):
        softmax_w = tf.Variable(tf.truncated_normal([num_filters_total, self.num_classes], stddev=0.1), name='softmax_w')
        softmax_b = tf.Variable(tf.constant(0.1, shape=[self.num_classes]), name='softmax_b')

        # Add L2 regularization to output layer
        self.l2_loss += tf.nn.l2_loss(softmax_w)
        self.l2_loss += tf.nn.l2_loss(softmax_b)

        self.logits = tf.matmul(h_drop, softmax_w) + softmax_b
        predictions = tf.nn.sigmoid(self.logits)
        print(predictions)
        **self.predictions = tf.argmax(predictions, 1, name='predictions')**

    # Loss
    with tf.name_scope('loss'):
        losses = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=self.input_y, logits=self.logits)
        # Add L2 losses
        self.cost = tf.reduce_mean(losses) + self.l2_reg_lambda * self.l2_loss

    # Accuracy
    with tf.name_scope('accuracy'):
        correct_predictions = tf.equal(self.predictions, self.input_y)
        print(self.input_y)
        print(self.predictions)
        self.correct_num = tf.reduce_sum(tf.cast(correct_predictions, tf.float32))
        self.accuracy = tf.reduce_mean(tf.cast(correct_predictions, tf.float32), name='accuracy')

此行需要更改,但我不知道如何。 self.predictions = tf.argmax(predictions,1,name ='predictions') 你可以引导我吗?

1 个答案:

答案 0 :(得分:0)

可视化您的概念错误:如果您受过训练来识别猫的图像,并且每次在训练期间正确呼唤“猫”,您都会得到cookie,如果突然看到狗的图像,您会怎么说?
 -确切地说,说“猫”,因为您仍然可以获取Cookie。

更具体地说,如果没有在培训期间针对这两种情况的示例,则您的网络无法了解“正确”或“错误”的含义。 没有负面的例子,您的培训就无法在经典意义上进行,因为对于网络来说,无论您说什么,这都是已知的单一课程,这对网络总是“有益的”。

存在单一类别分类的研究领域(例如,参见thisthis论文),但到目前为止,我想说的是,使用一些否定的例子来进行更有意义获得不错的性能,尤其是当您手头上有大量随时可用的训练数据时(即MNIST中的非零图像)。