下面用Python来实现与门找个逻辑电路
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
在函数内初始化参数w1、w2、theta,当输入的加权总和超过阈值时返回1, 否则返回0。
输出结果为:
AND(0, 0) # 输出0
AND(1, 0) # 输出0
AND(0, 1) # 输出0
AND(1, 1) # 输出1
上面的实现比较直接,但是考虑到之后的学习,我们将其修改为另外一种实现形式。在此之前,首先把图1中的θ换成−b。
此处,b称为偏置, w1和w2为权重,下面利用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
请注意:偏置和权重的作用是不相同的。权重w1,w2是控制输入信号的重要性的参数,而偏置是调整神经元被激活的难易程度。
代码实现:
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
代码实现:
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
异或门也被成为逻辑异或电路,仅当x1或者x2中的一个为1时,才输出1。
由于异或逻辑电路无法像以上三种逻辑电路一样可进行线性分割出两种输出结果。
比如或门:
上图表示的感知机会生成直线-0.5 + x1 + x2 = 0分隔开的两个空间。其中一个空间输出1,另一个空间输出0,如下图所示:
而异或的问题在于无法通过一个线性函数来区分0和1
由曲线分割而成的空间称为非线性空间,由直线分割而成的空间称为线性空间。形如下图异或逻辑电路的分割曲线即为非线性
。
我们继续使用python来实现异或门。此处用到了之前给出的与门、与非门和或门的函数实现。
def XOR(x1, x2):
s1 = NAND(x1, x2)
s2 = OR(x1, x2)
y = AND(s1, s2)
return y
输出结果:
XOR(0, 0) # 输出0
XOR(1, 0) # 输出1
XOR(0, 1) # 输出1
XOR(1, 1) # 输出0
异或门时一种多层结构的神经网络。通常,将最左端的一列称为第0层,中间的一列称为第1层,最右端的一列称为第2层。
同时,叠加了多层的感知机也成为多层感知机(multi-layered perceptron)
1.第0层的两个神经元接收输入信号,并将信号发送至第1层的神经元。
2.第一层的神经元将信号发送至第2层的神经元,第2层的神经元输出y
总结