赞
踩
感知器(有些成为感知机)属于一种简单的神经元,在神经网络中通常感知机与神经元的区别就是激活函数的不同,一般常用的激活函数是sigmoid函数,感知机中为step function(阶跃函数)
给出一组矩阵,利用神经网络的反向传播功能(BP)来训练一种能够实现逻辑与、或的感知器(最重要的是训练权重w和偏置b)
- import numpy as np
- samples_and = [
- [0, 0, 0],
- [1, 0, 0],
- [0, 1, 0],
- [1, 1, 1],
- ]
- samples_or = [
- [0, 0, 0],
- [1, 0, 1],
- [0, 1, 1],
- [1, 1, 1],
- ]
- samples_xor = [
- [0, 0, 0],
- [1, 0, 1],
- [0, 1, 1],
- [1, 1, 0],
- ]
-
- def perception(samples):
- #权重
- w=np.array([1,2])
- #偏置
- b=0
- a=1
- #训练10遍
- for i in range(10):
- for j in range(4):
- #矩阵的第j行的前两个数值
- x=np.array(samples[j][:2])
- #将未激活的值输入sigmoid函数 dot:向量的点乘运算
- if np.dot(w,x)+b >0:
- y=1
- else:
- y=0
- #真实值
- d=np.array(samples[j][2])
- delta_b=a*(d-y)
- delta_w=a*(d-y)*x
- print('epoch {} sample [{} {} {} {} {} {} {}]'.format(
- i,j,w[0],w[1],b,y,delta_w[0],delta_w[1],delta_b
- ))
- #反向传播,更新权重
- w=w+delta_w
- b=b+delta_b
-
- if __name__=='__main__':
- print('logical and:')
- perception(samples_and)
- print('logical or:')
- perception(samples_or)
- print('logical xor:')
- perception(samples_xor)

逻辑与的输出:
可以看出从第三次训练后,通过神经网络的BP,权重w0,w1和b已经趋于稳定
w0=1,w1=2,b=-2
逻辑或的输出:
对于逻辑或,从输出样本的第一次训练之后,对权重和偏置的BP趋于稳定,
w0=1,w1=2,b=0
逻辑异或的输出:
对于异或数据的训练,每一次反馈得到的w0,w1和b都不同,可以得出感知器不能实现异或的功能,也就是不能训练处得到实现异或功能的模型。
解释为什么这⾥的代码⽆法完成带异或功能的感知器
逻辑与和逻辑或都是线性的模型,它的输入和输出都是在一条直线上,这条直线将平面区域分割为两份,在直线的两端分别满足大于和小于0,在直线上满足等于0,也就是说它是线性的。
而逻辑异或它在平面区域中是两条交叉的直线,也就是说它是线性不可分的,如下图所示
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。