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