深度学习入门之1--感知机

目录

1什么是感知机

2简单逻辑电路及实现

2.1与门

2.2或门

2.3与非门

2.4异或门

3总结

该文章是对《深度学习入门 基于Python的理论与实现》的总结,作者是[日]斋藤康毅

1什么是感知机

感知机是由美国学者Frank Rosenblatt在1957年提出来的,感知机也是作为神经网络(深度学习)的起源的算法。因此,
学习感知机的构造也就是学习通向神经网络和深度学习的一种重要思想。

感知机接收多个输入信号,输出一个信号。这里所说的“信号”可以想象成电流或河流那样具备“流动性”的东西。

使用数学表达式来表示

感知机的多个输入信号都有各自固有的权重,这些权重发挥着控制各个信号的重要性的作用。也就是说,权重越大,对应该权重的信号的重要性就越高。

【注】:权重相当于电流里所说的电阻。电阻是决定电流流动难度的参数,电阻越低,通过的电流就越大。而感知机的权重则是值越大,通过的信号就越大。不管是电阻还是权重,在控制信号流动难度(或者流动容易度)这一点上的作用都是一样的。

2简单逻辑电路及实现

2.1与门

如图所示,与门仅在两个输入均为1时输出1,其他时候则输出0。

代码如下:在函数内初始化参数 w1 、 w2 、 theta ,当输入的加权总和超过阈值时返回 1 ,否则返回 0 。

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

AND(0, 0) # 输出0
AND(1, 0) # 输出0
AND(0, 1) # 输出0
AND(1, 1) # 输出1

# 方式2:使用numpy初始化数组
import numpy as np
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
AND(0, 0) # 输出0
AND(1, 0) # 输出0
AND(0, 1) # 输出0
AND(1, 1) # 输出1

2.2或门

如图所示。或门是“只要有一个输入信号是1,输出就为1”的逻辑电路。

代码实现如下:

import numpy as np

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

if __name__ == "__main__":
    OR(0, 0)  # 0
    OR(0, 1)  # 1
    OR(1, 0)  # 1
    OR(1, 1)  # 1

2.3与非门

如图所示,仅当x 1 和x 2 同时为1时输出0,其他时候则输出1。

代码实现如下:
 

import numpy as np

def NAND(x1, x2):
    x = np.array([x1, x2])
    w = np.array([-0.5, -0.5]) # 仅权重和偏置与AND不同!
    b = 0.7
    tmp = np.sum(w*x) + b
    if tmp <= 0:
        return 0
    else:
        return 1

if __name__ == "__main__":
    NAND(0, 0)  # 1
    NAND(0, 1)  # 0
    NAND(1, 0)  # 0
    NAND(1, 1)  # 0

2.4异或门

上面所描述的与门、或门、与非门都是一层感知机,也就是一条直线就可以实现分类。

三种门的符号表示如下:

三种简单的门可以使用单层感知机进行分类

然而异或门则不能使用单层感知机实现分类,如下图

由上可知,异或门不能由单层感知机进行分类(即一条直线),需要使用非线性函数进行分类。

方法:将三种简单的门组合起来实现异或门。

得到:

代码实现如下:

# 导入权重和偏置
import numpy as np


# 与门的实现
def AND(x1, x2):
    # w1, w2, theta = 0.5, 0.5, 0.7
    # tmp = x1*w1 + x2*w2
    x = np.array([x1, x2])
    w = np.array([0.5, 0.5])
    b = -0.7
    tmp = np.sum(w*x) + b
    if tmp <= 0:  # tmp < 0.7
        return 0
    else:
        return 1


# 实现与非门
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


# 实现或门
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

# 实现异或门
def XOR(x1, x2):
    s1 = NAND(x1, x2)
    s2 = OR(x1, x2)
    y = AND(s1, s2)
    return y


if __name__ == "__main__":
    XOR(0, 0)  # 0
    XOR(0, 1)  # 1
    XOR(1, 0)  # 1
    XOR(1, 1)  # 0

3总结

简单的逻辑电路可以使用单层感知机(线性函数)进行分类,但是例如复杂的逻辑电路(例如异或门)则必须使用多层感知机(非线性函数)进行分类。

发布了49 篇原创文章 · 获赞 13 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/mengdeng19950715/article/details/104086594