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
在看了上面的解析之后,我们一起来看看下面的代码:
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类,因为他的概率最大(一共四类)
tf.nn.log_softmax链接
tf.nn.log_softmax(
logits,
axis=None,
name=None,
dim=None
)
这个api实现的功能简单,就是把softmax的结果再进行log计算一遍。先来看一下它和tf.nn.softmax的异同,以及实现代码,然后再讨论一下为什么会有这个api的存在。
官网给出了具体计算的公式:
logsoftmax = logits - log(reduce_sum(exp(logits), axis))
先说下logits。logits一般是模型最后一层的输出,维度为[batch_size, num_class],表示的含义是有batch_size个样本,每个样本用num_class个向量来表示。最终我们要得到几分类问题,那么这个num_class就是几。
假设现在的logits为3*3的矩阵:
[
[0.3, 0.3, 0.2],
[0, 1, 0.5],
[1, 1, 0]
]
用第一行[0.3, 0.3, 0.2]来举例计算(axis=1时用行来计算,axis=0时用列来计算)
我是这样理解的,当axis=1,计算按照行来运算,axis=0时按照列来运算。
3.存在意义
logsoftmax我在网上找来找去,最多的说法是说,用了它会让速度变快,数据稳定。但是个人理解就是为手动计算softmax交叉熵loss提供可能。毕竟手动计算softmax交叉熵loss是需要对softmax的结果做log的,直接调用这个log_softmax更方便(要和label进行比较)。