『ゼロから作るDeep Learning』3章続き。
ニューラルネットワークの実装で多次元配列が必要。
そこでPythonのNumPyの多次元配列操作を改めて詳しく学ぶ。
>>> import numpy as np
>>> A = np.array([ [1,2], [3,4], [5,6] ])
>>> A
array([[1, 2],
[3, 4],
[5, 6]])
>>> A.shape
(3, 2)
>>> A.ndim
2
>>> B = np.array([ [1], [2,3], [4,5,6] ])
>>> B
array([[1], [2, 3], [4, 5, 6]], dtype=object)
>>> B.shape
(3,)
>>> B.ndim
1
>>> C = np.array([ [1,2,3], [4,5], [6] ])
>>> C
array([[1, 2, 3], [4, 5], [6]], dtype=object)
>>> C.shape
(3,)
>>> C.ndim
1
>>> A = np.array([ [1,2], [3,4] ])
>>> A
array([[1, 2],
[3, 4]])
>>> A.shape
(2, 2)
>>> B = np.array([ [5,6], [7,8] ])
>>> B
array([[5, 6],
[7, 8]])
>>> B.shape
(2, 2)
>>> np.dot(A, B)
array([[19, 22],
[43, 50]])
>>> 1*5 + 2*7
19
>>> 3*5 + 4*7
43
>>> 1*6 + 2*8
22
>>> 3*6 + 4*8
50
>>> np.dot(B, A)
array([[23, 34],
[31, 46]])
>>> C = np.array([ [1,2,3], [4,5,6] ])
>>> C
array([[1, 2, 3],
[4, 5, 6]])
>>> C.shape
(2, 3)
>>> D = np.array([ [1,2], [3,4], [5,6] ])
>>> D
array([[1, 2],
[3, 4],
[5, 6]])
>>> D.shape
(3, 2)
>>> np.dot(C, D)
array([[22, 28],
[49, 64]])
>>> np.dot(C, D).shape
(2, 2)
>>> np.dot(D, C)
array([[ 9, 12, 15],
[19, 26, 33],
[29, 40, 51]])
>>> np.dot(D, C).shape
(3, 3)
>>>
...
...
>>>
...
>>> C
array([[1, 2, 3],
[4, 5, 6]])
>>> E = C
>>> E
array([[1, 2, 3],
[4, 5, 6]])
>>> C.shape
(2, 3)
>>> E.shape
(2, 3)
>>> np.dot(C, E)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: shapes (2,3) and (2,3) not aligned: 3 (dim 1) != 2 (dim 0)
>>> C.shape[1]
3
>>> D.shape[0]
3
>>> E.shape[0]
2
>>> if C.shape[1] == D.shape[0]:
... print('.dot() OK!')
... else:
... print('.dot() NG!')
...
.dot() OK!
>>> if C.shape[1] == E.shape[0]:
... print('.dot() OK!')
... else:
... print('.dot() NG!')
...
.dot() NG!
以上、行列演算を活用してニューラルネットワークの計算を効率化していく。
参考:
行列の乗法 - Wikipedia