国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Python - softmax 實現

史占廣 / 939人閱讀

摘要:函數將任意維的實值向量轉換為取值范圍在之間的維實值向量,并且總和為。將原始輸入映射到區間,并且總和為,常用于表征概率。這個性質用于保證數值的穩定性。當輸入一個較大的數值時,函數將會超出限制,導致出錯。

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/38689.html

相關文章

  • mnist 機器學習入門筆記(一) 學習softmax模型

    摘要:首先需要添加一個新的占位符用于輸入正確值計算交叉熵的表達式可以實現為現在我們知道我們需要我們的模型做什么啦,用來訓練它是非常容易的。 學習softmax回歸模型 一. 下載mnist數據集 新建一個download.py 代碼如下: Functions for downloading and reading MNIST data. from __future__ import abso...

    shengguo 評論0 收藏0
  • 使用 LSTM 智能作詩送新年祝福

    摘要:經過第一步的處理已經把古詩詞詞語轉換為可以機器學習建模的數字形式,因為我們采用算法進行古詩詞生成,所以還需要構建輸入到輸出的映射處理。 LSTM 介紹 序列化數據即每個樣本和它之前的樣本存在關聯,前一數據和后一個數據有順序關系。深度學習中有一個重要的分支是專門用來處理這樣的數據的——循環神經網絡。循環神經網絡廣泛應用在自然語言處理領域(NLP),今天我們帶你從一個實際的例子出發,介紹循...

    lauren_liuling 評論0 收藏0

發表評論

0條評論

史占廣

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<