Python softmax实现及数值稳定性详解

 更新时间:2023年07月25日 17:05:24   作者:xiao蜗牛  
这篇文章主要为大家介绍了Python softmax实现及数值稳定性详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

Softmax

softmax函数将任意n维的实值向量转换为取值范围在(0,1)之间的n维实值向量,并且总和为1。

例如:向量softmax([1.0, 2.0, 3.0]) ------> [0.09003057, 0.24472847, 0.66524096]

性质:

  • 因为softmax是单调递增函数,因此不改变原始数据的大小顺序。
  • 将原始输入映射到(0,1)区间,并且总和为1,常用于表征概率。
  • softmax(x) = softmax(x+c), 这个性质用于保证数值的稳定性。

softmax的实现及数值稳定性

一个最简单的计算给定向量的softmax的实现如下:

import numpy as np
def softmax(x):
"""Compute the softmax of vector x."""
    exp_x = np.exp(x)
    softmax_x = exp_x / np.sum(exp_x)
    return softmax_x

让我们来测试一下上面的代码:

softmax([1, 2, 3])
array([0.09003057, 0.24472847, 0.66524096])

但是,当我们尝试输入一个比较大的数值向量时,就会出错:

softmax([1000, 2000, 3000])
array([nan, nan, nan])

这是由numpy中的浮点型数值范围限制所导致的。当输入一个较大的数值时,sofmax函数将会超出限制,导致出错。

为了解决这一问题,这时我们就能用到sofmax的第三个性质,即:softmax(x) = softmax(x+c),
一般在实际运用中,通常设定c = - max(x)。

接下来,我们重新定义softmax函数:

import numpy as np
def softmax(x):
"""Compute the softmax in a numerically stable way."""
    x = x - np.max(x)
    exp_x = np.exp(x)
    softmax_x = exp_x / np.sum(exp_x)
    return softmax_x

然后再次测试一下:

softmax([1000, 2000, 3000])
array([ 0.,  0.,  1.])

Done!

以上都是基于向量上的softmax实现,下面提供了基于向量以及矩阵的softmax实现,代码如下:

import numpy as np
def softmax(x):
    """
    Compute the softmax function for each row of the input x.
    Arguments:
    x -- A N dimensional vector or M x N dimensional numpy matrix.
    Return:
    x -- You are allowed to modify x in-place
    """
    orig_shape = x.shape
    if len(x.shape) > 1:
        # Matrix
        exp_minmax = lambda x: np.exp(x - np.max(x))
        denom = lambda x: 1.0 / np.sum(x)
        x = np.apply_along_axis(exp_minmax,1,x)
        denominator = np.apply_along_axis(denom,1,x) 
        if len(denominator.shape) == 1:
            denominator = denominator.reshape((denominator.shape[0],1))
        x = x * denominator
    else:
        # Vector
        x_max = np.max(x)
        x = x - x_max
        numerator = np.exp(x)
        denominator =  1.0 / np.sum(numerator)
        x = numerator.dot(denominator)
    assert x.shape == orig_shape
    return x

以上就是Python softmax实现及数值稳定性详解的详细内容,更多关于Python softmax数值稳定性的资料请关注脚本之家其它相关文章!

相关文章

  • python创建与遍历二叉树的方法实例

    python创建与遍历二叉树的方法实例

    这篇文章主要给大家介绍了关于python创建与遍历二叉树的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • 基于python实现坦克大战游戏

    基于python实现坦克大战游戏

    这篇文章主要为大家详细介绍了基于python实现坦克大战游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-10-10
  • 浅谈keras保存模型中的save()和save_weights()区别

    浅谈keras保存模型中的save()和save_weights()区别

    这篇文章主要介绍了浅谈keras保存模型中的save()和save_weights()区别,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • Python使用Kafka处理数据的方法详解

    Python使用Kafka处理数据的方法详解

    Kafka是一个分布式的流数据平台,它可以快速地处理大量的实时数据。在Python中使用Kafka可以帮助我们更好地处理大量的数据,本文就来和大家详细讲讲具体使用方法吧
    2023-04-04
  • Keras搭建分类网络平台VGG16 MobileNet ResNet50

    Keras搭建分类网络平台VGG16 MobileNet ResNet50

    这篇文章主要为大家介绍了Keras搭建分类网络平台VGG16 MobileNet ResNet50,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • Python基于codecs模块实现文件读写案例解析

    Python基于codecs模块实现文件读写案例解析

    这篇文章主要介绍了Python基于codecs实现文件读写案例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • ansible作为python模块库使用的方法实例

    ansible作为python模块库使用的方法实例

    ansible是一个python package,是个完全的unpack and play软件,对客户端唯一的要求是有ssh有python,并且装了python-simplejson包,部署上简单到发指。下面这篇文章就给大家主要介绍了ansible作为python模块库使用的方法实例,需要的朋友可以参考借鉴。
    2017-01-01
  • Python实现将Excel内容插入到Word模版中

    Python实现将Excel内容插入到Word模版中

    前段时间因为需要处理一大堆验收单,都是一些简单的复制粘贴替换工作,于是就想到用python进行处理。本文分享了用python将excel文件单元格内容插入到word模版中并保存为新文件的办法,希望对大家有所帮助
    2023-03-03
  • pytorch载入预训练模型后,实现训练指定层

    pytorch载入预训练模型后,实现训练指定层

    今天小编就为大家分享一篇pytorch载入预训练模型后,实现训练指定层,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • 利用python绘制笛卡尔直角坐标系

    利用python绘制笛卡尔直角坐标系

    这篇文章主要介绍了利用python绘制笛卡尔直角坐标系,python绘图主要用到matplotlib绘图模块,利用matplotlib模块画出上面的正弦函,需要的朋友可以参考一下
    2022-03-03

最新评论