新着情報

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層の出力値を表示

参考文献:

夢見るディープラーニング: ニューラルネットワーク[Python実装]入門,

第2章、金城悛哉、秀和システム、2018.

コメント投稿フォーム

メールアドレスが公開されることはありません。 が付いている欄は必須項目です