本篇文章2774字,读完约7分钟
雷锋。本文作者陶燕琪。原文包含在作者的个人博客中。雷锋。(公开号码:雷锋。com)已被授权。
免责声明:这篇文章基于英语教程11行python中的神经网络。关于神经网络的更详细的介绍,请参考我的其他博客:从感知器到人工神经网络。
如果你读了下面的文章,你会对神经网络有更深的理解。如果你有任何问题,请给我更多的建议。
非常简单的神经网络
首先,确定我们想要完成的任务:
输出样本是x 4*3,有4个样本和3个属性,每个样本对于这个真值y是一个4*1的向量,所以我们应该根据输入值输出y值损失最小的输出。
两层神经网络首先考虑最简单的神经网络,如下图所示:
输入层有三个神经元(因为有三个属性),输出是一个值,w1、w2和w3是它的权重。输出为:
这里的f是σ函数:
一个重要的公式:
神经网络的优化过程如下:
1.损耗的前向传播
2.反向传播更新
简单的事情是,实现过程如下:
将numpy作为np导入
# sigmoid函数
# deriv = ture是导数
def nonlin(x,deriv=false):
如果(deriv==true):
返回x*(1-x)
返回1/(1+np.exp(-x))
#输入数据集
x = np.array([ [0,0,1],
[1,1,1],
[1,0,1],
[0,1,1] ])
#输出数据集
y = np.array([[0,1,1,0]])。t
#种子随机数进行计算
np.random.seed(1)
#用平均值0随机初始化权重
syn0 = 2*np.random.random((3,1)) - 1
#迭代次数
对于xrange(10000)中的iter:
#正向传播
# l0是输入层
l0 = x
l1 =非线性(np.dot(l0,syn0))
#我们错过了多少?
l1_error = y - l1
#乘以我们错过了多少
# L1值处sigmoid的斜率
l1_delta = l1_error *非线性(l1,真)
#更新权重
syn0 += np.dot(l0.t,l1_delta)
打印“培训后输出:”
打印l1
注意,这里计算的是总损耗,x(4*3)点w(3*1) = 4*1是四个输出值,因此
L1误差= y-l1也是一个4*1的向量。
注重理解:
# L1值处sigmoid的斜率
#nonlin(l1,真),这是sigmoid的导数
#正向计算,反向推导
l1_delta = l1_error *非线性(l1,真)
#更新权重
syn0 += np.dot(l0.t,l1_delta)
让我们看一个单独的训练样本。真值y==1,训练值0.99非常接近正确值,因此此时syn0的值应该变化很小。因此:
运行输出为,您可以看到它的训练很好:
培训后的输出:
训练后输出:[[ 0.00966449]
[ 0.99211957]
[ 0.99358898]
[ 0.00786506]]123456123456
众所周知,两层神经网络是一个小型感知器(参考:感知器到人工神经网络),它只能产生线性可分的数据。如果线性不可分,结果将很差,如下图所示:
如果仍然使用上述代码(2层神经网络),结果是:
培训后的输出:[[ 0.5]
[ 0.5]
[ 0.5]
[ 0.5]]1234512345
因为数据不是线性可分的,所以它是一个非线性问题。神经网络的优势在于它可以建立更多的层来处理非线性问题。
接下来,我将构建一个包含五个神经元的隐藏层,其图形如下(我自己画的,略显难看),这意味着神经网络实际上非常简单,只要你清楚地思考该层的结果。
需要了解的是,从第一层到第二层的W: W的维数是3*5,从第二层到第三层的W是5*1,所以仍然是同样的两个步骤:向前计算误差,然后反向推导和更新W。
完整的代码如下:
将numpy作为np导入
def nonlin(x,deriv=false):
如果(deriv==true):
返回x*(1-x)
返回1/(1+np.exp(-x))
x = np.array([[0,0,1],
[0,1,1],
[1,0,1],
[1,1,1]])
y = np.array([[0],
[1],
[1],
[0]])
np.random.seed(1)
#用平均值0随机初始化我们的权重
syn0 = 2*np.random.random((3,5)) - 1
syn1 = 2*np.random.random((5,1)) - 1
对于xrange(60000)中的j:
#通过第0、1和2层前馈
l0 = x
l1 =非线性(np.dot(l0,syn0))
l2 =非线性(np.dot(l1,syn1))
#我们错过了多少目标值?
l2_error = y - l2
如果(j % 10000)= 0:
打印"错误:"+ str(np.mean(np.abs(l2_error)))
#目标值的方向是什么?
#我们真的确定吗?如果是这样,不要改变太多。
l2 _ delta = l2 _ error *非线性(l2,deriv=true)
#每个l1值对l2误差的影响有多大(根据权重)?
L1 _ error = L2 _δdot(syn 1 . t)
#目标l1在哪个方向?
#我们真的确定吗?如果是这样,不要改变太多。
l1_delta = l1_error *非线性(l1,deriv=true)
syn1 += l1.t.dot(l2_delta)
syn0 += l0.t.dot(l1_delta)
打印l2
操作的结果是:
错误:0.500628229093
错误:0.00899024507125
错误:0.0060486255435
错误:0.00482794013965
错误:0.00412270116481
错误:0.00365084766242
#这部分是最终输出
[[ 0.00225305]
[ 0.99723356]
[ 0.99635205]
[ 0.00456238]]
如果你理解了上面的代码,你就可以建立自己的神经网络,不管它有多少层,或者每层有多少个神经元,都可以很容易地完成。当然,上面建立的神经网络只是一个非常简单的网络,还有很多细节需要学习。例如,我们可以通过随机梯度下降更新W,同时,我们可以添加偏置项B和学习率α。
雷锋。com相关文章:
不到200行代码,教你如何用keras构建一个生殖对抗网络
如何在i5上实现20倍的python运行速度?
kaggle房价预测大赛获奖方案详解:python综合数据探索
雷锋文章版权所有。严禁擅自转载。详情请参考转载说明。
来源:搜狐微门户
标题:一篇文章教你用 11 行 Python 代码实现神经网络
地址:http://www.shwmhw.com/shxw/59806.html