如何为 CNN 的每个班级获得 0 到 1 之间的分数?

Posted

技术标签:

【中文标题】如何为 CNN 的每个班级获得 0 到 1 之间的分数?【英文标题】:How to get a score between 0 and 1 for each class for a CNN? 【发布时间】:2017-09-18 08:20:55 【问题描述】:

我目前正在训练一个网络(用 Tensorflow 实现的 CNN)来对 3 个以上的类进行分类,问题是我最终得到的分数如下:

[ -20145.36, 150069, 578456.3 ].

我想要一个介于 0 和 1 之间的分数(某种概率)。

起初,我考虑使用 sigmoid 函数,但后来发现这个讨论甚至没有提到:

https://www.quora.com/How-do-you-normalize-numeric-scores-to-a-0-1-range-for-comparing-different-machine-learning-techniques

你建议我怎么做才能让每门课的分数在 0 到 1 之间?

谢谢

【问题讨论】:

tf.nn.softmax() 会将网络输出转换为有效的概率分布,即所有概率都在 0 和 1 之间并且它们总和为 1。有关 TensorFlow 文档,请参见此处:@987654322 @这里解释一下:tensorflow.org/get_started/mnist/beginners 【参考方案1】:

作为最后一层,你总是使用 softmax 来获得 n 类分类分数。所以,你有很多选择,正如tensorflow classification docs 中提到的那样。

最简单的就是使用tf.nn.softmax()

softmax = exp(logits) / reduce_sum(exp(logits), dim)

例子:

In [63]: ar = np.array([ -20145.36, 150069, 578456.3 ])

In [64]: scores = tf.nn.softmax(ar)

In [65]: sess = tf.InteractiveSession()

In [66]: scores.eval()
Out[66]: array([ 0.,  0.,  1.])

【讨论】:

以上是关于如何为 CNN 的每个班级获得 0 到 1 之间的分数?的主要内容,如果未能解决你的问题,请参考以下文章

如何为班级编写@Bean? [复制]

如何为开始日期和结束日期之间的每个工作日创建多行

如何为 2 个相同的班级选择正确的名称? [关闭]

训练精度提高但验证精度仍然是每个班级的机会(1/班级数)

PySpark:如何为数组列中的每个元素添加值?

gnuplot:如何为数字 1-999 获得 %c 零空间?