如何获得多标签预测的正确准确性?
How to get correct acccuracy for multi label prediction?
我正在尝试获得一个进行多标签预测的张量流网络。将 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))
因为目标是得到多标签预测,所以我改变了loss和accuracy:(基于)
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))
然而,这导致每个时期的准确度为 Train accuracy: 0.984375 Test accuracy: 0.984375
(使用单标签 one-hot 数据)。它不会改变,它永远是这个数字。
我测试了很多多标签的准确度计算,但找不到真正能给我正确结果的。我在这里错过了什么?
最后,经过无数次尝试修复此问题,结果证明一切正常,除了优化器。当使用 AdamOptimizer()
而不是 GradientDescentOptimizer(learning_rate)
时,网络开始快速学习,在 40 个时期内从 0.7 到 0.97 的准确度。
也许对学习率进行一些调整也可以使它起作用,但现在终于解决了!
我正在尝试获得一个进行多标签预测的张量流网络。将 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))
因为目标是得到多标签预测,所以我改变了loss和accuracy:(基于
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))
然而,这导致每个时期的准确度为 Train accuracy: 0.984375 Test accuracy: 0.984375
(使用单标签 one-hot 数据)。它不会改变,它永远是这个数字。
我测试了很多多标签的准确度计算,但找不到真正能给我正确结果的。我在这里错过了什么?
最后,经过无数次尝试修复此问题,结果证明一切正常,除了优化器。当使用 AdamOptimizer()
而不是 GradientDescentOptimizer(learning_rate)
时,网络开始快速学习,在 40 个时期内从 0.7 到 0.97 的准确度。
也许对学习率进行一些调整也可以使它起作用,但现在终于解决了!