一、异或门
1.1 异或门电路的真值表
XOR门电路
注意,门电路的输入只能是0或者1
异或:拒绝其他的意思
只有在两个输入不同的情况下,输出才会是1
输入1 | 输入2 | 真值表 |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
1.2 问题的提出
感知机可以实现基本的三种门电路。但是无法实现异或电路
1.3 以可视化的思想来思考
基本的三种门电路都可以通过一条直线来分割坐标区域来实现
对于异或门电路
来说,想通过一条直线来实现该电路是不可能的事情。
二、线性和非线性
2.1 感知机的局限性
只能表示由一条直线分割开来的线性空间
2.2 该知识点在机器学习的领域很常见
三、多层感知机
组合使用就可以用来表示非线性空间
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
temp = np.sum(x * w) + b
if temp <= 0:
print('the out is 0')
else:
print('the out is 1')
# 与非门
def NAND(x1, x2):
x = np.array([x1, x2])
w = np.array([-0.5, -0.5])
b = 0.7
temp = np.sum(x * w) + b
if temp <= 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
temp = np.sum(x * w) + b
if temp <= 0:
return 0
else:
return 1
# 异或门
def XOR(x1, x2):
s1 = NAND(x1, x2)
s2 = OR(x1, x2)
AND(s1, s2)
# 测试
XOR(0, 0)
XOR(0, 1)
XOR(1, 0)
XOR(1, 1)
D:\ANACONDA\envs\pytorch\python.exe C:/Users/Administrator/Desktop/Code/learn_pytorch/first_demo.py
the out is 0
the out is 1
the out is 1
the out is 0
Process finished with exit code 0
3.2 编码过程中出现的问题
无法正常显示异或门的输出
- 解决:输入的值是不对的,逻辑电路门的输入只能是0或者1
- 所以在每个普通的门电路中输入的浮点数当然是不正确的
善于debug,善于改代码,才能成功
编码的过程中才是真正的锻炼人的时候
四、其他
4.1 思考
通过不同门电路层的叠加使用,可以使普通的门电路更加灵活
4.2 感知机的命名
虽然感知机是由3层组成的,但是实际过程中有权重的只有2层,所以
所以对于感知机我们以他实际有权重的层数来命名
这个感知机我们就叫他二层感知机