Request for example: Recurrent neural network for predicting next value in a sequence

前端 未结 2 1836
北海茫月
北海茫月 2020-12-13 00:37

Can anyone give me a practicale example of a recurrent neural network in (pybrain) python in order to predict the next value of a sequence ? (I\'ve read the pybrain document

2条回答
  •  鱼传尺愫
    2020-12-13 01:24

    Issam Laradji's worked for me to predict sequence of sequences, except my version of pybrain required a tuple for the UnserpervisedDataSet object:

    from pybrain.tools.shortcuts import buildNetwork
    from pybrain.supervised.trainers import BackpropTrainer
    from pybrain.datasets import SupervisedDataSet,UnsupervisedDataSet
    from pybrain.structure import LinearLayer
    ds = SupervisedDataSet(21, 21)
    ds.addSample(map(int,'1 2 4 6 2 3 4 5 1 3 5 6 7 1 4 7 1 2 3 5 6'.split()),map(int,'1 2 5 6 2 4 4 5 1 2 5 6 7 1 4 6 1 2 3 3 6'.split()))
    ds.addSample(map(int,'1 2 5 6 2 4 4 5 1 2 5 6 7 1 4 6 1 2 3 3 6'.split()),map(int,'1 3 5 7 2 4 6 7 1 3 5 6 7 1 4 6 1 2 2 3 7'.split()))
    net = buildNetwork(21, 20, 21, outclass=LinearLayer,bias=True, recurrent=True)
    trainer = BackpropTrainer(net, ds)
    trainer.trainEpochs(100)
    ts = UnsupervisedDataSet(21,)
    ts.addSample(map(int,'1 3 5 7 2 4 6 7 1 3 5 6 7 1 4 6 1 2 2 3 7'.split()))
    [ int(round(i)) for i in net.activateOnDataset(ts)[0]]
    

    gives:

    => [1, 2, 5, 6, 2, 4, 5, 6, 1, 2, 5, 6, 7, 1, 4, 6, 1, 2, 2, 3, 6]

    To predict smaller sequences, just train it up as such, either as sub sequences or as overlapping sequences (overlapping shown here):

    from pybrain.tools.shortcuts import buildNetwork
    from pybrain.supervised.trainers import BackpropTrainer
    from pybrain.datasets import SupervisedDataSet,UnsupervisedDataSet
    from pybrain.structure import LinearLayer
    ds = SupervisedDataSet(10, 11)
    z = map(int,'1 2 4 6 2 3 4 5 1 3 5 6 7 1 4 7 1 2 3 5 6 1 2 5 6 2 4 4 5 1 2 5 6 7 1 4 6 1 2 3 3 6 1 3 5 7 2 4 6 7 1 3 5 6 7 1 4 6 1 2 2 3 7'.split())
    obsLen = 10
    predLen = 11
    for i in xrange(len(z)):
      if i+(obsLen-1)+predLen < len(z):
        ds.addSample([z[d] for d in range(i,i+obsLen)],[z[d] for d in range(i+1,i+1+predLen)])
    
    net = buildNetwork(10, 20, 11, outclass=LinearLayer,bias=True, recurrent=True)
    trainer = BackpropTrainer(net, ds)
    trainer.trainEpochs(100)
    ts = UnsupervisedDataSet(10,)
    ts.addSample(map(int,'1 3 5 7 2 4 6 7 1 3'.split()))
    [ int(round(i)) for i in net.activateOnDataset(ts)[0]]
    

    gives:

    => [3, 5, 6, 2, 4, 5, 6, 1, 2, 5, 6]

    Not too good...

提交回复
热议问题