見出し画像

NOTゲート ニューラルネットワーク


考え方

図1の真理値表のようにNOTゲートは入力が1つである。入力の組み合わせは2つなので、それを1セットとする。

図1 NOTゲートの真理値表

モデルがNOTゲートを学習できたかどうかは、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,1]
tdata = [1,0]
y = 1
w1 = 0
theta = 0
delta_w1 = []
delta_theta = []
count_w1 = True
count_theta = True
# 2つを1単位とするためのカウンター
counter = -1
# 試行回数のカウンター
procount = 0

while count_w1 or count_theta:
    procount = procount + 1
    if counter == 1:
        counter = 0
        delta_w1 = []
        delta_theta = []
    else:
        counter = counter+1
    
    # データセット
    x1 = x1data[counter]
    t = tdata[counter]

    # 予測モデルの出力
    if w1*x1-theta >= 0:
        y = 1
    else:
        y = 0

    # 変化分の計算
    delta_w1.append((t-y)*x1)
    delta_theta .append(-(t-y))

    # 経過表示
    # print(procount, x1, t, w1, theta, y, t-y, delta_w1[counter], delta_theta[counter])
    if procount == 1:
        result = np.array([procount, x1, t, w1, theta, y, t-y, delta_w1[counter], delta_theta[counter]])
    else:
        add_data = np.array([procount, x1, t, w1, theta, y, t-y, delta_w1[counter], delta_theta[counter]])
        result = np.vstack([result, add_data])

    # 重みと閾値の再計算
    w1 = w1 + delta_w1[counter]
    theta = theta + delta_theta[counter]

    # 変化の検出
    if counter == 1:
        count_w1 = counterup(count_w1, delta_w1)
        count_theta = counterup(count_theta, delta_theta)

# エクセル保存
result_df = pd.DataFrame(result, columns=["k","x1","t","w1","theta","y","t-y","delta_w1","delta_theta"])
result_df.to_excel("./NOT学習結果.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

いいなと思ったら応援しよう!