Python进行时:一个简单的神经网络实现及代码详解

来源:互联网 发布:psvita 电池 淘宝 编辑:程序博客网 时间:2024/04/30 12:16

神经网络是深度学习的基础,所以我认为,学习深度学习有两大基石,即:学好神经网络理论,学好实现理论的利器——Python。

一篇很好的文章,用Python编写了简单的BP神经网络,并几乎将所有代码解释了一遍。原文链接如下:http://python.jobbole.com/82758/

我在研究之后,自己试着重复那段程序,经过思考,终于理解了。下面是我在eclipse下编写的代码:

#-*-coding:utf-8 -*-import numpy as np#首先创建sigmoid函数def nonlin(x,deriv=False):    if deriv==True:        return x*(1-x)    return 1/(1+np.exp(-x))#然后创建x和yx=np.array([[1,0,0],            [0,0,1],            [0,1,0],            [1,0,1]    ])y=np.array([[1,0,0,1]]).T#创建syn0,为权重矩阵。随机生成,注意控制其范围在-1到1syn0=2*np.random.random([3,1])-1#训练网络,开始循环。根据差别修改权重矩阵-更新l0层数据-循环n次for i in xrange(1000):    #网络有两层,l0和l1.    l0=x    l1=nonlin(np.dot(l0,syn0))    l1_error=y-l1    l1_delta=l1_error*nonlin(l1,deriv=True)    syn0+=np.dot(l0.T,l1_delta)    print "the training result is:"print l1    
得到如下结果:

the training result is:
[[ 0.99849276]
 [ 0.04149694]
 [ 0.02333249]
 [ 0.96630778]]
可以看出,这与标准答案[1,0,0,1]已经很接近了。

不过,这样的训练也有缺陷,那就是过拟合。(说明我最近看的相关论文确实不少,哈哈)也就是说,输入别的实例时,结果可能与真实情况相差甚远。解决过拟合当然也有很多种方法,但上述例子操作简便,又是一切的基础,所以先将其实现。

这样的情况与《数值分析》有点像:数值分析的基本思想就是线性化,一个拉格朗日插值公式能用在数值微分、数值积分等多个领域。所谓难者不会,会者不难。

通过这几天的学习,我对深度学习也有了新的想法:深度学习就是发现那些不明显的特征,并把它们区分出来。这与数字图像处理中的时域到频域的变换有些神似,不知是不是巧合。卷积神经网络我还没有细看,或许那种网络就是基于这个思想吧。

0 0
原创粉丝点击