新着情報
3層のパーセプトロン: pythonによる実装

Fig.1 3層で構成されるニューラル・ネットワークの関係

Fig.2. 第1層のneuronへの入力総和の行列表示。
(1) 第1層への入力と第1層からの出力
Fig.1とFig.2で求められる第1層に入力される重み付き総和をpythonで実装する。ここで、第0層の出力信号、重み、閾値は適当な値を設定していることに注意。
import numpy as np
X = np.array([1.0,0.5]) # 第0層の出力
W1 =np.array([[0.1,0.3,0.5], # 第1層への重み
[0.2,0.4,0.6]])
B1 = np.array([0.1,0.2,0.3]) # 第1層への閾値
A1=np.dot(X, W1) + B1 # 第1層への入力
print(‘第0層の出力:’, X);
print(‘第1層への入力:’,A1)
[OutPut]
第0層の出力:[1. 0.5 ]
第1層への入力:[0.3 0.7 1.1 ]
また、第1層からの出力信号はsigmoid関数の引数として、A1を代入すれば、Z1 =(z1, z2, z3) が計算できる。
def sigmoid(x):
return 1/(1 + np.exp(-x))
Z1 = sigmoid(A1)
print(‘第1層からの出力:’,Z1)
[OutPut]
第1層からの出力: [0.57444252 0.66818777 0.75026011]
(2) 第2層への入力と第2層からの出力
第2層への入力と出力のpythonコードは次の様になる。
Z1が第2層への入力になっている以外は第1層の時と同じである。
W2= np.array([[0.1,0.5],
[0.2, 0.7],
[0.3, 0.9]])
B2= np.array([0.1,0.2])
A2= np.dot(Z1,W2) + B2
Z2= sigmoid(A2)
print(‘第2層の入力:’, A2)
print(‘第2層の出力:’, Z2)
[OutPut]
第2層の入力: [0.51615984 1.63018679]
第2層の出力: [0.62624937 0.83619523]
(3) 第3層への入力と第3層からの出力
第3層への入力と出力をpythonで実装する。第3層への入力はこれまでと同様であるが、第3層の活性化関数として入力をそままま出力する恒等関数ほ使う。
def identf(x):
return x
W3= np.array([[0.1, 0.3],
[0.2, 0.4]])
B3= np.array([0.1, 0.2])
A3= np.dot(Z2, W3) + B3
Y = identf(A3)
print(‘第3層への入力:’, A3)
print(‘第3層への出力:’, Y)
[OutPut]
第3層への入力: [0.32986398 0.80597242]
第3層への出力: [0.32986398, 0.80597242]
(4) 3層のNeural networkのpythonでの実装
import numpy as np
# シグモイド関数
def sigmoid(x):
    return 1 / (1 + np.exp(-x))    
# 恒等関数
def identity(x):
    return x
# ニューラルネットワークの初期化を行う関数
def create_network():
    network = {}                                # ディクショナリを作成
    network['w1'] = np.array([[0.1, 0.3, 0.5],  # 第1層への重み
                              [0.2, 0.4, 0.6]])
    network['b1'] = np.array([0.1, 0.2, 0.3])   # 第1層へのバイアス
    network['w2'] = np.array([[0.1, 0.5],       # 第2層への重み
                              [0.2, 0.7],
                              [0.3, 0.9]])
    network['b2'] = np.array([0.1, 0.2])        # 第2層へのバイアス
    network['w3'] = np.array([[0.1, 0.3],       # 第3層への重み
                              [0.2, 0.5]])
    network['b3'] = np.array([0.1, 0.2])        # 第3層へのバイアス
    return network                              # 重み、バイアスを返す
# 各層への伝達を実行する関数
def propagation(network,          # ニューラルネットワークの重み、バイアス
            x                 # 第0層の出力値
           ):
    # 各層への重みを変数に格納
    w1, w2, w3 = network['w1'], network['w2'], network['w3']
    # 各層へのバイアスを変数に格納
        w1, w2, w3 = network['w1'], network['w2'], network['w3']
    # 各層へのバイアスを変数に格納
    b1, b2, b3 = network['b1'], network['b2'], network['b3']
    a1 = np.dot(x, w1) + b1   # 第1層の入力
    z1 = sigmoid(a1)          # 第1層の出力(シグモイド関数)
    a2 = np.dot(z1, w2) + b2  # 第2層の入力
    z2 = sigmoid(a2)          # 第2層の出力(シグモイド関数)
    a3 = np.dot(z2, w3) + b3  # 第3層の入力
    y = identity(a3)          # 第3層の出力(恒等関数)
    return y                  # 第3層の出力値を返す
# 実行ブロック #
 network = create_network()# ニューラルネットワークの初期化
 x = np.array([1.0, 0.5]) # 第0層の出力値を設定
 y = propagation(network, x) # ニューラルネットワークの各層の伝達を実行
 print(y) # 第3層の出力値を表示
 =====================================
 [OutPut]
 [0.32986398 0.80597242] # 第3層の出力値を表示