话说神经网络
此篇文章仿照大话神经网络,10行代码不调包,听不懂你打我来编写,写作目的只是记录学习过程,想看详细讲解请访问上面网址。
我们用一个例子来讲解简单的神经网络
我们来举一个去不去看电影的例子:
如花 | 小倩 | 小明 | 小强 |
---|---|---|---|
0 | 0 | 1 | 0 |
1 | 1 | 1 | 1 |
1 | 0 | 1 | 1 |
0 | 1 | 1 | 0 |
1 | 1 | 0 | ? |
0代表不去,1代表去
我们先观察一下这组数据的规律:只要如花去,小强就去,那么我们可以用一个公式来代替上面这个例子:AxW1+BxW2+CxW3=?,如图所示。机器学习就是我们不断试错不断改正,直到找到正确的结果的过程。
过程主要有以下几步:
- 初始化权重
- 按照权重计算结果
- 计算误差
- 根据误差调整权重
- 重复以上步骤10000次
过程有了,那么接下来我们开始写代码!
#引入库
from numpy import random,dot,exp,array
#初始化,将数据放到X里
X=array([[0,0,1],[0,1,1],[1,0,1],[1,1,1]])
#结果放到y里,T是转置的意思
y = array([[0,1,1,0]]).T
#1.设置随机权重
#引用一个随机种子
random.seed(3)
#首先生成3行1列的数范围在0-1之间,然后乘以2,再减一,就将数值控制再-1-1之间
weight =2*random.random((3,1))-1
# 循环
def fp(input):
l1_output = 1 / (1 + exp(-dot(input, w0)))
l2_output = 1 / (1 + exp(-dot(l1_output, w1)))
return l1_output,l2_output
def bp(l1,l2,y):
l1_error = y - l2
# 计算斜率
l1_slope = l2 * (1 - l2)
# 计算增量
l1_delta = l1_error * l1_slope
l0_slope =l1*(1-l1)
l0_error = l1_delta.dot(w1.T)
l0_dalta = l0_slope*l0_error
return l1_delta,l0_dalta
if __name__ == '__main__':
for it in range(10000):
# 两个矩阵相乘
l0=X
l1,l2 =fp(l0)
l1_delta,l0_dalta= bp(l1,l2,y)
#更新权重
w0 = w0+dot(l0.T,l0_dalta)
w1 =w1+dot(l1.T,l1_delta)
print(fp([[0,1,1]]))