tf.nn.log_softmax与tf.nn.softmax的关系

本文深入解析了TensorFlow中tf.nn.softmax函数的原理与应用,详细介绍了其参数、输入输出及用途,并通过实例代码展示了如何使用该函数进行概率归一化,同时对比了tf.nn.log_softmax的异同。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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进行比较)。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值