深度学习_感知机
参考书籍:深度学习入门_基于python的 理论与实现
1. 感知机
1.1 原理:接收多个输入信号,输出一个信号
1.2 图示:
1.3 图解:上图表示一个接收两个输入信号的感知机,x1、x2是输入信号,y是输出信号,w1、w2是权重,图中的O称为“神经元”或者“节点”。输入信号被送往神经元时,会被分别乘以固定的权重(w1x1、w2x2)。神经元会计算传送过来的信号的总和,只有当这个总和超过了某个界限值时,才会输出1。这也称为“神经元被激活”。将这个界限值称为阈值,用符号θ表示。
1.4 公式表示:
1.5 权重:感知机的权重则是值越大,通过的信号就越大
2. 简单逻辑电路
2.1 与门
2.1.1 原理:有两个输入和一个输出的门电路
2.1.2 真值表:
2.2 与非门
2.2.1 原理: 颠倒了与门的输出
2.2.2 真值表:
2.3 或门
2.3.1 原理:只要有一个输入信号是1,输出就为1
2.3.2 真值表:
3. 感知机的实现
3.1 简单实现
3.1.1 与门
def And(x1,x2):
w1,w2,theta=0.7,0.3,0.7
tmp=x1*w1+x2*w2
if tmp<=theta:
return 0
elif tmp>theta:
return 1
a=And(0,0)
print(a) #0
b=And(0,1)
print(b) #0
c=And(1,0)
print(c) #0
d=And(1,1)
print(d) #1
3.1.2 与非门
#与非门
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
a=And(0,0)
print(a) #1
b=And(0,1)
print(b) #1
c=And(1,0)
print(c) #1
d=And(1,1)
print(d) #0
3.1.3 或门
#或门
def And(x1,x2):
w1,w2,theta=1,1,0
tmp=x1*w1+x2*w2
if tmp<=theta:
return 0
elif tmp>theta:
return 1
a=And(0,0)
print(a) #0
b=And(0,1)
print(b) #1
c=And(1,0)
print(c) #1
d=And(1,1)
print(d) #1
3.2 导入权重和偏置
3.2.1 原理:
3.2.2 公式解读:将式(2.1)的θ换成−b,b称为偏置,偏置的值决定了神经元被激活的容易程度,w1和w2称为权重。感知机会计算输入信号和权重的乘积,然后加上偏置,如果这个值大于0则输出1,否则输出0
3.3 使用权重和偏置的实现
3.3.1 与门:
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
if __name__ == '__main__':
for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
y = AND(xs[0], xs[1])
print(str(xs) + " -> " + str(y))
# (0, 0) -> 0
# (1, 0) -> 0
# (0, 1) -> 0
# (1, 1) -> 1
3.3.2 非门
import numpy as np
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
if __name__ == '__main__':
for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
y = NAND(xs[0], xs[1])
print(str(xs) + " -> " + str(y))
# (0, 0) -> 1
# (1, 0) -> 1
# (0, 1) -> 1
# (1, 1) -> 0
3.3.3 或门
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__':
for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
y = OR(xs[0], xs[1])
print(str(xs) + " -> " + str(y))
# (0, 0) -> 0
# (1, 0) -> 1
# (0, 1) -> 1
# (1, 1) -> 1
4. 感知机的局限性
4.1 异或门:
4.1.1 原理:仅当x1或x2中的一方为1时,才会输出1;感知机无法用异或门来实现
4.1.2 异或门真值表:
4.2 线性和非线性
4.2.1 线性空间:由曲线分割的空间
4.2.2 非线性空间:由直线分割的空间
5. 多层感知机
5.1 已有门电路组合
5.1.1 与门,与非门,或门:
5.1.2 用与门,与非门,或门实现异或门:
5.1.2 异或门的实现
from and_gate import AND
from or_gate import OR
from nand_gate import NAND
def XOR(x1, x2):
s1 = NAND(x1, x2) #与非门
s2 = OR(x1, x2) #或门
y = AND(s1, s2) #与门
return y
if __name__ == '__main__':
for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
y = XOR(xs[0], xs[1])
print(str(xs) + " -> " + str(y))
# (0, 0) -> 0
# (1, 0) -> 1
# (0, 1) -> 1
# (1, 1) -> 0
5.1.3 2层感知机
原理:
1.第0层的两个神经元接收输入信号,并将信号发送至第1层的神经元。
2.第1层的神经元将信号发送至第2层的神经元,第2层的神经元输出y。