我正在嘗試實作softmax 函式,但奇怪的是我在 MATLAB 和 Python 上得到了兩個不同的輸出:
MATLAB腳本:
function sm = softmax(Y)
e_y = exp(Y - max(Y))
sm = e_y / sum(e_y)
如果Y是0.1_110x200501
同時這個Python 腳本:
import numpy as np
def softmax(y):
e_y = np.exp(y - np.max(y))
return e_y / e_y.sum()
y = np.full((10,200), fill_value=501)
print(softmax(y))
在相同的輸入上計算y,
[[0.0005 0.0005 0.0005 ... 0.0005 0.0005 0.0005]
[0.0005 0.0005 0.0005 ... 0.0005 0.0005 0.0005]
[0.0005 0.0005 0.0005 ... 0.0005 0.0005 0.0005]
...
[0.0005 0.0005 0.0005 ... 0.0005 0.0005 0.0005]
[0.0005 0.0005 0.0005 ... 0.0005 0.0005 0.0005]
[0.0005 0.0005 0.0005 ... 0.0005 0.0005 0.0005]]
這是錯誤的,因為每列的總和不是 1,而是它0.005
我錯過了什么?
uj5u.com熱心網友回復:
您真正打算做的是計算逐元素除法而不是矩陣除法:您需要在您的 MATLAB 腳本中將/運算子替換為./- 根據檔案- 該腳本(錯誤地)計算單個列向量或0.1s 而不是s 的矩陣,0.1正如Cris Luengo在他們的評論中注意到的那樣。
此外,在您的 Python 腳本中,您正在考慮整個矩陣max元素,同時您應該考慮代表單個預測的每一列,并將其標準化。那是:
def softmax(y):
e_y = np.exp(y - np.max(y, axis=0))
return e_y / np.sum(e_y, axis=0) # axis = 0
您將正確獲得一個(10,200)組成如下的成形陣列/矩陣:
array([[0.1, 0.1, 0.1, ..., 0.1, 0.1, 0.1],
[0.1, 0.1, 0.1, ..., 0.1, 0.1, 0.1],
[0.1, 0.1, 0.1, ..., 0.1, 0.1, 0.1],
...,
[0.1, 0.1, 0.1, ..., 0.1, 0.1, 0.1],
[0.1, 0.1, 0.1, ..., 0.1, 0.1, 0.1],
[0.1, 0.1, 0.1, ..., 0.1, 0.1, 0.1]])
進一步演示:
# Allocate a (3,4) matrix composed of 0..11 elements
y = np.asmatrix(np.arange(12)).reshape(3,4)
print(softmax(y))
你會得到:
matrix([[3.29320439e-04, 3.29320439e-04, 3.29320439e-04, 3.29320439e-04],
[1.79802867e-02, 1.79802867e-02, 1.79802867e-02, 1.79802867e-02],
[9.81690393e-01, 9.81690393e-01, 9.81690393e-01, 9.81690393e-01]])
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/518376.html
上一篇:為什么cell2mat將單元格陣列轉換為字符矩陣,而不是單元格內容矩陣?
下一篇:定時器回呼函式的只讀屬性
