PyBrain - 层
层基本上是一组用于网络隐藏层的函数。
我们将在本章中详细介绍层 −
- 了解层
- 使用 Pybrain 创建层
了解层
我们之前已经看到过使用层的示例,如下所示 −
- TanhLayer
- SoftmaxLayer
使用 TanhLayer 的示例
下面是我们使用 TanhLayer 构建网络的一个示例 −
testnetwork.py
from pybrain.tools.shortcuts import buildNetwork from pybrain.structure import TanhLayer from pybrain.datasets import SupervisedDataSet from pybrain.supervised.trainers import BackpropTrainer # 创建一个具有两个输入、三个隐藏和一个输出的网络 nn = buildNetwork(2, 3, 1, bias=True, hiddenclass=TanhLayer) # 创建一个与网络输入和输出大小匹配的数据集: norgate = SupervisedDataSet(2, 1) # 创建一个用于测试的数据集。 nortrain = SupervisedDataSet(2, 1) # 将输入和目标值添加到数据集 # NOR 真值表的值 norgate.addSample((0, 0), (1,)) norgate.addSample((0, 1), (0,)) norgate.addSample((1, 0), (0,)) norgate.addSample((1, 1), (0,)) # 将输入和目标值添加到数据集 # NOR 真值表的值 nortrain.addSample((0, 0), (1,)) nortrain.addSample((0, 1), (0,)) nortrain.addSample((1, 0), (0,)) nortrain.addSample((1, 1), (0,)) # 使用数据集 norgate 训练网络。 trainer = BackpropTrainer(nn, norgate) # 将运行循环 1000 次来训练它。 for epoch in range(1000): trainer.train() trainer.testOnData(dataset=nortrain, verbose = True)
输出
上述代码的输出如下 −
python testnetwork.py
C:\pybrain\pybrain\src>python testnetwork.py Testing on data: ('out: ', '[0.887 ]') ('correct:', '[1 ]') error: 0.00637334 ('out: ', '[0.149 ]') ('correct:', '[0 ]') error: 0.01110338 ('out: ', '[0.102 ]') ('correct:', '[0 ]') error: 0.00522736 ('out: ', '[-0.163]') ('correct:', '[0 ]') error: 0.01328650 ('All errors:', [0.006373344564625953, 0.01110338071737218, 0.005227359234093431, 0.01328649974219942]) ('Average error:', 0.008997646064572746) ('Max error:', 0.01328649974219942, 'Median error:', 0.01110338071737218)
使用 SoftMaxLayer 的示例
下面是我们使用 SoftmaxLayer 构建网络的一个示例 −
from pybrain.tools.shortcuts import buildNetwork from pybrain.structure.modules import SoftmaxLayer from pybrain.datasets import SupervisedDataSet from pybrain.supervised.trainers import BackpropTrainer # 创建一个具有两个输入、三个隐藏和一个输出的网络 nn = buildNetwork(2, 3, 1, bias=True, hiddenclass=SoftmaxLayer) # 创建一个与网络输入和输出大小匹配的数据集: norgate = SupervisedDataSet(2, 1) # 创建一个用于测试的数据集。 nortrain = SupervisedDataSet(2, 1) # 将输入和目标值添加到数据集 # NOR 真值表的值 norgate.addSample((0, 0), (1,)) norgate.addSample((0, 1), (0,)) norgate.addSample((1, 0), (0,)) norgate.addSample((1, 1), (0,)) # 将输入和目标值添加到数据集 # NOR 真值表的值 nortrain.addSample((0, 0), (1,)) nortrain.addSample((0, 1), (0,)) nortrain.addSample((1, 0), (0,)) nortrain.addSample((1, 1), (0,)) # 使用数据集 norgate 训练网络。 trainer = BackpropTrainer(nn, norgate) # 将运行循环 1000 次来训练它。 for epoch in range(1000): trainer.train() trainer.testOnData(dataset=nortrain, verbose = True)
输出
输出如下 −
C:\pybrain\pybrain\src>python example16.py Testing on data: ('out: ', '[0.918 ]') ('correct:', '[1 ]') error: 0.00333524 ('out: ', '[0.082 ]') ('correct:', '[0 ]') error: 0.00333484 ('out: ', '[0.078 ]') ('correct:', '[0 ]') error: 0.00303433 ('out: ', '[-0.082]') ('correct:', '[0 ]') error: 0.00340005 ('All errors:', [0.0033352368788838365, 0.003334842961037291, 0.003034328685718761, 0.0034000458892589056]) ('Average error:', 0.0032761136037246985) ('Max error:', 0.0034000458892589056, 'Median error:', 0.0033352368788838365)
在 Pybrain 中创建层
在 Pybrain 中,您可以按如下方式创建自己的层 −
要创建层,您需要使用 NeuronLayer 类 作为基类来创建所有类型的层。
示例
from pybrain.structure.modules.neuronlayer import NeuronLayer class LinearLayer(NeuronLayer): def _forwardImplementation(self, inbuf, outbuf): outbuf[:] = inbuf def _backwardImplementation(self, outerr, inerr, outbuf, inbuf): inerr[:] = outer
要创建一个 Layer,我们需要实现两个方法:_forwardImplementation() 和 _backwardImplementation()。
_forwardImplementation() 接受 2 个参数 inbuf 和 outbuf,它们是 Scipy 数组。其大小取决于层的输入和输出维度。
_backwardImplementation() 用于计算输出相对于给定输入的导数。
因此,要在 Pybrain 中实现一个层,这是层类的骨架 −
from pybrain.structure.modules.neuronlayer import NeuronLayer class NewLayer(NeuronLayer): def _forwardImplementation(self, inbuf, outbuf): pass def _backwardImplementation(self, outerr, inerr, outbuf, inbuf): pass
如果您想要将二次多项式函数实现为一个层,我们可以按如下方式执行 −
假设我们有一个多项式函数为 −
f(x) = 3x2
上述多项式函数的导数如下 −
f(x) = 6 x
上述多项式函数的最终层类如下 −
testlayer.py
from pybrain.structure.modules.neuronlayer import NeuronLayer class PolynomialLayer(NeuronLayer): def _forwardImplementation(self, inbuf, outbuf): outbuf[:] = 3*inbuf**2 def _backwardImplementation(self, outerr, inerr, outbuf, inbuf): inerr[:] = 6*inbuf*outerr
现在让我们利用如下所示创建的图层 −
testlayer1.py
from testlayer import PolynomialLayer from pybrain.tools.shortcuts import buildNetwork from pybrain.tests.helpers import gradientCheck n = buildNetwork(2, 3, 1, hiddenclass=PolynomialLayer) n.randomize() gradientCheck(n)
GradientCheck() 将测试该层是否工作正常。我们需要将使用该层的网络传递给 gradientCheck(n)。如果该层工作正常,它将输出"Perfect Gradient"。
输出
C:\pybrain\pybrain\src>python testlayer1.py Perfect gradient