Demande par exemple: réseau neuronal récurrent pour prédire la valeur suivante dans une séquence

Quelqu'un peut-il me donner un exemple pratique d'un réseau neuronal récurrent dans (pybrain) python afin de prédire la prochaine valeur d'une séquence ? (J'ai lu la documentation pybrain et il n'y a pas d'exemple clair pour cela je pense.) J'ai aussi trouvé cette question . Mais je ne vois pas comment cela fonctionne dans un cas plus général. Donc, je demande si quelqu'un ici pourrait élaborer un exemple clair de la façon de prédire la prochaine valeur d'une séquence dans pybrain, avec un neurone récurrent réseau.

Pour donner un exemple.

Disons par exemple que nous avons une séquence de nombres dans la plage [1,7].

First run (So first example): 1 2 4 6 2 3 4 5 1 3 5 6 7 1 4 7 1 2 3 5 6

Second run (So second example): 1 2 5 6 2 4 4 5 1 2 5 6 7 1 4 6 1 2 3 3 6

Third run (So third example): 1 3 5 7 2 4 6 7 1 3 5 6 7 1 4 6 1 2 2 3 7

and so on.

Maintenant donné pour exemple le début d'une nouvelle séquence: 1 3 5 7 2 4 6 7 1 3

Quelles sont les valeurs suivantes

Cette question peut sembler paresseuse, mais je pense qu'il manque un bon et décent exemple de la façon de le faire avec pybrain.


En outre: comment cela peut-il être fait si plus de 1 fonctionnalité est présent:

Exemple:

Disons par exemple que nous avons plusieurs séquences (chaque séquence ayant 2 caractéristiques) dans la plage [1,7].

First run (So first example): feature1: 1 2 4 6 2 3 4 5 1 3 5 6 7 1 4 7 1 2 3 5 6
                              feature2: 1 3 5 7 2 4 6 7 1 3 5 6 7 1 4 6 1 2 2 3 7


Second run (So second example): feature1: 1 2 5 6 2 4 4 5 1 2 5 6 7 1 4 6 1 2 3 3 6
                                feature2: 1 2 3 7 2 3 4 6 2 3 5 6 7 2 4 7 1 3 3 5 6    

Third run (So third example): feature1: 1 3 5 7 2 4 6 7 1 3 5 6 7 1 4 6 1 2 2 3 7
                              feature2: 1 2 4 6 2 3 4 5 1 3 5 6 7 1 4 7 1 2 3 5 6

and so on.

Maintenant donné par exemple le début d'une nouvelle séquence:

                                            feature 1: 1 3 5 7 2 4 6 7 1 3

                                            feature 2: 1 2 3 7 2 3 4 6 2 4

Quelles sont les valeurs suivantes


N'hésitez pas à utiliser votre propre exemple tant qu'il est similaire à ces exemples et a une explication approfondie.

27
demandé sur Community 2013-05-30 12:04:51

2 réponses

Issam Laradji a travaillé pour moi pour prédire la séquence de séquences, sauf que ma version de pybrain nécessitait un tuple pour l'objet UnserpervisedDataSet:

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]]

Donne:

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

Pour prédire des séquences plus petites, entraînez-les en tant que telles, soit en tant que sous-séquences, soit en tant que séquences qui se chevauchent (Chevauchement montré ici):

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]]

Donne:

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

Pas trop bon...

8
répondu wwwslinger 2013-09-12 20:12:06

Ces étapes sont destinées à exécuter ce que vous demandez dans la première partie de la question.

1) Créez un ensemble de données supervisé qui attend un échantillon et une cible dans ses arguments,

 ds = SupervisedDataSet(21, 21)
 #add samples (this can be done automatically)
 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()))

Un échantillon suivant est la cible ou l'Étiquette y de son prédécesseur x. Nous mettons le nombre 21 parce que chaque échantillon a 21 des nombres ou des caractéristiques.

Veuillez noter que pour les notations standard dans la seconde moitié de votre question, il est préférable d'appeler feature1 et feature2 comme sample1 et sample2 pour une séquence, et let features indiquent les nombres dans un échantillon.

2) Créer un réseau, initialiser formateur et exécuter pour 100 époques

net = buildNetwork(21, 20, 21, outclass=LinearLayer,bias=True, recurrent=True)
trainer = BackpropTrainer(net, ds)
trainer.trainEpochs(100)

Assurez - vous de définir l'argument recurrent comme True

3) Créer les données de test

ts = UnsupervisedDataSet(21, 21)
#add the sample to be predicted
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()))

Nous avons créé un ensemble de données non supervisé en supposant que nous n'avons pas les étiquettes ou les cibles.

4) prédire l'échantillon d'essai en utilisant le réseau formé

net.activateOnDataset(ts)

Cela devrait afficher le valeurs du fourth run attendu.

Pour le second cas où une séquence peut avoir plus de sample, au lieu de créer un ensemble de données supervisé, créez un séquentiel ds = SequentialDataSet(21,21). Ensuite, chaque fois que vous obtenez une nouvelle séquence, appelez ds.newSequence() et ajoutez les échantillons-que vous appelez features-dans cette séquence en utilisant ds.addSample().

Espère que c'est clair :)

Si vous souhaitez avoir le code complet pour éviter la peine d'importer les bibliothèques, faites-le moi savoir.

3
répondu Curious 2013-09-07 12:42:31