tf.nn.softmax官方连接
tf.nn.softmax(
logits,
axis=None,
name=None,
dim=None
)
- 作用:softmax函数的作用就是归一化。
- 输入: 全连接层(往往是模型的最后一层)的值,一般代码中叫做logits
- 输出: 归一化的值,含义是属于该位置的概率,一般代码叫做probs。例如输入[0.4,0.1,0.2,0.3],那么这个样本最可能属于第0个位置,也就是第0类。这是由于logits的维度大小就设定的是任务的类别,所以第0个位置就代表第0类。softmax函数的输出不改变维度的大小。
- 用途:如果做单分类问题,那么输出的值就取top1(最大,argmax);如果做多(N)分类问题,那么输出的值就取topN
- 跟tf.nn.softmax_cross_entropy_with_logits_v2的区别
- tf.nn.softmax_cross_entropy_with_logits_v2 与tf.nn.sparse_softmax_cross_entropy_with_logits 及交叉熵loss的区别
例子:
import tensorflow as tf
array = [4, -1, 0.01, 2]
with tf.Session() as sess:
print('softmax_a :', sess.run(tf.nn.softmax(array)))
结果:
从结果中分析出array最有可能是第0类(一共四类)
本篇的api比较简单,就是一个调用,所以来详细说说什么是softmax?为什么要用到softmax?
写在前面:我一直对softmax有很多很多的疑问,为什么要用到softmax?原理是什么?好处是什么等等。但是苦苦寻找很久也没有一篇能让我真正满意的,直到我看到了这篇:softmax和cross-entropy是什么关系? 真的写的比较通透。所以本篇是在这篇基础上的一些改造和补充。
一、softmax是什么?
是一个函数,是一个“ 可以把随便一个序列变成概率序列 “ 的函数。
变成怎样的概率序列?变成每个数字都在[0,1)之间,且数字的和加起来都等于1的概率序列。
怎么变的?=> 怎么计算的?
具体的公式:
解释一下:i循环取logits里面的每个数,k是在i循环的同时,再把batchszie循环一遍。公式中的batchsize就是图中的n
这样就达到了归一化的效果。归一,且是概率,这就是使用softmax的目的。
二、为什么要用softmax?
我想到的有两点:
- 反向传播要保证有梯度,缓解梯度消失问题
- 为了多分类
softmax满足大的越大,小的越小的特点(前面放的链接中有详细例子说明,这里不赘述)。小于1的数,在反向传播的时候,链式求导后,会越来越趋近于0.求到最后可能只有最大的那个数还在,其他的都消失了。
第二个是多分类问题。其实做多分类现在惯用两个策略:
- 使用softmax求topN。
- 使用sigmoid,根据分数设置一个阈值,大于这个值的结果都取出来,也不知道有多少个。
两种策略各有各的优点。(目前还没法比较哪个更好,这是一个TODO)