Solicitud de ejemplo: neural network recurrente para predecir el siguiente valor en una secuencia

¿Puede alguien darme un ejemplo práctico de una neural network recurrente en (pybrain) python para predecir el siguiente valor de una secuencia? (He leído la documentación de pybrain y creo que no hay un ejemplo claro para ella). También encontré esta pregunta . Pero no veo cómo funciona en un caso más general. Por lo tanto, me pregunto si alguien aquí podría encontrar un ejemplo claro de cómo predecir el siguiente valor de una secuencia en pybrain, con una neural network recurrente .

Para dar un ejemplo.

Digamos, por ejemplo, que tenemos una secuencia de números en el rango [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. 

Ahora dado, por ejemplo, el comienzo de una nueva secuencia: 1 3 5 7 2 4 6 7 1 3

¿Cuál es / son el (los) siguiente (s) valor (es)?

Esta pregunta puede parecer perezosa, pero creo que falta un ejemplo bueno y decente de cómo hacer esto con pybrain.


Además: ¿Cómo se puede hacer esto si hay más de 1 característica presente?

Ejemplo:

Digamos, por ejemplo, que tenemos varias secuencias (cada secuencia con 2 características) en el rango [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. 

Ahora dado, por ejemplo, el inicio de una nueva secuencia:

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

¿Cuál es / son los siguientes valores?


Siéntase libre de usar su propio ejemplo siempre que sea similar a estos ejemplos y tenga alguna explicación en profundidad.

Issam Laradji trabajó para que yo predijera la secuencia de secuencias, excepto que mi versión de pybrain requería una tupla para el objeto 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]] 

da:

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

Para predecir secuencias más pequeñas, simplemente entrene como tal, ya sea como subsecuencias o como secuencias superpuestas (se superpone aquí)

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

da:

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

No muy bien...

Estos pasos están destinados a realizar lo que pide en la primera parte de la pregunta.

1) Cree un conjunto de datos supervisado que espera una muestra y un objective en sus argumentos,

  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())) 

Una muestra posterior es el destino o etiqueta y de su predecesor x . Ponemos el número 21 porque cada muestra tiene 21 números o características.

Tenga en cuenta que para las notaciones estándar en la segunda mitad de su pregunta, es mejor llamar feature1 y feature2 como sample1 y sample2 para una secuencia, y permitir que las características denoten los números en una muestra.

2) Crea una red, inicializa el entrenador y corre por 100 épocas

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

Asegúrese de establecer el argumento recurrent como True

3) Crear los datos de prueba.

 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())) 

Creamos un conjunto de datos sin supervisión debido a la suposición de que no tenemos las tags o los objectives.

4) Predecir la muestra de prueba utilizando la red entrenada

 net.activateOnDataset(ts) 

Esto debería mostrar los valores de la fourth run esperada.

Para el segundo caso, cuando una secuencia puede tener más de una muestra, en lugar de crear un conjunto de datos supervisado, cree un secuencial ds = SequentialDataSet(21,21) . Luego, cada vez que obtenga una nueva secuencia, llame a ds.newSequence() y agregue las muestras -que llama a las características- en esa secuencia usando ds.addSample() .

Espero que esto sea claro 🙂

Si desea tener el código completo para evitar los problemas de importación de las bibliotecas, hágamelo saber.