# 2019秋 ニューラルネットワーク3層 # 定数・設定値の準備 (表2、表4参照) NI = 2 # 入力ノードの数 NM = 2 # 中間ノードの数 NC = 4 # 入力パターンの数 X = [[0, 0], [0, 1], [1, 0], [1, 1]] # 入力値の全組み合わせ # 「排他的論理和 (XOR)」の重みとバイアスを設定 (表3参照) WM = [[0.5, 0.5], [-0.5, -0.5]] # 中間ノード m1, m2 の重み BM = [-0.2, 0.7] # 中間ノード m1, m2 のバイアス WY = [0.5, 0.5] # 出力ノード y の重み BY = -0.6 # 出力ノード y のバイアス def three_layer_perceptron(X, Y): # 中間ノードの演算結果を格納する2次元配列 (NC行 × NM列) M = [[0 for _ in range(NM)] for _ in range(NC)] # 外側のループ: 全入力パターン for out in range(NC): # [ア] に相当: 出力ノードのテンポラリをバイアスで初期化 ytemp = BY # 中間層の計算ループ for mid in range(NM): mtemp = BM[mid] # 入力層から中間層への総入力計算 for _in in range(NI): # [エ] に相当: 入力値 × 中間層の重み mtemp = mtemp + X[out][_in] * WM[mid][_in] # [オ] に相当: 中間層の活性化関数 (0より大きいか) if mtemp > 0: M[out][mid] = 1 else: M[out][mid] = 0 # [カ], [キ] に相当: 中間層の出力 × 出力層の重みを加算 ytemp = ytemp + M[out][mid] * WY[mid] # 出力層の活性化関数 if ytemp > 0: Y[out] = 1 else: Y[out] = 0 # 実行テスト Y = [0] * NC # 出力格納用の配列 three_layer_perceptron(X, Y) print("--- 3層パーセプトロン (XOR演算) の結果 ---") for i in range(NC): print(f"入力: {X[i]} -> 出力: {Y[i]}")