ひとり勉強ログ

ITエンジニアの勉強したことメモ

【ゼロから作るDeepLearning】2章パーセプトロン

2.1 パーセプトロンとは

def AND(x1, x2):
  w1, w2, theta = 0.5, 0.5, 0.7
  tmp = x1*w1 + x2*w2
  if tmp <= theta:
    return 0
  elif tmp > theta:
    return 1

print(AND(0, 0))
print(AND(1, 0))
print(AND(0, 1))
print(AND(1, 1))

パラメータのw1、w2、thetaは関数内で初期化し、重み付き入力の総和が閾値を超えると1を返し、それ以外は0を返します。

0
0
0
1

2.3.2 重みとバイアスの導入

>>> import numpy as np
>>> x = np.array([0, 1]) # 入力
>>> w = np.array([0.5, 0.5]) # 重み
>>> b = -0.7 # バイアス
>>> w*x
array([0. , 0.5])
>>> np.sum(w*x)
0.5
>>> np.sum(w*x) + b
-0.19999999999999996

2.3.3 重みとバイアスによる実装

import numpy as np

# ANDゲート
def AND(x1, x2):
  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
# NANDゲート
def NAND(x1, x2):
  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
# ORゲート
def OR(x1, x2):
  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

AND、NAND、ORは同じ構造のパーセプトロンであり、違いは重みパラーメータの値だけでした。NANDとORゲートの実装においても、ANDとは異なる箇所は重みとバイアスの値を設定する箇所だけになります。

2.5.2 XORゲートの実装

def XOR(x1, x2):
  s1 = NAND(x1, x2)
  s2 = OR(x1, x2)
  y = AND(s1, s2)
  return y

print (XOR(0, 0))
print (XOR(1, 0))
print (XOR(0, 1))
print (XOR(1, 1))
0
1
1
0