softmax层_tf.nn.softmax

softmax函数用于将全连接层的输出归一化为概率分布,确保每个值在0到1之间且总和为1。它在单分类和多分类问题中有不同用途,如取top1或topN。softmax有助于缓解梯度消失问题,适用于多分类任务。在反向传播中,softmax使大值更大,小值更小,有利于训练。在多分类中,可以与交叉熵损失函数结合使用。
摘要由CSDN通过智能技术生成

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)))

结果:

10512dcf56328878b7f26244277ecac1.png

从结果中分析出array最有可能是第0类(一共四类)


本篇的api比较简单,就是一个调用,所以来详细说说什么是softmax?为什么要用到softmax?

写在前面:我一直对softmax有很多很多的疑问,为什么要用到softmax?原理是什么?好处是什么等等。但是苦苦寻找很久也没有一篇能让我真正满意的,直到我看到了这篇:softmax和cross-entropy是什么关系? 真的写的比较通透。所以本篇是在这篇基础上的一些改造和补充。

一、softmax是什么?

是一个函数,是一个“ 可以把随便一个序列变成概率序列 “ 的函数。

变成怎样的概率序列?变成每个数字都在[0,1)之间,且数字的和加起来都等于1的概率序列。

怎么变的?=> 怎么计算的?

0b4413317663108b66958087a32f1630.png

具体的公式:

解释一下:i循环取logits里面的每个数,k是在i循环的同时,再把batchszie循环一遍。公式中的batchsize就是图中的n

这样就达到了归一化的效果。归一,且是概率,这就是使用softmax的目的。

二、为什么要用softmax?

我想到的有两点:

  1. 反向传播要保证有梯度,缓解梯度消失问题
  2. 为了多分类

softmax满足大的越大,小的越小的特点(前面放的链接中有详细例子说明,这里不赘述)。小于1的数,在反向传播的时候,链式求导后,会越来越趋近于0.求到最后可能只有最大的那个数还在,其他的都消失了。

第二个是多分类问题。其实做多分类现在惯用两个策略:

  • 使用softmax求topN。
  • 使用sigmoid,根据分数设置一个阈值,大于这个值的结果都取出来,也不知道有多少个。

两种策略各有各的优点。(目前还没法比较哪个更好,这是一个TODO)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值