我有一个用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') 你可以引导我吗?
答案 0 :(得分:0)
可视化您的概念错误:如果您受过训练来识别猫的图像,并且每次在训练期间正确呼唤“猫”,您都会得到cookie,如果突然看到狗的图像,您会怎么说?
-确切地说,说“猫”,因为您仍然可以获取Cookie。
更具体地说,如果没有在培训期间针对这两种情况的示例,则您的网络无法了解“正确”或“错误”的含义。 没有负面的例子,您的培训就无法在经典意义上进行,因为对于网络来说,无论您说什么,这都是已知的单一课程,这对网络总是“有益的”。
存在单一类别分类的研究领域(例如,参见this和this论文),但到目前为止,我想说的是,使用一些否定的例子来进行更有意义获得不错的性能,尤其是当您手头上有大量随时可用的训练数据时(即MNIST中的非零图像)。