如何用代码编写一个神经网络异或运算器?
我们先来看下异或问题的真值表:
从真值表上,我们看到,异或问题的输出和任何单个输入间都不存在线性关系,而是由两个输入同时决定。这就意味着,如果我们仅仅将输入层和输出层直接连接起来,网络无法成功学习异或运算。换句话说,我们至少需要一个隐藏层。
所以,我们的神经网络将是一个三层架构:输入层、隐藏层、输出层。
确定了网络的层数之后,我们接着考虑激活函数。因为输出是1或0,因此我们选用sigmoid作为激活函数。
随机初始化权重,使用反向传播和梯度下降,我们就得到了进行异或运算的神经网络。
下面的示例代码使用Python,不过这一逻辑是通用的,换成其他语言也一样。
导入numpy(这将是我们唯一的依赖)
import numpy as np
前向传播(X为输入数据,我们这里省略了sigmoid的定义,和随机化初始化权重w0、w0的过程)
l0 = X
l1 = sigmoid(np.dot(l0, w0))
l2 = sigmoid(np.dot(l1, w1))
看下当前误差多少(y为ground truth,也就是标准答案)
l2_error = y - l2
反向传播(deriv_sigmoid为sigmoid的导数,这里我们省略了它的定义)
l2_delta = l2_error * deriv_sigmoid(l2)
l1_error = l2_delta.dot(w1.T)
l1_delta = l1_error * deriv_sigmoid(l1)
w1 += l1.T.dot(l2_delta)
w0 += l0.T.dot(l1_delta)
将以上过程迭代个几万次,就是训练神经网络。
Copyright © 广州京杭网络科技有限公司 2005-2025 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有