python3實現softmax + 函數曲線繪製

python3實現softmax + 函數曲線繪製

import numpy as np

# 實現方法1
def softmax(x):
    return np.exp(x)/np.sum(np.exp(x), axis=0)

# 是想方法2
def softmax2(x):
    """Compute softmax values for each sets of scores in x."""
    x = np.array(x)
    x = np.exp(x)

    if x.ndim == 1:
        sumcol = sum(x)
        for i in range(x.size):
            x[i] = x[i]/float(sumcol)
    if x.ndim > 1:
        sumcol = x.sum(axis = 0)
        for row in x:
            for i in range(row.size):
                row[i] = row[i]/float(sumcol[i])
    return x


data1 = [1]
data2 = [0]
data3 = [1,2,3,4]
data4 = [[1,5,7,3],[2,3,4,5]]
data5 = [[[1,2],[5,3]],[[9,18],[4,22]]]

print(softmax(data1) ,"\n")
print(softmax(data2) ,"\n")
print(softmax(data3) ,"\n")
print(softmax(data4) ,"\n")
print(softmax(data5) ,"\n")

print(softmax2(data1) ,"\n")
print(softmax2(data2) ,"\n")
print(softmax2(data3) ,"\n")
print(softmax2(data4) ,"\n")
print(softmax2(data5) ,"\n")

輸出

[ 1.] 

[ 1.] 

[ 0.0320586   0.08714432  0.23688282  0.64391426] 

[[ 0.26894142  0.88079708  0.95257413  0.11920292]
 [ 0.73105858  0.11920292  0.04742587  0.88079708]] 

[[[  3.35350130e-04   1.12535162e-07]
  [  7.31058579e-01   5.60279641e-09]]

 [[  9.99664650e-01   9.99999887e-01]
  [  2.68941421e-01   9.99999994e-01]]] 

[ 1.] 

[ 1.] 

[ 0.0320586   0.08714432  0.23688282  0.64391426] 

[[ 0.26894142  0.88079708  0.95257413  0.11920292]
 [ 0.73105858  0.11920292  0.04742587  0.88079708]] 

Traceback (most recent call last):
  File "/Users/hupeng/Documents/mlNotes/softmax.py", line 41, in <module>
    print(softmax2(data5) ,"\n")
  File "/Users/hupeng/Documents/mlNotes/softmax.py", line 21, in softmax2
    row[i] = row[i]/float(sumcol[i])
TypeError: only length-1 arrays can be converted to Python scalars

最後一行報錯了, 因爲方法數組越界了
softmax 是將一些列數據歸一化到0-1之間, 所以運用場景中必定會是一維數據或是變向的一維數據
softmax 數學公式

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-10, 10, 200)
y = softmax(x)
print(x,y)
plt.plot(x,y)
plt.show()

繪製一下曲線,結果如圖
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章