本篇文章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