【问题标题】:How to get correct acccuracy for multi label prediction?如何获得正确的多标签预测精度?
【发布时间】:2018-03-10 15:03:35
【问题描述】:

我正在尝试获得一个可以进行多标签预测的 tensorflow 网络。使用带有 one-hot(单标签)预测的 softmax 可以正常工作。准确度得到了完美的计算,网络按照它应该的方式学习。

我的基本网络设置是:

X = tf.placeholder(features.dtype, (None, 300), name="input")
y = tf.placeholder(hots.dtype, (None,64), name="labels")    

with tf.name_scope("dnn"):
    hidden1 = fully_connected(X, 900, scope="hidden1")
    hidden2 = fully_connected(hidden1, 450, scope="hidden2")
    hidden3 = fully_connected(hidden2, 225, scope="hidden3")
    logits = fully_connected(hidden3, max, scope="outputs", activation_fn=None)

with tf.name_scope("loss"):
    xentropy = tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=logits)
    loss = tf.reduce_mean(xentropy, name="loss")

learning_rate = 0.05

with tf.name_scope("train"):
    optimizer = tf.train.GradientDescentOptimizer(learning_rate)
    training_op = optimizer.minimize(loss)

with tf.name_scope("eval"):
    correct = tf.nn.in_top_k(logits, tf.argmax(y,1), 1)
    accuracy = tf.reduce_mean(tf.cast(correct, tf.float32))

因为目标是得到多标签预测,所以我改变了损失和准确率:(基于Tensorflow, multi label accuracy calculation

with tf.name_scope("loss"):
    xentropy = tf.nn.sigmoid_cross_entropy_with_logits(labels=tf.cast(y, tf.float32), logits=logits)
    loss = tf.reduce_mean(xentropy, name="loss")

with tf.name_scope("eval"): 
    correct_prediction = tf.equal(tf.round(tf.nn.sigmoid(logits)), tf.round(tf.cast(y, tf.float32)))
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

但是,这会导致每个 epoch 的准确度为 Train accuracy: 0.984375 Test accuracy: 0.984375(使用单个标签 one-hot 数据)。它不会改变,它总是这个数字。

我对多标签的准确度计算进行了很多测试,但找不到一个能真正给我正确结果的方法。我在这里想念什么?

【问题讨论】:

  • 你的分类是二分类还是多分类?而 JFYI in_top_k 是准确度测量的危险选择 - stackoverflow.com/q/48993004/712995
  • @Maxim 我使用 [0,0,0,1,0,0] 之类的标签,以及多标签 [0,1,0,0,1,0,] 等标签。跨度>
  • 感谢您提供有关in_top_k 的信息,我会调查的。
  • @Maxim 知道如何获得这个多标签的准确性吗?

标签: python tensorflow machine-learning multilabel-classification


【解决方案1】:

最后,经过无数次尝试修复这个问题,结果一切正常,除了优化器。当使用 AdamOptimizer() 而不是 GradientDescentOptimizer(learning_rate) 时,网络开始快速学习,在 40 个 epoch 内从 0.7 到 0.97 准确度。

也许对学习率进行一些调整也可以让它工作,但现在这个问题终于解决了!

【讨论】:

  • 我认为这里仍然缺少一些东西。 tf.equal() 是否考虑了 TN(真阴性)?
猜你喜欢
  • 2015-01-27
  • 2015-11-21
  • 2018-10-18
  • 1970-01-01
  • 2017-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多