🌞欢迎来到深度学习的世界
🌈博客主页:卿云阁💌欢迎关注🎉点赞👍收藏⭐️留言📝
🌟本文由卿云阁原创!
🙏作者水平很有限,如果发现错误,请留言轰炸哦!万分感谢!
目录
2.1感知机是什么
2.2 简单逻辑电路
2.3 感知机的实现
2.4 感知机的局限性
2.5 多层感知机
2.1感知机是什么
感知机接收多个输入信号,输出一个信号。
图 2-1 是一个接收两个输入信号的感知机的例子。
- x1、x2是输入信号, y是输出信号,
- w1、w2是权重。
- 图中的○称为“神经元”。
输入信号被送往神经元时,会被分别乘以固定的权重(w 1x1 、 w2x2 )。神经元会计算传送过来的信号的总和,只有当这个总和超过 了某个界限值时,才会输出1 。这也称为“神经元被激活”。这里将这个界限值称为阈值 ,用符号 θ 表示。有两个输入的感知机感知机的运行原理只有这些!把上述内容用数学式来表示
权重越大,对应该权重的信号的重要性就越高, 通过 的信号就越大。
2.2 简单逻辑电路
2.2.1 与门(A&&B必须同时为1才输出为1)
图2-2的真值表
满足图 2-2 的条件的参数的选择方法有无数多个。比如,当 (w 1, w2, θ) = (0.5, 0.5, 0.7) 时,可以满足图 2-2 的条件。2.2.2 或门(或 A || B,有一个为1输出为1)
的真值表
2.2.3 与非门 !(A&&B)
真值表
要表示与非门,可以用(w 1, w2, θ) = (−0.5, −0.5, −0 .7)这样的组合(其 他的组合也是无限存在的)。实际上,只要把实现与门的参数值的符号取反, 就可以实现与非门。
2.3 感知机的实现
2.3.1 简单的实现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 print("---真值表---") print("X1是{1}, X2是{1}, y是{2}".format(1,1,AND(1, 1))) print("X1是{1}, X2是{0}, y是{2}".format(1,0,AND(1, 0))) print("X1是{0}, X2是{1}, y是{2}".format(0,1,AND(0, 1))) print("X1是{0}, X2是{0}, y是{2}".format(0,0,AND(0, 0)))
果然和我们预想的输出一样!这样我们就实现了与门。按照同样的步骤,也可以实现与非门和或门,不过让我们来对它们的实现稍作修改。
2.3.2 导入权重和偏置b 称为 偏置 , w1和w2 称为 权重 。 感知机会计算输入信号和权重的乘积,然后加上偏置,如果这个值大于0 则输出 1 ,否则输出 0。 w1和w2是控制输入信号的重要性的参数,而偏置是调整神经元被激活的容易程度(输出信号为1的程度)的参数。import numpy as np x = np.array([0, 1]) # 输入 w = np.array([0.5, 0.5]) # 权重 b = -0.7 # 偏置 print("w*x={0}".format(w*x)) print("------") print("w1*x1+w2*x2={0}".format(np.sum(w*x))) print("------") print("w1*x1+w2*x2+ b={0}".format(np.sum(w*x) + b))
2.3.3 使用权重和偏置的实现# coding: utf-8 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))
# coding: utf-8 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))
# coding: utf-8 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))
2.4 感知机的局限性
2.4.1 异或门两个输入不同–>输出1, 输入相同–>输出0
实际上,用前面介绍的感知机是无法实现这个异或门的。感知机的局限性就在于它只能表示由一条直线分割的空间。弯曲的曲线无法用感知机表示。
2.5 多层感知机
2.5.1 已有门电路的组合异或门可以通过图 所示的配置来实现。这里, x 1 和 x 2 表示输入信号, y 表示输出信号。 x 1 和 x 2 是与非门和或门的输入,而与非门和或门的输出则 是与门的输入。# coding: utf-8 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))