欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 锐评 > 深度学习入门--感知机

深度学习入门--感知机

2025/2/27 2:35:16 来源:https://blog.csdn.net/m0_62263513/article/details/145798900  浏览:    关键词:深度学习入门--感知机

初学,若有错误,恳请指正!

目录

初学,若有错误,恳请指正!

2.1 感知机是什么

2.2 简单逻辑电路和感知机的实现

2.2.1 与门及简单实现

2.2.2 与非门和或门、导入权重和偏置及其实现

2.4 感知机的局限性

2.4.1 异或门

2.4.2 线性和非线性

2.5 多层感知机

2.5.1 已有门电路的组合

2.5.2 异或门的实现

2.6 从与非门到计算机

2.7 小结

2.1 感知机是什么

        刚读完我不是很理解,只知道感知机可以将多个输入信号转为一个输出信号。所以我就去看了一下其他人的解释,说是可以理解为一个线性二分类器,再没看下面的内容的情况下,就暂且记住这个结论吧。

        圈被称为神经元或节点,x1,x2为输入信号(为1/0),w1,w2为权重(可以直接理解为信号的重要性),y为输出信号(为1/0)。

感知机的运行过程:将信号传入神经元,神经元接受之后,分别乘以各自的权重,然后求和,得出输出信号。

怎么知道输出信号是1还是0呢,这里就要提到一个值,阈值θ。当信号乘以其权重大于这个值的时候,输出为1,否则输出为0。

下面即为表达式:

2.2 简单逻辑电路和感知机的实现

数字电路中我们学过简单的逻辑电路,也就是与或非几个门,他们的共同点在于,输入为多个值,输出为一个值。这就跟感知机的作用相同,下面使用输入为2个值,输出为1个值来进行说明。

2.2.1 与门及简单实现

与门就是逻辑AND,“有0为0,全1才1”,由这个也可以得出其真值表:

按照这个真值表,以及上面的感知机表达式,可以进行一个编程。但是在编程前,我们就得考虑权重和阈值。对于感知机来说,这几个值是需要我们自己设定的。

设定的时候依旧是根据真值表和表达式,权重和阈值需要满足整个真值表,通过计算,可以随机取一个例子,比如:w1=0.5,w2=0.5,θ=0.7。按这个权重和阈值进行编程:

def AND(x1,x2):w1,w2,theta = 0.5,0.5,0.7tmp = w1 * x1 + w2 * x2if tmp > theta:return 1      #这里使用返回值,而不是直接输出,因为可能存在其他函数的调用else:return 0print(AND(0,0))
print(AND(0,1))
print(AND(1,0))
print(AND(1,1))

输出结果如下:
 

2.2.2 与非门和或门、导入权重和偏置及其实现

与非门就是给与门求反,可以直接给与门的结果求反;或门可以记忆为“有1为1,全0为0”。

不论是什么门,输入和输出的结构是一样的,唯一不同点就在于权重和阈值。所以如果直接编程,只需要修改与门的权重和阈值即可。

但是,这里不直接这么说了,按照标准的说法来说。

将所有的参数移到一边,另一边留下0,那么在判断的时候直接判断是大于0还是小于等于0即可。将参数移到一边,权重这边就多了个-θ,这里用b来表示,称为偏置。

得到的表达式如下:

w1,w2统称为权重w,x1,x2统称为信号x。那么我们怎么样用一个参数表示两个数呢,就需要用到我们前面学习的数组,所以引入模块numpy进行编程。

import numpy as npdef AND(x1,x2):x = np.array([x1,x2])w = np.array([0.5,0.5])b = -0.7tmp = np.sum(w*x) + bif tmp > 0:return 1else:return 0def NAND(x1,x2):x = np.array([x1,x2])w = np.array([-0.5,-0.5])b = 0.7tmp = np.sum(w*x) + bif tmp > 0:return 1else:return 0def OR(x1,x2):x = np.array([x1,x2])w = np.array([0.5,0.5])b = -0.4tmp = np.sum(w*x) + bif tmp > 0:return 1else:return 0print(AND(0,0))
print(AND(0,1))
print(AND(1,0))
print(AND(1,1))
print("\n")
print(NAND(0,0))
print(NAND(0,1))
print(NAND(1,0))
print(NAND(1,1))
print("\n")
print(OR(0,0))
print(OR(0,1))
print(OR(1,0))
print(OR(1,1))

 为什么有偏置b这个说法,理解的时候可以将有参数的一边看成一个函数,即y=w*x+b,若没有b那么这个函数图像是通过原点的,但是我们的数据并没有标准到都可以使用通过原点的直线进行分割(前面我们说的感知机可以使用直线将数据分为两类),那么这时候就需要修改截距(也就是我们这里的偏置)以灵活的分割数据。

我们前面说权重是代表信号的重要程度,偏置则代表神经元被激活容易程度(偏置太大,我们就得设较大的权重使得总和大于偏置才能输出1)。

2.4 感知机的局限性

根据感知机的表达式,我们可以得到y=w*x+b这个函数,这个函数的图像是一条直线,例如:

但是有的区域分割,通过一条直线是无法直接分割为两部分的,比如下面的这个异或门。 

2.4.1 异或门

异或门的图像如下:

可以看到上述的 无法用直线分为两部分。这就是单层感知机的局限性。感知机的局限性就在于它只能表示由一条直线分割的空间。

2.4.2 线性和非线性

曲线分割而成的空间称为非线性空间,由直线分割而成的空间称为线性空间。

2.5 多层感知机

异或门无法直接表示,但是我们可以使用现有的简单逻辑电路进行组合,这就跟多层感知机的原理一样。

2.5.1 已有门电路的组合

2.5.2 异或门的实现

根据上面的组合,我们可以直接调用我们上述的简单逻辑电路函数,所以根据下面的真值表进行调用:

 得到的代码如下:

import numpy as npdef AND(x1,x2):x = np.array([x1,x2])w = np.array([0.5,0.5])b = -0.7tmp = np.sum(w*x) + bif tmp > 0:return 1else:return 0def NAND(x1,x2):x = np.array([x1,x2])w = np.array([-0.5,-0.5])b = 0.7tmp = np.sum(w*x) + bif tmp > 0:return 1else:return 0def OR(x1,x2):x = np.array([x1,x2])w = np.array([0.5,0.5])b = -0.4tmp = np.sum(w*x) + bif tmp > 0:return 1else:return 0
def XOR(x1,x2):y1 = NAND(x1,x2)y2 = OR(x1,x2)y = AND(y1,y2)return yprint(AND(0,0))
print(AND(0,1))
print(AND(1,0))
print(AND(1,1))
print("\n")
print(NAND(0,0))
print(NAND(0,1))
print(NAND(1,0))
print(NAND(1,1))
print("\n")
print(OR(0,0))
print(OR(0,1))
print(OR(1,0))
print(OR(1,1))
print("\n")
print(XOR(0,0))
print(XOR(0,1))
print(XOR(1,0))
print(XOR(1,1))

然后输出结果:

 

异或门的实现就可以理解为多层感知机的实现,通过叠加单层感知机来实现多层感知机。

2.6 从与非门到计算机

感知机通过叠加层能够进行非线性的表示,理论上还可以表示计算机进行的处理。

2.7 小结

ok,今天暂且这样,明天学习神经网络。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词