パーセプトロン②

機械学習

前回は、ANDゲートとORゲートを中心に少しNANDゲートをやってみました。パーセプトロン①

今回は残りのXORゲートについてメモっていきます。

XORゲート

XORゲートは、入力のどちらかが 1 の時だけ 1 を出力する。

入力1(x1)入力2(x2)出力(y)
000
101
011
110
XOR

ORゲートに似ていますが、両方 1 の時は、0 を出力しています。

これを「単純パーセプトロン」でどんなに考えてもできない・・

でも解決策があるらしい。

多層パーセプトロン

これは、AND NAND OR を回路みたいに合体させて

XORゲートを作るというものです。

ちょっとお絵かきしてみます。

わかりにくくなるので、バイアスは描きません。

とこんな感じです。

ややこしいのがNANDゲートですが、NANDゲートは、

すべての入力が 1 であれば 0 を出力、それ以外は 1 を出力です。

入力1(x1)入力2(x2)NANDゲート
通過値
001
101
011
110
NAND

ORゲートは、どちらかが 1 なら 1 を出力。

入力1(x1)入力2(x2)ORゲート
通過値
000
101
011
111
OR

NANDとORの出力を、ANDゲートに通すと

NANDゲート
通過値
 ORゲート 
通過値
出力(y)
100
111
111
010
NANDとORの結果を、ANDゲートに通過させる

XORゲートの結果と同じになりました。

入力1(x1)入力2(x2)出力(y)
000
101
011
110
XOR

XORゲートの実装というか、コードでやってみる

前回AND,OR,NANDをコードで試した時の

重みやバイアスをそのまま使用したかったのですが、

パーセプトロン①

前回のコードの書き方ではうまくまとめられませんで、

工夫した結果このようになりました。

前回は w1 = 0.3 のように定義していたのですが、

今回は w1の部分に数字を直接入力しました。

基準値はa = 0としていたので、0 の部分にバイアスの値を入れました。

import numpy as np

# ANDゲート
def AND(x1, x2):
    # 0.3は重み1と重み2
    f = 0.3 * x1 + 0.3 * x2
    if f <= 0.5:      # 基準値は0としてバイアスをここで入力
        y = 0         # 出力値は0
    else:
        y = 1         # それ以外は1
    return y

# ORゲート
def OR(x1, x2):
    # 0.7は重み1と重み2
    f = 0.7 * x1 + 0.7 * x2
    if f <= 0.3:      # 基準値は0としてバイアスをここで入力
        y = 0         # 出力値は0
    else:
        y = 1         # それ以外は1
    return y

# NANDゲート
def NAND(x1, x2):
    # -0.3は重み1と重み2
    f = -0.3 * x1 + -0.3 * x2
    if f <= -0.5:     # 基準値は0としてバイアスをここで入力
        y = 0         # 出力値は0
    else:
        y = 1         # それ以外は1
    return y

# ここからまとめて処理する
x1 = np.array([0, 0, 1, 1])
x2 = np.array([0, 1, 0, 1])
for i in range(4):
    X1 = x1[i]
    X2 = x2[i]
    y1 = NAND(X1, X2)
    y2 = OR(X1, X2)
    y3 = AND(y1, y2)
    print(y3)

できたみたいです。

コメント

タイトルとURLをコピーしました