「.NET 開発基盤部会 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
推論フェーズでは、信号は順方向に伝播する。
バイアスと活性化関数を省略し重みだけとする。
X行列 * W行列=Y行列
┌ ┐ ┌ ┐ ┌ ┐ │a1 b1│ │a2 b2 c2│ = │a1a2+b1d2 a1b2+b1e2 a1c2+b1f2│ └ ┘ │ │ └ ┘ │d2 e2 f2│ └ ┘ X行列 W行列 Y行列 1行2列 2行3列 1行3列 ─ ─ └────┘
┌ ┐ ┌ ┐ ┌ ┐ │a b│ │1 3 5│ = │1a+2b 3a+4b 5a+6b│ └ ┘ │ │ └ ┘ │2 4 6│ └ ┘ X行列 W行列 Y行列 1行2列 2行3列 1行3列 ─ ─ └───┘
>>> x=np.array([1,2]) >>> x array([1, 2]) >>> w=np.array([[1,3,5],[2,4,6]]) >>> w array([[1, 3, 5], [2, 4, 6]]) >>> y=np.dot(x,w) >>> y array([ 5, 11, 17])
前述の「簡単なニューラルネットワーク」を3層化する。
A(1) = x(1) W(1) + B(1)
┌ ┐ │w(1)11 w(1)21 w(1)31│ │w(1)12 w(1)22 w(1)32│ └ ┘
[b(1)1 b(1)2 b(1)3]
h(A(1)) = Z(1)
そのまんま実装した。
"""This is a test program.""" import numpy as np def sigmoid(x_1): """sigmoid.""" return 1 / (1 + np.exp(-x_1)) def identity_function(y_1): """出力層の活性化関数""" return y_1 # 第一層 X1 = np.array([1.0, 0.5]) W1 = np.array([[0.1, 0.3, 0.5], [0.2, 0.4, 0.6]]) B1 = np.array([0.1, 0.2, 0.3]) print("第一層") A1 = np.dot(X1, W1) + B1 print("A1:" + str(A1)) Z1 = sigmoid(A1) print("Z1:" + str(Z1)) # 第二層 X2 = Z1 W2 = np.array([[0.1, 0.4], [0.2, 0.5], [0.3, 0.6]]) B2 = np.array([0.1, 0.2]) print("第二層") A2 = np.dot(X2, W2) + B2 print("A2:" + str(A2)) Z2 = sigmoid(A2) print("Z2:" + str(Z2)) # 第三層 X3 = Z2 W3 = np.array([[0.1, 0.3], [0.2, 0.4]]) B3 = np.array([0.1, 0.2]) print("第三層") A3 = np.dot(X3, W3) + B3 print("A3:" + str(A3)) Z3 = identity_function(A3) print("Z3:" + str(Z3))
"""This is a test program.""" import numpy as np def sigmoid(x_1): """sigmoid.""" return 1 / (1 + np.exp(-x_1)) def identity_function(y_1): """出力層の活性化関数""" return y_1 def init_network(): """ニューラルネットワーク""" network = {} networkw = {} networkw[0] = np.array([[0.1, 0.3, 0.5], [0.2, 0.4, 0.6]]) networkw[1] = np.array([[0.1, 0.4], [0.2, 0.5], [0.3, 0.6]]) networkw[2] = np.array([[0.1, 0.3], [0.2, 0.4]]) networkb = {} networkb[0] = np.array([0.1, 0.2, 0.3]) networkb[1] = np.array([0.1, 0.2]) networkb[2] = np.array([0.1, 0.2]) network["W"] = networkw network["b"] = networkb return network def forward(network, zzz): """ニューラルネットワークの実行""" tier = len(network["W"]) for num in range(tier - 1): print("第" + str(num + 1) + "層") xxx = zzz aaa = np.dot(xxx, network["W"][num]) + network["b"][num] print("A" + str(num + 1) + ":" + str(aaa)) zzz = sigmoid(aaa) print("Z" + str(num + 1) + ":" + str(zzz)) print("第" + str(tier) + "層") xxx = zzz aaa = np.dot(xxx, network["W"][tier -1]) + network["b"][tier -1] print("A" + str(tier) + ":" + str(aaa)) zzz = identity_function(aaa) # 出力層の活性化関数 print("Z" + str(tier) + ":" + str(zzz)) return zzz print(forward(init_network(), np.array([1.0, 0.5])))
用いることができる。
を利用する。
入力をそのまま返す。
exp(Ak) Yk = ─────────── n Σexp(Ai) i=1
シグモイド関数の項で説明した通り、
>>> a=np.array([0.3, 2.9, 4.0]) >>> a array([ 0.3, 2.9, 4. ]) >>> exp_a = np.exp(a) >>> exp_a array([ 1.34985881, 18.17414537, 54.59815003]) >>> sum_exp_a = np.sum(exp_a) >>> sum_exp_a 74.122154210163302 >>> y = exp_a / sum_exp_a >>> y array([ 0.01821127, 0.24519181, 0.73659691]) >>>
"""This is a test program.""" import numpy as np def softmax(aaa): """ソフトマックス関数""" exp_a = np.exp(aaa) sum_exp_a = np.sum(exp_a) return exp_a / sum_exp_a print(softmax(np.array([0.3, 2.9, 4.0])))
ソフトマックス関数は指数関数を使用するため、オーバーフローし易い。
従って、ここでは、オーバーフロー対策について考える。
exp(Ak) Yk = ─────────── n Σexp(Ai) i=1
C exp(Ak) = ─────────── n C Σexp(Ai) i=1
exp(Ak + logeC) = ─────────── n Σexp(Ai + logeC) i=1
(a+b) a b X = X * X
a a logxC (a+logxC) C X = X * X = X
exp(Ak + C') = ─────────── n Σexp(Ai + C') i=1
"""This is a test program.""" import numpy as np def softmax(aaa): """ソフトマックス関数""" exp_a = np.exp(aaa - np.max(aaa)) sum_exp_a = np.sum(exp_a) return exp_a / sum_exp_a # print(softmax(np.array([0.3, 2.9, 4.0]))) print(softmax(np.array([1010, 1000, 990])))
出力層のニューロンの数は、問題に合わせて決定する。
機械学習分野で最も有名なデータセット
c:\deep-learning-from-scratch-master\ch03>python mnist_show.py Downloading train-images-idx3-ubyte.gz ... Done Downloading train-labels-idx1-ubyte.gz ... Done Downloading t10k-images-idx3-ubyte.gz ... Done Downloading t10k-labels-idx1-ubyte.gz ... Done Converting train-images-idx3-ubyte.gz to NumPy Array ... Done Converting train-labels-idx1-ubyte.gz to NumPy Array ... Done Converting t10k-images-idx3-ubyte.gz to NumPy Array ... Done Converting t10k-labels-idx1-ubyte.gz to NumPy Array ... Done Creating pickle file ... Done! 5 (784,) (28, 28) c:\deep-learning-from-scratch-master\ch03>python mnist_show.py 5 (784,) (28, 28)
以下のようにneuralnet_mnist.pyを実行すると、
>python neuralnet_mnist.py
X行列 W1行列 W2行列 W3行列 → Y行列 1行784列 784行50列 50行100列 100行10列 1行10列 ↑ ↑ ↑ ↑ ↑ └───┘ │ │ │ 1行50列 │ │ │ ↑ │ │ │ └──────┘ │ │ 1行100列 │ │ ↑ │ │ └────────┘ │ 1行10列 ─────────┘
X行列 W(1)行列 W(2)行列 W(3)行列 → Y行列 100行784列 784行50列 50行100列 100行10列 100行10列 ↑ ↑ ↑ ↑ ↑ └──┘ │ │ │ Y行列 100行50列 │ │ │ ↑ │ │ │ └─────┘ │ │ Y行列 100行100列 │ │ ↑ │ │ └────────┘ │ Y行列 100行10列 ─────────┘
以下のようにneuralnet_mnist_batch.pyを実行すると、
>python neuralnet_mnist_batch.py