1

I'm following evolino tutorial for PyBrain and run to this (slice indices must be integers or None or have an index method) error. I've googled this error and found there are some compatibility issue between PyBrain and Numpy above version 1.12. I've downgrade the Numpy to version 1.11.0, but the problem still persist

Traceback (most recent call last):
  File "/home/TA/neural_network.py", line 70, in <module>
    trainer.trainEpochs(1)
  File "/usr/local/lib/python2.7/dist-packages/pybrain/supervised/trainers/trainer.py", line 37, in trainEpochs
    self.train(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/pybrain/supervised/trainers/evolino.py", line 130, in train
    filter.apply(self._population)
  File "/usr/local/lib/python2.7/dist-packages/pybrain/supervised/evolino/filter.py", line 115, in apply
    fitness = self._evaluateNet(net, dataset, self.wtRatio)
  File "/usr/local/lib/python2.7/dist-packages/pybrain/supervised/evolino/filter.py", line 57, in _evaluateNet
    sequence = dataset.getSequence(i)[1]
  File "/usr/local/lib/python2.7/dist-packages/pybrain/datasets/sequential.py", line 55, in getSequence
    return [self._getSequenceField(index, l) for l in self.link]
  File "/usr/local/lib/python2.7/dist-packages/pybrain/datasets/sequential.py", line 44, in _getSequenceField
    return self.getField(field)[ravel(self.getField('sequence_index'))[index]:]            
TypeError: slice indices must be integers or None or have an __index__ method

Process finished with exit code 1

code:

from pylab import plot, show, ion, cla, subplot, title, figlegend, draw
import numpy

from pybrain.structure.modules.evolinonetwork import EvolinoNetwork
from pybrain.supervised.trainers.evolino import EvolinoTrainer
from sin_generator import generateSuperimposedSineData

print()
print("=== Learning to extrapolate 5 superimposed sine waves ===")
print()
sinefreqs = (0.2, 0.311, 0.42, 0.51, 0.74)
metascale = 8.
scale = 0.5 * metascale
stepsize = 0.1 * metascale

# === create training dataset
# the sequences must be stored in the target field
# the input field will be ignored
print ("creating training data")
trnInputSpace = numpy.arange(0*scale, 540*scale, stepsize)
trnData = generateSuperimposedSineData(sinefreqs, trnInputSpace)

# === create testing dataset
print("creating test data")
tstInputSpace = numpy.arange(400*scale, 540*scale, stepsize)
tstData = generateSuperimposedSineData(sinefreqs, tstInputSpace)

# === create the evolino-network
print("creating EvolinoNetwork")
net = EvolinoNetwork(trnData.outdim, 40)

wtRatio = 1./3

# === init an evolino trainer
# it will train network through evolutionary algorithms
print("creating EvolinoTrainer")
trainer = EvolinoTrainer(
    net,
    dataset=trnData,
    subPopulationSize = 20,
    nParents = 8,
    nCombinations = 1,
    initialWeightRange = (-0.01, 0.01),
    backprojectionFactor = 0.001,
    mutationAlpha = 0.001,
    nBurstMutationEpochs = numpy.Infinity,
    wtRatio = wtRatio,
    verbosity = 2
)

# === prepare sequences for extrapolation and plotting
trnSequence = trnData.getField('target')
seperatorIdx = int(len(trnSequence)*wtRatio)
trnSequenceWashout = trnSequence[0:seperatorIdx]
trnSequenceTarget = trnSequence[seperatorIdx:]

tstSequence = tstData.getField('target')
seperatorIdx = int(len(tstSequence)*wtRatio)
tstSequenceWashout = tstSequence[0:seperatorIdx]
tstSequenceTarget = tstSequence[seperatorIdx:]

ion() #switch matplotlib to interactive mode
for i in range(3000):
    print("======================")
    print("====== NEXT RUN ======")
    print("======================")

    print("=== TRAINING")
    #train the network for 1 epoch
    trainer.trainEpochs(1)

    print("=== PLOTTING\n")
    #calculate the nets output for train and test data
    trnSequenceOutput = net.extrapolate(trnSequenceWashout, len(trnSequenceTarget))
    tstSequenceOutput = net.extrapolate(tstSequenceWashout, len(tstSequenceTarget))

    #plot training data
    sp = subplot(211) #switch to the first subplot
    cla() #clear the subplot
    title("Training Set") #set the subplot's title
    sp.set_autoscale_on(True) #enable autoscaling
    targetline = plot(trnSequenceTarget, "r-") #plot the targets
    sp.set_autoscale_on(False) #disable autoscaling
    outputline = plot(trnSequenceOutput, "b-") #plot the actual ouput

    #plot test data
    sp = subplot(212)
    cla()
    title("Test Set")
    sp.set_autoscale_on(True)
    plot(tstSequenceTarget, "r-")
    sp.set_autoscale_on(False)
    plot(tstSequenceOutput, "b-")

    #create a legend
    figlegend((targetline, outputline), ('target', 'output'), ('upper right'))

    #draw everything
    draw()

show()

value of:

ravel(self.getField('sequence_index'))[index]

0.0

Erland Devona
  • 183
  • 3
  • 13

0 Answers0