Pybrain学习笔记-2 Pybrain快速入门
注:原创博文,转载请注明出处:http://blog.youkuaiyun.com/m0_37887016
参考文档:http://www.pybrain.org/docs/index.html
一、安装pybrain模块
1.安装numpy
2.安装scipy
3.安装pybrain
Pybrain模块的安装首先依赖numpy和scipy,确保在安装之前,你已经安装了这两个模块,模块的安装办法可以参靠我的博文“Python模块的安装”
二、快速入门
1.建立神经网络
要快速启动快速入门,只需启动Python,我们将在翻译器中完成所有操作(我用的IDE是eclipse+anaconda+Python2.7,当然也可以直接在控制台进行测试):
在PyBrain中,网络由互相关联的模块和连接组成。你可以将网络视为有向非循环图,其中节点为模块,边缘为连接。 这使得PyBrain非常灵活,当然,这种结构不是在所有情况下都是必须的。
建立神经网络的快捷方式
因此,有一种创建网络的简单方法,即buildNetwork快捷方式:
此调用返回一个具有两个输入,三个隐藏和单个输出神经元的网络。 在PyBrain中,这些图层是Module对象,它们已经连接到FullConnection对象。
激活网络
网络已经用随机值初始化 - 我们已经可以计算出其输出值:
为此,我们使用.activate()方法,它期望一个列表,元组或数组作为输入。
检查结构
我们如何检查网络的结构呢? 在PyBrain中,网络的每个部分都有一个可以访问它的名称。使用buildNetwork快捷方式构建网络时,这些部分将自动命名:
隐藏层最后有数字,主要是与一些其他的关键字起到区别的作用。
更复杂的网络
当然,我们希望在建立网络时有更大的灵活性。 例如,默认情况下,隐藏层被构造为S形挤压函数:但是在很多情况下,这不是我们想要的。 我们也可以提供不同类型的图层:
我们还能做更多改动,比如,我们同样可以给输出层设置不同的类:
我们也可以告诉网络使用偏置值:
这种方法当然有一些限制:例如,我们只能构建前馈拓扑。但是可以使用PyBrain创建非常复杂的架构,这也是“pybrain使用说明书”的优势之一。
2.构造数据集
为了让我们的网络学习任何东西,我们需要一个包含输入和目标的数据集。 PyBrain的pybrain.dataset包解决了这个问题,我们将使用SupervisedDataSet类来实现这样的功能。
一个定制的数据集
SupervisedDataSet类用于标准监督学习。 它支持输入和目标值,我们必须在对象创建时指定它们的大小:
这里我们生成了一个支持二维输入和一维标注信息的数据集。
加入实例
神经网络训练的典型例子是XOR函数,所以我们为此建立一个数据集。 我们可以通过将样本添加到数据集来实现:
检查数据集
我们现在已经有了一个数据集,其中有4个样本。 我们可以用python的惯用方式来检查一下数据集的大小:print len(ds)
我们自然也可以用迭代的方式来查看这个数据集:for inpt , target in ds:
我们可以直接访问输入和目标字段数组: ds[‘input’] , ds[‘target’]
也可以再次清除数据集,并从中删除所有值: ds.clear
3.在数据集上训练神经网络
为了调整监督学习中的模块参数,PyBrain内置一个训练器。 训练器的参数分别是一个神经网络模型和一个数据集,训练神经网络模型以适应数据集中的数据。
训练神经网络的典型方法是误差反向传播算法。 PyBrain当然有反向传播,我们将在这里使用BackpropTrainer(误差反向传播训练器):
我们已经为XOR建立了一个数据集,我们也学会了构建可以处理这些问题的网络。 让我们用训练器BackpropTrainer将二者联系起来,然后调用train()方法来对网络进行训练。
单独调用train()方法只能训练一个完整时期的网络,并返回一个误差值。
如果我们要训练网络直到网络收敛,还有另一种方法trainUntilConvergence(),方法名字很好记,“训练直到收敛”这返回一大堆数据,包含每个训练周期的误差元组。而且会发现误差数组的每个元素是逐渐减小的,说明网络逐渐收敛。
下面贴出三个模块的代码,实测可用:
1.test_pybrian_1
#!usr/bin/env python
#_*_coding:utf-8_*_
'''
Created on 2017年4月13日
Topic:Building a Network
@author: Stuart斯图尔特
'''
from pybrain.tools.shortcuts import buildNetwork
from pybrain.structure import TanhLayer
from pybrain.structure import SoftmaxLayer
from pybrain.datasets import SupervisedDataSet
#构建一个神经网络,简单的进行激活并打印各层的名称信息
net = buildNetwork(2,3,1)
print net.activate([2,1])
print "net['in'] = " , net['in']
print "net['hidden0'] = " , net['hidden0']
print "net['out'] = " , net['out']
#自定义复杂网络,把神经网络的默认隐含层参数设置为Tanh函数而不是Sigmoid函数
#from pybrain.structure import TanhLayer
net = buildNetwork(2,3,1,hiddenclass = TanhLayer)
print "net['hidden0_1'] = " , net['hidden0']
#自定义复杂网络,修改输出层的类型
#from pybrain.structure import SoftmaxLayer
net = buildNetwork(2,3,2,hiddenclass = TanhLayer,outclass = SoftmaxLayer)
print net.activate((2,3))
net = buildNetwork(2,3,1,bias = True)
print net['bias']
2.test_pybrain_2
#!usr/bin/env python
#_*_coding:utf-8_*_
'''
Created on 2017年4月14日
Topic:Building a Dataset
@author: Stuart斯图尔特
'''
from pybrain.datasets import SupervisedDataSet
from pybrain.datasets import UnsupervisedDataSet
ds = SupervisedDataSet(2,1)
ds.addSample((0,0), (0,))
ds.addSample((0,1), (1,))
ds.addSample((1,0), (1,))
ds.addSample((1,1), (0,))
print '检查数据集的长度'
print len (ds)
print'用for循环迭代的方式访问数据集'
for inpt,target in ds:
print inpt,target
print '直接访问输入字段和标记字段的数组'
print ds['input']
print ds['target']
print '清除数据集'
#ds.clear()
#print ds['input']
#print ds['target']
3.test_pybrian_3
#!usr/bin/env python
#_*_coding:utf-8_*_
'''
Created on 2017年4月14日
Topic:Training your Network on your Dataset
@author: Stuart斯图尔特
'''
#引入建立神经网络所需的相关模块
from pybrain.tools.shortcuts import buildNetwork
from pybrain.structure import TanhLayer
#引入建立数据集所需的相关模块
from pybrain.datasets import SupervisedDataSet
#引入BackpropTrainer反向训练器
from pybrain.supervised.trainers import BackpropTrainer
#引入之前建好的建立数据集中的module
from my_pybrain import test_pybrain_2 #my_pybrain是包名,test_pybrain_2是module名
#import test_pybrain_2
'''
ds = SupervisedDataSet(2,1)
ds.addSample((0,0), (0,))
ds.addSample((0,1), (1,))
ds.addSample((1,0), (1,))
ds.addSample((1,1), (0,))
'''
net = buildNetwork(2,3,1,bias = True,hiddenclass=TanhLayer)
trainer = BackpropTrainer(net,test_pybrain_2.ds) #应用之前建立的ds数据集
#通过调用train()方法来对网络进行训练
print trainer.train()
#通过调用trainUntilConvertgence()方法对网络训练直到收敛
print trainer.trainUntilConvergence()
至此,利用pybrain建立简单的神经络、建立有监督数据集、训练神经网络的基本操作与模块已经大致了解了,后续将进一步对pybrain的功能进行学习,如建立更明确的前馈神经网络模型,以及利用pybrian进行分类任务。
Ps:程序小猿,个人能力和表达能力有限,如有错误欢迎指正交流。码字不易,转载请注明出处(笔芯)。