PyBrain - Warstwy
Warstwy to w zasadzie zestaw funkcji używanych w ukrytych warstwach sieci.
W tym rozdziale omówimy następujące szczegóły dotyczące warstw -
- Warstwa zrozumienia
- Tworzenie warstwy za pomocą Pybrain
Zrozumienie warstw
Wcześniej widzieliśmy przykłady, w których używaliśmy warstw w następujący sposób -
- TanhLayer
- SoftmaxLayer
Przykład przy użyciu TanhLayer
Poniżej znajduje się jeden przykład, w którym wykorzystaliśmy TanhLayer do budowy sieci -
testnetwork.py
from pybrain.tools.shortcuts import buildNetwork
from pybrain.structure import TanhLayer
from pybrain.datasets import SupervisedDataSet
from pybrain.supervised.trainers import BackpropTrainer
# Create a network with two inputs, three hidden, and one output
nn = buildNetwork(2, 3, 1, bias=True, hiddenclass=TanhLayer)
# Create a dataset that matches network input and output sizes:
norgate = SupervisedDataSet(2, 1)
# Create a dataset to be used for testing.
nortrain = SupervisedDataSet(2, 1)
# Add input and target values to dataset
# Values for NOR truth table
norgate.addSample((0, 0), (1,))
norgate.addSample((0, 1), (0,))
norgate.addSample((1, 0), (0,))
norgate.addSample((1, 1), (0,))
# Add input and target values to dataset
# Values for NOR truth table
nortrain.addSample((0, 0), (1,))
nortrain.addSample((0, 1), (0,))
nortrain.addSample((1, 0), (0,))
nortrain.addSample((1, 1), (0,))
#Training the network with dataset norgate.
trainer = BackpropTrainer(nn, norgate)
# will run the loop 1000 times to train it.
for epoch in range(1000):
trainer.train()
trainer.testOnData(dataset=nortrain, verbose = True)
Wynik
Dane wyjściowe dla powyższego kodu są następujące -
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)
Przykład użycia SoftMaxLayer
Poniżej znajduje się przykład, w którym użyliśmy SoftmaxLayer do budowy sieci -
from pybrain.tools.shortcuts import buildNetwork
from pybrain.structure.modules import SoftmaxLayer
from pybrain.datasets import SupervisedDataSet
from pybrain.supervised.trainers import BackpropTrainer
# Create a network with two inputs, three hidden, and one output
nn = buildNetwork(2, 3, 1, bias=True, hiddenclass=SoftmaxLayer)
# Create a dataset that matches network input and output sizes:
norgate = SupervisedDataSet(2, 1)
# Create a dataset to be used for testing.
nortrain = SupervisedDataSet(2, 1)
# Add input and target values to dataset
# Values for NOR truth table
norgate.addSample((0, 0), (1,))
norgate.addSample((0, 1), (0,))
norgate.addSample((1, 0), (0,))
norgate.addSample((1, 1), (0,))
# Add input and target values to dataset
# Values for NOR truth table
nortrain.addSample((0, 0), (1,))
nortrain.addSample((0, 1), (0,))
nortrain.addSample((1, 0), (0,))
nortrain.addSample((1, 1), (0,))
#Training the network with dataset norgate.
trainer = BackpropTrainer(nn, norgate)
# will run the loop 1000 times to train it.
for epoch in range(1000):
trainer.train()
trainer.testOnData(dataset=nortrain, verbose = True)
Wynik
Dane wyjściowe są następujące -
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)
Tworzenie warstwy w Pybrain
W Pybrain możesz stworzyć własną warstwę w następujący sposób -
Aby utworzyć warstwę, musisz użyć NeuronLayer class jako klasa bazowa do tworzenia wszystkich typów warstw.
Przykład
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
Aby stworzyć warstwę, musimy zaimplementować dwie metody: _forwardImplementation () i _backwardImplementation () .
The _forwardImplementation() takes in 2 arguments inbufi outbuf, które są tablicami Scipy. Jego rozmiar zależy od wymiarów wejściowych i wyjściowych warstw.
Funkcja _backwardImplementation () służy do obliczania pochodnej wyniku w odniesieniu do podanego wejścia.
Aby zaimplementować warstwę w Pybrain, jest to szkielet klasy warstwy -
from pybrain.structure.modules.neuronlayer import NeuronLayer
class NewLayer(NeuronLayer):
def _forwardImplementation(self, inbuf, outbuf):
pass
def _backwardImplementation(self, outerr, inerr, outbuf, inbuf):
pass
Jeśli chcesz zaimplementować kwadratową funkcję wielomianu jako warstwę, możemy to zrobić w następujący sposób -
Rozważmy, że mamy funkcję wielomianową jako -
f(x) = 3x2
Pochodna powyższej funkcji wielomianowej będzie następująca -
f(x) = 6 x
Ostateczna klasa warstwy dla powyższej funkcji wielomianu będzie następująca -
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
Teraz skorzystajmy z utworzonej warstwy, jak pokazano poniżej -
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 () sprawdzi, czy warstwa działa dobrze, czy nie. Musimy przejść przez sieć, w której warstwa jest używana do gradientu Check (n). Jeśli warstwa działa poprawnie, na wyjściu otrzymamy „Perfect Gradient”.
Wynik
C:\pybrain\pybrain\src>python testlayer1.py
Perfect gradient