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,SigmoidLayer
inLayer = 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.params
print hidden_to_out.params
#查看网络封装模块的参数(实际上就是打印出各个层之间的权重列表) 等价于上两条语句总和
print n.params
#自定义各层名称,通过修改.name属性
print LinearLayer(2)
print LinearLayer(2,name = 'foo')
至此,前馈神经网络的建立以及网络信息的获取已经明确,我们可以通过pybrain建立更复杂的神经网络并很快将网络初始化,是不是很方便,如果自己写个project来创建神经网络的话,恐怕要用不止一天的时间吧。学以致用才是王道,因此后续将继续学习pybrain,使用前馈神经网络解决具体的分类问题,十分期待有木有。
Ps:程序小猿,个人能力和表达能力有限,如有错误欢迎指正交流。码字不易,转载请注明出处(笔芯)。