前回は、ANDゲートとORゲートを中心に少しNANDゲートをやってみました。パーセプトロン①
今回は残りのXORゲートについてメモっていきます。
XORゲート
XORゲートは、入力のどちらかが 1 の時だけ 1 を出力する。
入力1(x1) | 入力2(x2) | 出力(y) |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
ORゲートに似ていますが、両方 1 の時は、0 を出力しています。
これを「単純パーセプトロン」でどんなに考えてもできない・・
でも解決策があるらしい。
多層パーセプトロン
これは、AND NAND OR を回路みたいに合体させて
XORゲートを作るというものです。
ちょっとお絵かきしてみます。
わかりにくくなるので、バイアスは描きません。
とこんな感じです。
ややこしいのがNANDゲートですが、NANDゲートは、
すべての入力が 1 であれば 0 を出力、それ以外は 1 を出力です。
入力1(x1) | 入力2(x2) | NANDゲート 通過値 |
---|---|---|
0 | 0 | 1 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
ORゲートは、どちらかが 1 なら 1 を出力。
入力1(x1) | 入力2(x2) | ORゲート 通過値 |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 1 |
NANDとORの出力を、ANDゲートに通すと
NANDゲート 通過値 | ORゲート 通過値 | 出力(y) |
---|---|---|
1 | 0 | 0 |
1 | 1 | 1 |
1 | 1 | 1 |
0 | 1 | 0 |
XORゲートの結果と同じになりました。
入力1(x1) | 入力2(x2) | 出力(y) |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
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)
できたみたいです。
コメント