Pybrain学习笔记-3 使用Pybrain构建前馈神经网络

来源:互联网 发布:武汉矩阵科技有限公司 编辑:程序博客网 时间:2024/06/05 10:10

Pybrain学习笔记-3 使用Pybrain构建前馈神经网络

注:原创博文,转载请注明出处:http://blog.csdn.net/m0_37887016

参考文档:http://www.pybrain.org/docs/index.html


使用模块和链接构建神经网络

引言:

    在上一篇学习笔记中,我们已经看到如何使用buildNetwork创建网络,但是通过之前的代码发现所创建的神经网络过于简化,无法解决更复杂的问题,因此,我们现在将探讨如何从头开始创建网络。下面将使用PyBrain最基本的结构元素:FeedForwardNetwork类,并使用它的Module类和Connection类来创建前馈神经网络。有关RecurrentNetwork将在搞懂FeedForwardNetwork之后再进行研究。

前馈神经网络

    我们从一个简单的例子开始,构建一个多层感知器(可以理解为很简单的神经网络)。

    首先我们使用FeedForwardNetwork()函数,建立一个神经网络架构

 

接下来,构建网络的输入,隐藏和输出图层(Pybrain提供了不同的层次类,可以参考modules package)

 

为了使用它们,我们必须将它们添加到网络中,分别调用用addInputModule、addModule、addOutputModule。

 

    实际上我们可以添加多个输入和输出模块。网络必须知道哪个模块是输入和输出模块,以便转发传播输入和传播错误。它仍然需要明确确定如何连接。为此,我们使用最常见的连接类型,它通过将每个神经元的每个神经元连接到另一个的每个神经元,从而产生层之间的完全连接。 这是由FullConnection()类实现的。

与模块一样,我们必须将它们明确地添加到网络中,使用的是addConnection()方法。

 

所有的元素都已经到位了,所以我们可以做最后一步,使我们的MLP(神经网络)可用,即调用.sortModules()方法。

 

这个调用在网络最终被使用之前需要进行一些内部初始化:例如,拓扑排序已经连接好的各个模块。

 

检查前馈神经网络

    我们可以打印出神经网络的结构。请注意,机器上的输出不一定是一样的。因为网络的权值是随机分配的。

使用网络的一种方法是使用要转换的输入,并调用其“activate()”方法:

当然,因为连接权重的随机初始化,每次输入相同的参数得到的结果也是不尽相同的, 要查看这些参数,只需检查连接的.params字段。

    我们可以直接访问连接的可训练参数(权重),或者一次读取网络的所有权重。

封装模块的网络实际上也保留了参数即可以直接打印n.params。

我们发现,这打印出的权重列表中的最后三个参数等于第二个连接的参数。

 

 

给神经网络命名

    在某些设置中,给出网络的部分显式标识符是有意义的。结构组件派生自Named类,这意味着它们具有一个属性.name,您可以通过它来识别它。 如果没有给出名称,将自动生成一个新的名称。

    子类也可以通过在初始化时传递name参数来命名:通过使用自定义的网络的名称,打印输出看起来更简洁易读。 他们还确保您的网络组件在每次运行程序时都以相同的方式命名。

下面贴出第四个模块的代码,实测可用:

4.test_pybrain_4

#!usr/bin/env python#_*_coding:utf-8_*_'''Created on 2017年4月14日Topic:Building Networks with Modules and Connections@author: Stuart斯图尔特'''from pybrain.structure import FeedForwardNetwork#首先我们制作一个新的FeedForwardNetwork对象:n = FeedForwardNetwork()#接下来,我们正在构建输入,隐藏和输出图层:from pybrain.structure import LinearLayer,SigmoidLayerinLayer = LinearLayer(2)hiddenLayer = SigmoidLayer(3)outLayer = LinearLayer(1)#为了使用它们,我们必须将它们添加到网络中n.addInputModule(inLayer)n.addModule(hiddenLayer)n.addOutputModule(outLayer)#用fullConnection类实现模块之间的连接from pybrain.structure import FullConnection#连接输入层和隐含层,连接隐含层和输出层,实际上这里是形成了新的两个connection模块in_to_hidden = FullConnection(inLayer,hiddenLayer)hidden_to_out = FullConnection(hiddenLayer,outLayer)#再将上述链接好的两个模块加入网络n.addConnection(in_to_hidden)n.addConnection(hidden_to_out)#调用.sortModules()方法使建立的MLP网络可用n.sortModules()#打印神经网络的结构print n#使用.activate()方法进行输入,从而使用网络print n.activate([1,2])#使用.params属性访问网络的权重参数,打印网络中存在的两个连接的参数print in_to_hidden.paramsprint hidden_to_out.params#查看网络封装模块的参数(实际上就是打印出各个层之间的权重列表)  等价于上两条语句总和print n.params#自定义各层名称,通过修改.name属性print LinearLayer(2)print LinearLayer(2,name = 'foo')

    至此,前馈神经网络的建立以及网络信息的获取已经明确,我们可以通过pybrain建立更复杂的神经网络并很快将网络初始化,是不是很方便,如果自己写个project来创建神经网络的话,恐怕要用不止一天的时间吧。学以致用才是王道,因此后续将继续学习pybrain,使用前馈神经网络解决具体的分类问题,十分期待有木有。

    Ps:程序小猿,个人能力和表达能力有限,如有错误欢迎指正交流。码字不易,转载请注明出处(笔芯)。

0 0
原创粉丝点击