ORゲート ニューラルネットワーク
考え方
図1の真理値表のように論理回路は入力が2つの場合、4つの組み合わせを1セットとして考える。
そのため、モデルがORゲートを学習できたかどうかは、1セットごとに判定していく。
プログラム
import pandas as pd
import numpy as np
def counterup(x, delta_x):
if len(set(delta_x)) == 1:
x = False
else:
x = True
return x
# 誤り訂正学習法
# 初期パラメータの設定
x1data = [0,0,1,1]
x2data = [0,1,0,1]
tdata = [0,1,1,1]
y = 1
w1 = 0
w2 = 0
theta = 0
delta_w1 = []
delta_w2 = []
delta_theta = []
count_w1 = True
count_w2 = True
count_theta = True
# 4つを1単位とするためのカウンター
counter = -1
# 試行回数のカウンター
procount = 0
while count_w1 or count_w2 or count_theta:
procount = procount + 1
if counter == 3:
counter = 0
delta_w1 = []
delta_w2 = []
delta_theta = []
else:
counter = counter+1
# データセット
x1 = x1data[counter]
x2 = x2data[counter]
t = tdata[counter]
# 予測モデルの出力
if w1*x1+w2*x2-theta >= 0:
y = 1
else:
y = 0
# 変化分の計算
delta_w1.append((t-y)*x1)
delta_w2.append((t-y)*x2)
delta_theta .append(-(t-y))
# 経過表示
# print(procount, x1, x2, t, w1, w2, theta, y, t-y, delta_w1[counter], delta_w2[counter], delta_theta[counter])
if procount == 1:
result = np.array([procount, x1, x2, t, w1, w2, theta, y, t-y, delta_w1[counter], delta_w2[counter], delta_theta[counter]])
else:
add_data = np.array([procount, x1, x2, t, w1, w2, theta, y, t-y, delta_w1[counter], delta_w2[counter], delta_theta[counter]])
result = np.vstack([result, add_data])
# 重みと閾値の再計算
w1 = w1 + delta_w1[counter]
w2 = w2 + delta_w2[counter]
theta = theta + delta_theta[counter]
# 変化の検出
if counter == 3:
count_w1 = counterup(count_w1, delta_w1)
count_w2 = counterup(count_w2, delta_w2)
count_theta = counterup(count_theta, delta_theta)
# エクセル保存
result_df = pd.DataFrame(result, columns=["k","x1","x2","t","w1","w2","theta","y","t-y","delta_w1","delta_w2","delta_theta"])
result_df.to_excel("./OR学習結果.xlsx", index=False)
関連記事
ニューラルネットワーク 単純モデル
https://note.com/elemag/n/n7bf117b1c818?sub_rt=share_pw
サイト
https://sites.google.com/view/elemagscience/%E3%83%9B%E3%83%BC%E3%83%A0