Chris,
Yes, this should work if you get the format of the inputs/targets just
right. (But, this isn't using the "pattern" feature of Conx; you're just
using the named layer method.) Here is AND again, but notice the list
inside the dicts:
from pyrobot.brain.conx import *
# create network
net = Network()
# create layers
net.addLayer('a', 1)
net.addLayer('b', 1)
net.addLayer('f', 1)
net.connect('a', 'f')
net.connect('b', 'f')
# set training corpus:
corpus = [
[dict(a=[0.0], b=[0.0]), dict(f=[0.0])],
[dict(a=[0.0], b=[1.0]), dict(f=[0.0])],
[dict(a=[1.0], b=[0.0]), dict(f=[0.0])],
[dict(a=[1.0], b=[1.0]), dict(f=[1.0])],
]
net.setInputsAndTargets(corpus)
# set learning parameters
net.setEpsilon(0.5)
net.setTolerance(0.2)
net.setReportRate(1)
# learn
net.train()
It should learn in about 16 sweeps/epochs.
Patterns, on the other hand, are if you want to name a particular vector
(not layer). For example:
p = {"apple": [1, 0, 0, 1, 0],
"banana": [1, 1, 1, 0, 0]}
If you want to do that, then you would call net.setPatterns(p), and you
could combine that with the named layers. Here is an example with both:
from pyrobot.brain.conx import *
# create network
net = Network()
# create layers
net.addLayer('a', 1)
net.addLayer('b', 1)
net.addLayer('f', 1)
net.connect('a', 'f')
net.connect('b', 'f')
p = {"zero": [0.0],
"one" : [1.0]}
net.setPatterns(p)
# set training corpus:
corpus = [
[dict(a="zero", b="zero"), dict(f="zero")],
[dict(a="zero", b="one"), dict(f="zero")],
[dict(a="one", b="zero"), dict(f="zero")],
[dict(a="one", b="one"), dict(f="one")],
]
net.setInputsAndTargets(corpus)
# set learning parameters
net.setEpsilon(0.5)
net.setTolerance(0.2)
net.setReportRate(1)
# learn
net.train()
Notice that the lists inside the dicts is now in the pattern itself.
-Doug
Chris S wrote:
> Hi Doug,
>
> A while ago we talked about giving networks named inputs and outputs
> for training and propagation. You mentioned this was implemented, but
> I've been having problems using this feature.
>
> As a test I've tried creating a network for simulating a simple
> logical AND. The two inputs are named 'a' and 'b', and the output is
> named 'f'. Below is my sample code, and the error it generates. Am I
> using this feature correctly?
>
> Regards,
> Chris
>
> from pyrobot.brain.conx import *
>
> # create network
> net = Network()
>
> # create layers
> net.addLayer('a', 1)
> net.addLayer('b', 1)
> net.addLayer('f', 1)
> net.connect('a', 'f')
> net.connect('b', 'f')
>
> # set patterns
> patterns = [
> [dict(a=0.0, b=0.0), dict(f=0.0)],
> [dict(a=0.0, b=1.0), dict(f=0.0)],
> [dict(a=0.0, b=0.0), dict(f=0.0)],
> [dict(a=0.0, b=0.0), dict(f=1.0)],
> ]
> net.setInputsAndTargets(patterns)
>
> # set learning parameters
> net.setEpsilon(0.5)
> net.setTolerance(0.2)
> net.setReportRate(1)
>
> # learn
> net.train()
>
>>>>
> Conx, version 1.229 (regular speed)
> Conx using seed: 1164933601.75
> Traceback (most recent call last):
> File "C:\Documents and Settings\TEMP\Desktop\nntest.py", line 37, in ?
> net.train()
> File "C:\Program
> Files\Python24\lib\site-packages\pyrobot\brain\conx.py", line 1685, in
> train
> (tssErr, totalCorrect, totalCount, totalPCorrect) = self.sweep()
> File "C:\Program
> Files\Python24\lib\site-packages\pyrobot\brain\conx.py", line 1820, in
> sweep
> (error, correct, total, pcorrect) = self.step( **datum )
> File "C:\Program
> Files\Python24\lib\site-packages\pyrobot\brain\conx.py", line 1752, in
> step
> self.propagate(**args)
> File "C:\Program
> Files\Python24\lib\site-packages\pyrobot\brain\conx.py", line 1964, in
> propagate
> self.copyActivations(layer, args[key])
> File "C:\Program
> Files\Python24\lib\site-packages\pyrobot\brain\conx.py", line 1415, in
> copyActivations
> layer.copyActivations(vector[start:start+layer.size])
> TypeError: unsubscriptable object
> _______________________________________________
> Pyro-users mailing list
> [email protected]
> http://emergent.brynmawr.edu/mailman/listinfo/pyro-users
>
>