多语言展示
当前在线:1386今日阅读:183今日分享:45

一个简单的神经网络代码的分析

本文,着重学习一下python大牛的代码(稍有修改)。下面是代码的截图。本文的目的,是一步一步的解释这个代码。
工具/原料
1

电脑

2

python3

方法/步骤
1

需要用到numpy模块:import numpy as np

2

自定义一个sigmoid函数:def sig(x,deriv=False):    if(deriv==True):        return x*(1-x)    return 1/(1+np.exp(-x))

3

引入训练集:x = np.array([[0,0,1],[0,1,1],[1,0,1],[1,1,1]])y = np.array([[0,0,1,1]]).Tx是自变量,也叫输入值;y是因变量,也叫输出值。

4

给出一个随机的1*3的矩阵s,并根据s构造一个1*4的矩阵l1:np.random.seed(1)s = 2*np.random.random((3,1)) - 1l0 = xl1 = sig(np.dot(l0,s))print(s,'\n\n\n')print(l1)

5

开始训练,使得l1逐步接近于y:for i in range(1000):    l0 = x    l1 = sig(np.dot(l0,s))    if i==0:        print(l1,'\n')    l1_e = y - l1    l1_d = l1_e * sig(l1,True)    s += np.dot(l0.T,l1_d)print(l1)一开始,l1是:[[0.2689864 ] [0.36375058] [0.23762817] [0.3262757 ]] 训练1000次之后,l1变成了:[[0.] [0.] [0.97906682] [0.97414645]]与y已经很接近了。

6

看看训练10000次的效果:for i in range(10000):    l0 = x    l1 = sig(np.dot(l0,s))    if i==0:        print(l1,'\n')    l1_e = y - l1    l1_d = l1_e * sig(l1,True)    s += np.dot(l0.T,l1_d)print(l1)

7

把训练的过程画出来,需要加载matplotlib模块:import matplotlib.pyplot as p然后画出折线图:a = []for i in range(10000):    l0 = x    l1 = sig(np.dot(l0,s))    a.append(l1[0,0])    l1_e = y - l1    l1_d = l1_e * sig(l1,True)    s += np.dot(l0.T,l1_d)n = 10000p.plot(range(n),a[:n],color = 'green')p.show()

8

如果要查看前36步的训练过程,只需要把n后面的数值改为36。

注意事项
1

代码里面,最难理解的部分,是粗体部分,需要读者自己去体会。

2

这个过程比较简单,所以,不管你训练一万次,还是一亿次,都不会发生过拟合现象。

推荐信息