【问题标题】:Tensorflow argmax give false indizesTensorflow argmax 给出错误的索引
【发布时间】:2017-05-06 01:15:52
【问题描述】:

我正在使用 tensorflow 来训练和使用一个小型神经网络(具有两个类的 2d 分类),但是我遇到了一个非常奇怪的问题并且看不到我做错了什么: 当我只为精度评估为 1 的测试批次绘制 the predictions vs the true labels 时,我显然有一些错误分类的样本。在我看来,tf.argmax 负责错误地评估为 1 的准确性,但显然这不是真正的原因。 无论如何,我通过计算最后一层输出的准确率得出了这个结论:

with tf.name_scope('accuracy'):
    plabel = tf.argmax(y, 1) # vector of predicted label, elem {0,1}^batch_size
    tlabel = tf.argmax(y_, 1) # similar vector of true labels
    correct_predictions = tf.cast(tf.equal(plabel, tlabel), tf.float32) 
...
with tf.Session() as sess:
    batchx, batchy = generate_batch()
    predictions, acc = sess.run([y, accuracy], feed_dict={x: batchx, y_: batchy})
    mistakes = 0.
    for j in range(batch_size):
        if (predictions[j, 0] - predictions[j, 1])*(batchy[j, 0] - batchy[j, 1]) < 0:
            print("mistake: ", predictions[j], batchy[j])
            mistakes += 1./batch_size
    print("Acc = {} / {} = 1-m/b".format(acc, 1. - mistakes))

x 和 y_ 是输入张量,y 是最后一层,模型已经训练完毕。

它给了我以下输出:

Acc = 1.0 / 0.86 = 1-m/b

这些值应该相同。

该图还表明真实准确度不是 1,或者评估的准确度张量与预测 (y) 不属于同一运行。

我没有发现任何暗示 tf.argmax 确实是问题所在,我非常绝望。所以提前感谢您的帮助

【问题讨论】:

    标签: tensorflow


    【解决方案1】:

    看来你的准确度函数是正确的,因为你没有发布完整的代码,我建议你在会话中计算准确度,这样每次你都可以打印预测的内容和真实的标签并跟踪执行。

    获取predictions = sess.run(y, feed_dict={x: batchx, y_: batchy}) 之类的预测,然后通过print predictions.eval() 打印预测,然后使用plabel = tf.argmax(predictions, 1),再次使用print plabel.eval(),还有print batchyprint (tf.argmax(batchy)).eval()

    现在您应该知道每个 print 语句出了什么问题。

    【讨论】:

    • 我像这样修改了代码,在删除了所有只打印了您期望的内容的调试打印后,它仍然存在:acc, predictions, corrects, p, t = sess.run([accuracy, y, correct_predictions, plabel, tlabel], feed_dict=f) - for j in range(batch_size): print("This should be 1: ", fdict[y_][j, t[j]]) - 但有时它会打印 0。
    • 好吧,这只是一个错字,在我的原始代码中,我使用了错误的提要字典。对不起,谢谢
    【解决方案2】:

    为了准确:

    def evaluate(X_data, y_data):
        num_examples = len(X_data)
        total_accuracy = 0
        sess = tf.get_default_session()
        for offset in range(0, num_examples, BATCH_SIZE):
            batch_x, batch_y = X_data[offset:offset+BATCH_SIZE], y_data[offset:offset+BATCH_SIZE]
            accuracy = sess.run(accuracy_operation, feed_dict={x: batch_x, y: batch_y})
            total_accuracy += (accuracy * len(batch_x))
        return total_accuracy / num_examples
    

    用于获得预测:

    prediction = sess.run(tf.argmax(logits, 1), feed_dict={x: train_data})
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多