本文爲《深度學習入門 基於Python的理論與實現》的部分讀書筆記
代碼以及圖片均參考此書
感知機(perceptron)是什麼
- b 稱爲偏置,w1 和w2 稱爲權重
利用感知機實現與門,與非門以及或門
import numpy as np
def perceptron(x, w, b):
val = np.sum(x * w) + b
return 0 if val <= 0 else 1
# 這裏使用裝飾器來測試各種門,在原有的門的基礎上進行一些打印輸出(其實是小題大做,只是我想練習一下裝飾器的用法-_-)
# 不熟悉python的話直接無視即可
def test_gate(test = False):
def decorator(gate):
def wrapper(*args, **kargs):
if test == True:
print(gate.__name__, ':')
for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
y = gate(xs[0], xs[1])
print(str(xs) + " -> " + str(y))
return gate(*args, **kargs)
return wrapper
return decorator
@test_gate(True)
def and_gate(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
return perceptron(x, w, -0.75)
@test_gate(True)
def nand_gate(x1, x2):
x = np.array([x1, x2])
w = np.array([-0.5, -0.5])
return perceptron(x, w, 0.75)
@test_gate(True)
def or_gate(x1, x2):
x = np.array([x1, x2])
w = np.array([1, 1])
return perceptron(x, w, -0.5)
if __name__ == '__main__':
and_gate(0, 0)
nand_gate(0, 0)
or_gate(0, 0)
代碼輸出:
and_gate :
(0, 0) -> 0
(1, 0) -> 0
(0, 1) -> 0
(1, 1) -> 1
nand_gate :
(0, 0) -> 1
(1, 0) -> 1
(0, 1) -> 1
(1, 1) -> 0
or_gate :
(0, 0) -> 0
(1, 0) -> 1
(0, 1) -> 1
(1, 1) -> 1
利用感知機實現異或門
感知機的侷限性
單層感知機無法分離非線性空間
感知機通過疊加層實現異或門
感知機的絕妙之處在於它可以“疊加層”,組成多層感知機來分離非線性空間,進行非線性的表示。
多層感知機即是一種多層結構的神經網絡。已有研究證明,2 層感知機(嚴格地說是激活函數使用了非線性的sigmoid 函數的感知機,可以表示任意函數。
@test_gate(True)
def xor_gate(x1, x2):
s1 = nand_gate(x1, x2)
s2 = or_gate(x1, x2)
return and_gate(s1, s2)
if __name__ == '__main__':
xor_gate(0, 0)
代碼輸出:
xor_gate :
(0, 0) -> 0
(1, 0) -> 1
(0, 1) -> 1
(1, 1) -> 0