備忘録_多層パーセプトロン

備忘録_多層パーセプトロン

XORゲート

排他的論理和とも呼ばれる論理回路。x1とx2のどちらかが1のときだけ出力が1になります。単層なパーセプトロンでは表現できなく、層を重ねることで表現ができる。

x1x2y
000
101
011
110

x1,x2をNANDゲートとORゲートへの入力とし、NANDゲートとORゲートの出力をANDゲートの入力にすると表現できる。

まず、x1,x2をNANDゲートへ入力とすると、s1の出力になる。

x1x2s1
001
101
011
110

次に、x1,x2をORゲートへ入力とすると、s2の出力になる。

x1x2s2
000
101
011
111

そして、s1,s2ANDゲートへ入力すると、XORゲートを表現できる。

s1s2y
100
111
111
010

XORゲートの実装

import numpy as np


class Perceptron:
    def AND(self, x1, x2):  # ANDゲート
        x = np.array([x1, x2])
        w = np.array([0.5, 0.5])  # 重み
        b = -0.7  # バイアス
        tmp = np.sum(w * x) + b
        if tmp <= 0:
            return 0
        else:
            return 1

    def NAND(self, x1, x2):  # NANDゲート
        x = np.array([x1, x2])
        w = np.array([-0.5, -0.5])  # 重み
        b = 0.7  # バイアス
        tmp = np.sum(w * x) + b
        if tmp <= 0:
            return 0
        else:
            return 1

    def OR(self, x1, x2):  # ORゲート
        x = np.array([x1, x2])
        w = np.array([0.5, 0.5])  # 重み
        b = -0.2  # バイアス
        tmp = np.sum(w * x) + b
        if tmp <= 0:
            return 0
        else:
            return 1

    def XOR(self, x1, x2): # XORゲート
        s1 = self.NAND(x1, x2) #NANDゲート
        s2 = self.OR(x1, x2) #ORゲート
        y = self.AND(s1, s2) #ANDゲート
        return y


p = Perceptron()
print("p.XOR(0, 0) ⇒ " + str(p.XOR(0, 0)))
print("p.XOR(1, 0) ⇒ " + str(p.XOR(1, 0)))
print("p.XOR(0, 1) ⇒ " + str(p.XOR(0, 1)))
print("p.XOR(1, 1) ⇒ " + str(p.XOR(1, 1)))

実行結果
p.XOR(0, 0) ⇒ 0
p.XOR(1, 0) ⇒ 1
p.XOR(0, 1) ⇒ 1
p.XOR(1, 1) ⇒ 0