我试图从tensorflow提供的CIFAR-10示例的修改版本绘制ROC曲线。它现在有2个班而不是10个班。
网络的输出称为logits,其格式为:
[[ - 2.57313061 2.57966399] [0.04221377 -0.04033273] [-1.42880082 1.43337202] [-2.7692945 2.78173304] [-2.48195744 2.49331546] [2.0941515 -2.10268974] [-3.51670194 3.53267646] [-2.74760485 2.75617766] ...]
首先,这些logits实际代表什么?网络中的最后一层是" softmax linear"形式WX + b。
该模型可以通过调用
来计算准确度top_k_op = tf.nn.in_top_k(logits, labels, 1)
然后在图表初始化后:
predictions = sess.run([top_k_op])
predictions_int = np.array(predictions).astype(int)
true_count += np.sum(predictions)
...
precision = true_count / total_sample_count
这很好用。
但是现在如何从中绘制ROC曲线?
我一直在尝试" sklearn.metrics.roc_curve()"功能(http://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_curve.html#sklearn.metrics.roc_curve),但我不知道如何使用我的" y_score"参数。
任何帮助将不胜感激!
答案 0 :(得分:1)
'y_score'这里应该是一个数组,对应于每个样本被分类为正数的概率(如果你的y_true数组中标记为1则为正)
实际上,如果您的网络使用Softmax作为最后一层,那么模型应输出此实例的每个类别的概率。但是您在此处提供的数据不符合此格式。我检查了示例代码:https://github.com/tensorflow/tensorflow/blob/r0.10/tensorflow/models/image/cifar10/cifar10.py 它似乎使用了名为softmax_linear的层,我对这个例子知之甚少,但我想你应该用Logistic Function处理输出,把它变成概率。
然后将它与您的真实标签'y_true'一起提供给scikit-learn函数:
y_score = np.array(output)[:,1]
roc_curve(y_true, y_score)
答案 1 :(得分:-1)
import tensorflow as tf
tp = [] # the true positive rate list
fp = [] # the false positive rate list
total = len(fp)
writer = tf.train.SummaryWriter("/tmp/tensorboard_roc")
for idx in range(total):
summt = tf.Summary()
summt.value.add(tag="roc", simple_value = tp[idx])
writer.add_summary (summt, tp[idx] * 100) #act as global_step
writer.flush ()
然后开始张量板:
tensorboard --logdir=/tmp/tensorboard_roc
有关详细信息和代码,您可以访问我的博客:http://blog.csdn.net/mao_feng/article/details/54731098