kaeken(嘉永島健司)のTech探究ブログ

主に情報科学/情報技術全般に関する知見をポストします。(最近は、特にData Science、機械学習、深層学習、統計学、Python、数学、ビッグデータ)

1章 ニューラルネットワークの復習 / 1.1 数学とPythonの復習 |『ゼロから作るDeep Learning2自然言語処理編』

f:id:kaeken:20181001221520p:plain

1章 ニューラルネットワークの復習

まずはニューラルネットワークを復習する章なので、復習がてらコード部分を写経。

1.1 数学とPythonの復習

1.1.1 ベクトルと行列

>>> import numpy as np # numpyインポート
>>> x = np.array([1,2,3]) # np.array()メソッドで配列生成
>>> x.__class__ #クラス名表示
<class 'numpy.ndarray'> # 多次元配列用クラスndarray
>>> x.shape # 多次元配列の形状を示すインスタンス変数shape
(3,) # 要素数3 
>>> x.ndim # 次元数を示すインスタンス変数ndim
1 #次元数1

>>> W = np.array([[1,2,3], [4,5,6]])
>>> W.shape
(2, 3) #2行3列
>>> W.ndim
2 #次元数2

1.1.2 行列の要素ごとの演算

>>> W = np.array([[1,2,3], [4,5,6]])
>>> X = np.array([[0,1,2], [3,4,5]])
>>> W + X # 和
array([[ 1,  3,  5],
       [ 7,  9, 11]])
>>> W * X # 積
array([[ 0,  2,  6],
       [12, 20, 30]])

1.1.3 ブロードキャスト

形状の異なる配列同士の演算

>>> A = np.array([[1,2], [3,4]])
>>> A * 10 # 10倍
array([[10, 20],
       [30, 40]])
>>>
>>> A = np.array([[1,2], [3,4]])
>>> b = np.array([10,20])
>>> A * b # 2次元配列(2,2), 1次元配列(1,2)の演算
array([[10, 40],
       [30, 80]])

1.1.4 ベクトルの内積と行列の積

# ベクトルの内積
>>> a = np.array([1,2,3])
>>> b = np.array([4,5,6])
>>> np.dot(a,b)
32

# 行列の積
>>> A = np.array([[1,2], [3,4]])
>>> B = np.array([[5,6], [7,8]])
>>> np.dot(A,B)
array([[19, 22],
       [43, 50]])

1.1.5 行列の形状チェック

行列の積は、対応する次元の要素数を一致させる必要がある

# 3行2列と、2行4列の積は、3行4列になる
>>> C = np.array([[1,2], [3,4], [5,6]])
>>> D = np.array([[1,2,3,4], [5,6,7,8]])
>>> C.shape
(3, 2)
>>> D.shape
(2, 4)
>>> np.dot(C,D)
array([[11, 14, 17, 20],
       [23, 30, 37, 44],
       [35, 46, 57, 68]])

# 2行4列と、3行2列の積は、演算不可
>>> np.dot(D,C)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: shapes (2,4) and (3,2) not aligned: 4 (dim 1) != 3 (dim 0)

NumPyの練習は、以下が使える。

rougier/numpy-100: 100 numpy exercises (100% complete)