深度學習入門(一):神經網絡的起源算法--樸素感知機

本文爲《深度學習入門 基於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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章