因為 softmax 回歸是如此基礎,我們相信您應該知道如何自己實現它。在這里,我們限制自己定義模型的 softmax 特定方面,并重用線性回歸部分的其他組件,包括訓練循環。
import tensorflow as tf
from d2l import tensorflow as d2l
4.4.1. Softmax
讓我們從最重要的部分開始:從標量到概率的映射。作為復習,請回憶一下在張量中沿特定維度的求和運算符,如第 2.3.6 節和 第 2.3.7 節中所討論的。給定一個矩陣,X
我們可以對所有元素(默認情況下)或僅對同一軸上的元素求和。該axis
變量讓我們計算行和列的總和:
(tensor([[5., 7., 9.]]),
tensor([[ 6.],
[15.]]))
(array([[5., 7., 9.]]),
array([[ 6.],
[15.]]))
(Array([[5., 7., 9.]], dtype=float32),
Array([[ 6.],
[15.]], dtype=float32))
計算 softmax 需要三個步驟:(i)每一項取冪;(ii) 對每一行求和以計算每個示例的歸一化常數;(iii) 將每一行除以其歸一化常數,確保結果之和為 1。
分母的(對數)稱為(對數)配分函數。它是在統計物理學中引入的 ,用于對熱力學系綜中的所有可能狀態求和。實現很簡單:
def softmax(X):
X_exp = np.exp(X)
partition = X_exp.sum(1, keepdims=True)
return X_exp / partition # The broadcasting mechanism is applied here
對于任何輸入X
,我們將每個元素變成一個非負數。每行總和為 1,這是概率所要求的。注意:上面的代碼對于非常大或非常小的參數并不穩健。雖然這足以說明正在發生的事情,但您不應 將此代碼逐字用于任何嚴肅的目的。深度學習框架內置了這樣的保護,我們將在未來使用內置的 softmax。
(tensor([[0.1560, 0.2128, 0.2260, 0.2372, 0.1680],
[0.1504, 0.2473, 0.1132, 0.2779, 0.2112]]),
tensor([1.0000, 1.0000]))
(array([[0.17777154, 0.1857739 , 0.20995119, 0.23887765, 0.18762572],
[0.24042214, 0.1757977 , 0.23786479, 0.15572716, 0.19018826]]),
array([1., 1.]))
(Array([[0.17380024, 0.13607854, 0.29826194, 0.18967763, 0.20218161],
[0.24212085, 0.19360834, 0.21299706, 0.17635451, 0.17491929]], dtype=float32),
Array([1., 1.], dtype=float32))
(<tf.Tensor: shape=(2, 5), dtype=float32, numpy=
array([[0.20415688, 0.19163935, 0.25970557, 0.17480859, 0.16968955],
[0.27490872, 0.21236995, 0.12360045, 0.12381317, 0.2653077 ]],
dtype=float32)>,
<tf.Tensor: shape=(2,), dtype=float32, numpy=array([1., 1.], dtype=float32)>)
評論
查看更多