机器学习入门(04)— 神经网络多维数组 NumPy 相乘运算
1. 多維數(shù)組
用 NumPy 構(gòu)建多維數(shù)組代碼示例如下:
In [1]: import numpy as npIn [2]: A = np.array([1,2,3,4])In [3]: A
Out[3]: array([1, 2, 3, 4])In [4]: np.ndim(A)
Out[4]: 1In [5]: A.shape
Out[5]: (4,)In [6]: A.shape[0]
Out[6]: 4In [7]:
從以上可以看出:
- 數(shù)組的維數(shù)可以通過
np.ndim()函數(shù)獲得; - 數(shù)組的形狀可以通過實(shí)例變量
shape獲得;
注意,這里的 A.shape 的結(jié)果是個(gè)元組( tuple )。這是因?yàn)橐痪S數(shù)組的情況下也要返回和多維數(shù)組的情況下一致的結(jié)果。
例如,二維數(shù)組時(shí)返回的是元組(4,3),三維數(shù)組時(shí)返回的是元組(4,3,2),因此一維數(shù)組時(shí)也同樣以元組的形式返回結(jié)果。
生成一個(gè)二維數(shù)組:
In [7]: B = np.array([[1,2], [3, 4], [5, 6]])In [8]: B
Out[8]:
array([[1, 2],[3, 4],[5, 6]])In [9]: B.shape
Out[9]: (3, 2)In [11]: B.ndim
Out[11]: 2In [12]:
這里生成了一個(gè) 3 × 2 的數(shù)組 B 。3 × 2 的數(shù)組表示第一個(gè)維度有 3 個(gè)元素,第二個(gè)維度有 2 個(gè)元素。另外,第一個(gè)維度對(duì)應(yīng)第 0 維,第二個(gè)維度對(duì)應(yīng)第 1 維。二維數(shù)組也稱為矩陣( matrix )。
2. 矩陣相乘
2 × 2 的矩陣,其乘積可以像圖 3-11 這樣進(jìn)行計(jì)算:
矩陣的乘積是通過左邊矩陣的行(橫向)和右邊矩陣的列(縱向)以對(duì)應(yīng)元素的方式相乘后再求和而得到的。并且,運(yùn)算的結(jié)果保存為新的多維數(shù)組的元素。
比如,A 的第 1 行和 B 的第 1 列的乘積結(jié)果是新數(shù)組的第 1 行第 1 列的元素,A 的第 2 行和 B 的第 1 列的結(jié)果是新數(shù)組的第 2 行第 1 列的元素。
用代碼實(shí)現(xiàn):
In [12]: A = np.array([[1,2], [3,4]])In [13]: B = np.array([[5,6], [7,8]])In [14]: A
Out[14]:
array([[1, 2],[3, 4]])In [15]: B
Out[15]:
array([[5, 6],[7, 8]])In [16]: A.dot(B)
Out[16]:
array([[19, 22],[43, 50]])In [17]: np.dot(A, B)
Out[17]:
array([[19, 22],[43, 50]])In [18]: np.dot(B, A)
Out[18]:
array([[23, 34],[31, 46]])In [19]:
A 和 B 都是 2 × 2 的矩陣,它們的乘積可以通過 NumPy 的 np.dot() 函數(shù)計(jì)算(乘積也稱為點(diǎn)積)。 np.dot() 接收兩個(gè) NumPy 數(shù)組作為參數(shù),并返回?cái)?shù)組的乘積。
這里要注意的是, np.dot(A, B) 和 np.dot(B, A) 的值可能不一樣。和一般的運(yùn)算( + 或 * 等)不同,矩陣的乘積運(yùn)算中,操作數(shù)( A 、 B )的順序不同,結(jié)果也會(huì)不同。
注意:
- 矩陣
A的形狀是 2 × 3,矩陣B的形狀是 3 × 2,矩陣A的第 1 維的元素個(gè)數(shù)(3)和矩陣B的第 0 維的元素個(gè)數(shù)(3)相等。如果這兩個(gè)值不相等,則無法計(jì)算矩陣的乘積。 - 運(yùn)算結(jié)果的矩陣
C的形狀是由矩陣A的行數(shù)和矩陣B的列數(shù)構(gòu)成的。
In [19]: B = np.array([7,8])In [20]: A = np.array([[1,2], [3, 4]])In [22]: B
Out[22]: array([7, 8])In [23]: A
Out[23]:
array([[1, 2],[3, 4]])In [24]: np.dot(B, A)
Out[24]: array([31, 46])In [25]: B.shape
Out[25]: (2,)In [26]: A.shape
Out[26]: (2, 2)In [27]:
In [27]: A = np.array([[1,2], [3, 4], [5,6]])In [28]: A
Out[28]:
array([[1, 2],[3, 4],[5, 6]])In [29]: A.shape
Out[29]: (3, 2)In [30]: B = np.array([7,8])In [31]: B
Out[31]: array([7, 8])In [32]: B.shape
Out[32]: (2,)In [33]: np.dot(A, B)
Out[33]: array([23, 53, 83])In [34]:
3. 神經(jīng)網(wǎng)絡(luò)的內(nèi)積
使用 NumPy 矩陣來實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)。這里我們以圖 3-14 中的簡(jiǎn)單神經(jīng)網(wǎng)絡(luò)為對(duì)象。這個(gè)神經(jīng)網(wǎng)絡(luò)省略了偏置和激活函數(shù),只有權(quán)重。
實(shí)現(xiàn)該神經(jīng)網(wǎng)絡(luò)時(shí),要注意 X 、 W 、 Y 形狀,特別是 X 和 W 的對(duì)應(yīng)維度的元素個(gè)數(shù)是否一致,這一點(diǎn)很重要。
In [1]: import numpy as npIn [2]: X = np.array([1,2])In [3]: W = np.array([[1,3,5], [2,4,6]])In [5]: X
Out[5]: array([1, 2])In [6]: W
Out[6]:
array([[1, 3, 5],[2, 4, 6]])In [7]: Y = np.dot(X, W)In [8]: Y
Out[8]: array([ 5, 11, 17])In [9]:
如上所示,使用 np.dot (多維數(shù)組的點(diǎn)積),可以一次性計(jì)算出 Y 的結(jié)果。這意味著,即便 Y 的元素個(gè)數(shù)為100 或 1000,也可以通過一次運(yùn)算就計(jì)算出結(jié)果。
如果不使用 np.dot ,就必須單獨(dú)計(jì)算 Y 的每一個(gè)元素(或者說必須使用 for 語(yǔ)句),非常麻煩。
參考:《深度學(xué)習(xí)入門:基于Python的理論與實(shí)現(xiàn)》
總結(jié)
以上是生活随笔為你收集整理的机器学习入门(04)— 神经网络多维数组 NumPy 相乘运算的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 乌镇对警察免费吗
- 下一篇: 机器学习入门(05)— 使用 NumPy