<p>正如Ben Allison最初指出的,为了使网络能够逼近任意值(即不一定在<code>0..1</code>范围内),在最后一层中使用具有有限输出范围的激活函数非常重要。例如,线性激活函数应该能很好地工作。</p>
<p>下面是一个从pybrain的基本元素构建的简单回归示例:</p>
<pre><code>#----------
# build the dataset
#----------
from pybrain.datasets import SupervisedDataSet
import numpy, math
xvalues = numpy.linspace(0,2 * math.pi, 1001)
yvalues = 5 * numpy.sin(xvalues)
ds = SupervisedDataSet(1, 1)
for x, y in zip(xvalues, yvalues):
ds.addSample((x,), (y,))
#----------
# build the network
#----------
from pybrain.structure import SigmoidLayer, LinearLayer
from pybrain.tools.shortcuts import buildNetwork
net = buildNetwork(1,
100, # number of hidden units
1,
bias = True,
hiddenclass = SigmoidLayer,
outclass = LinearLayer
)
#----------
# train
#----------
from pybrain.supervised.trainers import BackpropTrainer
trainer = BackpropTrainer(net, ds, verbose = True)
trainer.trainUntilConvergence(maxEpochs = 100)
#----------
# evaluate
#----------
import pylab
# neural net approximation
pylab.plot(xvalues,
[ net.activate([x]) for x in xvalues ], linewidth = 2,
color = 'blue', label = 'NN output')
# target function
pylab.plot(xvalues,
yvalues, linewidth = 2, color = 'red', label = 'target')
pylab.grid()
pylab.legend()
pylab.show()
</code></pre>
<hr/>
<p>附带说明(因为在代码示例中有一个带有线性激活函数的隐藏层):在任何隐藏层中,线性函数都不有用,因为:</p>
<ul>
<li>该层输入端的权重形成一个线性变换</li>
<li>激活函数是线性的</li>
<li>输出端到该层的权重形成一个线性变换</li>
</ul>
<p>它可以简化为一个单一的线性变换,也就是说,它们对应的层也可以被消除,而不必对可逼近的函数集进行任何简化。神经网络的一个重要特点是隐层中的激活函数是非线性的。</p>