with tutorial the recurrent neural network multivariate long python machine-learning neural-network time-series pybrain

tutorial - recurrent neural network time series prediction python



Solicitud de ejemplo: red neuronal recurrente para predecir el siguiente valor en una secuencia (2)

¿Alguien puede darme un ejemplo práctico de una red neuronal recurrente en (pybrain) python para predecir el siguiente valor de una secuencia? (He leído la documentación de pybrain y no hay un claro ejemplo de ello, creo). También encontré esta question . Pero no veo cómo funciona en un caso más general. Por lo tanto, estoy preguntando si alguien aquí podría encontrar un claro ejemplo de cómo predecir el siguiente valor de una secuencia en el cerebro, con una red neuronal 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 / es el siguiente valor (es)

Esta pregunta puede parecer floja, pero creo que falta un buen y decente ejemplo 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 tiene 2 funciones) 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 comienzo 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 / es el siguiente valor (es)

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


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

1) Crear un conjunto de datos supervisado que espera una muestra y un objetivo 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 siguiente es el objetivo o la 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 a feature1 y feature2 como sample1 y sample2 para una secuencia, y dejar que las características denoten los números en una muestra.

2) Crea una red, inicia el entrenador y ejecuta durante 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) Crea 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 no supervisado debido a la suposición de que no tenemos las etiquetas o los objetivos.

4) Predecir la muestra de prueba usando 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 muestra, en lugar de crear un conjunto de datos supervisado, cree uno secuencial ds = SequentialDataSet(21,21) . Luego, cada vez que obtenga una nueva secuencia, llame a ds.newSequence() y agregue las muestras -que llama funciones- en esa secuencia usando ds.addSample() .

Espero que esto sea claro :)

Si desea tener el código completo para evitar el problema de importar las bibliotecas, hágamelo saber.


Issam Laradji trabajó para mí para predecir 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 entrena como tal, ya sea como sub secuencias o como secuencias superpuestas (superposición que se muestra 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...